@dwelle/excalidraw 0.4.0-4851a85 → 0.4.0-570820c
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.
|
@@ -1800,7 +1800,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1800
1800
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1801
1801
|
|
|
1802
1802
|
"use strict";
|
|
1803
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionBindText\": () => (/* binding */ actionBindText),\n/* harmony export */ \"actionCreateContainerFromText\": () => (/* binding */ actionCreateContainerFromText),\n/* harmony export */ \"actionUnbindText\": () => (/* binding */ actionUnbindText)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element/textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n\n\n\n\n\n\n\n\n\nconst actionUnbindText = (0,_register__WEBPACK_IMPORTED_MODULE_8__.register)({\n name: \"unbindText\",\n contextItemLabel: \"labels.unbindText\",\n trackEvent: { category: \"element\" },\n predicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)(elements, appState);\n return selectedElements.some((element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.hasBoundTextElement)(element));\n },\n perform: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n selectedElements.forEach((element) => {\n var _a;\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(element);\n if (boundTextElement) {\n const { width, height } = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.measureText)(boundTextElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)(boundTextElement), boundTextElement.lineHeight);\n const originalContainerHeight = (0,_element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__.getOriginalContainerHeightFromCache)(element.id);\n (0,_element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__.resetOriginalContainerCache)(element.id);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(boundTextElement, {\n containerId: null,\n width,\n height,\n text: boundTextElement.originalText,\n });\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(element, {\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.filter((ele) => ele.id !== boundTextElement.id),\n height: originalContainerHeight\n ? originalContainerHeight\n : element.height,\n });\n }\n });\n return {\n elements,\n appState,\n commitToHistory: true,\n };\n },\n});\nconst actionBindText = (0,_register__WEBPACK_IMPORTED_MODULE_8__.register)({\n name: \"bindText\",\n contextItemLabel: \"labels.bindText\",\n trackEvent: { category: \"element\" },\n predicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 2) {\n const textElement = (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) ||\n (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[1]);\n let bindingContainer;\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0])) {\n bindingContainer = selectedElements[0];\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[1])) {\n bindingContainer = selectedElements[1];\n }\n if (textElement &&\n bindingContainer &&\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(bindingContainer) === null) {\n return true;\n }\n }\n return false;\n },\n perform: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n let textElement;\n let container;\n if ((0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[1])) {\n textElement = selectedElements[0];\n container = selectedElements[1];\n }\n else {\n textElement = selectedElements[1];\n container = selectedElements[0];\n }\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(textElement, {\n containerId: container.id,\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_0__.VERTICAL_ALIGN.MIDDLE,\n });\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: textElement.id,\n }),\n });\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.redrawTextBoundingBox)(textElement, container);\n return {\n elements: pushTextAboveContainer(elements, container, textElement),\n appState: Object.assign(Object.assign({}, appState), { selectedElementIds: { [container.id]: true } }),\n commitToHistory: true,\n };\n },\n});\nconst pushTextAboveContainer = (elements, container, textElement) => {\n const updatedElements = elements.slice();\n const textElementIndex = updatedElements.findIndex((ele) => ele.id === textElement.id);\n updatedElements.splice(textElementIndex, 1);\n const containerIndex = updatedElements.findIndex((ele) => ele.id === container.id);\n updatedElements.splice(containerIndex + 1, 0, textElement);\n return updatedElements;\n};\nconst pushContainerBelowText = (elements, container, textElement) => {\n const updatedElements = elements.slice();\n const containerIndex = updatedElements.findIndex((ele) => ele.id === container.id);\n updatedElements.splice(containerIndex, 1);\n const textElementIndex = updatedElements.findIndex((ele) => ele.id === textElement.id);\n updatedElements.splice(textElementIndex, 0, container);\n return updatedElements;\n};\nconst actionCreateContainerFromText = (0,_register__WEBPACK_IMPORTED_MODULE_8__.register)({\n name: \"createContainerFromText\",\n contextItemLabel: \"labels.createContainerFromText\",\n trackEvent: { category: \"element\" },\n predicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)(elements, appState);\n const areTextElements = selectedElements.every((el) => (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(el));\n return selectedElements.length > 0 && areTextElements;\n },\n perform: (elements, appState) => {\n var _a;\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n let updatedElements = elements.slice();\n const containerIds = {};\n for (const textElement of selectedElements) {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(textElement)) {\n const container = (0,_element__WEBPACK_IMPORTED_MODULE_1__.newElement)({\n type: \"rectangle\",\n backgroundColor: appState.currentItemBackgroundColor,\n boundElements: [\n ...(textElement.boundElements || []),\n { id: textElement.id, type: \"text\" },\n ],\n angle: textElement.angle,\n fillStyle: appState.currentItemFillStyle,\n strokeColor: appState.currentItemStrokeColor,\n roughness: appState.currentItemRoughness,\n strokeWidth: appState.currentItemStrokeWidth,\n strokeStyle: appState.currentItemStrokeStyle,\n roundness: appState.currentItemRoundness === \"round\"\n ? {\n type: (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isUsingAdaptiveRadius)(\"rectangle\")\n ? _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.ADAPTIVE_RADIUS\n : _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.PROPORTIONAL_RADIUS,\n }\n : null,\n opacity: 100,\n locked: false,\n x: textElement.x - _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING,\n y: textElement.y - _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING,\n width: (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.computeContainerDimensionForBoundText)(textElement.width, \"rectangle\"),\n height: (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.computeContainerDimensionForBoundText)(textElement.height, \"rectangle\"),\n groupIds: textElement.groupIds,\n });\n // update bindings\n if ((_a = textElement.boundElements) === null || _a === void 0 ? void 0 : _a.length) {\n const linearElementIds = textElement.boundElements\n .filter((ele) => ele.type === \"arrow\")\n .map((el) => el.id);\n const linearElements = updatedElements.filter((ele) => linearElementIds.includes(ele.id));\n linearElements.forEach((ele) => {\n let startBinding = ele.startBinding;\n let endBinding = ele.endBinding;\n if ((startBinding === null || startBinding === void 0 ? void 0 : startBinding.elementId) === textElement.id) {\n startBinding = Object.assign(Object.assign({}, startBinding), { elementId: container.id });\n }\n if ((endBinding === null || endBinding === void 0 ? void 0 : endBinding.elementId) === textElement.id) {\n endBinding = Object.assign(Object.assign({}, endBinding), { elementId: container.id });\n }\n if (startBinding || endBinding) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(ele, { startBinding, endBinding }, false);\n }\n });\n }\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(textElement, {\n containerId: container.id,\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_0__.VERTICAL_ALIGN.MIDDLE,\n boundElements: null,\n }, false);\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.redrawTextBoundingBox)(textElement, container);\n updatedElements = pushContainerBelowText([...updatedElements, container], container, textElement);\n containerIds[container.id] = true;\n }\n }\n return {\n elements: updatedElements,\n appState: Object.assign(Object.assign({}, appState), { selectedElementIds: containerIds }),\n commitToHistory: true,\n };\n },\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUUsU0FBUyxDQUFDLEVBQUUsR0FDeEIsQ0FBQzt5QkFDSDt3QkFFRCxJQUFJLFdBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxTQUFTLE1BQUssV0FBVyxDQUFDLEVBQUUsRUFBRTs0QkFDNUMsVUFBVSxtQ0FBUSxVQUFVLEtBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUUsQ0FBQzt5QkFDekQ7d0JBRUQsSUFBSSxZQUFZLElBQUksVUFBVSxFQUFFOzRCQUM5QixxRUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDekQ7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBRUQscUVBQWEsQ0FDWCxXQUFXLEVBQ1g7b0JBQ0UsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO29CQUN6QixhQUFhLEVBQUUsNkRBQXFCO29CQUNwQyxhQUFhLEVBQUUsSUFBSTtpQkFDcEIsRUFDRCxLQUFLLENBQ04sQ0FBQztnQkFDRiwyRUFBcUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBRTlDLGVBQWUsR0FBRyxzQkFBc0IsQ0FDdEMsQ0FBQyxHQUFHLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFDL0IsU0FBUyxFQUNULFdBQVcsQ0FDWixDQUFDO2dCQUNGLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ25DO1NBQ0Y7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLGVBQWU7WUFDekIsUUFBUSxrQ0FDSCxRQUFRLEtBQ1gsa0JBQWtCLEVBQUUsWUFBWSxHQUNqQztZQUNELGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FjdGlvbnMvYWN0aW9uQm91bmRUZXh0LnRzeD80YmZmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJPVU5EX1RFWFRfUEFERElORywgUk9VTkRORVNTLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldE5vbkRlbGV0ZWRFbGVtZW50cywgaXNUZXh0RWxlbWVudCwgbmV3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudCxcbiAgbWVhc3VyZVRleHQsXG4gIHJlZHJhd1RleHRCb3VuZGluZ0JveCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldE9yaWdpbmFsQ29udGFpbmVySGVpZ2h0RnJvbUNhY2hlLFxuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L3RleHRXeXNpd3lnXCI7XG5pbXBvcnQge1xuICBoYXNCb3VuZFRleHRFbGVtZW50LFxuICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcixcbiAgaXNVc2luZ0FkYXB0aXZlUmFkaXVzLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Rm9udFN0cmluZyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwiLi9yZWdpc3RlclwiO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uVW5iaW5kVGV4dCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJ1bmJpbmRUZXh0XCIsXG4gIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnVuYmluZFRleHRcIixcbiAgdHJhY2tFdmVudDogeyBjYXRlZ29yeTogXCJlbGVtZW50XCIgfSxcbiAgcHJlZGljYXRlOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpKTtcbiAgfSxcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKSxcbiAgICAgIGFwcFN0YXRlLFxuICAgICk7XG4gICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gbWVhc3VyZVRleHQoXG4gICAgICAgICAgYm91bmRUZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICAgICAgZ2V0Rm9udFN0cmluZyhib3VuZFRleHRFbGVtZW50KSxcbiAgICAgICAgICBib3VuZFRleHRFbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0ID0gZ2V0T3JpZ2luYWxDb250YWluZXJIZWlnaHRGcm9tQ2FjaGUoXG4gICAgICAgICAgZWxlbWVudC5pZCxcbiAgICAgICAgKTtcbiAgICAgICAgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlKGVsZW1lbnQuaWQpO1xuXG4gICAgICAgIG11dGF0ZUVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICBjb250YWluZXJJZDogbnVsbCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgdGV4dDogYm91bmRUZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICAgIH0pO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICBib3VuZEVsZW1lbnRzOiBlbGVtZW50LmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlbGUpID0+IGVsZS5pZCAhPT0gYm91bmRUZXh0RWxlbWVudC5pZCxcbiAgICAgICAgICApLFxuICAgICAgICAgIGhlaWdodDogb3JpZ2luYWxDb250YWluZXJIZWlnaHRcbiAgICAgICAgICAgID8gb3JpZ2luYWxDb250YWluZXJIZWlnaHRcbiAgICAgICAgICAgIDogZWxlbWVudC5oZWlnaHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50cyxcbiAgICAgIGFwcFN0YXRlLFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkJpbmRUZXh0ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImJpbmRUZXh0XCIsXG4gIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLmJpbmRUZXh0XCIsXG4gIHRyYWNrRXZlbnQ6IHsgY2F0ZWdvcnk6IFwiZWxlbWVudFwiIH0sXG4gIHByZWRpY2F0ZTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHRleHRFbGVtZW50ID1cbiAgICAgICAgaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSB8fFxuICAgICAgICBpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMV0pO1xuXG4gICAgICBsZXQgYmluZGluZ0NvbnRhaW5lcjtcbiAgICAgIGlmIChpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICBiaW5kaW5nQ29udGFpbmVyID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1sxXSkpIHtcbiAgICAgICAgYmluZGluZ0NvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMV07XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRleHRFbGVtZW50ICYmXG4gICAgICAgIGJpbmRpbmdDb250YWluZXIgJiZcbiAgICAgICAgZ2V0Qm91bmRUZXh0RWxlbWVudChiaW5kaW5nQ29udGFpbmVyKSA9PT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIGdldE5vbkRlbGV0ZWRFbGVtZW50cyhlbGVtZW50cyksXG4gICAgICBhcHBTdGF0ZSxcbiAgICApO1xuXG4gICAgbGV0IHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgbGV0IGNvbnRhaW5lcjogRXhjYWxpZHJhd1RleHRDb250YWluZXI7XG5cbiAgICBpZiAoXG4gICAgICBpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmXG4gICAgICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzFdKVxuICAgICkge1xuICAgICAgdGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgY29udGFpbmVyID0gc2VsZWN0ZWRFbGVtZW50c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzFdIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICAgIGNvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMF0gYXMgRXhjYWxpZHJhd1RleHRDb250YWluZXI7XG4gICAgfVxuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgIGNvbnRhaW5lcklkOiBjb250YWluZXIuaWQsXG4gICAgICB2ZXJ0aWNhbEFsaWduOiBWRVJUSUNBTF9BTElHTi5NSURETEUsXG4gICAgfSk7XG4gICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIGlkOiB0ZXh0RWxlbWVudC5pZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveCh0ZXh0RWxlbWVudCwgY29udGFpbmVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogcHVzaFRleHRBYm92ZUNvbnRhaW5lcihlbGVtZW50cywgY29udGFpbmVyLCB0ZXh0RWxlbWVudCksXG4gICAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtjb250YWluZXIuaWRdOiB0cnVlIH0gfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxufSk7XG5cbmNvbnN0IHB1c2hUZXh0QWJvdmVDb250YWluZXIgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuKSA9PiB7XG4gIGNvbnN0IHVwZGF0ZWRFbGVtZW50cyA9IGVsZW1lbnRzLnNsaWNlKCk7XG4gIGNvbnN0IHRleHRFbGVtZW50SW5kZXggPSB1cGRhdGVkRWxlbWVudHMuZmluZEluZGV4KFxuICAgIChlbGUpID0+IGVsZS5pZCA9PT0gdGV4dEVsZW1lbnQuaWQsXG4gICk7XG4gIHVwZGF0ZWRFbGVtZW50cy5zcGxpY2UodGV4dEVsZW1lbnRJbmRleCwgMSk7XG5cbiAgY29uc3QgY29udGFpbmVySW5kZXggPSB1cGRhdGVkRWxlbWVudHMuZmluZEluZGV4KFxuICAgIChlbGUpID0+IGVsZS5pZCA9PT0gY29udGFpbmVyLmlkLFxuICApO1xuICB1cGRhdGVkRWxlbWVudHMuc3BsaWNlKGNvbnRhaW5lckluZGV4ICsgMSwgMCwgdGV4dEVsZW1lbnQpO1xuICByZXR1cm4gdXBkYXRlZEVsZW1lbnRzO1xufTtcblxuY29uc3QgcHVzaENvbnRhaW5lckJlbG93VGV4dCA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4pID0+IHtcbiAgY29uc3QgdXBkYXRlZEVsZW1lbnRzID0gZWxlbWVudHMuc2xpY2UoKTtcbiAgY29uc3QgY29udGFpbmVySW5kZXggPSB1cGRhdGVkRWxlbWVudHMuZmluZEluZGV4KFxuICAgIChlbGUpID0+IGVsZS5pZCA9PT0gY29udGFpbmVyLmlkLFxuICApO1xuICB1cGRhdGVkRWxlbWVudHMuc3BsaWNlKGNvbnRhaW5lckluZGV4LCAxKTtcblxuICBjb25zdCB0ZXh0RWxlbWVudEluZGV4ID0gdXBkYXRlZEVsZW1lbnRzLmZpbmRJbmRleChcbiAgICAoZWxlKSA9PiBlbGUuaWQgPT09IHRleHRFbGVtZW50LmlkLFxuICApO1xuICB1cGRhdGVkRWxlbWVudHMuc3BsaWNlKHRleHRFbGVtZW50SW5kZXgsIDAsIGNvbnRhaW5lcik7XG4gIHJldHVybiB1cGRhdGVkRWxlbWVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQ3JlYXRlQ29udGFpbmVyRnJvbVRleHQgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiY3JlYXRlQ29udGFpbmVyRnJvbVRleHRcIixcbiAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMuY3JlYXRlQ29udGFpbmVyRnJvbVRleHRcIixcbiAgdHJhY2tFdmVudDogeyBjYXRlZ29yeTogXCJlbGVtZW50XCIgfSxcbiAgcHJlZGljYXRlOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcbiAgICBjb25zdCBhcmVUZXh0RWxlbWVudHMgPSBzZWxlY3RlZEVsZW1lbnRzLmV2ZXJ5KChlbCkgPT4gaXNUZXh0RWxlbWVudChlbCkpO1xuICAgIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJlVGV4dEVsZW1lbnRzO1xuICB9LFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpLFxuICAgICAgYXBwU3RhdGUsXG4gICAgKTtcbiAgICBsZXQgdXBkYXRlZEVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdID0gZWxlbWVudHMuc2xpY2UoKTtcbiAgICBjb25zdCBjb250YWluZXJJZHM6IEFwcFN0YXRlW1wic2VsZWN0ZWRFbGVtZW50SWRzXCJdID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHRleHRFbGVtZW50IG9mIHNlbGVjdGVkRWxlbWVudHMpIHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KHRleHRFbGVtZW50KSkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBuZXdFbGVtZW50KHtcbiAgICAgICAgICB0eXBlOiBcInJlY3RhbmdsZVwiLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYXBwU3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgYm91bmRFbGVtZW50czogW1xuICAgICAgICAgICAgLi4uKHRleHRFbGVtZW50LmJvdW5kRWxlbWVudHMgfHwgW10pLFxuICAgICAgICAgICAgeyBpZDogdGV4dEVsZW1lbnQuaWQsIHR5cGU6IFwidGV4dFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhbmdsZTogdGV4dEVsZW1lbnQuYW5nbGUsXG4gICAgICAgICAgZmlsbFN0eWxlOiBhcHBTdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgICBzdHJva2VDb2xvcjogYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgICByb3VnaG5lc3M6IGFwcFN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgICAgIHN0cm9rZVN0eWxlOiBhcHBTdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgICAgIHJvdW5kbmVzczpcbiAgICAgICAgICAgIGFwcFN0YXRlLmN1cnJlbnRJdGVtUm91bmRuZXNzID09PSBcInJvdW5kXCJcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBpc1VzaW5nQWRhcHRpdmVSYWRpdXMoXCJyZWN0YW5nbGVcIilcbiAgICAgICAgICAgICAgICAgICAgPyBST1VORE5FU1MuQURBUFRJVkVfUkFESVVTXG4gICAgICAgICAgICAgICAgICAgIDogUk9VTkRORVNTLlBST1BPUlRJT05BTF9SQURJVVMsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgb3BhY2l0eTogMTAwLFxuICAgICAgICAgIGxvY2tlZDogZmFsc2UsXG4gICAgICAgICAgeDogdGV4dEVsZW1lbnQueCAtIEJPVU5EX1RFWFRfUEFERElORyxcbiAgICAgICAgICB5OiB0ZXh0RWxlbWVudC55IC0gQk9VTkRfVEVYVF9QQURESU5HLFxuICAgICAgICAgIHdpZHRoOiBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICAgICAgdGV4dEVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgICBcInJlY3RhbmdsZVwiLFxuICAgICAgICAgICksXG4gICAgICAgICAgaGVpZ2h0OiBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICAgICAgdGV4dEVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgICAgXCJyZWN0YW5nbGVcIixcbiAgICAgICAgICApLFxuICAgICAgICAgIGdyb3VwSWRzOiB0ZXh0RWxlbWVudC5ncm91cElkcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdXBkYXRlIGJpbmRpbmdzXG4gICAgICAgIGlmICh0ZXh0RWxlbWVudC5ib3VuZEVsZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBsaW5lYXJFbGVtZW50SWRzID0gdGV4dEVsZW1lbnQuYm91bmRFbGVtZW50c1xuICAgICAgICAgICAgLmZpbHRlcigoZWxlKSA9PiBlbGUudHlwZSA9PT0gXCJhcnJvd1wiKVxuICAgICAgICAgICAgLm1hcCgoZWwpID0+IGVsLmlkKTtcbiAgICAgICAgICBjb25zdCBsaW5lYXJFbGVtZW50cyA9IHVwZGF0ZWRFbGVtZW50cy5maWx0ZXIoKGVsZSkgPT5cbiAgICAgICAgICAgIGxpbmVhckVsZW1lbnRJZHMuaW5jbHVkZXMoZWxlLmlkKSxcbiAgICAgICAgICApIGFzIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W107XG4gICAgICAgICAgbGluZWFyRWxlbWVudHMuZm9yRWFjaCgoZWxlKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhcnRCaW5kaW5nID0gZWxlLnN0YXJ0QmluZGluZztcbiAgICAgICAgICAgIGxldCBlbmRCaW5kaW5nID0gZWxlLmVuZEJpbmRpbmc7XG5cbiAgICAgICAgICAgIGlmIChzdGFydEJpbmRpbmc/LmVsZW1lbnRJZCA9PT0gdGV4dEVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgc3RhcnRCaW5kaW5nID0ge1xuICAgICAgICAgICAgICAgIC4uLnN0YXJ0QmluZGluZyxcbiAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IGNvbnRhaW5lci5pZCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVuZEJpbmRpbmc/LmVsZW1lbnRJZCA9PT0gdGV4dEVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgZW5kQmluZGluZyA9IHsgLi4uZW5kQmluZGluZywgZWxlbWVudElkOiBjb250YWluZXIuaWQgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0YXJ0QmluZGluZyB8fCBlbmRCaW5kaW5nKSB7XG4gICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlLCB7IHN0YXJ0QmluZGluZywgZW5kQmluZGluZyB9LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICAgIHRleHRFbGVtZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiBjb250YWluZXIuaWQsXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBWRVJUSUNBTF9BTElHTi5NSURETEUsXG4gICAgICAgICAgICBib3VuZEVsZW1lbnRzOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG4gICAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveCh0ZXh0RWxlbWVudCwgY29udGFpbmVyKTtcblxuICAgICAgICB1cGRhdGVkRWxlbWVudHMgPSBwdXNoQ29udGFpbmVyQmVsb3dUZXh0KFxuICAgICAgICAgIFsuLi51cGRhdGVkRWxlbWVudHMsIGNvbnRhaW5lcl0sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHRleHRFbGVtZW50LFxuICAgICAgICApO1xuICAgICAgICBjb250YWluZXJJZHNbY29udGFpbmVyLmlkXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzOiB1cGRhdGVkRWxlbWVudHMsXG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBjb250YWluZXJJZHMsXG4gICAgICB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG59KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../actions/actionBoundText.tsx\n");
|
|
1803
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionBindText\": () => (/* binding */ actionBindText),\n/* harmony export */ \"actionCreateContainerFromText\": () => (/* binding */ actionCreateContainerFromText),\n/* harmony export */ \"actionUnbindText\": () => (/* binding */ actionUnbindText)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element/textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n\n\n\n\n\n\n\n\n\nconst actionUnbindText = (0,_register__WEBPACK_IMPORTED_MODULE_8__.register)({\n name: \"unbindText\",\n contextItemLabel: \"labels.unbindText\",\n trackEvent: { category: \"element\" },\n predicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)(elements, appState);\n return selectedElements.some((element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.hasBoundTextElement)(element));\n },\n perform: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n selectedElements.forEach((element) => {\n var _a;\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(element);\n if (boundTextElement) {\n const { width, height, baseline } = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.measureText)(boundTextElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)(boundTextElement), boundTextElement.lineHeight);\n const originalContainerHeight = (0,_element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__.getOriginalContainerHeightFromCache)(element.id);\n (0,_element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__.resetOriginalContainerCache)(element.id);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(boundTextElement, {\n containerId: null,\n width,\n height,\n baseline,\n text: boundTextElement.originalText,\n });\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(element, {\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.filter((ele) => ele.id !== boundTextElement.id),\n height: originalContainerHeight\n ? originalContainerHeight\n : element.height,\n });\n }\n });\n return {\n elements,\n appState,\n commitToHistory: true,\n };\n },\n});\nconst actionBindText = (0,_register__WEBPACK_IMPORTED_MODULE_8__.register)({\n name: \"bindText\",\n contextItemLabel: \"labels.bindText\",\n trackEvent: { category: \"element\" },\n predicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 2) {\n const textElement = (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) ||\n (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[1]);\n let bindingContainer;\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0])) {\n bindingContainer = selectedElements[0];\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[1])) {\n bindingContainer = selectedElements[1];\n }\n if (textElement &&\n bindingContainer &&\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(bindingContainer) === null) {\n return true;\n }\n }\n return false;\n },\n perform: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n let textElement;\n let container;\n if ((0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[1])) {\n textElement = selectedElements[0];\n container = selectedElements[1];\n }\n else {\n textElement = selectedElements[1];\n container = selectedElements[0];\n }\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(textElement, {\n containerId: container.id,\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_0__.VERTICAL_ALIGN.MIDDLE,\n });\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: textElement.id,\n }),\n });\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.redrawTextBoundingBox)(textElement, container);\n return {\n elements: pushTextAboveContainer(elements, container, textElement),\n appState: Object.assign(Object.assign({}, appState), { selectedElementIds: { [container.id]: true } }),\n commitToHistory: true,\n };\n },\n});\nconst pushTextAboveContainer = (elements, container, textElement) => {\n const updatedElements = elements.slice();\n const textElementIndex = updatedElements.findIndex((ele) => ele.id === textElement.id);\n updatedElements.splice(textElementIndex, 1);\n const containerIndex = updatedElements.findIndex((ele) => ele.id === container.id);\n updatedElements.splice(containerIndex + 1, 0, textElement);\n return updatedElements;\n};\nconst pushContainerBelowText = (elements, container, textElement) => {\n const updatedElements = elements.slice();\n const containerIndex = updatedElements.findIndex((ele) => ele.id === container.id);\n updatedElements.splice(containerIndex, 1);\n const textElementIndex = updatedElements.findIndex((ele) => ele.id === textElement.id);\n updatedElements.splice(textElementIndex, 0, container);\n return updatedElements;\n};\nconst actionCreateContainerFromText = (0,_register__WEBPACK_IMPORTED_MODULE_8__.register)({\n name: \"createContainerFromText\",\n contextItemLabel: \"labels.createContainerFromText\",\n trackEvent: { category: \"element\" },\n predicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)(elements, appState);\n const areTextElements = selectedElements.every((el) => (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(el));\n return selectedElements.length > 0 && areTextElements;\n },\n perform: (elements, appState) => {\n var _a;\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n let updatedElements = elements.slice();\n const containerIds = {};\n for (const textElement of selectedElements) {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(textElement)) {\n const container = (0,_element__WEBPACK_IMPORTED_MODULE_1__.newElement)({\n type: \"rectangle\",\n backgroundColor: appState.currentItemBackgroundColor,\n boundElements: [\n ...(textElement.boundElements || []),\n { id: textElement.id, type: \"text\" },\n ],\n angle: textElement.angle,\n fillStyle: appState.currentItemFillStyle,\n strokeColor: appState.currentItemStrokeColor,\n roughness: appState.currentItemRoughness,\n strokeWidth: appState.currentItemStrokeWidth,\n strokeStyle: appState.currentItemStrokeStyle,\n roundness: appState.currentItemRoundness === \"round\"\n ? {\n type: (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isUsingAdaptiveRadius)(\"rectangle\")\n ? _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.ADAPTIVE_RADIUS\n : _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.PROPORTIONAL_RADIUS,\n }\n : null,\n opacity: 100,\n locked: false,\n x: textElement.x - _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING,\n y: textElement.y - _constants__WEBPACK_IMPORTED_MODULE_0__.BOUND_TEXT_PADDING,\n width: (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.computeContainerDimensionForBoundText)(textElement.width, \"rectangle\"),\n height: (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.computeContainerDimensionForBoundText)(textElement.height, \"rectangle\"),\n groupIds: textElement.groupIds,\n });\n // update bindings\n if ((_a = textElement.boundElements) === null || _a === void 0 ? void 0 : _a.length) {\n const linearElementIds = textElement.boundElements\n .filter((ele) => ele.type === \"arrow\")\n .map((el) => el.id);\n const linearElements = updatedElements.filter((ele) => linearElementIds.includes(ele.id));\n linearElements.forEach((ele) => {\n let startBinding = ele.startBinding;\n let endBinding = ele.endBinding;\n if ((startBinding === null || startBinding === void 0 ? void 0 : startBinding.elementId) === textElement.id) {\n startBinding = Object.assign(Object.assign({}, startBinding), { elementId: container.id });\n }\n if ((endBinding === null || endBinding === void 0 ? void 0 : endBinding.elementId) === textElement.id) {\n endBinding = Object.assign(Object.assign({}, endBinding), { elementId: container.id });\n }\n if (startBinding || endBinding) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(ele, { startBinding, endBinding }, false);\n }\n });\n }\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(textElement, {\n containerId: container.id,\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_0__.VERTICAL_ALIGN.MIDDLE,\n boundElements: null,\n }, false);\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.redrawTextBoundingBox)(textElement, container);\n updatedElements = pushContainerBelowText([...updatedElements, container], container, textElement);\n containerIds[container.id] = true;\n }\n }\n return {\n elements: updatedElements,\n appState: Object.assign(Object.assign({}, appState), { selectedElementIds: containerIds }),\n commitToHistory: true,\n };\n },\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYWN0aW9ucy9hY3Rpb25Cb3VuZFRleHQudHN4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUE2RTtBQUNDO0FBQ3JCO0FBTXpCO0FBSUE7QUFLRDtBQU9nQjtBQUVOO0FBQ0g7QUFFL0IsTUFBTSxnQkFBZ0IsR0FBRyxtREFBUSxDQUFDO0lBQ3ZDLElBQUksRUFBRSxZQUFZO0lBQ2xCLGdCQUFnQixFQUFFLG1CQUFtQjtJQUNyQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO0lBQ25DLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUNoQyxNQUFNLGdCQUFnQixHQUFHLDJEQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRSxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsd0VBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsMkRBQW1CLENBQzFDLCtEQUFxQixDQUFDLFFBQVEsQ0FBQyxFQUMvQixRQUFRLENBQ1QsQ0FBQztRQUNGLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFOztZQUNuQyxNQUFNLGdCQUFnQixHQUFHLHlFQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3BCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLGlFQUFXLENBQzdDLGdCQUFnQixDQUFDLFlBQVksRUFDN0IscURBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMvQixnQkFBZ0IsQ0FBQyxVQUFVLENBQzVCLENBQUM7Z0JBQ0YsTUFBTSx1QkFBdUIsR0FBRyx5RkFBbUMsQ0FDakUsT0FBTyxDQUFDLEVBQUUsQ0FDWCxDQUFDO2dCQUNGLGlGQUEyQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFeEMscUVBQWEsQ0FBQyxnQkFBeUMsRUFBRTtvQkFDdkQsV0FBVyxFQUFFLElBQUk7b0JBQ2pCLEtBQUs7b0JBQ0wsTUFBTTtvQkFDTixRQUFRO29CQUNSLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxZQUFZO2lCQUNwQyxDQUFDLENBQUM7Z0JBQ0gscUVBQWEsQ0FBQyxPQUFPLEVBQUU7b0JBQ3JCLGFBQWEsRUFBRSxhQUFPLENBQUMsYUFBYSwwQ0FBRSxNQUFNLENBQzFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLGdCQUFnQixDQUFDLEVBQUUsQ0FDeEM7b0JBQ0QsTUFBTSxFQUFFLHVCQUF1Qjt3QkFDN0IsQ0FBQyxDQUFDLHVCQUF1Qjt3QkFDekIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNO2lCQUNuQixDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNMLFFBQVE7WUFDUixRQUFRO1lBQ1IsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDLENBQUM7QUFFSSxNQUFNLGNBQWMsR0FBRyxtREFBUSxDQUFDO0lBQ3JDLElBQUksRUFBRSxVQUFVO0lBQ2hCLGdCQUFnQixFQUFFLGlCQUFpQjtJQUNuQyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO0lBQ25DLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUNoQyxNQUFNLGdCQUFnQixHQUFHLDJEQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVqRSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakMsTUFBTSxXQUFXLEdBQ2YsdURBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsdURBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXJDLElBQUksZ0JBQWdCLENBQUM7WUFDckIsSUFBSSw0RUFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNoRCxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QztpQkFBTSxJQUFJLDRFQUF1QixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZELGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hDO1lBQ0QsSUFDRSxXQUFXO2dCQUNYLGdCQUFnQjtnQkFDaEIseUVBQW1CLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQzlDO2dCQUNBLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUM5QixNQUFNLGdCQUFnQixHQUFHLDJEQUFtQixDQUMxQywrREFBcUIsQ0FBQyxRQUFRLENBQUMsRUFDL0IsUUFBUSxDQUNULENBQUM7UUFFRixJQUFJLFdBQWtDLENBQUM7UUFDdkMsSUFBSSxTQUFrQyxDQUFDO1FBRXZDLElBQ0UsdURBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyw0RUFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUM1QztZQUNBLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakM7YUFBTTtZQUNMLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQTBCLENBQUM7WUFDM0QsU0FBUyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBNEIsQ0FBQztTQUM1RDtRQUNELHFFQUFhLENBQUMsV0FBVyxFQUFFO1lBQ3pCLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRTtZQUN6QixhQUFhLEVBQUUsNkRBQXFCO1NBQ3JDLENBQUMsQ0FBQztRQUNILHFFQUFhLENBQUMsU0FBUyxFQUFFO1lBQ3ZCLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNwRCxJQUFJLEVBQUUsTUFBTTtnQkFDWixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7YUFDbkIsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILDJFQUFxQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUU5QyxPQUFPO1lBQ0wsUUFBUSxFQUFFLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDO1lBQ2xFLFFBQVEsa0NBQU8sUUFBUSxLQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUU7WUFDdkUsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDLENBQUM7QUFFSCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLFFBQXNDLEVBQ3RDLFNBQTRCLEVBQzVCLFdBQWtDLEVBQ2xDLEVBQUU7SUFDRixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekMsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUNoRCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsRUFBRSxDQUNuQyxDQUFDO0lBQ0YsZUFBZSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1QyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUM5QyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUNqQyxDQUFDO0lBQ0YsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMzRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDLENBQUM7QUFFRixNQUFNLHNCQUFzQixHQUFHLENBQzdCLFFBQXNDLEVBQ3RDLFNBQTRCLEVBQzVCLFdBQWtDLEVBQ2xDLEVBQUU7SUFDRixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekMsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FDakMsQ0FBQztJQUNGLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFDLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FDaEQsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLEVBQUUsQ0FDbkMsQ0FBQztJQUNGLGVBQWUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVLLE1BQU0sNkJBQTZCLEdBQUcsbURBQVEsQ0FBQztJQUNwRCxJQUFJLEVBQUUseUJBQXlCO0lBQy9CLGdCQUFnQixFQUFFLGdDQUFnQztJQUNsRCxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFO0lBQ25DLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUNoQyxNQUFNLGdCQUFnQixHQUFHLDJEQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRSxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLHVEQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRSxPQUFPLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDO0lBQ3hELENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7O1FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsMkRBQW1CLENBQzFDLCtEQUFxQixDQUFDLFFBQVEsQ0FBQyxFQUMvQixRQUFRLENBQ1QsQ0FBQztRQUNGLElBQUksZUFBZSxHQUFpQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckUsTUFBTSxZQUFZLEdBQW1DLEVBQUUsQ0FBQztRQUV4RCxLQUFLLE1BQU0sV0FBVyxJQUFJLGdCQUFnQixFQUFFO1lBQzFDLElBQUksdURBQWEsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxTQUFTLEdBQUcsb0RBQVUsQ0FBQztvQkFDM0IsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLGVBQWUsRUFBRSxRQUFRLENBQUMsMEJBQTBCO29CQUNwRCxhQUFhLEVBQUU7d0JBQ2IsR0FBRyxDQUFDLFdBQVcsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO3dCQUNwQyxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7cUJBQ3JDO29CQUNELEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztvQkFDeEIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxvQkFBb0I7b0JBQ3hDLFdBQVcsRUFBRSxRQUFRLENBQUMsc0JBQXNCO29CQUM1QyxTQUFTLEVBQUUsUUFBUSxDQUFDLG9CQUFvQjtvQkFDeEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxzQkFBc0I7b0JBQzVDLFdBQVcsRUFBRSxRQUFRLENBQUMsc0JBQXNCO29CQUM1QyxTQUFTLEVBQ1AsUUFBUSxDQUFDLG9CQUFvQixLQUFLLE9BQU87d0JBQ3ZDLENBQUMsQ0FBQzs0QkFDRSxJQUFJLEVBQUUsMEVBQXFCLENBQUMsV0FBVyxDQUFDO2dDQUN0QyxDQUFDLENBQUMsaUVBQXlCO2dDQUMzQixDQUFDLENBQUMscUVBQTZCO3lCQUNsQzt3QkFDSCxDQUFDLENBQUMsSUFBSTtvQkFDVixPQUFPLEVBQUUsR0FBRztvQkFDWixNQUFNLEVBQUUsS0FBSztvQkFDYixDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRywwREFBa0I7b0JBQ3JDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxHQUFHLDBEQUFrQjtvQkFDckMsS0FBSyxFQUFFLDJGQUFxQyxDQUMxQyxXQUFXLENBQUMsS0FBSyxFQUNqQixXQUFXLENBQ1o7b0JBQ0QsTUFBTSxFQUFFLDJGQUFxQyxDQUMzQyxXQUFXLENBQUMsTUFBTSxFQUNsQixXQUFXLENBQ1o7b0JBQ0QsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFRO2lCQUMvQixDQUFDLENBQUM7Z0JBRUgsa0JBQWtCO2dCQUNsQixJQUFJLGlCQUFXLENBQUMsYUFBYSwwQ0FBRSxNQUFNLEVBQUU7b0JBQ3JDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGFBQWE7eUJBQy9DLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7eUJBQ3JDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN0QixNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDcEQsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FDTCxDQUFDO29CQUMvQixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQzdCLElBQUksWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUM7d0JBQ3BDLElBQUksVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7d0JBRWhDLElBQUksYUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLFNBQVMsTUFBSyxXQUFXLENBQUMsRUFBRSxFQUFFOzRCQUM5QyxZQUFZLG1DQUNQLFlBQVksS0FDZixTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUUsR0FDeEIsQ0FBQzt5QkFDSDt3QkFFRCxJQUFJLFdBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxTQUFTLE1BQUssV0FBVyxDQUFDLEVBQUUsRUFBRTs0QkFDNUMsVUFBVSxtQ0FBUSxVQUFVLEtBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUUsQ0FBQzt5QkFDekQ7d0JBRUQsSUFBSSxZQUFZLElBQUksVUFBVSxFQUFFOzRCQUM5QixxRUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDekQ7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBRUQscUVBQWEsQ0FDWCxXQUFXLEVBQ1g7b0JBQ0UsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO29CQUN6QixhQUFhLEVBQUUsNkRBQXFCO29CQUNwQyxhQUFhLEVBQUUsSUFBSTtpQkFDcEIsRUFDRCxLQUFLLENBQ04sQ0FBQztnQkFDRiwyRUFBcUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBRTlDLGVBQWUsR0FBRyxzQkFBc0IsQ0FDdEMsQ0FBQyxHQUFHLGVBQWUsRUFBRSxTQUFTLENBQUMsRUFDL0IsU0FBUyxFQUNULFdBQVcsQ0FDWixDQUFDO2dCQUNGLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ25DO1NBQ0Y7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLGVBQWU7WUFDekIsUUFBUSxrQ0FDSCxRQUFRLEtBQ1gsa0JBQWtCLEVBQUUsWUFBWSxHQUNqQztZQUNELGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FjdGlvbnMvYWN0aW9uQm91bmRUZXh0LnRzeD80YmZmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJPVU5EX1RFWFRfUEFERElORywgUk9VTkRORVNTLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldE5vbkRlbGV0ZWRFbGVtZW50cywgaXNUZXh0RWxlbWVudCwgbmV3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudCxcbiAgbWVhc3VyZVRleHQsXG4gIHJlZHJhd1RleHRCb3VuZGluZ0JveCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldE9yaWdpbmFsQ29udGFpbmVySGVpZ2h0RnJvbUNhY2hlLFxuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L3RleHRXeXNpd3lnXCI7XG5pbXBvcnQge1xuICBoYXNCb3VuZFRleHRFbGVtZW50LFxuICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcixcbiAgaXNVc2luZ0FkYXB0aXZlUmFkaXVzLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Rm9udFN0cmluZyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tIFwiLi9yZWdpc3RlclwiO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uVW5iaW5kVGV4dCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJ1bmJpbmRUZXh0XCIsXG4gIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnVuYmluZFRleHRcIixcbiAgdHJhY2tFdmVudDogeyBjYXRlZ29yeTogXCJlbGVtZW50XCIgfSxcbiAgcHJlZGljYXRlOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpKTtcbiAgfSxcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKSxcbiAgICAgIGFwcFN0YXRlLFxuICAgICk7XG4gICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgYmFzZWxpbmUgfSA9IG1lYXN1cmVUZXh0KFxuICAgICAgICAgIGJvdW5kVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcoYm91bmRUZXh0RWxlbWVudCksXG4gICAgICAgICAgYm91bmRUZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGdldE9yaWdpbmFsQ29udGFpbmVySGVpZ2h0RnJvbUNhY2hlKFxuICAgICAgICAgIGVsZW1lbnQuaWQsXG4gICAgICAgICk7XG4gICAgICAgIHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZShlbGVtZW50LmlkKTtcblxuICAgICAgICBtdXRhdGVFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50LCB7XG4gICAgICAgICAgY29udGFpbmVySWQ6IG51bGwsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGJhc2VsaW5lLFxuICAgICAgICAgIHRleHQ6IGJvdW5kVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICB9KTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgYm91bmRFbGVtZW50czogZWxlbWVudC5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlKSA9PiBlbGUuaWQgIT09IGJvdW5kVGV4dEVsZW1lbnQuaWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBoZWlnaHQ6IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0XG4gICAgICAgICAgICA/IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0XG4gICAgICAgICAgICA6IGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHMsXG4gICAgICBhcHBTdGF0ZSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25CaW5kVGV4dCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJiaW5kVGV4dFwiLFxuICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5iaW5kVGV4dFwiLFxuICB0cmFja0V2ZW50OiB7IGNhdGVnb3J5OiBcImVsZW1lbnRcIiB9LFxuICBwcmVkaWNhdGU6IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB0ZXh0RWxlbWVudCA9XG4gICAgICAgIGlzVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgfHxcbiAgICAgICAgaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzFdKTtcblxuICAgICAgbGV0IGJpbmRpbmdDb250YWluZXI7XG4gICAgICBpZiAoaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgYmluZGluZ0NvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG4gICAgICB9IGVsc2UgaWYgKGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKHNlbGVjdGVkRWxlbWVudHNbMV0pKSB7XG4gICAgICAgIGJpbmRpbmdDb250YWluZXIgPSBzZWxlY3RlZEVsZW1lbnRzWzFdO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0ZXh0RWxlbWVudCAmJlxuICAgICAgICBiaW5kaW5nQ29udGFpbmVyICYmXG4gICAgICAgIGdldEJvdW5kVGV4dEVsZW1lbnQoYmluZGluZ0NvbnRhaW5lcikgPT09IG51bGxcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpLFxuICAgICAgYXBwU3RhdGUsXG4gICAgKTtcblxuICAgIGxldCB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGxldCBjb250YWluZXI6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyO1xuXG4gICAgaWYgKFxuICAgICAgaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSAmJlxuICAgICAgaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1sxXSlcbiAgICApIHtcbiAgICAgIHRleHRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgIGNvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1sxXSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgICBjb250YWluZXIgPSBzZWxlY3RlZEVsZW1lbnRzWzBdIGFzIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyO1xuICAgIH1cbiAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICBjb250YWluZXJJZDogY29udGFpbmVyLmlkLFxuICAgICAgdmVydGljYWxBbGlnbjogVkVSVElDQUxfQUxJR04uTUlERExFLFxuICAgIH0pO1xuICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBpZDogdGV4dEVsZW1lbnQuaWQsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3godGV4dEVsZW1lbnQsIGNvbnRhaW5lcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IHB1c2hUZXh0QWJvdmVDb250YWluZXIoZWxlbWVudHMsIGNvbnRhaW5lciwgdGV4dEVsZW1lbnQpLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIHNlbGVjdGVkRWxlbWVudElkczogeyBbY29udGFpbmVyLmlkXTogdHJ1ZSB9IH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbn0pO1xuXG5jb25zdCBwdXNoVGV4dEFib3ZlQ29udGFpbmVyID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbikgPT4ge1xuICBjb25zdCB1cGRhdGVkRWxlbWVudHMgPSBlbGVtZW50cy5zbGljZSgpO1xuICBjb25zdCB0ZXh0RWxlbWVudEluZGV4ID0gdXBkYXRlZEVsZW1lbnRzLmZpbmRJbmRleChcbiAgICAoZWxlKSA9PiBlbGUuaWQgPT09IHRleHRFbGVtZW50LmlkLFxuICApO1xuICB1cGRhdGVkRWxlbWVudHMuc3BsaWNlKHRleHRFbGVtZW50SW5kZXgsIDEpO1xuXG4gIGNvbnN0IGNvbnRhaW5lckluZGV4ID0gdXBkYXRlZEVsZW1lbnRzLmZpbmRJbmRleChcbiAgICAoZWxlKSA9PiBlbGUuaWQgPT09IGNvbnRhaW5lci5pZCxcbiAgKTtcbiAgdXBkYXRlZEVsZW1lbnRzLnNwbGljZShjb250YWluZXJJbmRleCArIDEsIDAsIHRleHRFbGVtZW50KTtcbiAgcmV0dXJuIHVwZGF0ZWRFbGVtZW50cztcbn07XG5cbmNvbnN0IHB1c2hDb250YWluZXJCZWxvd1RleHQgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuKSA9PiB7XG4gIGNvbnN0IHVwZGF0ZWRFbGVtZW50cyA9IGVsZW1lbnRzLnNsaWNlKCk7XG4gIGNvbnN0IGNvbnRhaW5lckluZGV4ID0gdXBkYXRlZEVsZW1lbnRzLmZpbmRJbmRleChcbiAgICAoZWxlKSA9PiBlbGUuaWQgPT09IGNvbnRhaW5lci5pZCxcbiAgKTtcbiAgdXBkYXRlZEVsZW1lbnRzLnNwbGljZShjb250YWluZXJJbmRleCwgMSk7XG5cbiAgY29uc3QgdGV4dEVsZW1lbnRJbmRleCA9IHVwZGF0ZWRFbGVtZW50cy5maW5kSW5kZXgoXG4gICAgKGVsZSkgPT4gZWxlLmlkID09PSB0ZXh0RWxlbWVudC5pZCxcbiAgKTtcbiAgdXBkYXRlZEVsZW1lbnRzLnNwbGljZSh0ZXh0RWxlbWVudEluZGV4LCAwLCBjb250YWluZXIpO1xuICByZXR1cm4gdXBkYXRlZEVsZW1lbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGFjdGlvbkNyZWF0ZUNvbnRhaW5lckZyb21UZXh0ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcImNyZWF0ZUNvbnRhaW5lckZyb21UZXh0XCIsXG4gIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLmNyZWF0ZUNvbnRhaW5lckZyb21UZXh0XCIsXG4gIHRyYWNrRXZlbnQ6IHsgY2F0ZWdvcnk6IFwiZWxlbWVudFwiIH0sXG4gIHByZWRpY2F0ZTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gICAgY29uc3QgYXJlVGV4dEVsZW1lbnRzID0gc2VsZWN0ZWRFbGVtZW50cy5ldmVyeSgoZWwpID0+IGlzVGV4dEVsZW1lbnQoZWwpKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmIGFyZVRleHRFbGVtZW50cztcbiAgfSxcbiAgcGVyZm9ybTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGVsZW1lbnRzKSxcbiAgICAgIGFwcFN0YXRlLFxuICAgICk7XG4gICAgbGV0IHVwZGF0ZWRFbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSA9IGVsZW1lbnRzLnNsaWNlKCk7XG4gICAgY29uc3QgY29udGFpbmVySWRzOiBBcHBTdGF0ZVtcInNlbGVjdGVkRWxlbWVudElkc1wiXSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCB0ZXh0RWxlbWVudCBvZiBzZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudCh0ZXh0RWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gbmV3RWxlbWVudCh7XG4gICAgICAgICAgdHlwZTogXCJyZWN0YW5nbGVcIixcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGFwcFN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgIGJvdW5kRWxlbWVudHM6IFtcbiAgICAgICAgICAgIC4uLih0ZXh0RWxlbWVudC5ib3VuZEVsZW1lbnRzIHx8IFtdKSxcbiAgICAgICAgICAgIHsgaWQ6IHRleHRFbGVtZW50LmlkLCB0eXBlOiBcInRleHRcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYW5nbGU6IHRleHRFbGVtZW50LmFuZ2xlLFxuICAgICAgICAgIGZpbGxTdHlsZTogYXBwU3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICAgICAgc3Ryb2tlQ29sb3I6IGFwcFN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgICAgcm91Z2huZXNzOiBhcHBTdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgICAgICBzdHJva2VXaWR0aDogYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgICBzdHJva2VTdHlsZTogYXBwU3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgICByb3VuZG5lc3M6XG4gICAgICAgICAgICBhcHBTdGF0ZS5jdXJyZW50SXRlbVJvdW5kbmVzcyA9PT0gXCJyb3VuZFwiXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogaXNVc2luZ0FkYXB0aXZlUmFkaXVzKFwicmVjdGFuZ2xlXCIpXG4gICAgICAgICAgICAgICAgICAgID8gUk9VTkRORVNTLkFEQVBUSVZFX1JBRElVU1xuICAgICAgICAgICAgICAgICAgICA6IFJPVU5ETkVTUy5QUk9QT1JUSU9OQUxfUkFESVVTLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIG9wYWNpdHk6IDEwMCxcbiAgICAgICAgICBsb2NrZWQ6IGZhbHNlLFxuICAgICAgICAgIHg6IHRleHRFbGVtZW50LnggLSBCT1VORF9URVhUX1BBRERJTkcsXG4gICAgICAgICAgeTogdGV4dEVsZW1lbnQueSAtIEJPVU5EX1RFWFRfUEFERElORyxcbiAgICAgICAgICB3aWR0aDogY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgICAgIHRleHRFbGVtZW50LndpZHRoLFxuICAgICAgICAgICAgXCJyZWN0YW5nbGVcIixcbiAgICAgICAgICApLFxuICAgICAgICAgIGhlaWdodDogY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgICAgIHRleHRFbGVtZW50LmhlaWdodCxcbiAgICAgICAgICAgIFwicmVjdGFuZ2xlXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBncm91cElkczogdGV4dEVsZW1lbnQuZ3JvdXBJZHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHVwZGF0ZSBiaW5kaW5nc1xuICAgICAgICBpZiAodGV4dEVsZW1lbnQuYm91bmRFbGVtZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbGluZWFyRWxlbWVudElkcyA9IHRleHRFbGVtZW50LmJvdW5kRWxlbWVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGVsZSkgPT4gZWxlLnR5cGUgPT09IFwiYXJyb3dcIilcbiAgICAgICAgICAgIC5tYXAoKGVsKSA9PiBlbC5pZCk7XG4gICAgICAgICAgY29uc3QgbGluZWFyRWxlbWVudHMgPSB1cGRhdGVkRWxlbWVudHMuZmlsdGVyKChlbGUpID0+XG4gICAgICAgICAgICBsaW5lYXJFbGVtZW50SWRzLmluY2x1ZGVzKGVsZS5pZCksXG4gICAgICAgICAgKSBhcyBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtdO1xuICAgICAgICAgIGxpbmVhckVsZW1lbnRzLmZvckVhY2goKGVsZSkgPT4ge1xuICAgICAgICAgICAgbGV0IHN0YXJ0QmluZGluZyA9IGVsZS5zdGFydEJpbmRpbmc7XG4gICAgICAgICAgICBsZXQgZW5kQmluZGluZyA9IGVsZS5lbmRCaW5kaW5nO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnRCaW5kaW5nPy5lbGVtZW50SWQgPT09IHRleHRFbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgIHN0YXJ0QmluZGluZyA9IHtcbiAgICAgICAgICAgICAgICAuLi5zdGFydEJpbmRpbmcsXG4gICAgICAgICAgICAgICAgZWxlbWVudElkOiBjb250YWluZXIuaWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmRCaW5kaW5nPy5lbGVtZW50SWQgPT09IHRleHRFbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgIGVuZEJpbmRpbmcgPSB7IC4uLmVuZEJpbmRpbmcsIGVsZW1lbnRJZDogY29udGFpbmVyLmlkIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdGFydEJpbmRpbmcgfHwgZW5kQmluZGluZykge1xuICAgICAgICAgICAgICBtdXRhdGVFbGVtZW50KGVsZSwgeyBzdGFydEJpbmRpbmcsIGVuZEJpbmRpbmcgfSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbXV0YXRlRWxlbWVudChcbiAgICAgICAgICB0ZXh0RWxlbWVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250YWluZXJJZDogY29udGFpbmVyLmlkLFxuICAgICAgICAgICAgdmVydGljYWxBbGlnbjogVkVSVElDQUxfQUxJR04uTUlERExFLFxuICAgICAgICAgICAgYm91bmRFbGVtZW50czogbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuICAgICAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3godGV4dEVsZW1lbnQsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgdXBkYXRlZEVsZW1lbnRzID0gcHVzaENvbnRhaW5lckJlbG93VGV4dChcbiAgICAgICAgICBbLi4udXBkYXRlZEVsZW1lbnRzLCBjb250YWluZXJdLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB0ZXh0RWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGFpbmVySWRzW2NvbnRhaW5lci5pZF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogdXBkYXRlZEVsZW1lbnRzLFxuICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgLi4uYXBwU3RhdGUsXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogY29udGFpbmVySWRzLFxuICAgICAgfSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxufSk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../actions/actionBoundText.tsx\n");
|
|
1804
1804
|
|
|
1805
1805
|
/***/ }),
|
|
1806
1806
|
|
|
@@ -2108,7 +2108,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2108
2108
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2109
2109
|
|
|
2110
2110
|
"use strict";
|
|
2111
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nconst trackEvent = (category, action, label, value) => {\n try {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n if (typeof window === \"undefined\" || ({\"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\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-
|
|
2111
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nconst trackEvent = (category, action, label, value) => {\n try {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n if (typeof window === \"undefined\" || ({\"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\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-570820c\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true}).JEST_WORKER_ID) {\n return;\n }\n if (({\"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\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-570820c\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true}).REACT_APP_GOOGLE_ANALYTICS_ID && window.gtag) {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n // MATOMO event tracking _paq must be same as the one in index.html\n if (window._paq) {\n window._paq.push([\"trackEvent\", category, action, label, value]);\n }\n }\n catch (error) {\n console.error(\"error during analytics\", error);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBTyxNQUFNLFVBQVUsR0FBRyxDQUN4QixRQUFnQixFQUNoQixNQUFjLEVBQ2QsS0FBYyxFQUNkLEtBQWMsRUFDZCxFQUFFO0lBQ0YsSUFBSTtRQUNGLDJDQUEyQztRQUMzQyxrRUFBa0U7UUFFbEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksbWlDQUFXLENBQUMsY0FBYyxFQUFFO1lBQy9ELE9BQU87U0FDUjtRQUVELElBQUksbWlDQUFXLENBQUMsNkJBQTZCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBRUQsbUVBQW1FO1FBQ25FLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDbEU7S0FDRjtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNoRDtBQUNILENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hbmFseXRpY3MudHM/NWYwYyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdHJhY2tFdmVudCA9IChcbiAgY2F0ZWdvcnk6IHN0cmluZyxcbiAgYWN0aW9uOiBzdHJpbmcsXG4gIGxhYmVsPzogc3RyaW5nLFxuICB2YWx1ZT86IG51bWJlcixcbikgPT4ge1xuICB0cnkge1xuICAgIC8vIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIHRyYWNrIGxvY2FsbHlcbiAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiYgd2luZG93Lmd0YWcpIHtcbiAgICAgIHdpbmRvdy5ndGFnKFwiZXZlbnRcIiwgYWN0aW9uLCB7XG4gICAgICAgIGV2ZW50X2NhdGVnb3J5OiBjYXRlZ29yeSxcbiAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1BVE9NTyBldmVudCB0cmFja2luZyBfcGFxIG11c3QgYmUgc2FtZSBhcyB0aGUgb25lIGluIGluZGV4Lmh0bWxcbiAgICBpZiAod2luZG93Ll9wYXEpIHtcbiAgICAgIHdpbmRvdy5fcGFxLnB1c2goW1widHJhY2tFdmVudFwiLCBjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgdmFsdWVdKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcImVycm9yIGR1cmluZyBhbmFseXRpY3NcIiwgZXJyb3IpO1xuICB9XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
|
|
2112
2112
|
|
|
2113
2113
|
/***/ }),
|
|
2114
2114
|
|
|
@@ -3142,7 +3142,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3142
3142
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3143
3143
|
|
|
3144
3144
|
"use strict";
|
|
3145
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AllowedExcalidrawActiveTools\": () => (/* binding */ AllowedExcalidrawActiveTools),\n/* harmony export */ \"restore\": () => (/* binding */ restore),\n/* harmony export */ \"restoreAppState\": () => (/* binding */ restoreAppState),\n/* harmony export */ \"restoreElements\": () => (/* binding */ restoreElements),\n/* harmony export */ \"restoreLibraryItems\": () => (/* binding */ restoreLibraryItems)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n\n\n\n\n\n\n\n\n\n\n\nconst AllowedExcalidrawActiveTools = {\n selection: true,\n text: true,\n rectangle: true,\n diamond: true,\n ellipse: true,\n line: true,\n image: true,\n arrow: true,\n freedraw: true,\n eraser: false,\n custom: true,\n hand: true,\n};\nconst getFontFamilyByName = (fontFamilyName) => {\n if (Object.keys(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY).includes(fontFamilyName)) {\n return _constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY[fontFamilyName];\n }\n return _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_FONT_FAMILY;\n};\nconst restoreElementWithProperties = (element, extra) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n const base = {\n type: extra.type || element.type,\n // all elements must have version > 0 so getSceneVersion() will pick up\n // newly added elements\n version: element.version || 1,\n versionNonce: (_a = element.versionNonce) !== null && _a !== void 0 ? _a : 0,\n isDeleted: (_b = element.isDeleted) !== null && _b !== void 0 ? _b : false,\n id: element.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\n fillStyle: element.fillStyle || \"hachure\",\n strokeWidth: element.strokeWidth || 1,\n strokeStyle: (_c = element.strokeStyle) !== null && _c !== void 0 ? _c : \"solid\",\n roughness: (_d = element.roughness) !== null && _d !== void 0 ? _d : 1,\n opacity: element.opacity == null ? 100 : element.opacity,\n angle: element.angle || 0,\n x: (_f = (_e = extra.x) !== null && _e !== void 0 ? _e : element.x) !== null && _f !== void 0 ? _f : 0,\n y: (_h = (_g = extra.y) !== null && _g !== void 0 ? _g : element.y) !== null && _h !== void 0 ? _h : 0,\n strokeColor: element.strokeColor || open_color__WEBPACK_IMPORTED_MODULE_8__.black,\n backgroundColor: element.backgroundColor || \"transparent\",\n width: element.width || 0,\n height: element.height || 0,\n seed: (_j = element.seed) !== null && _j !== void 0 ? _j : 1,\n groupIds: (_k = element.groupIds) !== null && _k !== void 0 ? _k : [],\n roundness: element.roundness\n ? element.roundness\n : element.strokeSharpness === \"round\"\n ? {\n // for old elements that would now use adaptive radius algo,\n // use legacy algo instead\n type: (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isUsingAdaptiveRadius)(element.type)\n ? _constants__WEBPACK_IMPORTED_MODULE_3__.ROUNDNESS.LEGACY\n : _constants__WEBPACK_IMPORTED_MODULE_3__.ROUNDNESS.PROPORTIONAL_RADIUS,\n }\n : null,\n boundElements: element.boundElementIds\n ? element.boundElementIds.map((id) => ({ type: \"arrow\", id }))\n : (_l = element.boundElements) !== null && _l !== void 0 ? _l : [],\n updated: (_m = element.updated) !== null && _m !== void 0 ? _m : (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getUpdatedTimestamp)(),\n link: (_o = element.link) !== null && _o !== void 0 ? _o : null,\n locked: (_p = element.locked) !== null && _p !== void 0 ? _p : false,\n };\n if (\"customData\" in element) {\n base.customData = element.customData;\n }\n if (_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY in element) {\n base[_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY] = element[_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY];\n }\n return Object.assign(Object.assign(Object.assign({}, base), (0,_element__WEBPACK_IMPORTED_MODULE_0__.getNormalizedDimensions)(base)), extra);\n};\nconst restoreElement = (element, refreshDimensions = false) => {\n var _a, _b;\n switch (element.type) {\n case \"text\":\n let fontSize = element.fontSize;\n let fontFamily = element.fontFamily;\n if (\"font\" in element) {\n const [fontPx, _fontFamily] = element.font.split(\" \");\n fontSize = parseFloat(fontPx);\n fontFamily = getFontFamilyByName(_fontFamily);\n }\n const text = (_a = element.text) !== null && _a !== void 0 ? _a : \"\";\n element = restoreElementWithProperties(element, {\n fontSize,\n fontFamily,\n text,\n textAlign: element.textAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_TEXT_ALIGN,\n verticalAlign: element.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERTICAL_ALIGN,\n containerId: (_b = element.containerId) !== null && _b !== void 0 ? _b : null,\n originalText: element.originalText || text,\n // line-height might not be specified either when creating elements\n // programmatically, or when importing old diagrams.\n // For the latter we want to detect the original line height which\n // will likely differ from our per-font fixed line height we now use,\n // to maintain backward compatibility.\n lineHeight: element.lineHeight ||\n (element.height\n ? // detect line-height from current element height and font-size\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_9__.detectLineHeight)(element)\n : // no element height likely means programmatic use, so default\n // to a fixed line height\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_9__.getDefaultLineHeight)(element.fontFamily)),\n });\n if (refreshDimensions) {\n element = Object.assign(Object.assign({}, element), (0,_element__WEBPACK_IMPORTED_MODULE_0__.refreshTextDimensions)(element));\n }\n return element;\n case \"freedraw\": {\n return restoreElementWithProperties(element, {\n points: element.points,\n lastCommittedPoint: null,\n simulatePressure: element.simulatePressure,\n pressures: element.pressures,\n });\n }\n case \"image\":\n return restoreElementWithProperties(element, {\n status: element.status || \"pending\",\n fileId: element.fileId,\n scale: element.scale || [1, 1],\n });\n case \"line\":\n // @ts-ignore LEGACY type\n // eslint-disable-next-line no-fallthrough\n case \"draw\":\n case \"arrow\": {\n const { startArrowhead = null, endArrowhead = element.type === \"arrow\" ? \"arrow\" : null, } = element;\n let x = element.x;\n let y = element.y;\n let points = // migrate old arrow model to new one\n !Array.isArray(element.points) || element.points.length < 2\n ? [\n [0, 0],\n [element.width, element.height],\n ]\n : element.points;\n if (points[0][0] !== 0 || points[0][1] !== 0) {\n ({ points, x, y } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__.LinearElementEditor.getNormalizedPoints(element));\n }\n return restoreElementWithProperties(element, {\n type: element.type === \"draw\"\n ? \"line\"\n : element.type,\n startBinding: element.startBinding,\n endBinding: element.endBinding,\n lastCommittedPoint: null,\n startArrowhead,\n endArrowhead,\n points,\n x,\n y,\n });\n }\n // generic elements\n case \"ellipse\":\n return restoreElementWithProperties(element, {});\n case \"rectangle\":\n return restoreElementWithProperties(element, {});\n case \"diamond\":\n return restoreElementWithProperties(element, {});\n // Don't use default case so as to catch a missing an element type case.\n // We also don't want to throw, but instead return void so we filter\n // out these unsupported elements from the restored array.\n }\n};\n/**\n * Repairs contaienr element's boundElements array by removing duplicates and\n * fixing containerId of bound elements if not present. Also removes any\n * bound elements that do not exist in the elements array.\n *\n * NOTE mutates elements.\n */\nconst repairContainerElement = (container, elementsMap) => {\n if (container.boundElements) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = container.boundElements.slice();\n // dedupe bindings & fix boundElement.containerId if not set already\n const boundIds = new Set();\n container.boundElements = boundElements.reduce((acc, binding) => {\n const boundElement = elementsMap.get(binding.id);\n if (boundElement && !boundIds.has(binding.id)) {\n boundIds.add(binding.id);\n if (boundElement.isDeleted) {\n return acc;\n }\n acc.push(binding);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(boundElement) &&\n // being slightly conservative here, preserving existing containerId\n // if defined, lest boundElements is stale\n !boundElement.containerId) {\n boundElement.containerId =\n container.id;\n }\n }\n return acc;\n }, []);\n }\n};\n/**\n * Repairs target bound element's container's boundElements array,\n * or removes contaienrId if container does not exist.\n *\n * NOTE mutates elements.\n */\nconst repairBoundElement = (boundElement, elementsMap) => {\n const container = boundElement.containerId\n ? elementsMap.get(boundElement.containerId)\n : null;\n if (!container) {\n boundElement.containerId = null;\n return;\n }\n if (boundElement.isDeleted) {\n return;\n }\n if (container.boundElements &&\n !container.boundElements.find((binding) => binding.id === boundElement.id)) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = (container.boundElements || (container.boundElements = [])).slice();\n boundElements.push({ type: \"text\", id: boundElement.id });\n container.boundElements = boundElements;\n }\n};\nconst restoreElements = (elements, \n/** NOTE doesn't serve for reconciliation */\nlocalElements, opts) => {\n const localElementsMap = localElements ? (0,_utils__WEBPACK_IMPORTED_MODULE_7__.arrayToMap)(localElements) : null;\n const restoredElements = (elements || []).reduce((elements, element) => {\n // filtering out selection, which is legacy, no longer kept in elements,\n // and causing issues if retained\n if (element.type !== \"selection\" && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isInvisiblySmallElement)(element)) {\n let migratedElement = restoreElement(element, opts === null || opts === void 0 ? void 0 : opts.refreshDimensions);\n if (migratedElement) {\n const localElement = localElementsMap === null || localElementsMap === void 0 ? void 0 : localElementsMap.get(element.id);\n if (localElement && localElement.version > migratedElement.version) {\n migratedElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_6__.bumpVersion)(migratedElement, localElement.version);\n }\n elements.push(migratedElement);\n }\n }\n return elements;\n }, []);\n if (!(opts === null || opts === void 0 ? void 0 : opts.repairBindings)) {\n return restoredElements;\n }\n // repair binding. Mutates elements.\n const restoredElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_7__.arrayToMap)(restoredElements);\n for (const element of restoredElements) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(element) && element.containerId) {\n repairBoundElement(element, restoredElementsMap);\n }\n else if (element.boundElements) {\n repairContainerElement(element, restoredElementsMap);\n }\n }\n return restoredElements;\n};\nconst coalesceAppStateValue = (key, appState, defaultAppState) => {\n const value = appState[key];\n // NOTE the value! assertion is needed in TS 4.5.5 (fixed in newer versions)\n return value !== undefined ? value : defaultAppState[key];\n};\nconst LegacyAppStateMigrations = {\n isLibraryOpen: (appState, defaultAppState) => {\n return [\n \"openSidebar\",\n \"isLibraryOpen\" in appState\n ? appState.isLibraryOpen\n ? \"library\"\n : null\n : coalesceAppStateValue(\"openSidebar\", appState, defaultAppState),\n ];\n },\n isLibraryMenuDocked: (appState, defaultAppState) => {\n var _a;\n return [\n \"isSidebarDocked\",\n (_a = appState.isLibraryMenuDocked) !== null && _a !== void 0 ? _a : coalesceAppStateValue(\"isSidebarDocked\", appState, defaultAppState),\n ];\n },\n};\nconst restoreAppState = (appState, localAppState) => {\n var _a, _b, _c, _d;\n appState = appState || {};\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_4__.getDefaultAppState)();\n const nextAppState = {};\n // first, migrate all legacy AppState properties to new ones. We do it\n // in one go before migrate the rest of the properties in case the new ones\n // depend on checking any other key (i.e. they are coupled)\n for (const legacyKey of Object.keys(LegacyAppStateMigrations)) {\n if (legacyKey in appState) {\n const [nextKey, nextValue] = LegacyAppStateMigrations[legacyKey](appState, defaultAppState);\n nextAppState[nextKey] = nextValue;\n }\n }\n for (const [key, defaultValue] of Object.entries(defaultAppState)) {\n // if AppState contains a legacy key, prefer that one and migrate its\n // value to the new one\n const suppliedValue = appState[key];\n const localValue = localAppState ? localAppState[key] : undefined;\n nextAppState[key] =\n suppliedValue !== undefined\n ? suppliedValue\n : localValue !== undefined\n ? localValue\n : defaultValue;\n }\n return Object.assign(Object.assign({}, nextAppState), { cursorButton: (localAppState === null || localAppState === void 0 ? void 0 : localAppState.cursorButton) || \"up\", \n // reset on fresh restore so as to hide the UI button if penMode not active\n penDetected: (_a = localAppState === null || localAppState === void 0 ? void 0 : localAppState.penDetected) !== null && _a !== void 0 ? _a : (appState.penMode ? (_b = appState.penDetected) !== null && _b !== void 0 ? _b : false : false), activeTool: Object.assign(Object.assign({}, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.updateActiveTool)(defaultAppState, nextAppState.activeTool.type &&\n AllowedExcalidrawActiveTools[nextAppState.activeTool.type]\n ? nextAppState.activeTool\n : { type: \"selection\" })), { lastActiveTool: null, locked: (_c = nextAppState.activeTool.locked) !== null && _c !== void 0 ? _c : false }), \n // Migrates from previous version where appState.zoom was a number\n zoom: typeof appState.zoom === \"number\"\n ? {\n value: appState.zoom,\n }\n : ((_d = appState.zoom) === null || _d === void 0 ? void 0 : _d.value)\n ? appState.zoom\n : defaultAppState.zoom, \n // when sidebar docked and user left it open in last session,\n // keep it open. If not docked, keep it closed irrespective of last state.\n openSidebar: nextAppState.openSidebar === \"library\"\n ? nextAppState.isSidebarDocked\n ? \"library\"\n : null\n : nextAppState.openSidebar });\n};\nconst restore = (data, \n/**\n * Local AppState (`this.state` or initial state from localStorage) so that we\n * don't overwrite local state with default values (when values not\n * explicitly specified).\n * Supply `null` if you can't get access to it.\n */\nlocalAppState, localElements, elementsConfig) => {\n return {\n elements: restoreElements(data === null || data === void 0 ? void 0 : data.elements, localElements, elementsConfig),\n appState: restoreAppState(data === null || data === void 0 ? void 0 : data.appState, localAppState || null),\n files: (data === null || data === void 0 ? void 0 : data.files) || {},\n };\n};\nconst restoreLibraryItem = (libraryItem) => {\n const elements = restoreElements((0,_element__WEBPACK_IMPORTED_MODULE_0__.getNonDeletedElements)(libraryItem.elements), null);\n return elements.length ? Object.assign(Object.assign({}, libraryItem), { elements }) : null;\n};\nconst restoreLibraryItems = (libraryItems = [], defaultStatus) => {\n const restoredItems = [];\n for (const item of libraryItems) {\n // migrate older libraries\n if (Array.isArray(item)) {\n const restoredItem = restoreLibraryItem({\n status: defaultStatus,\n elements: item,\n id: (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\n created: Date.now(),\n });\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n else {\n const _item = item;\n const restoredItem = restoreLibraryItem(Object.assign(Object.assign({}, _item), { id: _item.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(), status: _item.status || defaultStatus, created: _item.created || Date.now() }));\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n }\n return restoredItems;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNILElBQUksWUFBWSxFQUFFO2dCQUNoQixhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7S0FDRjtJQUNELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL3Jlc3RvcmUudHM/ODcyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1NlbGVjdGlvbkVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgU3Ryb2tlUm91bmRuZXNzLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBwU3RhdGUsXG4gIEJpbmFyeUZpbGVzLFxuICBMaWJyYXJ5SXRlbSxcbiAgTm9ybWFsaXplZFpvb21WYWx1ZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSwgTGVnYWN5QXBwU3RhdGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzLFxuICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyxcbiAgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsXG4gIHJlZnJlc2hUZXh0RGltZW5zaW9ucyxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQsIGlzVXNpbmdBZGFwdGl2ZVJhZGl1cyB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9URVhUX0FMSUdOLFxuICBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICBQUkVDRURJTkdfRUxFTUVOVF9LRVksXG4gIEZPTlRfRkFNSUxZLFxuICBST1VORE5FU1MsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7IGJ1bXBWZXJzaW9uIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0VXBkYXRlZFRpbWVzdGFtcCwgdXBkYXRlQWN0aXZlVG9vbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgYXJyYXlUb01hcCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5pbXBvcnQgeyBNYXJrT3B0aW9uYWwsIE11dGFibGUgfSBmcm9tIFwiLi4vdXRpbGl0eS10eXBlc1wiO1xuaW1wb3J0IHsgZGV0ZWN0TGluZUhlaWdodCwgZ2V0RGVmYXVsdExpbmVIZWlnaHQgfSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuXG50eXBlIFJlc3RvcmVkQXBwU3RhdGUgPSBPbWl0PFxuICBBcHBTdGF0ZSxcbiAgXCJvZmZzZXRUb3BcIiB8IFwib2Zmc2V0TGVmdFwiIHwgXCJ3aWR0aFwiIHwgXCJoZWlnaHRcIlxuPjtcblxuZXhwb3J0IGNvbnN0IEFsbG93ZWRFeGNhbGlkcmF3QWN0aXZlVG9vbHM6IFJlY29yZDxcbiAgQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdW1widHlwZVwiXSxcbiAgYm9vbGVhblxuPiA9IHtcbiAgc2VsZWN0aW9uOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICByZWN0YW5nbGU6IHRydWUsXG4gIGRpYW1vbmQ6IHRydWUsXG4gIGVsbGlwc2U6IHRydWUsXG4gIGxpbmU6IHRydWUsXG4gIGltYWdlOiB0cnVlLFxuICBhcnJvdzogdHJ1ZSxcbiAgZnJlZWRyYXc6IHRydWUsXG4gIGVyYXNlcjogZmFsc2UsXG4gIGN1c3RvbTogdHJ1ZSxcbiAgaGFuZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCB0eXBlIFJlc3RvcmVkRGF0YVN0YXRlID0ge1xuICBlbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgYXBwU3RhdGU6IFJlc3RvcmVkQXBwU3RhdGU7XG4gIGZpbGVzOiBCaW5hcnlGaWxlcztcbn07XG5cbmNvbnN0IGdldEZvbnRGYW1pbHlCeU5hbWUgPSAoZm9udEZhbWlseU5hbWU6IHN0cmluZyk6IEZvbnRGYW1pbHlWYWx1ZXMgPT4ge1xuICBpZiAoT2JqZWN0LmtleXMoRk9OVF9GQU1JTFkpLmluY2x1ZGVzKGZvbnRGYW1pbHlOYW1lKSkge1xuICAgIHJldHVybiBGT05UX0ZBTUlMWVtcbiAgICAgIGZvbnRGYW1pbHlOYW1lIGFzIGtleW9mIHR5cGVvZiBGT05UX0ZBTUlMWVxuICAgIF0gYXMgRm9udEZhbWlseVZhbHVlcztcbiAgfVxuICByZXR1cm4gREVGQVVMVF9GT05UX0ZBTUlMWTtcbn07XG5cbmNvbnN0IHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMgPSA8XG4gIFQgZXh0ZW5kcyBSZXF1aXJlZDxPbWl0PEV4Y2FsaWRyYXdFbGVtZW50LCBcImN1c3RvbURhdGFcIj4+ICYge1xuICAgIGN1c3RvbURhdGE/OiBFeGNhbGlkcmF3RWxlbWVudFtcImN1c3RvbURhdGFcIl07XG4gICAgLyoqIEBkZXByZWNhdGVkICovXG4gICAgYm91bmRFbGVtZW50SWRzPzogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXVtdO1xuICAgIC8qKiBAZGVwcmVjYXRlZCAqL1xuICAgIHN0cm9rZVNoYXJwbmVzcz86IFN0cm9rZVJvdW5kbmVzcztcbiAgICAvKiogbWV0YWRhdGEgdGhhdCBtYXkgYmUgcHJlc2VudCBpbiBlbGVtZW50cyBkdXJpbmcgY29sbGFib3JhdGlvbiAqL1xuICAgIFtQUkVDRURJTkdfRUxFTUVOVF9LRVldPzogc3RyaW5nO1xuICB9LFxuICBLIGV4dGVuZHMgUGljazxULCBrZXlvZiBPbWl0PFJlcXVpcmVkPFQ+LCBrZXlvZiBFeGNhbGlkcmF3RWxlbWVudD4+LFxuPihcbiAgZWxlbWVudDogVCxcbiAgZXh0cmE6IFBpY2s8XG4gICAgVCxcbiAgICAvLyBUaGlzIGV4dHJhIFBpY2s8VCwga2V5b2YgSz4gZW5zdXJlIG5vIGV4Y2VzcyBwcm9wZXJ0aWVzIGFyZSBwYXNzZWQuXG4gICAgLy8gQHRzLWlnbm9yZSBUUyBjb21wbGFpbnMgaGVyZSBidXQgdHlwZSBjaGVja3MgdGhlIGNhbGwgc2l0ZXMgZmluZS5cbiAgICBrZXlvZiBLXG4gID4gJlxuICAgIFBhcnRpYWw8UGljazxFeGNhbGlkcmF3RWxlbWVudCwgXCJ0eXBlXCIgfCBcInhcIiB8IFwieVwiPj4sXG4pOiBUID0+IHtcbiAgY29uc3QgYmFzZTogUGljazxULCBrZXlvZiBFeGNhbGlkcmF3RWxlbWVudD4gJiB7XG4gICAgW1BSRUNFRElOR19FTEVNRU5UX0tFWV0/OiBzdHJpbmc7XG4gIH0gPSB7XG4gICAgdHlwZTogZXh0cmEudHlwZSB8fCBlbGVtZW50LnR5cGUsXG4gICAgLy8gYWxsIGVsZW1lbnRzIG11c3QgaGF2ZSB2ZXJzaW9uID4gMCBzbyBnZXRTY2VuZVZlcnNpb24oKSB3aWxsIHBpY2sgdXBcbiAgICAvLyBuZXdseSBhZGRlZCBlbGVtZW50c1xuICAgIHZlcnNpb246IGVsZW1lbnQudmVyc2lvbiB8fCAxLFxuICAgIHZlcnNpb25Ob25jZTogZWxlbWVudC52ZXJzaW9uTm9uY2UgPz8gMCxcbiAgICBpc0RlbGV0ZWQ6IGVsZW1lbnQuaXNEZWxldGVkID8/IGZhbHNlLFxuICAgIGlkOiBlbGVtZW50LmlkIHx8IHJhbmRvbUlkKCksXG4gICAgZmlsbFN0eWxlOiBlbGVtZW50LmZpbGxTdHlsZSB8fCBcImhhY2h1cmVcIixcbiAgICBzdHJva2VXaWR0aDogZWxlbWVudC5zdHJva2VXaWR0aCB8fCAxLFxuICAgIHN0cm9rZVN0eWxlOiBlbGVtZW50LnN0cm9rZVN0eWxlID8/IFwic29saWRcIixcbiAgICByb3VnaG5lc3M6IGVsZW1lbnQucm91Z2huZXNzID8/IDEsXG4gICAgb3BhY2l0eTogZWxlbWVudC5vcGFjaXR5ID09IG51bGwgPyAxMDAgOiBlbGVtZW50Lm9wYWNpdHksXG4gICAgYW5nbGU6IGVsZW1lbnQuYW5nbGUgfHwgMCxcbiAgICB4OiBleHRyYS54ID8/IGVsZW1lbnQueCA/PyAwLFxuICAgIHk6IGV4dHJhLnkgPz8gZWxlbWVudC55ID8/IDAsXG4gICAgc3Ryb2tlQ29sb3I6IGVsZW1lbnQuc3Ryb2tlQ29sb3IgfHwgb2MuYmxhY2ssXG4gICAgYmFja2dyb3VuZENvbG9yOiBlbGVtZW50LmJhY2tncm91bmRDb2xvciB8fCBcInRyYW5zcGFyZW50XCIsXG4gICAgd2lkdGg6IGVsZW1lbnQud2lkdGggfHwgMCxcbiAgICBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IHx8IDAsXG4gICAgc2VlZDogZWxlbWVudC5zZWVkID8/IDEsXG4gICAgZ3JvdXBJZHM6IGVsZW1lbnQuZ3JvdXBJZHMgPz8gW10sXG4gICAgcm91bmRuZXNzOiBlbGVtZW50LnJvdW5kbmVzc1xuICAgICAgPyBlbGVtZW50LnJvdW5kbmVzc1xuICAgICAgOiBlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJyb3VuZFwiXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBmb3Igb2xkIGVsZW1lbnRzIHRoYXQgd291bGQgbm93IHVzZSBhZGFwdGl2ZSByYWRpdXMgYWxnbyxcbiAgICAgICAgICAvLyB1c2UgbGVnYWN5IGFsZ28gaW5zdGVhZFxuICAgICAgICAgIHR5cGU6IGlzVXNpbmdBZGFwdGl2ZVJhZGl1cyhlbGVtZW50LnR5cGUpXG4gICAgICAgICAgICA/IFJPVU5ETkVTUy5MRUdBQ1lcbiAgICAgICAgICAgIDogUk9VTkRORVNTLlBST1BPUlRJT05BTF9SQURJVVMsXG4gICAgICAgIH1cbiAgICAgIDogbnVsbCxcbiAgICBib3VuZEVsZW1lbnRzOiBlbGVtZW50LmJvdW5kRWxlbWVudElkc1xuICAgICAgPyBlbGVtZW50LmJvdW5kRWxlbWVudElkcy5tYXAoKGlkKSA9PiAoeyB0eXBlOiBcImFycm93XCIsIGlkIH0pKVxuICAgICAgOiBlbGVtZW50LmJvdW5kRWxlbWVudHMgPz8gW10sXG4gICAgdXBkYXRlZDogZWxlbWVudC51cGRhdGVkID8/IGdldFVwZGF0ZWRUaW1lc3RhbXAoKSxcbiAgICBsaW5rOiBlbGVtZW50LmxpbmsgPz8gbnVsbCxcbiAgICBsb2NrZWQ6IGVsZW1lbnQubG9ja2VkID8/IGZhbHNlLFxuICB9O1xuXG4gIGlmIChcImN1c3RvbURhdGFcIiBpbiBlbGVtZW50KSB7XG4gICAgYmFzZS5jdXN0b21EYXRhID0gZWxlbWVudC5jdXN0b21EYXRhO1xuICB9XG5cbiAgaWYgKFBSRUNFRElOR19FTEVNRU5UX0tFWSBpbiBlbGVtZW50KSB7XG4gICAgYmFzZVtQUkVDRURJTkdfRUxFTUVOVF9LRVldID0gZWxlbWVudFtQUkVDRURJTkdfRUxFTUVOVF9LRVldO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLmdldE5vcm1hbGl6ZWREaW1lbnNpb25zKGJhc2UpLFxuICAgIC4uLmV4dHJhLFxuICB9IGFzIHVua25vd24gYXMgVDtcbn07XG5cbmNvbnN0IHJlc3RvcmVFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNsdWRlPEV4Y2FsaWRyYXdFbGVtZW50LCBFeGNhbGlkcmF3U2VsZWN0aW9uRWxlbWVudD4sXG4gIHJlZnJlc2hEaW1lbnNpb25zID0gZmFsc2UsXG4pOiB0eXBlb2YgZWxlbWVudCB8IG51bGwgPT4ge1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBsZXQgZm9udFNpemUgPSBlbGVtZW50LmZvbnRTaXplO1xuICAgICAgbGV0IGZvbnRGYW1pbHkgPSBlbGVtZW50LmZvbnRGYW1pbHk7XG4gICAgICBpZiAoXCJmb250XCIgaW4gZWxlbWVudCkge1xuICAgICAgICBjb25zdCBbZm9udFB4LCBfZm9udEZhbWlseV06IFtzdHJpbmcsIHN0cmluZ10gPSAoXG4gICAgICAgICAgZWxlbWVudCBhcyBhbnlcbiAgICAgICAgKS5mb250LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9udFNpemUgPSBwYXJzZUZsb2F0KGZvbnRQeCk7XG4gICAgICAgIGZvbnRGYW1pbHkgPSBnZXRGb250RmFtaWx5QnlOYW1lKF9mb250RmFtaWx5KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHQgPSBlbGVtZW50LnRleHQgPz8gXCJcIjtcblxuICAgICAgZWxlbWVudCA9IHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge1xuICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdGV4dEFsaWduOiBlbGVtZW50LnRleHRBbGlnbiB8fCBERUZBVUxUX1RFWFRfQUxJR04sXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IGVsZW1lbnQudmVydGljYWxBbGlnbiB8fCBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgICBjb250YWluZXJJZDogZWxlbWVudC5jb250YWluZXJJZCA/PyBudWxsLFxuICAgICAgICBvcmlnaW5hbFRleHQ6IGVsZW1lbnQub3JpZ2luYWxUZXh0IHx8IHRleHQsXG4gICAgICAgIC8vIGxpbmUtaGVpZ2h0IG1pZ2h0IG5vdCBiZSBzcGVjaWZpZWQgZWl0aGVyIHdoZW4gY3JlYXRpbmcgZWxlbWVudHNcbiAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSwgb3Igd2hlbiBpbXBvcnRpbmcgb2xkIGRpYWdyYW1zLlxuICAgICAgICAvLyBGb3IgdGhlIGxhdHRlciB3ZSB3YW50IHRvIGRldGVjdCB0aGUgb3JpZ2luYWwgbGluZSBoZWlnaHQgd2hpY2hcbiAgICAgICAgLy8gd2lsbCBsaWtlbHkgZGlmZmVyIGZyb20gb3VyIHBlci1mb250IGZpeGVkIGxpbmUgaGVpZ2h0IHdlIG5vdyB1c2UsXG4gICAgICAgIC8vIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGxpbmVIZWlnaHQ6XG4gICAgICAgICAgZWxlbWVudC5saW5lSGVpZ2h0IHx8XG4gICAgICAgICAgKGVsZW1lbnQuaGVpZ2h0XG4gICAgICAgICAgICA/IC8vIGRldGVjdCBsaW5lLWhlaWdodCBmcm9tIGN1cnJlbnQgZWxlbWVudCBoZWlnaHQgYW5kIGZvbnQtc2l6ZVxuICAgICAgICAgICAgICBkZXRlY3RMaW5lSGVpZ2h0KGVsZW1lbnQpXG4gICAgICAgICAgICA6IC8vIG5vIGVsZW1lbnQgaGVpZ2h0IGxpa2VseSBtZWFucyBwcm9ncmFtbWF0aWMgdXNlLCBzbyBkZWZhdWx0XG4gICAgICAgICAgICAgIC8vIHRvIGEgZml4ZWQgbGluZSBoZWlnaHRcbiAgICAgICAgICAgICAgZ2V0RGVmYXVsdExpbmVIZWlnaHQoZWxlbWVudC5mb250RmFtaWx5KSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlZnJlc2hEaW1lbnNpb25zKSB7XG4gICAgICAgIGVsZW1lbnQgPSB7IC4uLmVsZW1lbnQsIC4uLnJlZnJlc2hUZXh0RGltZW5zaW9ucyhlbGVtZW50KSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBlbGVtZW50LnBvaW50cyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgICAgICBzaW11bGF0ZVByZXNzdXJlOiBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUsXG4gICAgICAgIHByZXNzdXJlczogZWxlbWVudC5wcmVzc3VyZXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7XG4gICAgICAgIHN0YXR1czogZWxlbWVudC5zdGF0dXMgfHwgXCJwZW5kaW5nXCIsXG4gICAgICAgIGZpbGVJZDogZWxlbWVudC5maWxlSWQsXG4gICAgICAgIHNjYWxlOiBlbGVtZW50LnNjYWxlIHx8IFsxLCAxXSxcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgLy8gQHRzLWlnbm9yZSBMRUdBQ1kgdHlwZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIGNhc2UgXCJkcmF3XCI6XG4gICAgY2FzZSBcImFycm93XCI6IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQgPSBudWxsLFxuICAgICAgICBlbmRBcnJvd2hlYWQgPSBlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIiA/IFwiYXJyb3dcIiA6IG51bGwsXG4gICAgICB9ID0gZWxlbWVudDtcblxuICAgICAgbGV0IHggPSBlbGVtZW50Lng7XG4gICAgICBsZXQgeSA9IGVsZW1lbnQueTtcbiAgICAgIGxldCBwb2ludHMgPSAvLyBtaWdyYXRlIG9sZCBhcnJvdyBtb2RlbCB0byBuZXcgb25lXG4gICAgICAgICFBcnJheS5pc0FycmF5KGVsZW1lbnQucG9pbnRzKSB8fCBlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFswLCAwXSxcbiAgICAgICAgICAgICAgW2VsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0XSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IGVsZW1lbnQucG9pbnRzO1xuXG4gICAgICBpZiAocG9pbnRzWzBdWzBdICE9PSAwIHx8IHBvaW50c1swXVsxXSAhPT0gMCkge1xuICAgICAgICAoeyBwb2ludHMsIHgsIHkgfSA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Tm9ybWFsaXplZFBvaW50cyhlbGVtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgdHlwZTpcbiAgICAgICAgICAoZWxlbWVudC50eXBlIGFzIEV4Y2FsaWRyYXdFbGVtZW50W1widHlwZVwiXSB8IFwiZHJhd1wiKSA9PT0gXCJkcmF3XCJcbiAgICAgICAgICAgID8gXCJsaW5lXCJcbiAgICAgICAgICAgIDogZWxlbWVudC50eXBlLFxuICAgICAgICBzdGFydEJpbmRpbmc6IGVsZW1lbnQuc3RhcnRCaW5kaW5nLFxuICAgICAgICBlbmRCaW5kaW5nOiBlbGVtZW50LmVuZEJpbmRpbmcsXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZ2VuZXJpYyBlbGVtZW50c1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge30pO1xuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG5cbiAgICAvLyBEb24ndCB1c2UgZGVmYXVsdCBjYXNlIHNvIGFzIHRvIGNhdGNoIGEgbWlzc2luZyBhbiBlbGVtZW50IHR5cGUgY2FzZS5cbiAgICAvLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gdGhyb3csIGJ1dCBpbnN0ZWFkIHJldHVybiB2b2lkIHNvIHdlIGZpbHRlclxuICAgIC8vIG91dCB0aGVzZSB1bnN1cHBvcnRlZCBlbGVtZW50cyBmcm9tIHRoZSByZXN0b3JlZCBhcnJheS5cbiAgfVxufTtcblxuLyoqXG4gKiBSZXBhaXJzIGNvbnRhaWVuciBlbGVtZW50J3MgYm91bmRFbGVtZW50cyBhcnJheSBieSByZW1vdmluZyBkdXBsaWNhdGVzIGFuZFxuICogZml4aW5nIGNvbnRhaW5lcklkIG9mIGJvdW5kIGVsZW1lbnRzIGlmIG5vdCBwcmVzZW50LiBBbHNvIHJlbW92ZXMgYW55XG4gKiBib3VuZCBlbGVtZW50cyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZWxlbWVudHMgYXJyYXkuXG4gKlxuICogTk9URSBtdXRhdGVzIGVsZW1lbnRzLlxuICovXG5jb25zdCByZXBhaXJDb250YWluZXJFbGVtZW50ID0gKFxuICBjb250YWluZXI6IE11dGFibGU8RXhjYWxpZHJhd0VsZW1lbnQ+LFxuICBlbGVtZW50c01hcDogTWFwPHN0cmluZywgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+LFxuKSA9PiB7XG4gIGlmIChjb250YWluZXIuYm91bmRFbGVtZW50cykge1xuICAgIC8vIGNvcHkgYmVjYXVzZSB3ZSdyZSBub3QgY2xvbmluZyBvbiByZXN0b3JlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBtdXRhdGUgdXBzdHJlYW1cbiAgICBjb25zdCBib3VuZEVsZW1lbnRzID0gY29udGFpbmVyLmJvdW5kRWxlbWVudHMuc2xpY2UoKTtcblxuICAgIC8vIGRlZHVwZSBiaW5kaW5ncyAmIGZpeCBib3VuZEVsZW1lbnQuY29udGFpbmVySWQgaWYgbm90IHNldCBhbHJlYWR5XG4gICAgY29uc3QgYm91bmRJZHMgPSBuZXcgU2V0PEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+KCk7XG4gICAgY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBib3VuZEVsZW1lbnRzLnJlZHVjZShcbiAgICAgIChcbiAgICAgICAgYWNjOiBNdXRhYmxlPE5vbk51bGxhYmxlPEV4Y2FsaWRyYXdFbGVtZW50W1wiYm91bmRFbGVtZW50c1wiXT4+LFxuICAgICAgICBiaW5kaW5nLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGVsZW1lbnRzTWFwLmdldChiaW5kaW5nLmlkKTtcbiAgICAgICAgaWYgKGJvdW5kRWxlbWVudCAmJiAhYm91bmRJZHMuaGFzKGJpbmRpbmcuaWQpKSB7XG4gICAgICAgICAgYm91bmRJZHMuYWRkKGJpbmRpbmcuaWQpO1xuXG4gICAgICAgICAgaWYgKGJvdW5kRWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWNjLnB1c2goYmluZGluZyk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc1RleHRFbGVtZW50KGJvdW5kRWxlbWVudCkgJiZcbiAgICAgICAgICAgIC8vIGJlaW5nIHNsaWdodGx5IGNvbnNlcnZhdGl2ZSBoZXJlLCBwcmVzZXJ2aW5nIGV4aXN0aW5nIGNvbnRhaW5lcklkXG4gICAgICAgICAgICAvLyBpZiBkZWZpbmVkLCBsZXN0IGJvdW5kRWxlbWVudHMgaXMgc3RhbGVcbiAgICAgICAgICAgICFib3VuZEVsZW1lbnQuY29udGFpbmVySWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIChib3VuZEVsZW1lbnQgYXMgTXV0YWJsZTxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+KS5jb250YWluZXJJZCA9XG4gICAgICAgICAgICAgIGNvbnRhaW5lci5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIFJlcGFpcnMgdGFyZ2V0IGJvdW5kIGVsZW1lbnQncyBjb250YWluZXIncyBib3VuZEVsZW1lbnRzIGFycmF5LFxuICogb3IgcmVtb3ZlcyBjb250YWllbnJJZCBpZiBjb250YWluZXIgZG9lcyBub3QgZXhpc3QuXG4gKlxuICogTk9URSBtdXRhdGVzIGVsZW1lbnRzLlxuICovXG5jb25zdCByZXBhaXJCb3VuZEVsZW1lbnQgPSAoXG4gIGJvdW5kRWxlbWVudDogTXV0YWJsZTxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+LFxuICBlbGVtZW50c01hcDogTWFwPHN0cmluZywgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+LFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGJvdW5kRWxlbWVudC5jb250YWluZXJJZFxuICAgID8gZWxlbWVudHNNYXAuZ2V0KGJvdW5kRWxlbWVudC5jb250YWluZXJJZClcbiAgICA6IG51bGw7XG5cbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICBib3VuZEVsZW1lbnQuY29udGFpbmVySWQgPSBudWxsO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChib3VuZEVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICAgIGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzICYmXG4gICAgIWNvbnRhaW5lci5ib3VuZEVsZW1lbnRzLmZpbmQoKGJpbmRpbmcpID0+IGJpbmRpbmcuaWQgPT09IGJvdW5kRWxlbWVudC5pZClcbiAgKSB7XG4gICAgLy8gY29weSBiZWNhdXNlIHdlJ3JlIG5vdCBjbG9uaW5nIG9uIHJlc3RvcmUsIGFuZCB3ZSBkb24ndCB3YW50IHRvIG11dGF0ZSB1cHN0cmVhbVxuICAgIGNvbnN0IGJvdW5kRWxlbWVudHMgPSAoXG4gICAgICBjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBbXSlcbiAgICApLnNsaWNlKCk7XG4gICAgYm91bmRFbGVtZW50cy5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIGlkOiBib3VuZEVsZW1lbnQuaWQgfSk7XG4gICAgY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBib3VuZEVsZW1lbnRzO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZUVsZW1lbnRzID0gKFxuICBlbGVtZW50czogSW1wb3J0ZWREYXRhU3RhdGVbXCJlbGVtZW50c1wiXSxcbiAgLyoqIE5PVEUgZG9lc24ndCBzZXJ2ZSBmb3IgcmVjb25jaWxpYXRpb24gKi9cbiAgbG9jYWxFbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiB7IHJlZnJlc2hEaW1lbnNpb25zPzogYm9vbGVhbjsgcmVwYWlyQmluZGluZ3M/OiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG4pOiBFeGNhbGlkcmF3RWxlbWVudFtdID0+IHtcbiAgY29uc3QgbG9jYWxFbGVtZW50c01hcCA9IGxvY2FsRWxlbWVudHMgPyBhcnJheVRvTWFwKGxvY2FsRWxlbWVudHMpIDogbnVsbDtcbiAgY29uc3QgcmVzdG9yZWRFbGVtZW50cyA9IChlbGVtZW50cyB8fCBbXSkucmVkdWNlKChlbGVtZW50cywgZWxlbWVudCkgPT4ge1xuICAgIC8vIGZpbHRlcmluZyBvdXQgc2VsZWN0aW9uLCB3aGljaCBpcyBsZWdhY3ksIG5vIGxvbmdlciBrZXB0IGluIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBjYXVzaW5nIGlzc3VlcyBpZiByZXRhaW5lZFxuICAgIGlmIChlbGVtZW50LnR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiYgIWlzSW52aXNpYmx5U21hbGxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBsZXQgbWlncmF0ZWRFbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwgPSByZXN0b3JlRWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgb3B0cz8ucmVmcmVzaERpbWVuc2lvbnMsXG4gICAgICApO1xuICAgICAgaWYgKG1pZ3JhdGVkRWxlbWVudCkge1xuICAgICAgICBjb25zdCBsb2NhbEVsZW1lbnQgPSBsb2NhbEVsZW1lbnRzTWFwPy5nZXQoZWxlbWVudC5pZCk7XG4gICAgICAgIGlmIChsb2NhbEVsZW1lbnQgJiYgbG9jYWxFbGVtZW50LnZlcnNpb24gPiBtaWdyYXRlZEVsZW1lbnQudmVyc2lvbikge1xuICAgICAgICAgIG1pZ3JhdGVkRWxlbWVudCA9IGJ1bXBWZXJzaW9uKG1pZ3JhdGVkRWxlbWVudCwgbG9jYWxFbGVtZW50LnZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2gobWlncmF0ZWRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LCBbXSBhcyBFeGNhbGlkcmF3RWxlbWVudFtdKTtcblxuICBpZiAoIW9wdHM/LnJlcGFpckJpbmRpbmdzKSB7XG4gICAgcmV0dXJuIHJlc3RvcmVkRWxlbWVudHM7XG4gIH1cblxuICAvLyByZXBhaXIgYmluZGluZy4gTXV0YXRlcyBlbGVtZW50cy5cbiAgY29uc3QgcmVzdG9yZWRFbGVtZW50c01hcCA9IGFycmF5VG9NYXAocmVzdG9yZWRFbGVtZW50cyk7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiByZXN0b3JlZEVsZW1lbnRzKSB7XG4gICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgcmVwYWlyQm91bmRFbGVtZW50KGVsZW1lbnQsIHJlc3RvcmVkRWxlbWVudHNNYXApO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ib3VuZEVsZW1lbnRzKSB7XG4gICAgICByZXBhaXJDb250YWluZXJFbGVtZW50KGVsZW1lbnQsIHJlc3RvcmVkRWxlbWVudHNNYXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN0b3JlZEVsZW1lbnRzO1xufTtcblxuY29uc3QgY29hbGVzY2VBcHBTdGF0ZVZhbHVlID0gPFxuICBUIGV4dGVuZHMga2V5b2YgUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGVmYXVsdEFwcFN0YXRlPixcbj4oXG4gIGtleTogVCxcbiAgYXBwU3RhdGU6IEV4Y2x1ZGU8SW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXSwgbnVsbCB8IHVuZGVmaW5lZD4sXG4gIGRlZmF1bHRBcHBTdGF0ZTogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGVmYXVsdEFwcFN0YXRlPixcbikgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGFwcFN0YXRlW2tleV07XG4gIC8vIE5PVEUgdGhlIHZhbHVlISBhc3NlcnRpb24gaXMgbmVlZGVkIGluIFRTIDQuNS41IChmaXhlZCBpbiBuZXdlciB2ZXJzaW9ucylcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSEgOiBkZWZhdWx0QXBwU3RhdGVba2V5XTtcbn07XG5cbmNvbnN0IExlZ2FjeUFwcFN0YXRlTWlncmF0aW9uczoge1xuICBbSyBpbiBrZXlvZiBMZWdhY3lBcHBTdGF0ZV06IChcbiAgICBJbXBvcnRlZERhdGFTdGF0ZTogRXhjbHVkZTxJbXBvcnRlZERhdGFTdGF0ZVtcImFwcFN0YXRlXCJdLCBudWxsIHwgdW5kZWZpbmVkPixcbiAgICBkZWZhdWx0QXBwU3RhdGU6IFJldHVyblR5cGU8dHlwZW9mIGdldERlZmF1bHRBcHBTdGF0ZT4sXG4gICkgPT4gW0xlZ2FjeUFwcFN0YXRlW0tdWzFdLCBBcHBTdGF0ZVtMZWdhY3lBcHBTdGF0ZVtLXVsxXV1dO1xufSA9IHtcbiAgaXNMaWJyYXJ5T3BlbjogKGFwcFN0YXRlLCBkZWZhdWx0QXBwU3RhdGUpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJvcGVuU2lkZWJhclwiLFxuICAgICAgXCJpc0xpYnJhcnlPcGVuXCIgaW4gYXBwU3RhdGVcbiAgICAgICAgPyBhcHBTdGF0ZS5pc0xpYnJhcnlPcGVuXG4gICAgICAgICAgPyBcImxpYnJhcnlcIlxuICAgICAgICAgIDogbnVsbFxuICAgICAgICA6IGNvYWxlc2NlQXBwU3RhdGVWYWx1ZShcIm9wZW5TaWRlYmFyXCIsIGFwcFN0YXRlLCBkZWZhdWx0QXBwU3RhdGUpLFxuICAgIF07XG4gIH0sXG4gIGlzTGlicmFyeU1lbnVEb2NrZWQ6IChhcHBTdGF0ZSwgZGVmYXVsdEFwcFN0YXRlKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiaXNTaWRlYmFyRG9ja2VkXCIsXG4gICAgICBhcHBTdGF0ZS5pc0xpYnJhcnlNZW51RG9ja2VkID8/XG4gICAgICAgIGNvYWxlc2NlQXBwU3RhdGVWYWx1ZShcImlzU2lkZWJhckRvY2tlZFwiLCBhcHBTdGF0ZSwgZGVmYXVsdEFwcFN0YXRlKSxcbiAgICBdO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmVBcHBTdGF0ZSA9IChcbiAgYXBwU3RhdGU6IEltcG9ydGVkRGF0YVN0YXRlW1wiYXBwU3RhdGVcIl0sXG4gIGxvY2FsQXBwU3RhdGU6IFBhcnRpYWw8QXBwU3RhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFJlc3RvcmVkQXBwU3RhdGUgPT4ge1xuICBhcHBTdGF0ZSA9IGFwcFN0YXRlIHx8IHt9O1xuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgY29uc3QgbmV4dEFwcFN0YXRlID0ge30gYXMgdHlwZW9mIGRlZmF1bHRBcHBTdGF0ZTtcblxuICAvLyBmaXJzdCwgbWlncmF0ZSBhbGwgbGVnYWN5IEFwcFN0YXRlIHByb3BlcnRpZXMgdG8gbmV3IG9uZXMuIFdlIGRvIGl0XG4gIC8vIGluIG9uZSBnbyBiZWZvcmUgbWlncmF0ZSB0aGUgcmVzdCBvZiB0aGUgcHJvcGVydGllcyBpbiBjYXNlIHRoZSBuZXcgb25lc1xuICAvLyBkZXBlbmQgb24gY2hlY2tpbmcgYW55IG90aGVyIGtleSAoaS5lLiB0aGV5IGFyZSBjb3VwbGVkKVxuICBmb3IgKGNvbnN0IGxlZ2FjeUtleSBvZiBPYmplY3Qua2V5cyhcbiAgICBMZWdhY3lBcHBTdGF0ZU1pZ3JhdGlvbnMsXG4gICkgYXMgKGtleW9mIHR5cGVvZiBMZWdhY3lBcHBTdGF0ZU1pZ3JhdGlvbnMpW10pIHtcbiAgICBpZiAobGVnYWN5S2V5IGluIGFwcFN0YXRlKSB7XG4gICAgICBjb25zdCBbbmV4dEtleSwgbmV4dFZhbHVlXSA9IExlZ2FjeUFwcFN0YXRlTWlncmF0aW9uc1tsZWdhY3lLZXldKFxuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgZGVmYXVsdEFwcFN0YXRlLFxuICAgICAgKTtcbiAgICAgIChuZXh0QXBwU3RhdGUgYXMgYW55KVtuZXh0S2V5XSA9IG5leHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIGRlZmF1bHRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVmYXVsdEFwcFN0YXRlKSBhcyBbXG4gICAga2V5b2YgdHlwZW9mIGRlZmF1bHRBcHBTdGF0ZSxcbiAgICBhbnksXG4gIF1bXSkge1xuICAgIC8vIGlmIEFwcFN0YXRlIGNvbnRhaW5zIGEgbGVnYWN5IGtleSwgcHJlZmVyIHRoYXQgb25lIGFuZCBtaWdyYXRlIGl0c1xuICAgIC8vIHZhbHVlIHRvIHRoZSBuZXcgb25lXG4gICAgY29uc3Qgc3VwcGxpZWRWYWx1ZSA9IGFwcFN0YXRlW2tleV07XG5cbiAgICBjb25zdCBsb2NhbFZhbHVlID0gbG9jYWxBcHBTdGF0ZSA/IGxvY2FsQXBwU3RhdGVba2V5XSA6IHVuZGVmaW5lZDtcbiAgICAobmV4dEFwcFN0YXRlIGFzIGFueSlba2V5XSA9XG4gICAgICBzdXBwbGllZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzdXBwbGllZFZhbHVlXG4gICAgICAgIDogbG9jYWxWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbG9jYWxWYWx1ZVxuICAgICAgICA6IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ubmV4dEFwcFN0YXRlLFxuICAgIGN1cnNvckJ1dHRvbjogbG9jYWxBcHBTdGF0ZT8uY3Vyc29yQnV0dG9uIHx8IFwidXBcIixcbiAgICAvLyByZXNldCBvbiBmcmVzaCByZXN0b3JlIHNvIGFzIHRvIGhpZGUgdGhlIFVJIGJ1dHRvbiBpZiBwZW5Nb2RlIG5vdCBhY3RpdmVcbiAgICBwZW5EZXRlY3RlZDpcbiAgICAgIGxvY2FsQXBwU3RhdGU/LnBlbkRldGVjdGVkID8/XG4gICAgICAoYXBwU3RhdGUucGVuTW9kZSA/IGFwcFN0YXRlLnBlbkRldGVjdGVkID8/IGZhbHNlIDogZmFsc2UpLFxuICAgIGFjdGl2ZVRvb2w6IHtcbiAgICAgIC4uLnVwZGF0ZUFjdGl2ZVRvb2woXG4gICAgICAgIGRlZmF1bHRBcHBTdGF0ZSxcbiAgICAgICAgbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSAmJlxuICAgICAgICAgIEFsbG93ZWRFeGNhbGlkcmF3QWN0aXZlVG9vbHNbbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZV1cbiAgICAgICAgICA/IG5leHRBcHBTdGF0ZS5hY3RpdmVUb29sXG4gICAgICAgICAgOiB7IHR5cGU6IFwic2VsZWN0aW9uXCIgfSxcbiAgICAgICksXG4gICAgICBsYXN0QWN0aXZlVG9vbDogbnVsbCxcbiAgICAgIGxvY2tlZDogbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wubG9ja2VkID8/IGZhbHNlLFxuICAgIH0sXG4gICAgLy8gTWlncmF0ZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9uIHdoZXJlIGFwcFN0YXRlLnpvb20gd2FzIGEgbnVtYmVyXG4gICAgem9vbTpcbiAgICAgIHR5cGVvZiBhcHBTdGF0ZS56b29tID09PSBcIm51bWJlclwiXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdmFsdWU6IGFwcFN0YXRlLnpvb20gYXMgTm9ybWFsaXplZFpvb21WYWx1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogYXBwU3RhdGUuem9vbT8udmFsdWVcbiAgICAgICAgPyBhcHBTdGF0ZS56b29tXG4gICAgICAgIDogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgLy8gd2hlbiBzaWRlYmFyIGRvY2tlZCBhbmQgdXNlciBsZWZ0IGl0IG9wZW4gaW4gbGFzdCBzZXNzaW9uLFxuICAgIC8vIGtlZXAgaXQgb3Blbi4gSWYgbm90IGRvY2tlZCwga2VlcCBpdCBjbG9zZWQgaXJyZXNwZWN0aXZlIG9mIGxhc3Qgc3RhdGUuXG4gICAgb3BlblNpZGViYXI6XG4gICAgICBuZXh0QXBwU3RhdGUub3BlblNpZGViYXIgPT09IFwibGlicmFyeVwiXG4gICAgICAgID8gbmV4dEFwcFN0YXRlLmlzU2lkZWJhckRvY2tlZFxuICAgICAgICAgID8gXCJsaWJyYXJ5XCJcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgOiBuZXh0QXBwU3RhdGUub3BlblNpZGViYXIsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZSA9IChcbiAgZGF0YTogUGljazxJbXBvcnRlZERhdGFTdGF0ZSwgXCJhcHBTdGF0ZVwiIHwgXCJlbGVtZW50c1wiIHwgXCJmaWxlc1wiPiB8IG51bGwsXG4gIC8qKlxuICAgKiBMb2NhbCBBcHBTdGF0ZSAoYHRoaXMuc3RhdGVgIG9yIGluaXRpYWwgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2UpIHNvIHRoYXQgd2VcbiAgICogZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIHN0YXRlIHdpdGggZGVmYXVsdCB2YWx1ZXMgKHdoZW4gdmFsdWVzIG5vdFxuICAgKiBleHBsaWNpdGx5IHNwZWNpZmllZCkuXG4gICAqIFN1cHBseSBgbnVsbGAgaWYgeW91IGNhbid0IGdldCBhY2Nlc3MgdG8gaXQuXG4gICAqL1xuICBsb2NhbEFwcFN0YXRlOiBQYXJ0aWFsPEFwcFN0YXRlPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxvY2FsRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBlbGVtZW50c0NvbmZpZz86IHsgcmVmcmVzaERpbWVuc2lvbnM/OiBib29sZWFuOyByZXBhaXJCaW5kaW5ncz86IGJvb2xlYW4gfSxcbik6IFJlc3RvcmVkRGF0YVN0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50czogcmVzdG9yZUVsZW1lbnRzKGRhdGE/LmVsZW1lbnRzLCBsb2NhbEVsZW1lbnRzLCBlbGVtZW50c0NvbmZpZyksXG4gICAgYXBwU3RhdGU6IHJlc3RvcmVBcHBTdGF0ZShkYXRhPy5hcHBTdGF0ZSwgbG9jYWxBcHBTdGF0ZSB8fCBudWxsKSxcbiAgICBmaWxlczogZGF0YT8uZmlsZXMgfHwge30sXG4gIH07XG59O1xuXG5jb25zdCByZXN0b3JlTGlicmFyeUl0ZW0gPSAobGlicmFyeUl0ZW06IExpYnJhcnlJdGVtKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gcmVzdG9yZUVsZW1lbnRzKFxuICAgIGdldE5vbkRlbGV0ZWRFbGVtZW50cyhsaWJyYXJ5SXRlbS5lbGVtZW50cyksXG4gICAgbnVsbCxcbiAgKTtcbiAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA/IHsgLi4ubGlicmFyeUl0ZW0sIGVsZW1lbnRzIH0gOiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmVMaWJyYXJ5SXRlbXMgPSAoXG4gIGxpYnJhcnlJdGVtczogSW1wb3J0ZWREYXRhU3RhdGVbXCJsaWJyYXJ5SXRlbXNcIl0gPSBbXSxcbiAgZGVmYXVsdFN0YXR1czogTGlicmFyeUl0ZW1bXCJzdGF0dXNcIl0sXG4pID0+IHtcbiAgY29uc3QgcmVzdG9yZWRJdGVtczogTGlicmFyeUl0ZW1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlicmFyeUl0ZW1zKSB7XG4gICAgLy8gbWlncmF0ZSBvbGRlciBsaWJyYXJpZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgY29uc3QgcmVzdG9yZWRJdGVtID0gcmVzdG9yZUxpYnJhcnlJdGVtKHtcbiAgICAgICAgc3RhdHVzOiBkZWZhdWx0U3RhdHVzLFxuICAgICAgICBlbGVtZW50czogaXRlbSxcbiAgICAgICAgaWQ6IHJhbmRvbUlkKCksXG4gICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN0b3JlZEl0ZW0pIHtcbiAgICAgICAgcmVzdG9yZWRJdGVtcy5wdXNoKHJlc3RvcmVkSXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IF9pdGVtID0gaXRlbSBhcyBNYXJrT3B0aW9uYWw8XG4gICAgICAgIExpYnJhcnlJdGVtLFxuICAgICAgICBcImlkXCIgfCBcInN0YXR1c1wiIHwgXCJjcmVhdGVkXCJcbiAgICAgID47XG4gICAgICBjb25zdCByZXN0b3JlZEl0ZW0gPSByZXN0b3JlTGlicmFyeUl0ZW0oe1xuICAgICAgICAuLi5faXRlbSxcbiAgICAgICAgaWQ6IF9pdGVtLmlkIHx8IHJhbmRvbUlkKCksXG4gICAgICAgIHN0YXR1czogX2l0ZW0uc3RhdHVzIHx8IGRlZmF1bHRTdGF0dXMsXG4gICAgICAgIGNyZWF0ZWQ6IF9pdGVtLmNyZWF0ZWQgfHwgRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3RvcmVkSXRlbSkge1xuICAgICAgICByZXN0b3JlZEl0ZW1zLnB1c2gocmVzdG9yZWRJdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3RvcmVkSXRlbXM7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../data/restore.ts\n");
|
|
3145
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AllowedExcalidrawActiveTools\": () => (/* binding */ AllowedExcalidrawActiveTools),\n/* harmony export */ \"restore\": () => (/* binding */ restore),\n/* harmony export */ \"restoreAppState\": () => (/* binding */ restoreAppState),\n/* harmony export */ \"restoreElements\": () => (/* binding */ restoreElements),\n/* harmony export */ \"restoreLibraryItems\": () => (/* binding */ restoreLibraryItems)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n\n\n\n\n\n\n\n\n\n\n\nconst AllowedExcalidrawActiveTools = {\n selection: true,\n text: true,\n rectangle: true,\n diamond: true,\n ellipse: true,\n line: true,\n image: true,\n arrow: true,\n freedraw: true,\n eraser: false,\n custom: true,\n hand: true,\n};\nconst getFontFamilyByName = (fontFamilyName) => {\n if (Object.keys(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY).includes(fontFamilyName)) {\n return _constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY[fontFamilyName];\n }\n return _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_FONT_FAMILY;\n};\nconst restoreElementWithProperties = (element, extra) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n const base = {\n type: extra.type || element.type,\n // all elements must have version > 0 so getSceneVersion() will pick up\n // newly added elements\n version: element.version || 1,\n versionNonce: (_a = element.versionNonce) !== null && _a !== void 0 ? _a : 0,\n isDeleted: (_b = element.isDeleted) !== null && _b !== void 0 ? _b : false,\n id: element.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\n fillStyle: element.fillStyle || \"hachure\",\n strokeWidth: element.strokeWidth || 1,\n strokeStyle: (_c = element.strokeStyle) !== null && _c !== void 0 ? _c : \"solid\",\n roughness: (_d = element.roughness) !== null && _d !== void 0 ? _d : 1,\n opacity: element.opacity == null ? 100 : element.opacity,\n angle: element.angle || 0,\n x: (_f = (_e = extra.x) !== null && _e !== void 0 ? _e : element.x) !== null && _f !== void 0 ? _f : 0,\n y: (_h = (_g = extra.y) !== null && _g !== void 0 ? _g : element.y) !== null && _h !== void 0 ? _h : 0,\n strokeColor: element.strokeColor || open_color__WEBPACK_IMPORTED_MODULE_8__.black,\n backgroundColor: element.backgroundColor || \"transparent\",\n width: element.width || 0,\n height: element.height || 0,\n seed: (_j = element.seed) !== null && _j !== void 0 ? _j : 1,\n groupIds: (_k = element.groupIds) !== null && _k !== void 0 ? _k : [],\n roundness: element.roundness\n ? element.roundness\n : element.strokeSharpness === \"round\"\n ? {\n // for old elements that would now use adaptive radius algo,\n // use legacy algo instead\n type: (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isUsingAdaptiveRadius)(element.type)\n ? _constants__WEBPACK_IMPORTED_MODULE_3__.ROUNDNESS.LEGACY\n : _constants__WEBPACK_IMPORTED_MODULE_3__.ROUNDNESS.PROPORTIONAL_RADIUS,\n }\n : null,\n boundElements: element.boundElementIds\n ? element.boundElementIds.map((id) => ({ type: \"arrow\", id }))\n : (_l = element.boundElements) !== null && _l !== void 0 ? _l : [],\n updated: (_m = element.updated) !== null && _m !== void 0 ? _m : (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getUpdatedTimestamp)(),\n link: (_o = element.link) !== null && _o !== void 0 ? _o : null,\n locked: (_p = element.locked) !== null && _p !== void 0 ? _p : false,\n };\n if (\"customData\" in element) {\n base.customData = element.customData;\n }\n if (_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY in element) {\n base[_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY] = element[_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY];\n }\n return Object.assign(Object.assign(Object.assign({}, base), (0,_element__WEBPACK_IMPORTED_MODULE_0__.getNormalizedDimensions)(base)), extra);\n};\nconst restoreElement = (element, refreshDimensions = false) => {\n var _a, _b;\n switch (element.type) {\n case \"text\":\n let fontSize = element.fontSize;\n let fontFamily = element.fontFamily;\n if (\"font\" in element) {\n const [fontPx, _fontFamily] = element.font.split(\" \");\n fontSize = parseFloat(fontPx);\n fontFamily = getFontFamilyByName(_fontFamily);\n }\n const text = (_a = element.text) !== null && _a !== void 0 ? _a : \"\";\n // line-height might not be specified either when creating elements\n // programmatically, or when importing old diagrams.\n // For the latter we want to detect the original line height which\n // will likely differ from our per-font fixed line height we now use,\n // to maintain backward compatibility.\n const lineHeight = element.lineHeight ||\n (element.height\n ? // detect line-height from current element height and font-size\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_9__.detectLineHeight)(element)\n : // no element height likely means programmatic use, so default\n // to a fixed line height\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_9__.getDefaultLineHeight)(element.fontFamily));\n const { baseline } = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_9__.getDOMMetrics)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)(element), lineHeight);\n element = restoreElementWithProperties(element, {\n fontSize,\n fontFamily,\n text,\n textAlign: element.textAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_TEXT_ALIGN,\n verticalAlign: element.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERTICAL_ALIGN,\n containerId: (_b = element.containerId) !== null && _b !== void 0 ? _b : null,\n originalText: element.originalText || text,\n lineHeight,\n baseline,\n });\n if (refreshDimensions) {\n element = Object.assign(Object.assign({}, element), (0,_element__WEBPACK_IMPORTED_MODULE_0__.refreshTextDimensions)(element));\n }\n return element;\n case \"freedraw\": {\n return restoreElementWithProperties(element, {\n points: element.points,\n lastCommittedPoint: null,\n simulatePressure: element.simulatePressure,\n pressures: element.pressures,\n });\n }\n case \"image\":\n return restoreElementWithProperties(element, {\n status: element.status || \"pending\",\n fileId: element.fileId,\n scale: element.scale || [1, 1],\n });\n case \"line\":\n // @ts-ignore LEGACY type\n // eslint-disable-next-line no-fallthrough\n case \"draw\":\n case \"arrow\": {\n const { startArrowhead = null, endArrowhead = element.type === \"arrow\" ? \"arrow\" : null, } = element;\n let x = element.x;\n let y = element.y;\n let points = // migrate old arrow model to new one\n !Array.isArray(element.points) || element.points.length < 2\n ? [\n [0, 0],\n [element.width, element.height],\n ]\n : element.points;\n if (points[0][0] !== 0 || points[0][1] !== 0) {\n ({ points, x, y } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__.LinearElementEditor.getNormalizedPoints(element));\n }\n return restoreElementWithProperties(element, {\n type: element.type === \"draw\"\n ? \"line\"\n : element.type,\n startBinding: element.startBinding,\n endBinding: element.endBinding,\n lastCommittedPoint: null,\n startArrowhead,\n endArrowhead,\n points,\n x,\n y,\n });\n }\n // generic elements\n case \"ellipse\":\n return restoreElementWithProperties(element, {});\n case \"rectangle\":\n return restoreElementWithProperties(element, {});\n case \"diamond\":\n return restoreElementWithProperties(element, {});\n // Don't use default case so as to catch a missing an element type case.\n // We also don't want to throw, but instead return void so we filter\n // out these unsupported elements from the restored array.\n }\n};\n/**\n * Repairs contaienr element's boundElements array by removing duplicates and\n * fixing containerId of bound elements if not present. Also removes any\n * bound elements that do not exist in the elements array.\n *\n * NOTE mutates elements.\n */\nconst repairContainerElement = (container, elementsMap) => {\n if (container.boundElements) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = container.boundElements.slice();\n // dedupe bindings & fix boundElement.containerId if not set already\n const boundIds = new Set();\n container.boundElements = boundElements.reduce((acc, binding) => {\n const boundElement = elementsMap.get(binding.id);\n if (boundElement && !boundIds.has(binding.id)) {\n boundIds.add(binding.id);\n if (boundElement.isDeleted) {\n return acc;\n }\n acc.push(binding);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(boundElement) &&\n // being slightly conservative here, preserving existing containerId\n // if defined, lest boundElements is stale\n !boundElement.containerId) {\n boundElement.containerId =\n container.id;\n }\n }\n return acc;\n }, []);\n }\n};\n/**\n * Repairs target bound element's container's boundElements array,\n * or removes contaienrId if container does not exist.\n *\n * NOTE mutates elements.\n */\nconst repairBoundElement = (boundElement, elementsMap) => {\n const container = boundElement.containerId\n ? elementsMap.get(boundElement.containerId)\n : null;\n if (!container) {\n boundElement.containerId = null;\n return;\n }\n if (boundElement.isDeleted) {\n return;\n }\n if (container.boundElements &&\n !container.boundElements.find((binding) => binding.id === boundElement.id)) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = (container.boundElements || (container.boundElements = [])).slice();\n boundElements.push({ type: \"text\", id: boundElement.id });\n container.boundElements = boundElements;\n }\n};\nconst restoreElements = (elements, \n/** NOTE doesn't serve for reconciliation */\nlocalElements, opts) => {\n const localElementsMap = localElements ? (0,_utils__WEBPACK_IMPORTED_MODULE_7__.arrayToMap)(localElements) : null;\n const restoredElements = (elements || []).reduce((elements, element) => {\n // filtering out selection, which is legacy, no longer kept in elements,\n // and causing issues if retained\n if (element.type !== \"selection\" && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isInvisiblySmallElement)(element)) {\n let migratedElement = restoreElement(element, opts === null || opts === void 0 ? void 0 : opts.refreshDimensions);\n if (migratedElement) {\n const localElement = localElementsMap === null || localElementsMap === void 0 ? void 0 : localElementsMap.get(element.id);\n if (localElement && localElement.version > migratedElement.version) {\n migratedElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_6__.bumpVersion)(migratedElement, localElement.version);\n }\n elements.push(migratedElement);\n }\n }\n return elements;\n }, []);\n if (!(opts === null || opts === void 0 ? void 0 : opts.repairBindings)) {\n return restoredElements;\n }\n // repair binding. Mutates elements.\n const restoredElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_7__.arrayToMap)(restoredElements);\n for (const element of restoredElements) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(element) && element.containerId) {\n repairBoundElement(element, restoredElementsMap);\n }\n else if (element.boundElements) {\n repairContainerElement(element, restoredElementsMap);\n }\n }\n return restoredElements;\n};\nconst coalesceAppStateValue = (key, appState, defaultAppState) => {\n const value = appState[key];\n // NOTE the value! assertion is needed in TS 4.5.5 (fixed in newer versions)\n return value !== undefined ? value : defaultAppState[key];\n};\nconst LegacyAppStateMigrations = {\n isLibraryOpen: (appState, defaultAppState) => {\n return [\n \"openSidebar\",\n \"isLibraryOpen\" in appState\n ? appState.isLibraryOpen\n ? \"library\"\n : null\n : coalesceAppStateValue(\"openSidebar\", appState, defaultAppState),\n ];\n },\n isLibraryMenuDocked: (appState, defaultAppState) => {\n var _a;\n return [\n \"isSidebarDocked\",\n (_a = appState.isLibraryMenuDocked) !== null && _a !== void 0 ? _a : coalesceAppStateValue(\"isSidebarDocked\", appState, defaultAppState),\n ];\n },\n};\nconst restoreAppState = (appState, localAppState) => {\n var _a, _b, _c, _d;\n appState = appState || {};\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_4__.getDefaultAppState)();\n const nextAppState = {};\n // first, migrate all legacy AppState properties to new ones. We do it\n // in one go before migrate the rest of the properties in case the new ones\n // depend on checking any other key (i.e. they are coupled)\n for (const legacyKey of Object.keys(LegacyAppStateMigrations)) {\n if (legacyKey in appState) {\n const [nextKey, nextValue] = LegacyAppStateMigrations[legacyKey](appState, defaultAppState);\n nextAppState[nextKey] = nextValue;\n }\n }\n for (const [key, defaultValue] of Object.entries(defaultAppState)) {\n // if AppState contains a legacy key, prefer that one and migrate its\n // value to the new one\n const suppliedValue = appState[key];\n const localValue = localAppState ? localAppState[key] : undefined;\n nextAppState[key] =\n suppliedValue !== undefined\n ? suppliedValue\n : localValue !== undefined\n ? localValue\n : defaultValue;\n }\n return Object.assign(Object.assign({}, nextAppState), { cursorButton: (localAppState === null || localAppState === void 0 ? void 0 : localAppState.cursorButton) || \"up\", \n // reset on fresh restore so as to hide the UI button if penMode not active\n penDetected: (_a = localAppState === null || localAppState === void 0 ? void 0 : localAppState.penDetected) !== null && _a !== void 0 ? _a : (appState.penMode ? (_b = appState.penDetected) !== null && _b !== void 0 ? _b : false : false), activeTool: Object.assign(Object.assign({}, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.updateActiveTool)(defaultAppState, nextAppState.activeTool.type &&\n AllowedExcalidrawActiveTools[nextAppState.activeTool.type]\n ? nextAppState.activeTool\n : { type: \"selection\" })), { lastActiveTool: null, locked: (_c = nextAppState.activeTool.locked) !== null && _c !== void 0 ? _c : false }), \n // Migrates from previous version where appState.zoom was a number\n zoom: typeof appState.zoom === \"number\"\n ? {\n value: appState.zoom,\n }\n : ((_d = appState.zoom) === null || _d === void 0 ? void 0 : _d.value)\n ? appState.zoom\n : defaultAppState.zoom, \n // when sidebar docked and user left it open in last session,\n // keep it open. If not docked, keep it closed irrespective of last state.\n openSidebar: nextAppState.openSidebar === \"library\"\n ? nextAppState.isSidebarDocked\n ? \"library\"\n : null\n : nextAppState.openSidebar });\n};\nconst restore = (data, \n/**\n * Local AppState (`this.state` or initial state from localStorage) so that we\n * don't overwrite local state with default values (when values not\n * explicitly specified).\n * Supply `null` if you can't get access to it.\n */\nlocalAppState, localElements, elementsConfig) => {\n return {\n elements: restoreElements(data === null || data === void 0 ? void 0 : data.elements, localElements, elementsConfig),\n appState: restoreAppState(data === null || data === void 0 ? void 0 : data.appState, localAppState || null),\n files: (data === null || data === void 0 ? void 0 : data.files) || {},\n };\n};\nconst restoreLibraryItem = (libraryItem) => {\n const elements = restoreElements((0,_element__WEBPACK_IMPORTED_MODULE_0__.getNonDeletedElements)(libraryItem.elements), null);\n return elements.length ? Object.assign(Object.assign({}, libraryItem), { elements }) : null;\n};\nconst restoreLibraryItems = (libraryItems = [], defaultStatus) => {\n const restoredItems = [];\n for (const item of libraryItems) {\n // migrate older libraries\n if (Array.isArray(item)) {\n const restoredItem = restoreLibraryItem({\n status: defaultStatus,\n elements: item,\n id: (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\n created: Date.now(),\n });\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n else {\n const _item = item;\n const restoredItem = restoreLibraryItem(Object.assign(Object.assign({}, _item), { id: _item.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(), status: _item.status || defaultStatus, created: _item.created || Date.now() }));\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n }\n return restoredItems;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBRSxJQUFJLGlEQUFRLEVBQUUsRUFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksYUFBYSxFQUNyQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQ3BDLENBQUM7WUFDSCxJQUFJLFlBQVksRUFBRTtnQkFDaEIsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQztTQUNGO0tBQ0Y7SUFDRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZGF0YS9yZXN0b3JlLnRzPzg3MjAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdTZWxlY3Rpb25FbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIFN0cm9rZVJvdW5kbmVzcyxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIEFwcFN0YXRlLFxuICBCaW5hcnlGaWxlcyxcbiAgTGlicmFyeUl0ZW0sXG4gIE5vcm1hbGl6ZWRab29tVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSW1wb3J0ZWREYXRhU3RhdGUsIExlZ2FjeUFwcFN0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldE5vbkRlbGV0ZWRFbGVtZW50cyxcbiAgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMsXG4gIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LFxuICByZWZyZXNoVGV4dERpbWVuc2lvbnMsXG59IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBpc1RleHRFbGVtZW50LCBpc1VzaW5nQWRhcHRpdmVSYWRpdXMgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyByYW5kb21JZCB9IGZyb20gXCIuLi9yYW5kb21cIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRk9OVF9GQU1JTFksXG4gIERFRkFVTFRfVEVYVF9BTElHTixcbiAgREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgUFJFQ0VESU5HX0VMRU1FTlRfS0VZLFxuICBGT05UX0ZBTUlMWSxcbiAgUk9VTkRORVNTLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBidW1wVmVyc2lvbiB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldEZvbnRTdHJpbmcsIGdldFVwZGF0ZWRUaW1lc3RhbXAsIHVwZGF0ZUFjdGl2ZVRvb2wgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGFycmF5VG9NYXAgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBvYyBmcm9tIFwib3Blbi1jb2xvclwiO1xuaW1wb3J0IHsgTWFya09wdGlvbmFsLCBNdXRhYmxlIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRldGVjdExpbmVIZWlnaHQsXG4gIGdldERlZmF1bHRMaW5lSGVpZ2h0LFxuICBnZXRET01NZXRyaWNzLFxufSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuXG50eXBlIFJlc3RvcmVkQXBwU3RhdGUgPSBPbWl0PFxuICBBcHBTdGF0ZSxcbiAgXCJvZmZzZXRUb3BcIiB8IFwib2Zmc2V0TGVmdFwiIHwgXCJ3aWR0aFwiIHwgXCJoZWlnaHRcIlxuPjtcblxuZXhwb3J0IGNvbnN0IEFsbG93ZWRFeGNhbGlkcmF3QWN0aXZlVG9vbHM6IFJlY29yZDxcbiAgQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdW1widHlwZVwiXSxcbiAgYm9vbGVhblxuPiA9IHtcbiAgc2VsZWN0aW9uOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICByZWN0YW5nbGU6IHRydWUsXG4gIGRpYW1vbmQ6IHRydWUsXG4gIGVsbGlwc2U6IHRydWUsXG4gIGxpbmU6IHRydWUsXG4gIGltYWdlOiB0cnVlLFxuICBhcnJvdzogdHJ1ZSxcbiAgZnJlZWRyYXc6IHRydWUsXG4gIGVyYXNlcjogZmFsc2UsXG4gIGN1c3RvbTogdHJ1ZSxcbiAgaGFuZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCB0eXBlIFJlc3RvcmVkRGF0YVN0YXRlID0ge1xuICBlbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgYXBwU3RhdGU6IFJlc3RvcmVkQXBwU3RhdGU7XG4gIGZpbGVzOiBCaW5hcnlGaWxlcztcbn07XG5cbmNvbnN0IGdldEZvbnRGYW1pbHlCeU5hbWUgPSAoZm9udEZhbWlseU5hbWU6IHN0cmluZyk6IEZvbnRGYW1pbHlWYWx1ZXMgPT4ge1xuICBpZiAoT2JqZWN0LmtleXMoRk9OVF9GQU1JTFkpLmluY2x1ZGVzKGZvbnRGYW1pbHlOYW1lKSkge1xuICAgIHJldHVybiBGT05UX0ZBTUlMWVtcbiAgICAgIGZvbnRGYW1pbHlOYW1lIGFzIGtleW9mIHR5cGVvZiBGT05UX0ZBTUlMWVxuICAgIF0gYXMgRm9udEZhbWlseVZhbHVlcztcbiAgfVxuICByZXR1cm4gREVGQVVMVF9GT05UX0ZBTUlMWTtcbn07XG5cbmNvbnN0IHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMgPSA8XG4gIFQgZXh0ZW5kcyBSZXF1aXJlZDxPbWl0PEV4Y2FsaWRyYXdFbGVtZW50LCBcImN1c3RvbURhdGFcIj4+ICYge1xuICAgIGN1c3RvbURhdGE/OiBFeGNhbGlkcmF3RWxlbWVudFtcImN1c3RvbURhdGFcIl07XG4gICAgLyoqIEBkZXByZWNhdGVkICovXG4gICAgYm91bmRFbGVtZW50SWRzPzogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXVtdO1xuICAgIC8qKiBAZGVwcmVjYXRlZCAqL1xuICAgIHN0cm9rZVNoYXJwbmVzcz86IFN0cm9rZVJvdW5kbmVzcztcbiAgICAvKiogbWV0YWRhdGEgdGhhdCBtYXkgYmUgcHJlc2VudCBpbiBlbGVtZW50cyBkdXJpbmcgY29sbGFib3JhdGlvbiAqL1xuICAgIFtQUkVDRURJTkdfRUxFTUVOVF9LRVldPzogc3RyaW5nO1xuICB9LFxuICBLIGV4dGVuZHMgUGljazxULCBrZXlvZiBPbWl0PFJlcXVpcmVkPFQ+LCBrZXlvZiBFeGNhbGlkcmF3RWxlbWVudD4+LFxuPihcbiAgZWxlbWVudDogVCxcbiAgZXh0cmE6IFBpY2s8XG4gICAgVCxcbiAgICAvLyBUaGlzIGV4dHJhIFBpY2s8VCwga2V5b2YgSz4gZW5zdXJlIG5vIGV4Y2VzcyBwcm9wZXJ0aWVzIGFyZSBwYXNzZWQuXG4gICAgLy8gQHRzLWlnbm9yZSBUUyBjb21wbGFpbnMgaGVyZSBidXQgdHlwZSBjaGVja3MgdGhlIGNhbGwgc2l0ZXMgZmluZS5cbiAgICBrZXlvZiBLXG4gID4gJlxuICAgIFBhcnRpYWw8UGljazxFeGNhbGlkcmF3RWxlbWVudCwgXCJ0eXBlXCIgfCBcInhcIiB8IFwieVwiPj4sXG4pOiBUID0+IHtcbiAgY29uc3QgYmFzZTogUGljazxULCBrZXlvZiBFeGNhbGlkcmF3RWxlbWVudD4gJiB7XG4gICAgW1BSRUNFRElOR19FTEVNRU5UX0tFWV0/OiBzdHJpbmc7XG4gIH0gPSB7XG4gICAgdHlwZTogZXh0cmEudHlwZSB8fCBlbGVtZW50LnR5cGUsXG4gICAgLy8gYWxsIGVsZW1lbnRzIG11c3QgaGF2ZSB2ZXJzaW9uID4gMCBzbyBnZXRTY2VuZVZlcnNpb24oKSB3aWxsIHBpY2sgdXBcbiAgICAvLyBuZXdseSBhZGRlZCBlbGVtZW50c1xuICAgIHZlcnNpb246IGVsZW1lbnQudmVyc2lvbiB8fCAxLFxuICAgIHZlcnNpb25Ob25jZTogZWxlbWVudC52ZXJzaW9uTm9uY2UgPz8gMCxcbiAgICBpc0RlbGV0ZWQ6IGVsZW1lbnQuaXNEZWxldGVkID8/IGZhbHNlLFxuICAgIGlkOiBlbGVtZW50LmlkIHx8IHJhbmRvbUlkKCksXG4gICAgZmlsbFN0eWxlOiBlbGVtZW50LmZpbGxTdHlsZSB8fCBcImhhY2h1cmVcIixcbiAgICBzdHJva2VXaWR0aDogZWxlbWVudC5zdHJva2VXaWR0aCB8fCAxLFxuICAgIHN0cm9rZVN0eWxlOiBlbGVtZW50LnN0cm9rZVN0eWxlID8/IFwic29saWRcIixcbiAgICByb3VnaG5lc3M6IGVsZW1lbnQucm91Z2huZXNzID8/IDEsXG4gICAgb3BhY2l0eTogZWxlbWVudC5vcGFjaXR5ID09IG51bGwgPyAxMDAgOiBlbGVtZW50Lm9wYWNpdHksXG4gICAgYW5nbGU6IGVsZW1lbnQuYW5nbGUgfHwgMCxcbiAgICB4OiBleHRyYS54ID8/IGVsZW1lbnQueCA/PyAwLFxuICAgIHk6IGV4dHJhLnkgPz8gZWxlbWVudC55ID8/IDAsXG4gICAgc3Ryb2tlQ29sb3I6IGVsZW1lbnQuc3Ryb2tlQ29sb3IgfHwgb2MuYmxhY2ssXG4gICAgYmFja2dyb3VuZENvbG9yOiBlbGVtZW50LmJhY2tncm91bmRDb2xvciB8fCBcInRyYW5zcGFyZW50XCIsXG4gICAgd2lkdGg6IGVsZW1lbnQud2lkdGggfHwgMCxcbiAgICBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IHx8IDAsXG4gICAgc2VlZDogZWxlbWVudC5zZWVkID8/IDEsXG4gICAgZ3JvdXBJZHM6IGVsZW1lbnQuZ3JvdXBJZHMgPz8gW10sXG4gICAgcm91bmRuZXNzOiBlbGVtZW50LnJvdW5kbmVzc1xuICAgICAgPyBlbGVtZW50LnJvdW5kbmVzc1xuICAgICAgOiBlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJyb3VuZFwiXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBmb3Igb2xkIGVsZW1lbnRzIHRoYXQgd291bGQgbm93IHVzZSBhZGFwdGl2ZSByYWRpdXMgYWxnbyxcbiAgICAgICAgICAvLyB1c2UgbGVnYWN5IGFsZ28gaW5zdGVhZFxuICAgICAgICAgIHR5cGU6IGlzVXNpbmdBZGFwdGl2ZVJhZGl1cyhlbGVtZW50LnR5cGUpXG4gICAgICAgICAgICA/IFJPVU5ETkVTUy5MRUdBQ1lcbiAgICAgICAgICAgIDogUk9VTkRORVNTLlBST1BPUlRJT05BTF9SQURJVVMsXG4gICAgICAgIH1cbiAgICAgIDogbnVsbCxcbiAgICBib3VuZEVsZW1lbnRzOiBlbGVtZW50LmJvdW5kRWxlbWVudElkc1xuICAgICAgPyBlbGVtZW50LmJvdW5kRWxlbWVudElkcy5tYXAoKGlkKSA9PiAoeyB0eXBlOiBcImFycm93XCIsIGlkIH0pKVxuICAgICAgOiBlbGVtZW50LmJvdW5kRWxlbWVudHMgPz8gW10sXG4gICAgdXBkYXRlZDogZWxlbWVudC51cGRhdGVkID8/IGdldFVwZGF0ZWRUaW1lc3RhbXAoKSxcbiAgICBsaW5rOiBlbGVtZW50LmxpbmsgPz8gbnVsbCxcbiAgICBsb2NrZWQ6IGVsZW1lbnQubG9ja2VkID8/IGZhbHNlLFxuICB9O1xuXG4gIGlmIChcImN1c3RvbURhdGFcIiBpbiBlbGVtZW50KSB7XG4gICAgYmFzZS5jdXN0b21EYXRhID0gZWxlbWVudC5jdXN0b21EYXRhO1xuICB9XG5cbiAgaWYgKFBSRUNFRElOR19FTEVNRU5UX0tFWSBpbiBlbGVtZW50KSB7XG4gICAgYmFzZVtQUkVDRURJTkdfRUxFTUVOVF9LRVldID0gZWxlbWVudFtQUkVDRURJTkdfRUxFTUVOVF9LRVldO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLmdldE5vcm1hbGl6ZWREaW1lbnNpb25zKGJhc2UpLFxuICAgIC4uLmV4dHJhLFxuICB9IGFzIHVua25vd24gYXMgVDtcbn07XG5cbmNvbnN0IHJlc3RvcmVFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNsdWRlPEV4Y2FsaWRyYXdFbGVtZW50LCBFeGNhbGlkcmF3U2VsZWN0aW9uRWxlbWVudD4sXG4gIHJlZnJlc2hEaW1lbnNpb25zID0gZmFsc2UsXG4pOiB0eXBlb2YgZWxlbWVudCB8IG51bGwgPT4ge1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBsZXQgZm9udFNpemUgPSBlbGVtZW50LmZvbnRTaXplO1xuICAgICAgbGV0IGZvbnRGYW1pbHkgPSBlbGVtZW50LmZvbnRGYW1pbHk7XG4gICAgICBpZiAoXCJmb250XCIgaW4gZWxlbWVudCkge1xuICAgICAgICBjb25zdCBbZm9udFB4LCBfZm9udEZhbWlseV06IFtzdHJpbmcsIHN0cmluZ10gPSAoXG4gICAgICAgICAgZWxlbWVudCBhcyBhbnlcbiAgICAgICAgKS5mb250LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9udFNpemUgPSBwYXJzZUZsb2F0KGZvbnRQeCk7XG4gICAgICAgIGZvbnRGYW1pbHkgPSBnZXRGb250RmFtaWx5QnlOYW1lKF9mb250RmFtaWx5KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRleHQgPSBlbGVtZW50LnRleHQgPz8gXCJcIjtcblxuICAgICAgLy8gbGluZS1oZWlnaHQgbWlnaHQgbm90IGJlIHNwZWNpZmllZCBlaXRoZXIgd2hlbiBjcmVhdGluZyBlbGVtZW50c1xuICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSwgb3Igd2hlbiBpbXBvcnRpbmcgb2xkIGRpYWdyYW1zLlxuICAgICAgLy8gRm9yIHRoZSBsYXR0ZXIgd2Ugd2FudCB0byBkZXRlY3QgdGhlIG9yaWdpbmFsIGxpbmUgaGVpZ2h0IHdoaWNoXG4gICAgICAvLyB3aWxsIGxpa2VseSBkaWZmZXIgZnJvbSBvdXIgcGVyLWZvbnQgZml4ZWQgbGluZSBoZWlnaHQgd2Ugbm93IHVzZSxcbiAgICAgIC8vIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID1cbiAgICAgICAgZWxlbWVudC5saW5lSGVpZ2h0IHx8XG4gICAgICAgIChlbGVtZW50LmhlaWdodFxuICAgICAgICAgID8gLy8gZGV0ZWN0IGxpbmUtaGVpZ2h0IGZyb20gY3VycmVudCBlbGVtZW50IGhlaWdodCBhbmQgZm9udC1zaXplXG4gICAgICAgICAgICBkZXRlY3RMaW5lSGVpZ2h0KGVsZW1lbnQpXG4gICAgICAgICAgOiAvLyBubyBlbGVtZW50IGhlaWdodCBsaWtlbHkgbWVhbnMgcHJvZ3JhbW1hdGljIHVzZSwgc28gZGVmYXVsdFxuICAgICAgICAgICAgLy8gdG8gYSBmaXhlZCBsaW5lIGhlaWdodFxuICAgICAgICAgICAgZ2V0RGVmYXVsdExpbmVIZWlnaHQoZWxlbWVudC5mb250RmFtaWx5KSk7XG4gICAgICBjb25zdCB7IGJhc2VsaW5lIH0gPSBnZXRET01NZXRyaWNzKFxuICAgICAgICBlbGVtZW50LnRleHQsXG4gICAgICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICAgICAgIGxpbmVIZWlnaHQsXG4gICAgICApO1xuICAgICAgZWxlbWVudCA9IHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge1xuICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdGV4dEFsaWduOiBlbGVtZW50LnRleHRBbGlnbiB8fCBERUZBVUxUX1RFWFRfQUxJR04sXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IGVsZW1lbnQudmVydGljYWxBbGlnbiB8fCBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgICBjb250YWluZXJJZDogZWxlbWVudC5jb250YWluZXJJZCA/PyBudWxsLFxuICAgICAgICBvcmlnaW5hbFRleHQ6IGVsZW1lbnQub3JpZ2luYWxUZXh0IHx8IHRleHQsXG5cbiAgICAgICAgbGluZUhlaWdodCxcbiAgICAgICAgYmFzZWxpbmUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlZnJlc2hEaW1lbnNpb25zKSB7XG4gICAgICAgIGVsZW1lbnQgPSB7IC4uLmVsZW1lbnQsIC4uLnJlZnJlc2hUZXh0RGltZW5zaW9ucyhlbGVtZW50KSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBlbGVtZW50LnBvaW50cyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgICAgICBzaW11bGF0ZVByZXNzdXJlOiBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUsXG4gICAgICAgIHByZXNzdXJlczogZWxlbWVudC5wcmVzc3VyZXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7XG4gICAgICAgIHN0YXR1czogZWxlbWVudC5zdGF0dXMgfHwgXCJwZW5kaW5nXCIsXG4gICAgICAgIGZpbGVJZDogZWxlbWVudC5maWxlSWQsXG4gICAgICAgIHNjYWxlOiBlbGVtZW50LnNjYWxlIHx8IFsxLCAxXSxcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgLy8gQHRzLWlnbm9yZSBMRUdBQ1kgdHlwZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIGNhc2UgXCJkcmF3XCI6XG4gICAgY2FzZSBcImFycm93XCI6IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQgPSBudWxsLFxuICAgICAgICBlbmRBcnJvd2hlYWQgPSBlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIiA/IFwiYXJyb3dcIiA6IG51bGwsXG4gICAgICB9ID0gZWxlbWVudDtcblxuICAgICAgbGV0IHggPSBlbGVtZW50Lng7XG4gICAgICBsZXQgeSA9IGVsZW1lbnQueTtcbiAgICAgIGxldCBwb2ludHMgPSAvLyBtaWdyYXRlIG9sZCBhcnJvdyBtb2RlbCB0byBuZXcgb25lXG4gICAgICAgICFBcnJheS5pc0FycmF5KGVsZW1lbnQucG9pbnRzKSB8fCBlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFswLCAwXSxcbiAgICAgICAgICAgICAgW2VsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0XSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IGVsZW1lbnQucG9pbnRzO1xuXG4gICAgICBpZiAocG9pbnRzWzBdWzBdICE9PSAwIHx8IHBvaW50c1swXVsxXSAhPT0gMCkge1xuICAgICAgICAoeyBwb2ludHMsIHgsIHkgfSA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Tm9ybWFsaXplZFBvaW50cyhlbGVtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgdHlwZTpcbiAgICAgICAgICAoZWxlbWVudC50eXBlIGFzIEV4Y2FsaWRyYXdFbGVtZW50W1widHlwZVwiXSB8IFwiZHJhd1wiKSA9PT0gXCJkcmF3XCJcbiAgICAgICAgICAgID8gXCJsaW5lXCJcbiAgICAgICAgICAgIDogZWxlbWVudC50eXBlLFxuICAgICAgICBzdGFydEJpbmRpbmc6IGVsZW1lbnQuc3RhcnRCaW5kaW5nLFxuICAgICAgICBlbmRCaW5kaW5nOiBlbGVtZW50LmVuZEJpbmRpbmcsXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZ2VuZXJpYyBlbGVtZW50c1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge30pO1xuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG5cbiAgICAvLyBEb24ndCB1c2UgZGVmYXVsdCBjYXNlIHNvIGFzIHRvIGNhdGNoIGEgbWlzc2luZyBhbiBlbGVtZW50IHR5cGUgY2FzZS5cbiAgICAvLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gdGhyb3csIGJ1dCBpbnN0ZWFkIHJldHVybiB2b2lkIHNvIHdlIGZpbHRlclxuICAgIC8vIG91dCB0aGVzZSB1bnN1cHBvcnRlZCBlbGVtZW50cyBmcm9tIHRoZSByZXN0b3JlZCBhcnJheS5cbiAgfVxufTtcblxuLyoqXG4gKiBSZXBhaXJzIGNvbnRhaWVuciBlbGVtZW50J3MgYm91bmRFbGVtZW50cyBhcnJheSBieSByZW1vdmluZyBkdXBsaWNhdGVzIGFuZFxuICogZml4aW5nIGNvbnRhaW5lcklkIG9mIGJvdW5kIGVsZW1lbnRzIGlmIG5vdCBwcmVzZW50LiBBbHNvIHJlbW92ZXMgYW55XG4gKiBib3VuZCBlbGVtZW50cyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZWxlbWVudHMgYXJyYXkuXG4gKlxuICogTk9URSBtdXRhdGVzIGVsZW1lbnRzLlxuICovXG5jb25zdCByZXBhaXJDb250YWluZXJFbGVtZW50ID0gKFxuICBjb250YWluZXI6IE11dGFibGU8RXhjYWxpZHJhd0VsZW1lbnQ+LFxuICBlbGVtZW50c01hcDogTWFwPHN0cmluZywgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+LFxuKSA9PiB7XG4gIGlmIChjb250YWluZXIuYm91bmRFbGVtZW50cykge1xuICAgIC8vIGNvcHkgYmVjYXVzZSB3ZSdyZSBub3QgY2xvbmluZyBvbiByZXN0b3JlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBtdXRhdGUgdXBzdHJlYW1cbiAgICBjb25zdCBib3VuZEVsZW1lbnRzID0gY29udGFpbmVyLmJvdW5kRWxlbWVudHMuc2xpY2UoKTtcblxuICAgIC8vIGRlZHVwZSBiaW5kaW5ncyAmIGZpeCBib3VuZEVsZW1lbnQuY29udGFpbmVySWQgaWYgbm90IHNldCBhbHJlYWR5XG4gICAgY29uc3QgYm91bmRJZHMgPSBuZXcgU2V0PEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+KCk7XG4gICAgY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBib3VuZEVsZW1lbnRzLnJlZHVjZShcbiAgICAgIChcbiAgICAgICAgYWNjOiBNdXRhYmxlPE5vbk51bGxhYmxlPEV4Y2FsaWRyYXdFbGVtZW50W1wiYm91bmRFbGVtZW50c1wiXT4+LFxuICAgICAgICBiaW5kaW5nLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGVsZW1lbnRzTWFwLmdldChiaW5kaW5nLmlkKTtcbiAgICAgICAgaWYgKGJvdW5kRWxlbWVudCAmJiAhYm91bmRJZHMuaGFzKGJpbmRpbmcuaWQpKSB7XG4gICAgICAgICAgYm91bmRJZHMuYWRkKGJpbmRpbmcuaWQpO1xuXG4gICAgICAgICAgaWYgKGJvdW5kRWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWNjLnB1c2goYmluZGluZyk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc1RleHRFbGVtZW50KGJvdW5kRWxlbWVudCkgJiZcbiAgICAgICAgICAgIC8vIGJlaW5nIHNsaWdodGx5IGNvbnNlcnZhdGl2ZSBoZXJlLCBwcmVzZXJ2aW5nIGV4aXN0aW5nIGNvbnRhaW5lcklkXG4gICAgICAgICAgICAvLyBpZiBkZWZpbmVkLCBsZXN0IGJvdW5kRWxlbWVudHMgaXMgc3RhbGVcbiAgICAgICAgICAgICFib3VuZEVsZW1lbnQuY29udGFpbmVySWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIChib3VuZEVsZW1lbnQgYXMgTXV0YWJsZTxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+KS5jb250YWluZXJJZCA9XG4gICAgICAgICAgICAgIGNvbnRhaW5lci5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIFJlcGFpcnMgdGFyZ2V0IGJvdW5kIGVsZW1lbnQncyBjb250YWluZXIncyBib3VuZEVsZW1lbnRzIGFycmF5LFxuICogb3IgcmVtb3ZlcyBjb250YWllbnJJZCBpZiBjb250YWluZXIgZG9lcyBub3QgZXhpc3QuXG4gKlxuICogTk9URSBtdXRhdGVzIGVsZW1lbnRzLlxuICovXG5jb25zdCByZXBhaXJCb3VuZEVsZW1lbnQgPSAoXG4gIGJvdW5kRWxlbWVudDogTXV0YWJsZTxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+LFxuICBlbGVtZW50c01hcDogTWFwPHN0cmluZywgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+LFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGJvdW5kRWxlbWVudC5jb250YWluZXJJZFxuICAgID8gZWxlbWVudHNNYXAuZ2V0KGJvdW5kRWxlbWVudC5jb250YWluZXJJZClcbiAgICA6IG51bGw7XG5cbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICBib3VuZEVsZW1lbnQuY29udGFpbmVySWQgPSBudWxsO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChib3VuZEVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICAgIGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzICYmXG4gICAgIWNvbnRhaW5lci5ib3VuZEVsZW1lbnRzLmZpbmQoKGJpbmRpbmcpID0+IGJpbmRpbmcuaWQgPT09IGJvdW5kRWxlbWVudC5pZClcbiAgKSB7XG4gICAgLy8gY29weSBiZWNhdXNlIHdlJ3JlIG5vdCBjbG9uaW5nIG9uIHJlc3RvcmUsIGFuZCB3ZSBkb24ndCB3YW50IHRvIG11dGF0ZSB1cHN0cmVhbVxuICAgIGNvbnN0IGJvdW5kRWxlbWVudHMgPSAoXG4gICAgICBjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBbXSlcbiAgICApLnNsaWNlKCk7XG4gICAgYm91bmRFbGVtZW50cy5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIGlkOiBib3VuZEVsZW1lbnQuaWQgfSk7XG4gICAgY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBib3VuZEVsZW1lbnRzO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZUVsZW1lbnRzID0gKFxuICBlbGVtZW50czogSW1wb3J0ZWREYXRhU3RhdGVbXCJlbGVtZW50c1wiXSxcbiAgLyoqIE5PVEUgZG9lc24ndCBzZXJ2ZSBmb3IgcmVjb25jaWxpYXRpb24gKi9cbiAgbG9jYWxFbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiB7IHJlZnJlc2hEaW1lbnNpb25zPzogYm9vbGVhbjsgcmVwYWlyQmluZGluZ3M/OiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG4pOiBFeGNhbGlkcmF3RWxlbWVudFtdID0+IHtcbiAgY29uc3QgbG9jYWxFbGVtZW50c01hcCA9IGxvY2FsRWxlbWVudHMgPyBhcnJheVRvTWFwKGxvY2FsRWxlbWVudHMpIDogbnVsbDtcbiAgY29uc3QgcmVzdG9yZWRFbGVtZW50cyA9IChlbGVtZW50cyB8fCBbXSkucmVkdWNlKChlbGVtZW50cywgZWxlbWVudCkgPT4ge1xuICAgIC8vIGZpbHRlcmluZyBvdXQgc2VsZWN0aW9uLCB3aGljaCBpcyBsZWdhY3ksIG5vIGxvbmdlciBrZXB0IGluIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBjYXVzaW5nIGlzc3VlcyBpZiByZXRhaW5lZFxuICAgIGlmIChlbGVtZW50LnR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiYgIWlzSW52aXNpYmx5U21hbGxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBsZXQgbWlncmF0ZWRFbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwgPSByZXN0b3JlRWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgb3B0cz8ucmVmcmVzaERpbWVuc2lvbnMsXG4gICAgICApO1xuICAgICAgaWYgKG1pZ3JhdGVkRWxlbWVudCkge1xuICAgICAgICBjb25zdCBsb2NhbEVsZW1lbnQgPSBsb2NhbEVsZW1lbnRzTWFwPy5nZXQoZWxlbWVudC5pZCk7XG4gICAgICAgIGlmIChsb2NhbEVsZW1lbnQgJiYgbG9jYWxFbGVtZW50LnZlcnNpb24gPiBtaWdyYXRlZEVsZW1lbnQudmVyc2lvbikge1xuICAgICAgICAgIG1pZ3JhdGVkRWxlbWVudCA9IGJ1bXBWZXJzaW9uKG1pZ3JhdGVkRWxlbWVudCwgbG9jYWxFbGVtZW50LnZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2gobWlncmF0ZWRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LCBbXSBhcyBFeGNhbGlkcmF3RWxlbWVudFtdKTtcblxuICBpZiAoIW9wdHM/LnJlcGFpckJpbmRpbmdzKSB7XG4gICAgcmV0dXJuIHJlc3RvcmVkRWxlbWVudHM7XG4gIH1cblxuICAvLyByZXBhaXIgYmluZGluZy4gTXV0YXRlcyBlbGVtZW50cy5cbiAgY29uc3QgcmVzdG9yZWRFbGVtZW50c01hcCA9IGFycmF5VG9NYXAocmVzdG9yZWRFbGVtZW50cyk7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiByZXN0b3JlZEVsZW1lbnRzKSB7XG4gICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgcmVwYWlyQm91bmRFbGVtZW50KGVsZW1lbnQsIHJlc3RvcmVkRWxlbWVudHNNYXApO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ib3VuZEVsZW1lbnRzKSB7XG4gICAgICByZXBhaXJDb250YWluZXJFbGVtZW50KGVsZW1lbnQsIHJlc3RvcmVkRWxlbWVudHNNYXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN0b3JlZEVsZW1lbnRzO1xufTtcblxuY29uc3QgY29hbGVzY2VBcHBTdGF0ZVZhbHVlID0gPFxuICBUIGV4dGVuZHMga2V5b2YgUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGVmYXVsdEFwcFN0YXRlPixcbj4oXG4gIGtleTogVCxcbiAgYXBwU3RhdGU6IEV4Y2x1ZGU8SW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXSwgbnVsbCB8IHVuZGVmaW5lZD4sXG4gIGRlZmF1bHRBcHBTdGF0ZTogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGVmYXVsdEFwcFN0YXRlPixcbikgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGFwcFN0YXRlW2tleV07XG4gIC8vIE5PVEUgdGhlIHZhbHVlISBhc3NlcnRpb24gaXMgbmVlZGVkIGluIFRTIDQuNS41IChmaXhlZCBpbiBuZXdlciB2ZXJzaW9ucylcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSEgOiBkZWZhdWx0QXBwU3RhdGVba2V5XTtcbn07XG5cbmNvbnN0IExlZ2FjeUFwcFN0YXRlTWlncmF0aW9uczoge1xuICBbSyBpbiBrZXlvZiBMZWdhY3lBcHBTdGF0ZV06IChcbiAgICBJbXBvcnRlZERhdGFTdGF0ZTogRXhjbHVkZTxJbXBvcnRlZERhdGFTdGF0ZVtcImFwcFN0YXRlXCJdLCBudWxsIHwgdW5kZWZpbmVkPixcbiAgICBkZWZhdWx0QXBwU3RhdGU6IFJldHVyblR5cGU8dHlwZW9mIGdldERlZmF1bHRBcHBTdGF0ZT4sXG4gICkgPT4gW0xlZ2FjeUFwcFN0YXRlW0tdWzFdLCBBcHBTdGF0ZVtMZWdhY3lBcHBTdGF0ZVtLXVsxXV1dO1xufSA9IHtcbiAgaXNMaWJyYXJ5T3BlbjogKGFwcFN0YXRlLCBkZWZhdWx0QXBwU3RhdGUpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJvcGVuU2lkZWJhclwiLFxuICAgICAgXCJpc0xpYnJhcnlPcGVuXCIgaW4gYXBwU3RhdGVcbiAgICAgICAgPyBhcHBTdGF0ZS5pc0xpYnJhcnlPcGVuXG4gICAgICAgICAgPyBcImxpYnJhcnlcIlxuICAgICAgICAgIDogbnVsbFxuICAgICAgICA6IGNvYWxlc2NlQXBwU3RhdGVWYWx1ZShcIm9wZW5TaWRlYmFyXCIsIGFwcFN0YXRlLCBkZWZhdWx0QXBwU3RhdGUpLFxuICAgIF07XG4gIH0sXG4gIGlzTGlicmFyeU1lbnVEb2NrZWQ6IChhcHBTdGF0ZSwgZGVmYXVsdEFwcFN0YXRlKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiaXNTaWRlYmFyRG9ja2VkXCIsXG4gICAgICBhcHBTdGF0ZS5pc0xpYnJhcnlNZW51RG9ja2VkID8/XG4gICAgICAgIGNvYWxlc2NlQXBwU3RhdGVWYWx1ZShcImlzU2lkZWJhckRvY2tlZFwiLCBhcHBTdGF0ZSwgZGVmYXVsdEFwcFN0YXRlKSxcbiAgICBdO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmVBcHBTdGF0ZSA9IChcbiAgYXBwU3RhdGU6IEltcG9ydGVkRGF0YVN0YXRlW1wiYXBwU3RhdGVcIl0sXG4gIGxvY2FsQXBwU3RhdGU6IFBhcnRpYWw8QXBwU3RhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFJlc3RvcmVkQXBwU3RhdGUgPT4ge1xuICBhcHBTdGF0ZSA9IGFwcFN0YXRlIHx8IHt9O1xuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgY29uc3QgbmV4dEFwcFN0YXRlID0ge30gYXMgdHlwZW9mIGRlZmF1bHRBcHBTdGF0ZTtcblxuICAvLyBmaXJzdCwgbWlncmF0ZSBhbGwgbGVnYWN5IEFwcFN0YXRlIHByb3BlcnRpZXMgdG8gbmV3IG9uZXMuIFdlIGRvIGl0XG4gIC8vIGluIG9uZSBnbyBiZWZvcmUgbWlncmF0ZSB0aGUgcmVzdCBvZiB0aGUgcHJvcGVydGllcyBpbiBjYXNlIHRoZSBuZXcgb25lc1xuICAvLyBkZXBlbmQgb24gY2hlY2tpbmcgYW55IG90aGVyIGtleSAoaS5lLiB0aGV5IGFyZSBjb3VwbGVkKVxuICBmb3IgKGNvbnN0IGxlZ2FjeUtleSBvZiBPYmplY3Qua2V5cyhcbiAgICBMZWdhY3lBcHBTdGF0ZU1pZ3JhdGlvbnMsXG4gICkgYXMgKGtleW9mIHR5cGVvZiBMZWdhY3lBcHBTdGF0ZU1pZ3JhdGlvbnMpW10pIHtcbiAgICBpZiAobGVnYWN5S2V5IGluIGFwcFN0YXRlKSB7XG4gICAgICBjb25zdCBbbmV4dEtleSwgbmV4dFZhbHVlXSA9IExlZ2FjeUFwcFN0YXRlTWlncmF0aW9uc1tsZWdhY3lLZXldKFxuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgZGVmYXVsdEFwcFN0YXRlLFxuICAgICAgKTtcbiAgICAgIChuZXh0QXBwU3RhdGUgYXMgYW55KVtuZXh0S2V5XSA9IG5leHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIGRlZmF1bHRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVmYXVsdEFwcFN0YXRlKSBhcyBbXG4gICAga2V5b2YgdHlwZW9mIGRlZmF1bHRBcHBTdGF0ZSxcbiAgICBhbnksXG4gIF1bXSkge1xuICAgIC8vIGlmIEFwcFN0YXRlIGNvbnRhaW5zIGEgbGVnYWN5IGtleSwgcHJlZmVyIHRoYXQgb25lIGFuZCBtaWdyYXRlIGl0c1xuICAgIC8vIHZhbHVlIHRvIHRoZSBuZXcgb25lXG4gICAgY29uc3Qgc3VwcGxpZWRWYWx1ZSA9IGFwcFN0YXRlW2tleV07XG5cbiAgICBjb25zdCBsb2NhbFZhbHVlID0gbG9jYWxBcHBTdGF0ZSA/IGxvY2FsQXBwU3RhdGVba2V5XSA6IHVuZGVmaW5lZDtcbiAgICAobmV4dEFwcFN0YXRlIGFzIGFueSlba2V5XSA9XG4gICAgICBzdXBwbGllZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzdXBwbGllZFZhbHVlXG4gICAgICAgIDogbG9jYWxWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbG9jYWxWYWx1ZVxuICAgICAgICA6IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ubmV4dEFwcFN0YXRlLFxuICAgIGN1cnNvckJ1dHRvbjogbG9jYWxBcHBTdGF0ZT8uY3Vyc29yQnV0dG9uIHx8IFwidXBcIixcbiAgICAvLyByZXNldCBvbiBmcmVzaCByZXN0b3JlIHNvIGFzIHRvIGhpZGUgdGhlIFVJIGJ1dHRvbiBpZiBwZW5Nb2RlIG5vdCBhY3RpdmVcbiAgICBwZW5EZXRlY3RlZDpcbiAgICAgIGxvY2FsQXBwU3RhdGU/LnBlbkRldGVjdGVkID8/XG4gICAgICAoYXBwU3RhdGUucGVuTW9kZSA/IGFwcFN0YXRlLnBlbkRldGVjdGVkID8/IGZhbHNlIDogZmFsc2UpLFxuICAgIGFjdGl2ZVRvb2w6IHtcbiAgICAgIC4uLnVwZGF0ZUFjdGl2ZVRvb2woXG4gICAgICAgIGRlZmF1bHRBcHBTdGF0ZSxcbiAgICAgICAgbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSAmJlxuICAgICAgICAgIEFsbG93ZWRFeGNhbGlkcmF3QWN0aXZlVG9vbHNbbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZV1cbiAgICAgICAgICA/IG5leHRBcHBTdGF0ZS5hY3RpdmVUb29sXG4gICAgICAgICAgOiB7IHR5cGU6IFwic2VsZWN0aW9uXCIgfSxcbiAgICAgICksXG4gICAgICBsYXN0QWN0aXZlVG9vbDogbnVsbCxcbiAgICAgIGxvY2tlZDogbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wubG9ja2VkID8/IGZhbHNlLFxuICAgIH0sXG4gICAgLy8gTWlncmF0ZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9uIHdoZXJlIGFwcFN0YXRlLnpvb20gd2FzIGEgbnVtYmVyXG4gICAgem9vbTpcbiAgICAgIHR5cGVvZiBhcHBTdGF0ZS56b29tID09PSBcIm51bWJlclwiXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdmFsdWU6IGFwcFN0YXRlLnpvb20gYXMgTm9ybWFsaXplZFpvb21WYWx1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogYXBwU3RhdGUuem9vbT8udmFsdWVcbiAgICAgICAgPyBhcHBTdGF0ZS56b29tXG4gICAgICAgIDogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgLy8gd2hlbiBzaWRlYmFyIGRvY2tlZCBhbmQgdXNlciBsZWZ0IGl0IG9wZW4gaW4gbGFzdCBzZXNzaW9uLFxuICAgIC8vIGtlZXAgaXQgb3Blbi4gSWYgbm90IGRvY2tlZCwga2VlcCBpdCBjbG9zZWQgaXJyZXNwZWN0aXZlIG9mIGxhc3Qgc3RhdGUuXG4gICAgb3BlblNpZGViYXI6XG4gICAgICBuZXh0QXBwU3RhdGUub3BlblNpZGViYXIgPT09IFwibGlicmFyeVwiXG4gICAgICAgID8gbmV4dEFwcFN0YXRlLmlzU2lkZWJhckRvY2tlZFxuICAgICAgICAgID8gXCJsaWJyYXJ5XCJcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgOiBuZXh0QXBwU3RhdGUub3BlblNpZGViYXIsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZSA9IChcbiAgZGF0YTogUGljazxJbXBvcnRlZERhdGFTdGF0ZSwgXCJhcHBTdGF0ZVwiIHwgXCJlbGVtZW50c1wiIHwgXCJmaWxlc1wiPiB8IG51bGwsXG4gIC8qKlxuICAgKiBMb2NhbCBBcHBTdGF0ZSAoYHRoaXMuc3RhdGVgIG9yIGluaXRpYWwgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2UpIHNvIHRoYXQgd2VcbiAgICogZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIHN0YXRlIHdpdGggZGVmYXVsdCB2YWx1ZXMgKHdoZW4gdmFsdWVzIG5vdFxuICAgKiBleHBsaWNpdGx5IHNwZWNpZmllZCkuXG4gICAqIFN1cHBseSBgbnVsbGAgaWYgeW91IGNhbid0IGdldCBhY2Nlc3MgdG8gaXQuXG4gICAqL1xuICBsb2NhbEFwcFN0YXRlOiBQYXJ0aWFsPEFwcFN0YXRlPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxvY2FsRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBlbGVtZW50c0NvbmZpZz86IHsgcmVmcmVzaERpbWVuc2lvbnM/OiBib29sZWFuOyByZXBhaXJCaW5kaW5ncz86IGJvb2xlYW4gfSxcbik6IFJlc3RvcmVkRGF0YVN0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50czogcmVzdG9yZUVsZW1lbnRzKGRhdGE/LmVsZW1lbnRzLCBsb2NhbEVsZW1lbnRzLCBlbGVtZW50c0NvbmZpZyksXG4gICAgYXBwU3RhdGU6IHJlc3RvcmVBcHBTdGF0ZShkYXRhPy5hcHBTdGF0ZSwgbG9jYWxBcHBTdGF0ZSB8fCBudWxsKSxcbiAgICBmaWxlczogZGF0YT8uZmlsZXMgfHwge30sXG4gIH07XG59O1xuXG5jb25zdCByZXN0b3JlTGlicmFyeUl0ZW0gPSAobGlicmFyeUl0ZW06IExpYnJhcnlJdGVtKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gcmVzdG9yZUVsZW1lbnRzKFxuICAgIGdldE5vbkRlbGV0ZWRFbGVtZW50cyhsaWJyYXJ5SXRlbS5lbGVtZW50cyksXG4gICAgbnVsbCxcbiAgKTtcbiAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA/IHsgLi4ubGlicmFyeUl0ZW0sIGVsZW1lbnRzIH0gOiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmVMaWJyYXJ5SXRlbXMgPSAoXG4gIGxpYnJhcnlJdGVtczogSW1wb3J0ZWREYXRhU3RhdGVbXCJsaWJyYXJ5SXRlbXNcIl0gPSBbXSxcbiAgZGVmYXVsdFN0YXR1czogTGlicmFyeUl0ZW1bXCJzdGF0dXNcIl0sXG4pID0+IHtcbiAgY29uc3QgcmVzdG9yZWRJdGVtczogTGlicmFyeUl0ZW1bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlicmFyeUl0ZW1zKSB7XG4gICAgLy8gbWlncmF0ZSBvbGRlciBsaWJyYXJpZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgY29uc3QgcmVzdG9yZWRJdGVtID0gcmVzdG9yZUxpYnJhcnlJdGVtKHtcbiAgICAgICAgc3RhdHVzOiBkZWZhdWx0U3RhdHVzLFxuICAgICAgICBlbGVtZW50czogaXRlbSxcbiAgICAgICAgaWQ6IHJhbmRvbUlkKCksXG4gICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN0b3JlZEl0ZW0pIHtcbiAgICAgICAgcmVzdG9yZWRJdGVtcy5wdXNoKHJlc3RvcmVkSXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IF9pdGVtID0gaXRlbSBhcyBNYXJrT3B0aW9uYWw8XG4gICAgICAgIExpYnJhcnlJdGVtLFxuICAgICAgICBcImlkXCIgfCBcInN0YXR1c1wiIHwgXCJjcmVhdGVkXCJcbiAgICAgID47XG4gICAgICBjb25zdCByZXN0b3JlZEl0ZW0gPSByZXN0b3JlTGlicmFyeUl0ZW0oe1xuICAgICAgICAuLi5faXRlbSxcbiAgICAgICAgaWQ6IF9pdGVtLmlkIHx8IHJhbmRvbUlkKCksXG4gICAgICAgIHN0YXR1czogX2l0ZW0uc3RhdHVzIHx8IGRlZmF1bHRTdGF0dXMsXG4gICAgICAgIGNyZWF0ZWQ6IF9pdGVtLmNyZWF0ZWQgfHwgRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3RvcmVkSXRlbSkge1xuICAgICAgICByZXN0b3JlZEl0ZW1zLnB1c2gocmVzdG9yZWRJdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3RvcmVkSXRlbXM7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../data/restore.ts\n");
|
|
3146
3146
|
|
|
3147
3147
|
/***/ }),
|
|
3148
3148
|
|
|
@@ -3263,7 +3263,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3263
3263
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3264
3264
|
|
|
3265
3265
|
"use strict";
|
|
3266
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement),\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newImageElement\": () => (/* binding */ newImageElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"refreshTextDimensions\": () => (/* binding */ refreshTextDimensions),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\n\nconst _newElementBase = (type, _a) => {\n var _b, _c;\n var { x, y, strokeColor, backgroundColor, fillStyle, strokeWidth, strokeStyle, roughness, opacity, width = 0, height = 0, angle = 0, groupIds = [], roundness = null, boundElements = null, link = null, locked } = _a, rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"roundness\", \"boundElements\", \"link\", \"locked\"]);\n // assign type to guard against excess properties\n const element = {\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n roundness,\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\n version: rest.version || 1,\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\n isDeleted: false,\n boundElements,\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)(),\n link,\n locked,\n };\n return element;\n};\nconst newElement = (opts) => _newElementBase(opts.type, opts);\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (opts, metrics) => {\n return {\n x: opts.textAlign === \"center\"\n ? metrics.width / 2\n : opts.textAlign === \"right\"\n ? metrics.width\n : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n };\n};\nconst newTextElement = (opts) => {\n const lineHeight = opts.lineHeight || (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getDefaultLineHeight)(opts.fontFamily);\n const text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.normalizeText)(opts.text);\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(opts), lineHeight);\n const offsets = getTextElementPositionOffsets(opts, metrics);\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), { text, fontSize: opts.fontSize, fontFamily: opts.fontFamily, textAlign: opts.textAlign, verticalAlign: opts.verticalAlign, x: opts.x - offsets.x, y: opts.y - offsets.y, width: metrics.width, height: metrics.height, containerId: opts.containerId || null, originalText: text, lineHeight }), {});\n return textElement;\n};\nconst getAdjustedDimensions = (element, nextText) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(element);\n const { width: nextWidth, height: nextHeight } = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const { textAlign, verticalAlign } = element;\n let x;\n let y;\n if (textAlign === \"center\" &&\n verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_8__.VERTICAL_ALIGN.MIDDLE &&\n !element.containerId) {\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height,\n });\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n }\n else {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\",\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n }\n // make sure container dimensions are set properly when\n // text editor overflows beyond viewport dimensions\n if (container) {\n const boundTextElementPadding = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextElementOffset)(element);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerDims)(container);\n let height = containerDims.height;\n let width = containerDims.width;\n if (nextHeight > height - boundTextElementPadding * 2) {\n height = nextHeight + boundTextElementPadding * 2;\n }\n if (nextWidth > width - boundTextElementPadding * 2) {\n width = nextWidth + boundTextElementPadding * 2;\n }\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isArrowElement)(container) &&\n (height !== containerDims.height || width !== containerDims.width)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, { height, width });\n }\n }\n return {\n width: nextWidth,\n height: nextHeight,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y,\n };\n};\nconst refreshTextDimensions = (textElement, text = textElement.text) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(textElement);\n if (container) {\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getMaxContainerWidth)(container));\n }\n const dimensions = getAdjustedDimensions(textElement, text);\n return Object.assign({ text }, dimensions);\n};\nconst updateTextElement = (textElement, { text, isDeleted, originalText, }) => {\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(textElement, Object.assign({ originalText, isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : textElement.isDeleted }, refreshTextDimensions(textElement, originalText)));\n};\nconst newFreeDrawElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], pressures: [], simulatePressure: opts.simulatePressure, lastCommittedPoint: null });\n};\nconst newLinearElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], lastCommittedPoint: null, startBinding: null, endBinding: null, startArrowhead: opts.startArrowhead, endArrowhead: opts.endArrowhead });\n};\nconst newImageElement = (opts) => {\n var _a, _b, _c;\n return Object.assign(Object.assign({}, _newElementBase(\"image\", opts)), { \n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\", status: (_a = opts.status) !== null && _a !== void 0 ? _a : \"pending\", fileId: (_b = opts.fileId) !== null && _b !== void 0 ? _b : null, scale: (_c = opts.scale) !== null && _c !== void 0 ? _c : [1, 1] });\n};\n// Simplified deep clone for the purpose of cloning ExcalidrawElement only\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\n//\n// Adapted from https://github.com/lukeed/klona\nconst deepCopyElement = (val, depth = 0) => {\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\n const tmp = typeof val.constructor === \"function\"\n ? Object.create(Object.getPrototypeOf(val))\n : {};\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n tmp[key] = deepCopyElement(val[key], depth + 1);\n }\n }\n return tmp;\n }\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n while (k--) {\n arr[k] = deepCopyElement(val[k], depth + 1);\n }\n return arr;\n }\n return val;\n};\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\n var _a, _b;\n let copy = deepCopyElement(element);\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n copy.id = `${copy.id}_copy`;\n // `window.h` may not be defined in some unit tests\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find((el) => el.id === copy.id)) {\n copy.id += \"_copy\";\n }\n }\n else {\n copy.id = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\n }\n copy.boundElements = null;\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)();\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, (groupId) => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)());\n }\n return groupIdMapForOperation.get(groupId);\n });\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n return copy;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFNBQVMsQ0FBQyxDQUFDO0tBQ3ZDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9uZXdFbGVtZW50LnRzPzEyNTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgVGV4dEFsaWduLFxuICBHcm91cElkLFxuICBWZXJ0aWNhbEFsaWduLFxuICBBcnJvd2hlYWQsXG4gIEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Rm9udFN0cmluZywgZ2V0VXBkYXRlZFRpbWVzdGFtcCwgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByYW5kb21JbnRlZ2VyLCByYW5kb21JZCB9IGZyb20gXCIuLi9yYW5kb21cIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0TmV3R3JvdXBJZHNGb3JEdXBsaWNhdGlvbiB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgYWRqdXN0WFlXaXRoUm90YXRpb24gfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCxcbiAgZ2V0Q29udGFpbmVyRGltcyxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgbWVhc3VyZVRleHQsXG4gIG5vcm1hbGl6ZVRleHQsXG4gIHdyYXBUZXh0LFxuICBnZXRNYXhDb250YWluZXJXaWR0aCxcbiAgZ2V0RGVmYXVsdExpbmVIZWlnaHQsXG59IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGlzQXJyb3dFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgTWFya09wdGlvbmFsLCBNZXJnZSwgTXV0YWJsZSB9IGZyb20gXCIuLi91dGlsaXR5LXR5cGVzXCI7XG5cbnR5cGUgRWxlbWVudENvbnN0cnVjdG9yT3B0cyA9IE1hcmtPcHRpb25hbDxcbiAgT21pdDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsIFwiaWRcIiB8IFwidHlwZVwiIHwgXCJpc0RlbGV0ZWRcIiB8IFwidXBkYXRlZFwiPixcbiAgfCBcIndpZHRoXCJcbiAgfCBcImhlaWdodFwiXG4gIHwgXCJhbmdsZVwiXG4gIHwgXCJncm91cElkc1wiXG4gIHwgXCJib3VuZEVsZW1lbnRzXCJcbiAgfCBcInNlZWRcIlxuICB8IFwidmVyc2lvblwiXG4gIHwgXCJ2ZXJzaW9uTm9uY2VcIlxuICB8IFwibGlua1wiXG4+O1xuXG5jb25zdCBfbmV3RWxlbWVudEJhc2UgPSA8VCBleHRlbmRzIEV4Y2FsaWRyYXdFbGVtZW50PihcbiAgdHlwZTogVFtcInR5cGVcIl0sXG4gIHtcbiAgICB4LFxuICAgIHksXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGZpbGxTdHlsZSxcbiAgICBzdHJva2VXaWR0aCxcbiAgICBzdHJva2VTdHlsZSxcbiAgICByb3VnaG5lc3MsXG4gICAgb3BhY2l0eSxcbiAgICB3aWR0aCA9IDAsXG4gICAgaGVpZ2h0ID0gMCxcbiAgICBhbmdsZSA9IDAsXG4gICAgZ3JvdXBJZHMgPSBbXSxcbiAgICByb3VuZG5lc3MgPSBudWxsLFxuICAgIGJvdW5kRWxlbWVudHMgPSBudWxsLFxuICAgIGxpbmsgPSBudWxsLFxuICAgIGxvY2tlZCxcbiAgICAuLi5yZXN0XG4gIH06IEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMgJiBPbWl0PFBhcnRpYWw8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50PiwgXCJ0eXBlXCI+LFxuKSA9PiB7XG4gIC8vIGFzc2lnbiB0eXBlIHRvIGd1YXJkIGFnYWluc3QgZXhjZXNzIHByb3BlcnRpZXNcbiAgY29uc3QgZWxlbWVudDogTWVyZ2U8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LCB7IHR5cGU6IFRbXCJ0eXBlXCJdIH0+ID0ge1xuICAgIGlkOiByZXN0LmlkIHx8IHJhbmRvbUlkKCksXG4gICAgdHlwZSxcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGFuZ2xlLFxuICAgIHN0cm9rZUNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICBmaWxsU3R5bGUsXG4gICAgc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlU3R5bGUsXG4gICAgcm91Z2huZXNzLFxuICAgIG9wYWNpdHksXG4gICAgZ3JvdXBJZHMsXG4gICAgcm91bmRuZXNzLFxuICAgIHNlZWQ6IHJlc3Quc2VlZCA/PyByYW5kb21JbnRlZ2VyKCksXG4gICAgdmVyc2lvbjogcmVzdC52ZXJzaW9uIHx8IDEsXG4gICAgdmVyc2lvbk5vbmNlOiByZXN0LnZlcnNpb25Ob25jZSA/PyAwLFxuICAgIGlzRGVsZXRlZDogZmFsc2UgYXMgZmFsc2UsXG4gICAgYm91bmRFbGVtZW50cyxcbiAgICB1cGRhdGVkOiBnZXRVcGRhdGVkVGltZXN0YW1wKCksXG4gICAgbGluayxcbiAgICBsb2NrZWQsXG4gIH07XG4gIHJldHVybiBlbGVtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld0VsZW1lbnQgPSAoXG4gIG9wdHM6IHtcbiAgICB0eXBlOiBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnRbXCJ0eXBlXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50PiA9PlxuICBfbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50PihvcHRzLnR5cGUsIG9wdHMpO1xuXG4vKiogY29tcHV0ZXMgZWxlbWVudCB4L3kgb2Zmc2V0IGJhc2VkIG9uIHRleHRBbGlnbi92ZXJ0aWNhbEFsaWduICovXG5jb25zdCBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyA9IChcbiAgb3B0czoge1xuICAgIHRleHRBbGlnbjogRXhjYWxpZHJhd1RleHRFbGVtZW50W1widGV4dEFsaWduXCJdO1xuICAgIHZlcnRpY2FsQWxpZ246IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcInZlcnRpY2FsQWxpZ25cIl07XG4gIH0sXG4gIG1ldHJpY3M6IHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIHJldHVybiB7XG4gICAgeDpcbiAgICAgIG9wdHMudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgID8gbWV0cmljcy53aWR0aCAvIDJcbiAgICAgICAgOiBvcHRzLnRleHRBbGlnbiA9PT0gXCJyaWdodFwiXG4gICAgICAgID8gbWV0cmljcy53aWR0aFxuICAgICAgICA6IDAsXG4gICAgeTogb3B0cy52ZXJ0aWNhbEFsaWduID09PSBcIm1pZGRsZVwiID8gbWV0cmljcy5oZWlnaHQgLyAyIDogMCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdUZXh0RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBmb250U2l6ZTogbnVtYmVyO1xuICAgIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG4gICAgdGV4dEFsaWduOiBUZXh0QWxpZ247XG4gICAgdmVydGljYWxBbGlnbjogVmVydGljYWxBbGlnbjtcbiAgICBjb250YWluZXJJZD86IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl07XG4gICAgbGluZUhlaWdodD86IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl07XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+ID0+IHtcbiAgY29uc3QgbGluZUhlaWdodCA9IG9wdHMubGluZUhlaWdodCB8fCBnZXREZWZhdWx0TGluZUhlaWdodChvcHRzLmZvbnRGYW1pbHkpO1xuICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplVGV4dChvcHRzLnRleHQpO1xuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQodGV4dCwgZ2V0Rm9udFN0cmluZyhvcHRzKSwgbGluZUhlaWdodCk7XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhvcHRzLCBtZXRyaWNzKTtcbiAgY29uc3QgdGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChcbiAgICB7XG4gICAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd1RleHRFbGVtZW50PihcInRleHRcIiwgb3B0cyksXG4gICAgICB0ZXh0LFxuICAgICAgZm9udFNpemU6IG9wdHMuZm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiBvcHRzLmZvbnRGYW1pbHksXG4gICAgICB0ZXh0QWxpZ246IG9wdHMudGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogb3B0cy52ZXJ0aWNhbEFsaWduLFxuICAgICAgeDogb3B0cy54IC0gb2Zmc2V0cy54LFxuICAgICAgeTogb3B0cy55IC0gb2Zmc2V0cy55LFxuICAgICAgd2lkdGg6IG1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG1ldHJpY3MuaGVpZ2h0LFxuICAgICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICAgIG9yaWdpbmFsVGV4dDogdGV4dCxcbiAgICAgIGxpbmVIZWlnaHQsXG4gICAgfSxcbiAgICB7fSxcbiAgKTtcbiAgcmV0dXJuIHRleHRFbGVtZW50O1xufTtcblxuY29uc3QgZ2V0QWRqdXN0ZWREaW1lbnNpb25zID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIG5leHRUZXh0OiBzdHJpbmcsXG4pOiB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn0gPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGNvbnN0IHsgd2lkdGg6IG5leHRXaWR0aCwgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0gPSBtZWFzdXJlVGV4dChcbiAgICBuZXh0VGV4dCxcbiAgICBnZXRGb250U3RyaW5nKGVsZW1lbnQpLFxuICAgIGVsZW1lbnQubGluZUhlaWdodCxcbiAgKTtcbiAgY29uc3QgeyB0ZXh0QWxpZ24sIHZlcnRpY2FsQWxpZ24gfSA9IGVsZW1lbnQ7XG4gIGxldCB4OiBudW1iZXI7XG4gIGxldCB5OiBudW1iZXI7XG4gIGlmIChcbiAgICB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgJiZcbiAgICB2ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5NSURETEUgJiZcbiAgICAhZWxlbWVudC5jb250YWluZXJJZFxuICApIHtcbiAgICBjb25zdCBwcmV2TWV0cmljcyA9IG1lYXN1cmVUZXh0KFxuICAgICAgZWxlbWVudC50ZXh0LFxuICAgICAgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSxcbiAgICAgIGVsZW1lbnQubGluZUhlaWdodCxcbiAgICApO1xuICAgIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbmV4dFdpZHRoIC0gcHJldk1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQgLSBwcmV2TWV0cmljcy5oZWlnaHQsXG4gICAgfSk7XG5cbiAgICB4ID0gZWxlbWVudC54IC0gb2Zmc2V0cy54O1xuICAgIHkgPSBlbGVtZW50LnkgLSBvZmZzZXRzLnk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAgIGNvbnN0IFtuZXh0WDEsIG5leHRZMSwgbmV4dFgyLCBuZXh0WTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBuZXh0V2lkdGgsXG4gICAgICBuZXh0SGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBjb25zdCBkZWx0YVgxID0gKHgxIC0gbmV4dFgxKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMSA9ICh5MSAtIG5leHRZMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWDIgPSAoeDIgLSBuZXh0WDIpIC8gMjtcbiAgICBjb25zdCBkZWx0YVkyID0gKHkyIC0gbmV4dFkyKSAvIDI7XG5cbiAgICBbeCwgeV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbihcbiAgICAgIHtcbiAgICAgICAgczogdHJ1ZSxcbiAgICAgICAgZTogdGV4dEFsaWduID09PSBcImNlbnRlclwiIHx8IHRleHRBbGlnbiA9PT0gXCJsZWZ0XCIsXG4gICAgICAgIHc6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwicmlnaHRcIixcbiAgICAgIH0sXG4gICAgICBlbGVtZW50LngsXG4gICAgICBlbGVtZW50LnksXG4gICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgZGVsdGFYMSxcbiAgICAgIGRlbHRhWTEsXG4gICAgICBkZWx0YVgyLFxuICAgICAgZGVsdGFZMixcbiAgICApO1xuICB9XG5cbiAgLy8gbWFrZSBzdXJlIGNvbnRhaW5lciBkaW1lbnNpb25zIGFyZSBzZXQgcHJvcGVybHkgd2hlblxuICAvLyB0ZXh0IGVkaXRvciBvdmVyZmxvd3MgYmV5b25kIHZpZXdwb3J0IGRpbWVuc2lvbnNcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nID0gZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldChlbGVtZW50KTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgbGV0IGhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgIGxldCB3aWR0aCA9IGNvbnRhaW5lckRpbXMud2lkdGg7XG4gICAgaWYgKG5leHRIZWlnaHQgPiBoZWlnaHQgLSBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDIpIHtcbiAgICAgIGhlaWdodCA9IG5leHRIZWlnaHQgKyBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDI7XG4gICAgfVxuICAgIGlmIChuZXh0V2lkdGggPiB3aWR0aCAtIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nICogMikge1xuICAgICAgd2lkdGggPSBuZXh0V2lkdGggKyBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDI7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAoaGVpZ2h0ICE9PSBjb250YWluZXJEaW1zLmhlaWdodCB8fCB3aWR0aCAhPT0gY29udGFpbmVyRGltcy53aWR0aClcbiAgICApIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodCwgd2lkdGggfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgeDogTnVtYmVyLmlzRmluaXRlKHgpID8geCA6IGVsZW1lbnQueCxcbiAgICB5OiBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogZWxlbWVudC55LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hUZXh0RGltZW5zaW9ucyA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgdGV4dCA9IHRleHRFbGVtZW50LnRleHQsXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmIChjb250YWluZXIpIHtcbiAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICB0ZXh0LFxuICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZGltZW5zaW9ucyA9IGdldEFkanVzdGVkRGltZW5zaW9ucyh0ZXh0RWxlbWVudCwgdGV4dCk7XG4gIHJldHVybiB7IHRleHQsIC4uLmRpbWVuc2lvbnMgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVUZXh0RWxlbWVudCA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAge1xuICAgIHRleHQsXG4gICAgaXNEZWxldGVkLFxuICAgIG9yaWdpbmFsVGV4dCxcbiAgfToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBpc0RlbGV0ZWQ/OiBib29sZWFuO1xuICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nO1xuICB9LFxuKTogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0+IHtcbiAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKHRleHRFbGVtZW50LCB7XG4gICAgb3JpZ2luYWxUZXh0LFxuICAgIGlzRGVsZXRlZDogaXNEZWxldGVkID8/IHRleHRFbGVtZW50LmlzRGVsZXRlZCxcbiAgICAuLi5yZWZyZXNoVGV4dERpbWVuc2lvbnModGV4dEVsZW1lbnQsIG9yaWdpbmFsVGV4dCksXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld0ZyZWVEcmF3RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IFwiZnJlZWRyYXdcIjtcbiAgICBwb2ludHM/OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50W1wicG9pbnRzXCJdO1xuICAgIHNpbXVsYXRlUHJlc3N1cmU6IGJvb2xlYW47XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50PiA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyksXG4gICAgcG9pbnRzOiBvcHRzLnBvaW50cyB8fCBbXSxcbiAgICBwcmVzc3VyZXM6IFtdLFxuICAgIHNpbXVsYXRlUHJlc3N1cmU6IG9wdHMuc2ltdWxhdGVQcmVzc3VyZSxcbiAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG51bGwsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3TGluZWFyRWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W1widHlwZVwiXTtcbiAgICBzdGFydEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgICBlbmRBcnJvd2hlYWQ6IEFycm93aGVhZCB8IG51bGw7XG4gICAgcG9pbnRzPzogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJwb2ludHNcIl07XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLl9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKSxcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICBzdGFydEJpbmRpbmc6IG51bGwsXG4gICAgZW5kQmluZGluZzogbnVsbCxcbiAgICBzdGFydEFycm93aGVhZDogb3B0cy5zdGFydEFycm93aGVhZCxcbiAgICBlbmRBcnJvd2hlYWQ6IG9wdHMuZW5kQXJyb3doZWFkLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld0ltYWdlRWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJ0eXBlXCJdO1xuICAgIHN0YXR1cz86IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJzdGF0dXNcIl07XG4gICAgZmlsZUlkPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcImZpbGVJZFwiXTtcbiAgICBzY2FsZT86IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJzY2FsZVwiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0ltYWdlRWxlbWVudD4oXCJpbWFnZVwiLCBvcHRzKSxcbiAgICAvLyBpbiB0aGUgZnV0dXJlIHdlJ2xsIHN1cHBvcnQgY2hhbmdpbmcgc3Ryb2tlIGNvbG9yIGZvciBzb21lIFNWRyBlbGVtZW50cyxcbiAgICAvLyBhbmQgYHRyYW5zcGFyZW50YCB3aWxsIGxpa2VseSBtZWFuIFwidXNlIG9yaWdpbmFsIGNvbG9ycyBvZiB0aGUgaW1hZ2VcIlxuICAgIHN0cm9rZUNvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgc3RhdHVzOiBvcHRzLnN0YXR1cyA/PyBcInBlbmRpbmdcIixcbiAgICBmaWxlSWQ6IG9wdHMuZmlsZUlkID8/IG51bGwsXG4gICAgc2NhbGU6IG9wdHMuc2NhbGUgPz8gWzEsIDFdLFxuICB9O1xufTtcblxuLy8gU2ltcGxpZmllZCBkZWVwIGNsb25lIGZvciB0aGUgcHVycG9zZSBvZiBjbG9uaW5nIEV4Y2FsaWRyYXdFbGVtZW50IG9ubHlcbi8vIChkb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsIFR5cGVkIGFycmF5cyBldGMuKVxuLy9cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL2tsb25hXG5leHBvcnQgY29uc3QgZGVlcENvcHlFbGVtZW50ID0gKHZhbDogYW55LCBkZXB0aDogbnVtYmVyID0gMCkgPT4ge1xuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICBjb25zdCB0bXAgPVxuICAgICAgdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsKSlcbiAgICAgICAgOiB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWwuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBkb24ndCBjb3B5IG5vbi1zZXJpYWxpemFibGUgb2JqZWN0cyBsaWtlIHRoZXNlIGNhY2hlcy4gVGhleSdsbCBiZVxuICAgICAgICAvLyBwb3B1bGF0ZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC5cbiAgICAgICAgaWYgKGRlcHRoID09PSAwICYmIChrZXkgPT09IFwic2hhcGVcIiB8fCBrZXkgPT09IFwiY2FudmFzXCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdG1wW2tleV0gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tleV0sIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcbiAgICB3aGlsZSAoay0tKSB7XG4gICAgICBhcnJba10gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tdLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogRHVwbGljYXRlIGFuIGVsZW1lbnQsIG9mdGVuIHVzZWQgaW4gdGhlIGFsdC1kcmFnIG9wZXJhdGlvbi5cbiAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgZ290dGVuIGEgYml0IGNvbXBsaWNhdGVkIHNpbmNlIHRoZVxuICogaW50cm9kdWN0aW9uIG9mIGdydW9waW5nL3VuZ3JvdXBpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZWRpdGluZ0dyb3VwSWQgVGhlIGN1cnJlbnQgZ3JvdXAgYmVpbmcgZWRpdGVkLiBUaGUgbmV3XG4gKiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCB3aWxsIGluaGVyaXQgdGhpcyBncm91cCBhbmQgaXRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5cbiAqIEBwYXJhbSBncm91cElkTWFwRm9yT3BlcmF0aW9uIEEgTWFwIHRoYXQgbWFwcyBvbGQgZ3JvdXAgSURzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkIG9uZXMuIElmIHlvdSBhcmUgZHVwbGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIHNoYXJlIHRoaXMgbWFwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW9uZ3N0IGFsbCBvZiB0aGVtXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIG92ZXJyaWRlcyBBbnkgZWxlbWVudCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlXG4gKi9cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVFbGVtZW50ID0gPFRFbGVtZW50IGV4dGVuZHMgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+KFxuICBlZGl0aW5nR3JvdXBJZDogQXBwU3RhdGVbXCJlZGl0aW5nR3JvdXBJZFwiXSxcbiAgZ3JvdXBJZE1hcEZvck9wZXJhdGlvbjogTWFwPEdyb3VwSWQsIEdyb3VwSWQ+LFxuICBlbGVtZW50OiBURWxlbWVudCxcbiAgb3ZlcnJpZGVzPzogUGFydGlhbDxURWxlbWVudD4sXG4pOiBURWxlbWVudCA9PiB7XG4gIGxldCBjb3B5OiBURWxlbWVudCA9IGRlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICBjb3B5LmlkID0gYCR7Y29weS5pZH1fY29weWA7XG4gICAgLy8gYHdpbmRvdy5oYCBtYXkgbm90IGJlIGRlZmluZWQgaW4gc29tZSB1bml0IHRlc3RzXG4gICAgaWYgKFxuICAgICAgd2luZG93Lmg/LmFwcFxuICAgICAgICA/LmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbmQoKGVsKSA9PiBlbC5pZCA9PT0gY29weS5pZClcbiAgICApIHtcbiAgICAgIGNvcHkuaWQgKz0gXCJfY29weVwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb3B5LmlkID0gcmFuZG9tSWQoKTtcbiAgfVxuICBjb3B5LmJvdW5kRWxlbWVudHMgPSBudWxsO1xuICBjb3B5LnVwZGF0ZWQgPSBnZXRVcGRhdGVkVGltZXN0YW1wKCk7XG4gIGNvcHkuc2VlZCA9IHJhbmRvbUludGVnZXIoKTtcbiAgY29weS5ncm91cElkcyA9IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24oXG4gICAgY29weS5ncm91cElkcyxcbiAgICBlZGl0aW5nR3JvdXBJZCxcbiAgICAoZ3JvdXBJZCkgPT4ge1xuICAgICAgaWYgKCFncm91cElkTWFwRm9yT3BlcmF0aW9uLmhhcyhncm91cElkKSkge1xuICAgICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByYW5kb21JZCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBncm91cElkTWFwRm9yT3BlcmF0aW9uLmdldChncm91cElkKSE7XG4gICAgfSxcbiAgKTtcbiAgaWYgKG92ZXJyaWRlcykge1xuICAgIGNvcHkgPSBPYmplY3QuYXNzaWduKGNvcHksIG92ZXJyaWRlcyk7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
|
|
3266
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement),\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newImageElement\": () => (/* binding */ newImageElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"refreshTextDimensions\": () => (/* binding */ refreshTextDimensions),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\n\nconst _newElementBase = (type, _a) => {\n var _b, _c;\n var { x, y, strokeColor, backgroundColor, fillStyle, strokeWidth, strokeStyle, roughness, opacity, width = 0, height = 0, angle = 0, groupIds = [], roundness = null, boundElements = null, link = null, locked } = _a, rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"roundness\", \"boundElements\", \"link\", \"locked\"]);\n // assign type to guard against excess properties\n const element = {\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n roundness,\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\n version: rest.version || 1,\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\n isDeleted: false,\n boundElements,\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)(),\n link,\n locked,\n };\n return element;\n};\nconst newElement = (opts) => _newElementBase(opts.type, opts);\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (opts, metrics) => {\n return {\n x: opts.textAlign === \"center\"\n ? metrics.width / 2\n : opts.textAlign === \"right\"\n ? metrics.width\n : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n };\n};\nconst newTextElement = (opts) => {\n const lineHeight = opts.lineHeight || (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getDefaultLineHeight)(opts.fontFamily);\n const text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.normalizeText)(opts.text);\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(opts), lineHeight);\n const offsets = getTextElementPositionOffsets(opts, metrics);\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), { text, fontSize: opts.fontSize, fontFamily: opts.fontFamily, textAlign: opts.textAlign, verticalAlign: opts.verticalAlign, x: opts.x - offsets.x, y: opts.y - offsets.y, width: metrics.width, height: metrics.height, baseline: metrics.baseline, containerId: opts.containerId || null, originalText: text, lineHeight }), {});\n return textElement;\n};\nconst getAdjustedDimensions = (element, nextText) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(element);\n const { width: nextWidth, height: nextHeight, baseline: nextBaseline, } = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const { textAlign, verticalAlign } = element;\n let x;\n let y;\n if (textAlign === \"center\" &&\n verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_8__.VERTICAL_ALIGN.MIDDLE &&\n !element.containerId) {\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height,\n });\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n }\n else {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\",\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n }\n // make sure container dimensions are set properly when\n // text editor overflows beyond viewport dimensions\n if (container) {\n const boundTextElementPadding = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextElementOffset)(element);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerDims)(container);\n let height = containerDims.height;\n let width = containerDims.width;\n if (nextHeight > height - boundTextElementPadding * 2) {\n height = nextHeight + boundTextElementPadding * 2;\n }\n if (nextWidth > width - boundTextElementPadding * 2) {\n width = nextWidth + boundTextElementPadding * 2;\n }\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isArrowElement)(container) &&\n (height !== containerDims.height || width !== containerDims.width)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, { height, width });\n }\n }\n return {\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseline,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y,\n };\n};\nconst refreshTextDimensions = (textElement, text = textElement.text) => {\n if (textElement.isDeleted) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(textElement);\n if (container) {\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getMaxContainerWidth)(container));\n }\n const dimensions = getAdjustedDimensions(textElement, text);\n return Object.assign({ text }, dimensions);\n};\nconst updateTextElement = (textElement, { text, isDeleted, originalText, }) => {\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(textElement, Object.assign({ originalText, isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : textElement.isDeleted }, refreshTextDimensions(textElement, originalText)));\n};\nconst newFreeDrawElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], pressures: [], simulatePressure: opts.simulatePressure, lastCommittedPoint: null });\n};\nconst newLinearElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], lastCommittedPoint: null, startBinding: null, endBinding: null, startArrowhead: opts.startArrowhead, endArrowhead: opts.endArrowhead });\n};\nconst newImageElement = (opts) => {\n var _a, _b, _c;\n return Object.assign(Object.assign({}, _newElementBase(\"image\", opts)), { \n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\", status: (_a = opts.status) !== null && _a !== void 0 ? _a : \"pending\", fileId: (_b = opts.fileId) !== null && _b !== void 0 ? _b : null, scale: (_c = opts.scale) !== null && _c !== void 0 ? _c : [1, 1] });\n};\n// Simplified deep clone for the purpose of cloning ExcalidrawElement only\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\n//\n// Adapted from https://github.com/lukeed/klona\nconst deepCopyElement = (val, depth = 0) => {\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\n const tmp = typeof val.constructor === \"function\"\n ? Object.create(Object.getPrototypeOf(val))\n : {};\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n tmp[key] = deepCopyElement(val[key], depth + 1);\n }\n }\n return tmp;\n }\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n while (k--) {\n arr[k] = deepCopyElement(val[k], depth + 1);\n }\n return arr;\n }\n return val;\n};\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\n var _a, _b;\n let copy = deepCopyElement(element);\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n copy.id = `${copy.id}_copy`;\n // `window.h` may not be defined in some unit tests\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find((el) => el.id === copy.id)) {\n copy.id += \"_copy\";\n }\n }\n else {\n copy.id = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\n }\n copy.boundElements = null;\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)();\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, (groupId) => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)());\n }\n return groupIdMapForOperation.get(groupId);\n });\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n return copy;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBRSxDQUFDO0lBQzlDLENBQUMsQ0FDRixDQUFDO0lBQ0YsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDdkM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L25ld0VsZW1lbnQudHM/MTI1MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBOb25EZWxldGVkLFxuICBUZXh0QWxpZ24sXG4gIEdyb3VwSWQsXG4gIFZlcnRpY2FsQWxpZ24sXG4gIEFycm93aGVhZCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRGb250U3RyaW5nLCBnZXRVcGRhdGVkVGltZXN0YW1wLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHJhbmRvbUludGVnZXIsIHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCwgbmV3RWxlbWVudFdpdGggfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXROZXdHcm91cElkc0ZvckR1cGxpY2F0aW9uIH0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBhZGp1c3RYWVdpdGhSb3RhdGlvbiB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4vYm91bmRzXCI7XG5pbXBvcnQge1xuICBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0LFxuICBnZXRDb250YWluZXJEaW1zLFxuICBnZXRDb250YWluZXJFbGVtZW50LFxuICBtZWFzdXJlVGV4dCxcbiAgbm9ybWFsaXplVGV4dCxcbiAgd3JhcFRleHQsXG4gIGdldE1heENvbnRhaW5lcldpZHRoLFxuICBnZXREZWZhdWx0TGluZUhlaWdodCxcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNBcnJvd0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBNYXJrT3B0aW9uYWwsIE1lcmdlLCBNdXRhYmxlIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcblxudHlwZSBFbGVtZW50Q29uc3RydWN0b3JPcHRzID0gTWFya09wdGlvbmFsPFxuICBPbWl0PEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCwgXCJpZFwiIHwgXCJ0eXBlXCIgfCBcImlzRGVsZXRlZFwiIHwgXCJ1cGRhdGVkXCI+LFxuICB8IFwid2lkdGhcIlxuICB8IFwiaGVpZ2h0XCJcbiAgfCBcImFuZ2xlXCJcbiAgfCBcImdyb3VwSWRzXCJcbiAgfCBcImJvdW5kRWxlbWVudHNcIlxuICB8IFwic2VlZFwiXG4gIHwgXCJ2ZXJzaW9uXCJcbiAgfCBcInZlcnNpb25Ob25jZVwiXG4gIHwgXCJsaW5rXCJcbj47XG5cbmNvbnN0IF9uZXdFbGVtZW50QmFzZSA9IDxUIGV4dGVuZHMgRXhjYWxpZHJhd0VsZW1lbnQ+KFxuICB0eXBlOiBUW1widHlwZVwiXSxcbiAge1xuICAgIHgsXG4gICAgeSxcbiAgICBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyxcbiAgICBvcGFjaXR5LFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGFuZ2xlID0gMCxcbiAgICBncm91cElkcyA9IFtdLFxuICAgIHJvdW5kbmVzcyA9IG51bGwsXG4gICAgYm91bmRFbGVtZW50cyA9IG51bGwsXG4gICAgbGluayA9IG51bGwsXG4gICAgbG9ja2VkLFxuICAgIC4uLnJlc3RcbiAgfTogRWxlbWVudENvbnN0cnVjdG9yT3B0cyAmIE9taXQ8UGFydGlhbDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+LCBcInR5cGVcIj4sXG4pID0+IHtcbiAgLy8gYXNzaWduIHR5cGUgdG8gZ3VhcmQgYWdhaW5zdCBleGNlc3MgcHJvcGVydGllc1xuICBjb25zdCBlbGVtZW50OiBNZXJnZTxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsIHsgdHlwZTogVFtcInR5cGVcIl0gfT4gPSB7XG4gICAgaWQ6IHJlc3QuaWQgfHwgcmFuZG9tSWQoKSxcbiAgICB0eXBlLFxuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYW5nbGUsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGZpbGxTdHlsZSxcbiAgICBzdHJva2VXaWR0aCxcbiAgICBzdHJva2VTdHlsZSxcbiAgICByb3VnaG5lc3MsXG4gICAgb3BhY2l0eSxcbiAgICBncm91cElkcyxcbiAgICByb3VuZG5lc3MsXG4gICAgc2VlZDogcmVzdC5zZWVkID8/IHJhbmRvbUludGVnZXIoKSxcbiAgICB2ZXJzaW9uOiByZXN0LnZlcnNpb24gfHwgMSxcbiAgICB2ZXJzaW9uTm9uY2U6IHJlc3QudmVyc2lvbk5vbmNlID8/IDAsXG4gICAgaXNEZWxldGVkOiBmYWxzZSBhcyBmYWxzZSxcbiAgICBib3VuZEVsZW1lbnRzLFxuICAgIHVwZGF0ZWQ6IGdldFVwZGF0ZWRUaW1lc3RhbXAoKSxcbiAgICBsaW5rLFxuICAgIGxvY2tlZCxcbiAgfTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl07XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+ID0+XG4gIF9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyk7XG5cbi8qKiBjb21wdXRlcyBlbGVtZW50IHgveSBvZmZzZXQgYmFzZWQgb24gdGV4dEFsaWduL3ZlcnRpY2FsQWxpZ24gKi9cbmNvbnN0IGdldFRleHRFbGVtZW50UG9zaXRpb25PZmZzZXRzID0gKFxuICBvcHRzOiB7XG4gICAgdGV4dEFsaWduOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJ0ZXh0QWxpZ25cIl07XG4gICAgdmVydGljYWxBbGlnbjogRXhjYWxpZHJhd1RleHRFbGVtZW50W1widmVydGljYWxBbGlnblwiXTtcbiAgfSxcbiAgbWV0cmljczoge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgcmV0dXJuIHtcbiAgICB4OlxuICAgICAgb3B0cy50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoIC8gMlxuICAgICAgICA6IG9wdHMudGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoXG4gICAgICAgIDogMCxcbiAgICB5OiBvcHRzLnZlcnRpY2FsQWxpZ24gPT09IFwibWlkZGxlXCIgPyBtZXRyaWNzLmhlaWdodCAvIDIgOiAwLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld1RleHRFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGZvbnRTaXplOiBudW1iZXI7XG4gICAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbiAgICB0ZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgICB2ZXJ0aWNhbEFsaWduOiBWZXJ0aWNhbEFsaWduO1xuICAgIGNvbnRhaW5lcklkPzogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXTtcbiAgICBsaW5lSGVpZ2h0PzogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gPT4ge1xuICBjb25zdCBsaW5lSGVpZ2h0ID0gb3B0cy5saW5lSGVpZ2h0IHx8IGdldERlZmF1bHRMaW5lSGVpZ2h0KG9wdHMuZm9udEZhbWlseSk7XG4gIGNvbnN0IHRleHQgPSBub3JtYWxpemVUZXh0KG9wdHMudGV4dCk7XG4gIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dCh0ZXh0LCBnZXRGb250U3RyaW5nKG9wdHMpLCBsaW5lSGVpZ2h0KTtcbiAgY29uc3Qgb2Zmc2V0cyA9IGdldFRleHRFbGVtZW50UG9zaXRpb25PZmZzZXRzKG9wdHMsIG1ldHJpY3MpO1xuXG4gIGNvbnN0IHRleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoXG4gICAge1xuICAgICAgLi4uX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4oXCJ0ZXh0XCIsIG9wdHMpLFxuICAgICAgdGV4dCxcbiAgICAgIGZvbnRTaXplOiBvcHRzLmZvbnRTaXplLFxuICAgICAgZm9udEZhbWlseTogb3B0cy5mb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiBvcHRzLnRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IG9wdHMudmVydGljYWxBbGlnbixcbiAgICAgIHg6IG9wdHMueCAtIG9mZnNldHMueCxcbiAgICAgIHk6IG9wdHMueSAtIG9mZnNldHMueSxcbiAgICAgIHdpZHRoOiBtZXRyaWNzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBtZXRyaWNzLmhlaWdodCxcbiAgICAgIGJhc2VsaW5lOiBtZXRyaWNzLmJhc2VsaW5lLFxuICAgICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICAgIG9yaWdpbmFsVGV4dDogdGV4dCxcbiAgICAgIGxpbmVIZWlnaHQsXG4gICAgfSxcbiAgICB7fSxcbiAgKTtcbiAgcmV0dXJuIHRleHRFbGVtZW50O1xufTtcblxuY29uc3QgZ2V0QWRqdXN0ZWREaW1lbnNpb25zID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIG5leHRUZXh0OiBzdHJpbmcsXG4pOiB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgYmFzZWxpbmU6IG51bWJlcjtcbn0gPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICBiYXNlbGluZTogbmV4dEJhc2VsaW5lLFxuICB9ID0gbWVhc3VyZVRleHQobmV4dFRleHQsIGdldEZvbnRTdHJpbmcoZWxlbWVudCksIGVsZW1lbnQubGluZUhlaWdodCk7XG4gIGNvbnN0IHsgdGV4dEFsaWduLCB2ZXJ0aWNhbEFsaWduIH0gPSBlbGVtZW50O1xuICBsZXQgeDogbnVtYmVyO1xuICBsZXQgeTogbnVtYmVyO1xuICBpZiAoXG4gICAgdGV4dEFsaWduID09PSBcImNlbnRlclwiICYmXG4gICAgdmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uTUlERExFICYmXG4gICAgIWVsZW1lbnQuY29udGFpbmVySWRcbiAgKSB7XG4gICAgY29uc3QgcHJldk1ldHJpY3MgPSBtZWFzdXJlVGV4dChcbiAgICAgIGVsZW1lbnQudGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICAgICBlbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgKTtcbiAgICBjb25zdCBvZmZzZXRzID0gZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMoZWxlbWVudCwge1xuICAgICAgd2lkdGg6IG5leHRXaWR0aCAtIHByZXZNZXRyaWNzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0IC0gcHJldk1ldHJpY3MuaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgeCA9IGVsZW1lbnQueCAtIG9mZnNldHMueDtcbiAgICB5ID0gZWxlbWVudC55IC0gb2Zmc2V0cy55O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG5cbiAgICBjb25zdCBbbmV4dFgxLCBuZXh0WTEsIG5leHRYMiwgbmV4dFkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBlbGVtZW50LFxuICAgICAgbmV4dFdpZHRoLFxuICAgICAgbmV4dEhlaWdodCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY29uc3QgZGVsdGFYMSA9ICh4MSAtIG5leHRYMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTEgPSAoeTEgLSBuZXh0WTEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVgyID0gKHgyIC0gbmV4dFgyKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMiA9ICh5MiAtIG5leHRZMikgLyAyO1xuXG4gICAgW3gsIHldID0gYWRqdXN0WFlXaXRoUm90YXRpb24oXG4gICAgICB7XG4gICAgICAgIHM6IHRydWUsXG4gICAgICAgIGU6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwibGVmdFwiLFxuICAgICAgICB3OiB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgfHwgdGV4dEFsaWduID09PSBcInJpZ2h0XCIsXG4gICAgICB9LFxuICAgICAgZWxlbWVudC54LFxuICAgICAgZWxlbWVudC55LFxuICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICAgIGRlbHRhWDEsXG4gICAgICBkZWx0YVkxLFxuICAgICAgZGVsdGFYMixcbiAgICAgIGRlbHRhWTIsXG4gICAgKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSBjb250YWluZXIgZGltZW5zaW9ucyBhcmUgc2V0IHByb3Blcmx5IHdoZW5cbiAgLy8gdGV4dCBlZGl0b3Igb3ZlcmZsb3dzIGJleW9uZCB2aWV3cG9ydCBkaW1lbnNpb25zXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50UGFkZGluZyA9IGdldEJvdW5kVGV4dEVsZW1lbnRPZmZzZXQoZWxlbWVudCk7XG5cbiAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgIGxldCBoZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICBsZXQgd2lkdGggPSBjb250YWluZXJEaW1zLndpZHRoO1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gaGVpZ2h0IC0gYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyKSB7XG4gICAgICBoZWlnaHQgPSBuZXh0SGVpZ2h0ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyO1xuICAgIH1cbiAgICBpZiAobmV4dFdpZHRoID4gd2lkdGggLSBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDIpIHtcbiAgICAgIHdpZHRoID0gbmV4dFdpZHRoICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgKiAyO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJlxuICAgICAgKGhlaWdodCAhPT0gY29udGFpbmVyRGltcy5oZWlnaHQgfHwgd2lkdGggIT09IGNvbnRhaW5lckRpbXMud2lkdGgpXG4gICAgKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQsIHdpZHRoIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBuZXh0QmFzZWxpbmUsXG4gICAgeDogTnVtYmVyLmlzRmluaXRlKHgpID8geCA6IGVsZW1lbnQueCxcbiAgICB5OiBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogZWxlbWVudC55LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hUZXh0RGltZW5zaW9ucyA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgdGV4dCA9IHRleHRFbGVtZW50LnRleHQsXG4pID0+IHtcbiAgaWYgKHRleHRFbGVtZW50LmlzRGVsZXRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHRleHRFbGVtZW50KTtcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHQsXG4gICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lciksXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaW1lbnNpb25zID0gZ2V0QWRqdXN0ZWREaW1lbnNpb25zKHRleHRFbGVtZW50LCB0ZXh0KTtcbiAgcmV0dXJuIHsgdGV4dCwgLi4uZGltZW5zaW9ucyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRleHRFbGVtZW50ID0gKFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICB7XG4gICAgdGV4dCxcbiAgICBpc0RlbGV0ZWQsXG4gICAgb3JpZ2luYWxUZXh0LFxuICB9OiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGlzRGVsZXRlZD86IGJvb2xlYW47XG4gICAgb3JpZ2luYWxUZXh0OiBzdHJpbmc7XG4gIH0sXG4pOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPT4ge1xuICByZXR1cm4gbmV3RWxlbWVudFdpdGgodGV4dEVsZW1lbnQsIHtcbiAgICBvcmlnaW5hbFRleHQsXG4gICAgaXNEZWxldGVkOiBpc0RlbGV0ZWQgPz8gdGV4dEVsZW1lbnQuaXNEZWxldGVkLFxuICAgIC4uLnJlZnJlc2hUZXh0RGltZW5zaW9ucyh0ZXh0RWxlbWVudCwgb3JpZ2luYWxUZXh0KSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RnJlZURyYXdFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogXCJmcmVlZHJhd1wiO1xuICAgIHBvaW50cz86IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJwb2ludHNcIl07XG4gICAgc2ltdWxhdGVQcmVzc3VyZTogYm9vbGVhbjtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKSxcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIHByZXNzdXJlczogW10sXG4gICAgc2ltdWxhdGVQcmVzc3VyZTogb3B0cy5zaW11bGF0ZVByZXNzdXJlLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdMaW5lYXJFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJ0eXBlXCJdO1xuICAgIHN0YXJ0QXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICAgIGVuZEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgICBwb2ludHM/OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInBvaW50c1wiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PiA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PihvcHRzLnR5cGUsIG9wdHMpLFxuICAgIHBvaW50czogb3B0cy5wb2ludHMgfHwgW10sXG4gICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgIHN0YXJ0QmluZGluZzogbnVsbCxcbiAgICBlbmRCaW5kaW5nOiBudWxsLFxuICAgIHN0YXJ0QXJyb3doZWFkOiBvcHRzLnN0YXJ0QXJyb3doZWFkLFxuICAgIGVuZEFycm93aGVhZDogb3B0cy5lbmRBcnJvd2hlYWQsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3SW1hZ2VFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInR5cGVcIl07XG4gICAgc3RhdHVzPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInN0YXR1c1wiXTtcbiAgICBmaWxlSWQ/OiBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50W1wiZmlsZUlkXCJdO1xuICAgIHNjYWxlPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcInNjYWxlXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0ltYWdlRWxlbWVudD4gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLl9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3SW1hZ2VFbGVtZW50PihcImltYWdlXCIsIG9wdHMpLFxuICAgIC8vIGluIHRoZSBmdXR1cmUgd2UnbGwgc3VwcG9ydCBjaGFuZ2luZyBzdHJva2UgY29sb3IgZm9yIHNvbWUgU1ZHIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBgdHJhbnNwYXJlbnRgIHdpbGwgbGlrZWx5IG1lYW4gXCJ1c2Ugb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBpbWFnZVwiXG4gICAgc3Ryb2tlQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICBzdGF0dXM6IG9wdHMuc3RhdHVzID8/IFwicGVuZGluZ1wiLFxuICAgIGZpbGVJZDogb3B0cy5maWxlSWQgPz8gbnVsbCxcbiAgICBzY2FsZTogb3B0cy5zY2FsZSA/PyBbMSwgMV0sXG4gIH07XG59O1xuXG4vLyBTaW1wbGlmaWVkIGRlZXAgY2xvbmUgZm9yIHRoZSBwdXJwb3NlIG9mIGNsb25pbmcgRXhjYWxpZHJhd0VsZW1lbnQgb25seVxuLy8gKGRvZXNuJ3QgY2xvbmUgRGF0ZSwgUmVnRXhwLCBNYXAsIFNldCwgVHlwZWQgYXJyYXlzIGV0Yy4pXG4vL1xuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQva2xvbmFcbmV4cG9ydCBjb25zdCBkZWVwQ29weUVsZW1lbnQgPSAodmFsOiBhbnksIGRlcHRoOiBudW1iZXIgPSAwKSA9PiB7XG4gIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgIGNvbnN0IHRtcCA9XG4gICAgICB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpKVxuICAgICAgICA6IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbCkge1xuICAgICAgaWYgKHZhbC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIGRvbid0IGNvcHkgbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzIGxpa2UgdGhlc2UgY2FjaGVzLiBUaGV5J2xsIGJlXG4gICAgICAgIC8vIHBvcHVsYXRlZCB3aGVuIHRoZSBlbGVtZW50IGlzIHJlbmRlcmVkLlxuICAgICAgICBpZiAoZGVwdGggPT09IDAgJiYgKGtleSA9PT0gXCJzaGFwZVwiIHx8IGtleSA9PT0gXCJjYW52YXNcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0bXBba2V5XSA9IGRlZXBDb3B5RWxlbWVudCh2YWxba2V5XSwgZGVwdGggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRtcDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICBsZXQgayA9IHZhbC5sZW5ndGg7XG4gICAgY29uc3QgYXJyID0gbmV3IEFycmF5KGspO1xuICAgIHdoaWxlIChrLS0pIHtcbiAgICAgIGFycltrXSA9IGRlZXBDb3B5RWxlbWVudCh2YWxba10sIGRlcHRoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBEdXBsaWNhdGUgYW4gZWxlbWVudCwgb2Z0ZW4gdXNlZCBpbiB0aGUgYWx0LWRyYWcgb3BlcmF0aW9uLlxuICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGhhcyBnb3R0ZW4gYSBiaXQgY29tcGxpY2F0ZWQgc2luY2UgdGhlXG4gKiBpbnRyb2R1Y3Rpb24gb2YgZ3J1b3BpbmcvdW5ncm91cGluZyBlbGVtZW50cy5cbiAqIEBwYXJhbSBlZGl0aW5nR3JvdXBJZCBUaGUgY3VycmVudCBncm91cCBiZWluZyBlZGl0ZWQuIFRoZSBuZXdcbiAqICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHdpbGwgaW5oZXJpdCB0aGlzIGdyb3VwIGFuZCBpdHNcbiAqICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLlxuICogQHBhcmFtIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24gQSBNYXAgdGhhdCBtYXBzIG9sZCBncm91cCBJRHMgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWQgb25lcy4gSWYgeW91IGFyZSBkdXBsaWNhdGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgZWxlbWVudHMgYXQgb25jZSwgc2hhcmUgdGhpcyBtYXBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb25nc3QgYWxsIG9mIHRoZW1cbiAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgdG8gZHVwbGljYXRlXG4gKiBAcGFyYW0gb3ZlcnJpZGVzIEFueSBlbGVtZW50IHByb3BlcnRpZXMgdG8gb3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGNvbnN0IGR1cGxpY2F0ZUVsZW1lbnQgPSA8VEVsZW1lbnQgZXh0ZW5kcyBNdXRhYmxlPEV4Y2FsaWRyYXdFbGVtZW50Pj4oXG4gIGVkaXRpbmdHcm91cElkOiBBcHBTdGF0ZVtcImVkaXRpbmdHcm91cElkXCJdLFxuICBncm91cElkTWFwRm9yT3BlcmF0aW9uOiBNYXA8R3JvdXBJZCwgR3JvdXBJZD4sXG4gIGVsZW1lbnQ6IFRFbGVtZW50LFxuICBvdmVycmlkZXM/OiBQYXJ0aWFsPFRFbGVtZW50Pixcbik6IFRFbGVtZW50ID0+IHtcbiAgbGV0IGNvcHk6IFRFbGVtZW50ID0gZGVlcENvcHlFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIGNvcHkuaWQgPSBgJHtjb3B5LmlkfV9jb3B5YDtcbiAgICAvLyBgd2luZG93LmhgIG1heSBub3QgYmUgZGVmaW5lZCBpbiBzb21lIHVuaXQgdGVzdHNcbiAgICBpZiAoXG4gICAgICB3aW5kb3cuaD8uYXBwXG4gICAgICAgID8uZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKVxuICAgICAgICAuZmluZCgoZWwpID0+IGVsLmlkID09PSBjb3B5LmlkKVxuICAgICkge1xuICAgICAgY29weS5pZCArPSBcIl9jb3B5XCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvcHkuaWQgPSByYW5kb21JZCgpO1xuICB9XG4gIGNvcHkuYm91bmRFbGVtZW50cyA9IG51bGw7XG4gIGNvcHkudXBkYXRlZCA9IGdldFVwZGF0ZWRUaW1lc3RhbXAoKTtcbiAgY29weS5zZWVkID0gcmFuZG9tSW50ZWdlcigpO1xuICBjb3B5Lmdyb3VwSWRzID0gZ2V0TmV3R3JvdXBJZHNGb3JEdXBsaWNhdGlvbihcbiAgICBjb3B5Lmdyb3VwSWRzLFxuICAgIGVkaXRpbmdHcm91cElkLFxuICAgIChncm91cElkKSA9PiB7XG4gICAgICBpZiAoIWdyb3VwSWRNYXBGb3JPcGVyYXRpb24uaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24uc2V0KGdyb3VwSWQsIHJhbmRvbUlkKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24uZ2V0KGdyb3VwSWQpITtcbiAgICB9LFxuICApO1xuICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgY29weSA9IE9iamVjdC5hc3NpZ24oY29weSwgb3ZlcnJpZGVzKTtcbiAgfVxuICByZXR1cm4gY29weTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
|
|
3267
3267
|
|
|
3268
3268
|
/***/ }),
|
|
3269
3269
|
|
|
@@ -3274,7 +3274,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3274
3274
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3275
3275
|
|
|
3276
3276
|
"use strict";
|
|
3277
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getResizeArrowDirection\": () => (/* binding */ getResizeArrowDirection),\n/* harmony export */ \"getResizeOffsetXY\": () => (/* binding */ getResizeOffsetXY),\n/* harmony export */ \"normalizeAngle\": () => (/* binding */ normalizeAngle),\n/* harmony export */ \"resizeSingleElement\": () => (/* binding */ resizeSingleElement),\n/* harmony export */ \"transformElements\": () => (/* binding */ transformElements)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./binding */ \"../../element/binding.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\n\n\n\n\n\n\n\n\n\nconst normalizeAngle = (angle) => {\n if (angle >= 2 * Math.PI) {\n return angle - 2 * Math.PI;\n }\n return angle;\n};\n// Returns true when transform (resizing/rotation) happened\nconst transformElements = (pointerDownState, transformHandleType, selectedElements, resizeArrowDirection, shouldRotateWithDiscreteAngle, shouldResizeFromCenter, shouldMaintainAspectRatio, pointerX, pointerY, centerX, centerY) => {\n if (selectedElements.length === 1) {\n const [element] = selectedElements;\n if (transformHandleType === \"rotation\") {\n rotateSingleElement(element, pointerX, pointerY, shouldRotateWithDiscreteAngle, pointerDownState.originalElements);\n (0,_binding__WEBPACK_IMPORTED_MODULE_7__.updateBoundElements)(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")) {\n resizeSingleTextElement(element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n (0,_binding__WEBPACK_IMPORTED_MODULE_7__.updateBoundElements)(element);\n }\n else if (transformHandleType) {\n resizeSingleElement(pointerDownState.originalElements, shouldMaintainAspectRatio, element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n }\n return true;\n }\n else if (selectedElements.length > 1) {\n if (transformHandleType === \"rotation\") {\n rotateMultipleElements(pointerDownState, selectedElements, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY);\n return true;\n }\n else if (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\") {\n resizeMultipleElements(pointerDownState, selectedElements, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n return true;\n }\n }\n return false;\n};\nconst rotateSingleElement = (element, pointerX, pointerY, shouldRotateWithDiscreteAngle, originalElements) => {\n var _a;\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n let angle = (5 * Math.PI) / 2 + Math.atan2(pointerY - cy, pointerX - cx);\n if (shouldRotateWithDiscreteAngle) {\n angle += _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE / 2;\n angle -= angle % _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE;\n }\n angle = normalizeAngle(angle);\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElementId)(element);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, { angle });\n if (boundTextElementId) {\n const textElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId);\n if (textElement && !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isArrowElement)(element)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(textElement, { angle });\n }\n }\n};\nconst rescalePointsInElement = (element, width, height, normalizePoints) => (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isFreeDrawElement)(element)\n ? {\n points: (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(0, width, (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(1, height, element.points, normalizePoints), normalizePoints),\n }\n : {};\nconst MIN_FONT_SIZE = 1;\nconst measureFontSizeFromWidth = (element, nextWidth) => {\n // We only use width to scale font on resize\n let width = element.width;\n const hasContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isBoundToContainer)(element);\n if (hasContainer) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getContainerElement)(element);\n if (container) {\n width = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container);\n }\n }\n const nextFontSize = element.fontSize * (nextWidth / width);\n if (nextFontSize < MIN_FONT_SIZE) {\n return null;\n }\n return nextFontSize;\n};\nconst getSidesForTransformHandle = (transformHandleType, shouldResizeFromCenter) => {\n return {\n n: /^(n|ne|nw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(s|se|sw)$/.test(transformHandleType)),\n s: /^(s|se|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(n|ne|nw)$/.test(transformHandleType)),\n w: /^(w|nw|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(e|ne|se)$/.test(transformHandleType)),\n e: /^(e|ne|se)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(w|nw|sw)$/.test(transformHandleType)),\n };\n};\nconst resizeSingleTextElement = (element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(pointerX, pointerY, cx, cy, -element.angle);\n let scale;\n switch (transformHandleType) {\n case \"se\":\n scale = Math.max((rotatedX - x1) / (x2 - x1), (rotatedY - y1) / (y2 - y1));\n break;\n case \"nw\":\n scale = Math.max((x2 - rotatedX) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));\n break;\n case \"ne\":\n scale = Math.max((rotatedX - x1) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));\n break;\n case \"sw\":\n scale = Math.max((x2 - rotatedX) / (x2 - x1), (rotatedY - y1) / (y2 - y1));\n break;\n }\n if (scale > 0) {\n const nextWidth = element.width * scale;\n const nextHeight = element.height * scale;\n const nextFontSize = measureFontSizeFromWidth(element, nextWidth);\n if (nextFontSize === null) {\n return;\n }\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n const [nextElementX, nextElementY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.adjustXYWithRotation)(getSidesForTransformHandle(transformHandleType, shouldResizeFromCenter), element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n fontSize: nextFontSize,\n width: nextWidth,\n height: nextHeight,\n x: nextElementX,\n y: nextElementY,\n });\n }\n};\nconst resizeSingleElement = (originalElements, shouldMaintainAspectRatio, element, transformHandleDirection, shouldResizeFromCenter, pointerX, pointerY) => {\n const stateAtResizeStart = originalElements.get(element.id);\n // Gets bounds corners\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(stateAtResizeStart, stateAtResizeStart.width, stateAtResizeStart.height, true);\n const startTopLeft = [x1, y1];\n const startBottomRight = [x2, y2];\n const startCenter = (0,_math__WEBPACK_IMPORTED_MODULE_2__.centerPoint)(startTopLeft, startBottomRight);\n // Calculate new dimensions based on cursor position\n const rotatedPointer = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)([pointerX, pointerY], startCenter, -stateAtResizeStart.angle);\n // Get bounds corners rendered on screen\n const [esx1, esy1, esx2, esy2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(element, element.width, element.height, true);\n const boundsCurrentWidth = esx2 - esx1;\n const boundsCurrentHeight = esy2 - esy1;\n // It's important we set the initial scale value based on the width and height at resize start,\n // otherwise previous dimensions affected by modifiers will be taken into account.\n const atStartBoundsWidth = startBottomRight[0] - startTopLeft[0];\n const atStartBoundsHeight = startBottomRight[1] - startTopLeft[1];\n let scaleX = atStartBoundsWidth / boundsCurrentWidth;\n let scaleY = atStartBoundsHeight / boundsCurrentHeight;\n let boundTextFontSize = null;\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element);\n if (transformHandleDirection.includes(\"e\")) {\n scaleX = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"s\")) {\n scaleY = (rotatedPointer[1] - startTopLeft[1]) / boundsCurrentHeight;\n }\n if (transformHandleDirection.includes(\"w\")) {\n scaleX = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"n\")) {\n scaleY = (startBottomRight[1] - rotatedPointer[1]) / boundsCurrentHeight;\n }\n // Linear elements dimensions differ from bounds dimensions\n const eleInitialWidth = stateAtResizeStart.width;\n const eleInitialHeight = stateAtResizeStart.height;\n // We have to use dimensions of element on screen, otherwise the scaling of the\n // dimensions won't match the cursor for linear elements.\n let eleNewWidth = element.width * scaleX;\n let eleNewHeight = element.height * scaleY;\n // adjust dimensions for resizing from center\n if (shouldResizeFromCenter) {\n eleNewWidth = 2 * eleNewWidth - eleInitialWidth;\n eleNewHeight = 2 * eleNewHeight - eleInitialHeight;\n }\n // adjust dimensions to keep sides ratio\n if (shouldMaintainAspectRatio) {\n const widthRatio = Math.abs(eleNewWidth) / eleInitialWidth;\n const heightRatio = Math.abs(eleNewHeight) / eleInitialHeight;\n if (transformHandleDirection.length === 1) {\n eleNewHeight *= widthRatio;\n eleNewWidth *= heightRatio;\n }\n if (transformHandleDirection.length === 2) {\n const ratio = Math.max(widthRatio, heightRatio);\n eleNewWidth = eleInitialWidth * ratio * Math.sign(eleNewWidth);\n eleNewHeight = eleInitialHeight * ratio * Math.sign(eleNewHeight);\n }\n }\n if (boundTextElement) {\n const stateOfBoundTextElementAtResize = originalElements.get(boundTextElement.id);\n if (stateOfBoundTextElementAtResize) {\n boundTextFontSize = stateOfBoundTextElementAtResize.fontSize;\n }\n if (shouldMaintainAspectRatio) {\n const updatedElement = Object.assign(Object.assign({}, element), { width: eleNewWidth, height: eleNewHeight });\n const nextFontSize = measureFontSizeFromWidth(boundTextElement, (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(updatedElement));\n if (nextFontSize === null) {\n return;\n }\n boundTextFontSize = nextFontSize;\n }\n else {\n const minWidth = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_6__.getFontString)(boundTextElement), boundTextElement.lineHeight);\n const minHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getApproxMinLineHeight)(boundTextElement.fontSize, boundTextElement.lineHeight);\n eleNewWidth = Math.ceil(Math.max(eleNewWidth, minWidth));\n eleNewHeight = Math.ceil(Math.max(eleNewHeight, minHeight));\n }\n }\n const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(stateAtResizeStart, eleNewWidth, eleNewHeight, true);\n const newBoundsWidth = newBoundsX2 - newBoundsX1;\n const newBoundsHeight = newBoundsY2 - newBoundsY1;\n // Calculate new topLeft based on fixed corner during resize\n let newTopLeft = [...startTopLeft];\n if ([\"n\", \"w\", \"nw\"].includes(transformHandleDirection)) {\n newTopLeft = [\n startBottomRight[0] - Math.abs(newBoundsWidth),\n startBottomRight[1] - Math.abs(newBoundsHeight),\n ];\n }\n if (transformHandleDirection === \"ne\") {\n const bottomLeft = [startTopLeft[0], startBottomRight[1]];\n newTopLeft = [bottomLeft[0], bottomLeft[1] - Math.abs(newBoundsHeight)];\n }\n if (transformHandleDirection === \"sw\") {\n const topRight = [startBottomRight[0], startTopLeft[1]];\n newTopLeft = [topRight[0] - Math.abs(newBoundsWidth), topRight[1]];\n }\n // Keeps opposite handle fixed during resize\n if (shouldMaintainAspectRatio) {\n if ([\"s\", \"n\"].includes(transformHandleDirection)) {\n newTopLeft[0] = startCenter[0] - newBoundsWidth / 2;\n }\n if ([\"e\", \"w\"].includes(transformHandleDirection)) {\n newTopLeft[1] = startCenter[1] - newBoundsHeight / 2;\n }\n }\n // Flip horizontally\n if (eleNewWidth < 0) {\n if (transformHandleDirection.includes(\"e\")) {\n newTopLeft[0] -= Math.abs(newBoundsWidth);\n }\n if (transformHandleDirection.includes(\"w\")) {\n newTopLeft[0] += Math.abs(newBoundsWidth);\n }\n }\n // Flip vertically\n if (eleNewHeight < 0) {\n if (transformHandleDirection.includes(\"s\")) {\n newTopLeft[1] -= Math.abs(newBoundsHeight);\n }\n if (transformHandleDirection.includes(\"n\")) {\n newTopLeft[1] += Math.abs(newBoundsHeight);\n }\n }\n if (shouldResizeFromCenter) {\n newTopLeft[0] = startCenter[0] - Math.abs(newBoundsWidth) / 2;\n newTopLeft[1] = startCenter[1] - Math.abs(newBoundsHeight) / 2;\n }\n // adjust topLeft to new rotation point\n const angle = stateAtResizeStart.angle;\n const rotatedTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(newTopLeft, startCenter, angle);\n const newCenter = [\n newTopLeft[0] + Math.abs(newBoundsWidth) / 2,\n newTopLeft[1] + Math.abs(newBoundsHeight) / 2,\n ];\n const rotatedNewCenter = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(newCenter, startCenter, angle);\n newTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(rotatedTopLeft, rotatedNewCenter, -angle);\n // Readjust points for linear elements\n let rescaledElementPointsY;\n let rescaledPoints;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isFreeDrawElement)(element)) {\n rescaledElementPointsY = (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(1, eleNewHeight, stateAtResizeStart.points, true);\n rescaledPoints = (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(0, eleNewWidth, rescaledElementPointsY, true);\n }\n // For linear elements (x,y) are the coordinates of the first drawn point not the top-left corner\n // So we need to readjust (x,y) to be where the first point should be\n const newOrigin = [...newTopLeft];\n newOrigin[0] += stateAtResizeStart.x - newBoundsX1;\n newOrigin[1] += stateAtResizeStart.y - newBoundsY1;\n const resizedElement = {\n width: Math.abs(eleNewWidth),\n height: Math.abs(eleNewHeight),\n x: newOrigin[0],\n y: newOrigin[1],\n points: rescaledPoints,\n };\n if (\"scale\" in element && \"scale\" in stateAtResizeStart) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n scale: [\n // defaulting because scaleX/Y can be 0/-0\n (Math.sign(newBoundsX2 - stateAtResizeStart.x) ||\n stateAtResizeStart.scale[0]) * stateAtResizeStart.scale[0],\n (Math.sign(newBoundsY2 - stateAtResizeStart.y) ||\n stateAtResizeStart.scale[1]) * stateAtResizeStart.scale[1],\n ],\n });\n }\n if (resizedElement.width !== 0 &&\n resizedElement.height !== 0 &&\n Number.isFinite(resizedElement.x) &&\n Number.isFinite(resizedElement.y)) {\n (0,_binding__WEBPACK_IMPORTED_MODULE_7__.updateBoundElements)(element, {\n newSize: { width: resizedElement.width, height: resizedElement.height },\n });\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, resizedElement);\n if (boundTextElement && boundTextFontSize != null) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(boundTextElement, {\n fontSize: boundTextFontSize,\n });\n }\n (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.handleBindTextResize)(element, transformHandleDirection);\n }\n};\nconst resizeMultipleElements = (pointerDownState, selectedElements, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {\n // map selected elements to the original elements. While it never should\n // happen that pointerDownState.originalElements won't contain the selected\n // elements during resize, this coupling isn't guaranteed, so to ensure\n // type safety we need to transform only those elements we filter.\n const targetElements = selectedElements.reduce((acc, element) => {\n const origElement = pointerDownState.originalElements.get(element.id);\n if (origElement) {\n acc.push({ orig: origElement, latest: element });\n }\n return acc;\n }, []);\n const { minX, minY, maxX, maxY, midX, midY } = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getCommonBoundingBox)(targetElements.map(({ orig }) => orig));\n const direction = transformHandleType;\n const mapDirectionsToAnchors = {\n ne: [minX, maxY],\n se: [minX, minY],\n sw: [maxX, minY],\n nw: [maxX, maxY],\n };\n // anchor point must be on the opposite side of the dragged selection handle\n // or be the center of the selection if alt is pressed\n const [anchorX, anchorY] = shouldResizeFromCenter\n ? [midX, midY]\n : mapDirectionsToAnchors[direction];\n const mapDirectionsToPointerSides = {\n ne: [pointerX >= anchorX, pointerY <= anchorY],\n se: [pointerX >= anchorX, pointerY >= anchorY],\n sw: [pointerX <= anchorX, pointerY >= anchorY],\n nw: [pointerX <= anchorX, pointerY <= anchorY],\n };\n // pointer side relative to anchor\n const [pointerSideX, pointerSideY] = mapDirectionsToPointerSides[direction].map((condition) => (condition ? 1 : -1));\n // stop resizing if a pointer is on the other side of selection\n if (pointerSideX < 0 && pointerSideY < 0) {\n return;\n }\n const scale = Math.max((pointerSideX * Math.abs(pointerX - anchorX)) / (maxX - minX), (pointerSideY * Math.abs(pointerY - anchorY)) / (maxY - minY)) * (shouldResizeFromCenter ? 2 : 1);\n if (scale === 0) {\n return;\n }\n targetElements.forEach((element) => {\n const width = element.orig.width * scale;\n const height = element.orig.height * scale;\n const x = anchorX + (element.orig.x - anchorX) * scale;\n const y = anchorY + (element.orig.y - anchorY) * scale;\n // readjust points for linear & free draw elements\n const rescaledPoints = rescalePointsInElement(element.orig, width, height, false);\n const update = Object.assign({ width,\n height,\n x,\n y }, rescaledPoints);\n let boundTextUpdates = null;\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element.latest);\n if (boundTextElement || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element.orig)) {\n const updatedElement = Object.assign(Object.assign({}, element.latest), { width,\n height });\n const fontSize = measureFontSizeFromWidth(boundTextElement !== null && boundTextElement !== void 0 ? boundTextElement : element.orig, boundTextElement\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(updatedElement)\n : updatedElement.width);\n if (!fontSize) {\n return;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element.orig)) {\n update.fontSize = fontSize;\n }\n if (boundTextElement) {\n boundTextUpdates = {\n fontSize,\n };\n }\n }\n (0,_binding__WEBPACK_IMPORTED_MODULE_7__.updateBoundElements)(element.latest, { newSize: { width, height } });\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element.latest, update);\n if (boundTextElement && boundTextUpdates) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(boundTextElement, boundTextUpdates);\n (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.handleBindTextResize)(element.latest, transformHandleType);\n }\n });\n};\nconst rotateMultipleElements = (pointerDownState, elements, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY) => {\n let centerAngle = (5 * Math.PI) / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);\n if (shouldRotateWithDiscreteAngle) {\n centerAngle += _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE / 2;\n centerAngle -= centerAngle % _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE;\n }\n elements.forEach((element) => {\n var _a, _b, _c;\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const origAngle = (_b = (_a = pointerDownState.originalElements.get(element.id)) === null || _a === void 0 ? void 0 : _a.angle) !== null && _b !== void 0 ? _b : element.angle;\n const [rotatedCX, rotatedCY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(cx, cy, centerX, centerY, centerAngle + origAngle - element.angle);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n x: element.x + (rotatedCX - cx),\n y: element.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElementId)(element);\n if (boundTextElementId) {\n const textElement = (_c = _scene_Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(element)) === null || _c === void 0 ? void 0 : _c.getElement(boundTextElementId);\n if (textElement && !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isArrowElement)(element)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(textElement, {\n x: textElement.x + (rotatedCX - cx),\n y: textElement.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n }\n }\n });\n};\nconst getResizeOffsetXY = (transformHandleType, selectedElements, x, y) => {\n const [x1, y1, x2, y2] = selectedElements.length === 1\n ? (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(selectedElements[0])\n : (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getCommonBounds)(selectedElements);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const angle = selectedElements.length === 1 ? selectedElements[0].angle : 0;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x, y, cx, cy, -angle);\n switch (transformHandleType) {\n case \"n\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - (x1 + x2) / 2, y - y1, 0, 0, angle);\n case \"s\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - (x1 + x2) / 2, y - y2, 0, 0, angle);\n case \"w\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - (y1 + y2) / 2, 0, 0, angle);\n case \"e\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - (y1 + y2) / 2, 0, 0, angle);\n case \"nw\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - y1, 0, 0, angle);\n case \"ne\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - y1, 0, 0, angle);\n case \"sw\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - y2, 0, 0, angle);\n case \"se\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - y2, 0, 0, angle);\n default:\n return [0, 0];\n }\n};\nconst getResizeArrowDirection = (transformHandleType, element) => {\n const [, [px, py]] = element.points;\n const isResizeEnd = (transformHandleType === \"nw\" && (px < 0 || py < 0)) ||\n (transformHandleType === \"ne\" && px >= 0) ||\n (transformHandleType === \"sw\" && px <= 0) ||\n (transformHandleType === \"se\" && (px > 0 || py > 0));\n return isResizeEnd ? \"end\" : \"origin\";\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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ekMsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUN4QyxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9yZXNpemVFbGVtZW50cy50cz9jYThlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNISUZUX0xPQ0tJTkdfQU5HTEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZXNjYWxlUG9pbnRzIH0gZnJvbSBcIi4uL3BvaW50c1wiO1xuXG5pbXBvcnQge1xuICByb3RhdGUsXG4gIGFkanVzdFhZV2l0aFJvdGF0aW9uLFxuICBjZW50ZXJQb2ludCxcbiAgcm90YXRlUG9pbnQsXG59IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLFxuICBnZXRDb21tb25Cb3VuZHMsXG4gIGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMsXG4gIGdldENvbW1vbkJvdW5kaW5nQm94LFxufSBmcm9tIFwiLi9ib3VuZHNcIjtcbmltcG9ydCB7XG4gIGlzQXJyb3dFbGVtZW50LFxuICBpc0JvdW5kVG9Db250YWluZXIsXG4gIGlzRnJlZURyYXdFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnQsXG4gIGlzVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyB1cGRhdGVCb3VuZEVsZW1lbnRzIH0gZnJvbSBcIi4vYmluZGluZ1wiO1xuaW1wb3J0IHtcbiAgVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBUcmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24sXG59IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCB7IFBvaW50LCBQb2ludGVyRG93blN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQge1xuICBnZXRBcHByb3hNaW5MaW5lV2lkdGgsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgaGFuZGxlQmluZFRleHRSZXNpemUsXG4gIGdldE1heENvbnRhaW5lcldpZHRoLFxuICBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0LFxufSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplQW5nbGUgPSAoYW5nbGU6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGlmIChhbmdsZSA+PSAyICogTWF0aC5QSSkge1xuICAgIHJldHVybiBhbmdsZSAtIDIgKiBNYXRoLlBJO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG5cbi8vIFJldHVybnMgdHJ1ZSB3aGVuIHRyYW5zZm9ybSAocmVzaXppbmcvcm90YXRpb24pIGhhcHBlbmVkXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRWxlbWVudHMgPSAoXG4gIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgc2VsZWN0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIHJlc2l6ZUFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiIHwgXCJlbmRcIixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIHNob3VsZFJlc2l6ZUZyb21DZW50ZXI6IGJvb2xlYW4sXG4gIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW86IGJvb2xlYW4sXG4gIHBvaW50ZXJYOiBudW1iZXIsXG4gIHBvaW50ZXJZOiBudW1iZXIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IFtlbGVtZW50XSA9IHNlbGVjdGVkRWxlbWVudHM7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIikge1xuICAgICAgcm90YXRlU2luZ2xlRWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5hbEVsZW1lbnRzLFxuICAgICAgKTtcbiAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuZVwiIHx8XG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic3dcIiB8fFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInNlXCIpXG4gICAgKSB7XG4gICAgICByZXNpemVTaW5nbGVUZXh0RWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcixcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgKTtcbiAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICByZXNpemVTaW5nbGVFbGVtZW50KFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbmFsRWxlbWVudHMsXG4gICAgICAgIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8sXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIsXG4gICAgICAgIHBvaW50ZXJYLFxuICAgICAgICBwb2ludGVyWSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIikge1xuICAgICAgcm90YXRlTXVsdGlwbGVFbGVtZW50cyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgICAgICAgY2VudGVyWCxcbiAgICAgICAgY2VudGVyWSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJud1wiIHx8XG4gICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic3dcIiB8fFxuICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzZVwiXG4gICAgKSB7XG4gICAgICByZXNpemVNdWx0aXBsZUVsZW1lbnRzKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyLFxuICAgICAgICBwb2ludGVyWCxcbiAgICAgICAgcG9pbnRlclksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IHJvdGF0ZVNpbmdsZUVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgcG9pbnRlclg6IG51bWJlcixcbiAgcG9pbnRlclk6IG51bWJlcixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIG9yaWdpbmFsRWxlbWVudHM6IE1hcDxzdHJpbmcsIE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+PixcbikgPT4ge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgbGV0IGFuZ2xlID0gKDUgKiBNYXRoLlBJKSAvIDIgKyBNYXRoLmF0YW4yKHBvaW50ZXJZIC0gY3ksIHBvaW50ZXJYIC0gY3gpO1xuICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUpIHtcbiAgICBhbmdsZSArPSBTSElGVF9MT0NLSU5HX0FOR0xFIC8gMjtcbiAgICBhbmdsZSAtPSBhbmdsZSAlIFNISUZUX0xPQ0tJTkdfQU5HTEU7XG4gIH1cbiAgYW5nbGUgPSBub3JtYWxpemVBbmdsZShhbmdsZSk7XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcblxuICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHsgYW5nbGUgfSk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICBjb25zdCB0ZXh0RWxlbWVudCA9XG4gICAgICBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudDxFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyPihcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKTtcblxuICAgIGlmICh0ZXh0RWxlbWVudCAmJiAhaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHsgYW5nbGUgfSk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCByZXNjYWxlUG9pbnRzSW5FbGVtZW50ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBub3JtYWxpemVQb2ludHM6IGJvb2xlYW4sXG4pID0+XG4gIGlzTGluZWFyRWxlbWVudChlbGVtZW50KSB8fCBpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KVxuICAgID8ge1xuICAgICAgICBwb2ludHM6IHJlc2NhbGVQb2ludHMoXG4gICAgICAgICAgMCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICByZXNjYWxlUG9pbnRzKDEsIGhlaWdodCwgZWxlbWVudC5wb2ludHMsIG5vcm1hbGl6ZVBvaW50cyksXG4gICAgICAgICAgbm9ybWFsaXplUG9pbnRzLFxuICAgICAgICApLFxuICAgICAgfVxuICAgIDoge307XG5cbmNvbnN0IE1JTl9GT05UX1NJWkUgPSAxO1xuXG5jb25zdCBtZWFzdXJlRm9udFNpemVGcm9tV2lkdGggPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PixcbiAgbmV4dFdpZHRoOiBudW1iZXIsXG4pOiBudW1iZXIgfCBudWxsID0+IHtcbiAgLy8gV2Ugb25seSB1c2Ugd2lkdGggdG8gc2NhbGUgZm9udCBvbiByZXNpemVcbiAgbGV0IHdpZHRoID0gZWxlbWVudC53aWR0aDtcblxuICBjb25zdCBoYXNDb250YWluZXIgPSBpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCk7XG4gIGlmIChoYXNDb250YWluZXIpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbmV4dEZvbnRTaXplID0gZWxlbWVudC5mb250U2l6ZSAqIChuZXh0V2lkdGggLyB3aWR0aCk7XG4gIGlmIChuZXh0Rm9udFNpemUgPCBNSU5fRk9OVF9TSVpFKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gbmV4dEZvbnRTaXplO1xufTtcblxuY29uc3QgZ2V0U2lkZXNGb3JUcmFuc2Zvcm1IYW5kbGUgPSAoXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IFRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gIHNob3VsZFJlc2l6ZUZyb21DZW50ZXI6IGJvb2xlYW4sXG4pID0+IHtcbiAgcmV0dXJuIHtcbiAgICBuOlxuICAgICAgL14obnxuZXxudykkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpIHx8XG4gICAgICAoc2hvdWxkUmVzaXplRnJvbUNlbnRlciAmJiAvXihzfHNlfHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkpLFxuICAgIHM6XG4gICAgICAvXihzfHNlfHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkgfHxcbiAgICAgIChzaG91bGRSZXNpemVGcm9tQ2VudGVyICYmIC9eKG58bmV8bncpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSksXG4gICAgdzpcbiAgICAgIC9eKHd8bnd8c3cpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB8fFxuICAgICAgKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgJiYgL14oZXxuZXxzZSkkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpKSxcbiAgICBlOlxuICAgICAgL14oZXxuZXxzZSkkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpIHx8XG4gICAgICAoc2hvdWxkUmVzaXplRnJvbUNlbnRlciAmJiAvXih3fG53fHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkpLFxuICB9O1xufTtcblxuY29uc3QgcmVzaXplU2luZ2xlVGV4dEVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PixcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogXCJud1wiIHwgXCJuZVwiIHwgXCJzd1wiIHwgXCJzZVwiLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMjtcbiAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAvLyByb3RhdGlvbiBwb2ludGVyIHdpdGggcmV2ZXJzZSBhbmdsZVxuICBjb25zdCBbcm90YXRlZFgsIHJvdGF0ZWRZXSA9IHJvdGF0ZShcbiAgICBwb2ludGVyWCxcbiAgICBwb2ludGVyWSxcbiAgICBjeCxcbiAgICBjeSxcbiAgICAtZWxlbWVudC5hbmdsZSxcbiAgKTtcbiAgbGV0IHNjYWxlOiBudW1iZXI7XG4gIHN3aXRjaCAodHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgIGNhc2UgXCJzZVwiOlxuICAgICAgc2NhbGUgPSBNYXRoLm1heChcbiAgICAgICAgKHJvdGF0ZWRYIC0geDEpIC8gKHgyIC0geDEpLFxuICAgICAgICAocm90YXRlZFkgLSB5MSkgLyAoeTIgLSB5MSksXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm53XCI6XG4gICAgICBzY2FsZSA9IE1hdGgubWF4KFxuICAgICAgICAoeDIgLSByb3RhdGVkWCkgLyAoeDIgLSB4MSksXG4gICAgICAgICh5MiAtIHJvdGF0ZWRZKSAvICh5MiAtIHkxKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwibmVcIjpcbiAgICAgIHNjYWxlID0gTWF0aC5tYXgoXG4gICAgICAgIChyb3RhdGVkWCAtIHgxKSAvICh4MiAtIHgxKSxcbiAgICAgICAgKHkyIC0gcm90YXRlZFkpIC8gKHkyIC0geTEpLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJzd1wiOlxuICAgICAgc2NhbGUgPSBNYXRoLm1heChcbiAgICAgICAgKHgyIC0gcm90YXRlZFgpIC8gKHgyIC0geDEpLFxuICAgICAgICAocm90YXRlZFkgLSB5MSkgLyAoeTIgLSB5MSksXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKHNjYWxlID4gMCkge1xuICAgIGNvbnN0IG5leHRXaWR0aCA9IGVsZW1lbnQud2lkdGggKiBzY2FsZTtcbiAgICBjb25zdCBuZXh0SGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQgKiBzY2FsZTtcbiAgICBjb25zdCBuZXh0Rm9udFNpemUgPSBtZWFzdXJlRm9udFNpemVGcm9tV2lkdGgoZWxlbWVudCwgbmV4dFdpZHRoKTtcbiAgICBpZiAobmV4dEZvbnRTaXplID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtuZXh0WDEsIG5leHRZMSwgbmV4dFgyLCBuZXh0WTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBuZXh0V2lkdGgsXG4gICAgICBuZXh0SGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBjb25zdCBkZWx0YVgxID0gKHgxIC0gbmV4dFgxKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMSA9ICh5MSAtIG5leHRZMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWDIgPSAoeDIgLSBuZXh0WDIpIC8gMjtcbiAgICBjb25zdCBkZWx0YVkyID0gKHkyIC0gbmV4dFkyKSAvIDI7XG4gICAgY29uc3QgW25leHRFbGVtZW50WCwgbmV4dEVsZW1lbnRZXSA9IGFkanVzdFhZV2l0aFJvdGF0aW9uKFxuICAgICAgZ2V0U2lkZXNGb3JUcmFuc2Zvcm1IYW5kbGUodHJhbnNmb3JtSGFuZGxlVHlwZSwgc2hvdWxkUmVzaXplRnJvbUNlbnRlciksXG4gICAgICBlbGVtZW50LngsXG4gICAgICBlbGVtZW50LnksXG4gICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgZGVsdGFYMSxcbiAgICAgIGRlbHRhWTEsXG4gICAgICBkZWx0YVgyLFxuICAgICAgZGVsdGFZMixcbiAgICApO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgZm9udFNpemU6IG5leHRGb250U2l6ZSxcbiAgICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgICB4OiBuZXh0RWxlbWVudFgsXG4gICAgICB5OiBuZXh0RWxlbWVudFksXG4gICAgfSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNpemVTaW5nbGVFbGVtZW50ID0gKFxuICBvcmlnaW5hbEVsZW1lbnRzOiBQb2ludGVyRG93blN0YXRlW1wib3JpZ2luYWxFbGVtZW50c1wiXSxcbiAgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbzogYm9vbGVhbixcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICB0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb246IFRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbixcbiAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcjogYm9vbGVhbixcbiAgcG9pbnRlclg6IG51bWJlcixcbiAgcG9pbnRlclk6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBzdGF0ZUF0UmVzaXplU3RhcnQgPSBvcmlnaW5hbEVsZW1lbnRzLmdldChlbGVtZW50LmlkKSE7XG4gIC8vIEdldHMgYm91bmRzIGNvcm5lcnNcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgc3RhdGVBdFJlc2l6ZVN0YXJ0LFxuICAgIHN0YXRlQXRSZXNpemVTdGFydC53aWR0aCxcbiAgICBzdGF0ZUF0UmVzaXplU3RhcnQuaGVpZ2h0LFxuICAgIHRydWUsXG4gICk7XG4gIGNvbnN0IHN0YXJ0VG9wTGVmdDogUG9pbnQgPSBbeDEsIHkxXTtcbiAgY29uc3Qgc3RhcnRCb3R0b21SaWdodDogUG9pbnQgPSBbeDIsIHkyXTtcbiAgY29uc3Qgc3RhcnRDZW50ZXI6IFBvaW50ID0gY2VudGVyUG9pbnQoc3RhcnRUb3BMZWZ0LCBzdGFydEJvdHRvbVJpZ2h0KTtcblxuICAvLyBDYWxjdWxhdGUgbmV3IGRpbWVuc2lvbnMgYmFzZWQgb24gY3Vyc29yIHBvc2l0aW9uXG4gIGNvbnN0IHJvdGF0ZWRQb2ludGVyID0gcm90YXRlUG9pbnQoXG4gICAgW3BvaW50ZXJYLCBwb2ludGVyWV0sXG4gICAgc3RhcnRDZW50ZXIsXG4gICAgLXN0YXRlQXRSZXNpemVTdGFydC5hbmdsZSxcbiAgKTtcblxuICAvLyBHZXQgYm91bmRzIGNvcm5lcnMgcmVuZGVyZWQgb24gc2NyZWVuXG4gIGNvbnN0IFtlc3gxLCBlc3kxLCBlc3gyLCBlc3kyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgZWxlbWVudCxcbiAgICBlbGVtZW50LndpZHRoLFxuICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgIHRydWUsXG4gICk7XG5cbiAgY29uc3QgYm91bmRzQ3VycmVudFdpZHRoID0gZXN4MiAtIGVzeDE7XG4gIGNvbnN0IGJvdW5kc0N1cnJlbnRIZWlnaHQgPSBlc3kyIC0gZXN5MTtcblxuICAvLyBJdCdzIGltcG9ydGFudCB3ZSBzZXQgdGhlIGluaXRpYWwgc2NhbGUgdmFsdWUgYmFzZWQgb24gdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXQgcmVzaXplIHN0YXJ0LFxuICAvLyBvdGhlcndpc2UgcHJldmlvdXMgZGltZW5zaW9ucyBhZmZlY3RlZCBieSBtb2RpZmllcnMgd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQuXG4gIGNvbnN0IGF0U3RhcnRCb3VuZHNXaWR0aCA9IHN0YXJ0Qm90dG9tUmlnaHRbMF0gLSBzdGFydFRvcExlZnRbMF07XG4gIGNvbnN0IGF0U3RhcnRCb3VuZHNIZWlnaHQgPSBzdGFydEJvdHRvbVJpZ2h0WzFdIC0gc3RhcnRUb3BMZWZ0WzFdO1xuICBsZXQgc2NhbGVYID0gYXRTdGFydEJvdW5kc1dpZHRoIC8gYm91bmRzQ3VycmVudFdpZHRoO1xuICBsZXQgc2NhbGVZID0gYXRTdGFydEJvdW5kc0hlaWdodCAvIGJvdW5kc0N1cnJlbnRIZWlnaHQ7XG5cbiAgbGV0IGJvdW5kVGV4dEZvbnRTaXplOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcImVcIikpIHtcbiAgICBzY2FsZVggPSAocm90YXRlZFBvaW50ZXJbMF0gLSBzdGFydFRvcExlZnRbMF0pIC8gYm91bmRzQ3VycmVudFdpZHRoO1xuICB9XG4gIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJzXCIpKSB7XG4gICAgc2NhbGVZID0gKHJvdGF0ZWRQb2ludGVyWzFdIC0gc3RhcnRUb3BMZWZ0WzFdKSAvIGJvdW5kc0N1cnJlbnRIZWlnaHQ7XG4gIH1cbiAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcIndcIikpIHtcbiAgICBzY2FsZVggPSAoc3RhcnRCb3R0b21SaWdodFswXSAtIHJvdGF0ZWRQb2ludGVyWzBdKSAvIGJvdW5kc0N1cnJlbnRXaWR0aDtcbiAgfVxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwiblwiKSkge1xuICAgIHNjYWxlWSA9IChzdGFydEJvdHRvbVJpZ2h0WzFdIC0gcm90YXRlZFBvaW50ZXJbMV0pIC8gYm91bmRzQ3VycmVudEhlaWdodDtcbiAgfVxuXG4gIC8vIExpbmVhciBlbGVtZW50cyBkaW1lbnNpb25zIGRpZmZlciBmcm9tIGJvdW5kcyBkaW1lbnNpb25zXG4gIGNvbnN0IGVsZUluaXRpYWxXaWR0aCA9IHN0YXRlQXRSZXNpemVTdGFydC53aWR0aDtcbiAgY29uc3QgZWxlSW5pdGlhbEhlaWdodCA9IHN0YXRlQXRSZXNpemVTdGFydC5oZWlnaHQ7XG4gIC8vIFdlIGhhdmUgdG8gdXNlIGRpbWVuc2lvbnMgb2YgZWxlbWVudCBvbiBzY3JlZW4sIG90aGVyd2lzZSB0aGUgc2NhbGluZyBvZiB0aGVcbiAgLy8gZGltZW5zaW9ucyB3b24ndCBtYXRjaCB0aGUgY3Vyc29yIGZvciBsaW5lYXIgZWxlbWVudHMuXG4gIGxldCBlbGVOZXdXaWR0aCA9IGVsZW1lbnQud2lkdGggKiBzY2FsZVg7XG4gIGxldCBlbGVOZXdIZWlnaHQgPSBlbGVtZW50LmhlaWdodCAqIHNjYWxlWTtcblxuICAvLyBhZGp1c3QgZGltZW5zaW9ucyBmb3IgcmVzaXppbmcgZnJvbSBjZW50ZXJcbiAgaWYgKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIpIHtcbiAgICBlbGVOZXdXaWR0aCA9IDIgKiBlbGVOZXdXaWR0aCAtIGVsZUluaXRpYWxXaWR0aDtcbiAgICBlbGVOZXdIZWlnaHQgPSAyICogZWxlTmV3SGVpZ2h0IC0gZWxlSW5pdGlhbEhlaWdodDtcbiAgfVxuXG4gIC8vIGFkanVzdCBkaW1lbnNpb25zIHRvIGtlZXAgc2lkZXMgcmF0aW9cbiAgaWYgKHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICBjb25zdCB3aWR0aFJhdGlvID0gTWF0aC5hYnMoZWxlTmV3V2lkdGgpIC8gZWxlSW5pdGlhbFdpZHRoO1xuICAgIGNvbnN0IGhlaWdodFJhdGlvID0gTWF0aC5hYnMoZWxlTmV3SGVpZ2h0KSAvIGVsZUluaXRpYWxIZWlnaHQ7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVsZU5ld0hlaWdodCAqPSB3aWR0aFJhdGlvO1xuICAgICAgZWxlTmV3V2lkdGggKj0gaGVpZ2h0UmF0aW87XG4gICAgfVxuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCByYXRpbyA9IE1hdGgubWF4KHdpZHRoUmF0aW8sIGhlaWdodFJhdGlvKTtcbiAgICAgIGVsZU5ld1dpZHRoID0gZWxlSW5pdGlhbFdpZHRoICogcmF0aW8gKiBNYXRoLnNpZ24oZWxlTmV3V2lkdGgpO1xuICAgICAgZWxlTmV3SGVpZ2h0ID0gZWxlSW5pdGlhbEhlaWdodCAqIHJhdGlvICogTWF0aC5zaWduKGVsZU5ld0hlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICBjb25zdCBzdGF0ZU9mQm91bmRUZXh0RWxlbWVudEF0UmVzaXplID0gb3JpZ2luYWxFbGVtZW50cy5nZXQoXG4gICAgICBib3VuZFRleHRFbGVtZW50LmlkLFxuICAgICkgYXMgdHlwZW9mIGJvdW5kVGV4dEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXRlT2ZCb3VuZFRleHRFbGVtZW50QXRSZXNpemUpIHtcbiAgICAgIGJvdW5kVGV4dEZvbnRTaXplID0gc3RhdGVPZkJvdW5kVGV4dEVsZW1lbnRBdFJlc2l6ZS5mb250U2l6ZTtcbiAgICB9XG4gICAgaWYgKHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0ge1xuICAgICAgICAuLi5lbGVtZW50LFxuICAgICAgICB3aWR0aDogZWxlTmV3V2lkdGgsXG4gICAgICAgIGhlaWdodDogZWxlTmV3SGVpZ2h0LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbmV4dEZvbnRTaXplID0gbWVhc3VyZUZvbnRTaXplRnJvbVdpZHRoKFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICAgICBnZXRNYXhDb250YWluZXJXaWR0aCh1cGRhdGVkRWxlbWVudCksXG4gICAgICApO1xuICAgICAgaWYgKG5leHRGb250U2l6ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBib3VuZFRleHRGb250U2l6ZSA9IG5leHRGb250U2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWluV2lkdGggPSBnZXRBcHByb3hNaW5MaW5lV2lkdGgoXG4gICAgICAgIGdldEZvbnRTdHJpbmcoYm91bmRUZXh0RWxlbWVudCksXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnQubGluZUhlaWdodCxcbiAgICAgICk7XG4gICAgICBjb25zdCBtaW5IZWlnaHQgPSBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0KFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LmZvbnRTaXplLFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICApO1xuICAgICAgZWxlTmV3V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoZWxlTmV3V2lkdGgsIG1pbldpZHRoKSk7XG4gICAgICBlbGVOZXdIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoZWxlTmV3SGVpZ2h0LCBtaW5IZWlnaHQpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBbbmV3Qm91bmRzWDEsIG5ld0JvdW5kc1kxLCBuZXdCb3VuZHNYMiwgbmV3Qm91bmRzWTJdID1cbiAgICBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzKFxuICAgICAgc3RhdGVBdFJlc2l6ZVN0YXJ0LFxuICAgICAgZWxlTmV3V2lkdGgsXG4gICAgICBlbGVOZXdIZWlnaHQsXG4gICAgICB0cnVlLFxuICAgICk7XG4gIGNvbnN0IG5ld0JvdW5kc1dpZHRoID0gbmV3Qm91bmRzWDIgLSBuZXdCb3VuZHNYMTtcbiAgY29uc3QgbmV3Qm91bmRzSGVpZ2h0ID0gbmV3Qm91bmRzWTIgLSBuZXdCb3VuZHNZMTtcblxuICAvLyBDYWxjdWxhdGUgbmV3IHRvcExlZnQgYmFzZWQgb24gZml4ZWQgY29ybmVyIGR1cmluZyByZXNpemVcbiAgbGV0IG5ld1RvcExlZnQgPSBbLi4uc3RhcnRUb3BMZWZ0XSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICBpZiAoW1wiblwiLCBcIndcIiwgXCJud1wiXS5pbmNsdWRlcyh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24pKSB7XG4gICAgbmV3VG9wTGVmdCA9IFtcbiAgICAgIHN0YXJ0Qm90dG9tUmlnaHRbMF0gLSBNYXRoLmFicyhuZXdCb3VuZHNXaWR0aCksXG4gICAgICBzdGFydEJvdHRvbVJpZ2h0WzFdIC0gTWF0aC5hYnMobmV3Qm91bmRzSGVpZ2h0KSxcbiAgICBdO1xuICB9XG4gIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24gPT09IFwibmVcIikge1xuICAgIGNvbnN0IGJvdHRvbUxlZnQgPSBbc3RhcnRUb3BMZWZ0WzBdLCBzdGFydEJvdHRvbVJpZ2h0WzFdXTtcbiAgICBuZXdUb3BMZWZ0ID0gW2JvdHRvbUxlZnRbMF0sIGJvdHRvbUxlZnRbMV0gLSBNYXRoLmFicyhuZXdCb3VuZHNIZWlnaHQpXTtcbiAgfVxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uID09PSBcInN3XCIpIHtcbiAgICBjb25zdCB0b3BSaWdodCA9IFtzdGFydEJvdHRvbVJpZ2h0WzBdLCBzdGFydFRvcExlZnRbMV1dO1xuICAgIG5ld1RvcExlZnQgPSBbdG9wUmlnaHRbMF0gLSBNYXRoLmFicyhuZXdCb3VuZHNXaWR0aCksIHRvcFJpZ2h0WzFdXTtcbiAgfVxuXG4gIC8vIEtlZXBzIG9wcG9zaXRlIGhhbmRsZSBmaXhlZCBkdXJpbmcgcmVzaXplXG4gIGlmIChzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgaWYgKFtcInNcIiwgXCJuXCJdLmluY2x1ZGVzKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbikpIHtcbiAgICAgIG5ld1RvcExlZnRbMF0gPSBzdGFydENlbnRlclswXSAtIG5ld0JvdW5kc1dpZHRoIC8gMjtcbiAgICB9XG4gICAgaWYgKFtcImVcIiwgXCJ3XCJdLmluY2x1ZGVzKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbikpIHtcbiAgICAgIG5ld1RvcExlZnRbMV0gPSBzdGFydENlbnRlclsxXSAtIG5ld0JvdW5kc0hlaWdodCAvIDI7XG4gICAgfVxuICB9XG5cbiAgLy8gRmxpcCBob3Jpem9udGFsbHlcbiAgaWYgKGVsZU5ld1dpZHRoIDwgMCkge1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJlXCIpKSB7XG4gICAgICBuZXdUb3BMZWZ0WzBdIC09IE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKTtcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcIndcIikpIHtcbiAgICAgIG5ld1RvcExlZnRbMF0gKz0gTWF0aC5hYnMobmV3Qm91bmRzV2lkdGgpO1xuICAgIH1cbiAgfVxuICAvLyBGbGlwIHZlcnRpY2FsbHlcbiAgaWYgKGVsZU5ld0hlaWdodCA8IDApIHtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwic1wiKSkge1xuICAgICAgbmV3VG9wTGVmdFsxXSAtPSBNYXRoLmFicyhuZXdCb3VuZHNIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwiblwiKSkge1xuICAgICAgbmV3VG9wTGVmdFsxXSArPSBNYXRoLmFicyhuZXdCb3VuZHNIZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSZXNpemVGcm9tQ2VudGVyKSB7XG4gICAgbmV3VG9wTGVmdFswXSA9IHN0YXJ0Q2VudGVyWzBdIC0gTWF0aC5hYnMobmV3Qm91bmRzV2lkdGgpIC8gMjtcbiAgICBuZXdUb3BMZWZ0WzFdID0gc3RhcnRDZW50ZXJbMV0gLSBNYXRoLmFicyhuZXdCb3VuZHNIZWlnaHQpIC8gMjtcbiAgfVxuXG4gIC8vIGFkanVzdCB0b3BMZWZ0IHRvIG5ldyByb3RhdGlvbiBwb2ludFxuICBjb25zdCBhbmdsZSA9IHN0YXRlQXRSZXNpemVTdGFydC5hbmdsZTtcbiAgY29uc3Qgcm90YXRlZFRvcExlZnQgPSByb3RhdGVQb2ludChuZXdUb3BMZWZ0LCBzdGFydENlbnRlciwgYW5nbGUpO1xuICBjb25zdCBuZXdDZW50ZXI6IFBvaW50ID0gW1xuICAgIG5ld1RvcExlZnRbMF0gKyBNYXRoLmFicyhuZXdCb3VuZHNXaWR0aCkgLyAyLFxuICAgIG5ld1RvcExlZnRbMV0gKyBNYXRoLmFicyhuZXdCb3VuZHNIZWlnaHQpIC8gMixcbiAgXTtcbiAgY29uc3Qgcm90YXRlZE5ld0NlbnRlciA9IHJvdGF0ZVBvaW50KG5ld0NlbnRlciwgc3RhcnRDZW50ZXIsIGFuZ2xlKTtcbiAgbmV3VG9wTGVmdCA9IHJvdGF0ZVBvaW50KHJvdGF0ZWRUb3BMZWZ0LCByb3RhdGVkTmV3Q2VudGVyLCAtYW5nbGUpO1xuXG4gIC8vIFJlYWRqdXN0IHBvaW50cyBmb3IgbGluZWFyIGVsZW1lbnRzXG4gIGxldCByZXNjYWxlZEVsZW1lbnRQb2ludHNZO1xuICBsZXQgcmVzY2FsZWRQb2ludHM7XG5cbiAgaWYgKGlzTGluZWFyRWxlbWVudChlbGVtZW50KSB8fCBpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIHJlc2NhbGVkRWxlbWVudFBvaW50c1kgPSByZXNjYWxlUG9pbnRzKFxuICAgICAgMSxcbiAgICAgIGVsZU5ld0hlaWdodCxcbiAgICAgIChzdGF0ZUF0UmVzaXplU3RhcnQgYXMgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQpLnBvaW50cyxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIHJlc2NhbGVkUG9pbnRzID0gcmVzY2FsZVBvaW50cyhcbiAgICAgIDAsXG4gICAgICBlbGVOZXdXaWR0aCxcbiAgICAgIHJlc2NhbGVkRWxlbWVudFBvaW50c1ksXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH1cblxuICAvLyBGb3IgbGluZWFyIGVsZW1lbnRzICh4LHkpIGFyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IGRyYXduIHBvaW50IG5vdCB0aGUgdG9wLWxlZnQgY29ybmVyXG4gIC8vIFNvIHdlIG5lZWQgdG8gcmVhZGp1c3QgKHgseSkgdG8gYmUgd2hlcmUgdGhlIGZpcnN0IHBvaW50IHNob3VsZCBiZVxuICBjb25zdCBuZXdPcmlnaW4gPSBbLi4ubmV3VG9wTGVmdF07XG4gIG5ld09yaWdpblswXSArPSBzdGF0ZUF0UmVzaXplU3RhcnQueCAtIG5ld0JvdW5kc1gxO1xuICBuZXdPcmlnaW5bMV0gKz0gc3RhdGVBdFJlc2l6ZVN0YXJ0LnkgLSBuZXdCb3VuZHNZMTtcbiAgY29uc3QgcmVzaXplZEVsZW1lbnQgPSB7XG4gICAgd2lkdGg6IE1hdGguYWJzKGVsZU5ld1dpZHRoKSxcbiAgICBoZWlnaHQ6IE1hdGguYWJzKGVsZU5ld0hlaWdodCksXG4gICAgeDogbmV3T3JpZ2luWzBdLFxuICAgIHk6IG5ld09yaWdpblsxXSxcbiAgICBwb2ludHM6IHJlc2NhbGVkUG9pbnRzLFxuICB9O1xuXG4gIGlmIChcInNjYWxlXCIgaW4gZWxlbWVudCAmJiBcInNjYWxlXCIgaW4gc3RhdGVBdFJlc2l6ZVN0YXJ0KSB7XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBzY2FsZTogW1xuICAgICAgICAvLyBkZWZhdWx0aW5nIGJlY2F1c2Ugc2NhbGVYL1kgY2FuIGJlIDAvLTBcbiAgICAgICAgKE1hdGguc2lnbihuZXdCb3VuZHNYMiAtIHN0YXRlQXRSZXNpemVTdGFydC54KSB8fFxuICAgICAgICAgIHN0YXRlQXRSZXNpemVTdGFydC5zY2FsZVswXSkgKiBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMF0sXG4gICAgICAgIChNYXRoLnNpZ24obmV3Qm91bmRzWTIgLSBzdGF0ZUF0UmVzaXplU3RhcnQueSkgfHxcbiAgICAgICAgICBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMV0pICogc3RhdGVBdFJlc2l6ZVN0YXJ0LnNjYWxlWzFdLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChcbiAgICByZXNpemVkRWxlbWVudC53aWR0aCAhPT0gMCAmJlxuICAgIHJlc2l6ZWRFbGVtZW50LmhlaWdodCAhPT0gMCAmJlxuICAgIE51bWJlci5pc0Zpbml0ZShyZXNpemVkRWxlbWVudC54KSAmJlxuICAgIE51bWJlci5pc0Zpbml0ZShyZXNpemVkRWxlbWVudC55KVxuICApIHtcbiAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQsIHtcbiAgICAgIG5ld1NpemU6IHsgd2lkdGg6IHJlc2l6ZWRFbGVtZW50LndpZHRoLCBoZWlnaHQ6IHJlc2l6ZWRFbGVtZW50LmhlaWdodCB9LFxuICAgIH0pO1xuXG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCByZXNpemVkRWxlbWVudCk7XG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQgJiYgYm91bmRUZXh0Rm9udFNpemUgIT0gbnVsbCkge1xuICAgICAgbXV0YXRlRWxlbWVudChib3VuZFRleHRFbGVtZW50LCB7XG4gICAgICAgIGZvbnRTaXplOiBib3VuZFRleHRGb250U2l6ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVCaW5kVGV4dFJlc2l6ZShlbGVtZW50LCB0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24pO1xuICB9XG59O1xuXG5jb25zdCByZXNpemVNdWx0aXBsZUVsZW1lbnRzID0gKFxuICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICBzZWxlY3RlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogXCJud1wiIHwgXCJuZVwiIHwgXCJzd1wiIHwgXCJzZVwiLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIC8vIG1hcCBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgb3JpZ2luYWwgZWxlbWVudHMuIFdoaWxlIGl0IG5ldmVyIHNob3VsZFxuICAvLyBoYXBwZW4gdGhhdCBwb2ludGVyRG93blN0YXRlLm9yaWdpbmFsRWxlbWVudHMgd29uJ3QgY29udGFpbiB0aGUgc2VsZWN0ZWRcbiAgLy8gZWxlbWVudHMgZHVyaW5nIHJlc2l6ZSwgdGhpcyBjb3VwbGluZyBpc24ndCBndWFyYW50ZWVkLCBzbyB0byBlbnN1cmVcbiAgLy8gdHlwZSBzYWZldHkgd2UgbmVlZCB0byB0cmFuc2Zvcm0gb25seSB0aG9zZSBlbGVtZW50cyB3ZSBmaWx0ZXIuXG4gIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gc2VsZWN0ZWRFbGVtZW50cy5yZWR1Y2UoXG4gICAgKFxuICAgICAgYWNjOiB7XG4gICAgICAgIC8qKiBlbGVtZW50IGF0IHJlc2l6ZSBzdGFydCAqL1xuICAgICAgICBvcmlnOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQ7XG4gICAgICAgIC8qKiBsYXRlc3QgZWxlbWVudCAqL1xuICAgICAgICBsYXRlc3Q6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudDtcbiAgICAgIH1bXSxcbiAgICAgIGVsZW1lbnQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmlnRWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luYWxFbGVtZW50cy5nZXQoZWxlbWVudC5pZCk7XG4gICAgICBpZiAob3JpZ0VsZW1lbnQpIHtcbiAgICAgICAgYWNjLnB1c2goeyBvcmlnOiBvcmlnRWxlbWVudCwgbGF0ZXN0OiBlbGVtZW50IH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbWlkWCwgbWlkWSB9ID0gZ2V0Q29tbW9uQm91bmRpbmdCb3goXG4gICAgdGFyZ2V0RWxlbWVudHMubWFwKCh7IG9yaWcgfSkgPT4gb3JpZyksXG4gICk7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHRyYW5zZm9ybUhhbmRsZVR5cGU7XG5cbiAgY29uc3QgbWFwRGlyZWN0aW9uc1RvQW5jaG9yczogUmVjb3JkPHR5cGVvZiBkaXJlY3Rpb24sIFBvaW50PiA9IHtcbiAgICBuZTogW21pblgsIG1heFldLFxuICAgIHNlOiBbbWluWCwgbWluWV0sXG4gICAgc3c6IFttYXhYLCBtaW5ZXSxcbiAgICBudzogW21heFgsIG1heFldLFxuICB9O1xuXG4gIC8vIGFuY2hvciBwb2ludCBtdXN0IGJlIG9uIHRoZSBvcHBvc2l0ZSBzaWRlIG9mIHRoZSBkcmFnZ2VkIHNlbGVjdGlvbiBoYW5kbGVcbiAgLy8gb3IgYmUgdGhlIGNlbnRlciBvZiB0aGUgc2VsZWN0aW9uIGlmIGFsdCBpcyBwcmVzc2VkXG4gIGNvbnN0IFthbmNob3JYLCBhbmNob3JZXTogUG9pbnQgPSBzaG91bGRSZXNpemVGcm9tQ2VudGVyXG4gICAgPyBbbWlkWCwgbWlkWV1cbiAgICA6IG1hcERpcmVjdGlvbnNUb0FuY2hvcnNbZGlyZWN0aW9uXTtcblxuICBjb25zdCBtYXBEaXJlY3Rpb25zVG9Qb2ludGVyU2lkZXM6IFJlY29yZDxcbiAgICB0eXBlb2YgZGlyZWN0aW9uLFxuICAgIFt4OiBib29sZWFuLCB5OiBib29sZWFuXVxuICA+ID0ge1xuICAgIG5lOiBbcG9pbnRlclggPj0gYW5jaG9yWCwgcG9pbnRlclkgPD0gYW5jaG9yWV0sXG4gICAgc2U6IFtwb2ludGVyWCA+PSBhbmNob3JYLCBwb2ludGVyWSA+PSBhbmNob3JZXSxcbiAgICBzdzogW3BvaW50ZXJYIDw9IGFuY2hvclgsIHBvaW50ZXJZID49IGFuY2hvclldLFxuICAgIG53OiBbcG9pbnRlclggPD0gYW5jaG9yWCwgcG9pbnRlclkgPD0gYW5jaG9yWV0sXG4gIH07XG5cbiAgLy8gcG9pbnRlciBzaWRlIHJlbGF0aXZlIHRvIGFuY2hvclxuICBjb25zdCBbcG9pbnRlclNpZGVYLCBwb2ludGVyU2lkZVldID0gbWFwRGlyZWN0aW9uc1RvUG9pbnRlclNpZGVzW1xuICAgIGRpcmVjdGlvblxuICBdLm1hcCgoY29uZGl0aW9uKSA9PiAoY29uZGl0aW9uID8gMSA6IC0xKSk7XG5cbiAgLy8gc3RvcCByZXNpemluZyBpZiBhIHBvaW50ZXIgaXMgb24gdGhlIG90aGVyIHNpZGUgb2Ygc2VsZWN0aW9uXG4gIGlmIChwb2ludGVyU2lkZVggPCAwICYmIHBvaW50ZXJTaWRlWSA8IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzY2FsZSA9XG4gICAgTWF0aC5tYXgoXG4gICAgICAocG9pbnRlclNpZGVYICogTWF0aC5hYnMocG9pbnRlclggLSBhbmNob3JYKSkgLyAobWF4WCAtIG1pblgpLFxuICAgICAgKHBvaW50ZXJTaWRlWSAqIE1hdGguYWJzKHBvaW50ZXJZIC0gYW5jaG9yWSkpIC8gKG1heFkgLSBtaW5ZKSxcbiAgICApICogKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgPyAyIDogMSk7XG5cbiAgaWYgKHNjYWxlID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFyZ2V0RWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHdpZHRoID0gZWxlbWVudC5vcmlnLndpZHRoICogc2NhbGU7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5vcmlnLmhlaWdodCAqIHNjYWxlO1xuICAgIGNvbnN0IHggPSBhbmNob3JYICsgKGVsZW1lbnQub3JpZy54IC0gYW5jaG9yWCkgKiBzY2FsZTtcbiAgICBjb25zdCB5ID0gYW5jaG9yWSArIChlbGVtZW50Lm9yaWcueSAtIGFuY2hvclkpICogc2NhbGU7XG5cbiAgICAvLyByZWFkanVzdCBwb2ludHMgZm9yIGxpbmVhciAmIGZyZWUgZHJhdyBlbGVtZW50c1xuICAgIGNvbnN0IHJlc2NhbGVkUG9pbnRzID0gcmVzY2FsZVBvaW50c0luRWxlbWVudChcbiAgICAgIGVsZW1lbnQub3JpZyxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZToge1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgeDogbnVtYmVyO1xuICAgICAgeTogbnVtYmVyO1xuICAgICAgcG9pbnRzPzogUG9pbnRbXTtcbiAgICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgIH0gPSB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgLi4ucmVzY2FsZWRQb2ludHMsXG4gICAgfTtcblxuICAgIGxldCBib3VuZFRleHRVcGRhdGVzOiB7IGZvbnRTaXplOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudC5sYXRlc3QpO1xuXG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQgfHwgaXNUZXh0RWxlbWVudChlbGVtZW50Lm9yaWcpKSB7XG4gICAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IHtcbiAgICAgICAgLi4uZWxlbWVudC5sYXRlc3QsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZm9udFNpemUgPSBtZWFzdXJlRm9udFNpemVGcm9tV2lkdGgoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnQgPz8gKGVsZW1lbnQub3JpZyBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpLFxuICAgICAgICBib3VuZFRleHRFbGVtZW50XG4gICAgICAgICAgPyBnZXRNYXhDb250YWluZXJXaWR0aCh1cGRhdGVkRWxlbWVudClcbiAgICAgICAgICA6IHVwZGF0ZWRFbGVtZW50LndpZHRoLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFmb250U2l6ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQub3JpZykpIHtcbiAgICAgICAgdXBkYXRlLmZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgIGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgICAgICAgZm9udFNpemUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50LmxhdGVzdCwgeyBuZXdTaXplOiB7IHdpZHRoLCBoZWlnaHQgfSB9KTtcblxuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudC5sYXRlc3QsIHVwZGF0ZSk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCAmJiBib3VuZFRleHRVcGRhdGVzKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQsIGJvdW5kVGV4dFVwZGF0ZXMpO1xuXG4gICAgICBoYW5kbGVCaW5kVGV4dFJlc2l6ZShlbGVtZW50LmxhdGVzdCwgdHJhbnNmb3JtSGFuZGxlVHlwZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbnN0IHJvdGF0ZU11bHRpcGxlRWxlbWVudHMgPSAoXG4gIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgcG9pbnRlclg6IG51bWJlcixcbiAgcG9pbnRlclk6IG51bWJlcixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGxldCBjZW50ZXJBbmdsZSA9XG4gICAgKDUgKiBNYXRoLlBJKSAvIDIgKyBNYXRoLmF0YW4yKHBvaW50ZXJZIC0gY2VudGVyWSwgcG9pbnRlclggLSBjZW50ZXJYKTtcbiAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKSB7XG4gICAgY2VudGVyQW5nbGUgKz0gU0hJRlRfTE9DS0lOR19BTkdMRSAvIDI7XG4gICAgY2VudGVyQW5nbGUgLT0gY2VudGVyQW5nbGUgJSBTSElGVF9MT0NLSU5HX0FOR0xFO1xuICB9XG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMjtcbiAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gICAgY29uc3Qgb3JpZ0FuZ2xlID1cbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luYWxFbGVtZW50cy5nZXQoZWxlbWVudC5pZCk/LmFuZ2xlID8/IGVsZW1lbnQuYW5nbGU7XG4gICAgY29uc3QgW3JvdGF0ZWRDWCwgcm90YXRlZENZXSA9IHJvdGF0ZShcbiAgICAgIGN4LFxuICAgICAgY3ksXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICAgIGNlbnRlckFuZ2xlICsgb3JpZ0FuZ2xlIC0gZWxlbWVudC5hbmdsZSxcbiAgICApO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgeDogZWxlbWVudC54ICsgKHJvdGF0ZWRDWCAtIGN4KSxcbiAgICAgIHk6IGVsZW1lbnQueSArIChyb3RhdGVkQ1kgLSBjeSksXG4gICAgICBhbmdsZTogbm9ybWFsaXplQW5nbGUoY2VudGVyQW5nbGUgKyBvcmlnQW5nbGUpLFxuICAgIH0pO1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICBjb25zdCB0ZXh0RWxlbWVudCA9XG4gICAgICAgIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50PEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXI+KFxuICAgICAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICAgKTtcbiAgICAgIGlmICh0ZXh0RWxlbWVudCAmJiAhaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudCh0ZXh0RWxlbWVudCwge1xuICAgICAgICAgIHg6IHRleHRFbGVtZW50LnggKyAocm90YXRlZENYIC0gY3gpLFxuICAgICAgICAgIHk6IHRleHRFbGVtZW50LnkgKyAocm90YXRlZENZIC0gY3kpLFxuICAgICAgICAgIGFuZ2xlOiBub3JtYWxpemVBbmdsZShjZW50ZXJBbmdsZSArIG9yaWdBbmdsZSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplT2Zmc2V0WFkgPSAoXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgc2VsZWN0ZWRFbGVtZW50czogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPVxuICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxXG4gICAgICA/IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhzZWxlY3RlZEVsZW1lbnRzWzBdKVxuICAgICAgOiBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMjtcbiAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICBjb25zdCBhbmdsZSA9IHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxID8gc2VsZWN0ZWRFbGVtZW50c1swXS5hbmdsZSA6IDA7XG4gIFt4LCB5XSA9IHJvdGF0ZSh4LCB5LCBjeCwgY3ksIC1hbmdsZSk7XG4gIHN3aXRjaCAodHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgIGNhc2UgXCJuXCI6XG4gICAgICByZXR1cm4gcm90YXRlKHggLSAoeDEgKyB4MikgLyAyLCB5IC0geTEsIDAsIDAsIGFuZ2xlKTtcbiAgICBjYXNlIFwic1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0gKHgxICsgeDIpIC8gMiwgeSAtIHkyLCAwLCAwLCBhbmdsZSk7XG4gICAgY2FzZSBcIndcIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtIHgxLCB5IC0gKHkxICsgeTIpIC8gMiwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJlXCI6XG4gICAgICByZXR1cm4gcm90YXRlKHggLSB4MiwgeSAtICh5MSArIHkyKSAvIDIsIDAsIDAsIGFuZ2xlKTtcbiAgICBjYXNlIFwibndcIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtIHgxLCB5IC0geTEsIDAsIDAsIGFuZ2xlKTtcbiAgICBjYXNlIFwibmVcIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtIHgyLCB5IC0geTEsIDAsIDAsIGFuZ2xlKTtcbiAgICBjYXNlIFwic3dcIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtIHgxLCB5IC0geTIsIDAsIDAsIGFuZ2xlKTtcbiAgICBjYXNlIFwic2VcIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtIHgyLCB5IC0geTIsIDAsIDAsIGFuZ2xlKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFswLCAwXTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlc2l6ZUFycm93RGlyZWN0aW9uID0gKFxuICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuKTogXCJvcmlnaW5cIiB8IFwiZW5kXCIgPT4ge1xuICBjb25zdCBbLCBbcHgsIHB5XV0gPSBlbGVtZW50LnBvaW50cztcbiAgY29uc3QgaXNSZXNpemVFbmQgPVxuICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgJiYgKHB4IDwgMCB8fCBweSA8IDApKSB8fFxuICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgJiYgcHggPj0gMCkgfHxcbiAgICAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzd1wiICYmIHB4IDw9IDApIHx8XG4gICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic2VcIiAmJiAocHggPiAwIHx8IHB5ID4gMCkpO1xuICByZXR1cm4gaXNSZXNpemVFbmQgPyBcImVuZFwiIDogXCJvcmlnaW5cIjtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/resizeElements.ts\n");
|
|
3277
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getResizeArrowDirection\": () => (/* binding */ getResizeArrowDirection),\n/* harmony export */ \"getResizeOffsetXY\": () => (/* binding */ getResizeOffsetXY),\n/* harmony export */ \"normalizeAngle\": () => (/* binding */ normalizeAngle),\n/* harmony export */ \"resizeSingleElement\": () => (/* binding */ resizeSingleElement),\n/* harmony export */ \"transformElements\": () => (/* binding */ transformElements)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./binding */ \"../../element/binding.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\n\n\n\n\n\n\n\n\n\nconst normalizeAngle = (angle) => {\n if (angle >= 2 * Math.PI) {\n return angle - 2 * Math.PI;\n }\n return angle;\n};\n// Returns true when transform (resizing/rotation) happened\nconst transformElements = (pointerDownState, transformHandleType, selectedElements, resizeArrowDirection, shouldRotateWithDiscreteAngle, shouldResizeFromCenter, shouldMaintainAspectRatio, pointerX, pointerY, centerX, centerY) => {\n if (selectedElements.length === 1) {\n const [element] = selectedElements;\n if (transformHandleType === \"rotation\") {\n rotateSingleElement(element, pointerX, pointerY, shouldRotateWithDiscreteAngle, pointerDownState.originalElements);\n (0,_binding__WEBPACK_IMPORTED_MODULE_7__.updateBoundElements)(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) &&\n (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\")) {\n resizeSingleTextElement(element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n (0,_binding__WEBPACK_IMPORTED_MODULE_7__.updateBoundElements)(element);\n }\n else if (transformHandleType) {\n resizeSingleElement(pointerDownState.originalElements, shouldMaintainAspectRatio, element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n }\n return true;\n }\n else if (selectedElements.length > 1) {\n if (transformHandleType === \"rotation\") {\n rotateMultipleElements(pointerDownState, selectedElements, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY);\n return true;\n }\n else if (transformHandleType === \"nw\" ||\n transformHandleType === \"ne\" ||\n transformHandleType === \"sw\" ||\n transformHandleType === \"se\") {\n resizeMultipleElements(pointerDownState, selectedElements, transformHandleType, shouldResizeFromCenter, pointerX, pointerY);\n return true;\n }\n }\n return false;\n};\nconst rotateSingleElement = (element, pointerX, pointerY, shouldRotateWithDiscreteAngle, originalElements) => {\n var _a;\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n let angle = (5 * Math.PI) / 2 + Math.atan2(pointerY - cy, pointerX - cx);\n if (shouldRotateWithDiscreteAngle) {\n angle += _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE / 2;\n angle -= angle % _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE;\n }\n angle = normalizeAngle(angle);\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElementId)(element);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, { angle });\n if (boundTextElementId) {\n const textElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId);\n if (textElement && !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isArrowElement)(element)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(textElement, { angle });\n }\n }\n};\nconst rescalePointsInElement = (element, width, height, normalizePoints) => (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isFreeDrawElement)(element)\n ? {\n points: (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(0, width, (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(1, height, element.points, normalizePoints), normalizePoints),\n }\n : {};\nconst MIN_FONT_SIZE = 1;\nconst measureFontSizeFromWidth = (element, nextWidth, nextHeight) => {\n // We only use width to scale font on resize\n let width = element.width;\n const hasContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isBoundToContainer)(element);\n if (hasContainer) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getContainerElement)(element);\n if (container) {\n width = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container);\n }\n }\n const nextFontSize = element.fontSize * (nextWidth / width);\n if (nextFontSize < MIN_FONT_SIZE) {\n return null;\n }\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_6__.getFontString)({ fontSize: nextFontSize, fontFamily: element.fontFamily }), element.lineHeight);\n return {\n size: nextFontSize,\n baseline: metrics.baseline + (nextHeight - metrics.height),\n };\n};\nconst getSidesForTransformHandle = (transformHandleType, shouldResizeFromCenter) => {\n return {\n n: /^(n|ne|nw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(s|se|sw)$/.test(transformHandleType)),\n s: /^(s|se|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(n|ne|nw)$/.test(transformHandleType)),\n w: /^(w|nw|sw)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(e|ne|se)$/.test(transformHandleType)),\n e: /^(e|ne|se)$/.test(transformHandleType) ||\n (shouldResizeFromCenter && /^(w|nw|sw)$/.test(transformHandleType)),\n };\n};\nconst resizeSingleTextElement = (element, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n // rotation pointer with reverse angle\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(pointerX, pointerY, cx, cy, -element.angle);\n let scale;\n switch (transformHandleType) {\n case \"se\":\n scale = Math.max((rotatedX - x1) / (x2 - x1), (rotatedY - y1) / (y2 - y1));\n break;\n case \"nw\":\n scale = Math.max((x2 - rotatedX) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));\n break;\n case \"ne\":\n scale = Math.max((rotatedX - x1) / (x2 - x1), (y2 - rotatedY) / (y2 - y1));\n break;\n case \"sw\":\n scale = Math.max((x2 - rotatedX) / (x2 - x1), (rotatedY - y1) / (y2 - y1));\n break;\n }\n if (scale > 0) {\n const nextWidth = element.width * scale;\n const nextHeight = element.height * scale;\n const metrics = measureFontSizeFromWidth(element, nextWidth, nextHeight);\n if (metrics === null) {\n return;\n }\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n const [nextElementX, nextElementY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.adjustXYWithRotation)(getSidesForTransformHandle(transformHandleType, shouldResizeFromCenter), element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n fontSize: metrics.size,\n width: nextWidth,\n height: nextHeight,\n baseline: metrics.baseline,\n x: nextElementX,\n y: nextElementY,\n });\n }\n};\nconst resizeSingleElement = (originalElements, shouldMaintainAspectRatio, element, transformHandleDirection, shouldResizeFromCenter, pointerX, pointerY) => {\n const stateAtResizeStart = originalElements.get(element.id);\n // Gets bounds corners\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(stateAtResizeStart, stateAtResizeStart.width, stateAtResizeStart.height, true);\n const startTopLeft = [x1, y1];\n const startBottomRight = [x2, y2];\n const startCenter = (0,_math__WEBPACK_IMPORTED_MODULE_2__.centerPoint)(startTopLeft, startBottomRight);\n // Calculate new dimensions based on cursor position\n const rotatedPointer = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)([pointerX, pointerY], startCenter, -stateAtResizeStart.angle);\n // Get bounds corners rendered on screen\n const [esx1, esy1, esx2, esy2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(element, element.width, element.height, true);\n const boundsCurrentWidth = esx2 - esx1;\n const boundsCurrentHeight = esy2 - esy1;\n // It's important we set the initial scale value based on the width and height at resize start,\n // otherwise previous dimensions affected by modifiers will be taken into account.\n const atStartBoundsWidth = startBottomRight[0] - startTopLeft[0];\n const atStartBoundsHeight = startBottomRight[1] - startTopLeft[1];\n let scaleX = atStartBoundsWidth / boundsCurrentWidth;\n let scaleY = atStartBoundsHeight / boundsCurrentHeight;\n let boundTextFont = {};\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element);\n if (transformHandleDirection.includes(\"e\")) {\n scaleX = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"s\")) {\n scaleY = (rotatedPointer[1] - startTopLeft[1]) / boundsCurrentHeight;\n }\n if (transformHandleDirection.includes(\"w\")) {\n scaleX = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;\n }\n if (transformHandleDirection.includes(\"n\")) {\n scaleY = (startBottomRight[1] - rotatedPointer[1]) / boundsCurrentHeight;\n }\n // Linear elements dimensions differ from bounds dimensions\n const eleInitialWidth = stateAtResizeStart.width;\n const eleInitialHeight = stateAtResizeStart.height;\n // We have to use dimensions of element on screen, otherwise the scaling of the\n // dimensions won't match the cursor for linear elements.\n let eleNewWidth = element.width * scaleX;\n let eleNewHeight = element.height * scaleY;\n // adjust dimensions for resizing from center\n if (shouldResizeFromCenter) {\n eleNewWidth = 2 * eleNewWidth - eleInitialWidth;\n eleNewHeight = 2 * eleNewHeight - eleInitialHeight;\n }\n // adjust dimensions to keep sides ratio\n if (shouldMaintainAspectRatio) {\n const widthRatio = Math.abs(eleNewWidth) / eleInitialWidth;\n const heightRatio = Math.abs(eleNewHeight) / eleInitialHeight;\n if (transformHandleDirection.length === 1) {\n eleNewHeight *= widthRatio;\n eleNewWidth *= heightRatio;\n }\n if (transformHandleDirection.length === 2) {\n const ratio = Math.max(widthRatio, heightRatio);\n eleNewWidth = eleInitialWidth * ratio * Math.sign(eleNewWidth);\n eleNewHeight = eleInitialHeight * ratio * Math.sign(eleNewHeight);\n }\n }\n if (boundTextElement) {\n const stateOfBoundTextElementAtResize = originalElements.get(boundTextElement.id);\n if (stateOfBoundTextElementAtResize) {\n boundTextFont = {\n fontSize: stateOfBoundTextElementAtResize.fontSize,\n baseline: stateOfBoundTextElementAtResize.baseline,\n };\n }\n if (shouldMaintainAspectRatio) {\n const updatedElement = Object.assign(Object.assign({}, element), { width: eleNewWidth, height: eleNewHeight });\n const nextFont = measureFontSizeFromWidth(boundTextElement, (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(updatedElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerHeight)(updatedElement));\n if (nextFont === null) {\n return;\n }\n boundTextFont = {\n fontSize: nextFont.size,\n baseline: nextFont.baseline,\n };\n }\n else {\n const minWidth = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_6__.getFontString)(boundTextElement), boundTextElement.lineHeight);\n const minHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getApproxMinLineHeight)(boundTextElement.fontSize, boundTextElement.lineHeight);\n eleNewWidth = Math.ceil(Math.max(eleNewWidth, minWidth));\n eleNewHeight = Math.ceil(Math.max(eleNewHeight, minHeight));\n }\n }\n const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getResizedElementAbsoluteCoords)(stateAtResizeStart, eleNewWidth, eleNewHeight, true);\n const newBoundsWidth = newBoundsX2 - newBoundsX1;\n const newBoundsHeight = newBoundsY2 - newBoundsY1;\n // Calculate new topLeft based on fixed corner during resize\n let newTopLeft = [...startTopLeft];\n if ([\"n\", \"w\", \"nw\"].includes(transformHandleDirection)) {\n newTopLeft = [\n startBottomRight[0] - Math.abs(newBoundsWidth),\n startBottomRight[1] - Math.abs(newBoundsHeight),\n ];\n }\n if (transformHandleDirection === \"ne\") {\n const bottomLeft = [startTopLeft[0], startBottomRight[1]];\n newTopLeft = [bottomLeft[0], bottomLeft[1] - Math.abs(newBoundsHeight)];\n }\n if (transformHandleDirection === \"sw\") {\n const topRight = [startBottomRight[0], startTopLeft[1]];\n newTopLeft = [topRight[0] - Math.abs(newBoundsWidth), topRight[1]];\n }\n // Keeps opposite handle fixed during resize\n if (shouldMaintainAspectRatio) {\n if ([\"s\", \"n\"].includes(transformHandleDirection)) {\n newTopLeft[0] = startCenter[0] - newBoundsWidth / 2;\n }\n if ([\"e\", \"w\"].includes(transformHandleDirection)) {\n newTopLeft[1] = startCenter[1] - newBoundsHeight / 2;\n }\n }\n // Flip horizontally\n if (eleNewWidth < 0) {\n if (transformHandleDirection.includes(\"e\")) {\n newTopLeft[0] -= Math.abs(newBoundsWidth);\n }\n if (transformHandleDirection.includes(\"w\")) {\n newTopLeft[0] += Math.abs(newBoundsWidth);\n }\n }\n // Flip vertically\n if (eleNewHeight < 0) {\n if (transformHandleDirection.includes(\"s\")) {\n newTopLeft[1] -= Math.abs(newBoundsHeight);\n }\n if (transformHandleDirection.includes(\"n\")) {\n newTopLeft[1] += Math.abs(newBoundsHeight);\n }\n }\n if (shouldResizeFromCenter) {\n newTopLeft[0] = startCenter[0] - Math.abs(newBoundsWidth) / 2;\n newTopLeft[1] = startCenter[1] - Math.abs(newBoundsHeight) / 2;\n }\n // adjust topLeft to new rotation point\n const angle = stateAtResizeStart.angle;\n const rotatedTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(newTopLeft, startCenter, angle);\n const newCenter = [\n newTopLeft[0] + Math.abs(newBoundsWidth) / 2,\n newTopLeft[1] + Math.abs(newBoundsHeight) / 2,\n ];\n const rotatedNewCenter = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(newCenter, startCenter, angle);\n newTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotatePoint)(rotatedTopLeft, rotatedNewCenter, -angle);\n // Readjust points for linear elements\n let rescaledElementPointsY;\n let rescaledPoints;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isFreeDrawElement)(element)) {\n rescaledElementPointsY = (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(1, eleNewHeight, stateAtResizeStart.points, true);\n rescaledPoints = (0,_points__WEBPACK_IMPORTED_MODULE_1__.rescalePoints)(0, eleNewWidth, rescaledElementPointsY, true);\n }\n // For linear elements (x,y) are the coordinates of the first drawn point not the top-left corner\n // So we need to readjust (x,y) to be where the first point should be\n const newOrigin = [...newTopLeft];\n newOrigin[0] += stateAtResizeStart.x - newBoundsX1;\n newOrigin[1] += stateAtResizeStart.y - newBoundsY1;\n const resizedElement = {\n width: Math.abs(eleNewWidth),\n height: Math.abs(eleNewHeight),\n x: newOrigin[0],\n y: newOrigin[1],\n points: rescaledPoints,\n };\n if (\"scale\" in element && \"scale\" in stateAtResizeStart) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n scale: [\n // defaulting because scaleX/Y can be 0/-0\n (Math.sign(newBoundsX2 - stateAtResizeStart.x) ||\n stateAtResizeStart.scale[0]) * stateAtResizeStart.scale[0],\n (Math.sign(newBoundsY2 - stateAtResizeStart.y) ||\n stateAtResizeStart.scale[1]) * stateAtResizeStart.scale[1],\n ],\n });\n }\n if (resizedElement.width !== 0 &&\n resizedElement.height !== 0 &&\n Number.isFinite(resizedElement.x) &&\n Number.isFinite(resizedElement.y)) {\n (0,_binding__WEBPACK_IMPORTED_MODULE_7__.updateBoundElements)(element, {\n newSize: { width: resizedElement.width, height: resizedElement.height },\n });\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, resizedElement);\n if (boundTextElement && boundTextFont != null) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(boundTextElement, {\n fontSize: boundTextFont.fontSize,\n baseline: boundTextFont.baseline,\n });\n }\n (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.handleBindTextResize)(element, transformHandleDirection);\n }\n};\nconst resizeMultipleElements = (pointerDownState, selectedElements, transformHandleType, shouldResizeFromCenter, pointerX, pointerY) => {\n // map selected elements to the original elements. While it never should\n // happen that pointerDownState.originalElements won't contain the selected\n // elements during resize, this coupling isn't guaranteed, so to ensure\n // type safety we need to transform only those elements we filter.\n const targetElements = selectedElements.reduce((acc, element) => {\n const origElement = pointerDownState.originalElements.get(element.id);\n if (origElement) {\n acc.push({ orig: origElement, latest: element });\n }\n return acc;\n }, []);\n const { minX, minY, maxX, maxY, midX, midY } = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getCommonBoundingBox)(targetElements.map(({ orig }) => orig));\n const direction = transformHandleType;\n const mapDirectionsToAnchors = {\n ne: [minX, maxY],\n se: [minX, minY],\n sw: [maxX, minY],\n nw: [maxX, maxY],\n };\n // anchor point must be on the opposite side of the dragged selection handle\n // or be the center of the selection if alt is pressed\n const [anchorX, anchorY] = shouldResizeFromCenter\n ? [midX, midY]\n : mapDirectionsToAnchors[direction];\n const mapDirectionsToPointerSides = {\n ne: [pointerX >= anchorX, pointerY <= anchorY],\n se: [pointerX >= anchorX, pointerY >= anchorY],\n sw: [pointerX <= anchorX, pointerY >= anchorY],\n nw: [pointerX <= anchorX, pointerY <= anchorY],\n };\n // pointer side relative to anchor\n const [pointerSideX, pointerSideY] = mapDirectionsToPointerSides[direction].map((condition) => (condition ? 1 : -1));\n // stop resizing if a pointer is on the other side of selection\n if (pointerSideX < 0 && pointerSideY < 0) {\n return;\n }\n const scale = Math.max((pointerSideX * Math.abs(pointerX - anchorX)) / (maxX - minX), (pointerSideY * Math.abs(pointerY - anchorY)) / (maxY - minY)) * (shouldResizeFromCenter ? 2 : 1);\n if (scale === 0) {\n return;\n }\n targetElements.forEach((element) => {\n const width = element.orig.width * scale;\n const height = element.orig.height * scale;\n const x = anchorX + (element.orig.x - anchorX) * scale;\n const y = anchorY + (element.orig.y - anchorY) * scale;\n // readjust points for linear & free draw elements\n const rescaledPoints = rescalePointsInElement(element.orig, width, height, false);\n const update = Object.assign({ width,\n height,\n x,\n y }, rescaledPoints);\n let boundTextUpdates = null;\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element.latest);\n if (boundTextElement || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element.orig)) {\n const updatedElement = Object.assign(Object.assign({}, element.latest), { width,\n height });\n const metrics = measureFontSizeFromWidth(boundTextElement !== null && boundTextElement !== void 0 ? boundTextElement : element.orig, boundTextElement\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(updatedElement)\n : updatedElement.width, boundTextElement\n ? (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerHeight)(updatedElement)\n : updatedElement.height);\n if (!metrics) {\n return;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element.orig)) {\n update.fontSize = metrics.size;\n update.baseline = metrics.baseline;\n }\n if (boundTextElement) {\n boundTextUpdates = {\n fontSize: metrics.size,\n baseline: metrics.baseline,\n };\n }\n }\n (0,_binding__WEBPACK_IMPORTED_MODULE_7__.updateBoundElements)(element.latest, { newSize: { width, height } });\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element.latest, update);\n if (boundTextElement && boundTextUpdates) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(boundTextElement, boundTextUpdates);\n (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.handleBindTextResize)(element.latest, transformHandleType);\n }\n });\n};\nconst rotateMultipleElements = (pointerDownState, elements, pointerX, pointerY, shouldRotateWithDiscreteAngle, centerX, centerY) => {\n let centerAngle = (5 * Math.PI) / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);\n if (shouldRotateWithDiscreteAngle) {\n centerAngle += _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE / 2;\n centerAngle -= centerAngle % _constants__WEBPACK_IMPORTED_MODULE_0__.SHIFT_LOCKING_ANGLE;\n }\n elements.forEach((element) => {\n var _a, _b, _c;\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const origAngle = (_b = (_a = pointerDownState.originalElements.get(element.id)) === null || _a === void 0 ? void 0 : _a.angle) !== null && _b !== void 0 ? _b : element.angle;\n const [rotatedCX, rotatedCY] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(cx, cy, centerX, centerY, centerAngle + origAngle - element.angle);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(element, {\n x: element.x + (rotatedCX - cx),\n y: element.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElementId)(element);\n if (boundTextElementId) {\n const textElement = (_c = _scene_Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(element)) === null || _c === void 0 ? void 0 : _c.getElement(boundTextElementId);\n if (textElement && !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isArrowElement)(element)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(textElement, {\n x: textElement.x + (rotatedCX - cx),\n y: textElement.y + (rotatedCY - cy),\n angle: normalizeAngle(centerAngle + origAngle),\n });\n }\n }\n });\n};\nconst getResizeOffsetXY = (transformHandleType, selectedElements, x, y) => {\n const [x1, y1, x2, y2] = selectedElements.length === 1\n ? (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getElementAbsoluteCoords)(selectedElements[0])\n : (0,_bounds__WEBPACK_IMPORTED_MODULE_3__.getCommonBounds)(selectedElements);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const angle = selectedElements.length === 1 ? selectedElements[0].angle : 0;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x, y, cx, cy, -angle);\n switch (transformHandleType) {\n case \"n\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - (x1 + x2) / 2, y - y1, 0, 0, angle);\n case \"s\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - (x1 + x2) / 2, y - y2, 0, 0, angle);\n case \"w\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - (y1 + y2) / 2, 0, 0, angle);\n case \"e\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - (y1 + y2) / 2, 0, 0, angle);\n case \"nw\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - y1, 0, 0, angle);\n case \"ne\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - y1, 0, 0, angle);\n case \"sw\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x1, y - y2, 0, 0, angle);\n case \"se\":\n return (0,_math__WEBPACK_IMPORTED_MODULE_2__.rotate)(x - x2, y - y2, 0, 0, angle);\n default:\n return [0, 0];\n }\n};\nconst getResizeArrowDirection = (transformHandleType, element) => {\n const [, [px, py]] = element.points;\n const isResizeEnd = (transformHandleType === \"nw\" && (px < 0 || py < 0)) ||\n (transformHandleType === \"ne\" && px >= 0) ||\n (transformHandleType === \"sw\" && px <= 0) ||\n (transformHandleType === \"se\" && (px > 0 || py > 0));\n return isResizeEnd ? \"end\" : \"origin\";\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YThlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNISUZUX0xPQ0tJTkdfQU5HTEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZXNjYWxlUG9pbnRzIH0gZnJvbSBcIi4uL3BvaW50c1wiO1xuXG5pbXBvcnQge1xuICByb3RhdGUsXG4gIGFkanVzdFhZV2l0aFJvdGF0aW9uLFxuICBjZW50ZXJQb2ludCxcbiAgcm90YXRlUG9pbnQsXG59IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLFxuICBnZXRDb21tb25Cb3VuZHMsXG4gIGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMsXG4gIGdldENvbW1vbkJvdW5kaW5nQm94LFxufSBmcm9tIFwiLi9ib3VuZHNcIjtcbmltcG9ydCB7XG4gIGlzQXJyb3dFbGVtZW50LFxuICBpc0JvdW5kVG9Db250YWluZXIsXG4gIGlzRnJlZURyYXdFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnQsXG4gIGlzVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyB1cGRhdGVCb3VuZEVsZW1lbnRzIH0gZnJvbSBcIi4vYmluZGluZ1wiO1xuaW1wb3J0IHtcbiAgVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBUcmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24sXG59IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCB7IFBvaW50LCBQb2ludGVyRG93blN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQge1xuICBnZXRBcHByb3hNaW5MaW5lV2lkdGgsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgaGFuZGxlQmluZFRleHRSZXNpemUsXG4gIGdldE1heENvbnRhaW5lcldpZHRoLFxuICBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0LFxuICBtZWFzdXJlVGV4dCxcbiAgZ2V0TWF4Q29udGFpbmVySGVpZ2h0LFxufSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplQW5nbGUgPSAoYW5nbGU6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIGlmIChhbmdsZSA+PSAyICogTWF0aC5QSSkge1xuICAgIHJldHVybiBhbmdsZSAtIDIgKiBNYXRoLlBJO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn07XG5cbi8vIFJldHVybnMgdHJ1ZSB3aGVuIHRyYW5zZm9ybSAocmVzaXppbmcvcm90YXRpb24pIGhhcHBlbmVkXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRWxlbWVudHMgPSAoXG4gIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgc2VsZWN0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIHJlc2l6ZUFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiIHwgXCJlbmRcIixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIHNob3VsZFJlc2l6ZUZyb21DZW50ZXI6IGJvb2xlYW4sXG4gIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW86IGJvb2xlYW4sXG4gIHBvaW50ZXJYOiBudW1iZXIsXG4gIHBvaW50ZXJZOiBudW1iZXIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IFtlbGVtZW50XSA9IHNlbGVjdGVkRWxlbWVudHM7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIikge1xuICAgICAgcm90YXRlU2luZ2xlRWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5hbEVsZW1lbnRzLFxuICAgICAgKTtcbiAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuZVwiIHx8XG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic3dcIiB8fFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInNlXCIpXG4gICAgKSB7XG4gICAgICByZXNpemVTaW5nbGVUZXh0RWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcixcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgKTtcbiAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICByZXNpemVTaW5nbGVFbGVtZW50KFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbmFsRWxlbWVudHMsXG4gICAgICAgIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8sXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gICAgICAgIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIsXG4gICAgICAgIHBvaW50ZXJYLFxuICAgICAgICBwb2ludGVyWSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwicm90YXRpb25cIikge1xuICAgICAgcm90YXRlTXVsdGlwbGVFbGVtZW50cyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgcG9pbnRlclgsXG4gICAgICAgIHBvaW50ZXJZLFxuICAgICAgICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSxcbiAgICAgICAgY2VudGVyWCxcbiAgICAgICAgY2VudGVyWSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJud1wiIHx8XG4gICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwic3dcIiB8fFxuICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzZVwiXG4gICAgKSB7XG4gICAgICByZXNpemVNdWx0aXBsZUVsZW1lbnRzKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlLFxuICAgICAgICBzaG91bGRSZXNpemVGcm9tQ2VudGVyLFxuICAgICAgICBwb2ludGVyWCxcbiAgICAgICAgcG9pbnRlclksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IHJvdGF0ZVNpbmdsZUVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgcG9pbnRlclg6IG51bWJlcixcbiAgcG9pbnRlclk6IG51bWJlcixcbiAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGU6IGJvb2xlYW4sXG4gIG9yaWdpbmFsRWxlbWVudHM6IE1hcDxzdHJpbmcsIE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+PixcbikgPT4ge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgbGV0IGFuZ2xlID0gKDUgKiBNYXRoLlBJKSAvIDIgKyBNYXRoLmF0YW4yKHBvaW50ZXJZIC0gY3ksIHBvaW50ZXJYIC0gY3gpO1xuICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUpIHtcbiAgICBhbmdsZSArPSBTSElGVF9MT0NLSU5HX0FOR0xFIC8gMjtcbiAgICBhbmdsZSAtPSBhbmdsZSAlIFNISUZUX0xPQ0tJTkdfQU5HTEU7XG4gIH1cbiAgYW5nbGUgPSBub3JtYWxpemVBbmdsZShhbmdsZSk7XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcblxuICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHsgYW5nbGUgfSk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICBjb25zdCB0ZXh0RWxlbWVudCA9XG4gICAgICBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudDxFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyPihcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKTtcblxuICAgIGlmICh0ZXh0RWxlbWVudCAmJiAhaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHsgYW5nbGUgfSk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCByZXNjYWxlUG9pbnRzSW5FbGVtZW50ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBub3JtYWxpemVQb2ludHM6IGJvb2xlYW4sXG4pID0+XG4gIGlzTGluZWFyRWxlbWVudChlbGVtZW50KSB8fCBpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KVxuICAgID8ge1xuICAgICAgICBwb2ludHM6IHJlc2NhbGVQb2ludHMoXG4gICAgICAgICAgMCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICByZXNjYWxlUG9pbnRzKDEsIGhlaWdodCwgZWxlbWVudC5wb2ludHMsIG5vcm1hbGl6ZVBvaW50cyksXG4gICAgICAgICAgbm9ybWFsaXplUG9pbnRzLFxuICAgICAgICApLFxuICAgICAgfVxuICAgIDoge307XG5cbmNvbnN0IE1JTl9GT05UX1NJWkUgPSAxO1xuXG5jb25zdCBtZWFzdXJlRm9udFNpemVGcm9tV2lkdGggPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PixcbiAgbmV4dFdpZHRoOiBudW1iZXIsXG4gIG5leHRIZWlnaHQ6IG51bWJlcixcbik6IHsgc2l6ZTogbnVtYmVyOyBiYXNlbGluZTogbnVtYmVyIH0gfCBudWxsID0+IHtcbiAgLy8gV2Ugb25seSB1c2Ugd2lkdGggdG8gc2NhbGUgZm9udCBvbiByZXNpemVcbiAgbGV0IHdpZHRoID0gZWxlbWVudC53aWR0aDtcblxuICBjb25zdCBoYXNDb250YWluZXIgPSBpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCk7XG4gIGlmIChoYXNDb250YWluZXIpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbmV4dEZvbnRTaXplID0gZWxlbWVudC5mb250U2l6ZSAqIChuZXh0V2lkdGggLyB3aWR0aCk7XG4gIGlmIChuZXh0Rm9udFNpemUgPCBNSU5fRk9OVF9TSVpFKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KFxuICAgIGVsZW1lbnQudGV4dCxcbiAgICBnZXRGb250U3RyaW5nKHsgZm9udFNpemU6IG5leHRGb250U2l6ZSwgZm9udEZhbWlseTogZWxlbWVudC5mb250RmFtaWx5IH0pLFxuICAgIGVsZW1lbnQubGluZUhlaWdodCxcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBzaXplOiBuZXh0Rm9udFNpemUsXG4gICAgYmFzZWxpbmU6IG1ldHJpY3MuYmFzZWxpbmUgKyAobmV4dEhlaWdodCAtIG1ldHJpY3MuaGVpZ2h0KSxcbiAgfTtcbn07XG5cbmNvbnN0IGdldFNpZGVzRm9yVHJhbnNmb3JtSGFuZGxlID0gKFxuICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuKSA9PiB7XG4gIHJldHVybiB7XG4gICAgbjpcbiAgICAgIC9eKG58bmV8bncpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB8fFxuICAgICAgKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgJiYgL14oc3xzZXxzdykkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpKSxcbiAgICBzOlxuICAgICAgL14oc3xzZXxzdykkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpIHx8XG4gICAgICAoc2hvdWxkUmVzaXplRnJvbUNlbnRlciAmJiAvXihufG5lfG53KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkpLFxuICAgIHc6XG4gICAgICAvXih3fG53fHN3KSQvLnRlc3QodHJhbnNmb3JtSGFuZGxlVHlwZSkgfHxcbiAgICAgIChzaG91bGRSZXNpemVGcm9tQ2VudGVyICYmIC9eKGV8bmV8c2UpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSksXG4gICAgZTpcbiAgICAgIC9eKGV8bmV8c2UpJC8udGVzdCh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB8fFxuICAgICAgKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgJiYgL14od3xud3xzdykkLy50ZXN0KHRyYW5zZm9ybUhhbmRsZVR5cGUpKSxcbiAgfTtcbn07XG5cbmNvbnN0IHJlc2l6ZVNpbmdsZVRleHRFbGVtZW50ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4sXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IFwibndcIiB8IFwibmVcIiB8IFwic3dcIiB8IFwic2VcIixcbiAgc2hvdWxkUmVzaXplRnJvbUNlbnRlcjogYm9vbGVhbixcbiAgcG9pbnRlclg6IG51bWJlcixcbiAgcG9pbnRlclk6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgLy8gcm90YXRpb24gcG9pbnRlciB3aXRoIHJldmVyc2UgYW5nbGVcbiAgY29uc3QgW3JvdGF0ZWRYLCByb3RhdGVkWV0gPSByb3RhdGUoXG4gICAgcG9pbnRlclgsXG4gICAgcG9pbnRlclksXG4gICAgY3gsXG4gICAgY3ksXG4gICAgLWVsZW1lbnQuYW5nbGUsXG4gICk7XG4gIGxldCBzY2FsZTogbnVtYmVyO1xuICBzd2l0Y2ggKHRyYW5zZm9ybUhhbmRsZVR5cGUpIHtcbiAgICBjYXNlIFwic2VcIjpcbiAgICAgIHNjYWxlID0gTWF0aC5tYXgoXG4gICAgICAgIChyb3RhdGVkWCAtIHgxKSAvICh4MiAtIHgxKSxcbiAgICAgICAgKHJvdGF0ZWRZIC0geTEpIC8gKHkyIC0geTEpLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJud1wiOlxuICAgICAgc2NhbGUgPSBNYXRoLm1heChcbiAgICAgICAgKHgyIC0gcm90YXRlZFgpIC8gKHgyIC0geDEpLFxuICAgICAgICAoeTIgLSByb3RhdGVkWSkgLyAoeTIgLSB5MSksXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5lXCI6XG4gICAgICBzY2FsZSA9IE1hdGgubWF4KFxuICAgICAgICAocm90YXRlZFggLSB4MSkgLyAoeDIgLSB4MSksXG4gICAgICAgICh5MiAtIHJvdGF0ZWRZKSAvICh5MiAtIHkxKSxcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwic3dcIjpcbiAgICAgIHNjYWxlID0gTWF0aC5tYXgoXG4gICAgICAgICh4MiAtIHJvdGF0ZWRYKSAvICh4MiAtIHgxKSxcbiAgICAgICAgKHJvdGF0ZWRZIC0geTEpIC8gKHkyIC0geTEpLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmIChzY2FsZSA+IDApIHtcbiAgICBjb25zdCBuZXh0V2lkdGggPSBlbGVtZW50LndpZHRoICogc2NhbGU7XG4gICAgY29uc3QgbmV4dEhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0ICogc2NhbGU7XG4gICAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVGb250U2l6ZUZyb21XaWR0aChlbGVtZW50LCBuZXh0V2lkdGgsIG5leHRIZWlnaHQpO1xuICAgIGlmIChtZXRyaWNzID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtuZXh0WDEsIG5leHRZMSwgbmV4dFgyLCBuZXh0WTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBuZXh0V2lkdGgsXG4gICAgICBuZXh0SGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBjb25zdCBkZWx0YVgxID0gKHgxIC0gbmV4dFgxKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMSA9ICh5MSAtIG5leHRZMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWDIgPSAoeDIgLSBuZXh0WDIpIC8gMjtcbiAgICBjb25zdCBkZWx0YVkyID0gKHkyIC0gbmV4dFkyKSAvIDI7XG4gICAgY29uc3QgW25leHRFbGVtZW50WCwgbmV4dEVsZW1lbnRZXSA9IGFkanVzdFhZV2l0aFJvdGF0aW9uKFxuICAgICAgZ2V0U2lkZXNGb3JUcmFuc2Zvcm1IYW5kbGUodHJhbnNmb3JtSGFuZGxlVHlwZSwgc2hvdWxkUmVzaXplRnJvbUNlbnRlciksXG4gICAgICBlbGVtZW50LngsXG4gICAgICBlbGVtZW50LnksXG4gICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgZGVsdGFYMSxcbiAgICAgIGRlbHRhWTEsXG4gICAgICBkZWx0YVgyLFxuICAgICAgZGVsdGFZMixcbiAgICApO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgZm9udFNpemU6IG1ldHJpY3Muc2l6ZSxcbiAgICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSxcbiAgICAgIHg6IG5leHRFbGVtZW50WCxcbiAgICAgIHk6IG5leHRFbGVtZW50WSxcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZVNpbmdsZUVsZW1lbnQgPSAoXG4gIG9yaWdpbmFsRWxlbWVudHM6IFBvaW50ZXJEb3duU3RhdGVbXCJvcmlnaW5hbEVsZW1lbnRzXCJdLFxuICBzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvOiBib29sZWFuLFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbjogVHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IHN0YXRlQXRSZXNpemVTdGFydCA9IG9yaWdpbmFsRWxlbWVudHMuZ2V0KGVsZW1lbnQuaWQpITtcbiAgLy8gR2V0cyBib3VuZHMgY29ybmVyc1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICBzdGF0ZUF0UmVzaXplU3RhcnQsXG4gICAgc3RhdGVBdFJlc2l6ZVN0YXJ0LndpZHRoLFxuICAgIHN0YXRlQXRSZXNpemVTdGFydC5oZWlnaHQsXG4gICAgdHJ1ZSxcbiAgKTtcbiAgY29uc3Qgc3RhcnRUb3BMZWZ0OiBQb2ludCA9IFt4MSwgeTFdO1xuICBjb25zdCBzdGFydEJvdHRvbVJpZ2h0OiBQb2ludCA9IFt4MiwgeTJdO1xuICBjb25zdCBzdGFydENlbnRlcjogUG9pbnQgPSBjZW50ZXJQb2ludChzdGFydFRvcExlZnQsIHN0YXJ0Qm90dG9tUmlnaHQpO1xuXG4gIC8vIENhbGN1bGF0ZSBuZXcgZGltZW5zaW9ucyBiYXNlZCBvbiBjdXJzb3IgcG9zaXRpb25cbiAgY29uc3Qgcm90YXRlZFBvaW50ZXIgPSByb3RhdGVQb2ludChcbiAgICBbcG9pbnRlclgsIHBvaW50ZXJZXSxcbiAgICBzdGFydENlbnRlcixcbiAgICAtc3RhdGVBdFJlc2l6ZVN0YXJ0LmFuZ2xlLFxuICApO1xuXG4gIC8vIEdldCBib3VuZHMgY29ybmVycyByZW5kZXJlZCBvbiBzY3JlZW5cbiAgY29uc3QgW2VzeDEsIGVzeTEsIGVzeDIsIGVzeTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICBlbGVtZW50LFxuICAgIGVsZW1lbnQud2lkdGgsXG4gICAgZWxlbWVudC5oZWlnaHQsXG4gICAgdHJ1ZSxcbiAgKTtcblxuICBjb25zdCBib3VuZHNDdXJyZW50V2lkdGggPSBlc3gyIC0gZXN4MTtcbiAgY29uc3QgYm91bmRzQ3VycmVudEhlaWdodCA9IGVzeTIgLSBlc3kxO1xuXG4gIC8vIEl0J3MgaW1wb3J0YW50IHdlIHNldCB0aGUgaW5pdGlhbCBzY2FsZSB2YWx1ZSBiYXNlZCBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBhdCByZXNpemUgc3RhcnQsXG4gIC8vIG90aGVyd2lzZSBwcmV2aW91cyBkaW1lbnNpb25zIGFmZmVjdGVkIGJ5IG1vZGlmaWVycyB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgY29uc3QgYXRTdGFydEJvdW5kc1dpZHRoID0gc3RhcnRCb3R0b21SaWdodFswXSAtIHN0YXJ0VG9wTGVmdFswXTtcbiAgY29uc3QgYXRTdGFydEJvdW5kc0hlaWdodCA9IHN0YXJ0Qm90dG9tUmlnaHRbMV0gLSBzdGFydFRvcExlZnRbMV07XG4gIGxldCBzY2FsZVggPSBhdFN0YXJ0Qm91bmRzV2lkdGggLyBib3VuZHNDdXJyZW50V2lkdGg7XG4gIGxldCBzY2FsZVkgPSBhdFN0YXJ0Qm91bmRzSGVpZ2h0IC8gYm91bmRzQ3VycmVudEhlaWdodDtcblxuICBsZXQgYm91bmRUZXh0Rm9udDogeyBmb250U2l6ZT86IG51bWJlcjsgYmFzZWxpbmU/OiBudW1iZXIgfSA9IHt9O1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcblxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwiZVwiKSkge1xuICAgIHNjYWxlWCA9IChyb3RhdGVkUG9pbnRlclswXSAtIHN0YXJ0VG9wTGVmdFswXSkgLyBib3VuZHNDdXJyZW50V2lkdGg7XG4gIH1cbiAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcInNcIikpIHtcbiAgICBzY2FsZVkgPSAocm90YXRlZFBvaW50ZXJbMV0gLSBzdGFydFRvcExlZnRbMV0pIC8gYm91bmRzQ3VycmVudEhlaWdodDtcbiAgfVxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwid1wiKSkge1xuICAgIHNjYWxlWCA9IChzdGFydEJvdHRvbVJpZ2h0WzBdIC0gcm90YXRlZFBvaW50ZXJbMF0pIC8gYm91bmRzQ3VycmVudFdpZHRoO1xuICB9XG4gIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJuXCIpKSB7XG4gICAgc2NhbGVZID0gKHN0YXJ0Qm90dG9tUmlnaHRbMV0gLSByb3RhdGVkUG9pbnRlclsxXSkgLyBib3VuZHNDdXJyZW50SGVpZ2h0O1xuICB9XG5cbiAgLy8gTGluZWFyIGVsZW1lbnRzIGRpbWVuc2lvbnMgZGlmZmVyIGZyb20gYm91bmRzIGRpbWVuc2lvbnNcbiAgY29uc3QgZWxlSW5pdGlhbFdpZHRoID0gc3RhdGVBdFJlc2l6ZVN0YXJ0LndpZHRoO1xuICBjb25zdCBlbGVJbml0aWFsSGVpZ2h0ID0gc3RhdGVBdFJlc2l6ZVN0YXJ0LmhlaWdodDtcbiAgLy8gV2UgaGF2ZSB0byB1c2UgZGltZW5zaW9ucyBvZiBlbGVtZW50IG9uIHNjcmVlbiwgb3RoZXJ3aXNlIHRoZSBzY2FsaW5nIG9mIHRoZVxuICAvLyBkaW1lbnNpb25zIHdvbid0IG1hdGNoIHRoZSBjdXJzb3IgZm9yIGxpbmVhciBlbGVtZW50cy5cbiAgbGV0IGVsZU5ld1dpZHRoID0gZWxlbWVudC53aWR0aCAqIHNjYWxlWDtcbiAgbGV0IGVsZU5ld0hlaWdodCA9IGVsZW1lbnQuaGVpZ2h0ICogc2NhbGVZO1xuXG4gIC8vIGFkanVzdCBkaW1lbnNpb25zIGZvciByZXNpemluZyBmcm9tIGNlbnRlclxuICBpZiAoc2hvdWxkUmVzaXplRnJvbUNlbnRlcikge1xuICAgIGVsZU5ld1dpZHRoID0gMiAqIGVsZU5ld1dpZHRoIC0gZWxlSW5pdGlhbFdpZHRoO1xuICAgIGVsZU5ld0hlaWdodCA9IDIgKiBlbGVOZXdIZWlnaHQgLSBlbGVJbml0aWFsSGVpZ2h0O1xuICB9XG5cbiAgLy8gYWRqdXN0IGRpbWVuc2lvbnMgdG8ga2VlcCBzaWRlcyByYXRpb1xuICBpZiAoc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbykge1xuICAgIGNvbnN0IHdpZHRoUmF0aW8gPSBNYXRoLmFicyhlbGVOZXdXaWR0aCkgLyBlbGVJbml0aWFsV2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0UmF0aW8gPSBNYXRoLmFicyhlbGVOZXdIZWlnaHQpIC8gZWxlSW5pdGlhbEhlaWdodDtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZWxlTmV3SGVpZ2h0ICo9IHdpZHRoUmF0aW87XG4gICAgICBlbGVOZXdXaWR0aCAqPSBoZWlnaHRSYXRpbztcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHJhdGlvID0gTWF0aC5tYXgod2lkdGhSYXRpbywgaGVpZ2h0UmF0aW8pO1xuICAgICAgZWxlTmV3V2lkdGggPSBlbGVJbml0aWFsV2lkdGggKiByYXRpbyAqIE1hdGguc2lnbihlbGVOZXdXaWR0aCk7XG4gICAgICBlbGVOZXdIZWlnaHQgPSBlbGVJbml0aWFsSGVpZ2h0ICogcmF0aW8gKiBNYXRoLnNpZ24oZWxlTmV3SGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgIGNvbnN0IHN0YXRlT2ZCb3VuZFRleHRFbGVtZW50QXRSZXNpemUgPSBvcmlnaW5hbEVsZW1lbnRzLmdldChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQuaWQsXG4gICAgKSBhcyB0eXBlb2YgYm91bmRUZXh0RWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdGVPZkJvdW5kVGV4dEVsZW1lbnRBdFJlc2l6ZSkge1xuICAgICAgYm91bmRUZXh0Rm9udCA9IHtcbiAgICAgICAgZm9udFNpemU6IHN0YXRlT2ZCb3VuZFRleHRFbGVtZW50QXRSZXNpemUuZm9udFNpemUsXG4gICAgICAgIGJhc2VsaW5lOiBzdGF0ZU9mQm91bmRUZXh0RWxlbWVudEF0UmVzaXplLmJhc2VsaW5lLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8pIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0ge1xuICAgICAgICAuLi5lbGVtZW50LFxuICAgICAgICB3aWR0aDogZWxlTmV3V2lkdGgsXG4gICAgICAgIGhlaWdodDogZWxlTmV3SGVpZ2h0LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbmV4dEZvbnQgPSBtZWFzdXJlRm9udFNpemVGcm9tV2lkdGgoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKHVwZGF0ZWRFbGVtZW50KSxcbiAgICAgICAgZ2V0TWF4Q29udGFpbmVySGVpZ2h0KHVwZGF0ZWRFbGVtZW50KSxcbiAgICAgICk7XG4gICAgICBpZiAobmV4dEZvbnQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYm91bmRUZXh0Rm9udCA9IHtcbiAgICAgICAgZm9udFNpemU6IG5leHRGb250LnNpemUsXG4gICAgICAgIGJhc2VsaW5lOiBuZXh0Rm9udC5iYXNlbGluZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1pbldpZHRoID0gZ2V0QXBwcm94TWluTGluZVdpZHRoKFxuICAgICAgICBnZXRGb250U3RyaW5nKGJvdW5kVGV4dEVsZW1lbnQpLFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICApO1xuICAgICAgY29uc3QgbWluSGVpZ2h0ID0gZ2V0QXBwcm94TWluTGluZUhlaWdodChcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudC5mb250U2l6ZSxcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICAgICAgKTtcbiAgICAgIGVsZU5ld1dpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGVsZU5ld1dpZHRoLCBtaW5XaWR0aCkpO1xuICAgICAgZWxlTmV3SGVpZ2h0ID0gTWF0aC5jZWlsKE1hdGgubWF4KGVsZU5ld0hlaWdodCwgbWluSGVpZ2h0KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgW25ld0JvdW5kc1gxLCBuZXdCb3VuZHNZMSwgbmV3Qm91bmRzWDIsIG5ld0JvdW5kc1kyXSA9XG4gICAgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICAgIHN0YXRlQXRSZXNpemVTdGFydCxcbiAgICAgIGVsZU5ld1dpZHRoLFxuICAgICAgZWxlTmV3SGVpZ2h0LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICBjb25zdCBuZXdCb3VuZHNXaWR0aCA9IG5ld0JvdW5kc1gyIC0gbmV3Qm91bmRzWDE7XG4gIGNvbnN0IG5ld0JvdW5kc0hlaWdodCA9IG5ld0JvdW5kc1kyIC0gbmV3Qm91bmRzWTE7XG5cbiAgLy8gQ2FsY3VsYXRlIG5ldyB0b3BMZWZ0IGJhc2VkIG9uIGZpeGVkIGNvcm5lciBkdXJpbmcgcmVzaXplXG4gIGxldCBuZXdUb3BMZWZ0ID0gWy4uLnN0YXJ0VG9wTGVmdF0gYXMgW251bWJlciwgbnVtYmVyXTtcbiAgaWYgKFtcIm5cIiwgXCJ3XCIsIFwibndcIl0uaW5jbHVkZXModHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uKSkge1xuICAgIG5ld1RvcExlZnQgPSBbXG4gICAgICBzdGFydEJvdHRvbVJpZ2h0WzBdIC0gTWF0aC5hYnMobmV3Qm91bmRzV2lkdGgpLFxuICAgICAgc3RhcnRCb3R0b21SaWdodFsxXSAtIE1hdGguYWJzKG5ld0JvdW5kc0hlaWdodCksXG4gICAgXTtcbiAgfVxuICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uID09PSBcIm5lXCIpIHtcbiAgICBjb25zdCBib3R0b21MZWZ0ID0gW3N0YXJ0VG9wTGVmdFswXSwgc3RhcnRCb3R0b21SaWdodFsxXV07XG4gICAgbmV3VG9wTGVmdCA9IFtib3R0b21MZWZ0WzBdLCBib3R0b21MZWZ0WzFdIC0gTWF0aC5hYnMobmV3Qm91bmRzSGVpZ2h0KV07XG4gIH1cbiAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbiA9PT0gXCJzd1wiKSB7XG4gICAgY29uc3QgdG9wUmlnaHQgPSBbc3RhcnRCb3R0b21SaWdodFswXSwgc3RhcnRUb3BMZWZ0WzFdXTtcbiAgICBuZXdUb3BMZWZ0ID0gW3RvcFJpZ2h0WzBdIC0gTWF0aC5hYnMobmV3Qm91bmRzV2lkdGgpLCB0b3BSaWdodFsxXV07XG4gIH1cblxuICAvLyBLZWVwcyBvcHBvc2l0ZSBoYW5kbGUgZml4ZWQgZHVyaW5nIHJlc2l6ZVxuICBpZiAoc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbykge1xuICAgIGlmIChbXCJzXCIsIFwiblwiXS5pbmNsdWRlcyh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24pKSB7XG4gICAgICBuZXdUb3BMZWZ0WzBdID0gc3RhcnRDZW50ZXJbMF0gLSBuZXdCb3VuZHNXaWR0aCAvIDI7XG4gICAgfVxuICAgIGlmIChbXCJlXCIsIFwid1wiXS5pbmNsdWRlcyh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24pKSB7XG4gICAgICBuZXdUb3BMZWZ0WzFdID0gc3RhcnRDZW50ZXJbMV0gLSBuZXdCb3VuZHNIZWlnaHQgLyAyO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZsaXAgaG9yaXpvbnRhbGx5XG4gIGlmIChlbGVOZXdXaWR0aCA8IDApIHtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlRGlyZWN0aW9uLmluY2x1ZGVzKFwiZVwiKSkge1xuICAgICAgbmV3VG9wTGVmdFswXSAtPSBNYXRoLmFicyhuZXdCb3VuZHNXaWR0aCk7XG4gICAgfVxuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24uaW5jbHVkZXMoXCJ3XCIpKSB7XG4gICAgICBuZXdUb3BMZWZ0WzBdICs9IE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKTtcbiAgICB9XG4gIH1cbiAgLy8gRmxpcCB2ZXJ0aWNhbGx5XG4gIGlmIChlbGVOZXdIZWlnaHQgPCAwKSB7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcInNcIikpIHtcbiAgICAgIG5ld1RvcExlZnRbMV0gLT0gTWF0aC5hYnMobmV3Qm91bmRzSGVpZ2h0KTtcbiAgICB9XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZURpcmVjdGlvbi5pbmNsdWRlcyhcIm5cIikpIHtcbiAgICAgIG5ld1RvcExlZnRbMV0gKz0gTWF0aC5hYnMobmV3Qm91bmRzSGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvdWxkUmVzaXplRnJvbUNlbnRlcikge1xuICAgIG5ld1RvcExlZnRbMF0gPSBzdGFydENlbnRlclswXSAtIE1hdGguYWJzKG5ld0JvdW5kc1dpZHRoKSAvIDI7XG4gICAgbmV3VG9wTGVmdFsxXSA9IHN0YXJ0Q2VudGVyWzFdIC0gTWF0aC5hYnMobmV3Qm91bmRzSGVpZ2h0KSAvIDI7XG4gIH1cblxuICAvLyBhZGp1c3QgdG9wTGVmdCB0byBuZXcgcm90YXRpb24gcG9pbnRcbiAgY29uc3QgYW5nbGUgPSBzdGF0ZUF0UmVzaXplU3RhcnQuYW5nbGU7XG4gIGNvbnN0IHJvdGF0ZWRUb3BMZWZ0ID0gcm90YXRlUG9pbnQobmV3VG9wTGVmdCwgc3RhcnRDZW50ZXIsIGFuZ2xlKTtcbiAgY29uc3QgbmV3Q2VudGVyOiBQb2ludCA9IFtcbiAgICBuZXdUb3BMZWZ0WzBdICsgTWF0aC5hYnMobmV3Qm91bmRzV2lkdGgpIC8gMixcbiAgICBuZXdUb3BMZWZ0WzFdICsgTWF0aC5hYnMobmV3Qm91bmRzSGVpZ2h0KSAvIDIsXG4gIF07XG4gIGNvbnN0IHJvdGF0ZWROZXdDZW50ZXIgPSByb3RhdGVQb2ludChuZXdDZW50ZXIsIHN0YXJ0Q2VudGVyLCBhbmdsZSk7XG4gIG5ld1RvcExlZnQgPSByb3RhdGVQb2ludChyb3RhdGVkVG9wTGVmdCwgcm90YXRlZE5ld0NlbnRlciwgLWFuZ2xlKTtcblxuICAvLyBSZWFkanVzdCBwb2ludHMgZm9yIGxpbmVhciBlbGVtZW50c1xuICBsZXQgcmVzY2FsZWRFbGVtZW50UG9pbnRzWTtcbiAgbGV0IHJlc2NhbGVkUG9pbnRzO1xuXG4gIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXNjYWxlZEVsZW1lbnRQb2ludHNZID0gcmVzY2FsZVBvaW50cyhcbiAgICAgIDEsXG4gICAgICBlbGVOZXdIZWlnaHQsXG4gICAgICAoc3RhdGVBdFJlc2l6ZVN0YXJ0IGFzIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50KS5wb2ludHMsXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICByZXNjYWxlZFBvaW50cyA9IHJlc2NhbGVQb2ludHMoXG4gICAgICAwLFxuICAgICAgZWxlTmV3V2lkdGgsXG4gICAgICByZXNjYWxlZEVsZW1lbnRQb2ludHNZLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG5cbiAgLy8gRm9yIGxpbmVhciBlbGVtZW50cyAoeCx5KSBhcmUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCBkcmF3biBwb2ludCBub3QgdGhlIHRvcC1sZWZ0IGNvcm5lclxuICAvLyBTbyB3ZSBuZWVkIHRvIHJlYWRqdXN0ICh4LHkpIHRvIGJlIHdoZXJlIHRoZSBmaXJzdCBwb2ludCBzaG91bGQgYmVcbiAgY29uc3QgbmV3T3JpZ2luID0gWy4uLm5ld1RvcExlZnRdO1xuICBuZXdPcmlnaW5bMF0gKz0gc3RhdGVBdFJlc2l6ZVN0YXJ0LnggLSBuZXdCb3VuZHNYMTtcbiAgbmV3T3JpZ2luWzFdICs9IHN0YXRlQXRSZXNpemVTdGFydC55IC0gbmV3Qm91bmRzWTE7XG4gIGNvbnN0IHJlc2l6ZWRFbGVtZW50ID0ge1xuICAgIHdpZHRoOiBNYXRoLmFicyhlbGVOZXdXaWR0aCksXG4gICAgaGVpZ2h0OiBNYXRoLmFicyhlbGVOZXdIZWlnaHQpLFxuICAgIHg6IG5ld09yaWdpblswXSxcbiAgICB5OiBuZXdPcmlnaW5bMV0sXG4gICAgcG9pbnRzOiByZXNjYWxlZFBvaW50cyxcbiAgfTtcblxuICBpZiAoXCJzY2FsZVwiIGluIGVsZW1lbnQgJiYgXCJzY2FsZVwiIGluIHN0YXRlQXRSZXNpemVTdGFydCkge1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgc2NhbGU6IFtcbiAgICAgICAgLy8gZGVmYXVsdGluZyBiZWNhdXNlIHNjYWxlWC9ZIGNhbiBiZSAwLy0wXG4gICAgICAgIChNYXRoLnNpZ24obmV3Qm91bmRzWDIgLSBzdGF0ZUF0UmVzaXplU3RhcnQueCkgfHxcbiAgICAgICAgICBzdGF0ZUF0UmVzaXplU3RhcnQuc2NhbGVbMF0pICogc3RhdGVBdFJlc2l6ZVN0YXJ0LnNjYWxlWzBdLFxuICAgICAgICAoTWF0aC5zaWduKG5ld0JvdW5kc1kyIC0gc3RhdGVBdFJlc2l6ZVN0YXJ0LnkpIHx8XG4gICAgICAgICAgc3RhdGVBdFJlc2l6ZVN0YXJ0LnNjYWxlWzFdKSAqIHN0YXRlQXRSZXNpemVTdGFydC5zY2FsZVsxXSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoXG4gICAgcmVzaXplZEVsZW1lbnQud2lkdGggIT09IDAgJiZcbiAgICByZXNpemVkRWxlbWVudC5oZWlnaHQgIT09IDAgJiZcbiAgICBOdW1iZXIuaXNGaW5pdGUocmVzaXplZEVsZW1lbnQueCkgJiZcbiAgICBOdW1iZXIuaXNGaW5pdGUocmVzaXplZEVsZW1lbnQueSlcbiAgKSB7XG4gICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50LCB7XG4gICAgICBuZXdTaXplOiB7IHdpZHRoOiByZXNpemVkRWxlbWVudC53aWR0aCwgaGVpZ2h0OiByZXNpemVkRWxlbWVudC5oZWlnaHQgfSxcbiAgICB9KTtcblxuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwgcmVzaXplZEVsZW1lbnQpO1xuICAgIGlmIChib3VuZFRleHRFbGVtZW50ICYmIGJvdW5kVGV4dEZvbnQgIT0gbnVsbCkge1xuICAgICAgbXV0YXRlRWxlbWVudChib3VuZFRleHRFbGVtZW50LCB7XG4gICAgICAgIGZvbnRTaXplOiBib3VuZFRleHRGb250LmZvbnRTaXplLFxuICAgICAgICBiYXNlbGluZTogYm91bmRUZXh0Rm9udC5iYXNlbGluZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVCaW5kVGV4dFJlc2l6ZShlbGVtZW50LCB0cmFuc2Zvcm1IYW5kbGVEaXJlY3Rpb24pO1xuICB9XG59O1xuXG5jb25zdCByZXNpemVNdWx0aXBsZUVsZW1lbnRzID0gKFxuICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICBzZWxlY3RlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogXCJud1wiIHwgXCJuZVwiIHwgXCJzd1wiIHwgXCJzZVwiLFxuICBzaG91bGRSZXNpemVGcm9tQ2VudGVyOiBib29sZWFuLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuKSA9PiB7XG4gIC8vIG1hcCBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgb3JpZ2luYWwgZWxlbWVudHMuIFdoaWxlIGl0IG5ldmVyIHNob3VsZFxuICAvLyBoYXBwZW4gdGhhdCBwb2ludGVyRG93blN0YXRlLm9yaWdpbmFsRWxlbWVudHMgd29uJ3QgY29udGFpbiB0aGUgc2VsZWN0ZWRcbiAgLy8gZWxlbWVudHMgZHVyaW5nIHJlc2l6ZSwgdGhpcyBjb3VwbGluZyBpc24ndCBndWFyYW50ZWVkLCBzbyB0byBlbnN1cmVcbiAgLy8gdHlwZSBzYWZldHkgd2UgbmVlZCB0byB0cmFuc2Zvcm0gb25seSB0aG9zZSBlbGVtZW50cyB3ZSBmaWx0ZXIuXG4gIGNvbnN0IHRhcmdldEVsZW1lbnRzID0gc2VsZWN0ZWRFbGVtZW50cy5yZWR1Y2UoXG4gICAgKFxuICAgICAgYWNjOiB7XG4gICAgICAgIC8qKiBlbGVtZW50IGF0IHJlc2l6ZSBzdGFydCAqL1xuICAgICAgICBvcmlnOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQ7XG4gICAgICAgIC8qKiBsYXRlc3QgZWxlbWVudCAqL1xuICAgICAgICBsYXRlc3Q6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudDtcbiAgICAgIH1bXSxcbiAgICAgIGVsZW1lbnQsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmlnRWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luYWxFbGVtZW50cy5nZXQoZWxlbWVudC5pZCk7XG4gICAgICBpZiAob3JpZ0VsZW1lbnQpIHtcbiAgICAgICAgYWNjLnB1c2goeyBvcmlnOiBvcmlnRWxlbWVudCwgbGF0ZXN0OiBlbGVtZW50IH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbWlkWCwgbWlkWSB9ID0gZ2V0Q29tbW9uQm91bmRpbmdCb3goXG4gICAgdGFyZ2V0RWxlbWVudHMubWFwKCh7IG9yaWcgfSkgPT4gb3JpZyksXG4gICk7XG4gIGNvbnN0IGRpcmVjdGlvbiA9IHRyYW5zZm9ybUhhbmRsZVR5cGU7XG5cbiAgY29uc3QgbWFwRGlyZWN0aW9uc1RvQW5jaG9yczogUmVjb3JkPHR5cGVvZiBkaXJlY3Rpb24sIFBvaW50PiA9IHtcbiAgICBuZTogW21pblgsIG1heFldLFxuICAgIHNlOiBbbWluWCwgbWluWV0sXG4gICAgc3c6IFttYXhYLCBtaW5ZXSxcbiAgICBudzogW21heFgsIG1heFldLFxuICB9O1xuXG4gIC8vIGFuY2hvciBwb2ludCBtdXN0IGJlIG9uIHRoZSBvcHBvc2l0ZSBzaWRlIG9mIHRoZSBkcmFnZ2VkIHNlbGVjdGlvbiBoYW5kbGVcbiAgLy8gb3IgYmUgdGhlIGNlbnRlciBvZiB0aGUgc2VsZWN0aW9uIGlmIGFsdCBpcyBwcmVzc2VkXG4gIGNvbnN0IFthbmNob3JYLCBhbmNob3JZXTogUG9pbnQgPSBzaG91bGRSZXNpemVGcm9tQ2VudGVyXG4gICAgPyBbbWlkWCwgbWlkWV1cbiAgICA6IG1hcERpcmVjdGlvbnNUb0FuY2hvcnNbZGlyZWN0aW9uXTtcblxuICBjb25zdCBtYXBEaXJlY3Rpb25zVG9Qb2ludGVyU2lkZXM6IFJlY29yZDxcbiAgICB0eXBlb2YgZGlyZWN0aW9uLFxuICAgIFt4OiBib29sZWFuLCB5OiBib29sZWFuXVxuICA+ID0ge1xuICAgIG5lOiBbcG9pbnRlclggPj0gYW5jaG9yWCwgcG9pbnRlclkgPD0gYW5jaG9yWV0sXG4gICAgc2U6IFtwb2ludGVyWCA+PSBhbmNob3JYLCBwb2ludGVyWSA+PSBhbmNob3JZXSxcbiAgICBzdzogW3BvaW50ZXJYIDw9IGFuY2hvclgsIHBvaW50ZXJZID49IGFuY2hvclldLFxuICAgIG53OiBbcG9pbnRlclggPD0gYW5jaG9yWCwgcG9pbnRlclkgPD0gYW5jaG9yWV0sXG4gIH07XG5cbiAgLy8gcG9pbnRlciBzaWRlIHJlbGF0aXZlIHRvIGFuY2hvclxuICBjb25zdCBbcG9pbnRlclNpZGVYLCBwb2ludGVyU2lkZVldID0gbWFwRGlyZWN0aW9uc1RvUG9pbnRlclNpZGVzW1xuICAgIGRpcmVjdGlvblxuICBdLm1hcCgoY29uZGl0aW9uKSA9PiAoY29uZGl0aW9uID8gMSA6IC0xKSk7XG5cbiAgLy8gc3RvcCByZXNpemluZyBpZiBhIHBvaW50ZXIgaXMgb24gdGhlIG90aGVyIHNpZGUgb2Ygc2VsZWN0aW9uXG4gIGlmIChwb2ludGVyU2lkZVggPCAwICYmIHBvaW50ZXJTaWRlWSA8IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzY2FsZSA9XG4gICAgTWF0aC5tYXgoXG4gICAgICAocG9pbnRlclNpZGVYICogTWF0aC5hYnMocG9pbnRlclggLSBhbmNob3JYKSkgLyAobWF4WCAtIG1pblgpLFxuICAgICAgKHBvaW50ZXJTaWRlWSAqIE1hdGguYWJzKHBvaW50ZXJZIC0gYW5jaG9yWSkpIC8gKG1heFkgLSBtaW5ZKSxcbiAgICApICogKHNob3VsZFJlc2l6ZUZyb21DZW50ZXIgPyAyIDogMSk7XG5cbiAgaWYgKHNjYWxlID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFyZ2V0RWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHdpZHRoID0gZWxlbWVudC5vcmlnLndpZHRoICogc2NhbGU7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5vcmlnLmhlaWdodCAqIHNjYWxlO1xuICAgIGNvbnN0IHggPSBhbmNob3JYICsgKGVsZW1lbnQub3JpZy54IC0gYW5jaG9yWCkgKiBzY2FsZTtcbiAgICBjb25zdCB5ID0gYW5jaG9yWSArIChlbGVtZW50Lm9yaWcueSAtIGFuY2hvclkpICogc2NhbGU7XG5cbiAgICAvLyByZWFkanVzdCBwb2ludHMgZm9yIGxpbmVhciAmIGZyZWUgZHJhdyBlbGVtZW50c1xuICAgIGNvbnN0IHJlc2NhbGVkUG9pbnRzID0gcmVzY2FsZVBvaW50c0luRWxlbWVudChcbiAgICAgIGVsZW1lbnQub3JpZyxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZToge1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgeDogbnVtYmVyO1xuICAgICAgeTogbnVtYmVyO1xuICAgICAgcG9pbnRzPzogUG9pbnRbXTtcbiAgICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgICAgYmFzZWxpbmU/OiBudW1iZXI7XG4gICAgfSA9IHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICAuLi5yZXNjYWxlZFBvaW50cyxcbiAgICB9O1xuXG4gICAgbGV0IGJvdW5kVGV4dFVwZGF0ZXM6IHsgZm9udFNpemU6IG51bWJlcjsgYmFzZWxpbmU6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50LmxhdGVzdCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCB8fCBpc1RleHRFbGVtZW50KGVsZW1lbnQub3JpZykpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0ge1xuICAgICAgICAuLi5lbGVtZW50LmxhdGVzdCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgIH07XG4gICAgICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZUZvbnRTaXplRnJvbVdpZHRoKFxuICAgICAgICBib3VuZFRleHRFbGVtZW50ID8/IChlbGVtZW50Lm9yaWcgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50KSxcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudFxuICAgICAgICAgID8gZ2V0TWF4Q29udGFpbmVyV2lkdGgodXBkYXRlZEVsZW1lbnQpXG4gICAgICAgICAgOiB1cGRhdGVkRWxlbWVudC53aWR0aCxcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudFxuICAgICAgICAgID8gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KHVwZGF0ZWRFbGVtZW50KVxuICAgICAgICAgIDogdXBkYXRlZEVsZW1lbnQuaGVpZ2h0LFxuICAgICAgKTtcblxuICAgICAgaWYgKCFtZXRyaWNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudC5vcmlnKSkge1xuICAgICAgICB1cGRhdGUuZm9udFNpemUgPSBtZXRyaWNzLnNpemU7XG4gICAgICAgIHVwZGF0ZS5iYXNlbGluZSA9IG1ldHJpY3MuYmFzZWxpbmU7XG4gICAgICB9XG5cbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgIGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgICAgICAgZm9udFNpemU6IG1ldHJpY3Muc2l6ZSxcbiAgICAgICAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQubGF0ZXN0LCB7IG5ld1NpemU6IHsgd2lkdGgsIGhlaWdodCB9IH0pO1xuXG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LmxhdGVzdCwgdXBkYXRlKTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50ICYmIGJvdW5kVGV4dFVwZGF0ZXMpIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCwgYm91bmRUZXh0VXBkYXRlcyk7XG5cbiAgICAgIGhhbmRsZUJpbmRUZXh0UmVzaXplKGVsZW1lbnQubGF0ZXN0LCB0cmFuc2Zvcm1IYW5kbGVUeXBlKTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3Qgcm90YXRlTXVsdGlwbGVFbGVtZW50cyA9IChcbiAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBwb2ludGVyWDogbnVtYmVyLFxuICBwb2ludGVyWTogbnVtYmVyLFxuICBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZTogYm9vbGVhbixcbiAgY2VudGVyWDogbnVtYmVyLFxuICBjZW50ZXJZOiBudW1iZXIsXG4pID0+IHtcbiAgbGV0IGNlbnRlckFuZ2xlID1cbiAgICAoNSAqIE1hdGguUEkpIC8gMiArIE1hdGguYXRhbjIocG9pbnRlclkgLSBjZW50ZXJZLCBwb2ludGVyWCAtIGNlbnRlclgpO1xuICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUpIHtcbiAgICBjZW50ZXJBbmdsZSArPSBTSElGVF9MT0NLSU5HX0FOR0xFIC8gMjtcbiAgICBjZW50ZXJBbmdsZSAtPSBjZW50ZXJBbmdsZSAlIFNISUZUX0xPQ0tJTkdfQU5HTEU7XG4gIH1cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgICBjb25zdCBvcmlnQW5nbGUgPVxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5hbEVsZW1lbnRzLmdldChlbGVtZW50LmlkKT8uYW5nbGUgPz8gZWxlbWVudC5hbmdsZTtcbiAgICBjb25zdCBbcm90YXRlZENYLCByb3RhdGVkQ1ldID0gcm90YXRlKFxuICAgICAgY3gsXG4gICAgICBjeSxcbiAgICAgIGNlbnRlclgsXG4gICAgICBjZW50ZXJZLFxuICAgICAgY2VudGVyQW5nbGUgKyBvcmlnQW5nbGUgLSBlbGVtZW50LmFuZ2xlLFxuICAgICk7XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICB4OiBlbGVtZW50LnggKyAocm90YXRlZENYIC0gY3gpLFxuICAgICAgeTogZWxlbWVudC55ICsgKHJvdGF0ZWRDWSAtIGN5KSxcbiAgICAgIGFuZ2xlOiBub3JtYWxpemVBbmdsZShjZW50ZXJBbmdsZSArIG9yaWdBbmdsZSksXG4gICAgfSk7XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICAgIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICAgIGNvbnN0IHRleHRFbGVtZW50ID1cbiAgICAgICAgU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQ8RXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcj4oXG4gICAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgICApO1xuICAgICAgaWYgKHRleHRFbGVtZW50ICYmICFpc0Fycm93RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICAgICAgeDogdGV4dEVsZW1lbnQueCArIChyb3RhdGVkQ1ggLSBjeCksXG4gICAgICAgICAgeTogdGV4dEVsZW1lbnQueSArIChyb3RhdGVkQ1kgLSBjeSksXG4gICAgICAgICAgYW5nbGU6IG5vcm1hbGl6ZUFuZ2xlKGNlbnRlckFuZ2xlICsgb3JpZ0FuZ2xlKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVPZmZzZXRYWSA9IChcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9XG4gICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDFcbiAgICAgID8gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICA6IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gIGNvbnN0IGFuZ2xlID0gc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgPyBzZWxlY3RlZEVsZW1lbnRzWzBdLmFuZ2xlIDogMDtcbiAgW3gsIHldID0gcm90YXRlKHgsIHksIGN4LCBjeSwgLWFuZ2xlKTtcbiAgc3dpdGNoICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgY2FzZSBcIm5cIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtICh4MSArIHgyKSAvIDIsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzXCI6XG4gICAgICByZXR1cm4gcm90YXRlKHggLSAoeDEgKyB4MikgLyAyLCB5IC0geTIsIDAsIDAsIGFuZ2xlKTtcbiAgICBjYXNlIFwid1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSAoeTEgKyB5MikgLyAyLCAwLCAwLCBhbmdsZSk7XG4gICAgY2FzZSBcImVcIjpcbiAgICAgIHJldHVybiByb3RhdGUoeCAtIHgyLCB5IC0gKHkxICsgeTIpIC8gMiwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJud1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJuZVwiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDIsIHkgLSB5MSwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzd1wiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDEsIHkgLSB5MiwgMCwgMCwgYW5nbGUpO1xuICAgIGNhc2UgXCJzZVwiOlxuICAgICAgcmV0dXJuIHJvdGF0ZSh4IC0geDIsIHkgLSB5MiwgMCwgMCwgYW5nbGUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gWzAsIDBdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24gPSAoXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4pOiBcIm9yaWdpblwiIHwgXCJlbmRcIiA9PiB7XG4gIGNvbnN0IFssIFtweCwgcHldXSA9IGVsZW1lbnQucG9pbnRzO1xuICBjb25zdCBpc1Jlc2l6ZUVuZCA9XG4gICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiAmJiAocHggPCAwIHx8IHB5IDwgMCkpIHx8XG4gICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiAmJiBweCA+PSAwKSB8fFxuICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcInN3XCIgJiYgcHggPD0gMCkgfHxcbiAgICAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJzZVwiICYmIChweCA+IDAgfHwgcHkgPiAwKSk7XG4gIHJldHVybiBpc1Jlc2l6ZUVuZCA/IFwiZW5kXCIgOiBcIm9yaWdpblwiO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/resizeElements.ts\n");
|
|
3278
3278
|
|
|
3279
3279
|
/***/ }),
|
|
3280
3280
|
|
|
@@ -3329,7 +3329,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3329
3329
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3330
3330
|
|
|
3331
3331
|
"use strict";
|
|
3332
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"computeContainerDimensionForBoundText\": () => (/* binding */ computeContainerDimensionForBoundText),\n/* harmony export */ \"detectLineHeight\": () => (/* binding */ detectLineHeight),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElementOffset\": () => (/* binding */ getBoundTextElementOffset),\n/* harmony export */ \"getBoundTextElementPosition\": () => (/* binding */ getBoundTextElementPosition),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerCoords\": () => (/* binding */ getContainerCoords),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getDefaultLineHeight\": () => (/* binding */ getDefaultLineHeight),\n/* harmony export */ \"getLineHeightInPx\": () => (/* binding */ getLineHeightInPx),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMaxContainerHeight\": () => (/* binding */ getMaxContainerHeight),\n/* harmony export */ \"getMaxContainerWidth\": () => (/* binding */ getMaxContainerWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\n/* harmony export */ \"getTextHeight\": () => (/* binding */ getTextHeight),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isMeasureTextSupported\": () => (/* binding */ isMeasureTextSupported),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"splitIntoLines\": () => (/* binding */ splitIntoLines),\n/* harmony export */ \"suppportsHorizontalAlign\": () => (/* binding */ suppportsHorizontalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeText = (text) => {\n return (text\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n // normalize newlines\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\n};\nconst splitIntoLines = (text) => {\n return normalizeText(text).split(\"\\n\");\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n };\n boundTextUpdates.text = textElement.text;\n if (container) {\n maxWidth = getMaxContainerWidth(container);\n boundTextUpdates.text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(boundTextUpdates.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n if (container) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const centerX = textElement.x + textElement.width / 2;\n const centerY = textElement.y + textElement.height / 2;\n const diffWidth = metrics.width - textElement.width;\n const diffHeight = metrics.height - textElement.height;\n boundTextUpdates.x = centerY - (textElement.height + diffHeight) / 2;\n boundTextUpdates.y = centerX - (textElement.width + diffWidth) / 2;\n }\n else {\n const containerDims = getContainerDims(container);\n let maxContainerHeight = getMaxContainerHeight(container);\n let nextHeight = containerDims.height;\n if (metrics.height > maxContainerHeight) {\n nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n maxContainerHeight = getMaxContainerHeight(container);\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.updateOriginalContainerCache)(container.id, nextHeight);\n }\n const updatedTextElement = Object.assign(Object.assign({}, textElement), boundTextUpdates);\n const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, boundTextUpdates);\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (element.boundElements || [])\n .filter((boundElement) => boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId)\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = getMaxContainerWidth(container);\n const maxHeight = getMaxContainerHeight(container);\n let containerHeight = containerDims.height;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n nextHeight = dimensions.height;\n nextWidth = dimensions.width;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(nextHeight, container.type);\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, computeBoundTextPosition(container, textElement));\n }\n }\n};\nconst computeBoundTextPosition = (container, boundTextElement) => {\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getMaxContainerHeight(container);\n const maxContainerWidth = getMaxContainerWidth(container);\n let x;\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n }\n else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n }\n else if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n }\n else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, lineHeight) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const fontSize = parseFloat(font);\n const height = getTextHeight(text, fontSize, lineHeight);\n const width = getTextWidth(text, font);\n return { width, height };\n};\n/**\n * To get unitless line-height (if unknown) we can calculate it by dividing\n * height-per-line by fontSize.\n */\nconst detectLineHeight = (textElement) => {\n const lineCount = splitIntoLines(textElement.text).length;\n return (textElement.height /\n lineCount /\n textElement.fontSize);\n};\n/**\n * We calculate the line height from the font size and the unitless line height,\n * aligning with the W3C spec.\n */\nconst getLineHeightInPx = (fontSize, lineHeight) => {\n return fontSize * lineHeight;\n};\n// FIXME rename to getApproxMinContainerHeight\nconst getApproxMinLineHeight = (fontSize, lineHeight) => {\n return getLineHeightInPx(fontSize, lineHeight) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return width * 10;\n }\n return width;\n};\nconst getTextWidth = (text, font) => {\n const lines = splitIntoLines(text);\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst getTextHeight = (text, fontSize, lineHeight) => {\n const lineCount = splitIntoLines(text).length;\n return getLineHeightInPx(fontSize, lineHeight) * lineCount;\n};\nconst wrapText = (text, font, maxWidth) => {\n // if maxWidth is not finite or NaN which can happen in case of bugs in\n // computation, we need to make sure we don't continue as we'll end up\n // in an infinite loop\n if (!Number.isFinite(maxWidth) || maxWidth < 0) {\n return text;\n }\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n const resetParams = () => {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n };\n originalLines.forEach((originalLine) => {\n const currentLineWidth = getTextWidth(originalLine, font);\n //Push the line if its <= maxWidth\n if (currentLineWidth <= maxWidth) {\n lines.push(originalLine);\n return; // continue\n }\n const words = originalLine.split(\" \");\n resetParams();\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n resetParams();\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n resetParams();\n }\n else {\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n resetParams();\n break;\n }\n index++;\n currentLine += `${word} `;\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n const word = currentLine.slice(0, -1);\n push(word);\n resetParams();\n break;\n }\n }\n }\n }\n if (currentLine.slice(-1) === \" \") {\n // only remove last trailing space which we have added when joining words\n currentLine = currentLine.slice(0, -1);\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\n// FIXME rename to getApproxMinContainerWidth\nconst getApproxMinLineWidth = (font, lineHeight) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font, lineHeight).width +\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\n }\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getContainerCoords = (container) => {\n let offsetX = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n let offsetY = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container || !boundTextElement) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst suppportsHorizontalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element);\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_7__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_8__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"image\",\n \"arrow\",\n]);\nconst isValidTextContainer = (element) => VALID_CONTAINER_TYPES.has(element.type);\nconst computeContainerDimensionForBoundText = (dimension, containerType) => {\n dimension = Math.ceil(dimension);\n const padding = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\nconst getMaxContainerWidth = (container) => {\n const width = getContainerDims(container).width;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerWidth = width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerWidth <= 0) {\n const boundText = getBoundTextElement(container);\n if (boundText) {\n return boundText.width;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n return containerWidth;\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMaxContainerHeight = (container) => {\n const height = getContainerDims(container).height;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerHeight = height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n const boundText = getBoundTextElement(container);\n if (boundText) {\n return boundText.height;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst isMeasureTextSupported = () => {\n const width = getTextWidth(DUMMY_TEXT, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_SIZE,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY,\n }));\n return width > 0;\n};\n/**\n * Unitless line height\n *\n * In previous versions we used `normal` line height, which browsers interpret\n * differently, and based on font-family and font-size.\n *\n * To make line heights consistent across browsers we hardcode the values for\n * each of our fonts based on most common average line-heights.\n * See https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971\n * where the values come from.\n */\nconst DEFAULT_LINE_HEIGHT = {\n // ~1.25 is the average for Virgil in WebKit and Blink.\n // Gecko (FF) uses ~1.28.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Virgil]: 1.25,\n // ~1.15 is the average for Virgil in WebKit and Blink.\n // Gecko if all over the place.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Helvetica]: 1.15,\n // ~1.2 is the average for Virgil in WebKit and Blink, and kinda Gecko too\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Cascadia]: 1.2,\n};\nconst getDefaultLineHeight = (fontFamily) => {\n if (fontFamily in DEFAULT_LINE_HEIGHT) {\n return DEFAULT_LINE_HEIGHT[fontFamily];\n }\n return DEFAULT_LINE_HEIGHT[_constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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REFBb0IsQ0FBQyxFQUFFLEdBQTBDO0NBQ25FLENBQUM7QUFFSyxNQUFNLG9CQUFvQixHQUFHLENBQUMsVUFBNEIsRUFBRSxFQUFFO0lBQ25FLElBQUksVUFBVSxJQUFJLG1CQUFtQixFQUFFO1FBQ3JDLE9BQU8sbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDeEM7SUFDRCxPQUFPLG1CQUFtQixDQUFDLDJEQUFtQixDQUFDLENBQUM7QUFDbEQsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dEVsZW1lbnQudHM/NDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRGb250U3RyaW5nLCBhcnJheVRvTWFwLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBGb250RmFtaWx5VmFsdWVzLFxuICBGb250U3RyaW5nLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgQk9VTkRfVEVYVF9QQURESU5HLFxuICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICBERUZBVUxUX0ZPTlRfU0laRSxcbiAgRk9OVF9GQU1JTFksXG4gIFRFWFRfQUxJR04sXG4gIFZFUlRJQ0FMX0FMSUdOLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGUgfSBmcm9tIFwiLi90cmFuc2Zvcm1IYW5kbGVzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGlzQm91bmRUb0NvbnRhaW5lciwgaXNBcnJvd0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG4gIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5pbXBvcnQgeyBFeHRyYWN0U2V0VHlwZSB9IGZyb20gXCIuLi91dGlsaXR5LXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzcGxpdEludG9MaW5lcyA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVRleHQodGV4dCkuc3BsaXQoXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgcmVkcmF3VGV4dEJvdW5kaW5nQm94ID0gKFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBsZXQgbWF4V2lkdGggPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgeDogdGV4dEVsZW1lbnQueCxcbiAgICB5OiB0ZXh0RWxlbWVudC55LFxuICAgIHRleHQ6IHRleHRFbGVtZW50LnRleHQsXG4gICAgd2lkdGg6IHRleHRFbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogdGV4dEVsZW1lbnQuaGVpZ2h0LFxuICB9O1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMudGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICBib3VuZFRleHRVcGRhdGVzLnRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgbWF4V2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgYm91bmRUZXh0VXBkYXRlcy50ZXh0LFxuICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgIHRleHRFbGVtZW50LmxpbmVIZWlnaHQsXG4gICk7XG5cbiAgYm91bmRUZXh0VXBkYXRlcy53aWR0aCA9IG1ldHJpY3Mud2lkdGg7XG4gIGJvdW5kVGV4dFVwZGF0ZXMuaGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQ7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBjb25zdCBjZW50ZXJYID0gdGV4dEVsZW1lbnQueCArIHRleHRFbGVtZW50LndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGNlbnRlclkgPSB0ZXh0RWxlbWVudC55ICsgdGV4dEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IGRpZmZXaWR0aCA9IG1ldHJpY3Mud2lkdGggLSB0ZXh0RWxlbWVudC53aWR0aDtcbiAgICAgIGNvbnN0IGRpZmZIZWlnaHQgPSBtZXRyaWNzLmhlaWdodCAtIHRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgIGJvdW5kVGV4dFVwZGF0ZXMueCA9IGNlbnRlclkgLSAodGV4dEVsZW1lbnQuaGVpZ2h0ICsgZGlmZkhlaWdodCkgLyAyO1xuICAgICAgYm91bmRUZXh0VXBkYXRlcy55ID0gY2VudGVyWCAtICh0ZXh0RWxlbWVudC53aWR0aCArIGRpZmZXaWR0aCkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgICAgbGV0IG1heENvbnRhaW5lckhlaWdodCA9IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpO1xuXG4gICAgICBsZXQgbmV4dEhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgICAgaWYgKG1ldHJpY3MuaGVpZ2h0ID4gbWF4Q29udGFpbmVySGVpZ2h0KSB7XG4gICAgICAgIG5leHRIZWlnaHQgPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICAgIG1ldHJpY3MuaGVpZ2h0LFxuICAgICAgICAgIGNvbnRhaW5lci50eXBlLFxuICAgICAgICApO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IG5leHRIZWlnaHQgfSk7XG4gICAgICAgIG1heENvbnRhaW5lckhlaWdodCA9IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpO1xuICAgICAgICB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCwgbmV4dEhlaWdodCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPSB7XG4gICAgICAgIC4uLnRleHRFbGVtZW50LFxuICAgICAgICAuLi5ib3VuZFRleHRVcGRhdGVzLFxuICAgICAgfSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyO1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSBjb21wdXRlQm91bmRUZXh0UG9zaXRpb24oY29udGFpbmVyLCB1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgYm91bmRUZXh0VXBkYXRlcy54ID0geDtcbiAgICAgIGJvdW5kVGV4dFVwZGF0ZXMueSA9IHk7XG4gICAgfVxuICB9XG5cbiAgbXV0YXRlRWxlbWVudCh0ZXh0RWxlbWVudCwgYm91bmRUZXh0VXBkYXRlcyk7XG59O1xuXG5leHBvcnQgY29uc3QgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbiA9IChcbiAgc2NlbmVFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZElkVG9EdXBsaWNhdGVkSWQ6IE1hcDxFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLCBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdPixcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzY2VuZUVsZW1lbnRNYXAgPSBhcnJheVRvTWFwKHNjZW5lRWxlbWVudHMpIGFzIE1hcDxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50XG4gID47XG4gIG9sZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBuZXdFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChlbGVtZW50LmlkKSBhcyBzdHJpbmc7XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuXG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgICAgY29uc3QgbmV3VGV4dEVsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGJvdW5kVGV4dEVsZW1lbnRJZCk7XG4gICAgICBpZiAobmV3VGV4dEVsZW1lbnRJZCkge1xuICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSBzY2VuZUVsZW1lbnRNYXAuZ2V0KG5ld0VsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdDb250YWluZXIpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG5ld0NvbnRhaW5lciwge1xuICAgICAgICAgICAgYm91bmRFbGVtZW50czogKGVsZW1lbnQuYm91bmRFbGVtZW50cyB8fCBbXSlcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoYm91bmRFbGVtZW50KSA9PlxuICAgICAgICAgICAgICAgICAgYm91bmRFbGVtZW50LmlkICE9PSBuZXdUZXh0RWxlbWVudElkICYmXG4gICAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQuaWQgIT09IGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuY29uY2F0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBpZDogbmV3VGV4dEVsZW1lbnRJZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VGV4dEVsZW1lbnQgPSBzY2VuZUVsZW1lbnRNYXAuZ2V0KG5ld1RleHRFbGVtZW50SWQpO1xuICAgICAgICBpZiAobmV3VGV4dEVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudChuZXdUZXh0RWxlbWVudCkpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG5ld1RleHRFbGVtZW50LCB7XG4gICAgICAgICAgICBjb250YWluZXJJZDogbmV3Q29udGFpbmVyID8gbmV3RWxlbWVudElkIDogbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlQmluZFRleHRSZXNpemUgPSAoXG4gIGNvbnRhaW5lcjogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGUsXG4pID0+IHtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG4gIGlmICghYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZShjb250YWluZXIuaWQpO1xuICBsZXQgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShjb250YWluZXIpIS5nZXRFbGVtZW50KFxuICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gIGlmICh0ZXh0RWxlbWVudCAmJiB0ZXh0RWxlbWVudC50ZXh0KSB7XG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGNvbnRhaW5lcikhLmdldEVsZW1lbnQoXG4gICAgICBib3VuZFRleHRFbGVtZW50SWQsXG4gICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgbGV0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuICAgIGxldCBuZXh0SGVpZ2h0ID0gdGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgIGxldCBuZXh0V2lkdGggPSB0ZXh0RWxlbWVudC53aWR0aDtcbiAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgIGNvbnN0IG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICBjb25zdCBtYXhIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcbiAgICBsZXQgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwiblwiICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwic1wiKSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZGltZW5zaW9ucyA9IG1lYXN1cmVUZXh0KFxuICAgICAgICB0ZXh0LFxuICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgdGV4dEVsZW1lbnQubGluZUhlaWdodCxcbiAgICAgICk7XG4gICAgICBuZXh0SGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQ7XG4gICAgICBuZXh0V2lkdGggPSBkaW1lbnNpb25zLndpZHRoO1xuICAgIH1cbiAgICAvLyBpbmNyZWFzZSBoZWlnaHQgaW4gY2FzZSB0ZXh0IGVsZW1lbnQgaGVpZ2h0IGV4Y2VlZHNcbiAgICBpZiAobmV4dEhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgY29udGFpbmVySGVpZ2h0ID0gY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgbmV4dEhlaWdodCxcbiAgICAgICAgY29udGFpbmVyLnR5cGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaWZmID0gY29udGFpbmVySGVpZ2h0IC0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgICAvLyBmaXggdGhlIHkgY29vcmQgd2hlbiByZXNpemluZyBmcm9tIG5lL253L25cbiAgICAgIGNvbnN0IHVwZGF0ZWRZID1cbiAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwiblwiKVxuICAgICAgICAgID8gY29udGFpbmVyLnkgLSBkaWZmXG4gICAgICAgICAgOiBjb250YWluZXIueTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgIGhlaWdodDogY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB5OiB1cGRhdGVkWSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgIHRleHQsXG4gICAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICB0ZXh0RWxlbWVudCxcbiAgICAgICAgY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB0ZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGNvbXB1dGVCb3VuZFRleHRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBjb25zdCBjb250YWluZXJDb29yZHMgPSBnZXRDb250YWluZXJDb29yZHMoY29udGFpbmVyKTtcbiAgY29uc3QgbWF4Q29udGFpbmVySGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG4gIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcblxuICBsZXQgeDtcbiAgbGV0IHk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLlRPUCkge1xuICAgIHkgPSBjb250YWluZXJDb29yZHMueTtcbiAgfSBlbHNlIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLkJPVFRPTSkge1xuICAgIHkgPSBjb250YWluZXJDb29yZHMueSArIChtYXhDb250YWluZXJIZWlnaHQgLSBib3VuZFRleHRFbGVtZW50LmhlaWdodCk7XG4gIH0gZWxzZSB7XG4gICAgeSA9XG4gICAgICBjb250YWluZXJDb29yZHMueSArXG4gICAgICAobWF4Q29udGFpbmVySGVpZ2h0IC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMik7XG4gIH1cbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLkxFRlQpIHtcbiAgICB4ID0gY29udGFpbmVyQ29vcmRzLng7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFQpIHtcbiAgICB4ID0gY29udGFpbmVyQ29vcmRzLnggKyAobWF4Q29udGFpbmVyV2lkdGggLSBib3VuZFRleHRFbGVtZW50LndpZHRoKTtcbiAgfSBlbHNlIHtcbiAgICB4ID1cbiAgICAgIGNvbnRhaW5lckNvb3Jkcy54ICsgKG1heENvbnRhaW5lcldpZHRoIC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQud2lkdGggLyAyKTtcbiAgfVxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Jhc3NhdG9yL2NhbnZhcy10ZXh0LWVkaXRvci9ibG9iL21hc3Rlci9saWIvRm9udE1ldHJpY3MuanNcblxuZXhwb3J0IGNvbnN0IG1lYXN1cmVUZXh0ID0gKFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZvbnQ6IEZvbnRTdHJpbmcsXG4gIGxpbmVIZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4pID0+IHtcbiAgdGV4dCA9IHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAvLyByZXBsYWNlIGVtcHR5IGxpbmVzIHdpdGggc2luZ2xlIHNwYWNlIGJlY2F1c2UgbGVhZGluZy90cmFpbGluZyBlbXB0eVxuICAgIC8vIGxpbmVzIHdvdWxkIGJlIHN0cmlwcGVkIGZyb20gY29tcHV0YXRpb25cbiAgICAubWFwKCh4KSA9PiB4IHx8IFwiIFwiKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udCk7XG4gIGNvbnN0IGhlaWdodCA9IGdldFRleHRIZWlnaHQodGV4dCwgZm9udFNpemUsIGxpbmVIZWlnaHQpO1xuICBjb25zdCB3aWR0aCA9IGdldFRleHRXaWR0aCh0ZXh0LCBmb250KTtcblxuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XG59O1xuXG4vKipcbiAqIFRvIGdldCB1bml0bGVzcyBsaW5lLWhlaWdodCAoaWYgdW5rbm93bikgd2UgY2FuIGNhbGN1bGF0ZSBpdCBieSBkaXZpZGluZ1xuICogaGVpZ2h0LXBlci1saW5lIGJ5IGZvbnRTaXplLlxuICovXG5leHBvcnQgY29uc3QgZGV0ZWN0TGluZUhlaWdodCA9ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiB7XG4gIGNvbnN0IGxpbmVDb3VudCA9IHNwbGl0SW50b0xpbmVzKHRleHRFbGVtZW50LnRleHQpLmxlbmd0aDtcbiAgcmV0dXJuICh0ZXh0RWxlbWVudC5oZWlnaHQgL1xuICAgIGxpbmVDb3VudCAvXG4gICAgdGV4dEVsZW1lbnQuZm9udFNpemUpIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl07XG59O1xuXG4vKipcbiAqIFdlIGNhbGN1bGF0ZSB0aGUgbGluZSBoZWlnaHQgZnJvbSB0aGUgZm9udCBzaXplIGFuZCB0aGUgdW5pdGxlc3MgbGluZSBoZWlnaHQsXG4gKiBhbGlnbmluZyB3aXRoIHRoZSBXM0Mgc3BlYy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldExpbmVIZWlnaHRJblB4ID0gKFxuICBmb250U2l6ZTogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wiZm9udFNpemVcIl0sXG4gIGxpbmVIZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4pID0+IHtcbiAgcmV0dXJuIGZvbnRTaXplICogbGluZUhlaWdodDtcbn07XG5cbi8vIEZJWE1FIHJlbmFtZSB0byBnZXRBcHByb3hNaW5Db250YWluZXJIZWlnaHRcbmV4cG9ydCBjb25zdCBnZXRBcHByb3hNaW5MaW5lSGVpZ2h0ID0gKFxuICBmb250U2l6ZTogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wiZm9udFNpemVcIl0sXG4gIGxpbmVIZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4pID0+IHtcbiAgcmV0dXJuIGdldExpbmVIZWlnaHRJblB4KGZvbnRTaXplLCBsaW5lSGVpZ2h0KSArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5sZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuY29uc3QgZ2V0TGluZVdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIH1cbiAgY29uc3QgY2FudmFzMmRDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNhbnZhczJkQ29udGV4dC5mb250ID0gZm9udDtcbiAgY29uc3Qgd2lkdGggPSBjYW52YXMyZENvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG5cbiAgLy8gc2luY2UgaW4gdGVzdCBlbnYgdGhlIGNhbnZhcyBtZWFzdXJlVGV4dCBhbGdvXG4gIC8vIGRvZXNuJ3QgbWVhc3VyZSB0ZXh0IGFuZCBpbnN0ZWFkIGp1c3QgcmV0dXJucyBudW1iZXIgb2ZcbiAgLy8gY2hhcmFjdGVycyBoZW5jZSB3ZSBhc3N1bWUgdGhhdCBlYWNoIGxldHRlcmlzIDEwcHhcbiAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgcmV0dXJuIHdpZHRoICogMTA7XG4gIH1cbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgbGluZXMgPSBzcGxpdEludG9MaW5lcyh0ZXh0KTtcbiAgbGV0IHdpZHRoID0gMDtcbiAgbGluZXMuZm9yRWFjaCgobGluZSkgPT4ge1xuICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGdldExpbmVXaWR0aChsaW5lLCBmb250KSk7XG4gIH0pO1xuICByZXR1cm4gd2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEhlaWdodCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250U2l6ZTogbnVtYmVyLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIGNvbnN0IGxpbmVDb3VudCA9IHNwbGl0SW50b0xpbmVzKHRleHQpLmxlbmd0aDtcbiAgcmV0dXJuIGdldExpbmVIZWlnaHRJblB4KGZvbnRTaXplLCBsaW5lSGVpZ2h0KSAqIGxpbmVDb3VudDtcbn07XG5cbmV4cG9ydCBjb25zdCB3cmFwVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcsIG1heFdpZHRoOiBudW1iZXIpID0+IHtcbiAgLy8gaWYgbWF4V2lkdGggaXMgbm90IGZpbml0ZSBvciBOYU4gd2hpY2ggY2FuIGhhcHBlbiBpbiBjYXNlIG9mIGJ1Z3MgaW5cbiAgLy8gY29tcHV0YXRpb24sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGNvbnRpbnVlIGFzIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBhbiBpbmZpbml0ZSBsb29wXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG1heFdpZHRoKSB8fCBtYXhXaWR0aCA8IDApIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGNvbnN0IG9yaWdpbmFsTGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBzcGFjZVdpZHRoID0gZ2V0TGluZVdpZHRoKFwiIFwiLCBmb250KTtcblxuICBsZXQgY3VycmVudExpbmUgPSBcIlwiO1xuICBsZXQgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuXG4gIGNvbnN0IHB1c2ggPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoc3RyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChzdHIpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZXNldFBhcmFtcyA9ICgpID0+IHtcbiAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICB9O1xuXG4gIG9yaWdpbmFsTGluZXMuZm9yRWFjaCgob3JpZ2luYWxMaW5lKSA9PiB7XG4gICAgY29uc3QgY3VycmVudExpbmVXaWR0aCA9IGdldFRleHRXaWR0aChvcmlnaW5hbExpbmUsIGZvbnQpO1xuXG4gICAgLy9QdXNoIHRoZSBsaW5lIGlmIGl0cyA8PSBtYXhXaWR0aFxuICAgIGlmIChjdXJyZW50TGluZVdpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgICBsaW5lcy5wdXNoKG9yaWdpbmFsTGluZSk7XG4gICAgICByZXR1cm47IC8vIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHdvcmRzID0gb3JpZ2luYWxMaW5lLnNwbGl0KFwiIFwiKTtcblxuICAgIHJlc2V0UGFyYW1zKCk7XG5cbiAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjdXJyZW50V29yZFdpZHRoID0gZ2V0TGluZVdpZHRoKHdvcmRzW2luZGV4XSwgZm9udCk7XG5cbiAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IGhhcHBlbiB3aGVuIHNpbmdsZSB3b3JkIHRha2VzIGVudGlyZSB3aWR0aFxuICAgICAgaWYgKGN1cnJlbnRXb3JkV2lkdGggPT09IG1heFdpZHRoKSB7XG4gICAgICAgIHB1c2god29yZHNbaW5kZXhdKTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgLy8gU3RhcnQgYnJlYWtpbmcgbG9uZ2VyIHdvcmRzIGV4Y2VlZGluZyBtYXggd2lkdGhcbiAgICAgIGVsc2UgaWYgKGN1cnJlbnRXb3JkV2lkdGggPiBtYXhXaWR0aCkge1xuICAgICAgICAvLyBwdXNoIGN1cnJlbnQgbGluZSBzaW5jZSB0aGUgY3VycmVudCB3b3JkIGV4Y2VlZHMgdGhlIG1heCB3aWR0aFxuICAgICAgICAvLyBzbyB3aWxsIGJlIGFwcGVuZGVkIGluIG5leHQgbGluZVxuICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcblxuICAgICAgICByZXNldFBhcmFtcygpO1xuXG4gICAgICAgIHdoaWxlICh3b3Jkc1tpbmRleF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFyID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoXG4gICAgICAgICAgICB3b3Jkc1tpbmRleF0uY29kZVBvaW50QXQoMCkhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBjaGFyV2lkdGguY2FsY3VsYXRlKGN1cnJlbnRDaGFyLCBmb250KTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSB3aWR0aDtcbiAgICAgICAgICB3b3Jkc1tpbmRleF0gPSB3b3Jkc1tpbmRleF0uc2xpY2UoY3VycmVudENoYXIubGVuZ3RoKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSB3aWR0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICByZXNldFBhcmFtcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHNwYWNlIG5lZWRzIHRvIGJlIGFwcGVuZGVkIGJlZm9yZSBuZXh0IHdvcmRcbiAgICAgICAgICAvLyBhcyBjdXJyZW50TGluZSBjb250YWlucyBjaGFycyB3aGljaCBjb3VsZG4ndCBiZSBhcHBlbmRlZFxuICAgICAgICAgIC8vIHRvIHByZXZpb3VzIGxpbmVcbiAgICAgICAgICBjdXJyZW50TGluZSArPSBcIiBcIjtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSBzcGFjZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTdGFydCBhcHBlbmRpbmcgd29yZHMgaW4gYSBsaW5lIHRpbGwgbWF4IHdpZHRoIHJlYWNoZWRcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93IDwgbWF4V2lkdGggJiYgaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB3b3JkID0gd29yZHNbaW5kZXhdO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gZ2V0TGluZVdpZHRoKGN1cnJlbnRMaW5lICsgd29yZCwgZm9udCk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPiBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICByZXNldFBhcmFtcygpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICBjdXJyZW50TGluZSArPSBgJHt3b3JkfSBgO1xuXG4gICAgICAgICAgLy8gUHVzaCB0aGUgd29yZCBpZiBhcHBlbmRpbmcgc3BhY2UgZXhjZWVkcyBtYXggd2lkdGhcbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgcHVzaCh3b3JkKTtcbiAgICAgICAgICAgIHJlc2V0UGFyYW1zKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgY2hhcldpZHRoID0gKCgpID0+IHtcbiAgY29uc3QgY2FjaGVkQ2hhcldpZHRoOiB7IFtrZXk6IEZvbnRTdHJpbmddOiBBcnJheTxudW1iZXI+IH0gPSB7fTtcblxuICBjb25zdCBjYWxjdWxhdGUgPSAoY2hhcjogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYXNjaWkgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF0pIHtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0pIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gZ2V0TGluZVdpZHRoKGNoYXIsIGZvbnQpO1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSA9IHdpZHRoO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldO1xuICB9O1xuXG4gIGNvbnN0IGdldENhY2hlID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGNhbGN1bGF0ZSxcbiAgICBnZXRDYWNoZSxcbiAgfTtcbn0pKCk7XG5cbmNvbnN0IERVTU1ZX1RFWFQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OVwiLnRvTG9jYWxlVXBwZXJDYXNlKCk7XG5cbi8vIEZJWE1FIHJlbmFtZSB0byBnZXRBcHByb3hNaW5Db250YWluZXJXaWR0aFxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChcbiAgZm9udDogRm9udFN0cmluZyxcbiAgbGluZUhlaWdodDogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBtYXhDaGFyV2lkdGggPSBnZXRNYXhDaGFyV2lkdGgoZm9udCk7XG4gIGlmIChtYXhDaGFyV2lkdGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgbWVhc3VyZVRleHQoRFVNTVlfVEVYVC5zcGxpdChcIlwiKS5qb2luKFwiXFxuXCIpLCBmb250LCBsaW5lSGVpZ2h0KS53aWR0aCArXG4gICAgICBCT1VORF9URVhUX1BBRERJTkcgKiAyXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbWF4Q2hhcldpZHRoICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNaW5DaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gTWF0aC5taW4oLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1heENoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gTWF0aC5tYXgoLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveENoYXJzVG9GaXRJbldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcsIHdpZHRoOiBudW1iZXIpID0+IHtcbiAgLy8gR2VuZXJhbGx5IGxvd2VyIGNhc2UgaXMgdXNlZCBzbyBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2VcbiAgY29uc3QgZHVtbXlUZXh0ID0gRFVNTVlfVEVYVC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICBjb25zdCBiYXRjaExlbmd0aCA9IDY7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCB3aWR0aFRpbGxOb3cgPSAwO1xuICBsZXQgc3RyID0gXCJcIjtcbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA8PSB3aWR0aCkge1xuICAgIGNvbnN0IGJhdGNoID0gZHVtbXlUZXh0LnN1YnN0cihpbmRleCwgaW5kZXggKyBiYXRjaExlbmd0aCk7XG4gICAgc3RyICs9IGJhdGNoO1xuICAgIHdpZHRoVGlsbE5vdyArPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgICBpZiAoaW5kZXggPT09IGR1bW15VGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIGluZGV4ID0gaW5kZXggKyBiYXRjaExlbmd0aDtcbiAgfVxuXG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPiB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgIHdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChzdHIsIGZvbnQpO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRJZCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCkgPT4ge1xuICByZXR1cm4gY29udGFpbmVyPy5ib3VuZEVsZW1lbnRzPy5sZW5ndGhcbiAgICA/IGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8uZmlsdGVyKChlbGUpID0+IGVsZS50eXBlID09PSBcInRleHRcIilbMF0/LmlkIHx8XG4gICAgICAgIG51bGxcbiAgICA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyKSB8fCBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJFbGVtZW50ID0gKFxuICBlbGVtZW50OlxuICAgIHwgKEV4Y2FsaWRyYXdFbGVtZW50ICYge1xuICAgICAgICBjb250YWluZXJJZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSB8IG51bGw7XG4gICAgICB9KVxuICAgIHwgbnVsbCxcbikgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIHJldHVybiBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmNvbnRhaW5lcklkKSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckRpbXMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgTUlOX1dJRFRIID0gMzAwO1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KGVsZW1lbnQud2lkdGgsIE1JTl9XSURUSCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xuICB9XG4gIHJldHVybiB7IHdpZHRoOiBlbGVtZW50LndpZHRoLCBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ2VudGVyID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNvbnRhaW5lci54ICsgY29udGFpbmVyLndpZHRoIC8gMixcbiAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIsXG4gICAgfTtcbiAgfVxuICBjb25zdCBwb2ludHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGNvbnRhaW5lcik7XG4gIGlmIChwb2ludHMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcihjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IG1pZFBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgY29udGFpbmVyLnBvaW50c1tpbmRleF0sXG4gICAgKTtcbiAgICByZXR1cm4geyB4OiBtaWRQb2ludFswXSwgeTogbWlkUG9pbnRbMV0gfTtcbiAgfVxuICBjb25zdCBpbmRleCA9IGNvbnRhaW5lci5wb2ludHMubGVuZ3RoIC8gMiAtIDE7XG4gIGxldCBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVkaXRvck1pZFBvaW50cyhcbiAgICBjb250YWluZXIsXG4gICAgYXBwU3RhdGUsXG4gIClbaW5kZXhdO1xuICBpZiAoIW1pZFNlZ21lbnRNaWRwb2ludCkge1xuICAgIG1pZFNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcG9pbnRzW2luZGV4XSxcbiAgICAgIHBvaW50c1tpbmRleCArIDFdLFxuICAgICAgaW5kZXggKyAxLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgeDogbWlkU2VnbWVudE1pZHBvaW50WzBdLCB5OiBtaWRTZWdtZW50TWlkcG9pbnRbMV0gfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJDb29yZHMgPSAoY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgbGV0IG9mZnNldFggPSBCT1VORF9URVhUX1BBRERJTkc7XG4gIGxldCBvZmZzZXRZID0gQk9VTkRfVEVYVF9QQURESU5HO1xuXG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgZGVyaXZhdGlvbiBvZiBjb29yZGluYXRlcyBpcyBleHBsYWluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICBvZmZzZXRYICs9IChjb250YWluZXIud2lkdGggLyAyKSAqICgxIC0gTWF0aC5zcXJ0KDIpIC8gMik7XG4gICAgb2Zmc2V0WSArPSAoY29udGFpbmVyLmhlaWdodCAvIDIpICogKDEgLSBNYXRoLnNxcnQoMikgLyAyKTtcbiAgfVxuICAvLyBUaGUgZGVyaXZhdGlvbiBvZiBjb29yZGluYXRlcyBpcyBleHBsYWluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIG9mZnNldFggKz0gY29udGFpbmVyLndpZHRoIC8gNDtcbiAgICBvZmZzZXRZICs9IGNvbnRhaW5lci5oZWlnaHQgLyA0O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogY29udGFpbmVyLnggKyBvZmZzZXRYLFxuICAgIHk6IGNvbnRhaW5lci55ICsgb2Zmc2V0WSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0RWxlbWVudEFuZ2xlID0gKHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8IGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gdGV4dEVsZW1lbnQuYW5nbGU7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lci5hbmdsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0ID0gKFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8ICFib3VuZFRleHRFbGVtZW50KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogODtcbiAgfVxuXG4gIHJldHVybiBCT1VORF9URVhUX1BBRERJTkc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuKSA9PiB7XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYm91bmRUZXh0RWxlbWVudCxcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQWxsb3dWZXJ0aWNhbEFsaWduID0gKFxuICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbikgPT4ge1xuICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaGFzQm91bmRDb250YWluZXIgPSBpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCk7XG4gICAgaWYgKGhhc0JvdW5kQ29udGFpbmVyKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzdXBwcG9ydHNIb3Jpem9udGFsQWxpZ24gPSAoXG4gIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuKSA9PiB7XG4gIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBoYXNCb3VuZENvbnRhaW5lciA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KTtcbiAgICBpZiAoaGFzQm91bmRDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpc1RleHRFbGVtZW50KGVsZW1lbnQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBmYWxzZSlcbiAgICAgID8gc2VsZWN0ZWRFbGVtZW50c1swXVxuICAgICAgOiBudWxsO1xuICB9XG4gIGxldCBoaXRFbGVtZW50ID0gbnVsbDtcbiAgLy8gV2UgbmVlZCB0byB0byBoaXQgdGVzdGluZyBmcm9tIGZyb250IChlbmQgb2YgdGhlIGFycmF5KSB0byBiYWNrIChiZWdpbm5pbmcgb2YgdGhlIGFycmF5KVxuICBmb3IgKGxldCBpbmRleCA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IC0taW5kZXgpIHtcbiAgICBpZiAoZWxlbWVudHNbaW5kZXhdLmlzRGVsZXRlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudHNbaW5kZXhdKTtcbiAgICBpZiAoXG4gICAgICBpc0Fycm93RWxlbWVudChlbGVtZW50c1tpbmRleF0pICYmXG4gICAgICBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveChlbGVtZW50c1tpbmRleF0sIGFwcFN0YXRlLCBbXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICBdKVxuICAgICkge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoeDEgPCB4ICYmIHggPCB4MiAmJiB5MSA8IHkgJiYgeSA8IHkyKSB7XG4gICAgICBoaXRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKGhpdEVsZW1lbnQsIGZhbHNlKSA/IGhpdEVsZW1lbnQgOiBudWxsO1xufTtcblxuY29uc3QgVkFMSURfQ09OVEFJTkVSX1RZUEVTID0gbmV3IFNldChbXG4gIFwicmVjdGFuZ2xlXCIsXG4gIFwiZWxsaXBzZVwiLFxuICBcImRpYW1vbmRcIixcbiAgXCJpbWFnZVwiLFxuICBcImFycm93XCIsXG5dKTtcblxuZXhwb3J0IGNvbnN0IGlzVmFsaWRUZXh0Q29udGFpbmVyID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PlxuICBWQUxJRF9DT05UQUlORVJfVFlQRVMuaGFzKGVsZW1lbnQudHlwZSk7XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0ID0gKFxuICBkaW1lbnNpb246IG51bWJlcixcbiAgY29udGFpbmVyVHlwZTogRXh0cmFjdFNldFR5cGU8dHlwZW9mIFZBTElEX0NPTlRBSU5FUl9UWVBFUz4sXG4pID0+IHtcbiAgZGltZW5zaW9uID0gTWF0aC5jZWlsKGRpbWVuc2lvbik7XG4gIGNvbnN0IHBhZGRpbmcgPSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuXG4gIGlmIChjb250YWluZXJUeXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCgoZGltZW5zaW9uICsgcGFkZGluZykgLyBNYXRoLnNxcnQoMikpICogMik7XG4gIH1cbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09IFwiYXJyb3dcIikge1xuICAgIHJldHVybiBkaW1lbnNpb24gKyBwYWRkaW5nICogODtcbiAgfVxuICBpZiAoY29udGFpbmVyVHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICByZXR1cm4gMiAqIChkaW1lbnNpb24gKyBwYWRkaW5nKTtcbiAgfVxuICByZXR1cm4gZGltZW5zaW9uICsgcGFkZGluZztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDb250YWluZXJXaWR0aCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGNvbnN0IHdpZHRoID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpLndpZHRoO1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gd2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgICBpZiAoY29udGFpbmVyV2lkdGggPD0gMCkge1xuICAgICAgY29uc3QgYm91bmRUZXh0ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChjb250YWluZXIpO1xuICAgICAgaWYgKGJvdW5kVGV4dCkge1xuICAgICAgICByZXR1cm4gYm91bmRUZXh0LndpZHRoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORyAqIDggKiAyO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyV2lkdGg7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgLy8gVGhlIHdpZHRoIG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGFuIGVsbGlwc2UgaXNcbiAgICAvLyBNYXRoLnJvdW5kKChlbGxpcHNlLndpZHRoIC8gMikgKiBNYXRoLnNxcnQoMikpIHdoaWNoIGlzIGRlcml2ZWQgZnJvbVxuICAgIC8vIGVxdWF0aW9uIG9mIGFuIGVsbGlwc2UgLWh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MTcyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHdpZHRoIC8gMikgKiBNYXRoLnNxcnQoMikpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgLy8gVGhlIHdpZHRoIG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGEgcmhvbWJ1cyBpc1xuICAgIC8vIE1hdGgucm91bmQod2lkdGggLyAyKSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MjY1XG4gICAgcmV0dXJuIE1hdGgucm91bmQod2lkdGggLyAyKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgcmV0dXJuIHdpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDb250YWluZXJIZWlnaHQgPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBjb25zdCBoZWlnaHQgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcikuaGVpZ2h0O1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDggKiAyO1xuICAgIGlmIChjb250YWluZXJIZWlnaHQgPD0gMCkge1xuICAgICAgY29uc3QgYm91bmRUZXh0ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChjb250YWluZXIpO1xuICAgICAgaWYgKGJvdW5kVGV4dCkge1xuICAgICAgICByZXR1cm4gYm91bmRUZXh0LmhlaWdodDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgICB9XG4gICAgcmV0dXJuIGhlaWdodDtcbiAgfVxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhbiBlbGxpcHNlIGlzXG4gICAgLy8gTWF0aC5yb3VuZCgoZWxsaXBzZS5oZWlnaHQgLyAyKSAqIE1hdGguc3FydCgyKSkgd2hpY2ggaXMgZGVyaXZlZCBmcm9tXG4gICAgLy8gZXF1YXRpb24gb2YgYW4gZWxsaXBzZSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MTcyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoKGhlaWdodCAvIDIpICogTWF0aC5zcXJ0KDIpKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIC8vIFRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYSByaG9tYnVzIGlzXG4gICAgLy8gTWF0aC5yb3VuZChoZWlnaHQgLyAyKSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MjY1XG4gICAgcmV0dXJuIE1hdGgucm91bmQoaGVpZ2h0IC8gMikgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIHJldHVybiBoZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzTWVhc3VyZVRleHRTdXBwb3J0ZWQgPSAoKSA9PiB7XG4gIGNvbnN0IHdpZHRoID0gZ2V0VGV4dFdpZHRoKFxuICAgIERVTU1ZX1RFWFQsXG4gICAgZ2V0Rm9udFN0cmluZyh7XG4gICAgICBmb250U2l6ZTogREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICBmb250RmFtaWx5OiBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgIH0pLFxuICApO1xuICByZXR1cm4gd2lkdGggPiAwO1xufTtcblxuLyoqXG4gKiBVbml0bGVzcyBsaW5lIGhlaWdodFxuICpcbiAqIEluIHByZXZpb3VzIHZlcnNpb25zIHdlIHVzZWQgYG5vcm1hbGAgbGluZSBoZWlnaHQsIHdoaWNoIGJyb3dzZXJzIGludGVycHJldFxuICogZGlmZmVyZW50bHksIGFuZCBiYXNlZCBvbiBmb250LWZhbWlseSBhbmQgZm9udC1zaXplLlxuICpcbiAqIFRvIG1ha2UgbGluZSBoZWlnaHRzIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzIHdlIGhhcmRjb2RlIHRoZSB2YWx1ZXMgZm9yXG4gKiBlYWNoIG9mIG91ciBmb250cyBiYXNlZCBvbiBtb3N0IGNvbW1vbiBhdmVyYWdlIGxpbmUtaGVpZ2h0cy5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjM2MCNpc3N1ZWNvbW1lbnQtMTQ3NzYzNTk3MVxuICogd2hlcmUgdGhlIHZhbHVlcyBjb21lIGZyb20uXG4gKi9cbmNvbnN0IERFRkFVTFRfTElORV9IRUlHSFQgPSB7XG4gIC8vIH4xLjI1IGlzIHRoZSBhdmVyYWdlIGZvciBWaXJnaWwgaW4gV2ViS2l0IGFuZCBCbGluay5cbiAgLy8gR2Vja28gKEZGKSB1c2VzIH4xLjI4LlxuICBbRk9OVF9GQU1JTFkuVmlyZ2lsXTogMS4yNSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuICAvLyB+MS4xNSBpcyB0aGUgYXZlcmFnZSBmb3IgVmlyZ2lsIGluIFdlYktpdCBhbmQgQmxpbmsuXG4gIC8vIEdlY2tvIGlmIGFsbCBvdmVyIHRoZSBwbGFjZS5cbiAgW0ZPTlRfRkFNSUxZLkhlbHZldGljYV06IDEuMTUgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbiAgLy8gfjEuMiBpcyB0aGUgYXZlcmFnZSBmb3IgVmlyZ2lsIGluIFdlYktpdCBhbmQgQmxpbmssIGFuZCBraW5kYSBHZWNrbyB0b29cbiAgW0ZPTlRfRkFNSUxZLkNhc2NhZGlhXTogMS4yIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdExpbmVIZWlnaHQgPSAoZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcykgPT4ge1xuICBpZiAoZm9udEZhbWlseSBpbiBERUZBVUxUX0xJTkVfSEVJR0hUKSB7XG4gICAgcmV0dXJuIERFRkFVTFRfTElORV9IRUlHSFRbZm9udEZhbWlseV07XG4gIH1cbiAgcmV0dXJuIERFRkFVTFRfTElORV9IRUlHSFRbREVGQVVMVF9GT05UX0ZBTUlMWV07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3332
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"computeContainerDimensionForBoundText\": () => (/* binding */ computeContainerDimensionForBoundText),\n/* harmony export */ \"detectLineHeight\": () => (/* binding */ detectLineHeight),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElementOffset\": () => (/* binding */ getBoundTextElementOffset),\n/* harmony export */ \"getBoundTextElementPosition\": () => (/* binding */ getBoundTextElementPosition),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerCoords\": () => (/* binding */ getContainerCoords),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getDOMMetrics\": () => (/* binding */ getDOMMetrics),\n/* harmony export */ \"getDefaultLineHeight\": () => (/* binding */ getDefaultLineHeight),\n/* harmony export */ \"getLineHeightInPx\": () => (/* binding */ getLineHeightInPx),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMaxContainerHeight\": () => (/* binding */ getMaxContainerHeight),\n/* harmony export */ \"getMaxContainerWidth\": () => (/* binding */ getMaxContainerWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\n/* harmony export */ \"getTextHeight\": () => (/* binding */ getTextHeight),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isMeasureTextSupported\": () => (/* binding */ isMeasureTextSupported),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"splitIntoLines\": () => (/* binding */ splitIntoLines),\n/* harmony export */ \"suppportsHorizontalAlign\": () => (/* binding */ suppportsHorizontalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeText = (text) => {\n return (text\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n // normalize newlines\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\n};\nconst splitIntoLines = (text) => {\n return normalizeText(text).split(\"\\n\");\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n baseline: textElement.baseline,\n };\n boundTextUpdates.text = textElement.text;\n if (container) {\n maxWidth = getMaxContainerWidth(container);\n boundTextUpdates.text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(boundTextUpdates.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n boundTextUpdates.baseline = metrics.baseline;\n if (container) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const centerX = textElement.x + textElement.width / 2;\n const centerY = textElement.y + textElement.height / 2;\n const diffWidth = metrics.width - textElement.width;\n const diffHeight = metrics.height - textElement.height;\n boundTextUpdates.x = centerY - (textElement.height + diffHeight) / 2;\n boundTextUpdates.y = centerX - (textElement.width + diffWidth) / 2;\n }\n else {\n const containerDims = getContainerDims(container);\n let maxContainerHeight = getMaxContainerHeight(container);\n let nextHeight = containerDims.height;\n if (metrics.height > maxContainerHeight) {\n nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n maxContainerHeight = getMaxContainerHeight(container);\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.updateOriginalContainerCache)(container.id, nextHeight);\n }\n const updatedTextElement = Object.assign(Object.assign({}, textElement), boundTextUpdates);\n const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, boundTextUpdates);\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (element.boundElements || [])\n .filter((boundElement) => boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId)\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = getMaxContainerWidth(container);\n const maxHeight = getMaxContainerHeight(container);\n let containerHeight = containerDims.height;\n let nextBaseLine = textElement.baseline;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n nextHeight = metrics.height;\n nextWidth = metrics.width;\n nextBaseLine = metrics.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(nextHeight, container.type);\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, computeBoundTextPosition(container, textElement));\n }\n }\n};\nconst computeBoundTextPosition = (container, boundTextElement) => {\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getMaxContainerHeight(container);\n const maxContainerWidth = getMaxContainerWidth(container);\n let x;\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n }\n else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n }\n else if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n }\n else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, lineHeight) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const fontSize = parseFloat(font);\n const height = getTextHeight(text, fontSize, lineHeight);\n const width = getTextWidth(text, font);\n const { baseline } = getDOMMetrics(text, font, lineHeight);\n return { width, height, baseline };\n};\nconst getDOMMetrics = (text, font, lineHeight, wrapInContainer) => {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.whiteSpace = \"pre\";\n container.style.font = font;\n container.style.minHeight = \"1em\";\n if (wrapInContainer) {\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.whiteSpace = \"pre-wrap\";\n }\n container.style.lineHeight = String(lineHeight);\n container.innerText = text;\n // Baseline is important for positioning text on canvas\n document.body.appendChild(container);\n const span = document.createElement(\"span\");\n span.style.display = \"inline-block\";\n span.style.overflow = \"hidden\";\n span.style.width = \"1px\";\n span.style.height = \"1px\";\n container.appendChild(span);\n let baseline = span.offsetTop + span.offsetHeight;\n const height = container.offsetHeight;\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isSafari) {\n const canvasHeight = getTextHeight(text, parseFloat(font), lineHeight);\n const fontSize = parseFloat(font);\n // In Safari the font size gets rounded off when rendering hence calculating the safari height and shifting the baseline if it differs\n // from the actual canvas height\n const domHeight = getTextHeight(text, Math.round(fontSize), lineHeight);\n if (canvasHeight > height) {\n baseline += canvasHeight - domHeight;\n }\n if (height > canvasHeight) {\n baseline -= domHeight - canvasHeight;\n }\n }\n document.body.removeChild(container);\n return { baseline, height };\n};\n/**\n * To get unitless line-height (if unknown) we can calculate it by dividing\n * height-per-line by fontSize.\n */\nconst detectLineHeight = (textElement) => {\n const lineCount = splitIntoLines(textElement.text).length;\n return (textElement.height /\n lineCount /\n textElement.fontSize);\n};\n/**\n * We calculate the line height from the font size and the unitless line height,\n * aligning with the W3C spec.\n */\nconst getLineHeightInPx = (fontSize, lineHeight) => {\n return fontSize * lineHeight;\n};\n// FIXME rename to getApproxMinContainerHeight\nconst getApproxMinLineHeight = (fontSize, lineHeight) => {\n return getLineHeightInPx(fontSize, lineHeight) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return width * 10;\n }\n return width;\n};\nconst getTextWidth = (text, font) => {\n const lines = splitIntoLines(text);\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst getTextHeight = (text, fontSize, lineHeight) => {\n const lineCount = splitIntoLines(text).length;\n return getLineHeightInPx(fontSize, lineHeight) * lineCount;\n};\nconst wrapText = (text, font, maxWidth) => {\n // if maxWidth is not finite or NaN which can happen in case of bugs in\n // computation, we need to make sure we don't continue as we'll end up\n // in an infinite loop\n if (!Number.isFinite(maxWidth) || maxWidth < 0) {\n return text;\n }\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n const resetParams = () => {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n };\n originalLines.forEach((originalLine) => {\n const currentLineWidth = getTextWidth(originalLine, font);\n //Push the line if its <= maxWidth\n if (currentLineWidth <= maxWidth) {\n lines.push(originalLine);\n return; // continue\n }\n const words = originalLine.split(\" \");\n resetParams();\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n resetParams();\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n resetParams();\n }\n else {\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n resetParams();\n break;\n }\n index++;\n currentLine += `${word} `;\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n const word = currentLine.slice(0, -1);\n push(word);\n resetParams();\n break;\n }\n }\n }\n }\n if (currentLine.slice(-1) === \" \") {\n // only remove last trailing space which we have added when joining words\n currentLine = currentLine.slice(0, -1);\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\n// FIXME rename to getApproxMinContainerWidth\nconst getApproxMinLineWidth = (font, lineHeight) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font, lineHeight).width +\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\n }\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getContainerCoords = (container) => {\n let offsetX = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n let offsetY = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container || !boundTextElement) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst suppportsHorizontalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element);\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_7__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_8__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"image\",\n \"arrow\",\n]);\nconst isValidTextContainer = (element) => VALID_CONTAINER_TYPES.has(element.type);\nconst computeContainerDimensionForBoundText = (dimension, containerType) => {\n dimension = Math.ceil(dimension);\n const padding = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\nconst getMaxContainerWidth = (container) => {\n const width = getContainerDims(container).width;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerWidth = width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerWidth <= 0) {\n const boundText = getBoundTextElement(container);\n if (boundText) {\n return boundText.width;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n return containerWidth;\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMaxContainerHeight = (container) => {\n const height = getContainerDims(container).height;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerHeight = height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n const boundText = getBoundTextElement(container);\n if (boundText) {\n return boundText.height;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst isMeasureTextSupported = () => {\n const width = getTextWidth(DUMMY_TEXT, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_SIZE,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY,\n }));\n return width > 0;\n};\n/**\n * Unitless line height\n *\n * In previous versions we used `normal` line height, which browsers interpret\n * differently, and based on font-family and font-size.\n *\n * To make line heights consistent across browsers we hardcode the values for\n * each of our fonts based on most common average line-heights.\n * See https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971\n * where the values come from.\n */\nconst DEFAULT_LINE_HEIGHT = {\n // ~1.25 is the average for Virgil in WebKit and Blink.\n // Gecko (FF) uses ~1.28.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Virgil]: 1.25,\n // ~1.15 is the average for Virgil in WebKit and Blink.\n // Gecko if all over the place.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Helvetica]: 1.15,\n // ~1.2 is the average for Virgil in WebKit and Blink, and kinda Gecko too\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Cascadia]: 1.2,\n};\nconst getDefaultLineHeight = (fontFamily) => {\n if (fontFamily in DEFAULT_LINE_HEIGHT) {\n return DEFAULT_LINE_HEIGHT[fontFamily];\n }\n return DEFAULT_LINE_HEIGHT[_constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzFFLENBQUMsNERBQW9CLENBQUMsRUFBRSxHQUEwQztDQUNuRSxDQUFDO0FBRUssTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFVBQTRCLEVBQUUsRUFBRTtJQUNuRSxJQUFJLFVBQVUsSUFBSSxtQkFBbUIsRUFBRTtRQUNyQyxPQUFPLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ3hDO0lBQ0QsT0FBTyxtQkFBbUIsQ0FBQywyREFBbUIsQ0FBQyxDQUFDO0FBQ2xELENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRFbGVtZW50LnRzPzQyZDIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Rm9udFN0cmluZywgYXJyYXlUb01hcCwgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgRm9udFN0cmluZyxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIEJPVU5EX1RFWFRfUEFERElORyxcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIEZPTlRfRkFNSUxZLFxuICBpc1NhZmFyaSxcbiAgVEVYVF9BTElHTixcbiAgVkVSVElDQUxfQUxJR04sXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyLCBpc0Fycm93RWxlbWVudCB9IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXh0QmluZGFibGVDb250YWluZXIgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3ggfSBmcm9tIFwiLi9jb2xsaXNpb25cIjtcbmltcG9ydCB7XG4gIHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZSxcbiAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZSxcbn0gZnJvbSBcIi4vdGV4dFd5c2l3eWdcIjtcbmltcG9ydCB7IEV4dHJhY3RTZXRUeXBlIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVRleHQgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdGV4dFxuICAgICAgLy8gcmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzIHNvIHRoZXkgcmVuZGVyIGFuZCBtZWFzdXJlIGNvcnJlY3RseVxuICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpXG4gICAgICAvLyBub3JtYWxpemUgbmV3bGluZXNcbiAgICAgIC5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIlxcblwiKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHNwbGl0SW50b0xpbmVzID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gbm9ybWFsaXplVGV4dCh0ZXh0KS5zcGxpdChcIlxcblwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWRyYXdUZXh0Qm91bmRpbmdCb3ggPSAoXG4gIHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGxldCBtYXhXaWR0aCA9IHVuZGVmaW5lZDtcbiAgY29uc3QgYm91bmRUZXh0VXBkYXRlcyA9IHtcbiAgICB4OiB0ZXh0RWxlbWVudC54LFxuICAgIHk6IHRleHRFbGVtZW50LnksXG4gICAgdGV4dDogdGV4dEVsZW1lbnQudGV4dCxcbiAgICB3aWR0aDogdGV4dEVsZW1lbnQud2lkdGgsXG4gICAgaGVpZ2h0OiB0ZXh0RWxlbWVudC5oZWlnaHQsXG4gICAgYmFzZWxpbmU6IHRleHRFbGVtZW50LmJhc2VsaW5lLFxuICB9O1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMudGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICBib3VuZFRleHRVcGRhdGVzLnRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgbWF4V2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgYm91bmRUZXh0VXBkYXRlcy50ZXh0LFxuICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgIHRleHRFbGVtZW50LmxpbmVIZWlnaHQsXG4gICk7XG5cbiAgYm91bmRUZXh0VXBkYXRlcy53aWR0aCA9IG1ldHJpY3Mud2lkdGg7XG4gIGJvdW5kVGV4dFVwZGF0ZXMuaGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQ7XG4gIGJvdW5kVGV4dFVwZGF0ZXMuYmFzZWxpbmUgPSBtZXRyaWNzLmJhc2VsaW5lO1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgY29uc3QgY2VudGVyWCA9IHRleHRFbGVtZW50LnggKyB0ZXh0RWxlbWVudC53aWR0aCAvIDI7XG4gICAgICBjb25zdCBjZW50ZXJZID0gdGV4dEVsZW1lbnQueSArIHRleHRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaWZmV2lkdGggPSBtZXRyaWNzLndpZHRoIC0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgICBjb25zdCBkaWZmSGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQgLSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICBib3VuZFRleHRVcGRhdGVzLnggPSBjZW50ZXJZIC0gKHRleHRFbGVtZW50LmhlaWdodCArIGRpZmZIZWlnaHQpIC8gMjtcbiAgICAgIGJvdW5kVGV4dFVwZGF0ZXMueSA9IGNlbnRlclggLSAodGV4dEVsZW1lbnQud2lkdGggKyBkaWZmV2lkdGgpIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICAgIGxldCBtYXhDb250YWluZXJIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcblxuICAgICAgbGV0IG5leHRIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICAgIGlmIChtZXRyaWNzLmhlaWdodCA+IG1heENvbnRhaW5lckhlaWdodCkge1xuICAgICAgICBuZXh0SGVpZ2h0ID0gY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgICBtZXRyaWNzLmhlaWdodCxcbiAgICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICAgKTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICAgICAgICBtYXhDb250YWluZXJIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcbiAgICAgICAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShjb250YWluZXIuaWQsIG5leHRIZWlnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID0ge1xuICAgICAgICAuLi50ZXh0RWxlbWVudCxcbiAgICAgICAgLi4uYm91bmRUZXh0VXBkYXRlcyxcbiAgICAgIH0gYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcjtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKGNvbnRhaW5lciwgdXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgIGJvdW5kVGV4dFVwZGF0ZXMueCA9IHg7XG4gICAgICBib3VuZFRleHRVcGRhdGVzLnkgPSB5O1xuICAgIH1cbiAgfVxuXG4gIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIGJvdW5kVGV4dFVwZGF0ZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24gPSAoXG4gIHNjZW5lRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZEVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRJZFRvRHVwbGljYXRlZElkOiBNYXA8RXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSwgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXT4sXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2NlbmVFbGVtZW50TWFwID0gYXJyYXlUb01hcChzY2VuZUVsZW1lbnRzKSBhcyBNYXA8XG4gICAgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFxuICA+O1xuICBvbGRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgbmV3RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoZWxlbWVudC5pZCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChib3VuZFRleHRFbGVtZW50SWQpO1xuICAgICAgaWYgKG5ld1RleHRFbGVtZW50SWQpIHtcbiAgICAgICAgY29uc3QgbmV3Q29udGFpbmVyID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdFbGVtZW50SWQpO1xuICAgICAgICBpZiAobmV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdDb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChlbGVtZW50LmJvdW5kRWxlbWVudHMgfHwgW10pXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGJvdW5kRWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5pZCAhPT0gbmV3VGV4dEVsZW1lbnRJZCAmJlxuICAgICAgICAgICAgICAgICAgYm91bmRFbGVtZW50LmlkICE9PSBib3VuZFRleHRFbGVtZW50SWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgaWQ6IG5ld1RleHRFbGVtZW50SWQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50ID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdUZXh0RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld1RleHRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQobmV3VGV4dEVsZW1lbnQpKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdUZXh0RWxlbWVudCwge1xuICAgICAgICAgICAgY29udGFpbmVySWQ6IG5ld0NvbnRhaW5lciA/IG5ld0VsZW1lbnRJZCA6IG51bGwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUJpbmRUZXh0UmVzaXplID0gKFxuICBjb250YWluZXI6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuKSA9PiB7XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoY29udGFpbmVyLmlkKTtcbiAgbGV0IHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICBib3VuZFRleHRFbGVtZW50SWQsXG4gICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBpZiAodGV4dEVsZW1lbnQgJiYgdGV4dEVsZW1lbnQudGV4dCkge1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShjb250YWluZXIpIS5nZXRFbGVtZW50KFxuICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGxldCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dDtcbiAgICBsZXQgbmV4dEhlaWdodCA9IHRleHRFbGVtZW50LmhlaWdodDtcbiAgICBsZXQgbmV4dFdpZHRoID0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG4gICAgbGV0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgIGxldCBuZXh0QmFzZUxpbmUgPSB0ZXh0RWxlbWVudC5iYXNlbGluZTtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJuXCIgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJzXCIpIHtcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICB0ZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgICAgIHRleHQsXG4gICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICB0ZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICAgICAgKTtcbiAgICAgIG5leHRIZWlnaHQgPSBtZXRyaWNzLmhlaWdodDtcbiAgICAgIG5leHRXaWR0aCA9IG1ldHJpY3Mud2lkdGg7XG4gICAgICBuZXh0QmFzZUxpbmUgPSBtZXRyaWNzLmJhc2VsaW5lO1xuICAgIH1cbiAgICAvLyBpbmNyZWFzZSBoZWlnaHQgaW4gY2FzZSB0ZXh0IGVsZW1lbnQgaGVpZ2h0IGV4Y2VlZHNcbiAgICBpZiAobmV4dEhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgY29udGFpbmVySGVpZ2h0ID0gY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgbmV4dEhlaWdodCxcbiAgICAgICAgY29udGFpbmVyLnR5cGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaWZmID0gY29udGFpbmVySGVpZ2h0IC0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgICAvLyBmaXggdGhlIHkgY29vcmQgd2hlbiByZXNpemluZyBmcm9tIG5lL253L25cbiAgICAgIGNvbnN0IHVwZGF0ZWRZID1cbiAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwiblwiKVxuICAgICAgICAgID8gY29udGFpbmVyLnkgLSBkaWZmXG4gICAgICAgICAgOiBjb250YWluZXIueTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgIGhlaWdodDogY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB5OiB1cGRhdGVkWSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgIHRleHQsXG4gICAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgICAgYmFzZWxpbmU6IG5leHRCYXNlTGluZSxcbiAgICB9KTtcblxuICAgIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgbXV0YXRlRWxlbWVudChcbiAgICAgICAgdGV4dEVsZW1lbnQsXG4gICAgICAgIGNvbXB1dGVCb3VuZFRleHRQb3NpdGlvbihcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgdGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBjb21wdXRlQm91bmRUZXh0UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyQ29vcmRzID0gZ2V0Q29udGFpbmVyQ29vcmRzKGNvbnRhaW5lcik7XG4gIGNvbnN0IG1heENvbnRhaW5lckhlaWdodCA9IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpO1xuICBjb25zdCBtYXhDb250YWluZXJXaWR0aCA9IGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lcik7XG5cbiAgbGV0IHg7XG4gIGxldCB5O1xuICBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICB5ID0gY29udGFpbmVyQ29vcmRzLnk7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICB5ID0gY29udGFpbmVyQ29vcmRzLnkgKyAobWF4Q29udGFpbmVySGVpZ2h0IC0gYm91bmRUZXh0RWxlbWVudC5oZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIHkgPVxuICAgICAgY29udGFpbmVyQ29vcmRzLnkgK1xuICAgICAgKG1heENvbnRhaW5lckhlaWdodCAvIDIgLSBib3VuZFRleHRFbGVtZW50LmhlaWdodCAvIDIpO1xuICB9XG4gIGlmIChib3VuZFRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUKSB7XG4gICAgeCA9IGNvbnRhaW5lckNvb3Jkcy54O1xuICB9IGVsc2UgaWYgKGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLlJJR0hUKSB7XG4gICAgeCA9IGNvbnRhaW5lckNvb3Jkcy54ICsgKG1heENvbnRhaW5lcldpZHRoIC0gYm91bmRUZXh0RWxlbWVudC53aWR0aCk7XG4gIH0gZWxzZSB7XG4gICAgeCA9XG4gICAgICBjb250YWluZXJDb29yZHMueCArIChtYXhDb250YWluZXJXaWR0aCAvIDIgLSBib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMik7XG4gIH1cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dyYXNzYXRvci9jYW52YXMtdGV4dC1lZGl0b3IvYmxvYi9tYXN0ZXIvbGliL0ZvbnRNZXRyaWNzLmpzXG5cbmV4cG9ydCBjb25zdCBtZWFzdXJlVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHRleHQgPSB0ZXh0XG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLy8gcmVwbGFjZSBlbXB0eSBsaW5lcyB3aXRoIHNpbmdsZSBzcGFjZSBiZWNhdXNlIGxlYWRpbmcvdHJhaWxpbmcgZW1wdHlcbiAgICAvLyBsaW5lcyB3b3VsZCBiZSBzdHJpcHBlZCBmcm9tIGNvbXB1dGF0aW9uXG4gICAgLm1hcCgoeCkgPT4geCB8fCBcIiBcIilcbiAgICAuam9pbihcIlxcblwiKTtcbiAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGZvbnQpO1xuICBjb25zdCBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KHRleHQsIGZvbnRTaXplLCBsaW5lSGVpZ2h0KTtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCk7XG4gIGNvbnN0IHsgYmFzZWxpbmUgfSA9IGdldERPTU1ldHJpY3ModGV4dCwgZm9udCwgbGluZUhlaWdodCk7XG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RE9NTWV0cmljcyA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuICB3cmFwSW5Db250YWluZXI/OiBib29sZWFuLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZVwiO1xuICBjb250YWluZXIuc3R5bGUuZm9udCA9IGZvbnQ7XG4gIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjFlbVwiO1xuICBpZiAod3JhcEluQ29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb250YWluZXIuc3R5bGUud29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gIH1cblxuICBjb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9IFN0cmluZyhsaW5lSGVpZ2h0KTtcblxuICBjb250YWluZXIuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAvLyBCYXNlbGluZSBpcyBpbXBvcnRhbnQgZm9yIHBvc2l0aW9uaW5nIHRleHQgb24gY2FudmFzXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblxuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gIHNwYW4uc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICBzcGFuLnN0eWxlLndpZHRoID0gXCIxcHhcIjtcbiAgc3Bhbi5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gIGxldCBiYXNlbGluZSA9IHNwYW4ub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRIZWlnaHQ7XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKGlzU2FmYXJpKSB7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gZ2V0VGV4dEhlaWdodCh0ZXh0LCBwYXJzZUZsb2F0KGZvbnQpLCBsaW5lSGVpZ2h0KTtcbiAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udCk7XG4gICAgLy8gSW4gU2FmYXJpIHRoZSBmb250IHNpemUgZ2V0cyByb3VuZGVkIG9mZiB3aGVuIHJlbmRlcmluZyBoZW5jZSBjYWxjdWxhdGluZyB0aGUgc2FmYXJpIGhlaWdodCBhbmQgc2hpZnRpbmcgdGhlIGJhc2VsaW5lIGlmIGl0IGRpZmZlcnNcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgY2FudmFzIGhlaWdodFxuICAgIGNvbnN0IGRvbUhlaWdodCA9IGdldFRleHRIZWlnaHQodGV4dCwgTWF0aC5yb3VuZChmb250U2l6ZSksIGxpbmVIZWlnaHQpO1xuICAgIGlmIChjYW52YXNIZWlnaHQgPiBoZWlnaHQpIHtcbiAgICAgIGJhc2VsaW5lICs9IGNhbnZhc0hlaWdodCAtIGRvbUhlaWdodDtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0ID4gY2FudmFzSGVpZ2h0KSB7XG4gICAgICBiYXNlbGluZSAtPSBkb21IZWlnaHQgLSBjYW52YXNIZWlnaHQ7XG4gICAgfVxuICB9XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgcmV0dXJuIHsgYmFzZWxpbmUsIGhlaWdodCB9O1xufTtcblxuLyoqXG4gKiBUbyBnZXQgdW5pdGxlc3MgbGluZS1oZWlnaHQgKGlmIHVua25vd24pIHdlIGNhbiBjYWxjdWxhdGUgaXQgYnkgZGl2aWRpbmdcbiAqIGhlaWdodC1wZXItbGluZSBieSBmb250U2l6ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVjdExpbmVIZWlnaHQgPSAodGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCkgPT4ge1xuICBjb25zdCBsaW5lQ291bnQgPSBzcGxpdEludG9MaW5lcyh0ZXh0RWxlbWVudC50ZXh0KS5sZW5ndGg7XG4gIHJldHVybiAodGV4dEVsZW1lbnQuaGVpZ2h0IC9cbiAgICBsaW5lQ291bnQgL1xuICAgIHRleHRFbGVtZW50LmZvbnRTaXplKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdO1xufTtcblxuLyoqXG4gKiBXZSBjYWxjdWxhdGUgdGhlIGxpbmUgaGVpZ2h0IGZyb20gdGhlIGZvbnQgc2l6ZSBhbmQgdGhlIHVuaXRsZXNzIGxpbmUgaGVpZ2h0LFxuICogYWxpZ25pbmcgd2l0aCB0aGUgVzNDIHNwZWMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRMaW5lSGVpZ2h0SW5QeCA9IChcbiAgZm9udFNpemU6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImZvbnRTaXplXCJdLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHJldHVybiBmb250U2l6ZSAqIGxpbmVIZWlnaHQ7XG59O1xuXG4vLyBGSVhNRSByZW5hbWUgdG8gZ2V0QXBwcm94TWluQ29udGFpbmVySGVpZ2h0XG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZUhlaWdodCA9IChcbiAgZm9udFNpemU6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImZvbnRTaXplXCJdLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHJldHVybiBnZXRMaW5lSGVpZ2h0SW5QeChmb250U2l6ZSwgbGluZUhlaWdodCkgKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxubGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IGdldExpbmVXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICB9XG4gIGNvbnN0IGNhbnZhczJkQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuICBjYW52YXMyZENvbnRleHQuZm9udCA9IGZvbnQ7XG4gIGNvbnN0IHdpZHRoID0gY2FudmFzMmRDb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoO1xuXG4gIC8vIHNpbmNlIGluIHRlc3QgZW52IHRoZSBjYW52YXMgbWVhc3VyZVRleHQgYWxnb1xuICAvLyBkb2Vzbid0IG1lYXN1cmUgdGV4dCBhbmQgaW5zdGVhZCBqdXN0IHJldHVybnMgbnVtYmVyIG9mXG4gIC8vIGNoYXJhY3RlcnMgaGVuY2Ugd2UgYXNzdW1lIHRoYXQgZWFjaCBsZXR0ZXJpcyAxMHB4XG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIHJldHVybiB3aWR0aCAqIDEwO1xuICB9XG4gIHJldHVybiB3aWR0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0V2lkdGggPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGxpbmVzID0gc3BsaXRJbnRvTGluZXModGV4dCk7XG4gIGxldCB3aWR0aCA9IDA7XG4gIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBnZXRMaW5lV2lkdGgobGluZSwgZm9udCkpO1xuICB9KTtcbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRIZWlnaHQgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZm9udFNpemU6IG51bWJlcixcbiAgbGluZUhlaWdodDogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBsaW5lQ291bnQgPSBzcGxpdEludG9MaW5lcyh0ZXh0KS5sZW5ndGg7XG4gIHJldHVybiBnZXRMaW5lSGVpZ2h0SW5QeChmb250U2l6ZSwgbGluZUhlaWdodCkgKiBsaW5lQ291bnQ7XG59O1xuXG5leHBvcnQgY29uc3Qgd3JhcFRleHQgPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIGlmIG1heFdpZHRoIGlzIG5vdCBmaW5pdGUgb3IgTmFOIHdoaWNoIGNhbiBoYXBwZW4gaW4gY2FzZSBvZiBidWdzIGluXG4gIC8vIGNvbXB1dGF0aW9uLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBjb250aW51ZSBhcyB3ZSdsbCBlbmQgdXBcbiAgLy8gaW4gYW4gaW5maW5pdGUgbG9vcFxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShtYXhXaWR0aCkgfHwgbWF4V2lkdGggPCAwKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBjb25zdCBsaW5lczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBjb25zdCBvcmlnaW5hbExpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgY29uc3Qgc3BhY2VXaWR0aCA9IGdldExpbmVXaWR0aChcIiBcIiwgZm9udCk7XG5cbiAgbGV0IGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgbGV0IGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcblxuICBjb25zdCBwdXNoID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHN0ci50cmltKCkpIHtcbiAgICAgIGxpbmVzLnB1c2goc3RyKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVzZXRQYXJhbXMgPSAoKSA9PiB7XG4gICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgfTtcblxuICBvcmlnaW5hbExpbmVzLmZvckVhY2goKG9yaWdpbmFsTGluZSkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lV2lkdGggPSBnZXRUZXh0V2lkdGgob3JpZ2luYWxMaW5lLCBmb250KTtcblxuICAgIC8vUHVzaCB0aGUgbGluZSBpZiBpdHMgPD0gbWF4V2lkdGhcbiAgICBpZiAoY3VycmVudExpbmVXaWR0aCA8PSBtYXhXaWR0aCkge1xuICAgICAgbGluZXMucHVzaChvcmlnaW5hbExpbmUpO1xuICAgICAgcmV0dXJuOyAvLyBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB3b3JkcyA9IG9yaWdpbmFsTGluZS5zcGxpdChcIiBcIik7XG5cbiAgICByZXNldFBhcmFtcygpO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudFdvcmRXaWR0aCA9IGdldExpbmVXaWR0aCh3b3Jkc1tpbmRleF0sIGZvbnQpO1xuXG4gICAgICAvLyBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2hlbiBzaW5nbGUgd29yZCB0YWtlcyBlbnRpcmUgd2lkdGhcbiAgICAgIGlmIChjdXJyZW50V29yZFdpZHRoID09PSBtYXhXaWR0aCkge1xuICAgICAgICBwdXNoKHdvcmRzW2luZGV4XSk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IGJyZWFraW5nIGxvbmdlciB3b3JkcyBleGNlZWRpbmcgbWF4IHdpZHRoXG4gICAgICBlbHNlIGlmIChjdXJyZW50V29yZFdpZHRoID4gbWF4V2lkdGgpIHtcbiAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgc2luY2UgdGhlIGN1cnJlbnQgd29yZCBleGNlZWRzIHRoZSBtYXggd2lkdGhcbiAgICAgICAgLy8gc28gd2lsbCBiZSBhcHBlbmRlZCBpbiBuZXh0IGxpbmVcbiAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG5cbiAgICAgICAgcmVzZXRQYXJhbXMoKTtcblxuICAgICAgICB3aGlsZSAod29yZHNbaW5kZXhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KFxuICAgICAgICAgICAgd29yZHNbaW5kZXhdLmNvZGVQb2ludEF0KDApISxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2hhcldpZHRoLmNhbGN1bGF0ZShjdXJyZW50Q2hhciwgZm9udCk7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gd2lkdGg7XG4gICAgICAgICAgd29yZHNbaW5kZXhdID0gd29yZHNbaW5kZXhdLnNsaWNlKGN1cnJlbnRDaGFyLmxlbmd0aCk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gd2lkdGg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgcmVzZXRQYXJhbXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgLy8gYXMgY3VycmVudExpbmUgY29udGFpbnMgY2hhcnMgd2hpY2ggY291bGRuJ3QgYmUgYXBwZW5kZWRcbiAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lXG4gICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gc3BhY2VXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RhcnQgYXBwZW5kaW5nIHdvcmRzIGluIGEgbGluZSB0aWxsIG1heCB3aWR0aCByZWFjaGVkXG4gICAgICAgIHdoaWxlIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA8IG1heFdpZHRoICYmIGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2luZGV4XTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChjdXJyZW50TGluZSArIHdvcmQsIGZvbnQpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID4gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgcmVzZXRQYXJhbXMoKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgY3VycmVudExpbmUgKz0gYCR7d29yZH0gYDtcblxuICAgICAgICAgIC8vIFB1c2ggdGhlIHdvcmQgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICsgc3BhY2VXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIHB1c2god29yZCk7XG4gICAgICAgICAgICByZXNldFBhcmFtcygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyZW50TGluZS5zbGljZSgtMSkgPT09IFwiIFwiKSB7XG4gICAgICAvLyBvbmx5IHJlbW92ZSBsYXN0IHRyYWlsaW5nIHNwYWNlIHdoaWNoIHdlIGhhdmUgYWRkZWQgd2hlbiBqb2luaW5nIHdvcmRzXG4gICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoYXJXaWR0aCA9ICgoKSA9PiB7XG4gIGNvbnN0IGNhY2hlZENoYXJXaWR0aDogeyBba2V5OiBGb250U3RyaW5nXTogQXJyYXk8bnVtYmVyPiB9ID0ge307XG5cbiAgY29uc3QgY2FsY3VsYXRlID0gKGNoYXI6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIGNvbnN0IGFzY2lpID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdKSB7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF0gPSBbXTtcbiAgICB9XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGdldExpbmVXaWR0aChjaGFyLCBmb250KTtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0gPSB3aWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXTtcbiAgfTtcblxuICBjb25zdCBnZXRDYWNoZSA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBjYWxjdWxhdGUsXG4gICAgZ2V0Q2FjaGUsXG4gIH07XG59KSgpO1xuXG5jb25zdCBEVU1NWV9URVhUID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlcIi50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuXG4vLyBGSVhNRSByZW5hbWUgdG8gZ2V0QXBwcm94TWluQ29udGFpbmVyV2lkdGhcbmV4cG9ydCBjb25zdCBnZXRBcHByb3hNaW5MaW5lV2lkdGggPSAoXG4gIGZvbnQ6IEZvbnRTdHJpbmcsXG4gIGxpbmVIZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4pID0+IHtcbiAgY29uc3QgbWF4Q2hhcldpZHRoID0gZ2V0TWF4Q2hhcldpZHRoKGZvbnQpO1xuICBpZiAobWF4Q2hhcldpZHRoID09PSAwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQuc3BsaXQoXCJcIikuam9pbihcIlxcblwiKSwgZm9udCwgbGluZUhlaWdodCkud2lkdGggK1xuICAgICAgQk9VTkRfVEVYVF9QQURESU5HICogMlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1heENoYXJXaWR0aCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluQ2hhcldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBjaGFyV2lkdGguZ2V0Q2FjaGUoZm9udCk7XG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBjYWNoZVdpdGhPdXRFbXB0eSA9IGNhY2hlLmZpbHRlcigodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIE1hdGgubWluKC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIE1hdGgubWF4KC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hDaGFyc1RvRml0SW5XaWR0aCA9IChmb250OiBGb250U3RyaW5nLCB3aWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIEdlbmVyYWxseSBsb3dlciBjYXNlIGlzIHVzZWQgc28gY29udmVydGluZyB0byBsb3dlciBjYXNlXG4gIGNvbnN0IGR1bW15VGV4dCA9IERVTU1ZX1RFWFQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgYmF0Y2hMZW5ndGggPSA2O1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgd2lkdGhUaWxsTm93ID0gMDtcbiAgbGV0IHN0ciA9IFwiXCI7XG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPD0gd2lkdGgpIHtcbiAgICBjb25zdCBiYXRjaCA9IGR1bW15VGV4dC5zdWJzdHIoaW5kZXgsIGluZGV4ICsgYmF0Y2hMZW5ndGgpO1xuICAgIHN0ciArPSBiYXRjaDtcbiAgICB3aWR0aFRpbGxOb3cgKz0gZ2V0TGluZVdpZHRoKHN0ciwgZm9udCk7XG4gICAgaWYgKGluZGV4ID09PSBkdW1teVRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICBpbmRleCA9IGluZGV4ICsgYmF0Y2hMZW5ndGg7XG4gIH1cblxuICB3aGlsZSAod2lkdGhUaWxsTm93ID4gd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICB3aWR0aFRpbGxOb3cgPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgfVxuICByZXR1cm4gc3RyLmxlbmd0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50SWQgPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgcmV0dXJuIGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8ubGVuZ3RoXG4gICAgPyBjb250YWluZXI/LmJvdW5kRWxlbWVudHM/LmZpbHRlcigoZWxlKSA9PiBlbGUudHlwZSA9PT0gXCJ0ZXh0XCIpWzBdPy5pZCB8fFxuICAgICAgICBudWxsXG4gICAgOiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybiAoXG4gICAgICAoU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcikgfHwgbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyRWxlbWVudCA9IChcbiAgZWxlbWVudDpcbiAgICB8IChFeGNhbGlkcmF3RWxlbWVudCAmIHtcbiAgICAgICAgY29udGFpbmVySWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0gfCBudWxsO1xuICAgICAgfSlcbiAgICB8IG51bGwsXG4pID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5jb250YWluZXJJZCkgfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJEaW1zID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGNvbnN0IE1JTl9XSURUSCA9IDMwMDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChlbGVtZW50LndpZHRoLCBNSU5fV0lEVEgpO1xuICAgIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuICByZXR1cm4geyB3aWR0aDogZWxlbWVudC53aWR0aCwgaGVpZ2h0OiBlbGVtZW50LmhlaWdodCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckNlbnRlciA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjb250YWluZXIueCArIGNvbnRhaW5lci53aWR0aCAvIDIsXG4gICAgICB5OiBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9pbnRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhjb250YWluZXIpO1xuICBpZiAocG9pbnRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoY29udGFpbmVyLnBvaW50cy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBtaWRQb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGNvbnRhaW5lci5wb2ludHNbaW5kZXhdLFxuICAgICk7XG4gICAgcmV0dXJuIHsgeDogbWlkUG9pbnRbMF0sIHk6IG1pZFBvaW50WzFdIH07XG4gIH1cbiAgY29uc3QgaW5kZXggPSBjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIgLSAxO1xuICBsZXQgbWlkU2VnbWVudE1pZHBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFZGl0b3JNaWRQb2ludHMoXG4gICAgY29udGFpbmVyLFxuICAgIGFwcFN0YXRlLFxuICApW2luZGV4XTtcbiAgaWYgKCFtaWRTZWdtZW50TWlkcG9pbnQpIHtcbiAgICBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRQb2ludChcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBvaW50c1tpbmRleF0sXG4gICAgICBwb2ludHNbaW5kZXggKyAxXSxcbiAgICAgIGluZGV4ICsgMSxcbiAgICApO1xuICB9XG4gIHJldHVybiB7IHg6IG1pZFNlZ21lbnRNaWRwb2ludFswXSwgeTogbWlkU2VnbWVudE1pZHBvaW50WzFdIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ29vcmRzID0gKGNvbnRhaW5lcjogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGxldCBvZmZzZXRYID0gQk9VTkRfVEVYVF9QQURESU5HO1xuICBsZXQgb2Zmc2V0WSA9IEJPVU5EX1RFWFRfUEFERElORztcblxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgLy8gVGhlIGRlcml2YXRpb24gb2YgY29vcmRpbmF0ZXMgaXMgZXhwbGFpbmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MTcyXG4gICAgb2Zmc2V0WCArPSAoY29udGFpbmVyLndpZHRoIC8gMikgKiAoMSAtIE1hdGguc3FydCgyKSAvIDIpO1xuICAgIG9mZnNldFkgKz0gKGNvbnRhaW5lci5oZWlnaHQgLyAyKSAqICgxIC0gTWF0aC5zcXJ0KDIpIC8gMik7XG4gIH1cbiAgLy8gVGhlIGRlcml2YXRpb24gb2YgY29vcmRpbmF0ZXMgaXMgZXhwbGFpbmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MjY1XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICBvZmZzZXRYICs9IGNvbnRhaW5lci53aWR0aCAvIDQ7XG4gICAgb2Zmc2V0WSArPSBjb250YWluZXIuaGVpZ2h0IC8gNDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IGNvbnRhaW5lci54ICsgb2Zmc2V0WCxcbiAgICB5OiBjb250YWluZXIueSArIG9mZnNldFksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEVsZW1lbnRBbmdsZSA9ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lciB8fCBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHRleHRFbGVtZW50LmFuZ2xlO1xuICB9XG4gIHJldHVybiBjb250YWluZXIuYW5nbGU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCA9IChcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lciB8fCAhYm91bmRUZXh0RWxlbWVudCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORyAqIDg7XG4gIH1cblxuICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3VsZEFsbG93VmVydGljYWxBbGlnbiA9IChcbiAgc2VsZWN0ZWRFbGVtZW50czogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pID0+IHtcbiAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGhhc0JvdW5kQ29udGFpbmVyID0gaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpO1xuICAgIGlmIChoYXNCb3VuZENvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc3VwcHBvcnRzSG9yaXpvbnRhbEFsaWduID0gKFxuICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbikgPT4ge1xuICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaGFzQm91bmRDb250YWluZXIgPSBpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCk7XG4gICAgaWYgKGhhc0JvdW5kQ29udGFpbmVyKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbiA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lciB8IG51bGwgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUpO1xuICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSwgZmFsc2UpXG4gICAgICA/IHNlbGVjdGVkRWxlbWVudHNbMF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBsZXQgaGl0RWxlbWVudCA9IG51bGw7XG4gIC8vIFdlIG5lZWQgdG8gdG8gaGl0IHRlc3RpbmcgZnJvbSBmcm9udCAoZW5kIG9mIHRoZSBhcnJheSkgdG8gYmFjayAoYmVnaW5uaW5nIG9mIHRoZSBhcnJheSlcbiAgZm9yIChsZXQgaW5kZXggPSBlbGVtZW50cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyAtLWluZGV4KSB7XG4gICAgaWYgKGVsZW1lbnRzW2luZGV4XS5pc0RlbGV0ZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnRzW2luZGV4XSk7XG4gICAgaWYgKFxuICAgICAgaXNBcnJvd0VsZW1lbnQoZWxlbWVudHNbaW5kZXhdKSAmJlxuICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudHNbaW5kZXhdLCBhcHBTdGF0ZSwgW1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgXSlcbiAgICApIHtcbiAgICAgIGhpdEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKHgxIDwgeCAmJiB4IDwgeDIgJiYgeTEgPCB5ICYmIHkgPCB5Mikge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihoaXRFbGVtZW50LCBmYWxzZSkgPyBoaXRFbGVtZW50IDogbnVsbDtcbn07XG5cbmNvbnN0IFZBTElEX0NPTlRBSU5FUl9UWVBFUyA9IG5ldyBTZXQoW1xuICBcInJlY3RhbmdsZVwiLFxuICBcImVsbGlwc2VcIixcbiAgXCJkaWFtb25kXCIsXG4gIFwiaW1hZ2VcIixcbiAgXCJhcnJvd1wiLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkVGV4dENvbnRhaW5lciA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT5cbiAgVkFMSURfQ09OVEFJTkVSX1RZUEVTLmhhcyhlbGVtZW50LnR5cGUpO1xuXG5leHBvcnQgY29uc3QgY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dCA9IChcbiAgZGltZW5zaW9uOiBudW1iZXIsXG4gIGNvbnRhaW5lclR5cGU6IEV4dHJhY3RTZXRUeXBlPHR5cGVvZiBWQUxJRF9DT05UQUlORVJfVFlQRVM+LFxuKSA9PiB7XG4gIGRpbWVuc2lvbiA9IE1hdGguY2VpbChkaW1lbnNpb24pO1xuICBjb25zdCBwYWRkaW5nID0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcblxuICBpZiAoY29udGFpbmVyVHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoKGRpbWVuc2lvbiArIHBhZGRpbmcpIC8gTWF0aC5zcXJ0KDIpKSAqIDIpO1xuICB9XG4gIGlmIChjb250YWluZXJUeXBlID09PSBcImFycm93XCIpIHtcbiAgICByZXR1cm4gZGltZW5zaW9uICsgcGFkZGluZyAqIDg7XG4gIH1cbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgcmV0dXJuIDIgKiAoZGltZW5zaW9uICsgcGFkZGluZyk7XG4gIH1cbiAgcmV0dXJuIGRpbWVuc2lvbiArIHBhZGRpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q29udGFpbmVyV2lkdGggPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKS53aWR0aDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHdpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogOCAqIDI7XG4gICAgaWYgKGNvbnRhaW5lcldpZHRoIDw9IDApIHtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgIGlmIChib3VuZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kVGV4dC53aWR0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcldpZHRoO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhbiBlbGxpcHNlIGlzXG4gICAgLy8gTWF0aC5yb3VuZCgoZWxsaXBzZS53aWR0aCAvIDIpICogTWF0aC5zcXJ0KDIpKSB3aGljaCBpcyBkZXJpdmVkIGZyb21cbiAgICAvLyBlcXVhdGlvbiBvZiBhbiBlbGxpcHNlIC1odHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIHJldHVybiBNYXRoLnJvdW5kKCh3aWR0aCAvIDIpICogTWF0aC5zcXJ0KDIpKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhIHJob21idXMgaXNcbiAgICAvLyBNYXRoLnJvdW5kKHdpZHRoIC8gMikgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICAgIHJldHVybiBNYXRoLnJvdW5kKHdpZHRoIC8gMikgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIHJldHVybiB3aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q29udGFpbmVySGVpZ2h0ID0gKGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgaGVpZ2h0ID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpLmhlaWdodDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBoZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgICBpZiAoY29udGFpbmVySGVpZ2h0IDw9IDApIHtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgIGlmIChib3VuZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kVGV4dC5oZWlnaHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogOCAqIDI7XG4gICAgfVxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYW4gZWxsaXBzZSBpc1xuICAgIC8vIE1hdGgucm91bmQoKGVsbGlwc2UuaGVpZ2h0IC8gMikgKiBNYXRoLnNxcnQoMikpIHdoaWNoIGlzIGRlcml2ZWQgZnJvbVxuICAgIC8vIGVxdWF0aW9uIG9mIGFuIGVsbGlwc2UgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIHJldHVybiBNYXRoLnJvdW5kKChoZWlnaHQgLyAyKSAqIE1hdGguc3FydCgyKSkgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGEgcmhvbWJ1cyBpc1xuICAgIC8vIE1hdGgucm91bmQoaGVpZ2h0IC8gMikgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAvIDIpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICByZXR1cm4gaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc01lYXN1cmVUZXh0U3VwcG9ydGVkID0gKCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldFRleHRXaWR0aChcbiAgICBEVU1NWV9URVhULFxuICAgIGdldEZvbnRTdHJpbmcoe1xuICAgICAgZm9udFNpemU6IERFRkFVTFRfRk9OVF9TSVpFLFxuICAgICAgZm9udEZhbWlseTogREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgICB9KSxcbiAgKTtcbiAgcmV0dXJuIHdpZHRoID4gMDtcbn07XG5cbi8qKlxuICogVW5pdGxlc3MgbGluZSBoZWlnaHRcbiAqXG4gKiBJbiBwcmV2aW91cyB2ZXJzaW9ucyB3ZSB1c2VkIGBub3JtYWxgIGxpbmUgaGVpZ2h0LCB3aGljaCBicm93c2VycyBpbnRlcnByZXRcbiAqIGRpZmZlcmVudGx5LCBhbmQgYmFzZWQgb24gZm9udC1mYW1pbHkgYW5kIGZvbnQtc2l6ZS5cbiAqXG4gKiBUbyBtYWtlIGxpbmUgaGVpZ2h0cyBjb25zaXN0ZW50IGFjcm9zcyBicm93c2VycyB3ZSBoYXJkY29kZSB0aGUgdmFsdWVzIGZvclxuICogZWFjaCBvZiBvdXIgZm9udHMgYmFzZWQgb24gbW9zdCBjb21tb24gYXZlcmFnZSBsaW5lLWhlaWdodHMuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYzNjAjaXNzdWVjb21tZW50LTE0Nzc2MzU5NzFcbiAqIHdoZXJlIHRoZSB2YWx1ZXMgY29tZSBmcm9tLlxuICovXG5jb25zdCBERUZBVUxUX0xJTkVfSEVJR0hUID0ge1xuICAvLyB+MS4yNSBpcyB0aGUgYXZlcmFnZSBmb3IgVmlyZ2lsIGluIFdlYktpdCBhbmQgQmxpbmsuXG4gIC8vIEdlY2tvIChGRikgdXNlcyB+MS4yOC5cbiAgW0ZPTlRfRkFNSUxZLlZpcmdpbF06IDEuMjUgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbiAgLy8gfjEuMTUgaXMgdGhlIGF2ZXJhZ2UgZm9yIFZpcmdpbCBpbiBXZWJLaXQgYW5kIEJsaW5rLlxuICAvLyBHZWNrbyBpZiBhbGwgb3ZlciB0aGUgcGxhY2UuXG4gIFtGT05UX0ZBTUlMWS5IZWx2ZXRpY2FdOiAxLjE1IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4gIC8vIH4xLjIgaXMgdGhlIGF2ZXJhZ2UgZm9yIFZpcmdpbCBpbiBXZWJLaXQgYW5kIEJsaW5rLCBhbmQga2luZGEgR2Vja28gdG9vXG4gIFtGT05UX0ZBTUlMWS5DYXNjYWRpYV06IDEuMiBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxufTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRMaW5lSGVpZ2h0ID0gKGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXMpID0+IHtcbiAgaWYgKGZvbnRGYW1pbHkgaW4gREVGQVVMVF9MSU5FX0hFSUdIVCkge1xuICAgIHJldHVybiBERUZBVUxUX0xJTkVfSEVJR0hUW2ZvbnRGYW1pbHldO1xuICB9XG4gIHJldHVybiBERUZBVUxUX0xJTkVfSEVJR0hUW0RFRkFVTFRfRk9OVF9GQU1JTFldO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3333
3333
|
|
|
3334
3334
|
/***/ }),
|
|
3335
3335
|
|
|
@@ -3340,7 +3340,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3340
3340
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3341
3341
|
|
|
3342
3342
|
"use strict";
|
|
3343
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getOriginalContainerHeightFromCache\": () => (/* binding */ getOriginalContainerHeightFromCache),\n/* harmony export */ \"resetOriginalContainerCache\": () => (/* binding */ resetOriginalContainerCache),\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg),\n/* harmony export */ \"updateOriginalContainerCache\": () => (/* binding */ updateOriginalContainerCache)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \"../../actions/actionProperties.tsx\");\n/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\n const { zoom } = appState;\n const degree = (180 * angle) / Math.PI;\n let translateX = (width * (zoom.value - 1)) / 2;\n let translateY = (height * (zoom.value - 1)) / 2;\n if (width > maxWidth && zoom.value !== 1) {\n translateX = (maxWidth * (zoom.value - 1)) / 2;\n }\n if (height > maxHeight && zoom.value !== 1) {\n translateY = (maxHeight * (zoom.value - 1)) / 2;\n }\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\n};\nconst originalContainerCache = {};\nconst updateOriginalContainerCache = (id, height) => {\n const data = originalContainerCache[id] || (originalContainerCache[id] = { height });\n data.height = height;\n return data;\n};\nconst resetOriginalContainerCache = (id) => {\n if (originalContainerCache[id]) {\n delete originalContainerCache[id];\n }\n};\nconst getOriginalContainerHeightFromCache = (id) => {\n var _a, _b;\n return (_b = (_a = originalContainerCache[id]) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : null;\n};\nconst textWysiwyg = ({ id, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\n const textPropertiesUpdated = (updatedTextElement, editable) => {\n if (!editable.style.fontFamily || !editable.style.fontSize) {\n return false;\n }\n const currentFont = editable.style.fontFamily.replace(/\"/g, \"\");\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedTextElement.fontFamily }) !==\n currentFont) {\n return true;\n }\n if (`${updatedTextElement.fontSize}px` !== editable.style.fontSize) {\n return true;\n }\n return false;\n };\n const updateWysiwygStyle = () => {\n var _a;\n const appState = app.state;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n if (!updatedTextElement) {\n return;\n }\n const { textAlign, verticalAlign } = updatedTextElement;\n if (updatedTextElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedTextElement)) {\n let coordX = updatedTextElement.x;\n let coordY = updatedTextElement.y;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedTextElement);\n let maxWidth = updatedTextElement.width;\n let maxHeight = updatedTextElement.height;\n let textElementWidth = updatedTextElement.width;\n // Set to element height by default since that's\n // what is going to be used for unbounded text\n let textElementHeight = updatedTextElement.height;\n if (container && updatedTextElement.containerId) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const boundTextCoords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(container, updatedTextElement);\n coordX = boundTextCoords.x;\n coordY = boundTextCoords.y;\n }\n const propertiesUpdated = textPropertiesUpdated(updatedTextElement, editable);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerDims)(container);\n // using editor.style.height to get the accurate height of text editor\n const editorHeight = Number(editable.style.height.slice(0, -2));\n if (editorHeight > 0) {\n textElementHeight = editorHeight;\n }\n if (propertiesUpdated) {\n // update height of the editor after properties updated\n textElementHeight = updatedTextElement.height;\n }\n let originalContainerData;\n if (propertiesUpdated) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n else {\n originalContainerData = originalContainerCache[container.id];\n if (!originalContainerData) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n }\n maxWidth = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container);\n maxHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerHeight)(container);\n // autogrow container height if text exceeds\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) && textElementHeight > maxHeight) {\n const targetContainerHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.computeContainerDimensionForBoundText)(textElementHeight, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: targetContainerHeight });\n return;\n }\n else if (\n // autoshrink container height until original container height\n // is reached when text is removed\n !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) &&\n containerDims.height > originalContainerData.height &&\n textElementHeight < maxHeight) {\n const targetContainerHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.computeContainerDimensionForBoundText)(textElementHeight, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: targetContainerHeight });\n }\n // Start pushing text upward until a diff of 30px (padding)\n // is reached\n else {\n const containerCoords = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerCoords)(container);\n // vertically center align the text\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.MIDDLE) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n coordY =\n containerCoords.y + maxHeight / 2 - textElementHeight / 2;\n }\n }\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.BOTTOM) {\n coordY = containerCoords.y + (maxHeight - textElementHeight);\n }\n }\n }\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\n const initialSelectionStart = editable.selectionStart;\n const initialSelectionEnd = editable.selectionEnd;\n const initialLength = editable.value.length;\n editable.value = updatedTextElement.originalText;\n // restore cursor position after value updated so it doesn't\n // go to the end of text when container auto expanded\n if (initialSelectionStart === initialSelectionEnd &&\n initialSelectionEnd !== initialLength) {\n // get diff between length and selection end and shift\n // the cursor by \"diff\" times to position correctly\n const diff = initialLength - initialSelectionEnd;\n editable.selectionStart = editable.value.length - diff;\n editable.selectionEnd = editable.value.length - diff;\n }\n if (!container) {\n maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;\n textElementWidth = Math.min(textElementWidth, maxWidth);\n }\n else {\n textElementWidth += 0.5;\n }\n // Make sure text editor height doesn't go beyond viewport\n const editorMaxHeight = (appState.height - viewportY) / appState.zoom.value;\n Object.assign(editable.style, {\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement),\n // must be defined *after* font ¯\\_(ツ)_/¯\n lineHeight: element.lineHeight,\n width: `${textElementWidth}px`,\n height: `${textElementHeight}px`,\n left: `${viewportX}px`,\n top: `${viewportY}px`,\n transform: getTransform(textElementWidth, textElementHeight, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextElementAngle)(updatedTextElement), appState, maxWidth, editorMaxHeight),\n textAlign,\n verticalAlign,\n color: updatedTextElement.strokeColor,\n opacity: updatedTextElement.opacity / 100,\n filter: \"var(--theme-filter)\",\n maxHeight: `${editorMaxHeight}px`,\n });\n editable.scrollTop = 0;\n // For some reason updating font attribute doesn't set font family\n // hence updating font family explicitly for test environment\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedTextElement);\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedTextElement, { x: coordX, y: coordY });\n }\n };\n const editable = document.createElement(\"textarea\");\n editable.dir = \"auto\";\n editable.tabIndex = 0;\n editable.dataset.type = \"wysiwyg\";\n // prevent line wrapping on Safari\n editable.wrap = \"off\";\n editable.classList.add(\"excalidraw-wysiwyg\");\n let whiteSpace = \"pre\";\n let wordBreak = \"normal\";\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n whiteSpace = \"pre-wrap\";\n wordBreak = \"break-word\";\n }\n Object.assign(editable.style, {\n position: \"absolute\",\n display: \"inline-block\",\n minHeight: \"1em\",\n backfaceVisibility: \"hidden\",\n margin: 0,\n padding: 0,\n border: 0,\n outline: 0,\n resize: \"none\",\n background: \"transparent\",\n overflow: \"hidden\",\n // must be specified because in dark mode canvas creates a stacking context\n zIndex: \"var(--zIndex-wysiwyg)\",\n wordBreak,\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\n whiteSpace,\n overflowWrap: \"break-word\",\n boxSizing: \"content-box\",\n });\n updateWysiwygStyle();\n if (onChange) {\n editable.onpaste = (event) => __awaiter(void 0, void 0, void 0, function* () {\n const clipboardData = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.parseClipboard)(event, true);\n if (!clipboardData.text) {\n return;\n }\n const data = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(clipboardData.text);\n if (!data) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)({\n fontSize: app.state.currentItemFontSize,\n fontFamily: app.state.currentItemFontFamily,\n });\n if (container) {\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(`${editable.value}${data}`, font, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container));\n const width = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextWidth)(wrappedText, font);\n editable.style.width = `${width}px`;\n }\n });\n editable.oninput = () => {\n var _a;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value), font, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container));\n const { width, height } = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.measureText)(wrappedText, font, updatedTextElement.lineHeight);\n editable.style.width = `${width}px`;\n editable.style.height = `${height}px`;\n }\n onChange((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value));\n };\n }\n editable.onkeydown = (event) => {\n if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn);\n updateWysiwygStyle();\n }\n else if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut);\n updateWysiwygStyle();\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\n event.preventDefault();\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\n event.preventDefault();\n if (event.isComposing || event.keyCode === 229) {\n return;\n }\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\n event.preventDefault();\n if (event.isComposing) {\n return;\n }\n else if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\n outdent();\n }\n else {\n indent();\n }\n // We must send an input event to resize the element\n editable.dispatchEvent(new Event(\"input\"));\n }\n };\n const TAB_SIZE = 4;\n const TAB = \" \".repeat(TAB_SIZE);\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\n const indent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex);\n value = `${startValue}${TAB}${endValue}`;\n });\n editable.value = value;\n editable.selectionStart = selectionStart + TAB_SIZE;\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\n };\n const outdent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n const removedTabs = [];\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const tabMatch = value\n .slice(startIndex, startIndex + TAB_SIZE)\n .match(RE_LEADING_TAB);\n if (tabMatch) {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex + tabMatch[0].length);\n // Delete a tab from the line\n value = `${startValue}${endValue}`;\n removedTabs.push(startIndex);\n }\n });\n editable.value = value;\n if (removedTabs.length) {\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\n }\n else {\n // If the cursor is before the first tab removed, ex:\n // Line| #1\n // Line #2\n // Lin|e #3\n // we should reset the selectionStart to his initial value.\n editable.selectionStart = selectionStart;\n }\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\n }\n };\n /**\n * @returns indices of start positions of selected lines, in reverse order\n */\n const getSelectedLinesStartIndices = () => {\n let { selectionStart, selectionEnd, value } = editable;\n // chars before selectionStart on the same line\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\n .length;\n // put caret at the start of the line\n selectionStart = selectionStart - startOffset;\n const selected = value.slice(selectionStart, selectionEnd);\n return selected\n .split(\"\\n\")\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\n ? // curr line index is prev line's start + prev line's length + \\n\n startIndices[idx - 1] + lines[idx - 1].length + 1\n : // first selected line\n selectionStart), [])\n .reverse();\n };\n const stopEvent = (event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n // using a state variable instead of passing it to the handleSubmit callback\n // so that we don't need to create separate a callback for event handlers\n let submittedViaKeyboard = false;\n const handleSubmit = () => {\n var _a, _b;\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\n // wysiwyg on update\n cleanup();\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\n if (!updateElement) {\n return;\n }\n let text = editable.value;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\n if (container) {\n text = updateElement.text;\n if (editable.value.trim()) {\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\n if (!boundTextElementId || boundTextElementId !== element.id) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: element.id,\n }),\n });\n }\n }\n else {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele)),\n });\n }\n (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(updateElement, container);\n }\n onSubmit({\n text,\n viaKeyboard: submittedViaKeyboard,\n originalText: editable.value,\n });\n };\n const cleanup = () => {\n if (isDestroyed) {\n return;\n }\n isDestroyed = true;\n // remove events to ensure they don't late-fire\n editable.onblur = null;\n editable.oninput = null;\n editable.onkeydown = null;\n if (observer) {\n observer.disconnect();\n }\n window.removeEventListener(\"resize\", updateWysiwygStyle);\n window.removeEventListener(\"wheel\", stopEvent, true);\n window.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n window.removeEventListener(\"blur\", handleSubmit);\n unbindUpdate();\n editable.remove();\n };\n const bindBlurEvent = (event) => {\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\n // trigger the blur on ensuing pointerup.\n // Also to handle cases such as picking a color which would trigger a blur\n // in that same tick.\n const target = event === null || event === void 0 ? void 0 : event.target;\n const isTargetColorPicker = target instanceof HTMLInputElement &&\n target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\n setTimeout(() => {\n editable.onblur = handleSubmit;\n if (target && isTargetColorPicker) {\n target.onblur = () => {\n editable.focus();\n };\n }\n // case: clicking on the same property → no change → no update → no focus\n if (!isTargetColorPicker) {\n editable.focus();\n }\n });\n };\n // prevent blur when changing properties from the menu\n const onPointerDown = (event) => {\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\n event.target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\n if (((event.target instanceof HTMLElement ||\n event.target instanceof SVGElement) &&\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\n isTargetColorPicker) {\n editable.onblur = null;\n window.addEventListener(\"pointerup\", bindBlurEvent);\n // handle edge-case where pointerup doesn't fire e.g. due to user\n // alt-tabbing away\n window.addEventListener(\"blur\", handleSubmit);\n }\n };\n // handle updates of textElement properties of editing element\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\n var _a;\n updateWysiwygStyle();\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\n if (!isColorPickerActive) {\n editable.focus();\n }\n });\n // ---------------------------------------------------------------------------\n let isDestroyed = false;\n // select on init (focusing is done separately inside the bindBlurEvent()\n // because we need it to happen *after* the blur event from `pointerdown`)\n editable.select();\n bindBlurEvent();\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\n // is preferred so we catch changes from host, where window may not resize.\n let observer = null;\n if (canvas && \"ResizeObserver\" in window) {\n observer = new window.ResizeObserver(() => {\n updateWysiwygStyle();\n });\n observer.observe(canvas);\n }\n else {\n window.addEventListener(\"resize\", updateWysiwygStyle);\n }\n window.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"wheel\", stopEvent, {\n passive: false,\n capture: true,\n });\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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MUI7U0FBTTtRQUNMLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztLQUN2RDtJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7UUFDMUMsT0FBTyxFQUFFLEtBQUs7UUFDZCxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUMsQ0FBQztJQUNILG1CQUFtQixhQUFuQixtQkFBbUIsdUJBQW5CLG1CQUFtQixDQUNmLGFBQWEsQ0FBQyxpQ0FBaUMsRUFDaEQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRXeXNpd3lnLnRzeD84ZjRkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENPREVTLCBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7XG4gIGlzV3JpdGFibGVFbGVtZW50LFxuICBnZXRGb250U3RyaW5nLFxuICBnZXRGb250RmFtaWx5U3RyaW5nLFxuICBpc1Rlc3RFbnYsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHtcbiAgaXNBcnJvd0VsZW1lbnQsXG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgZ2V0Q29udGFpbmVyQ29vcmRzLFxuICBnZXRDb250YWluZXJEaW1zLFxuICBnZXRDb250YWluZXJFbGVtZW50LFxuICBnZXRUZXh0RWxlbWVudEFuZ2xlLFxuICBnZXRUZXh0V2lkdGgsXG4gIG1lYXN1cmVUZXh0LFxuICBub3JtYWxpemVUZXh0LFxuICByZWRyYXdUZXh0Qm91bmRpbmdCb3gsXG4gIHdyYXBUZXh0LFxuICBnZXRNYXhDb250YWluZXJIZWlnaHQsXG4gIGdldE1heENvbnRhaW5lcldpZHRoLFxuICBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0LFxufSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgYWN0aW9uRGVjcmVhc2VGb250U2l6ZSxcbiAgYWN0aW9uSW5jcmVhc2VGb250U2l6ZSxcbn0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uUHJvcGVydGllc1wiO1xuaW1wb3J0IHsgYWN0aW9uWm9vbUluLCBhY3Rpb25ab29tT3V0IH0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uQ2FudmFzXCI7XG5pbXBvcnQgQXBwIGZyb20gXCIuLi9jb21wb25lbnRzL0FwcFwiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuL2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7IHBhcnNlQ2xpcGJvYXJkIH0gZnJvbSBcIi4uL2NsaXBib2FyZFwiO1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSAoXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBhbmdsZTogbnVtYmVyLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIG1heFdpZHRoOiBudW1iZXIsXG4gIG1heEhlaWdodDogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IHsgem9vbSB9ID0gYXBwU3RhdGU7XG4gIGNvbnN0IGRlZ3JlZSA9ICgxODAgKiBhbmdsZSkgLyBNYXRoLlBJO1xuICBsZXQgdHJhbnNsYXRlWCA9ICh3aWR0aCAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgbGV0IHRyYW5zbGF0ZVkgPSAoaGVpZ2h0ICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICBpZiAod2lkdGggPiBtYXhXaWR0aCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWCA9IChtYXhXaWR0aCAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgfVxuICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0ICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVZID0gKG1heEhlaWdodCAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgfVxuICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9cHgsICR7dHJhbnNsYXRlWX1weCkgc2NhbGUoJHt6b29tLnZhbHVlfSkgcm90YXRlKCR7ZGVncmVlfWRlZylgO1xufTtcblxuY29uc3Qgb3JpZ2luYWxDb250YWluZXJDYWNoZToge1xuICBbaWQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl1dOlxuICAgIHwge1xuICAgICAgICBoZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaGVpZ2h0XCJdO1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkO1xufSA9IHt9O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZSA9IChcbiAgaWQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl0sXG4gIGhlaWdodDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJoZWlnaHRcIl0sXG4pID0+IHtcbiAgY29uc3QgZGF0YSA9XG4gICAgb3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF0gfHwgKG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdID0geyBoZWlnaHQgfSk7XG4gIGRhdGEuaGVpZ2h0ID0gaGVpZ2h0O1xuICByZXR1cm4gZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUgPSAoXG4gIGlkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdLFxuKSA9PiB7XG4gIGlmIChvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXSkge1xuICAgIGRlbGV0ZSBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldE9yaWdpbmFsQ29udGFpbmVySGVpZ2h0RnJvbUNhY2hlID0gKFxuICBpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXSxcbikgPT4ge1xuICByZXR1cm4gb3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF0/LmhlaWdodCA/PyBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHRleHRXeXNpd3lnID0gKHtcbiAgaWQsXG4gIG9uQ2hhbmdlLFxuICBvblN1Ym1pdCxcbiAgZ2V0Vmlld3BvcnRDb29yZHMsXG4gIGVsZW1lbnQsXG4gIGNhbnZhcyxcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcixcbiAgYXBwLFxufToge1xuICBpZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXTtcbiAgb25DaGFuZ2U/OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICBvblN1Ym1pdDogKGRhdGE6IHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgdmlhS2V5Ym9hcmQ6IGJvb2xlYW47XG4gICAgb3JpZ2luYWxUZXh0OiBzdHJpbmc7XG4gIH0pID0+IHZvaWQ7XG4gIGdldFZpZXdwb3J0Q29vcmRzOiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlcl07XG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGw7XG4gIGV4Y2FsaWRyYXdDb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgYXBwOiBBcHA7XG59KSA9PiB7XG4gIGNvbnN0IHRleHRQcm9wZXJ0aWVzVXBkYXRlZCA9IChcbiAgICB1cGRhdGVkVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgICBlZGl0YWJsZTogSFRNTFRleHRBcmVhRWxlbWVudCxcbiAgKSA9PiB7XG4gICAgaWYgKCFlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5IHx8ICFlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50Rm9udCA9IGVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkucmVwbGFjZSgvXCIvZywgXCJcIik7XG4gICAgaWYgKFxuICAgICAgZ2V0Rm9udEZhbWlseVN0cmluZyh7IGZvbnRGYW1pbHk6IHVwZGF0ZWRUZXh0RWxlbWVudC5mb250RmFtaWx5IH0pICE9PVxuICAgICAgY3VycmVudEZvbnRcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoYCR7dXBkYXRlZFRleHRFbGVtZW50LmZvbnRTaXplfXB4YCAhPT0gZWRpdGFibGUuc3R5bGUuZm9udFNpemUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlV3lzaXd5Z1N0eWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IGFwcFN0YXRlID0gYXBwLnN0YXRlO1xuICAgIGNvbnN0IHVwZGF0ZWRUZXh0RWxlbWVudCA9XG4gICAgICBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudDxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+KGlkKTtcblxuICAgIGlmICghdXBkYXRlZFRleHRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgdGV4dEFsaWduLCB2ZXJ0aWNhbEFsaWduIH0gPSB1cGRhdGVkVGV4dEVsZW1lbnQ7XG5cbiAgICBpZiAodXBkYXRlZFRleHRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQodXBkYXRlZFRleHRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRUZXh0RWxlbWVudC54O1xuICAgICAgbGV0IGNvb3JkWSA9IHVwZGF0ZWRUZXh0RWxlbWVudC55O1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgbGV0IG1heFdpZHRoID0gdXBkYXRlZFRleHRFbGVtZW50LndpZHRoO1xuXG4gICAgICBsZXQgbWF4SGVpZ2h0ID0gdXBkYXRlZFRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgIGxldCB0ZXh0RWxlbWVudFdpZHRoID0gdXBkYXRlZFRleHRFbGVtZW50LndpZHRoO1xuICAgICAgLy8gU2V0IHRvIGVsZW1lbnQgaGVpZ2h0IGJ5IGRlZmF1bHQgc2luY2UgdGhhdCdzXG4gICAgICAvLyB3aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHVuYm91bmRlZCB0ZXh0XG4gICAgICBsZXQgdGV4dEVsZW1lbnRIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0O1xuXG4gICAgICBpZiAoY29udGFpbmVyICYmIHVwZGF0ZWRUZXh0RWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dENvb3JkcyA9XG4gICAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgICB1cGRhdGVkVGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29vcmRYID0gYm91bmRUZXh0Q29vcmRzLng7XG4gICAgICAgICAgY29vcmRZID0gYm91bmRUZXh0Q29vcmRzLnk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcGVydGllc1VwZGF0ZWQgPSB0ZXh0UHJvcGVydGllc1VwZGF0ZWQoXG4gICAgICAgICAgdXBkYXRlZFRleHRFbGVtZW50LFxuICAgICAgICAgIGVkaXRhYmxlLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICAgICAgICAvLyB1c2luZyBlZGl0b3Iuc3R5bGUuaGVpZ2h0IHRvIGdldCB0aGUgYWNjdXJhdGUgaGVpZ2h0IG9mIHRleHQgZWRpdG9yXG4gICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcbiAgICAgICAgaWYgKGVkaXRvckhlaWdodCA+IDApIHtcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA9IGVkaXRvckhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgYWZ0ZXIgcHJvcGVydGllcyB1cGRhdGVkXG4gICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9yaWdpbmFsQ29udGFpbmVyRGF0YTtcbiAgICAgICAgaWYgKHByb3BlcnRpZXNVcGRhdGVkKSB7XG4gICAgICAgICAgb3JpZ2luYWxDb250YWluZXJEYXRhID0gdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShcbiAgICAgICAgICAgIGNvbnRhaW5lci5pZCxcbiAgICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JpZ2luYWxDb250YWluZXJEYXRhID0gb3JpZ2luYWxDb250YWluZXJDYWNoZVtjb250YWluZXIuaWRdO1xuICAgICAgICAgIGlmICghb3JpZ2luYWxDb250YWluZXJEYXRhKSB7XG4gICAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKFxuICAgICAgICAgICAgICBjb250YWluZXIuaWQsXG4gICAgICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtYXhXaWR0aCA9IGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lcik7XG4gICAgICAgIG1heEhlaWdodCA9IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpO1xuXG4gICAgICAgIC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG4gICAgICAgIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJiB0ZXh0RWxlbWVudEhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lckhlaWdodCA9IGNvbXB1dGVDb250YWluZXJEaW1lbnNpb25Gb3JCb3VuZFRleHQoXG4gICAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCxcbiAgICAgICAgICAgIGNvbnRhaW5lci50eXBlLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IHRhcmdldENvbnRhaW5lckhlaWdodCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gYXV0b3NocmluayBjb250YWluZXIgaGVpZ2h0IHVudGlsIG9yaWdpbmFsIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgICBjb250YWluZXJEaW1zLmhlaWdodCA+IG9yaWdpbmFsQ29udGFpbmVyRGF0YS5oZWlnaHQgJiZcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA8IG1heEhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRDb250YWluZXJIZWlnaHQgPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQsXG4gICAgICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogdGFyZ2V0Q29udGFpbmVySGVpZ2h0IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0YXJ0IHB1c2hpbmcgdGV4dCB1cHdhcmQgdW50aWwgYSBkaWZmIG9mIDMwcHggKHBhZGRpbmcpXG4gICAgICAgIC8vIGlzIHJlYWNoZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyQ29vcmRzID0gZ2V0Q29udGFpbmVyQ29vcmRzKGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnbiB0aGUgdGV4dFxuICAgICAgICAgIGlmICh2ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5NSURETEUpIHtcbiAgICAgICAgICAgIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICAgICAgICBjb29yZFkgPVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lckNvb3Jkcy55ICsgbWF4SGVpZ2h0IC8gMiAtIHRleHRFbGVtZW50SGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLkJPVFRPTSkge1xuICAgICAgICAgICAgY29vcmRZID0gY29udGFpbmVyQ29vcmRzLnkgKyAobWF4SGVpZ2h0IC0gdGV4dEVsZW1lbnRIZWlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgW3ZpZXdwb3J0WCwgdmlld3BvcnRZXSA9IGdldFZpZXdwb3J0Q29vcmRzKGNvb3JkWCwgY29vcmRZKTtcbiAgICAgIGNvbnN0IGluaXRpYWxTZWxlY3Rpb25TdGFydCA9IGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgY29uc3QgaW5pdGlhbFNlbGVjdGlvbkVuZCA9IGVkaXRhYmxlLnNlbGVjdGlvbkVuZDtcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSBlZGl0YWJsZS52YWx1ZS5sZW5ndGg7XG4gICAgICBlZGl0YWJsZS52YWx1ZSA9IHVwZGF0ZWRUZXh0RWxlbWVudC5vcmlnaW5hbFRleHQ7XG5cbiAgICAgIC8vIHJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIHZhbHVlIHVwZGF0ZWQgc28gaXQgZG9lc24ndFxuICAgICAgLy8gZ28gdG8gdGhlIGVuZCBvZiB0ZXh0IHdoZW4gY29udGFpbmVyIGF1dG8gZXhwYW5kZWRcbiAgICAgIGlmIChcbiAgICAgICAgaW5pdGlhbFNlbGVjdGlvblN0YXJ0ID09PSBpbml0aWFsU2VsZWN0aW9uRW5kICYmXG4gICAgICAgIGluaXRpYWxTZWxlY3Rpb25FbmQgIT09IGluaXRpYWxMZW5ndGhcbiAgICAgICkge1xuICAgICAgICAvLyBnZXQgZGlmZiBiZXR3ZWVuIGxlbmd0aCBhbmQgc2VsZWN0aW9uIGVuZCBhbmQgc2hpZnRcbiAgICAgICAgLy8gdGhlIGN1cnNvciBieSBcImRpZmZcIiB0aW1lcyB0byBwb3NpdGlvbiBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgZGlmZiA9IGluaXRpYWxMZW5ndGggLSBpbml0aWFsU2VsZWN0aW9uRW5kO1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IGVkaXRhYmxlLnZhbHVlLmxlbmd0aCAtIGRpZmY7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IGVkaXRhYmxlLnZhbHVlLmxlbmd0aCAtIGRpZmY7XG4gICAgICB9XG5cbiAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIG1heFdpZHRoID0gKGFwcFN0YXRlLndpZHRoIC0gOCAtIHZpZXdwb3J0WCkgLyBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgICB0ZXh0RWxlbWVudFdpZHRoID0gTWF0aC5taW4odGV4dEVsZW1lbnRXaWR0aCwgbWF4V2lkdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dEVsZW1lbnRXaWR0aCArPSAwLjU7XG4gICAgICB9XG4gICAgICAvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaGVpZ2h0IGRvZXNuJ3QgZ28gYmV5b25kIHZpZXdwb3J0XG4gICAgICBjb25zdCBlZGl0b3JNYXhIZWlnaHQgPVxuICAgICAgICAoYXBwU3RhdGUuaGVpZ2h0IC0gdmlld3BvcnRZKSAvIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZFRleHRFbGVtZW50KSxcbiAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkICphZnRlciogZm9udCDCr1xcXyjjg4QpXy/Cr1xuICAgICAgICBsaW5lSGVpZ2h0OiBlbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICAgIHdpZHRoOiBgJHt0ZXh0RWxlbWVudFdpZHRofXB4YCxcbiAgICAgICAgaGVpZ2h0OiBgJHt0ZXh0RWxlbWVudEhlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgdGV4dEVsZW1lbnRXaWR0aCxcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCxcbiAgICAgICAgICBnZXRUZXh0RWxlbWVudEFuZ2xlKHVwZGF0ZWRUZXh0RWxlbWVudCksXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgZWRpdG9yTWF4SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgIHZlcnRpY2FsQWxpZ24sXG4gICAgICAgIGNvbG9yOiB1cGRhdGVkVGV4dEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRUZXh0RWxlbWVudC5vcGFjaXR5IC8gMTAwLFxuICAgICAgICBmaWx0ZXI6IFwidmFyKC0tdGhlbWUtZmlsdGVyKVwiLFxuICAgICAgICBtYXhIZWlnaHQ6IGAke2VkaXRvck1heEhlaWdodH1weGAsXG4gICAgICB9KTtcbiAgICAgIGVkaXRhYmxlLnNjcm9sbFRvcCA9IDA7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gdXBkYXRpbmcgZm9udCBhdHRyaWJ1dGUgZG9lc24ndCBzZXQgZm9udCBmYW1pbHlcbiAgICAgIC8vIGhlbmNlIHVwZGF0aW5nIGZvbnQgZmFtaWx5IGV4cGxpY2l0bHkgZm9yIHRlc3QgZW52aXJvbm1lbnRcbiAgICAgIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5ID0gZ2V0Rm9udEZhbWlseVN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgbXV0YXRlRWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQsIHsgeDogY29vcmRYLCB5OiBjb29yZFkgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGVkaXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiO1xuICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG4gIGVkaXRhYmxlLndyYXAgPSBcIm9mZlwiO1xuICBlZGl0YWJsZS5jbGFzc0xpc3QuYWRkKFwiZXhjYWxpZHJhdy13eXNpd3lnXCIpO1xuXG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihlZGl0YWJsZS5zdHlsZSwge1xuICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICBtaW5IZWlnaHQ6IFwiMWVtXCIsXG4gICAgYmFja2ZhY2VWaXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICBvdXRsaW5lOiAwLFxuICAgIHJlc2l6ZTogXCJub25lXCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgIC8vIG11c3QgYmUgc3BlY2lmaWVkIGJlY2F1c2UgaW4gZGFyayBtb2RlIGNhbnZhcyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dFxuICAgIHpJbmRleDogXCJ2YXIoLS16SW5kZXgtd3lzaXd5ZylcIixcbiAgICB3b3JkQnJlYWssXG4gICAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIChgd2hpdGVzcGFjZTogbm93cmFwYCBkb2Vzbid0IHdvcmsgb24gRkYpXG4gICAgd2hpdGVTcGFjZSxcbiAgICBvdmVyZmxvd1dyYXA6IFwiYnJlYWstd29yZFwiLFxuICAgIGJveFNpemluZzogXCJjb250ZW50LWJveFwiLFxuICB9KTtcbiAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG5cbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgZWRpdGFibGUub25wYXN0ZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGF3YWl0IHBhcnNlQ2xpcGJvYXJkKGV2ZW50LCB0cnVlKTtcbiAgICAgIGlmICghY2xpcGJvYXJkRGF0YS50ZXh0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBub3JtYWxpemVUZXh0KGNsaXBib2FyZERhdGEudGV4dCk7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgY29uc3QgZm9udCA9IGdldEZvbnRTdHJpbmcoe1xuICAgICAgICBmb250U2l6ZTogYXBwLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IGFwcC5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZFRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICBgJHtlZGl0YWJsZS52YWx1ZX0ke2RhdGF9YCxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZ2V0VGV4dFdpZHRoKHdyYXBwZWRUZXh0LCBmb250KTtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgaWQsXG4gICAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICAgIGNvbnN0IGZvbnQgPSBnZXRGb250U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRUZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgbm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSksXG4gICAgICAgICAgZm9udCxcbiAgICAgICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIhKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBtZWFzdXJlVGV4dChcbiAgICAgICAgICB3cmFwcGVkVGV4dCxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIHVwZGF0ZWRUZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBhY3Rpb25ab29tSW4ua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblpvb21Jbik7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9IGVsc2UgaWYgKCFldmVudC5zaGlmdEtleSAmJiBhY3Rpb25ab29tT3V0LmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25ab29tT3V0KTtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uRGVjcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkluY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uSW5jcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRVNDQVBFKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIgJiYgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuVEFCIHx8XG4gICAgICAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgICAgKGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCB8fFxuICAgICAgICAgIGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfUklHSFQpKVxuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCkge1xuICAgICAgICBvdXRkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG11c3Qgc2VuZCBhbiBpbnB1dCBldmVudCB0byByZXNpemUgdGhlIGVsZW1lbnRcbiAgICAgIGVkaXRhYmxlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBUQUJfU0laRSA9IDQ7XG4gIGNvbnN0IFRBQiA9IFwiIFwiLnJlcGVhdChUQUJfU0laRSk7XG4gIGNvbnN0IFJFX0xFQURJTkdfVEFCID0gbmV3IFJlZ0V4cChgXiB7MSwke1RBQl9TSVpFfX1gKTtcbiAgY29uc3QgaW5kZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCk7XG5cbiAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke1RBQn0ke2VuZFZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCArIFRBQl9TSVpFO1xuICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZCArIFRBQl9TSVpFICogbGluZXNTdGFydEluZGljZXMubGVuZ3RoO1xuICB9O1xuXG4gIGNvbnN0IG91dGRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBjb25zdCByZW1vdmVkVGFiczogbnVtYmVyW10gPSBbXTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRhYk1hdGNoID0gdmFsdWVcbiAgICAgICAgLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBUQUJfU0laRSlcbiAgICAgICAgLm1hdGNoKFJFX0xFQURJTkdfVEFCKTtcblxuICAgICAgaWYgKHRhYk1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4ICsgdGFiTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgICAgICAvLyBEZWxldGUgYSB0YWIgZnJvbSB0aGUgbGluZVxuICAgICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtlbmRWYWx1ZX1gO1xuICAgICAgICByZW1vdmVkVGFicy5wdXNoKHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChyZW1vdmVkVGFicy5sZW5ndGgpIHtcbiAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA+IHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgLSBUQUJfU0laRSxcbiAgICAgICAgICByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgYmVmb3JlIHRoZSBmaXJzdCB0YWIgcmVtb3ZlZCwgZXg6XG4gICAgICAgIC8vIExpbmV8ICMxXG4gICAgICAgIC8vICAgICBMaW5lICMyXG4gICAgICAgIC8vIExpbnxlICMzXG4gICAgICAgIC8vIHdlIHNob3VsZCByZXNldCB0aGUgc2VsZWN0aW9uU3RhcnQgdG8gaGlzIGluaXRpYWwgdmFsdWUuXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICB9XG4gICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIHNlbGVjdGlvbkVuZCAtIFRBQl9TSVpFICogcmVtb3ZlZFRhYnMubGVuZ3RoLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGluZGljZXMgb2Ygc3RhcnQgcG9zaXRpb25zIG9mIHNlbGVjdGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyXG4gICAqL1xuICBjb25zdCBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzID0gKCkgPT4ge1xuICAgIGxldCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQsIHZhbHVlIH0gPSBlZGl0YWJsZTtcblxuICAgIC8vIGNoYXJzIGJlZm9yZSBzZWxlY3Rpb25TdGFydCBvbiB0aGUgc2FtZSBsaW5lXG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSB2YWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1teXFxuXSokLykhWzBdXG4gICAgICAubGVuZ3RoO1xuICAgIC8vIHB1dCBjYXJldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmVcbiAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0IC0gc3RhcnRPZmZzZXQ7XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHZhbHVlLnNsaWNlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChzdGFydEluZGljZXMsIGxpbmUsIGlkeCwgbGluZXMpID0+XG4gICAgICAgICAgc3RhcnRJbmRpY2VzLmNvbmNhdChcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgICAgICA/IC8vIGN1cnIgbGluZSBpbmRleCBpcyBwcmV2IGxpbmUncyBzdGFydCArIHByZXYgbGluZSdzIGxlbmd0aCArIFxcblxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kaWNlc1tpZHggLSAxXSArIGxpbmVzW2lkeCAtIDFdLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgOiAvLyBmaXJzdCBzZWxlY3RlZCBsaW5lXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApXG4gICAgICAucmV2ZXJzZSgpO1xuICB9O1xuXG4gIGNvbnN0IHN0b3BFdmVudCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIC8vIHVzaW5nIGEgc3RhdGUgdmFyaWFibGUgaW5zdGVhZCBvZiBwYXNzaW5nIGl0IHRvIHRoZSBoYW5kbGVTdWJtaXQgY2FsbGJhY2tcbiAgLy8gc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBzZXBhcmF0ZSBhIGNhbGxiYWNrIGZvciBldmVudCBoYW5kbGVyc1xuICBsZXQgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSBmYWxzZTtcbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCkgPT4ge1xuICAgIC8vIGNsZWFudXAgbXVzdCBiZSBydW4gYmVmb3JlIG9uU3VibWl0IG90aGVyd2lzZSB3aGVuIGFwcCBibHVycyB0aGUgd3lzaXd5Z1xuICAgIC8vIGl0J2QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agb2YgYmx1cuKGkm9uU3VibWl0IGFmdGVyIHdlIHJlLWZvY3VzIHRoZVxuICAgIC8vIHd5c2l3eWcgb24gdXBkYXRlXG4gICAgY2xlYW51cCgpO1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgIGVsZW1lbnQuaWQsXG4gICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgaWYgKCF1cGRhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0ZXh0ID0gZWRpdGFibGUudmFsdWU7XG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh1cGRhdGVFbGVtZW50KTtcblxuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHRleHQgPSB1cGRhdGVFbGVtZW50LnRleHQ7XG4gICAgICBpZiAoZWRpdGFibGUudmFsdWUudHJpbSgpKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICAgICAgICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCB8fCBib3VuZFRleHRFbGVtZW50SWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgYm91bmRFbGVtZW50czogKGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzIHx8IFtdKS5jb25jYXQoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICBib3VuZEVsZW1lbnRzOiBjb250YWluZXIuYm91bmRFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgICAgICAgKGVsZSkgPT5cbiAgICAgICAgICAgICAgIWlzVGV4dEVsZW1lbnQoXG4gICAgICAgICAgICAgICAgZWxlIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCB8IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVkcmF3VGV4dEJvdW5kaW5nQm94KHVwZGF0ZUVsZW1lbnQsIGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgb25TdWJtaXQoe1xuICAgICAgdGV4dCxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBldmVudHMgdG8gZW5zdXJlIHRoZXkgZG9uJ3QgbGF0ZS1maXJlXG4gICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmtleWRvd24gPSBudWxsO1xuXG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcblxuICAgIHVuYmluZFVwZGF0ZSgpO1xuXG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IChldmVudD86IE1vdXNlRXZlbnQpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gaGFuZGxlU3VibWl0O1xuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGNhc2U6IGNsaWNraW5nIG9uIHRoZSBzYW1lIHByb3BlcnR5IOKGkiBubyBjaGFuZ2Ug4oaSIG5vIHVwZGF0ZSDihpIgbm8gZm9jdXNcbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZXZlbnQgYmx1ciB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgbWVudVxuICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKFxuICAgICAgKChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fFxuICAgICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJlxuICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChgLiR7Q0xBU1NFUy5TSEFQRV9BQ1RJT05TX01FTlV9YCkgJiZcbiAgICAgICAgIWlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHx8XG4gICAgICBpc1RhcmdldENvbG9yUGlja2VyXG4gICAgKSB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgICAvLyBoYW5kbGUgZWRnZS1jYXNlIHdoZXJlIHBvaW50ZXJ1cCBkb2Vzbid0IGZpcmUgZS5nLiBkdWUgdG8gdXNlclxuICAgICAgLy8gYWx0LXRhYmJpbmcgYXdheVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhhbmRsZSB1cGRhdGVzIG9mIHRleHRFbGVtZW50IHByb3BlcnRpZXMgb2YgZWRpdGluZyBlbGVtZW50XG4gIGNvbnN0IHVuYmluZFVwZGF0ZSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5hZGRDYWxsYmFjaygoKSA9PiB7XG4gICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgY29uc3QgaXNDb2xvclBpY2tlckFjdGl2ZSA9ICEhZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uY2xvc2VzdChcbiAgICAgIFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiLFxuICAgICk7XG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2VsZWN0IG9uIGluaXQgKGZvY3VzaW5nIGlzIGRvbmUgc2VwYXJhdGVseSBpbnNpZGUgdGhlIGJpbmRCbHVyRXZlbnQoKVxuICAvLyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gaGFwcGVuICphZnRlciogdGhlIGJsdXIgZXZlbnQgZnJvbSBgcG9pbnRlcmRvd25gKVxuICBlZGl0YWJsZS5zZWxlY3QoKTtcbiAgYmluZEJsdXJFdmVudCgpO1xuXG4gIC8vIHJlcG9zaXRpb24gd3lzaXd5ZyBpbiBjYXNlIG9mIGNhbnZhcyBpcyByZXNpemVkLiBVc2luZyBSZXNpemVPYnNlcnZlclxuICAvLyBpcyBwcmVmZXJyZWQgc28gd2UgY2F0Y2ggY2hhbmdlcyBmcm9tIGhvc3QsIHdoZXJlIHdpbmRvdyBtYXkgbm90IHJlc2l6ZS5cbiAgbGV0IG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBpZiAoY2FudmFzICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICBvYnNlcnZlciA9IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYW52YXMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwge1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWUsXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyXG4gICAgPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKSFcbiAgICAuYXBwZW5kQ2hpbGQoZWRpdGFibGUpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
|
|
3343
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getOriginalContainerHeightFromCache\": () => (/* binding */ getOriginalContainerHeightFromCache),\n/* harmony export */ \"resetOriginalContainerCache\": () => (/* binding */ resetOriginalContainerCache),\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg),\n/* harmony export */ \"updateOriginalContainerCache\": () => (/* binding */ updateOriginalContainerCache)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \"../../actions/actionProperties.tsx\");\n/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\n const { zoom } = appState;\n const degree = (180 * angle) / Math.PI;\n let translateX = (width * (zoom.value - 1)) / 2;\n let translateY = (height * (zoom.value - 1)) / 2;\n if (width > maxWidth && zoom.value !== 1) {\n translateX = (maxWidth * (zoom.value - 1)) / 2;\n }\n if (height > maxHeight && zoom.value !== 1) {\n translateY = (maxHeight * (zoom.value - 1)) / 2;\n }\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\n};\nconst originalContainerCache = {};\nconst updateOriginalContainerCache = (id, height) => {\n const data = originalContainerCache[id] || (originalContainerCache[id] = { height });\n data.height = height;\n return data;\n};\nconst resetOriginalContainerCache = (id) => {\n if (originalContainerCache[id]) {\n delete originalContainerCache[id];\n }\n};\nconst getOriginalContainerHeightFromCache = (id) => {\n var _a, _b;\n return (_b = (_a = originalContainerCache[id]) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : null;\n};\nconst textWysiwyg = ({ id, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\n const textPropertiesUpdated = (updatedTextElement, editable) => {\n if (!editable.style.fontFamily || !editable.style.fontSize) {\n return false;\n }\n const currentFont = editable.style.fontFamily.replace(/\"/g, \"\");\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedTextElement.fontFamily }) !==\n currentFont) {\n return true;\n }\n if (`${updatedTextElement.fontSize}px` !== editable.style.fontSize) {\n return true;\n }\n return false;\n };\n const updateWysiwygStyle = () => {\n var _a;\n const appState = app.state;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n if (!updatedTextElement) {\n return;\n }\n const { textAlign, verticalAlign } = updatedTextElement;\n if (updatedTextElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedTextElement)) {\n let coordX = updatedTextElement.x;\n let coordY = updatedTextElement.y;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedTextElement);\n let maxWidth = updatedTextElement.width;\n let maxHeight = updatedTextElement.height;\n let textElementWidth = updatedTextElement.width;\n // Set to element height by default since that's\n // what is going to be used for unbounded text\n let textElementHeight = updatedTextElement.height;\n if (container && updatedTextElement.containerId) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const boundTextCoords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(container, updatedTextElement);\n coordX = boundTextCoords.x;\n coordY = boundTextCoords.y;\n }\n const propertiesUpdated = textPropertiesUpdated(updatedTextElement, editable);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerDims)(container);\n // using editor.style.height to get the accurate height of text editor\n const editorHeight = Number(editable.style.height.slice(0, -2));\n if (editorHeight > 0) {\n textElementHeight = editorHeight;\n }\n if (propertiesUpdated) {\n // update height of the editor after properties updated\n textElementHeight = updatedTextElement.height;\n }\n let originalContainerData;\n if (propertiesUpdated) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n else {\n originalContainerData = originalContainerCache[container.id];\n if (!originalContainerData) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n }\n maxWidth = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container);\n maxHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerHeight)(container);\n // autogrow container height if text exceeds\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) && textElementHeight > maxHeight) {\n const targetContainerHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.computeContainerDimensionForBoundText)(textElementHeight, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: targetContainerHeight });\n return;\n }\n else if (\n // autoshrink container height until original container height\n // is reached when text is removed\n !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) &&\n containerDims.height > originalContainerData.height &&\n textElementHeight < maxHeight) {\n const targetContainerHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.computeContainerDimensionForBoundText)(textElementHeight, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: targetContainerHeight });\n }\n // Start pushing text upward until a diff of 30px (padding)\n // is reached\n else {\n const containerCoords = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerCoords)(container);\n // vertically center align the text\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.MIDDLE) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n coordY =\n containerCoords.y + maxHeight / 2 - textElementHeight / 2;\n }\n }\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.BOTTOM) {\n coordY = containerCoords.y + (maxHeight - textElementHeight);\n }\n }\n }\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\n const initialSelectionStart = editable.selectionStart;\n const initialSelectionEnd = editable.selectionEnd;\n const initialLength = editable.value.length;\n editable.value = updatedTextElement.originalText;\n // restore cursor position after value updated so it doesn't\n // go to the end of text when container auto expanded\n if (initialSelectionStart === initialSelectionEnd &&\n initialSelectionEnd !== initialLength) {\n // get diff between length and selection end and shift\n // the cursor by \"diff\" times to position correctly\n const diff = initialLength - initialSelectionEnd;\n editable.selectionStart = editable.value.length - diff;\n editable.selectionEnd = editable.value.length - diff;\n }\n if (!container) {\n maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;\n textElementWidth = Math.min(textElementWidth, maxWidth);\n }\n else {\n textElementWidth += 0.5;\n }\n let lineHeight = updatedTextElement.lineHeight;\n // In Safari the font size gets rounded off when rendering hence calculating the line height by rounding off font size\n if (_constants__WEBPACK_IMPORTED_MODULE_4__.isSafari) {\n lineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.detectLineHeight)(Object.assign(Object.assign({}, updatedTextElement), { fontSize: Math.round(updatedTextElement.fontSize) }));\n }\n // Make sure text editor height doesn't go beyond viewport\n const editorMaxHeight = (appState.height - viewportY) / appState.zoom.value;\n Object.assign(editable.style, {\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement),\n // must be defined *after* font ¯\\_(ツ)_/¯\n lineHeight,\n width: `${textElementWidth}px`,\n height: `${textElementHeight}px`,\n left: `${viewportX}px`,\n top: `${viewportY}px`,\n transform: getTransform(textElementWidth, textElementHeight, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextElementAngle)(updatedTextElement), appState, maxWidth, editorMaxHeight),\n textAlign,\n verticalAlign,\n color: updatedTextElement.strokeColor,\n opacity: updatedTextElement.opacity / 100,\n filter: \"var(--theme-filter)\",\n maxHeight: `${editorMaxHeight}px`,\n });\n editable.scrollTop = 0;\n // For some reason updating font attribute doesn't set font family\n // hence updating font family explicitly for test environment\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedTextElement);\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedTextElement, { x: coordX, y: coordY });\n }\n };\n const editable = document.createElement(\"textarea\");\n editable.dir = \"auto\";\n editable.tabIndex = 0;\n editable.dataset.type = \"wysiwyg\";\n // prevent line wrapping on Safari\n editable.wrap = \"off\";\n editable.classList.add(\"excalidraw-wysiwyg\");\n let whiteSpace = \"pre\";\n let wordBreak = \"normal\";\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n whiteSpace = \"pre-wrap\";\n wordBreak = \"break-word\";\n }\n Object.assign(editable.style, {\n position: \"absolute\",\n display: \"inline-block\",\n minHeight: \"1em\",\n backfaceVisibility: \"hidden\",\n margin: 0,\n padding: 0,\n border: 0,\n outline: 0,\n resize: \"none\",\n background: \"transparent\",\n overflow: \"hidden\",\n // must be specified because in dark mode canvas creates a stacking context\n zIndex: \"var(--zIndex-wysiwyg)\",\n wordBreak,\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\n whiteSpace,\n overflowWrap: \"break-word\",\n boxSizing: \"content-box\",\n });\n updateWysiwygStyle();\n if (onChange) {\n editable.onpaste = (event) => __awaiter(void 0, void 0, void 0, function* () {\n const clipboardData = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.parseClipboard)(event, true);\n if (!clipboardData.text) {\n return;\n }\n const data = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(clipboardData.text);\n if (!data) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)({\n fontSize: app.state.currentItemFontSize,\n fontFamily: app.state.currentItemFontFamily,\n });\n if (container) {\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(`${editable.value}${data}`, font, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container));\n const width = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextWidth)(wrappedText, font);\n editable.style.width = `${width}px`;\n }\n });\n editable.oninput = () => {\n var _a;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value), font, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container));\n const { width, height } = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.measureText)(wrappedText, font, updatedTextElement.lineHeight);\n editable.style.width = `${width}px`;\n editable.style.height = `${height}px`;\n }\n onChange((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value));\n };\n }\n editable.onkeydown = (event) => {\n if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn);\n updateWysiwygStyle();\n }\n else if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut);\n updateWysiwygStyle();\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\n event.preventDefault();\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\n event.preventDefault();\n if (event.isComposing || event.keyCode === 229) {\n return;\n }\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\n event.preventDefault();\n if (event.isComposing) {\n return;\n }\n else if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\n outdent();\n }\n else {\n indent();\n }\n // We must send an input event to resize the element\n editable.dispatchEvent(new Event(\"input\"));\n }\n };\n const TAB_SIZE = 4;\n const TAB = \" \".repeat(TAB_SIZE);\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\n const indent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex);\n value = `${startValue}${TAB}${endValue}`;\n });\n editable.value = value;\n editable.selectionStart = selectionStart + TAB_SIZE;\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\n };\n const outdent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n const removedTabs = [];\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const tabMatch = value\n .slice(startIndex, startIndex + TAB_SIZE)\n .match(RE_LEADING_TAB);\n if (tabMatch) {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex + tabMatch[0].length);\n // Delete a tab from the line\n value = `${startValue}${endValue}`;\n removedTabs.push(startIndex);\n }\n });\n editable.value = value;\n if (removedTabs.length) {\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\n }\n else {\n // If the cursor is before the first tab removed, ex:\n // Line| #1\n // Line #2\n // Lin|e #3\n // we should reset the selectionStart to his initial value.\n editable.selectionStart = selectionStart;\n }\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\n }\n };\n /**\n * @returns indices of start positions of selected lines, in reverse order\n */\n const getSelectedLinesStartIndices = () => {\n let { selectionStart, selectionEnd, value } = editable;\n // chars before selectionStart on the same line\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\n .length;\n // put caret at the start of the line\n selectionStart = selectionStart - startOffset;\n const selected = value.slice(selectionStart, selectionEnd);\n return selected\n .split(\"\\n\")\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\n ? // curr line index is prev line's start + prev line's length + \\n\n startIndices[idx - 1] + lines[idx - 1].length + 1\n : // first selected line\n selectionStart), [])\n .reverse();\n };\n const stopEvent = (event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n // using a state variable instead of passing it to the handleSubmit callback\n // so that we don't need to create separate a callback for event handlers\n let submittedViaKeyboard = false;\n const handleSubmit = () => {\n var _a, _b;\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\n // wysiwyg on update\n cleanup();\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\n if (!updateElement) {\n return;\n }\n let text = editable.value;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\n if (container) {\n text = updateElement.text;\n if (editable.value.trim()) {\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\n if (!boundTextElementId || boundTextElementId !== element.id) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: element.id,\n }),\n });\n }\n }\n else {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele)),\n });\n }\n (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(updateElement, container);\n }\n onSubmit({\n text,\n viaKeyboard: submittedViaKeyboard,\n originalText: editable.value,\n });\n };\n const cleanup = () => {\n if (isDestroyed) {\n return;\n }\n isDestroyed = true;\n // remove events to ensure they don't late-fire\n editable.onblur = null;\n editable.oninput = null;\n editable.onkeydown = null;\n if (observer) {\n observer.disconnect();\n }\n window.removeEventListener(\"resize\", updateWysiwygStyle);\n window.removeEventListener(\"wheel\", stopEvent, true);\n window.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n window.removeEventListener(\"blur\", handleSubmit);\n unbindUpdate();\n editable.remove();\n };\n const bindBlurEvent = (event) => {\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\n // trigger the blur on ensuing pointerup.\n // Also to handle cases such as picking a color which would trigger a blur\n // in that same tick.\n const target = event === null || event === void 0 ? void 0 : event.target;\n const isTargetColorPicker = target instanceof HTMLInputElement &&\n target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\n setTimeout(() => {\n editable.onblur = handleSubmit;\n if (target && isTargetColorPicker) {\n target.onblur = () => {\n editable.focus();\n };\n }\n // case: clicking on the same property → no change → no update → no focus\n if (!isTargetColorPicker) {\n editable.focus();\n }\n });\n };\n // prevent blur when changing properties from the menu\n const onPointerDown = (event) => {\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\n event.target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\n if (((event.target instanceof HTMLElement ||\n event.target instanceof SVGElement) &&\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\n isTargetColorPicker) {\n editable.onblur = null;\n window.addEventListener(\"pointerup\", bindBlurEvent);\n // handle edge-case where pointerup doesn't fire e.g. due to user\n // alt-tabbing away\n window.addEventListener(\"blur\", handleSubmit);\n }\n };\n // handle updates of textElement properties of editing element\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\n var _a;\n updateWysiwygStyle();\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\n if (!isColorPickerActive) {\n editable.focus();\n }\n });\n // ---------------------------------------------------------------------------\n let isDestroyed = false;\n // select on init (focusing is done separately inside the bindBlurEvent()\n // because we need it to happen *after* the blur event from `pointerdown`)\n editable.select();\n bindBlurEvent();\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\n // is preferred so we catch changes from host, where window may not resize.\n let observer = null;\n if (canvas && \"ResizeObserver\" in window) {\n observer = new window.ResizeObserver(() => {\n updateWysiwygStyle();\n });\n observer.observe(canvas);\n }\n else {\n window.addEventListener(\"resize\", updateWysiwygStyle);\n }\n window.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"wheel\", stopEvent, {\n passive: false,\n capture: true,\n });\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFNLElBQUksZ0JBQWdCLElBQUksTUFBTSxFQUFFO1FBQ3hDLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ3hDLGtCQUFrQixFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFCO1NBQU07UUFDTCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7S0FDdkQ7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFO1FBQzFDLE9BQU8sRUFBRSxLQUFLO1FBQ2QsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDLENBQUM7SUFDSCxtQkFBbUIsYUFBbkIsbUJBQW1CLHVCQUFuQixtQkFBbUIsQ0FDZixhQUFhLENBQUMsaUNBQWlDLEVBQ2hELFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90ZXh0V3lzaXd5Zy50c3g/OGY0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT0RFUywgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQge1xuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0Rm9udEZhbWlseVN0cmluZyxcbiAgaXNUZXN0RW52LFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7XG4gIGlzQXJyb3dFbGVtZW50LFxuICBpc0JvdW5kVG9Db250YWluZXIsXG4gIGlzVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IENMQVNTRVMsIGlzU2FmYXJpLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudElkLFxuICBnZXRDb250YWluZXJDb29yZHMsXG4gIGdldENvbnRhaW5lckRpbXMsXG4gIGdldENvbnRhaW5lckVsZW1lbnQsXG4gIGdldFRleHRFbGVtZW50QW5nbGUsXG4gIGdldFRleHRXaWR0aCxcbiAgbWVhc3VyZVRleHQsXG4gIG5vcm1hbGl6ZVRleHQsXG4gIHJlZHJhd1RleHRCb3VuZGluZ0JveCxcbiAgd3JhcFRleHQsXG4gIGdldE1heENvbnRhaW5lckhlaWdodCxcbiAgZ2V0TWF4Q29udGFpbmVyV2lkdGgsXG4gIGNvbXB1dGVDb250YWluZXJEaW1lbnNpb25Gb3JCb3VuZFRleHQsXG4gIGRldGVjdExpbmVIZWlnaHQsXG59IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQge1xuICBhY3Rpb25EZWNyZWFzZUZvbnRTaXplLFxuICBhY3Rpb25JbmNyZWFzZUZvbnRTaXplLFxufSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Qcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBhY3Rpb25ab29tSW4sIGFjdGlvblpvb21PdXQgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25DYW52YXNcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgcGFyc2VDbGlwYm9hcmQgfSBmcm9tIFwiLi4vY2xpcGJvYXJkXCI7XG5cbmNvbnN0IGdldFRyYW5zZm9ybSA9IChcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgbWF4V2lkdGg6IG51bWJlcixcbiAgbWF4SGVpZ2h0OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgeyB6b29tIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGFuZ2xlKSAvIE1hdGguUEk7XG4gIGxldCB0cmFuc2xhdGVYID0gKHdpZHRoICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9IChoZWlnaHQgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKG1heFdpZHRoICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQgJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVkgPSAobWF4SGVpZ2h0ICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIHJldHVybiBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH1weCwgJHt0cmFuc2xhdGVZfXB4KSBzY2FsZSgke3pvb20udmFsdWV9KSByb3RhdGUoJHtkZWdyZWV9ZGVnKWA7XG59O1xuXG5jb25zdCBvcmlnaW5hbENvbnRhaW5lckNhY2hlOiB7XG4gIFtpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXV06XG4gICAgfCB7XG4gICAgICAgIGhlaWdodDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJoZWlnaHRcIl07XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQ7XG59ID0ge307XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlID0gKFxuICBpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXSxcbiAgaGVpZ2h0OiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBkYXRhID1cbiAgICBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXSB8fCAob3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF0gPSB7IGhlaWdodCB9KTtcbiAgZGF0YS5oZWlnaHQgPSBoZWlnaHQ7XG4gIHJldHVybiBkYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZSA9IChcbiAgaWQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl0sXG4pID0+IHtcbiAgaWYgKG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdKSB7XG4gICAgZGVsZXRlIG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0T3JpZ2luYWxDb250YWluZXJIZWlnaHRGcm9tQ2FjaGUgPSAoXG4gIGlkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdLFxuKSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXT8uaGVpZ2h0ID8/IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFd5c2l3eWcgPSAoe1xuICBpZCxcbiAgb25DaGFuZ2UsXG4gIG9uU3VibWl0LFxuICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgZWxlbWVudCxcbiAgY2FudmFzLFxuICBleGNhbGlkcmF3Q29udGFpbmVyLFxuICBhcHAsXG59OiB7XG4gIGlkOiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdO1xuICBvbkNoYW5nZT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uU3VibWl0OiAoZGF0YToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB2aWFLZXlib2FyZDogYm9vbGVhbjtcbiAgICBvcmlnaW5hbFRleHQ6IHN0cmluZztcbiAgfSkgPT4gdm9pZDtcbiAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcbiAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICBhcHA6IEFwcDtcbn0pID0+IHtcbiAgY29uc3QgdGV4dFByb3BlcnRpZXNVcGRhdGVkID0gKFxuICAgIHVwZGF0ZWRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIGVkaXRhYmxlOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICApID0+IHtcbiAgICBpZiAoIWVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkgfHwgIWVkaXRhYmxlLnN0eWxlLmZvbnRTaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRGb250ID0gZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlKC9cIi9nLCBcIlwiKTtcbiAgICBpZiAoXG4gICAgICBnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseTogdXBkYXRlZFRleHRFbGVtZW50LmZvbnRGYW1pbHkgfSkgIT09XG4gICAgICBjdXJyZW50Rm9udFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChgJHt1cGRhdGVkVGV4dEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVXeXNpd3lnU3R5bGUgPSAoKSA9PiB7XG4gICAgY29uc3QgYXBwU3RhdGUgPSBhcHAuc3RhdGU7XG4gICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID1cbiAgICAgIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50PEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4oaWQpO1xuXG4gICAgaWYgKCF1cGRhdGVkVGV4dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB0ZXh0QWxpZ24sIHZlcnRpY2FsQWxpZ24gfSA9IHVwZGF0ZWRUZXh0RWxlbWVudDtcblxuICAgIGlmICh1cGRhdGVkVGV4dEVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQpKSB7XG4gICAgICBsZXQgY29vcmRYID0gdXBkYXRlZFRleHRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZFRleHRFbGVtZW50Lnk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICBsZXQgbWF4V2lkdGggPSB1cGRhdGVkVGV4dEVsZW1lbnQud2lkdGg7XG5cbiAgICAgIGxldCBtYXhIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IHRleHRFbGVtZW50V2lkdGggPSB1cGRhdGVkVGV4dEVsZW1lbnQud2lkdGg7XG4gICAgICAvLyBTZXQgdG8gZWxlbWVudCBoZWlnaHQgYnkgZGVmYXVsdCBzaW5jZSB0aGF0J3NcbiAgICAgIC8vIHdoYXQgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgdW5ib3VuZGVkIHRleHRcbiAgICAgIGxldCB0ZXh0RWxlbWVudEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZFRleHRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgICAgY29uc3QgYm91bmRUZXh0Q29vcmRzID1cbiAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRUZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb29yZFggPSBib3VuZFRleHRDb29yZHMueDtcbiAgICAgICAgICBjb29yZFkgPSBib3VuZFRleHRDb29yZHMueTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRleHRQcm9wZXJ0aWVzVXBkYXRlZChcbiAgICAgICAgICB1cGRhdGVkVGV4dEVsZW1lbnQsXG4gICAgICAgICAgZWRpdGFibGUsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgICAgIC8vIHVzaW5nIGVkaXRvci5zdHlsZS5oZWlnaHQgdG8gZ2V0IHRoZSBhY2N1cmF0ZSBoZWlnaHQgb2YgdGV4dCBlZGl0b3JcbiAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gTnVtYmVyKGVkaXRhYmxlLnN0eWxlLmhlaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRleHRFbGVtZW50SGVpZ2h0ID0gZWRpdG9ySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JpZ2luYWxDb250YWluZXJEYXRhO1xuICAgICAgICBpZiAocHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKFxuICAgICAgICAgICAgY29udGFpbmVyLmlkLFxuICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2NvbnRhaW5lci5pZF07XG4gICAgICAgICAgaWYgKCFvcmlnaW5hbENvbnRhaW5lckRhdGEpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVyRGF0YSA9IHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoXG4gICAgICAgICAgICAgIGNvbnRhaW5lci5pZCxcbiAgICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICAgICAgbWF4SGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gYXV0b2dyb3cgY29udGFpbmVyIGhlaWdodCBpZiB0ZXh0IGV4Y2VlZHNcbiAgICAgICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmIHRleHRFbGVtZW50SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29udGFpbmVySGVpZ2h0ID0gY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgICAgIHRleHRFbGVtZW50SGVpZ2h0LFxuICAgICAgICAgICAgY29udGFpbmVyLnR5cGUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogdGFyZ2V0Q29udGFpbmVySGVpZ2h0IH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBhdXRvc2hyaW5rIGNvbnRhaW5lciBoZWlnaHQgdW50aWwgb3JpZ2luYWwgY29udGFpbmVyIGhlaWdodFxuICAgICAgICAgIC8vIGlzIHJlYWNoZWQgd2hlbiB0ZXh0IGlzIHJlbW92ZWRcbiAgICAgICAgICAhaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJlxuICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0ID4gb3JpZ2luYWxDb250YWluZXJEYXRhLmhlaWdodCAmJlxuICAgICAgICAgIHRleHRFbGVtZW50SGVpZ2h0IDwgbWF4SGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lckhlaWdodCA9IGNvbXB1dGVDb250YWluZXJEaW1lbnNpb25Gb3JCb3VuZFRleHQoXG4gICAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCxcbiAgICAgICAgICAgIGNvbnRhaW5lci50eXBlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiB0YXJnZXRDb250YWluZXJIZWlnaHQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhcnQgcHVzaGluZyB0ZXh0IHVwd2FyZCB1bnRpbCBhIGRpZmYgb2YgMzBweCAocGFkZGluZylcbiAgICAgICAgLy8gaXMgcmVhY2hlZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb250YWluZXJDb29yZHMgPSBnZXRDb250YWluZXJDb29yZHMoY29udGFpbmVyKTtcblxuICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gICAgICAgICAgaWYgKHZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLk1JRERMRSkge1xuICAgICAgICAgICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgICAgICAgIGNvb3JkWSA9XG4gICAgICAgICAgICAgICAgY29udGFpbmVyQ29vcmRzLnkgKyBtYXhIZWlnaHQgLyAyIC0gdGV4dEVsZW1lbnRIZWlnaHQgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uQk9UVE9NKSB7XG4gICAgICAgICAgICBjb29yZFkgPSBjb250YWluZXJDb29yZHMueSArIChtYXhIZWlnaHQgLSB0ZXh0RWxlbWVudEhlaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3QgaW5pdGlhbFNlbGVjdGlvblN0YXJ0ID0gZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICBjb25zdCBpbml0aWFsU2VsZWN0aW9uRW5kID0gZWRpdGFibGUuc2VsZWN0aW9uRW5kO1xuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IGVkaXRhYmxlLnZhbHVlLmxlbmd0aDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZFRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dDtcblxuICAgICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgdmFsdWUgdXBkYXRlZCBzbyBpdCBkb2Vzbid0XG4gICAgICAvLyBnbyB0byB0aGUgZW5kIG9mIHRleHQgd2hlbiBjb250YWluZXIgYXV0byBleHBhbmRlZFxuICAgICAgaWYgKFxuICAgICAgICBpbml0aWFsU2VsZWN0aW9uU3RhcnQgPT09IGluaXRpYWxTZWxlY3Rpb25FbmQgJiZcbiAgICAgICAgaW5pdGlhbFNlbGVjdGlvbkVuZCAhPT0gaW5pdGlhbExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIC8vIGdldCBkaWZmIGJldHdlZW4gbGVuZ3RoIGFuZCBzZWxlY3Rpb24gZW5kIGFuZCBzaGlmdFxuICAgICAgICAvLyB0aGUgY3Vyc29yIGJ5IFwiZGlmZlwiIHRpbWVzIHRvIHBvc2l0aW9uIGNvcnJlY3RseVxuICAgICAgICBjb25zdCBkaWZmID0gaW5pdGlhbExlbmd0aCAtIGluaXRpYWxTZWxlY3Rpb25FbmQ7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gZWRpdGFibGUudmFsdWUubGVuZ3RoIC0gZGlmZjtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gZWRpdGFibGUudmFsdWUubGVuZ3RoIC0gZGlmZjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgbWF4V2lkdGggPSAoYXBwU3RhdGUud2lkdGggLSA4IC0gdmlld3BvcnRYKSAvIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICAgIHRleHRFbGVtZW50V2lkdGggPSBNYXRoLm1pbih0ZXh0RWxlbWVudFdpZHRoLCBtYXhXaWR0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0RWxlbWVudFdpZHRoICs9IDAuNTtcbiAgICAgIH1cblxuICAgICAgbGV0IGxpbmVIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQubGluZUhlaWdodDtcblxuICAgICAgLy8gSW4gU2FmYXJpIHRoZSBmb250IHNpemUgZ2V0cyByb3VuZGVkIG9mZiB3aGVuIHJlbmRlcmluZyBoZW5jZSBjYWxjdWxhdGluZyB0aGUgbGluZSBoZWlnaHQgYnkgcm91bmRpbmcgb2ZmIGZvbnQgc2l6ZVxuICAgICAgaWYgKGlzU2FmYXJpKSB7XG4gICAgICAgIGxpbmVIZWlnaHQgPSBkZXRlY3RMaW5lSGVpZ2h0KHtcbiAgICAgICAgICAuLi51cGRhdGVkVGV4dEVsZW1lbnQsXG4gICAgICAgICAgZm9udFNpemU6IE1hdGgucm91bmQodXBkYXRlZFRleHRFbGVtZW50LmZvbnRTaXplKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGVkaXRvciBoZWlnaHQgZG9lc24ndCBnbyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGNvbnN0IGVkaXRvck1heEhlaWdodCA9XG4gICAgICAgIChhcHBTdGF0ZS5oZWlnaHQgLSB2aWV3cG9ydFkpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICAgICAgZm9udDogZ2V0Rm9udFN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQsXG4gICAgICAgIHdpZHRoOiBgJHt0ZXh0RWxlbWVudFdpZHRofXB4YCxcbiAgICAgICAgaGVpZ2h0OiBgJHt0ZXh0RWxlbWVudEhlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgdGV4dEVsZW1lbnRXaWR0aCxcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCxcbiAgICAgICAgICBnZXRUZXh0RWxlbWVudEFuZ2xlKHVwZGF0ZWRUZXh0RWxlbWVudCksXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgZWRpdG9yTWF4SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgIHZlcnRpY2FsQWxpZ24sXG4gICAgICAgIGNvbG9yOiB1cGRhdGVkVGV4dEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRUZXh0RWxlbWVudC5vcGFjaXR5IC8gMTAwLFxuICAgICAgICBmaWx0ZXI6IFwidmFyKC0tdGhlbWUtZmlsdGVyKVwiLFxuICAgICAgICBtYXhIZWlnaHQ6IGAke2VkaXRvck1heEhlaWdodH1weGAsXG4gICAgICB9KTtcbiAgICAgIGVkaXRhYmxlLnNjcm9sbFRvcCA9IDA7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gdXBkYXRpbmcgZm9udCBhdHRyaWJ1dGUgZG9lc24ndCBzZXQgZm9udCBmYW1pbHlcbiAgICAgIC8vIGhlbmNlIHVwZGF0aW5nIGZvbnQgZmFtaWx5IGV4cGxpY2l0bHkgZm9yIHRlc3QgZW52aXJvbm1lbnRcbiAgICAgIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5ID0gZ2V0Rm9udEZhbWlseVN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgbXV0YXRlRWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQsIHsgeDogY29vcmRYLCB5OiBjb29yZFkgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGVkaXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiO1xuICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG4gIGVkaXRhYmxlLndyYXAgPSBcIm9mZlwiO1xuICBlZGl0YWJsZS5jbGFzc0xpc3QuYWRkKFwiZXhjYWxpZHJhdy13eXNpd3lnXCIpO1xuXG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihlZGl0YWJsZS5zdHlsZSwge1xuICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICBtaW5IZWlnaHQ6IFwiMWVtXCIsXG4gICAgYmFja2ZhY2VWaXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICBvdXRsaW5lOiAwLFxuICAgIHJlc2l6ZTogXCJub25lXCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgIC8vIG11c3QgYmUgc3BlY2lmaWVkIGJlY2F1c2UgaW4gZGFyayBtb2RlIGNhbnZhcyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dFxuICAgIHpJbmRleDogXCJ2YXIoLS16SW5kZXgtd3lzaXd5ZylcIixcbiAgICB3b3JkQnJlYWssXG4gICAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIChgd2hpdGVzcGFjZTogbm93cmFwYCBkb2Vzbid0IHdvcmsgb24gRkYpXG4gICAgd2hpdGVTcGFjZSxcbiAgICBvdmVyZmxvd1dyYXA6IFwiYnJlYWstd29yZFwiLFxuICAgIGJveFNpemluZzogXCJjb250ZW50LWJveFwiLFxuICB9KTtcbiAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG5cbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgZWRpdGFibGUub25wYXN0ZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGF3YWl0IHBhcnNlQ2xpcGJvYXJkKGV2ZW50LCB0cnVlKTtcbiAgICAgIGlmICghY2xpcGJvYXJkRGF0YS50ZXh0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBub3JtYWxpemVUZXh0KGNsaXBib2FyZERhdGEudGV4dCk7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgY29uc3QgZm9udCA9IGdldEZvbnRTdHJpbmcoe1xuICAgICAgICBmb250U2l6ZTogYXBwLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IGFwcC5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZFRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICBgJHtlZGl0YWJsZS52YWx1ZX0ke2RhdGF9YCxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZ2V0VGV4dFdpZHRoKHdyYXBwZWRUZXh0LCBmb250KTtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgaWQsXG4gICAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICAgIGNvbnN0IGZvbnQgPSBnZXRGb250U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRUZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgbm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSksXG4gICAgICAgICAgZm9udCxcbiAgICAgICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIhKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBtZWFzdXJlVGV4dChcbiAgICAgICAgICB3cmFwcGVkVGV4dCxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIHVwZGF0ZWRUZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBhY3Rpb25ab29tSW4ua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblpvb21Jbik7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9IGVsc2UgaWYgKCFldmVudC5zaGlmdEtleSAmJiBhY3Rpb25ab29tT3V0LmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25ab29tT3V0KTtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uRGVjcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkluY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uSW5jcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRVNDQVBFKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIgJiYgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuVEFCIHx8XG4gICAgICAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgICAgKGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCB8fFxuICAgICAgICAgIGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfUklHSFQpKVxuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCkge1xuICAgICAgICBvdXRkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG11c3Qgc2VuZCBhbiBpbnB1dCBldmVudCB0byByZXNpemUgdGhlIGVsZW1lbnRcbiAgICAgIGVkaXRhYmxlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBUQUJfU0laRSA9IDQ7XG4gIGNvbnN0IFRBQiA9IFwiIFwiLnJlcGVhdChUQUJfU0laRSk7XG4gIGNvbnN0IFJFX0xFQURJTkdfVEFCID0gbmV3IFJlZ0V4cChgXiB7MSwke1RBQl9TSVpFfX1gKTtcbiAgY29uc3QgaW5kZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCk7XG5cbiAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke1RBQn0ke2VuZFZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCArIFRBQl9TSVpFO1xuICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZCArIFRBQl9TSVpFICogbGluZXNTdGFydEluZGljZXMubGVuZ3RoO1xuICB9O1xuXG4gIGNvbnN0IG91dGRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBjb25zdCByZW1vdmVkVGFiczogbnVtYmVyW10gPSBbXTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRhYk1hdGNoID0gdmFsdWVcbiAgICAgICAgLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBUQUJfU0laRSlcbiAgICAgICAgLm1hdGNoKFJFX0xFQURJTkdfVEFCKTtcblxuICAgICAgaWYgKHRhYk1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4ICsgdGFiTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgICAgICAvLyBEZWxldGUgYSB0YWIgZnJvbSB0aGUgbGluZVxuICAgICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtlbmRWYWx1ZX1gO1xuICAgICAgICByZW1vdmVkVGFicy5wdXNoKHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChyZW1vdmVkVGFicy5sZW5ndGgpIHtcbiAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA+IHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgLSBUQUJfU0laRSxcbiAgICAgICAgICByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgYmVmb3JlIHRoZSBmaXJzdCB0YWIgcmVtb3ZlZCwgZXg6XG4gICAgICAgIC8vIExpbmV8ICMxXG4gICAgICAgIC8vICAgICBMaW5lICMyXG4gICAgICAgIC8vIExpbnxlICMzXG4gICAgICAgIC8vIHdlIHNob3VsZCByZXNldCB0aGUgc2VsZWN0aW9uU3RhcnQgdG8gaGlzIGluaXRpYWwgdmFsdWUuXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICB9XG4gICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIHNlbGVjdGlvbkVuZCAtIFRBQl9TSVpFICogcmVtb3ZlZFRhYnMubGVuZ3RoLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGluZGljZXMgb2Ygc3RhcnQgcG9zaXRpb25zIG9mIHNlbGVjdGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyXG4gICAqL1xuICBjb25zdCBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzID0gKCkgPT4ge1xuICAgIGxldCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQsIHZhbHVlIH0gPSBlZGl0YWJsZTtcblxuICAgIC8vIGNoYXJzIGJlZm9yZSBzZWxlY3Rpb25TdGFydCBvbiB0aGUgc2FtZSBsaW5lXG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSB2YWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1teXFxuXSokLykhWzBdXG4gICAgICAubGVuZ3RoO1xuICAgIC8vIHB1dCBjYXJldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmVcbiAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0IC0gc3RhcnRPZmZzZXQ7XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHZhbHVlLnNsaWNlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChzdGFydEluZGljZXMsIGxpbmUsIGlkeCwgbGluZXMpID0+XG4gICAgICAgICAgc3RhcnRJbmRpY2VzLmNvbmNhdChcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgICAgICA/IC8vIGN1cnIgbGluZSBpbmRleCBpcyBwcmV2IGxpbmUncyBzdGFydCArIHByZXYgbGluZSdzIGxlbmd0aCArIFxcblxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kaWNlc1tpZHggLSAxXSArIGxpbmVzW2lkeCAtIDFdLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgOiAvLyBmaXJzdCBzZWxlY3RlZCBsaW5lXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApXG4gICAgICAucmV2ZXJzZSgpO1xuICB9O1xuXG4gIGNvbnN0IHN0b3BFdmVudCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIC8vIHVzaW5nIGEgc3RhdGUgdmFyaWFibGUgaW5zdGVhZCBvZiBwYXNzaW5nIGl0IHRvIHRoZSBoYW5kbGVTdWJtaXQgY2FsbGJhY2tcbiAgLy8gc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBzZXBhcmF0ZSBhIGNhbGxiYWNrIGZvciBldmVudCBoYW5kbGVyc1xuICBsZXQgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSBmYWxzZTtcbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCkgPT4ge1xuICAgIC8vIGNsZWFudXAgbXVzdCBiZSBydW4gYmVmb3JlIG9uU3VibWl0IG90aGVyd2lzZSB3aGVuIGFwcCBibHVycyB0aGUgd3lzaXd5Z1xuICAgIC8vIGl0J2QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agb2YgYmx1cuKGkm9uU3VibWl0IGFmdGVyIHdlIHJlLWZvY3VzIHRoZVxuICAgIC8vIHd5c2l3eWcgb24gdXBkYXRlXG4gICAgY2xlYW51cCgpO1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgIGVsZW1lbnQuaWQsXG4gICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgaWYgKCF1cGRhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0ZXh0ID0gZWRpdGFibGUudmFsdWU7XG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh1cGRhdGVFbGVtZW50KTtcblxuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHRleHQgPSB1cGRhdGVFbGVtZW50LnRleHQ7XG4gICAgICBpZiAoZWRpdGFibGUudmFsdWUudHJpbSgpKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICAgICAgICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCB8fCBib3VuZFRleHRFbGVtZW50SWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgYm91bmRFbGVtZW50czogKGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzIHx8IFtdKS5jb25jYXQoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICBib3VuZEVsZW1lbnRzOiBjb250YWluZXIuYm91bmRFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgICAgICAgKGVsZSkgPT5cbiAgICAgICAgICAgICAgIWlzVGV4dEVsZW1lbnQoXG4gICAgICAgICAgICAgICAgZWxlIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCB8IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVkcmF3VGV4dEJvdW5kaW5nQm94KHVwZGF0ZUVsZW1lbnQsIGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgb25TdWJtaXQoe1xuICAgICAgdGV4dCxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWUsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBldmVudHMgdG8gZW5zdXJlIHRoZXkgZG9uJ3QgbGF0ZS1maXJlXG4gICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmtleWRvd24gPSBudWxsO1xuXG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcblxuICAgIHVuYmluZFVwZGF0ZSgpO1xuXG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IChldmVudD86IE1vdXNlRXZlbnQpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQ7XG5cbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIHRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gaGFuZGxlU3VibWl0O1xuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGNhc2U6IGNsaWNraW5nIG9uIHRoZSBzYW1lIHByb3BlcnR5IOKGkiBubyBjaGFuZ2Ug4oaSIG5vIHVwZGF0ZSDihpIgbm8gZm9jdXNcbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIHByZXZlbnQgYmx1ciB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgbWVudVxuICBjb25zdCBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKFxuICAgICAgKChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fFxuICAgICAgICBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJlxuICAgICAgICBldmVudC50YXJnZXQuY2xvc2VzdChgLiR7Q0xBU1NFUy5TSEFQRV9BQ1RJT05TX01FTlV9YCkgJiZcbiAgICAgICAgIWlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHx8XG4gICAgICBpc1RhcmdldENvbG9yUGlja2VyXG4gICAgKSB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgICAvLyBoYW5kbGUgZWRnZS1jYXNlIHdoZXJlIHBvaW50ZXJ1cCBkb2Vzbid0IGZpcmUgZS5nLiBkdWUgdG8gdXNlclxuICAgICAgLy8gYWx0LXRhYmJpbmcgYXdheVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGhhbmRsZSB1cGRhdGVzIG9mIHRleHRFbGVtZW50IHByb3BlcnRpZXMgb2YgZWRpdGluZyBlbGVtZW50XG4gIGNvbnN0IHVuYmluZFVwZGF0ZSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpIS5hZGRDYWxsYmFjaygoKSA9PiB7XG4gICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgY29uc3QgaXNDb2xvclBpY2tlckFjdGl2ZSA9ICEhZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uY2xvc2VzdChcbiAgICAgIFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiLFxuICAgICk7XG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2VsZWN0IG9uIGluaXQgKGZvY3VzaW5nIGlzIGRvbmUgc2VwYXJhdGVseSBpbnNpZGUgdGhlIGJpbmRCbHVyRXZlbnQoKVxuICAvLyBiZWNhdXNlIHdlIG5lZWQgaXQgdG8gaGFwcGVuICphZnRlciogdGhlIGJsdXIgZXZlbnQgZnJvbSBgcG9pbnRlcmRvd25gKVxuICBlZGl0YWJsZS5zZWxlY3QoKTtcbiAgYmluZEJsdXJFdmVudCgpO1xuXG4gIC8vIHJlcG9zaXRpb24gd3lzaXd5ZyBpbiBjYXNlIG9mIGNhbnZhcyBpcyByZXNpemVkLiBVc2luZyBSZXNpemVPYnNlcnZlclxuICAvLyBpcyBwcmVmZXJyZWQgc28gd2UgY2F0Y2ggY2hhbmdlcyBmcm9tIGhvc3QsIHdoZXJlIHdpbmRvdyBtYXkgbm90IHJlc2l6ZS5cbiAgbGV0IG9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBpZiAoY2FudmFzICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICBvYnNlcnZlciA9IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYW52YXMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwge1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWUsXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyXG4gICAgPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKSFcbiAgICAuYXBwZW5kQ2hpbGQoZWRpdGFibGUpO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
|
|
3344
3344
|
|
|
3345
3345
|
/***/ }),
|
|
3346
3346
|
|
|
@@ -3571,7 +3571,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3571
3571
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3572
3572
|
|
|
3573
3573
|
"use strict";
|
|
3574
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@dwelle/excalidraw\"}@${\"0.4.0-
|
|
3574
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@dwelle/excalidraw\"}@${\"0.4.0-570820c\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLG9CQUFvQixJQUFJLGVBQXVCLFFBQVEsQ0FBQztDQUNoRiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3B1YmxpY1BhdGguanM/YTg3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlYgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IEVOVi5URVNUKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlICovXG4gIC8qIGdsb2JhbCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXzp3cml0YWJsZSAqL1xuICBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9XG4gICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfS9kaXN0L2A7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./publicPath.js\n");
|
|
3575
3575
|
|
|
3576
3576
|
/***/ }),
|
|
3577
3577
|
|
|
@@ -3626,7 +3626,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3626
3626
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3627
3627
|
|
|
3628
3628
|
"use strict";
|
|
3629
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"DEFAULT_LINK_SIZE\": () => (/* binding */ DEFAULT_LINK_SIZE),\n/* harmony export */ \"clearRenderCache\": () => (/* binding */ clearRenderCache),\n/* harmony export */ \"generateFreeDrawShape\": () => (/* binding */ generateFreeDrawShape),\n/* harmony export */ \"generateRoughOptions\": () => (/* binding */ generateRoughOptions),\n/* harmony export */ \"getFreeDrawPath2D\": () => (/* binding */ getFreeDrawPath2D),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* binding */ getFreeDrawSvgPath),\n/* harmony export */ \"getShapeForElement\": () => (/* binding */ getShapeForElement),\n/* harmony export */ \"invalidateShapeForElement\": () => (/* binding */ invalidateShapeForElement),\n/* harmony export */ \"pathsCache\": () => (/* binding */ pathsCache),\n/* harmony export */ \"renderElement\": () => (/* binding */ renderElement),\n/* harmony export */ \"renderElementToSvg\": () => (/* binding */ renderElementToSvg),\n/* harmony export */ \"setShapeForElement\": () => (/* binding */ setShapeForElement)\n/* harmony export */ });\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var perfect_freehand__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! perfect-freehand */ \"../../../node_modules/perfect-freehand/dist/esm/index.js\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n\n\n\n\n\n\n\n\n\n\n// using a stronger invert (100% vs our regular 93%) and saturate\n// as a temp hack to make images in dark theme look closer to original\n// color scheme (it's still not quite there and the colors look slightly\n// desatured, alas...)\nconst IMAGE_INVERT_FILTER = \"invert(100%) hue-rotate(180deg) saturate(1.25)\";\nconst defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\nconst isPendingImageElement = (element, renderConfig) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) &&\n !renderConfig.imageCache.has(element.fileId);\nconst shouldResetImageFilter = (element, renderConfig) => {\n var _a;\n return (renderConfig.theme === \"dark\" &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) &&\n !isPendingImageElement(element, renderConfig) &&\n ((_a = renderConfig.imageCache.get(element.fileId)) === null || _a === void 0 ? void 0 : _a.mimeType) !== _constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg);\n};\nconst getDashArrayDashed = (strokeWidth) => [8, 8 + strokeWidth];\nconst getDashArrayDotted = (strokeWidth) => [1.5, 6 + strokeWidth];\nconst getCanvasPadding = (element) => element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\nconst cappedElementCanvasSize = (element, zoom) => {\n // these limits are ballpark, they depend on specific browsers and device.\n // We've chosen lower limits to be safe. We might want to change these limits\n // based on browser/device type, if we get reports of low quality rendering\n // on zoom.\n //\n // ~ safari mobile canvas area limit\n const AREA_LIMIT = 16777216;\n // ~ safari width/height limit based on developer.mozilla.org.\n const WIDTH_HEIGHT_LIMIT = 32767;\n const padding = getCanvasPadding(element);\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const elementWidth = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2)\n : element.width;\n const elementHeight = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2)\n : element.height;\n let width = elementWidth * window.devicePixelRatio + padding * 2;\n let height = elementHeight * window.devicePixelRatio + padding * 2;\n let scale = zoom.value;\n // rescale to ensure width and height is within limits\n if (width * scale > WIDTH_HEIGHT_LIMIT ||\n height * scale > WIDTH_HEIGHT_LIMIT) {\n scale = Math.min(WIDTH_HEIGHT_LIMIT / width, WIDTH_HEIGHT_LIMIT / height);\n }\n // rescale to ensure canvas area is within limits\n if (width * height * scale * scale > AREA_LIMIT) {\n scale = Math.sqrt(AREA_LIMIT / (width * height));\n }\n width = Math.floor(width * scale);\n height = Math.floor(height * scale);\n return { width, height, scale };\n};\nconst generateElementCanvas = (element, zoom, renderConfig) => {\n var _a;\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n const padding = getCanvasPadding(element);\n const { width, height, scale } = cappedElementCanvasSize(element, zoom);\n canvas.width = width;\n canvas.height = height;\n let canvasOffsetX = 0;\n let canvasOffsetY = 0;\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\n const [x1, y1] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n canvasOffsetX =\n element.x > x1\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.x, x1) * window.devicePixelRatio * scale\n : 0;\n canvasOffsetY =\n element.y > y1\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.y, y1) * window.devicePixelRatio * scale\n : 0;\n context.translate(canvasOffsetX, canvasOffsetY);\n }\n context.save();\n context.translate(padding * scale, padding * scale);\n context.scale(window.devicePixelRatio * scale, window.devicePixelRatio * scale);\n const rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__[\"default\"].canvas(canvas);\n // in dark theme, revert the image color filter\n if (shouldResetImageFilter(element, renderConfig)) {\n context.filter = IMAGE_INVERT_FILTER;\n }\n drawElementOnCanvas(element, rc, context, renderConfig);\n context.restore();\n return {\n element,\n canvas,\n theme: renderConfig.theme,\n scale,\n canvasOffsetX,\n canvasOffsetY,\n boundTextElementVersion: ((_a = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element)) === null || _a === void 0 ? void 0 : _a.version) || null,\n };\n};\nconst DEFAULT_LINK_SIZE = 14;\nconst IMAGE_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_PLACEHOLDER_IMG.src = `data:${_constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg},${encodeURIComponent(`<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"image\" class=\"svg-inline--fa fa-image fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"#888\" d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"></path></svg>`)}`;\nconst IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_ERROR_PLACEHOLDER_IMG.src = `data:${_constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg},${encodeURIComponent(`<svg viewBox=\"0 0 668 668\" xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2\"><path d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48ZM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56ZM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.81709 0 0 .81709 124.825 145.825)\"/><path d=\"M256 8C119.034 8 8 119.033 8 256c0 136.967 111.034 248 248 248s248-111.034 248-248S392.967 8 256 8Zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676ZM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.30366 0 0 .30366 506.822 60.065)\"/></svg>`)}`;\nconst drawImagePlaceholder = (element, context, zoomValue) => {\n context.fillStyle = \"#E7E7E7\";\n context.fillRect(0, 0, element.width, element.height);\n const imageMinWidthOrHeight = Math.min(element.width, element.height);\n const size = Math.min(imageMinWidthOrHeight, Math.min(imageMinWidthOrHeight * 0.4, 100));\n context.drawImage(element.status === \"error\"\n ? IMAGE_ERROR_PLACEHOLDER_IMG\n : IMAGE_PLACEHOLDER_IMG, element.width / 2 - size / 2, element.height / 2 - size / 2, size, size);\n};\nconst drawElementOnCanvas = (element, rc, context, renderConfig) => {\n var _a;\n context.globalAlpha = element.opacity / 100;\n switch (element.type) {\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n rc.draw(getShapeForElement(element));\n break;\n }\n case \"arrow\":\n case \"line\": {\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n getShapeForElement(element).forEach((shape) => {\n rc.draw(shape);\n });\n break;\n }\n case \"freedraw\": {\n // Draw directly to canvas\n context.save();\n context.fillStyle = element.strokeColor;\n const path = getFreeDrawPath2D(element);\n const fillShape = getShapeForElement(element);\n if (fillShape) {\n rc.draw(fillShape);\n }\n context.fillStyle = element.strokeColor;\n context.fill(path);\n context.restore();\n break;\n }\n case \"image\": {\n const img = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element)\n ? (_a = renderConfig.imageCache.get(element.fileId)) === null || _a === void 0 ? void 0 : _a.image\n : undefined;\n if (img != null && !(img instanceof Promise)) {\n context.drawImage(img, 0 /* hardcoded for the selection box*/, 0, element.width, element.height);\n }\n else {\n drawImagePlaceholder(element, context, renderConfig.zoom.value);\n }\n break;\n }\n default: {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\n const rtl = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text);\n const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\n if (shouldTemporarilyAttach) {\n // to correctly render RTL text mixed with LTR, we have to append it\n // to the DOM\n document.body.appendChild(context.canvas);\n }\n context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\n context.save();\n context.font = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element);\n context.fillStyle = element.strokeColor;\n context.textAlign = element.textAlign;\n // Canvas does not support multiline text by default\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const horizontalOffset = element.textAlign === \"center\"\n ? element.width / 2\n : element.textAlign === \"right\"\n ? element.width\n : 0;\n context.textBaseline = \"bottom\";\n const lineHeightPx = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getLineHeightInPx)(element.fontSize, element.lineHeight);\n for (let index = 0; index < lines.length; index++) {\n context.fillText(lines[index], horizontalOffset, (index + 1) * lineHeightPx);\n }\n context.restore();\n if (shouldTemporarilyAttach) {\n context.canvas.remove();\n }\n }\n else {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n }\n context.globalAlpha = 1;\n};\nlet elementWithCanvasCache = new WeakMap();\nlet shapeCache = new WeakMap();\nconst getShapeForElement = (element) => shapeCache.get(element);\nconst setShapeForElement = (element, shape) => shapeCache.set(element, shape);\nconst invalidateShapeForElement = (element) => shapeCache.delete(element);\nconst clearRenderCache = () => {\n elementWithCanvasCache = new WeakMap();\n shapeCache = new WeakMap();\n pathsCache = new WeakMap();\n};\nconst generateRoughOptions = (element, continuousPath = false) => {\n const options = {\n seed: element.seed,\n strokeLineDash: element.strokeStyle === \"dashed\"\n ? getDashArrayDashed(element.strokeWidth)\n : element.strokeStyle === \"dotted\"\n ? getDashArrayDotted(element.strokeWidth)\n : undefined,\n // for non-solid strokes, disable multiStroke because it tends to make\n // dashes/dots overlay each other\n disableMultiStroke: element.strokeStyle !== \"solid\",\n // for non-solid strokes, increase the width a bit to make it visually\n // similar to solid strokes, because we're also disabling multiStroke\n strokeWidth: element.strokeStyle !== \"solid\"\n ? element.strokeWidth + 0.5\n : element.strokeWidth,\n // when increasing strokeWidth, we must explicitly set fillWeight and\n // hachureGap because if not specified, roughjs uses strokeWidth to\n // calculate them (and we don't want the fills to be modified)\n fillWeight: element.strokeWidth / 2,\n hachureGap: element.strokeWidth * 4,\n roughness: element.roughness,\n stroke: element.strokeColor,\n preserveVertices: continuousPath,\n };\n switch (element.type) {\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n options.fillStyle = element.fillStyle;\n options.fill =\n element.backgroundColor === \"transparent\"\n ? undefined\n : element.backgroundColor;\n if (element.type === \"ellipse\") {\n options.curveFitting = 1;\n }\n return options;\n }\n case \"line\":\n case \"freedraw\": {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points)) {\n options.fillStyle = element.fillStyle;\n options.fill =\n element.backgroundColor === \"transparent\"\n ? undefined\n : element.backgroundColor;\n }\n return options;\n }\n case \"arrow\":\n return options;\n default: {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\n/**\n * Generates the element's shape and puts it into the cache.\n * @param element\n * @param generator\n */\nconst generateElementShape = (element, generator) => {\n let shape = shapeCache.get(element);\n // `null` indicates no rc shape applicable for this element type\n // (= do not generate anything)\n if (shape === undefined) {\n elementWithCanvasCache.delete(element);\n switch (element.type) {\n case \"rectangle\":\n if (element.roundness) {\n const w = element.width;\n const h = element.height;\n const r = (0,_math__WEBPACK_IMPORTED_MODULE_3__.getCornerRadius)(Math.min(w, h), element);\n shape = generator.path(`M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${h - r} Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${h - r} L 0 ${r} Q 0 0, ${r} 0`, generateRoughOptions(element, true));\n }\n else {\n shape = generator.rectangle(0, 0, element.width, element.height, generateRoughOptions(element));\n }\n setShapeForElement(element, shape);\n break;\n case \"diamond\": {\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getDiamondPoints)(element);\n if (element.roundness) {\n const verticalRadius = (0,_math__WEBPACK_IMPORTED_MODULE_3__.getCornerRadius)(Math.abs(topX - leftX), element);\n const horizontalRadius = (0,_math__WEBPACK_IMPORTED_MODULE_3__.getCornerRadius)(Math.abs(rightY - topY), element);\n shape = generator.path(`M ${topX + verticalRadius} ${topY + horizontalRadius} L ${rightX - verticalRadius} ${rightY - horizontalRadius}\n C ${rightX} ${rightY}, ${rightX} ${rightY}, ${rightX - verticalRadius} ${rightY + horizontalRadius}\n L ${bottomX + verticalRadius} ${bottomY - horizontalRadius}\n C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${bottomX - verticalRadius} ${bottomY - horizontalRadius}\n L ${leftX + verticalRadius} ${leftY + horizontalRadius}\n C ${leftX} ${leftY}, ${leftX} ${leftY}, ${leftX + verticalRadius} ${leftY - horizontalRadius}\n L ${topX - verticalRadius} ${topY + horizontalRadius}\n C ${topX} ${topY}, ${topX} ${topY}, ${topX + verticalRadius} ${topY + horizontalRadius}`, generateRoughOptions(element, true));\n }\n else {\n shape = generator.polygon([\n [topX, topY],\n [rightX, rightY],\n [bottomX, bottomY],\n [leftX, leftY],\n ], generateRoughOptions(element));\n }\n setShapeForElement(element, shape);\n break;\n }\n case \"ellipse\":\n shape = generator.ellipse(element.width / 2, element.height / 2, element.width, element.height, generateRoughOptions(element));\n setShapeForElement(element, shape);\n break;\n case \"line\":\n case \"arrow\": {\n const options = generateRoughOptions(element);\n // points array can be empty in the beginning, so it is important to add\n // initial position to it\n const points = element.points.length ? element.points : [[0, 0]];\n // curve is always the first element\n // this simplifies finding the curve for an element\n if (!element.roundness) {\n if (options.fill) {\n shape = [generator.polygon(points, options)];\n }\n else {\n shape = [\n generator.linearPath(points, options),\n ];\n }\n }\n else {\n shape = [generator.curve(points, options)];\n }\n // add lines only in arrow\n if (element.type === \"arrow\") {\n const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\n const getArrowheadShapes = (element, shape, position, arrowhead) => {\n const arrowheadPoints = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getArrowheadPoints)(element, shape, position, arrowhead);\n if (arrowheadPoints === null) {\n return [];\n }\n // Other arrowheads here...\n if (arrowhead === \"dot\") {\n const [x, y, r] = arrowheadPoints;\n return [\n generator.circle(x, y, r, Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\", stroke: \"none\" })),\n ];\n }\n if (arrowhead === \"triangle\") {\n const [x, y, x2, y2, x3, y3] = arrowheadPoints;\n // always use solid stroke for triangle arrowhead\n delete options.strokeLineDash;\n return [\n generator.polygon([\n [x, y],\n [x2, y2],\n [x3, y3],\n [x, y],\n ], Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\" })),\n ];\n }\n // Arrow arrowheads\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\n if (element.strokeStyle === \"dotted\") {\n // for dotted arrows caps, reduce gap to make it more legible\n const dash = getDashArrayDotted(element.strokeWidth - 1);\n options.strokeLineDash = [dash[0], dash[1] - 1];\n }\n else {\n // for solid/dashed, keep solid arrow cap\n delete options.strokeLineDash;\n }\n return [\n generator.line(x3, y3, x2, y2, options),\n generator.line(x4, y4, x2, y2, options),\n ];\n };\n if (startArrowhead !== null) {\n const shapes = getArrowheadShapes(element, shape, \"start\", startArrowhead);\n shape.push(...shapes);\n }\n if (endArrowhead !== null) {\n if (endArrowhead === undefined) {\n // Hey, we have an old arrow here!\n }\n const shapes = getArrowheadShapes(element, shape, \"end\", endArrowhead);\n shape.push(...shapes);\n }\n }\n setShapeForElement(element, shape);\n break;\n }\n case \"freedraw\": {\n generateFreeDrawShape(element);\n if ((0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points)) {\n // generate rough polygon to fill freedraw shape\n shape = generator.polygon(element.points, Object.assign(Object.assign({}, generateRoughOptions(element)), { stroke: \"none\" }));\n }\n else {\n shape = null;\n }\n setShapeForElement(element, shape);\n break;\n }\n case \"text\":\n case \"image\": {\n // just to ensure we don't regenerate element.canvas on rerenders\n setShapeForElement(element, null);\n break;\n }\n }\n }\n};\nconst generateElementWithCanvas = (element, renderConfig) => {\n var _a;\n const zoom = renderConfig ? renderConfig.zoom : defaultAppState.zoom;\n const prevElementWithCanvas = elementWithCanvasCache.get(element);\n const shouldRegenerateBecauseZoom = prevElementWithCanvas &&\n prevElementWithCanvas.scale !== zoom.value &&\n !(renderConfig === null || renderConfig === void 0 ? void 0 : renderConfig.shouldCacheIgnoreZoom);\n const boundTextElementVersion = ((_a = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element)) === null || _a === void 0 ? void 0 : _a.version) || null;\n if (!prevElementWithCanvas ||\n shouldRegenerateBecauseZoom ||\n prevElementWithCanvas.theme !== renderConfig.theme ||\n prevElementWithCanvas.boundTextElementVersion !== boundTextElementVersion) {\n const elementWithCanvas = generateElementCanvas(element, zoom, renderConfig);\n elementWithCanvasCache.set(element, elementWithCanvas);\n return elementWithCanvas;\n }\n return prevElementWithCanvas;\n};\nconst drawElementFromCanvas = (elementWithCanvas, rc, context, renderConfig) => {\n const element = elementWithCanvas.element;\n const padding = getCanvasPadding(element);\n const zoom = elementWithCanvas.scale;\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n // Free draw elements will otherwise \"shuffle\" as the min x and y change\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\n x1 = Math.floor(x1);\n x2 = Math.ceil(x2);\n y1 = Math.floor(y1);\n y2 = Math.ceil(y2);\n }\n const cx = ((x1 + x2) / 2 + renderConfig.scrollX) * window.devicePixelRatio;\n const cy = ((y1 + y2) / 2 + renderConfig.scrollY) * window.devicePixelRatio;\n context.save();\n context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio);\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isArrowElement)(element) && boundTextElement) {\n const tempCanvas = document.createElement(\"canvas\");\n const tempCanvasContext = tempCanvas.getContext(\"2d\");\n // Take max dimensions of arrow canvas so that when canvas is rotated\n // the arrow doesn't get clipped\n const maxDim = Math.max((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2), (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2));\n tempCanvas.width =\n maxDim * window.devicePixelRatio * zoom +\n padding * elementWithCanvas.scale * 10;\n tempCanvas.height =\n maxDim * window.devicePixelRatio * zoom +\n padding * elementWithCanvas.scale * 10;\n const offsetX = (tempCanvas.width - elementWithCanvas.canvas.width) / 2;\n const offsetY = (tempCanvas.height - elementWithCanvas.canvas.height) / 2;\n tempCanvasContext.translate(tempCanvas.width / 2, tempCanvas.height / 2);\n tempCanvasContext.rotate(element.angle);\n tempCanvasContext.drawImage(elementWithCanvas.canvas, -elementWithCanvas.canvas.width / 2, -elementWithCanvas.canvas.height / 2, elementWithCanvas.canvas.width, elementWithCanvas.canvas.height);\n const [, , , , boundTextCx, boundTextCy] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(boundTextElement);\n tempCanvasContext.rotate(-element.angle);\n // Shift the canvas to the center of the bound text element\n const shiftX = tempCanvas.width / 2 -\n (boundTextCx - x1) * window.devicePixelRatio * zoom -\n offsetX -\n padding * zoom;\n const shiftY = tempCanvas.height / 2 -\n (boundTextCy - y1) * window.devicePixelRatio * zoom -\n offsetY -\n padding * zoom;\n tempCanvasContext.translate(-shiftX, -shiftY);\n // Clear the bound text area\n tempCanvasContext.clearRect(-(boundTextElement.width / 2 + _constants__WEBPACK_IMPORTED_MODULE_6__.BOUND_TEXT_PADDING) *\n window.devicePixelRatio *\n zoom, -(boundTextElement.height / 2 + _constants__WEBPACK_IMPORTED_MODULE_6__.BOUND_TEXT_PADDING) *\n window.devicePixelRatio *\n zoom, (boundTextElement.width + _constants__WEBPACK_IMPORTED_MODULE_6__.BOUND_TEXT_PADDING * 2) *\n window.devicePixelRatio *\n zoom, (boundTextElement.height + _constants__WEBPACK_IMPORTED_MODULE_6__.BOUND_TEXT_PADDING * 2) *\n window.devicePixelRatio *\n zoom);\n context.translate(cx, cy);\n context.drawImage(tempCanvas, (-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding, (-(y2 - y1) / 2) * window.devicePixelRatio - offsetY / zoom - padding, tempCanvas.width / zoom, tempCanvas.height / zoom);\n }\n else {\n // we translate context to element center so that rotation and scale\n // originates from the element center\n context.translate(cx, cy);\n context.rotate(element.angle);\n if (\"scale\" in elementWithCanvas.element &&\n !isPendingImageElement(element, renderConfig)) {\n context.scale(elementWithCanvas.element.scale[0], elementWithCanvas.element.scale[1]);\n }\n // revert afterwards we don't have account for it during drawing\n context.translate(-cx, -cy);\n context.drawImage(elementWithCanvas.canvas, (x1 + renderConfig.scrollX) * window.devicePixelRatio -\n (padding * elementWithCanvas.scale) / elementWithCanvas.scale, (y1 + renderConfig.scrollY) * window.devicePixelRatio -\n (padding * elementWithCanvas.scale) / elementWithCanvas.scale, elementWithCanvas.canvas.width / elementWithCanvas.scale, elementWithCanvas.canvas.height / elementWithCanvas.scale);\n if (false) {}\n }\n context.restore();\n // Clear the nested element we appended to the DOM\n};\nconst renderElement = (element, rc, context, renderConfig, appState) => {\n const generator = rc.generator;\n switch (element.type) {\n case \"selection\": {\n context.save();\n context.translate(element.x + renderConfig.scrollX, element.y + renderConfig.scrollY);\n context.fillStyle = \"rgba(0, 0, 200, 0.04)\";\n // render from 0.5px offset to get 1px wide line\n // https://stackoverflow.com/questions/7530593/html5-canvas-and-line-width/7531540#7531540\n // TODO can be be improved by offseting to the negative when user selects\n // from right to left\n const offset = 0.5 / renderConfig.zoom.value;\n context.fillRect(offset, offset, element.width, element.height);\n context.lineWidth = 1 / renderConfig.zoom.value;\n context.strokeStyle = \"rgb(105, 101, 219)\";\n context.strokeRect(offset, offset, element.width, element.height);\n context.restore();\n break;\n }\n case \"freedraw\": {\n generateElementShape(element, generator);\n if (renderConfig.isExporting) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2 + renderConfig.scrollX;\n const cy = (y1 + y2) / 2 + renderConfig.scrollY;\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\n context.save();\n context.translate(cx, cy);\n context.rotate(element.angle);\n context.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, rc, context, renderConfig);\n context.restore();\n }\n else {\n const elementWithCanvas = generateElementWithCanvas(element, renderConfig);\n drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig);\n }\n break;\n }\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\":\n case \"line\":\n case \"arrow\":\n case \"image\":\n case \"text\": {\n generateElementShape(element, generator);\n if (renderConfig.isExporting) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2 + renderConfig.scrollX;\n const cy = (y1 + y2) / 2 + renderConfig.scrollY;\n let shiftX = (x2 - x1) / 2 - (element.x - x1);\n let shiftY = (y2 - y1) / 2 - (element.y - y1);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\n const container = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(element);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isArrowElement)(container)) {\n const boundTextCoords = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(container, element);\n shiftX = (x2 - x1) / 2 - (boundTextCoords.x - x1);\n shiftY = (y2 - y1) / 2 - (boundTextCoords.y - y1);\n }\n }\n context.save();\n context.translate(cx, cy);\n if (shouldResetImageFilter(element, renderConfig)) {\n context.filter = \"none\";\n }\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isArrowElement)(element) && boundTextElement) {\n const tempCanvas = document.createElement(\"canvas\");\n const tempCanvasContext = tempCanvas.getContext(\"2d\");\n // Take max dimensions of arrow canvas so that when canvas is rotated\n // the arrow doesn't get clipped\n const maxDim = Math.max((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2), (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2));\n const padding = getCanvasPadding(element);\n tempCanvas.width =\n maxDim * appState.exportScale + padding * 10 * appState.exportScale;\n tempCanvas.height =\n maxDim * appState.exportScale + padding * 10 * appState.exportScale;\n tempCanvasContext.translate(tempCanvas.width / 2, tempCanvas.height / 2);\n tempCanvasContext.scale(appState.exportScale, appState.exportScale);\n // Shift the canvas to left most point of the arrow\n shiftX = element.width / 2 - (element.x - x1);\n shiftY = element.height / 2 - (element.y - y1);\n tempCanvasContext.rotate(element.angle);\n const tempRc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__[\"default\"].canvas(tempCanvas);\n tempCanvasContext.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, tempRc, tempCanvasContext, renderConfig);\n tempCanvasContext.translate(shiftX, shiftY);\n tempCanvasContext.rotate(-element.angle);\n // Shift the canvas to center of bound text\n const [, , , , boundTextCx, boundTextCy] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(boundTextElement);\n const boundTextShiftX = (x1 + x2) / 2 - boundTextCx;\n const boundTextShiftY = (y1 + y2) / 2 - boundTextCy;\n tempCanvasContext.translate(-boundTextShiftX, -boundTextShiftY);\n // Clear the bound text area\n tempCanvasContext.clearRect(-boundTextElement.width / 2, -boundTextElement.height / 2, boundTextElement.width, boundTextElement.height);\n context.scale(1 / appState.exportScale, 1 / appState.exportScale);\n context.drawImage(tempCanvas, -tempCanvas.width / 2, -tempCanvas.height / 2, tempCanvas.width, tempCanvas.height);\n }\n else {\n context.rotate(element.angle);\n if (element.type === \"image\") {\n // note: scale must be applied *after* rotating\n context.scale(element.scale[0], element.scale[1]);\n }\n context.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, rc, context, renderConfig);\n }\n context.restore();\n // not exporting → optimized rendering (cache & render from element\n // canvases)\n }\n else {\n const elementWithCanvas = generateElementWithCanvas(element, renderConfig);\n const currentImageSmoothingStatus = context.imageSmoothingEnabled;\n if (\n // do not disable smoothing during zoom as blurry shapes look better\n // on low resolution (while still zooming in) than sharp ones\n !(renderConfig === null || renderConfig === void 0 ? void 0 : renderConfig.shouldCacheIgnoreZoom) &&\n // angle is 0 -> always disable smoothing\n (!element.angle ||\n // or check if angle is a right angle in which case we can still\n // disable smoothing without adversely affecting the result\n (0,_math__WEBPACK_IMPORTED_MODULE_3__.isRightAngle)(element.angle))) {\n // Disabling smoothing makes output much sharper, especially for\n // text. Unless for non-right angles, where the aliasing is really\n // terrible on Chromium.\n //\n // Note that `context.imageSmoothingQuality=\"high\"` has almost\n // zero effect.\n //\n context.imageSmoothingEnabled = false;\n }\n drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig);\n // reset\n context.imageSmoothingEnabled = currentImageSmoothingStatus;\n }\n break;\n }\n default: {\n // @ts-ignore\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\nconst roughSVGDrawWithPrecision = (rsvg, drawable, precision) => {\n if (typeof precision === \"undefined\") {\n return rsvg.draw(drawable);\n }\n const pshape = {\n sets: drawable.sets,\n shape: drawable.shape,\n options: Object.assign(Object.assign({}, drawable.options), { fixedDecimalPlaceDigits: precision }),\n };\n return rsvg.draw(pshape);\n};\nconst renderElementToSvg = (element, rsvg, svgRoot, files, offsetX, offsetY, exportWithDarkMode) => {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n let cx = (x2 - x1) / 2 - (element.x - x1);\n let cy = (y2 - y1) / 2 - (element.y - y1);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\n const container = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(element);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isArrowElement)(container)) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(container);\n const boundTextCoords = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(container, element);\n cx = (x2 - x1) / 2 - (boundTextCoords.x - x1);\n cy = (y2 - y1) / 2 - (boundTextCoords.y - y1);\n offsetX = offsetX + boundTextCoords.x - element.x;\n offsetY = offsetY + boundTextCoords.y - element.y;\n }\n }\n const degree = (180 * element.angle) / Math.PI;\n const generator = rsvg.generator;\n // element to append node to, most of the time svgRoot\n let root = svgRoot;\n // if the element has a link, create an anchor tag and make that the new root\n if (element.link) {\n const anchorTag = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"a\");\n anchorTag.setAttribute(\"href\", element.link);\n root.appendChild(anchorTag);\n root = anchorTag;\n }\n switch (element.type) {\n case \"selection\": {\n // Since this is used only during editing experience, which is canvas based,\n // this should not happen\n throw new Error(\"Selection rendering is not supported for SVG\");\n }\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n generateElementShape(element, generator);\n const node = roughSVGDrawWithPrecision(rsvg, getShapeForElement(element), _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT);\n const opacity = element.opacity / 100;\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"stroke-linecap\", \"round\");\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n root.appendChild(node);\n break;\n }\n case \"line\":\n case \"arrow\": {\n const boundText = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\n const maskPath = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"mask\");\n if (boundText) {\n maskPath.setAttribute(\"id\", `mask-${element.id}`);\n const maskRectVisible = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"rect\");\n offsetX = offsetX || 0;\n offsetY = offsetY || 0;\n maskRectVisible.setAttribute(\"x\", \"0\");\n maskRectVisible.setAttribute(\"y\", \"0\");\n maskRectVisible.setAttribute(\"fill\", \"#fff\");\n maskRectVisible.setAttribute(\"width\", `${element.width + 100 + offsetX}`);\n maskRectVisible.setAttribute(\"height\", `${element.height + 100 + offsetY}`);\n maskPath.appendChild(maskRectVisible);\n const maskRectInvisible = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"rect\");\n const boundTextCoords = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(element, boundText);\n const maskX = offsetX + boundTextCoords.x - element.x;\n const maskY = offsetY + boundTextCoords.y - element.y;\n maskRectInvisible.setAttribute(\"x\", maskX.toString());\n maskRectInvisible.setAttribute(\"y\", maskY.toString());\n maskRectInvisible.setAttribute(\"fill\", \"#000\");\n maskRectInvisible.setAttribute(\"width\", `${boundText.width}`);\n maskRectInvisible.setAttribute(\"height\", `${boundText.height}`);\n maskRectInvisible.setAttribute(\"opacity\", \"1\");\n maskPath.appendChild(maskRectInvisible);\n }\n generateElementShape(element, generator);\n const group = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\n if (boundText) {\n group.setAttribute(\"mask\", `url(#mask-${element.id})`);\n }\n const opacity = element.opacity / 100;\n group.setAttribute(\"stroke-linecap\", \"round\");\n getShapeForElement(element).forEach((shape) => {\n const node = roughSVGDrawWithPrecision(rsvg, shape, _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT);\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n if (element.type === \"line\" &&\n (0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points) &&\n element.backgroundColor !== \"transparent\") {\n node.setAttribute(\"fill-rule\", \"evenodd\");\n }\n group.appendChild(node);\n });\n root.appendChild(group);\n root.append(maskPath);\n break;\n }\n case \"freedraw\": {\n generateElementShape(element, generator);\n generateFreeDrawShape(element);\n const opacity = element.opacity / 100;\n const shape = getShapeForElement(element);\n const node = shape\n ? roughSVGDrawWithPrecision(rsvg, shape, _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT)\n : svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n node.setAttribute(\"stroke\", \"none\");\n const path = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"path\");\n path.setAttribute(\"fill\", element.strokeColor);\n path.setAttribute(\"d\", getFreeDrawSvgPath(element));\n node.appendChild(path);\n root.appendChild(node);\n break;\n }\n case \"image\": {\n const width = Math.round(element.width);\n const height = Math.round(element.height);\n const fileData = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) && files[element.fileId];\n if (fileData) {\n const symbolId = `image-${fileData.id}`;\n let symbol = svgRoot.querySelector(`#${symbolId}`);\n if (!symbol) {\n symbol = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"symbol\");\n symbol.id = symbolId;\n const image = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"image\");\n image.setAttribute(\"width\", \"100%\");\n image.setAttribute(\"height\", \"100%\");\n image.setAttribute(\"href\", fileData.dataURL);\n symbol.appendChild(image);\n root.prepend(symbol);\n }\n const use = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"use\");\n use.setAttribute(\"href\", `#${symbolId}`);\n // in dark theme, revert the image color filter\n if (exportWithDarkMode && fileData.mimeType !== _constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg) {\n use.setAttribute(\"filter\", IMAGE_INVERT_FILTER);\n }\n use.setAttribute(\"width\", `${width}`);\n use.setAttribute(\"height\", `${height}`);\n // We first apply `scale` transforms (horizontal/vertical mirroring)\n // on the <use> element, then apply translation and rotation\n // on the <g> element which wraps the <use>.\n // Doing this separately is a quick hack to to work around compositing\n // the transformations correctly (the transform-origin was not being\n // applied correctly).\n if (element.scale[0] !== 1 || element.scale[1] !== 1) {\n const translateX = element.scale[0] !== 1 ? -width : 0;\n const translateY = element.scale[1] !== 1 ? -height : 0;\n use.setAttribute(\"transform\", `scale(${element.scale[0]}, ${element.scale[1]}) translate(${translateX} ${translateY})`);\n }\n const g = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\n g.appendChild(use);\n g.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n root.appendChild(g);\n }\n break;\n }\n default: {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\n const opacity = element.opacity / 100;\n const node = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const lineHeightPx = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getLineHeightInPx)(element.fontSize, element.lineHeight);\n const horizontalOffset = element.textAlign === \"center\"\n ? element.width / 2\n : element.textAlign === \"right\"\n ? element.width\n : 0;\n const direction = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text) ? \"rtl\" : \"ltr\";\n const textAnchor = element.textAlign === \"center\"\n ? \"middle\"\n : element.textAlign === \"right\" || direction === \"rtl\"\n ? \"end\"\n : \"start\";\n for (let i = 0; i < lines.length; i++) {\n const text = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"text\");\n text.textContent = lines[i];\n text.setAttribute(\"x\", `${horizontalOffset}`);\n text.setAttribute(\"y\", `${i * lineHeightPx}`);\n text.setAttribute(\"font-family\", (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontFamilyString)(element));\n text.setAttribute(\"font-size\", `${element.fontSize}px`);\n text.setAttribute(\"fill\", element.strokeColor);\n text.setAttribute(\"text-anchor\", textAnchor);\n text.setAttribute(\"style\", \"white-space: pre;\");\n text.setAttribute(\"direction\", direction);\n text.setAttribute(\"dominant-baseline\", \"text-before-edge\");\n node.appendChild(text);\n }\n root.appendChild(node);\n }\n else {\n // @ts-ignore\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n }\n};\nlet pathsCache = new WeakMap([]);\nfunction generateFreeDrawShape(element) {\n const svgPathData = getFreeDrawSvgPath(element);\n const path = new Path2D(svgPathData);\n pathsCache.set(element, path);\n return path;\n}\nfunction getFreeDrawPath2D(element) {\n return pathsCache.get(element);\n}\nfunction getFreeDrawSvgPath(element) {\n // If input points are empty (should they ever be?) return a dot\n const inputPoints = element.simulatePressure\n ? element.points\n : element.points.length\n ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\n : [[0, 0, 0.5]];\n // Consider changing the options for simulated pressure vs real pressure\n const options = {\n simulatePressure: element.simulatePressure,\n size: element.strokeWidth * 4.25,\n thinning: 0.6,\n smoothing: 0.5,\n streamline: 0.5,\n easing: (t) => Math.sin((t * Math.PI) / 2),\n last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup\n };\n return getSvgPathFromStroke((0,perfect_freehand__WEBPACK_IMPORTED_MODULE_7__.getStroke)(inputPoints, options));\n}\nfunction med(A, B) {\n return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];\n}\n// Trim SVG path data so number are each two decimal points. This\n// improves SVG exports, and prevents rendering errors on points\n// with long decimals.\nconst TO_FIXED_PRECISION = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g;\nfunction getSvgPathFromStroke(points) {\n if (!points.length) {\n return \"\";\n }\n const max = points.length - 1;\n return points\n .reduce((acc, point, i, arr) => {\n if (i === max) {\n acc.push(point, med(point, arr[0]), \"L\", arr[0], \"Z\");\n }\n else {\n acc.push(point, med(point, arr[i + 1]));\n }\n return acc;\n }, [\"M\", points[0], \"Q\"])\n .join(\" \")\n .replace(TO_FIXED_PRECISION, \"$1\");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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T0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTlCLE9BQU8sTUFBTTtTQUNWLE1BQU0sQ0FDTCxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6QztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FDdEI7U0FDQSxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ1QsT0FBTyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudC50cz9hNmRjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBBcnJvd2hlYWQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzVGV4dEVsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudCxcbiAgaXNGcmVlRHJhd0VsZW1lbnQsXG4gIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQsXG4gIGlzQXJyb3dFbGVtZW50LFxuICBoYXNCb3VuZFRleHRFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQge1xuICBnZXREaWFtb25kUG9pbnRzLFxuICBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMsXG4gIGdldEFycm93aGVhZFBvaW50cyxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyBSb3VnaENhbnZhcyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jYW52YXNcIjtcbmltcG9ydCB7IERyYXdhYmxlLCBPcHRpb25zIH0gZnJvbSBcInJvdWdoanMvYmluL2NvcmVcIjtcbmltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSBcInJvdWdoanMvYmluL3N2Z1wiO1xuaW1wb3J0IHsgUm91Z2hHZW5lcmF0b3IgfSBmcm9tIFwicm91Z2hqcy9iaW4vZ2VuZXJhdG9yXCI7XG5cbmltcG9ydCB7IFJlbmRlckNvbmZpZyB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UsIGdldEZvbnRTdHJpbmcsIGdldEZvbnRGYW1pbHlTdHJpbmcsIGlzUlRMIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRDb3JuZXJSYWRpdXMsIGlzUGF0aEFMb29wLCBpc1JpZ2h0QW5nbGUgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzLCBab29tIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7XG4gIEJPVU5EX1RFWFRfUEFERElORyxcbiAgTUFYX0RFQ0lNQUxTX0ZPUl9TVkdfRVhQT1JULFxuICBNSU1FX1RZUEVTLFxuICBTVkdfTlMsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldFN0cm9rZSwgU3Ryb2tlT3B0aW9ucyB9IGZyb20gXCJwZXJmZWN0LWZyZWVoYW5kXCI7XG5pbXBvcnQge1xuICBnZXRCb3VuZFRleHRFbGVtZW50LFxuICBnZXRDb250YWluZXJDb29yZHMsXG4gIGdldENvbnRhaW5lckVsZW1lbnQsXG4gIGdldExpbmVIZWlnaHRJblB4LFxuICBnZXRNYXhDb250YWluZXJIZWlnaHQsXG4gIGdldE1heENvbnRhaW5lcldpZHRoLFxufSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcblxuLy8gdXNpbmcgYSBzdHJvbmdlciBpbnZlcnQgKDEwMCUgdnMgb3VyIHJlZ3VsYXIgOTMlKSBhbmQgc2F0dXJhdGVcbi8vIGFzIGEgdGVtcCBoYWNrIHRvIG1ha2UgaW1hZ2VzIGluIGRhcmsgdGhlbWUgbG9vayBjbG9zZXIgdG8gb3JpZ2luYWxcbi8vIGNvbG9yIHNjaGVtZSAoaXQncyBzdGlsbCBub3QgcXVpdGUgdGhlcmUgYW5kIHRoZSBjb2xvcnMgbG9vayBzbGlnaHRseVxuLy8gZGVzYXR1cmVkLCBhbGFzLi4uKVxuY29uc3QgSU1BR0VfSU5WRVJUX0ZJTFRFUiA9IFwiaW52ZXJ0KDEwMCUpIGh1ZS1yb3RhdGUoMTgwZGVnKSBzYXR1cmF0ZSgxLjI1KVwiO1xuXG5jb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuY29uc3QgaXNQZW5kaW5nSW1hZ2VFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgcmVuZGVyQ29uZmlnOiBSZW5kZXJDb25maWcsXG4pID0+XG4gIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiZcbiAgIXJlbmRlckNvbmZpZy5pbWFnZUNhY2hlLmhhcyhlbGVtZW50LmZpbGVJZCk7XG5cbmNvbnN0IHNob3VsZFJlc2V0SW1hZ2VGaWx0ZXIgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICByZW5kZXJDb25maWc6IFJlbmRlckNvbmZpZyxcbikgPT4ge1xuICByZXR1cm4gKFxuICAgIHJlbmRlckNvbmZpZy50aGVtZSA9PT0gXCJkYXJrXCIgJiZcbiAgICBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmXG4gICAgIWlzUGVuZGluZ0ltYWdlRWxlbWVudChlbGVtZW50LCByZW5kZXJDb25maWcpICYmXG4gICAgcmVuZGVyQ29uZmlnLmltYWdlQ2FjaGUuZ2V0KGVsZW1lbnQuZmlsZUlkKT8ubWltZVR5cGUgIT09IE1JTUVfVFlQRVMuc3ZnXG4gICk7XG59O1xuXG5jb25zdCBnZXREYXNoQXJyYXlEYXNoZWQgPSAoc3Ryb2tlV2lkdGg6IG51bWJlcikgPT4gWzgsIDggKyBzdHJva2VXaWR0aF07XG5cbmNvbnN0IGdldERhc2hBcnJheURvdHRlZCA9IChzdHJva2VXaWR0aDogbnVtYmVyKSA9PiBbMS41LCA2ICsgc3Ryb2tlV2lkdGhdO1xuXG5jb25zdCBnZXRDYW52YXNQYWRkaW5nID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PlxuICBlbGVtZW50LnR5cGUgPT09IFwiZnJlZWRyYXdcIiA/IGVsZW1lbnQuc3Ryb2tlV2lkdGggKiAxMiA6IDIwO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhcyB7XG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICB0aGVtZTogUmVuZGVyQ29uZmlnW1widGhlbWVcIl07XG4gIHNjYWxlOiBudW1iZXI7XG4gIGNhbnZhc09mZnNldFg6IG51bWJlcjtcbiAgY2FudmFzT2Zmc2V0WTogbnVtYmVyO1xuICBib3VuZFRleHRFbGVtZW50VmVyc2lvbjogbnVtYmVyIHwgbnVsbDtcbn1cblxuY29uc3QgY2FwcGVkRWxlbWVudENhbnZhc1NpemUgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgem9vbTogWm9vbSxcbik6IHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHNjYWxlOiBudW1iZXI7XG59ID0+IHtcbiAgLy8gdGhlc2UgbGltaXRzIGFyZSBiYWxscGFyaywgdGhleSBkZXBlbmQgb24gc3BlY2lmaWMgYnJvd3NlcnMgYW5kIGRldmljZS5cbiAgLy8gV2UndmUgY2hvc2VuIGxvd2VyIGxpbWl0cyB0byBiZSBzYWZlLiBXZSBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGVzZSBsaW1pdHNcbiAgLy8gYmFzZWQgb24gYnJvd3Nlci9kZXZpY2UgdHlwZSwgaWYgd2UgZ2V0IHJlcG9ydHMgb2YgbG93IHF1YWxpdHkgcmVuZGVyaW5nXG4gIC8vIG9uIHpvb20uXG4gIC8vXG4gIC8vIH4gc2FmYXJpIG1vYmlsZSBjYW52YXMgYXJlYSBsaW1pdFxuICBjb25zdCBBUkVBX0xJTUlUID0gMTY3NzcyMTY7XG4gIC8vIH4gc2FmYXJpIHdpZHRoL2hlaWdodCBsaW1pdCBiYXNlZCBvbiBkZXZlbG9wZXIubW96aWxsYS5vcmcuXG4gIGNvbnN0IFdJRFRIX0hFSUdIVF9MSU1JVCA9IDMyNzY3O1xuXG4gIGNvbnN0IHBhZGRpbmcgPSBnZXRDYW52YXNQYWRkaW5nKGVsZW1lbnQpO1xuXG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IGVsZW1lbnRXaWR0aCA9XG4gICAgaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpXG4gICAgICA/IGRpc3RhbmNlKHgxLCB4MilcbiAgICAgIDogZWxlbWVudC53aWR0aDtcbiAgY29uc3QgZWxlbWVudEhlaWdodCA9XG4gICAgaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpXG4gICAgICA/IGRpc3RhbmNlKHkxLCB5MilcbiAgICAgIDogZWxlbWVudC5oZWlnaHQ7XG5cbiAgbGV0IHdpZHRoID0gZWxlbWVudFdpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKyBwYWRkaW5nICogMjtcbiAgbGV0IGhlaWdodCA9IGVsZW1lbnRIZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyArIHBhZGRpbmcgKiAyO1xuXG4gIGxldCBzY2FsZTogbnVtYmVyID0gem9vbS52YWx1ZTtcblxuICAvLyByZXNjYWxlIHRvIGVuc3VyZSB3aWR0aCBhbmQgaGVpZ2h0IGlzIHdpdGhpbiBsaW1pdHNcbiAgaWYgKFxuICAgIHdpZHRoICogc2NhbGUgPiBXSURUSF9IRUlHSFRfTElNSVQgfHxcbiAgICBoZWlnaHQgKiBzY2FsZSA+IFdJRFRIX0hFSUdIVF9MSU1JVFxuICApIHtcbiAgICBzY2FsZSA9IE1hdGgubWluKFdJRFRIX0hFSUdIVF9MSU1JVCAvIHdpZHRoLCBXSURUSF9IRUlHSFRfTElNSVQgLyBoZWlnaHQpO1xuICB9XG5cbiAgLy8gcmVzY2FsZSB0byBlbnN1cmUgY2FudmFzIGFyZWEgaXMgd2l0aGluIGxpbWl0c1xuICBpZiAod2lkdGggKiBoZWlnaHQgKiBzY2FsZSAqIHNjYWxlID4gQVJFQV9MSU1JVCkge1xuICAgIHNjYWxlID0gTWF0aC5zcXJ0KEFSRUFfTElNSVQgLyAod2lkdGggKiBoZWlnaHQpKTtcbiAgfVxuXG4gIHdpZHRoID0gTWF0aC5mbG9vcih3aWR0aCAqIHNjYWxlKTtcbiAgaGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQgKiBzY2FsZSk7XG5cbiAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgc2NhbGUgfTtcbn07XG5cbmNvbnN0IGdlbmVyYXRlRWxlbWVudENhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICB6b29tOiBab29tLFxuICByZW5kZXJDb25maWc6IFJlbmRlckNvbmZpZyxcbik6IEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhcyA9PiB7XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcbiAgY29uc3QgcGFkZGluZyA9IGdldENhbnZhc1BhZGRpbmcoZWxlbWVudCk7XG5cbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBzY2FsZSB9ID0gY2FwcGVkRWxlbWVudENhbnZhc1NpemUoZWxlbWVudCwgem9vbSk7XG5cbiAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgbGV0IGNhbnZhc09mZnNldFggPSAwO1xuICBsZXQgY2FudmFzT2Zmc2V0WSA9IDA7XG5cbiAgaWYgKGlzTGluZWFyRWxlbWVudChlbGVtZW50KSB8fCBpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIGNvbnN0IFt4MSwgeTFdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuXG4gICAgY2FudmFzT2Zmc2V0WCA9XG4gICAgICBlbGVtZW50LnggPiB4MVxuICAgICAgICA/IGRpc3RhbmNlKGVsZW1lbnQueCwgeDEpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiBzY2FsZVxuICAgICAgICA6IDA7XG5cbiAgICBjYW52YXNPZmZzZXRZID1cbiAgICAgIGVsZW1lbnQueSA+IHkxXG4gICAgICAgID8gZGlzdGFuY2UoZWxlbWVudC55LCB5MSkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHNjYWxlXG4gICAgICAgIDogMDtcblxuICAgIGNvbnRleHQudHJhbnNsYXRlKGNhbnZhc09mZnNldFgsIGNhbnZhc09mZnNldFkpO1xuICB9XG5cbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHBhZGRpbmcgKiBzY2FsZSwgcGFkZGluZyAqIHNjYWxlKTtcbiAgY29udGV4dC5zY2FsZShcbiAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHNjYWxlLFxuICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogc2NhbGUsXG4gICk7XG5cbiAgY29uc3QgcmMgPSByb3VnaC5jYW52YXMoY2FudmFzKTtcblxuICAvLyBpbiBkYXJrIHRoZW1lLCByZXZlcnQgdGhlIGltYWdlIGNvbG9yIGZpbHRlclxuICBpZiAoc2hvdWxkUmVzZXRJbWFnZUZpbHRlcihlbGVtZW50LCByZW5kZXJDb25maWcpKSB7XG4gICAgY29udGV4dC5maWx0ZXIgPSBJTUFHRV9JTlZFUlRfRklMVEVSO1xuICB9XG5cbiAgZHJhd0VsZW1lbnRPbkNhbnZhcyhlbGVtZW50LCByYywgY29udGV4dCwgcmVuZGVyQ29uZmlnKTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50LFxuICAgIGNhbnZhcyxcbiAgICB0aGVtZTogcmVuZGVyQ29uZmlnLnRoZW1lLFxuICAgIHNjYWxlLFxuICAgIGNhbnZhc09mZnNldFgsXG4gICAgY2FudmFzT2Zmc2V0WSxcbiAgICBib3VuZFRleHRFbGVtZW50VmVyc2lvbjogZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KT8udmVyc2lvbiB8fCBudWxsLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElOS19TSVpFID0gMTQ7XG5cbmNvbnN0IElNQUdFX1BMQUNFSE9MREVSX0lNRyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG5JTUFHRV9QTEFDRUhPTERFUl9JTUcuc3JjID0gYGRhdGE6JHtNSU1FX1RZUEVTLnN2Z30sJHtlbmNvZGVVUklDb21wb25lbnQoXG4gIGA8c3ZnIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZvY3VzYWJsZT1cImZhbHNlXCIgZGF0YS1wcmVmaXg9XCJmYXNcIiBkYXRhLWljb249XCJpbWFnZVwiIGNsYXNzPVwic3ZnLWlubGluZS0tZmEgZmEtaW1hZ2UgZmEtdy0xNlwiIHJvbGU9XCJpbWdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCI+PHBhdGggZmlsbD1cIiM4ODhcIiBkPVwiTTQ2NCA0NDhINDhjLTI2LjUxIDAtNDgtMjEuNDktNDgtNDhWMTEyYzAtMjYuNTEgMjEuNDktNDggNDgtNDhoNDE2YzI2LjUxIDAgNDggMjEuNDkgNDggNDh2Mjg4YzAgMjYuNTEtMjEuNDkgNDgtNDggNDh6TTExMiAxMjBjLTMwLjkyOCAwLTU2IDI1LjA3Mi01NiA1NnMyNS4wNzIgNTYgNTYgNTYgNTYtMjUuMDcyIDU2LTU2LTI1LjA3Mi01Ni01Ni01NnpNNjQgMzg0aDM4NFYyNzJsLTg3LjUxNS04Ny41MTVjLTQuNjg2LTQuNjg2LTEyLjI4NC00LjY4Ni0xNi45NzEgMEwyMDggMzIwbC01NS41MTUtNTUuNTE1Yy00LjY4Ni00LjY4Ni0xMi4yODQtNC42ODYtMTYuOTcxIDBMNjQgMzM2djQ4elwiPjwvcGF0aD48L3N2Zz5gLFxuKX1gO1xuXG5jb25zdCBJTUFHRV9FUlJPUl9QTEFDRUhPTERFUl9JTUcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuSU1BR0VfRVJST1JfUExBQ0VIT0xERVJfSU1HLnNyYyA9IGBkYXRhOiR7TUlNRV9UWVBFUy5zdmd9LCR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICBgPHN2ZyB2aWV3Qm94PVwiMCAwIDY2OCA2NjhcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBzdHlsZT1cImZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoyXCI+PHBhdGggZD1cIk00NjQgNDQ4SDQ4Yy0yNi41MSAwLTQ4LTIxLjQ5LTQ4LTQ4VjExMmMwLTI2LjUxIDIxLjQ5LTQ4IDQ4LTQ4aDQxNmMyNi41MSAwIDQ4IDIxLjQ5IDQ4IDQ4djI4OGMwIDI2LjUxLTIxLjQ5IDQ4LTQ4IDQ4Wk0xMTIgMTIwYy0zMC45MjggMC01NiAyNS4wNzItNTYgNTZzMjUuMDcyIDU2IDU2IDU2IDU2LTI1LjA3MiA1Ni01Ni0yNS4wNzItNTYtNTYtNTZaTTY0IDM4NGgzODRWMjcybC04Ny41MTUtODcuNTE1Yy00LjY4Ni00LjY4Ni0xMi4yODQtNC42ODYtMTYuOTcxIDBMMjA4IDMyMGwtNTUuNTE1LTU1LjUxNWMtNC42ODYtNC42ODYtMTIuMjg0LTQuNjg2LTE2Ljk3MSAwTDY0IDMzNnY0OFpcIiBzdHlsZT1cImZpbGw6Izg4ODtmaWxsLXJ1bGU6bm9uemVyb1wiIHRyYW5zZm9ybT1cIm1hdHJpeCguODE3MDkgMCAwIC44MTcwOSAxMjQuODI1IDE0NS44MjUpXCIvPjxwYXRoIGQ9XCJNMjU2IDhDMTE5LjAzNCA4IDggMTE5LjAzMyA4IDI1NmMwIDEzNi45NjcgMTExLjAzNCAyNDggMjQ4IDI0OHMyNDgtMTExLjAzNCAyNDgtMjQ4UzM5Mi45NjcgOCAyNTYgOFptMTMwLjEwOCAxMTcuODkyYzY1LjQ0OCA2NS40NDggNzAgMTY1LjQ4MSAyMC42NzcgMjM1LjYzN0wxNTAuNDcgMTA1LjIxNmM3MC4yMDQtNDkuMzU2IDE3MC4yMjYtNDQuNzM1IDIzNS42MzggMjAuNjc2Wk0xMjUuODkyIDM4Ni4xMDhjLTY1LjQ0OC02NS40NDgtNzAtMTY1LjQ4MS0yMC42NzctMjM1LjYzN0wzNjEuNTMgNDA2Ljc4NGMtNzAuMjAzIDQ5LjM1Ni0xNzAuMjI2IDQ0LjczNi0yMzUuNjM4LTIwLjY3NlpcIiBzdHlsZT1cImZpbGw6Izg4ODtmaWxsLXJ1bGU6bm9uemVyb1wiIHRyYW5zZm9ybT1cIm1hdHJpeCguMzAzNjYgMCAwIC4zMDM2NiA1MDYuODIyIDYwLjA2NSlcIi8+PC9zdmc+YCxcbil9YDtcblxuY29uc3QgZHJhd0ltYWdlUGxhY2Vob2xkZXIgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgem9vbVZhbHVlOiBBcHBTdGF0ZVtcInpvb21cIl1bXCJ2YWx1ZVwiXSxcbikgPT4ge1xuICBjb250ZXh0LmZpbGxTdHlsZSA9IFwiI0U3RTdFN1wiO1xuICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcblxuICBjb25zdCBpbWFnZU1pbldpZHRoT3JIZWlnaHQgPSBNYXRoLm1pbihlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7XG5cbiAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKFxuICAgIGltYWdlTWluV2lkdGhPckhlaWdodCxcbiAgICBNYXRoLm1pbihpbWFnZU1pbldpZHRoT3JIZWlnaHQgKiAwLjQsIDEwMCksXG4gICk7XG5cbiAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgZWxlbWVudC5zdGF0dXMgPT09IFwiZXJyb3JcIlxuICAgICAgPyBJTUFHRV9FUlJPUl9QTEFDRUhPTERFUl9JTUdcbiAgICAgIDogSU1BR0VfUExBQ0VIT0xERVJfSU1HLFxuICAgIGVsZW1lbnQud2lkdGggLyAyIC0gc2l6ZSAvIDIsXG4gICAgZWxlbWVudC5oZWlnaHQgLyAyIC0gc2l6ZSAvIDIsXG4gICAgc2l6ZSxcbiAgICBzaXplLFxuICApO1xufTtcblxuY29uc3QgZHJhd0VsZW1lbnRPbkNhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgcmVuZGVyQ29uZmlnOiBSZW5kZXJDb25maWcsXG4pID0+IHtcbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICBjYXNlIFwiZWxsaXBzZVwiOiB7XG4gICAgICBjb250ZXh0LmxpbmVKb2luID0gXCJyb3VuZFwiO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuICAgICAgcmMuZHJhdyhnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwibGluZVwiOiB7XG4gICAgICBjb250ZXh0LmxpbmVKb2luID0gXCJyb3VuZFwiO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuXG4gICAgICBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhLmZvckVhY2goKHNoYXBlKSA9PiB7XG4gICAgICAgIHJjLmRyYXcoc2hhcGUpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIC8vIERyYXcgZGlyZWN0bHkgdG8gY2FudmFzXG4gICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZWxlbWVudC5zdHJva2VDb2xvcjtcblxuICAgICAgY29uc3QgcGF0aCA9IGdldEZyZWVEcmF3UGF0aDJEKGVsZW1lbnQpIGFzIFBhdGgyRDtcbiAgICAgIGNvbnN0IGZpbGxTaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgaWYgKGZpbGxTaGFwZSkge1xuICAgICAgICByYy5kcmF3KGZpbGxTaGFwZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZWxlbWVudC5zdHJva2VDb2xvcjtcbiAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcblxuICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImltYWdlXCI6IHtcbiAgICAgIGNvbnN0IGltZyA9IGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudClcbiAgICAgICAgPyByZW5kZXJDb25maWcuaW1hZ2VDYWNoZS5nZXQoZWxlbWVudC5maWxlSWQpPy5pbWFnZVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChpbWcgIT0gbnVsbCAmJiAhKGltZyBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICAgIGltZyxcbiAgICAgICAgICAwIC8qIGhhcmRjb2RlZCBmb3IgdGhlIHNlbGVjdGlvbiBib3gqLyxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgZWxlbWVudC5oZWlnaHQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmF3SW1hZ2VQbGFjZWhvbGRlcihlbGVtZW50LCBjb250ZXh0LCByZW5kZXJDb25maWcuem9vbS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgcnRsID0gaXNSVEwoZWxlbWVudC50ZXh0KTtcbiAgICAgICAgY29uc3Qgc2hvdWxkVGVtcG9yYXJpbHlBdHRhY2ggPSBydGwgJiYgIWNvbnRleHQuY2FudmFzLmlzQ29ubmVjdGVkO1xuICAgICAgICBpZiAoc2hvdWxkVGVtcG9yYXJpbHlBdHRhY2gpIHtcbiAgICAgICAgICAvLyB0byBjb3JyZWN0bHkgcmVuZGVyIFJUTCB0ZXh0IG1peGVkIHdpdGggTFRSLCB3ZSBoYXZlIHRvIGFwcGVuZCBpdFxuICAgICAgICAgIC8vIHRvIHRoZSBET01cbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRleHQuY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJkaXJcIiwgcnRsID8gXCJydGxcIiA6IFwibHRyXCIpO1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC5mb250ID0gZ2V0Rm9udFN0cmluZyhlbGVtZW50KTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBlbGVtZW50LnN0cm9rZUNvbG9yO1xuICAgICAgICBjb250ZXh0LnRleHRBbGlnbiA9IGVsZW1lbnQudGV4dEFsaWduIGFzIENhbnZhc1RleHRBbGlnbjtcblxuICAgICAgICAvLyBDYW52YXMgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aWxpbmUgdGV4dCBieSBkZWZhdWx0XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZWxlbWVudC50ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG5cbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9XG4gICAgICAgICAgZWxlbWVudC50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aCAvIDJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgICAgICAgICAgPyBlbGVtZW50LndpZHRoXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnRleHQudGV4dEJhc2VsaW5lID0gXCJib3R0b21cIjtcblxuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0UHggPSBnZXRMaW5lSGVpZ2h0SW5QeChcbiAgICAgICAgICBlbGVtZW50LmZvbnRTaXplLFxuICAgICAgICAgIGVsZW1lbnQubGluZUhlaWdodCxcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgY29udGV4dC5maWxsVGV4dChcbiAgICAgICAgICAgIGxpbmVzW2luZGV4XSxcbiAgICAgICAgICAgIGhvcml6b250YWxPZmZzZXQsXG4gICAgICAgICAgICAoaW5kZXggKyAxKSAqIGxpbmVIZWlnaHRQeCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICBpZiAoc2hvdWxkVGVtcG9yYXJpbHlBdHRhY2gpIHtcbiAgICAgICAgICBjb250ZXh0LmNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSAxO1xufTtcblxubGV0IGVsZW1lbnRXaXRoQ2FudmFzQ2FjaGUgPSBuZXcgV2Vha01hcDxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhc1xuPigpO1xuXG5sZXQgc2hhcGVDYWNoZSA9IG5ldyBXZWFrTWFwPEV4Y2FsaWRyYXdFbGVtZW50LCBFbGVtZW50U2hhcGU+KCk7XG5cbnR5cGUgRWxlbWVudFNoYXBlID0gRHJhd2FibGUgfCBEcmF3YWJsZVtdIHwgbnVsbDtcblxudHlwZSBFbGVtZW50U2hhcGVzID0ge1xuICBmcmVlZHJhdzogRHJhd2FibGUgfCBudWxsO1xuICBhcnJvdzogRHJhd2FibGVbXTtcbiAgbGluZTogRHJhd2FibGVbXTtcbiAgdGV4dDogbnVsbDtcbiAgaW1hZ2U6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2hhcGVGb3JFbGVtZW50ID0gPFQgZXh0ZW5kcyBFeGNhbGlkcmF3RWxlbWVudD4oZWxlbWVudDogVCkgPT5cbiAgc2hhcGVDYWNoZS5nZXQoZWxlbWVudCkgYXMgVFtcInR5cGVcIl0gZXh0ZW5kcyBrZXlvZiBFbGVtZW50U2hhcGVzXG4gICAgPyBFbGVtZW50U2hhcGVzW1RbXCJ0eXBlXCJdXSB8IHVuZGVmaW5lZFxuICAgIDogRHJhd2FibGUgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3Qgc2V0U2hhcGVGb3JFbGVtZW50ID0gPFQgZXh0ZW5kcyBFeGNhbGlkcmF3RWxlbWVudD4oXG4gIGVsZW1lbnQ6IFQsXG4gIHNoYXBlOiBUW1widHlwZVwiXSBleHRlbmRzIGtleW9mIEVsZW1lbnRTaGFwZXNcbiAgICA/IEVsZW1lbnRTaGFwZXNbVFtcInR5cGVcIl1dXG4gICAgOiBEcmF3YWJsZSxcbikgPT4gc2hhcGVDYWNoZS5zZXQoZWxlbWVudCwgc2hhcGUpO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT5cbiAgc2hhcGVDYWNoZS5kZWxldGUoZWxlbWVudCk7XG5cbmV4cG9ydCBjb25zdCBjbGVhclJlbmRlckNhY2hlID0gKCkgPT4ge1xuICBlbGVtZW50V2l0aENhbnZhc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcbiAgc2hhcGVDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHBhdGhzQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91Z2hPcHRpb25zID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgY29udGludW91c1BhdGggPSBmYWxzZSxcbik6IE9wdGlvbnMgPT4ge1xuICBjb25zdCBvcHRpb25zOiBPcHRpb25zID0ge1xuICAgIHNlZWQ6IGVsZW1lbnQuc2VlZCxcbiAgICBzdHJva2VMaW5lRGFzaDpcbiAgICAgIGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFwiZGFzaGVkXCJcbiAgICAgICAgPyBnZXREYXNoQXJyYXlEYXNoZWQoZWxlbWVudC5zdHJva2VXaWR0aClcbiAgICAgICAgOiBlbGVtZW50LnN0cm9rZVN0eWxlID09PSBcImRvdHRlZFwiXG4gICAgICAgID8gZ2V0RGFzaEFycmF5RG90dGVkKGVsZW1lbnQuc3Ryb2tlV2lkdGgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIC8vIGZvciBub24tc29saWQgc3Ryb2tlcywgZGlzYWJsZSBtdWx0aVN0cm9rZSBiZWNhdXNlIGl0IHRlbmRzIHRvIG1ha2VcbiAgICAvLyBkYXNoZXMvZG90cyBvdmVybGF5IGVhY2ggb3RoZXJcbiAgICBkaXNhYmxlTXVsdGlTdHJva2U6IGVsZW1lbnQuc3Ryb2tlU3R5bGUgIT09IFwic29saWRcIixcbiAgICAvLyBmb3Igbm9uLXNvbGlkIHN0cm9rZXMsIGluY3JlYXNlIHRoZSB3aWR0aCBhIGJpdCB0byBtYWtlIGl0IHZpc3VhbGx5XG4gICAgLy8gc2ltaWxhciB0byBzb2xpZCBzdHJva2VzLCBiZWNhdXNlIHdlJ3JlIGFsc28gZGlzYWJsaW5nIG11bHRpU3Ryb2tlXG4gICAgc3Ryb2tlV2lkdGg6XG4gICAgICBlbGVtZW50LnN0cm9rZVN0eWxlICE9PSBcInNvbGlkXCJcbiAgICAgICAgPyBlbGVtZW50LnN0cm9rZVdpZHRoICsgMC41XG4gICAgICAgIDogZWxlbWVudC5zdHJva2VXaWR0aCxcbiAgICAvLyB3aGVuIGluY3JlYXNpbmcgc3Ryb2tlV2lkdGgsIHdlIG11c3QgZXhwbGljaXRseSBzZXQgZmlsbFdlaWdodCBhbmRcbiAgICAvLyBoYWNodXJlR2FwIGJlY2F1c2UgaWYgbm90IHNwZWNpZmllZCwgcm91Z2hqcyB1c2VzIHN0cm9rZVdpZHRoIHRvXG4gICAgLy8gY2FsY3VsYXRlIHRoZW0gKGFuZCB3ZSBkb24ndCB3YW50IHRoZSBmaWxscyB0byBiZSBtb2RpZmllZClcbiAgICBmaWxsV2VpZ2h0OiBlbGVtZW50LnN0cm9rZVdpZHRoIC8gMixcbiAgICBoYWNodXJlR2FwOiBlbGVtZW50LnN0cm9rZVdpZHRoICogNCxcbiAgICByb3VnaG5lc3M6IGVsZW1lbnQucm91Z2huZXNzLFxuICAgIHN0cm9rZTogZWxlbWVudC5zdHJva2VDb2xvcixcbiAgICBwcmVzZXJ2ZVZlcnRpY2VzOiBjb250aW51b3VzUGF0aCxcbiAgfTtcblxuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6IHtcbiAgICAgIG9wdGlvbnMuZmlsbFN0eWxlID0gZWxlbWVudC5maWxsU3R5bGU7XG4gICAgICBvcHRpb25zLmZpbGwgPVxuICAgICAgICBlbGVtZW50LmJhY2tncm91bmRDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yO1xuICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAgICAgb3B0aW9ucy5jdXJ2ZUZpdHRpbmcgPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIGlmIChpc1BhdGhBTG9vcChlbGVtZW50LnBvaW50cykpIHtcbiAgICAgICAgb3B0aW9ucy5maWxsU3R5bGUgPSBlbGVtZW50LmZpbGxTdHlsZTtcbiAgICAgICAgb3B0aW9ucy5maWxsID1cbiAgICAgICAgICBlbGVtZW50LmJhY2tncm91bmRDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBlbGVtZW50LmJhY2tncm91bmRDb2xvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5pbXBsZW1lbnRlZCB0eXBlICR7ZWxlbWVudC50eXBlfWApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGVsZW1lbnQncyBzaGFwZSBhbmQgcHV0cyBpdCBpbnRvIHRoZSBjYWNoZS5cbiAqIEBwYXJhbSBlbGVtZW50XG4gKiBAcGFyYW0gZ2VuZXJhdG9yXG4gKi9cbmNvbnN0IGdlbmVyYXRlRWxlbWVudFNoYXBlID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGdlbmVyYXRvcjogUm91Z2hHZW5lcmF0b3IsXG4pID0+IHtcbiAgbGV0IHNoYXBlID0gc2hhcGVDYWNoZS5nZXQoZWxlbWVudCk7XG5cbiAgLy8gYG51bGxgIGluZGljYXRlcyBubyByYyBzaGFwZSBhcHBsaWNhYmxlIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAvLyAoPSBkbyBub3QgZ2VuZXJhdGUgYW55dGhpbmcpXG4gIGlmIChzaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZWxlbWVudFdpdGhDYW52YXNDYWNoZS5kZWxldGUoZWxlbWVudCk7XG5cbiAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgICAgICBpZiAoZWxlbWVudC5yb3VuZG5lc3MpIHtcbiAgICAgICAgICBjb25zdCB3ID0gZWxlbWVudC53aWR0aDtcbiAgICAgICAgICBjb25zdCBoID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgICAgICAgY29uc3QgciA9IGdldENvcm5lclJhZGl1cyhNYXRoLm1pbih3LCBoKSwgZWxlbWVudCk7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucGF0aChcbiAgICAgICAgICAgIGBNICR7cn0gMCBMICR7dyAtIHJ9IDAgUSAke3d9IDAsICR7d30gJHtyfSBMICR7d30gJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gUSAke3d9ICR7aH0sICR7dyAtIHJ9ICR7aH0gTCAke3J9ICR7aH0gUSAwICR7aH0sIDAgJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gTCAwICR7cn0gUSAwIDAsICR7cn0gMGAsXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50LCB0cnVlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnJlY3RhbmdsZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZWxlbWVudC53aWR0aCxcbiAgICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgc2hhcGUpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRpYW1vbmRcIjoge1xuICAgICAgICBjb25zdCBbdG9wWCwgdG9wWSwgcmlnaHRYLCByaWdodFksIGJvdHRvbVgsIGJvdHRvbVksIGxlZnRYLCBsZWZ0WV0gPVxuICAgICAgICAgIGdldERpYW1vbmRQb2ludHMoZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgICAgIGNvbnN0IHZlcnRpY2FsUmFkaXVzID0gZ2V0Q29ybmVyUmFkaXVzKFxuICAgICAgICAgICAgTWF0aC5hYnModG9wWCAtIGxlZnRYKSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGhvcml6b250YWxSYWRpdXMgPSBnZXRDb3JuZXJSYWRpdXMoXG4gICAgICAgICAgICBNYXRoLmFicyhyaWdodFkgLSB0b3BZKSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnBhdGgoXG4gICAgICAgICAgICBgTSAke3RvcFggKyB2ZXJ0aWNhbFJhZGl1c30gJHt0b3BZICsgaG9yaXpvbnRhbFJhZGl1c30gTCAke1xuICAgICAgICAgICAgICByaWdodFggLSB2ZXJ0aWNhbFJhZGl1c1xuICAgICAgICAgICAgfSAke3JpZ2h0WSAtIGhvcml6b250YWxSYWRpdXN9XG4gICAgICAgICAgICBDICR7cmlnaHRYfSAke3JpZ2h0WX0sICR7cmlnaHRYfSAke3JpZ2h0WX0sICR7XG4gICAgICAgICAgICAgIHJpZ2h0WCAtIHZlcnRpY2FsUmFkaXVzXG4gICAgICAgICAgICB9ICR7cmlnaHRZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEwgJHtib3R0b21YICsgdmVydGljYWxSYWRpdXN9ICR7Ym90dG9tWSAtIGhvcml6b250YWxSYWRpdXN9XG4gICAgICAgICAgICBDICR7Ym90dG9tWH0gJHtib3R0b21ZfSwgJHtib3R0b21YfSAke2JvdHRvbVl9LCAke1xuICAgICAgICAgICAgICBib3R0b21YIC0gdmVydGljYWxSYWRpdXNcbiAgICAgICAgICAgIH0gJHtib3R0b21ZIC0gaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEwgJHtsZWZ0WCArIHZlcnRpY2FsUmFkaXVzfSAke2xlZnRZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEMgJHtsZWZ0WH0gJHtsZWZ0WX0sICR7bGVmdFh9ICR7bGVmdFl9LCAke2xlZnRYICsgdmVydGljYWxSYWRpdXN9ICR7XG4gICAgICAgICAgICAgIGxlZnRZIC0gaG9yaXpvbnRhbFJhZGl1c1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTCAke3RvcFggLSB2ZXJ0aWNhbFJhZGl1c30gJHt0b3BZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEMgJHt0b3BYfSAke3RvcFl9LCAke3RvcFh9ICR7dG9wWX0sICR7dG9wWCArIHZlcnRpY2FsUmFkaXVzfSAke1xuICAgICAgICAgICAgICB0b3BZICsgaG9yaXpvbnRhbFJhZGl1c1xuICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50LCB0cnVlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnBvbHlnb24oXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt0b3BYLCB0b3BZXSxcbiAgICAgICAgICAgICAgW3JpZ2h0WCwgcmlnaHRZXSxcbiAgICAgICAgICAgICAgW2JvdHRvbVgsIGJvdHRvbVldLFxuICAgICAgICAgICAgICBbbGVmdFgsIGxlZnRZXSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHNldFNoYXBlRm9yRWxlbWVudChlbGVtZW50LCBzaGFwZSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5lbGxpcHNlKFxuICAgICAgICAgIGVsZW1lbnQud2lkdGggLyAyLFxuICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgc2hhcGUpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgIGNhc2UgXCJhcnJvd1wiOiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KTtcblxuICAgICAgICAvLyBwb2ludHMgYXJyYXkgY2FuIGJlIGVtcHR5IGluIHRoZSBiZWdpbm5pbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0byBhZGRcbiAgICAgICAgLy8gaW5pdGlhbCBwb3NpdGlvbiB0byBpdFxuICAgICAgICBjb25zdCBwb2ludHMgPSBlbGVtZW50LnBvaW50cy5sZW5ndGggPyBlbGVtZW50LnBvaW50cyA6IFtbMCwgMF1dO1xuXG4gICAgICAgIC8vIGN1cnZlIGlzIGFsd2F5cyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAvLyB0aGlzIHNpbXBsaWZpZXMgZmluZGluZyB0aGUgY3VydmUgZm9yIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKCFlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgICAgIGlmIChvcHRpb25zLmZpbGwpIHtcbiAgICAgICAgICAgIHNoYXBlID0gW2dlbmVyYXRvci5wb2x5Z29uKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hhcGUgPSBbXG4gICAgICAgICAgICAgIGdlbmVyYXRvci5saW5lYXJQYXRoKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hhcGUgPSBbZ2VuZXJhdG9yLmN1cnZlKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBsaW5lcyBvbmx5IGluIGFycm93XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIikge1xuICAgICAgICAgIGNvbnN0IHsgc3RhcnRBcnJvd2hlYWQgPSBudWxsLCBlbmRBcnJvd2hlYWQgPSBcImFycm93XCIgfSA9IGVsZW1lbnQ7XG5cbiAgICAgICAgICBjb25zdCBnZXRBcnJvd2hlYWRTaGFwZXMgPSAoXG4gICAgICAgICAgICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgIHNoYXBlOiBEcmF3YWJsZVtdLFxuICAgICAgICAgICAgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIsXG4gICAgICAgICAgICBhcnJvd2hlYWQ6IEFycm93aGVhZCxcbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFycm93aGVhZFBvaW50cyA9IGdldEFycm93aGVhZFBvaW50cyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgICBhcnJvd2hlYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoYXJyb3doZWFkUG9pbnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3RoZXIgYXJyb3doZWFkcyBoZXJlLi4uXG4gICAgICAgICAgICBpZiAoYXJyb3doZWFkID09PSBcImRvdFwiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFt4LCB5LCByXSA9IGFycm93aGVhZFBvaW50cztcblxuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRvci5jaXJjbGUoeCwgeSwgciwge1xuICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGZpbGw6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IFwic29saWRcIixcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhcnJvd2hlYWQgPT09IFwidHJpYW5nbGVcIikge1xuICAgICAgICAgICAgICBjb25zdCBbeCwgeSwgeDIsIHkyLCB4MywgeTNdID0gYXJyb3doZWFkUG9pbnRzO1xuXG4gICAgICAgICAgICAgIC8vIGFsd2F5cyB1c2Ugc29saWQgc3Ryb2tlIGZvciB0cmlhbmdsZSBhcnJvd2hlYWRcbiAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuc3Ryb2tlTGluZURhc2g7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3IucG9seWdvbihcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgW3gsIHldLFxuICAgICAgICAgICAgICAgICAgICBbeDIsIHkyXSxcbiAgICAgICAgICAgICAgICAgICAgW3gzLCB5M10sXG4gICAgICAgICAgICAgICAgICAgIFt4LCB5XSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogXCJzb2xpZFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcnJvdyBhcnJvd2hlYWRzXG4gICAgICAgICAgICBjb25zdCBbeDIsIHkyLCB4MywgeTMsIHg0LCB5NF0gPSBhcnJvd2hlYWRQb2ludHM7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LnN0cm9rZVN0eWxlID09PSBcImRvdHRlZFwiKSB7XG4gICAgICAgICAgICAgIC8vIGZvciBkb3R0ZWQgYXJyb3dzIGNhcHMsIHJlZHVjZSBnYXAgdG8gbWFrZSBpdCBtb3JlIGxlZ2libGVcbiAgICAgICAgICAgICAgY29uc3QgZGFzaCA9IGdldERhc2hBcnJheURvdHRlZChlbGVtZW50LnN0cm9rZVdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgIG9wdGlvbnMuc3Ryb2tlTGluZURhc2ggPSBbZGFzaFswXSwgZGFzaFsxXSAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gZm9yIHNvbGlkL2Rhc2hlZCwga2VlcCBzb2xpZCBhcnJvdyBjYXBcbiAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuc3Ryb2tlTGluZURhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBnZW5lcmF0b3IubGluZSh4MywgeTMsIHgyLCB5Miwgb3B0aW9ucyksXG4gICAgICAgICAgICAgIGdlbmVyYXRvci5saW5lKHg0LCB5NCwgeDIsIHkyLCBvcHRpb25zKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChzdGFydEFycm93aGVhZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gZ2V0QXJyb3doZWFkU2hhcGVzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgICAgXCJzdGFydFwiLFxuICAgICAgICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzaGFwZS5wdXNoKC4uLnNoYXBlcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGVuZEFycm93aGVhZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGVuZEFycm93aGVhZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIEhleSwgd2UgaGF2ZSBhbiBvbGQgYXJyb3cgaGVyZSFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gZ2V0QXJyb3doZWFkU2hhcGVzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgICAgXCJlbmRcIixcbiAgICAgICAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNoYXBlLnB1c2goLi4uc2hhcGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgc2hhcGUpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgICAgZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChlbGVtZW50LnBvaW50cykpIHtcbiAgICAgICAgICAvLyBnZW5lcmF0ZSByb3VnaCBwb2x5Z29uIHRvIGZpbGwgZnJlZWRyYXcgc2hhcGVcbiAgICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5wb2x5Z29uKGVsZW1lbnQucG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSwge1xuICAgICAgICAgICAgLi4uZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgICBzdHJva2U6IFwibm9uZVwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgc2hhcGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBjYXNlIFwiaW1hZ2VcIjoge1xuICAgICAgICAvLyBqdXN0IHRvIGVuc3VyZSB3ZSBkb24ndCByZWdlbmVyYXRlIGVsZW1lbnQuY2FudmFzIG9uIHJlcmVuZGVyc1xuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZ2VuZXJhdGVFbGVtZW50V2l0aENhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByZW5kZXJDb25maWc6IFJlbmRlckNvbmZpZyxcbikgPT4ge1xuICBjb25zdCB6b29tOiBab29tID0gcmVuZGVyQ29uZmlnID8gcmVuZGVyQ29uZmlnLnpvb20gOiBkZWZhdWx0QXBwU3RhdGUuem9vbTtcbiAgY29uc3QgcHJldkVsZW1lbnRXaXRoQ2FudmFzID0gZWxlbWVudFdpdGhDYW52YXNDYWNoZS5nZXQoZWxlbWVudCk7XG4gIGNvbnN0IHNob3VsZFJlZ2VuZXJhdGVCZWNhdXNlWm9vbSA9XG4gICAgcHJldkVsZW1lbnRXaXRoQ2FudmFzICYmXG4gICAgcHJldkVsZW1lbnRXaXRoQ2FudmFzLnNjYWxlICE9PSB6b29tLnZhbHVlICYmXG4gICAgIXJlbmRlckNvbmZpZz8uc2hvdWxkQ2FjaGVJZ25vcmVab29tO1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50VmVyc2lvbiA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk/LnZlcnNpb24gfHwgbnVsbDtcblxuICBpZiAoXG4gICAgIXByZXZFbGVtZW50V2l0aENhbnZhcyB8fFxuICAgIHNob3VsZFJlZ2VuZXJhdGVCZWNhdXNlWm9vbSB8fFxuICAgIHByZXZFbGVtZW50V2l0aENhbnZhcy50aGVtZSAhPT0gcmVuZGVyQ29uZmlnLnRoZW1lIHx8XG4gICAgcHJldkVsZW1lbnRXaXRoQ2FudmFzLmJvdW5kVGV4dEVsZW1lbnRWZXJzaW9uICE9PSBib3VuZFRleHRFbGVtZW50VmVyc2lvblxuICApIHtcbiAgICBjb25zdCBlbGVtZW50V2l0aENhbnZhcyA9IGdlbmVyYXRlRWxlbWVudENhbnZhcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICB6b29tLFxuICAgICAgcmVuZGVyQ29uZmlnLFxuICAgICk7XG5cbiAgICBlbGVtZW50V2l0aENhbnZhc0NhY2hlLnNldChlbGVtZW50LCBlbGVtZW50V2l0aENhbnZhcyk7XG5cbiAgICByZXR1cm4gZWxlbWVudFdpdGhDYW52YXM7XG4gIH1cbiAgcmV0dXJuIHByZXZFbGVtZW50V2l0aENhbnZhcztcbn07XG5cbmNvbnN0IGRyYXdFbGVtZW50RnJvbUNhbnZhcyA9IChcbiAgZWxlbWVudFdpdGhDYW52YXM6IEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhcyxcbiAgcmM6IFJvdWdoQ2FudmFzLFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHJlbmRlckNvbmZpZzogUmVuZGVyQ29uZmlnLFxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50V2l0aENhbnZhcy5lbGVtZW50O1xuICBjb25zdCBwYWRkaW5nID0gZ2V0Q2FudmFzUGFkZGluZyhlbGVtZW50KTtcbiAgY29uc3Qgem9vbSA9IGVsZW1lbnRXaXRoQ2FudmFzLnNjYWxlO1xuICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAvLyBGcmVlIGRyYXcgZWxlbWVudHMgd2lsbCBvdGhlcndpc2UgXCJzaHVmZmxlXCIgYXMgdGhlIG1pbiB4IGFuZCB5IGNoYW5nZVxuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICB4MSA9IE1hdGguZmxvb3IoeDEpO1xuICAgIHgyID0gTWF0aC5jZWlsKHgyKTtcbiAgICB5MSA9IE1hdGguZmxvb3IoeTEpO1xuICAgIHkyID0gTWF0aC5jZWlsKHkyKTtcbiAgfVxuXG4gIGNvbnN0IGN4ID0gKCh4MSArIHgyKSAvIDIgKyByZW5kZXJDb25maWcuc2Nyb2xsWCkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgY29uc3QgY3kgPSAoKHkxICsgeTIpIC8gMiArIHJlbmRlckNvbmZpZy5zY3JvbGxZKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuXG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnNjYWxlKDEgLyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMSAvIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpICYmIGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICBjb25zdCB0ZW1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjb25zdCB0ZW1wQ2FudmFzQ29udGV4dCA9IHRlbXBDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcblxuICAgIC8vIFRha2UgbWF4IGRpbWVuc2lvbnMgb2YgYXJyb3cgY2FudmFzIHNvIHRoYXQgd2hlbiBjYW52YXMgaXMgcm90YXRlZFxuICAgIC8vIHRoZSBhcnJvdyBkb2Vzbid0IGdldCBjbGlwcGVkXG4gICAgY29uc3QgbWF4RGltID0gTWF0aC5tYXgoZGlzdGFuY2UoeDEsIHgyKSwgZGlzdGFuY2UoeTEsIHkyKSk7XG4gICAgdGVtcENhbnZhcy53aWR0aCA9XG4gICAgICBtYXhEaW0gKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20gK1xuICAgICAgcGFkZGluZyAqIGVsZW1lbnRXaXRoQ2FudmFzLnNjYWxlICogMTA7XG4gICAgdGVtcENhbnZhcy5oZWlnaHQgPVxuICAgICAgbWF4RGltICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tICtcbiAgICAgIHBhZGRpbmcgKiBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSAqIDEwO1xuICAgIGNvbnN0IG9mZnNldFggPSAodGVtcENhbnZhcy53aWR0aCAtIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEud2lkdGgpIC8gMjtcbiAgICBjb25zdCBvZmZzZXRZID0gKHRlbXBDYW52YXMuaGVpZ2h0IC0gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzIS5oZWlnaHQpIC8gMjtcblxuICAgIHRlbXBDYW52YXNDb250ZXh0LnRyYW5zbGF0ZSh0ZW1wQ2FudmFzLndpZHRoIC8gMiwgdGVtcENhbnZhcy5oZWlnaHQgLyAyKTtcbiAgICB0ZW1wQ2FudmFzQ29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG5cbiAgICB0ZW1wQ2FudmFzQ29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMhLFxuICAgICAgLWVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcy53aWR0aCAvIDIsXG4gICAgICAtZWxlbWVudFdpdGhDYW52YXMuY2FudmFzLmhlaWdodCAvIDIsXG4gICAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMud2lkdGgsXG4gICAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMuaGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCBbLCAsICwgLCBib3VuZFRleHRDeCwgYm91bmRUZXh0Q3ldID1cbiAgICAgIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3Jkcyhib3VuZFRleHRFbGVtZW50KTtcblxuICAgIHRlbXBDYW52YXNDb250ZXh0LnJvdGF0ZSgtZWxlbWVudC5hbmdsZSk7XG5cbiAgICAvLyBTaGlmdCB0aGUgY2FudmFzIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGJvdW5kIHRleHQgZWxlbWVudFxuICAgIGNvbnN0IHNoaWZ0WCA9XG4gICAgICB0ZW1wQ2FudmFzLndpZHRoIC8gMiAtXG4gICAgICAoYm91bmRUZXh0Q3ggLSB4MSkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20gLVxuICAgICAgb2Zmc2V0WCAtXG4gICAgICBwYWRkaW5nICogem9vbTtcblxuICAgIGNvbnN0IHNoaWZ0WSA9XG4gICAgICB0ZW1wQ2FudmFzLmhlaWdodCAvIDIgLVxuICAgICAgKGJvdW5kVGV4dEN5IC0geTEpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tIC1cbiAgICAgIG9mZnNldFkgLVxuICAgICAgcGFkZGluZyAqIHpvb207XG4gICAgdGVtcENhbnZhc0NvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGJvdW5kIHRleHQgYXJlYVxuICAgIHRlbXBDYW52YXNDb250ZXh0LmNsZWFyUmVjdChcbiAgICAgIC0oYm91bmRUZXh0RWxlbWVudC53aWR0aCAvIDIgKyBCT1VORF9URVhUX1BBRERJTkcpICpcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKlxuICAgICAgICB6b29tLFxuICAgICAgLShib3VuZFRleHRFbGVtZW50LmhlaWdodCAvIDIgKyBCT1VORF9URVhUX1BBRERJTkcpICpcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKlxuICAgICAgICB6b29tLFxuICAgICAgKGJvdW5kVGV4dEVsZW1lbnQud2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyKSAqXG4gICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICpcbiAgICAgICAgem9vbSxcbiAgICAgIChib3VuZFRleHRFbGVtZW50LmhlaWdodCArIEJPVU5EX1RFWFRfUEFERElORyAqIDIpICpcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKlxuICAgICAgICB6b29tLFxuICAgICk7XG5cbiAgICBjb250ZXh0LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgdGVtcENhbnZhcyxcbiAgICAgICgtKHgyIC0geDEpIC8gMikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAtIG9mZnNldFggLyB6b29tIC0gcGFkZGluZyxcbiAgICAgICgtKHkyIC0geTEpIC8gMikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAtIG9mZnNldFkgLyB6b29tIC0gcGFkZGluZyxcbiAgICAgIHRlbXBDYW52YXMud2lkdGggLyB6b29tLFxuICAgICAgdGVtcENhbnZhcy5oZWlnaHQgLyB6b29tLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gd2UgdHJhbnNsYXRlIGNvbnRleHQgdG8gZWxlbWVudCBjZW50ZXIgc28gdGhhdCByb3RhdGlvbiBhbmQgc2NhbGVcbiAgICAvLyBvcmlnaW5hdGVzIGZyb20gdGhlIGVsZW1lbnQgY2VudGVyXG4gICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcblxuICAgIGNvbnRleHQucm90YXRlKGVsZW1lbnQuYW5nbGUpO1xuXG4gICAgaWYgKFxuICAgICAgXCJzY2FsZVwiIGluIGVsZW1lbnRXaXRoQ2FudmFzLmVsZW1lbnQgJiZcbiAgICAgICFpc1BlbmRpbmdJbWFnZUVsZW1lbnQoZWxlbWVudCwgcmVuZGVyQ29uZmlnKVxuICAgICkge1xuICAgICAgY29udGV4dC5zY2FsZShcbiAgICAgICAgZWxlbWVudFdpdGhDYW52YXMuZWxlbWVudC5zY2FsZVswXSxcbiAgICAgICAgZWxlbWVudFdpdGhDYW52YXMuZWxlbWVudC5zY2FsZVsxXSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gcmV2ZXJ0IGFmdGVyd2FyZHMgd2UgZG9uJ3QgaGF2ZSBhY2NvdW50IGZvciBpdCBkdXJpbmcgZHJhd2luZ1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1jeCwgLWN5KTtcblxuICAgIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgZWxlbWVudFdpdGhDYW52YXMuY2FudmFzISxcbiAgICAgICh4MSArIHJlbmRlckNvbmZpZy5zY3JvbGxYKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC1cbiAgICAgICAgKHBhZGRpbmcgKiBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSkgLyBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSxcbiAgICAgICh5MSArIHJlbmRlckNvbmZpZy5zY3JvbGxZKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC1cbiAgICAgICAgKHBhZGRpbmcgKiBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSkgLyBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSxcbiAgICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEud2lkdGggLyBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSxcbiAgICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEuaGVpZ2h0IC8gZWxlbWVudFdpdGhDYW52YXMuc2NhbGUsXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9ERUJVR19FTkFCTEVfVEVYVF9DT05UQUlORVJfQk9VTkRJTkdfQk9YICYmXG4gICAgICBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpXG4gICAgKSB7XG4gICAgICBjb25zdCBjb29yZHMgPSBnZXRDb250YWluZXJDb29yZHMoZWxlbWVudCk7XG4gICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gXCIjYzkyYTJhXCI7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDM7XG4gICAgICBjb250ZXh0LnN0cm9rZVJlY3QoXG4gICAgICAgIChjb29yZHMueCArIHJlbmRlckNvbmZpZy5zY3JvbGxYKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAoY29vcmRzLnkgKyByZW5kZXJDb25maWcuc2Nyb2xsWSkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgZ2V0TWF4Q29udGFpbmVyV2lkdGgoZWxlbWVudCkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGVsZW1lbnQpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb250ZXh0LnJlc3RvcmUoKTtcblxuICAvLyBDbGVhciB0aGUgbmVzdGVkIGVsZW1lbnQgd2UgYXBwZW5kZWQgdG8gdGhlIERPTVxufTtcblxuZXhwb3J0IGNvbnN0IHJlbmRlckVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgcmM6IFJvdWdoQ2FudmFzLFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHJlbmRlckNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcmMuZ2VuZXJhdG9yO1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJzZWxlY3Rpb25cIjoge1xuICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShcbiAgICAgICAgZWxlbWVudC54ICsgcmVuZGVyQ29uZmlnLnNjcm9sbFgsXG4gICAgICAgIGVsZW1lbnQueSArIHJlbmRlckNvbmZpZy5zY3JvbGxZLFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gXCJyZ2JhKDAsIDAsIDIwMCwgMC4wNClcIjtcblxuICAgICAgLy8gcmVuZGVyIGZyb20gMC41cHggb2Zmc2V0ICB0byBnZXQgMXB4IHdpZGUgbGluZVxuICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzUzMDU5My9odG1sNS1jYW52YXMtYW5kLWxpbmUtd2lkdGgvNzUzMTU0MCM3NTMxNTQwXG4gICAgICAvLyBUT0RPIGNhbiBiZSBiZSBpbXByb3ZlZCBieSBvZmZzZXRpbmcgdG8gdGhlIG5lZ2F0aXZlIHdoZW4gdXNlciBzZWxlY3RzXG4gICAgICAvLyBmcm9tIHJpZ2h0IHRvIGxlZnRcbiAgICAgIGNvbnN0IG9mZnNldCA9IDAuNSAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuXG4gICAgICBjb250ZXh0LmZpbGxSZWN0KG9mZnNldCwgb2Zmc2V0LCBlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyByZW5kZXJDb25maWcuem9vbS52YWx1ZTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYigxMDUsIDEwMSwgMjE5KVwiO1xuICAgICAgY29udGV4dC5zdHJva2VSZWN0KG9mZnNldCwgb2Zmc2V0LCBlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7XG5cbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuXG4gICAgICBpZiAocmVuZGVyQ29uZmlnLmlzRXhwb3J0aW5nKSB7XG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMiArIHJlbmRlckNvbmZpZy5zY3JvbGxYO1xuICAgICAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDIgKyByZW5kZXJDb25maWcuc2Nyb2xsWTtcbiAgICAgICAgY29uc3Qgc2hpZnRYID0gKHgyIC0geDEpIC8gMiAtIChlbGVtZW50LnggLSB4MSk7XG4gICAgICAgIGNvbnN0IHNoaWZ0WSA9ICh5MiAtIHkxKSAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgY29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuICAgICAgICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0LCByZW5kZXJDb25maWcpO1xuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaXRoQ2FudmFzID0gZ2VuZXJhdGVFbGVtZW50V2l0aENhbnZhcyhcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHJlbmRlckNvbmZpZyxcbiAgICAgICAgKTtcbiAgICAgICAgZHJhd0VsZW1lbnRGcm9tQ2FudmFzKGVsZW1lbnRXaXRoQ2FudmFzLCByYywgY29udGV4dCwgcmVuZGVyQ29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuICAgICAgaWYgKHJlbmRlckNvbmZpZy5pc0V4cG9ydGluZykge1xuICAgICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDIgKyByZW5kZXJDb25maWcuc2Nyb2xsWDtcbiAgICAgICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyICsgcmVuZGVyQ29uZmlnLnNjcm9sbFk7XG4gICAgICAgIGxldCBzaGlmdFggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgICAgICAgbGV0IHNoaWZ0WSA9ICh5MiAtIHkxKSAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dENvb3JkcyA9XG4gICAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBlbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzaGlmdFggPSAoeDIgLSB4MSkgLyAyIC0gKGJvdW5kVGV4dENvb3Jkcy54IC0geDEpO1xuICAgICAgICAgICAgc2hpZnRZID0gKHkyIC0geTEpIC8gMiAtIChib3VuZFRleHRDb29yZHMueSAtIHkxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJlc2V0SW1hZ2VGaWx0ZXIoZWxlbWVudCwgcmVuZGVyQ29uZmlnKSkge1xuICAgICAgICAgIGNvbnRleHQuZmlsdGVyID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpICYmIGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB0ZW1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAgICAgICAgIGNvbnN0IHRlbXBDYW52YXNDb250ZXh0ID0gdGVtcENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuXG4gICAgICAgICAgLy8gVGFrZSBtYXggZGltZW5zaW9ucyBvZiBhcnJvdyBjYW52YXMgc28gdGhhdCB3aGVuIGNhbnZhcyBpcyByb3RhdGVkXG4gICAgICAgICAgLy8gdGhlIGFycm93IGRvZXNuJ3QgZ2V0IGNsaXBwZWRcbiAgICAgICAgICBjb25zdCBtYXhEaW0gPSBNYXRoLm1heChkaXN0YW5jZSh4MSwgeDIpLCBkaXN0YW5jZSh5MSwgeTIpKTtcbiAgICAgICAgICBjb25zdCBwYWRkaW5nID0gZ2V0Q2FudmFzUGFkZGluZyhlbGVtZW50KTtcbiAgICAgICAgICB0ZW1wQ2FudmFzLndpZHRoID1cbiAgICAgICAgICAgIG1heERpbSAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlICsgcGFkZGluZyAqIDEwICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgICAgICAgdGVtcENhbnZhcy5oZWlnaHQgPVxuICAgICAgICAgICAgbWF4RGltICogYXBwU3RhdGUuZXhwb3J0U2NhbGUgKyBwYWRkaW5nICogMTAgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcblxuICAgICAgICAgIHRlbXBDYW52YXNDb250ZXh0LnRyYW5zbGF0ZShcbiAgICAgICAgICAgIHRlbXBDYW52YXMud2lkdGggLyAyLFxuICAgICAgICAgICAgdGVtcENhbnZhcy5oZWlnaHQgLyAyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcENhbnZhc0NvbnRleHQuc2NhbGUoYXBwU3RhdGUuZXhwb3J0U2NhbGUsIGFwcFN0YXRlLmV4cG9ydFNjYWxlKTtcblxuICAgICAgICAgIC8vIFNoaWZ0IHRoZSBjYW52YXMgdG8gbGVmdCBtb3N0IHBvaW50IG9mIHRoZSBhcnJvd1xuICAgICAgICAgIHNoaWZ0WCA9IGVsZW1lbnQud2lkdGggLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgICAgICAgICBzaGlmdFkgPSBlbGVtZW50LmhlaWdodCAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuXG4gICAgICAgICAgdGVtcENhbnZhc0NvbnRleHQucm90YXRlKGVsZW1lbnQuYW5nbGUpO1xuICAgICAgICAgIGNvbnN0IHRlbXBSYyA9IHJvdWdoLmNhbnZhcyh0ZW1wQ2FudmFzKTtcblxuICAgICAgICAgIHRlbXBDYW52YXNDb250ZXh0LnRyYW5zbGF0ZSgtc2hpZnRYLCAtc2hpZnRZKTtcblxuICAgICAgICAgIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgdGVtcFJjLCB0ZW1wQ2FudmFzQ29udGV4dCwgcmVuZGVyQ29uZmlnKTtcblxuICAgICAgICAgIHRlbXBDYW52YXNDb250ZXh0LnRyYW5zbGF0ZShzaGlmdFgsIHNoaWZ0WSk7XG5cbiAgICAgICAgICB0ZW1wQ2FudmFzQ29udGV4dC5yb3RhdGUoLWVsZW1lbnQuYW5nbGUpO1xuXG4gICAgICAgICAgLy8gU2hpZnQgdGhlIGNhbnZhcyB0byBjZW50ZXIgb2YgYm91bmQgdGV4dFxuICAgICAgICAgIGNvbnN0IFssICwgLCAsIGJvdW5kVGV4dEN4LCBib3VuZFRleHRDeV0gPVxuICAgICAgICAgICAgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGJvdW5kVGV4dEVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dFNoaWZ0WCA9ICh4MSArIHgyKSAvIDIgLSBib3VuZFRleHRDeDtcbiAgICAgICAgICBjb25zdCBib3VuZFRleHRTaGlmdFkgPSAoeTEgKyB5MikgLyAyIC0gYm91bmRUZXh0Q3k7XG4gICAgICAgICAgdGVtcENhbnZhc0NvbnRleHQudHJhbnNsYXRlKC1ib3VuZFRleHRTaGlmdFgsIC1ib3VuZFRleHRTaGlmdFkpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGhlIGJvdW5kIHRleHQgYXJlYVxuICAgICAgICAgIHRlbXBDYW52YXNDb250ZXh0LmNsZWFyUmVjdChcbiAgICAgICAgICAgIC1ib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMixcbiAgICAgICAgICAgIC1ib3VuZFRleHRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgICBib3VuZFRleHRFbGVtZW50LndpZHRoLFxuICAgICAgICAgICAgYm91bmRUZXh0RWxlbWVudC5oZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250ZXh0LnNjYWxlKDEgLyBhcHBTdGF0ZS5leHBvcnRTY2FsZSwgMSAvIGFwcFN0YXRlLmV4cG9ydFNjYWxlKTtcbiAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgICAgIHRlbXBDYW52YXMsXG4gICAgICAgICAgICAtdGVtcENhbnZhcy53aWR0aCAvIDIsXG4gICAgICAgICAgICAtdGVtcENhbnZhcy5oZWlnaHQgLyAyLFxuICAgICAgICAgICAgdGVtcENhbnZhcy53aWR0aCxcbiAgICAgICAgICAgIHRlbXBDYW52YXMuaGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG5cbiAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIC8vIG5vdGU6IHNjYWxlIG11c3QgYmUgYXBwbGllZCAqYWZ0ZXIqIHJvdGF0aW5nXG4gICAgICAgICAgICBjb250ZXh0LnNjYWxlKGVsZW1lbnQuc2NhbGVbMF0sIGVsZW1lbnQuc2NhbGVbMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuICAgICAgICAgIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgcmMsIGNvbnRleHQsIHJlbmRlckNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgLy8gbm90IGV4cG9ydGluZyDihpIgb3B0aW1pemVkIHJlbmRlcmluZyAoY2FjaGUgJiByZW5kZXIgZnJvbSBlbGVtZW50XG4gICAgICAgIC8vIGNhbnZhc2VzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFdpdGhDYW52YXMgPSBnZW5lcmF0ZUVsZW1lbnRXaXRoQ2FudmFzKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgcmVuZGVyQ29uZmlnLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbWFnZVNtb290aGluZ1N0YXR1cyA9IGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyBkbyBub3QgZGlzYWJsZSBzbW9vdGhpbmcgZHVyaW5nIHpvb20gYXMgYmx1cnJ5IHNoYXBlcyBsb29rIGJldHRlclxuICAgICAgICAgIC8vIG9uIGxvdyByZXNvbHV0aW9uICh3aGlsZSBzdGlsbCB6b29taW5nIGluKSB0aGFuIHNoYXJwIG9uZXNcbiAgICAgICAgICAhcmVuZGVyQ29uZmlnPy5zaG91bGRDYWNoZUlnbm9yZVpvb20gJiZcbiAgICAgICAgICAvLyBhbmdsZSBpcyAwIC0+IGFsd2F5cyBkaXNhYmxlIHNtb290aGluZ1xuICAgICAgICAgICghZWxlbWVudC5hbmdsZSB8fFxuICAgICAgICAgICAgLy8gb3IgY2hlY2sgaWYgYW5nbGUgaXMgYSByaWdodCBhbmdsZSBpbiB3aGljaCBjYXNlIHdlIGNhbiBzdGlsbFxuICAgICAgICAgICAgLy8gZGlzYWJsZSBzbW9vdGhpbmcgd2l0aG91dCBhZHZlcnNlbHkgYWZmZWN0aW5nIHRoZSByZXN1bHRcbiAgICAgICAgICAgIGlzUmlnaHRBbmdsZShlbGVtZW50LmFuZ2xlKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gRGlzYWJsaW5nIHNtb290aGluZyBtYWtlcyBvdXRwdXQgbXVjaCBzaGFycGVyLCBlc3BlY2lhbGx5IGZvclxuICAgICAgICAgIC8vIHRleHQuIFVubGVzcyBmb3Igbm9uLXJpZ2h0IGFuZ2xlcywgd2hlcmUgdGhlIGFsaWFzaW5nIGlzIHJlYWxseVxuICAgICAgICAgIC8vIHRlcnJpYmxlIG9uIENocm9taXVtLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IGBjb250ZXh0LmltYWdlU21vb3RoaW5nUXVhbGl0eT1cImhpZ2hcImAgaGFzIGFsbW9zdFxuICAgICAgICAgIC8vIHplcm8gZWZmZWN0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRyYXdFbGVtZW50RnJvbUNhbnZhcyhlbGVtZW50V2l0aENhbnZhcywgcmMsIGNvbnRleHQsIHJlbmRlckNvbmZpZyk7XG5cbiAgICAgICAgLy8gcmVzZXRcbiAgICAgICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBjdXJyZW50SW1hZ2VTbW9vdGhpbmdTdGF0dXM7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uID0gKFxuICByc3ZnOiBSb3VnaFNWRyxcbiAgZHJhd2FibGU6IERyYXdhYmxlLFxuICBwcmVjaXNpb24/OiBudW1iZXIsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBwcmVjaXNpb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gcnN2Zy5kcmF3KGRyYXdhYmxlKTtcbiAgfVxuICBjb25zdCBwc2hhcGU6IERyYXdhYmxlID0ge1xuICAgIHNldHM6IGRyYXdhYmxlLnNldHMsXG4gICAgc2hhcGU6IGRyYXdhYmxlLnNoYXBlLFxuICAgIG9wdGlvbnM6IHsgLi4uZHJhd2FibGUub3B0aW9ucywgZml4ZWREZWNpbWFsUGxhY2VEaWdpdHM6IHByZWNpc2lvbiB9LFxuICB9O1xuICByZXR1cm4gcnN2Zy5kcmF3KHBzaGFwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyRWxlbWVudFRvU3ZnID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHJzdmc6IFJvdWdoU1ZHLFxuICBzdmdSb290OiBTVkdFbGVtZW50LFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIG9mZnNldFg6IG51bWJlcixcbiAgb2Zmc2V0WTogbnVtYmVyLFxuICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuLFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGxldCBjeCA9ICh4MiAtIHgxKSAvIDIgLSAoZWxlbWVudC54IC0geDEpO1xuICBsZXQgY3kgPSAoeTIgLSB5MSkgLyAyIC0gKGVsZW1lbnQueSAtIHkxKTtcbiAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGNvbnRhaW5lcik7XG5cbiAgICAgIGNvbnN0IGJvdW5kVGV4dENvb3JkcyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICAgICk7XG4gICAgICBjeCA9ICh4MiAtIHgxKSAvIDIgLSAoYm91bmRUZXh0Q29vcmRzLnggLSB4MSk7XG4gICAgICBjeSA9ICh5MiAtIHkxKSAvIDIgLSAoYm91bmRUZXh0Q29vcmRzLnkgLSB5MSk7XG4gICAgICBvZmZzZXRYID0gb2Zmc2V0WCArIGJvdW5kVGV4dENvb3Jkcy54IC0gZWxlbWVudC54O1xuICAgICAgb2Zmc2V0WSA9IG9mZnNldFkgKyBib3VuZFRleHRDb29yZHMueSAtIGVsZW1lbnQueTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGVsZW1lbnQuYW5nbGUpIC8gTWF0aC5QSTtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcnN2Zy5nZW5lcmF0b3I7XG5cbiAgLy8gZWxlbWVudCB0byBhcHBlbmQgbm9kZSB0bywgbW9zdCBvZiB0aGUgdGltZSBzdmdSb290XG4gIGxldCByb290ID0gc3ZnUm9vdDtcblxuICAvLyBpZiB0aGUgZWxlbWVudCBoYXMgYSBsaW5rLCBjcmVhdGUgYW4gYW5jaG9yIHRhZyBhbmQgbWFrZSB0aGF0IHRoZSBuZXcgcm9vdFxuICBpZiAoZWxlbWVudC5saW5rKSB7XG4gICAgY29uc3QgYW5jaG9yVGFnID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImFcIik7XG4gICAgYW5jaG9yVGFnLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgZWxlbWVudC5saW5rKTtcbiAgICByb290LmFwcGVuZENoaWxkKGFuY2hvclRhZyk7XG4gICAgcm9vdCA9IGFuY2hvclRhZztcbiAgfVxuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOiB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGlzIHVzZWQgb25seSBkdXJpbmcgZWRpdGluZyBleHBlcmllbmNlLCB3aGljaCBpcyBjYW52YXMgYmFzZWQsXG4gICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3Rpb24gcmVuZGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNWR1wiKTtcbiAgICB9XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGNvbnN0IG5vZGUgPSByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uKFxuICAgICAgICByc3ZnLFxuICAgICAgICBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhLFxuICAgICAgICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gICAgICApO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLWxpbmVjYXBcIiwgXCJyb3VuZFwiKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICApO1xuICAgICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwibGluZVwiOlxuICAgIGNhc2UgXCJhcnJvd1wiOiB7XG4gICAgICBjb25zdCBib3VuZFRleHQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgY29uc3QgbWFza1BhdGggPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwibWFza1wiKTtcbiAgICAgIGlmIChib3VuZFRleHQpIHtcbiAgICAgICAgbWFza1BhdGguc2V0QXR0cmlidXRlKFwiaWRcIiwgYG1hc2stJHtlbGVtZW50LmlkfWApO1xuICAgICAgICBjb25zdCBtYXNrUmVjdFZpc2libGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICBTVkdfTlMsXG4gICAgICAgICAgXCJyZWN0XCIsXG4gICAgICAgICk7XG4gICAgICAgIG9mZnNldFggPSBvZmZzZXRYIHx8IDA7XG4gICAgICAgIG9mZnNldFkgPSBvZmZzZXRZIHx8IDA7XG4gICAgICAgIG1hc2tSZWN0VmlzaWJsZS5zZXRBdHRyaWJ1dGUoXCJ4XCIsIFwiMFwiKTtcbiAgICAgICAgbWFza1JlY3RWaXNpYmxlLnNldEF0dHJpYnV0ZShcInlcIiwgXCIwXCIpO1xuICAgICAgICBtYXNrUmVjdFZpc2libGUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIiNmZmZcIik7XG4gICAgICAgIG1hc2tSZWN0VmlzaWJsZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJ3aWR0aFwiLFxuICAgICAgICAgIGAke2VsZW1lbnQud2lkdGggKyAxMDAgKyBvZmZzZXRYfWAsXG4gICAgICAgICk7XG4gICAgICAgIG1hc2tSZWN0VmlzaWJsZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJoZWlnaHRcIixcbiAgICAgICAgICBgJHtlbGVtZW50LmhlaWdodCArIDEwMCArIG9mZnNldFl9YCxcbiAgICAgICAgKTtcblxuICAgICAgICBtYXNrUGF0aC5hcHBlbmRDaGlsZChtYXNrUmVjdFZpc2libGUpO1xuICAgICAgICBjb25zdCBtYXNrUmVjdEludmlzaWJsZSA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgIFNWR19OUyxcbiAgICAgICAgICBcInJlY3RcIixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYm91bmRUZXh0Q29vcmRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBib3VuZFRleHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbWFza1ggPSBvZmZzZXRYICsgYm91bmRUZXh0Q29vcmRzLnggLSBlbGVtZW50Lng7XG4gICAgICAgIGNvbnN0IG1hc2tZID0gb2Zmc2V0WSArIGJvdW5kVGV4dENvb3Jkcy55IC0gZWxlbWVudC55O1xuXG4gICAgICAgIG1hc2tSZWN0SW52aXNpYmxlLnNldEF0dHJpYnV0ZShcInhcIiwgbWFza1gudG9TdHJpbmcoKSk7XG4gICAgICAgIG1hc2tSZWN0SW52aXNpYmxlLnNldEF0dHJpYnV0ZShcInlcIiwgbWFza1kudG9TdHJpbmcoKSk7XG4gICAgICAgIG1hc2tSZWN0SW52aXNpYmxlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCIjMDAwXCIpO1xuICAgICAgICBtYXNrUmVjdEludmlzaWJsZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHtib3VuZFRleHQud2lkdGh9YCk7XG4gICAgICAgIG1hc2tSZWN0SW52aXNpYmxlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtib3VuZFRleHQuaGVpZ2h0fWApO1xuICAgICAgICBtYXNrUmVjdEludmlzaWJsZS5zZXRBdHRyaWJ1dGUoXCJvcGFjaXR5XCIsIFwiMVwiKTtcbiAgICAgICAgbWFza1BhdGguYXBwZW5kQ2hpbGQobWFza1JlY3RJbnZpc2libGUpO1xuICAgICAgfVxuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGNvbnN0IGdyb3VwID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImdcIik7XG4gICAgICBpZiAoYm91bmRUZXh0KSB7XG4gICAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcIm1hc2tcIiwgYHVybCgjbWFzay0ke2VsZW1lbnQuaWR9KWApO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcInN0cm9rZS1saW5lY2FwXCIsIFwicm91bmRcIik7XG5cbiAgICAgIGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSEuZm9yRWFjaCgoc2hhcGUpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHJvdWdoU1ZHRHJhd1dpdGhQcmVjaXNpb24oXG4gICAgICAgICAgcnN2ZyxcbiAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgICAgfSkgcm90YXRlKCR7ZGVncmVlfSAke2N4fSAke2N5fSlgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJlxuICAgICAgICAgIGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSAmJlxuICAgICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yICE9PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICByb290LmFwcGVuZENoaWxkKGdyb3VwKTtcbiAgICAgIHJvb3QuYXBwZW5kKG1hc2tQYXRoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGdlbmVyYXRlRnJlZURyYXdTaGFwZShlbGVtZW50KTtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gICAgICBjb25zdCBzaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGNvbnN0IG5vZGUgPSBzaGFwZVxuICAgICAgICA/IHJvdWdoU1ZHRHJhd1dpdGhQcmVjaXNpb24ocnN2Zywgc2hhcGUsIE1BWF9ERUNJTUFMU19GT1JfU1ZHX0VYUE9SVClcbiAgICAgICAgOiBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICApO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJub25lXCIpO1xuICAgICAgY29uc3QgcGF0aCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJwYXRoXCIpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGVsZW1lbnQuc3Ryb2tlQ29sb3IpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGdldEZyZWVEcmF3U3ZnUGF0aChlbGVtZW50KSk7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiaW1hZ2VcIjoge1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLnJvdW5kKGVsZW1lbnQud2lkdGgpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5yb3VuZChlbGVtZW50LmhlaWdodCk7XG4gICAgICBjb25zdCBmaWxlRGF0YSA9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiYgZmlsZXNbZWxlbWVudC5maWxlSWRdO1xuICAgICAgaWYgKGZpbGVEYXRhKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbElkID0gYGltYWdlLSR7ZmlsZURhdGEuaWR9YDtcbiAgICAgICAgbGV0IHN5bWJvbCA9IHN2Z1Jvb3QucXVlcnlTZWxlY3RvcihgIyR7c3ltYm9sSWR9YCk7XG4gICAgICAgIGlmICghc3ltYm9sKSB7XG4gICAgICAgICAgc3ltYm9sID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN5bWJvbFwiKTtcbiAgICAgICAgICBzeW1ib2wuaWQgPSBzeW1ib2xJZDtcblxuICAgICAgICAgIGNvbnN0IGltYWdlID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImltYWdlXCIpO1xuXG4gICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAgIGltYWdlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjEwMCVcIik7XG4gICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBmaWxlRGF0YS5kYXRhVVJMKTtcblxuICAgICAgICAgIHN5bWJvbC5hcHBlbmRDaGlsZChpbWFnZSk7XG5cbiAgICAgICAgICByb290LnByZXBlbmQoc3ltYm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZSA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJ1c2VcIik7XG4gICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGAjJHtzeW1ib2xJZH1gKTtcblxuICAgICAgICAvLyBpbiBkYXJrIHRoZW1lLCByZXZlcnQgdGhlIGltYWdlIGNvbG9yIGZpbHRlclxuICAgICAgICBpZiAoZXhwb3J0V2l0aERhcmtNb2RlICYmIGZpbGVEYXRhLm1pbWVUeXBlICE9PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgSU1BR0VfSU5WRVJUX0ZJTFRFUik7XG4gICAgICAgIH1cblxuICAgICAgICB1c2Uuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGh9YCk7XG4gICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0fWApO1xuXG4gICAgICAgIC8vIFdlIGZpcnN0IGFwcGx5IGBzY2FsZWAgdHJhbnNmb3JtcyAoaG9yaXpvbnRhbC92ZXJ0aWNhbCBtaXJyb3JpbmcpXG4gICAgICAgIC8vIG9uIHRoZSA8dXNlPiBlbGVtZW50LCB0aGVuIGFwcGx5IHRyYW5zbGF0aW9uIGFuZCByb3RhdGlvblxuICAgICAgICAvLyBvbiB0aGUgPGc+IGVsZW1lbnQgd2hpY2ggd3JhcHMgdGhlIDx1c2U+LlxuICAgICAgICAvLyBEb2luZyB0aGlzIHNlcGFyYXRlbHkgaXMgYSBxdWljayBoYWNrIHRvIHRvIHdvcmsgYXJvdW5kIGNvbXBvc2l0aW5nXG4gICAgICAgIC8vIHRoZSB0cmFuc2Zvcm1hdGlvbnMgY29ycmVjdGx5ICh0aGUgdHJhbnNmb3JtLW9yaWdpbiB3YXMgbm90IGJlaW5nXG4gICAgICAgIC8vIGFwcGxpZWQgY29ycmVjdGx5KS5cbiAgICAgICAgaWYgKGVsZW1lbnQuc2NhbGVbMF0gIT09IDEgfHwgZWxlbWVudC5zY2FsZVsxXSAhPT0gMSkge1xuICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZVggPSBlbGVtZW50LnNjYWxlWzBdICE9PSAxID8gLXdpZHRoIDogMDtcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGVZID0gZWxlbWVudC5zY2FsZVsxXSAhPT0gMSA/IC1oZWlnaHQgOiAwO1xuICAgICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgYHNjYWxlKCR7ZWxlbWVudC5zY2FsZVswXX0sICR7ZWxlbWVudC5zY2FsZVsxXX0pIHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9ICR7dHJhbnNsYXRlWX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZyA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJnXCIpO1xuICAgICAgICBnLmFwcGVuZENoaWxkKHVzZSk7XG4gICAgICAgIGcuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgICAgYHRyYW5zbGF0ZSgke29mZnNldFggfHwgMH0gJHtcbiAgICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICAgKTtcblxuICAgICAgICByb290LmFwcGVuZENoaWxkKGcpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IG9wYWNpdHkgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcInN0cm9rZS1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgICAgYHRyYW5zbGF0ZSgke29mZnNldFggfHwgMH0gJHtcbiAgICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBlbGVtZW50LnRleHQucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodFB4ID0gZ2V0TGluZUhlaWdodEluUHgoXG4gICAgICAgICAgZWxlbWVudC5mb250U2l6ZSxcbiAgICAgICAgICBlbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPVxuICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgICAgICA/IGVsZW1lbnQud2lkdGggLyAyXG4gICAgICAgICAgICA6IGVsZW1lbnQudGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aFxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1JUTChlbGVtZW50LnRleHQpID8gXCJydGxcIiA6IFwibHRyXCI7XG4gICAgICAgIGNvbnN0IHRleHRBbmNob3IgPVxuICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgICAgICA/IFwibWlkZGxlXCJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIiB8fCBkaXJlY3Rpb24gPT09IFwicnRsXCJcbiAgICAgICAgICAgID8gXCJlbmRcIlxuICAgICAgICAgICAgOiBcInN0YXJ0XCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInRleHRcIik7XG4gICAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IGxpbmVzW2ldO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwieFwiLCBgJHtob3Jpem9udGFsT2Zmc2V0fWApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwieVwiLCBgJHtpICogbGluZUhlaWdodFB4fWApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZm9udC1mYW1pbHlcIiwgZ2V0Rm9udEZhbWlseVN0cmluZyhlbGVtZW50KSk7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJmb250LXNpemVcIiwgYCR7ZWxlbWVudC5mb250U2l6ZX1weGApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBlbGVtZW50LnN0cm9rZUNvbG9yKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcInRleHQtYW5jaG9yXCIsIHRleHRBbmNob3IpO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJ3aGl0ZS1zcGFjZTogcHJlO1wiKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcImRpcmVjdGlvblwiLCBkaXJlY3Rpb24pO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZG9taW5hbnQtYmFzZWxpbmVcIiwgXCJ0ZXh0LWJlZm9yZS1lZGdlXCIpO1xuICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgbGV0IHBhdGhzQ2FjaGUgPSBuZXcgV2Vha01hcDxFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LCBQYXRoMkQ+KFtdKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRnJlZURyYXdTaGFwZShlbGVtZW50OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50KSB7XG4gIGNvbnN0IHN2Z1BhdGhEYXRhID0gZ2V0RnJlZURyYXdTdmdQYXRoKGVsZW1lbnQpO1xuICBjb25zdCBwYXRoID0gbmV3IFBhdGgyRChzdmdQYXRoRGF0YSk7XG4gIHBhdGhzQ2FjaGUuc2V0KGVsZW1lbnQsIHBhdGgpO1xuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyZWVEcmF3UGF0aDJEKGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQpIHtcbiAgcmV0dXJuIHBhdGhzQ2FjaGUuZ2V0KGVsZW1lbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJlZURyYXdTdmdQYXRoKGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQpIHtcbiAgLy8gSWYgaW5wdXQgcG9pbnRzIGFyZSBlbXB0eSAoc2hvdWxkIHRoZXkgZXZlciBiZT8pIHJldHVybiBhIGRvdFxuICBjb25zdCBpbnB1dFBvaW50cyA9IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgID8gZWxlbWVudC5wb2ludHNcbiAgICA6IGVsZW1lbnQucG9pbnRzLmxlbmd0aFxuICAgID8gZWxlbWVudC5wb2ludHMubWFwKChbeCwgeV0sIGkpID0+IFt4LCB5LCBlbGVtZW50LnByZXNzdXJlc1tpXV0pXG4gICAgOiBbWzAsIDAsIDAuNV1dO1xuXG4gIC8vIENvbnNpZGVyIGNoYW5naW5nIHRoZSBvcHRpb25zIGZvciBzaW11bGF0ZWQgcHJlc3N1cmUgdnMgcmVhbCBwcmVzc3VyZVxuICBjb25zdCBvcHRpb25zOiBTdHJva2VPcHRpb25zID0ge1xuICAgIHNpbXVsYXRlUHJlc3N1cmU6IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSxcbiAgICBzaXplOiBlbGVtZW50LnN0cm9rZVdpZHRoICogNC4yNSxcbiAgICB0aGlubmluZzogMC42LFxuICAgIHNtb290aGluZzogMC41LFxuICAgIHN0cmVhbWxpbmU6IDAuNSxcbiAgICBlYXNpbmc6ICh0KSA9PiBNYXRoLnNpbigodCAqIE1hdGguUEkpIC8gMiksIC8vIGh0dHBzOi8vZWFzaW5ncy5uZXQvI2Vhc2VPdXRTaW5lXG4gICAgbGFzdDogISFlbGVtZW50Lmxhc3RDb21taXR0ZWRQb2ludCwgLy8gTGFzdENvbW1pdHRlZFBvaW50IGlzIGFkZGVkIG9uIHBvaW50ZXJ1cFxuICB9O1xuXG4gIHJldHVybiBnZXRTdmdQYXRoRnJvbVN0cm9rZShnZXRTdHJva2UoaW5wdXRQb2ludHMgYXMgbnVtYmVyW11bXSwgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBtZWQoQTogbnVtYmVyW10sIEI6IG51bWJlcltdKSB7XG4gIHJldHVybiBbKEFbMF0gKyBCWzBdKSAvIDIsIChBWzFdICsgQlsxXSkgLyAyXTtcbn1cblxuLy8gVHJpbSBTVkcgcGF0aCBkYXRhIHNvIG51bWJlciBhcmUgZWFjaCB0d28gZGVjaW1hbCBwb2ludHMuIFRoaXNcbi8vIGltcHJvdmVzIFNWRyBleHBvcnRzLCBhbmQgcHJldmVudHMgcmVuZGVyaW5nIGVycm9ycyBvbiBwb2ludHNcbi8vIHdpdGggbG9uZyBkZWNpbWFscy5cbmNvbnN0IFRPX0ZJWEVEX1BSRUNJU0lPTiA9IC8oXFxzP1tBLVpdPyw/LT9bMC05XSpcXC5bMC05XXswLDJ9KSgoWzAtOV18ZXwtKSopL2c7XG5cbmZ1bmN0aW9uIGdldFN2Z1BhdGhGcm9tU3Ryb2tlKHBvaW50czogbnVtYmVyW11bXSk6IHN0cmluZyB7XG4gIGlmICghcG9pbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3QgbWF4ID0gcG9pbnRzLmxlbmd0aCAtIDE7XG5cbiAgcmV0dXJuIHBvaW50c1xuICAgIC5yZWR1Y2UoXG4gICAgICAoYWNjLCBwb2ludCwgaSwgYXJyKSA9PiB7XG4gICAgICAgIGlmIChpID09PSBtYXgpIHtcbiAgICAgICAgICBhY2MucHVzaChwb2ludCwgbWVkKHBvaW50LCBhcnJbMF0pLCBcIkxcIiwgYXJyWzBdLCBcIlpcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjLnB1c2gocG9pbnQsIG1lZChwb2ludCwgYXJyW2kgKyAxXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgW1wiTVwiLCBwb2ludHNbMF0sIFwiUVwiXSxcbiAgICApXG4gICAgLmpvaW4oXCIgXCIpXG4gICAgLnJlcGxhY2UoVE9fRklYRURfUFJFQ0lTSU9OLCBcIiQxXCIpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../renderer/renderElement.ts\n");
|
|
3629
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"DEFAULT_LINK_SIZE\": () => (/* binding */ DEFAULT_LINK_SIZE),\n/* harmony export */ \"clearRenderCache\": () => (/* binding */ clearRenderCache),\n/* harmony export */ \"generateFreeDrawShape\": () => (/* binding */ generateFreeDrawShape),\n/* harmony export */ \"generateRoughOptions\": () => (/* binding */ generateRoughOptions),\n/* harmony export */ \"getFreeDrawPath2D\": () => (/* binding */ getFreeDrawPath2D),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* binding */ getFreeDrawSvgPath),\n/* harmony export */ \"getShapeForElement\": () => (/* binding */ getShapeForElement),\n/* harmony export */ \"invalidateShapeForElement\": () => (/* binding */ invalidateShapeForElement),\n/* harmony export */ \"pathsCache\": () => (/* binding */ pathsCache),\n/* harmony export */ \"renderElement\": () => (/* binding */ renderElement),\n/* harmony export */ \"renderElementToSvg\": () => (/* binding */ renderElementToSvg),\n/* harmony export */ \"setShapeForElement\": () => (/* binding */ setShapeForElement)\n/* harmony export */ });\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var perfect_freehand__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! perfect-freehand */ \"../../../node_modules/perfect-freehand/dist/esm/index.js\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n\n\n\n\n\n\n\n\n\n\n// using a stronger invert (100% vs our regular 93%) and saturate\n// as a temp hack to make images in dark theme look closer to original\n// color scheme (it's still not quite there and the colors look slightly\n// desatured, alas...)\nconst IMAGE_INVERT_FILTER = \"invert(100%) hue-rotate(180deg) saturate(1.25)\";\nconst defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\nconst isPendingImageElement = (element, renderConfig) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) &&\n !renderConfig.imageCache.has(element.fileId);\nconst shouldResetImageFilter = (element, renderConfig) => {\n var _a;\n return (renderConfig.theme === \"dark\" &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) &&\n !isPendingImageElement(element, renderConfig) &&\n ((_a = renderConfig.imageCache.get(element.fileId)) === null || _a === void 0 ? void 0 : _a.mimeType) !== _constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg);\n};\nconst getDashArrayDashed = (strokeWidth) => [8, 8 + strokeWidth];\nconst getDashArrayDotted = (strokeWidth) => [1.5, 6 + strokeWidth];\nconst getCanvasPadding = (element) => element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\nconst cappedElementCanvasSize = (element, zoom) => {\n // these limits are ballpark, they depend on specific browsers and device.\n // We've chosen lower limits to be safe. We might want to change these limits\n // based on browser/device type, if we get reports of low quality rendering\n // on zoom.\n //\n // ~ safari mobile canvas area limit\n const AREA_LIMIT = 16777216;\n // ~ safari width/height limit based on developer.mozilla.org.\n const WIDTH_HEIGHT_LIMIT = 32767;\n const padding = getCanvasPadding(element);\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const elementWidth = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2)\n : element.width;\n const elementHeight = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2)\n : element.height;\n let width = elementWidth * window.devicePixelRatio + padding * 2;\n let height = elementHeight * window.devicePixelRatio + padding * 2;\n let scale = zoom.value;\n // rescale to ensure width and height is within limits\n if (width * scale > WIDTH_HEIGHT_LIMIT ||\n height * scale > WIDTH_HEIGHT_LIMIT) {\n scale = Math.min(WIDTH_HEIGHT_LIMIT / width, WIDTH_HEIGHT_LIMIT / height);\n }\n // rescale to ensure canvas area is within limits\n if (width * height * scale * scale > AREA_LIMIT) {\n scale = Math.sqrt(AREA_LIMIT / (width * height));\n }\n width = Math.floor(width * scale);\n height = Math.floor(height * scale);\n return { width, height, scale };\n};\nconst generateElementCanvas = (element, zoom, renderConfig) => {\n var _a;\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n const padding = getCanvasPadding(element);\n const { width, height, scale } = cappedElementCanvasSize(element, zoom);\n canvas.width = width;\n canvas.height = height;\n let canvasOffsetX = 0;\n let canvasOffsetY = 0;\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\n const [x1, y1] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n canvasOffsetX =\n element.x > x1\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.x, x1) * window.devicePixelRatio * scale\n : 0;\n canvasOffsetY =\n element.y > y1\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.y, y1) * window.devicePixelRatio * scale\n : 0;\n context.translate(canvasOffsetX, canvasOffsetY);\n }\n context.save();\n context.translate(padding * scale, padding * scale);\n context.scale(window.devicePixelRatio * scale, window.devicePixelRatio * scale);\n const rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__[\"default\"].canvas(canvas);\n // in dark theme, revert the image color filter\n if (shouldResetImageFilter(element, renderConfig)) {\n context.filter = IMAGE_INVERT_FILTER;\n }\n drawElementOnCanvas(element, rc, context, renderConfig);\n context.restore();\n return {\n element,\n canvas,\n theme: renderConfig.theme,\n scale,\n canvasOffsetX,\n canvasOffsetY,\n boundTextElementVersion: ((_a = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element)) === null || _a === void 0 ? void 0 : _a.version) || null,\n };\n};\nconst DEFAULT_LINK_SIZE = 14;\nconst IMAGE_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_PLACEHOLDER_IMG.src = `data:${_constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg},${encodeURIComponent(`<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"image\" class=\"svg-inline--fa fa-image fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"#888\" d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"></path></svg>`)}`;\nconst IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_ERROR_PLACEHOLDER_IMG.src = `data:${_constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg},${encodeURIComponent(`<svg viewBox=\"0 0 668 668\" xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2\"><path d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48ZM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56ZM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.81709 0 0 .81709 124.825 145.825)\"/><path d=\"M256 8C119.034 8 8 119.033 8 256c0 136.967 111.034 248 248 248s248-111.034 248-248S392.967 8 256 8Zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676ZM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.30366 0 0 .30366 506.822 60.065)\"/></svg>`)}`;\nconst drawImagePlaceholder = (element, context, zoomValue) => {\n context.fillStyle = \"#E7E7E7\";\n context.fillRect(0, 0, element.width, element.height);\n const imageMinWidthOrHeight = Math.min(element.width, element.height);\n const size = Math.min(imageMinWidthOrHeight, Math.min(imageMinWidthOrHeight * 0.4, 100));\n context.drawImage(element.status === \"error\"\n ? IMAGE_ERROR_PLACEHOLDER_IMG\n : IMAGE_PLACEHOLDER_IMG, element.width / 2 - size / 2, element.height / 2 - size / 2, size, size);\n};\nconst drawElementOnCanvas = (element, rc, context, renderConfig) => {\n var _a;\n context.globalAlpha = element.opacity / 100;\n switch (element.type) {\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n rc.draw(getShapeForElement(element));\n break;\n }\n case \"arrow\":\n case \"line\": {\n context.lineJoin = \"round\";\n context.lineCap = \"round\";\n getShapeForElement(element).forEach((shape) => {\n rc.draw(shape);\n });\n break;\n }\n case \"freedraw\": {\n // Draw directly to canvas\n context.save();\n context.fillStyle = element.strokeColor;\n const path = getFreeDrawPath2D(element);\n const fillShape = getShapeForElement(element);\n if (fillShape) {\n rc.draw(fillShape);\n }\n context.fillStyle = element.strokeColor;\n context.fill(path);\n context.restore();\n break;\n }\n case \"image\": {\n const img = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element)\n ? (_a = renderConfig.imageCache.get(element.fileId)) === null || _a === void 0 ? void 0 : _a.image\n : undefined;\n if (img != null && !(img instanceof Promise)) {\n context.drawImage(img, 0 /* hardcoded for the selection box*/, 0, element.width, element.height);\n }\n else {\n drawImagePlaceholder(element, context, renderConfig.zoom.value);\n }\n break;\n }\n default: {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\n const rtl = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text);\n const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\n if (shouldTemporarilyAttach) {\n // to correctly render RTL text mixed with LTR, we have to append it\n // to the DOM\n document.body.appendChild(context.canvas);\n }\n context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\n context.save();\n context.font = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element);\n context.fillStyle = element.strokeColor;\n context.textAlign = element.textAlign;\n // Canvas does not support multiline text by default\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const horizontalOffset = element.textAlign === \"center\"\n ? element.width / 2\n : element.textAlign === \"right\"\n ? element.width\n : 0;\n const lineHeightPx = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getLineHeightInPx)(element.fontSize, element.lineHeight);\n const verticalOffset = element.height - element.baseline;\n for (let index = 0; index < lines.length; index++) {\n context.fillText(lines[index], horizontalOffset, (index + 1) * lineHeightPx - verticalOffset);\n }\n context.restore();\n if (shouldTemporarilyAttach) {\n context.canvas.remove();\n }\n }\n else {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n }\n context.globalAlpha = 1;\n};\nlet elementWithCanvasCache = new WeakMap();\nlet shapeCache = new WeakMap();\nconst getShapeForElement = (element) => shapeCache.get(element);\nconst setShapeForElement = (element, shape) => shapeCache.set(element, shape);\nconst invalidateShapeForElement = (element) => shapeCache.delete(element);\nconst clearRenderCache = () => {\n elementWithCanvasCache = new WeakMap();\n shapeCache = new WeakMap();\n pathsCache = new WeakMap();\n};\nconst generateRoughOptions = (element, continuousPath = false) => {\n const options = {\n seed: element.seed,\n strokeLineDash: element.strokeStyle === \"dashed\"\n ? getDashArrayDashed(element.strokeWidth)\n : element.strokeStyle === \"dotted\"\n ? getDashArrayDotted(element.strokeWidth)\n : undefined,\n // for non-solid strokes, disable multiStroke because it tends to make\n // dashes/dots overlay each other\n disableMultiStroke: element.strokeStyle !== \"solid\",\n // for non-solid strokes, increase the width a bit to make it visually\n // similar to solid strokes, because we're also disabling multiStroke\n strokeWidth: element.strokeStyle !== \"solid\"\n ? element.strokeWidth + 0.5\n : element.strokeWidth,\n // when increasing strokeWidth, we must explicitly set fillWeight and\n // hachureGap because if not specified, roughjs uses strokeWidth to\n // calculate them (and we don't want the fills to be modified)\n fillWeight: element.strokeWidth / 2,\n hachureGap: element.strokeWidth * 4,\n roughness: element.roughness,\n stroke: element.strokeColor,\n preserveVertices: continuousPath,\n };\n switch (element.type) {\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n options.fillStyle = element.fillStyle;\n options.fill =\n element.backgroundColor === \"transparent\"\n ? undefined\n : element.backgroundColor;\n if (element.type === \"ellipse\") {\n options.curveFitting = 1;\n }\n return options;\n }\n case \"line\":\n case \"freedraw\": {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points)) {\n options.fillStyle = element.fillStyle;\n options.fill =\n element.backgroundColor === \"transparent\"\n ? undefined\n : element.backgroundColor;\n }\n return options;\n }\n case \"arrow\":\n return options;\n default: {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\n/**\n * Generates the element's shape and puts it into the cache.\n * @param element\n * @param generator\n */\nconst generateElementShape = (element, generator) => {\n let shape = shapeCache.get(element);\n // `null` indicates no rc shape applicable for this element type\n // (= do not generate anything)\n if (shape === undefined) {\n elementWithCanvasCache.delete(element);\n switch (element.type) {\n case \"rectangle\":\n if (element.roundness) {\n const w = element.width;\n const h = element.height;\n const r = (0,_math__WEBPACK_IMPORTED_MODULE_3__.getCornerRadius)(Math.min(w, h), element);\n shape = generator.path(`M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${h - r} Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${h - r} L 0 ${r} Q 0 0, ${r} 0`, generateRoughOptions(element, true));\n }\n else {\n shape = generator.rectangle(0, 0, element.width, element.height, generateRoughOptions(element));\n }\n setShapeForElement(element, shape);\n break;\n case \"diamond\": {\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getDiamondPoints)(element);\n if (element.roundness) {\n const verticalRadius = (0,_math__WEBPACK_IMPORTED_MODULE_3__.getCornerRadius)(Math.abs(topX - leftX), element);\n const horizontalRadius = (0,_math__WEBPACK_IMPORTED_MODULE_3__.getCornerRadius)(Math.abs(rightY - topY), element);\n shape = generator.path(`M ${topX + verticalRadius} ${topY + horizontalRadius} L ${rightX - verticalRadius} ${rightY - horizontalRadius}\n C ${rightX} ${rightY}, ${rightX} ${rightY}, ${rightX - verticalRadius} ${rightY + horizontalRadius}\n L ${bottomX + verticalRadius} ${bottomY - horizontalRadius}\n C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${bottomX - verticalRadius} ${bottomY - horizontalRadius}\n L ${leftX + verticalRadius} ${leftY + horizontalRadius}\n C ${leftX} ${leftY}, ${leftX} ${leftY}, ${leftX + verticalRadius} ${leftY - horizontalRadius}\n L ${topX - verticalRadius} ${topY + horizontalRadius}\n C ${topX} ${topY}, ${topX} ${topY}, ${topX + verticalRadius} ${topY + horizontalRadius}`, generateRoughOptions(element, true));\n }\n else {\n shape = generator.polygon([\n [topX, topY],\n [rightX, rightY],\n [bottomX, bottomY],\n [leftX, leftY],\n ], generateRoughOptions(element));\n }\n setShapeForElement(element, shape);\n break;\n }\n case \"ellipse\":\n shape = generator.ellipse(element.width / 2, element.height / 2, element.width, element.height, generateRoughOptions(element));\n setShapeForElement(element, shape);\n break;\n case \"line\":\n case \"arrow\": {\n const options = generateRoughOptions(element);\n // points array can be empty in the beginning, so it is important to add\n // initial position to it\n const points = element.points.length ? element.points : [[0, 0]];\n // curve is always the first element\n // this simplifies finding the curve for an element\n if (!element.roundness) {\n if (options.fill) {\n shape = [generator.polygon(points, options)];\n }\n else {\n shape = [\n generator.linearPath(points, options),\n ];\n }\n }\n else {\n shape = [generator.curve(points, options)];\n }\n // add lines only in arrow\n if (element.type === \"arrow\") {\n const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\n const getArrowheadShapes = (element, shape, position, arrowhead) => {\n const arrowheadPoints = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getArrowheadPoints)(element, shape, position, arrowhead);\n if (arrowheadPoints === null) {\n return [];\n }\n // Other arrowheads here...\n if (arrowhead === \"dot\") {\n const [x, y, r] = arrowheadPoints;\n return [\n generator.circle(x, y, r, Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\", stroke: \"none\" })),\n ];\n }\n if (arrowhead === \"triangle\") {\n const [x, y, x2, y2, x3, y3] = arrowheadPoints;\n // always use solid stroke for triangle arrowhead\n delete options.strokeLineDash;\n return [\n generator.polygon([\n [x, y],\n [x2, y2],\n [x3, y3],\n [x, y],\n ], Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\" })),\n ];\n }\n // Arrow arrowheads\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\n if (element.strokeStyle === \"dotted\") {\n // for dotted arrows caps, reduce gap to make it more legible\n const dash = getDashArrayDotted(element.strokeWidth - 1);\n options.strokeLineDash = [dash[0], dash[1] - 1];\n }\n else {\n // for solid/dashed, keep solid arrow cap\n delete options.strokeLineDash;\n }\n return [\n generator.line(x3, y3, x2, y2, options),\n generator.line(x4, y4, x2, y2, options),\n ];\n };\n if (startArrowhead !== null) {\n const shapes = getArrowheadShapes(element, shape, \"start\", startArrowhead);\n shape.push(...shapes);\n }\n if (endArrowhead !== null) {\n if (endArrowhead === undefined) {\n // Hey, we have an old arrow here!\n }\n const shapes = getArrowheadShapes(element, shape, \"end\", endArrowhead);\n shape.push(...shapes);\n }\n }\n setShapeForElement(element, shape);\n break;\n }\n case \"freedraw\": {\n generateFreeDrawShape(element);\n if ((0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points)) {\n // generate rough polygon to fill freedraw shape\n shape = generator.polygon(element.points, Object.assign(Object.assign({}, generateRoughOptions(element)), { stroke: \"none\" }));\n }\n else {\n shape = null;\n }\n setShapeForElement(element, shape);\n break;\n }\n case \"text\":\n case \"image\": {\n // just to ensure we don't regenerate element.canvas on rerenders\n setShapeForElement(element, null);\n break;\n }\n }\n }\n};\nconst generateElementWithCanvas = (element, renderConfig) => {\n var _a;\n const zoom = renderConfig ? renderConfig.zoom : defaultAppState.zoom;\n const prevElementWithCanvas = elementWithCanvasCache.get(element);\n const shouldRegenerateBecauseZoom = prevElementWithCanvas &&\n prevElementWithCanvas.scale !== zoom.value &&\n !(renderConfig === null || renderConfig === void 0 ? void 0 : renderConfig.shouldCacheIgnoreZoom);\n const boundTextElementVersion = ((_a = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element)) === null || _a === void 0 ? void 0 : _a.version) || null;\n if (!prevElementWithCanvas ||\n shouldRegenerateBecauseZoom ||\n prevElementWithCanvas.theme !== renderConfig.theme ||\n prevElementWithCanvas.boundTextElementVersion !== boundTextElementVersion) {\n const elementWithCanvas = generateElementCanvas(element, zoom, renderConfig);\n elementWithCanvasCache.set(element, elementWithCanvas);\n return elementWithCanvas;\n }\n return prevElementWithCanvas;\n};\nconst drawElementFromCanvas = (elementWithCanvas, rc, context, renderConfig) => {\n const element = elementWithCanvas.element;\n const padding = getCanvasPadding(element);\n const zoom = elementWithCanvas.scale;\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n // Free draw elements will otherwise \"shuffle\" as the min x and y change\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\n x1 = Math.floor(x1);\n x2 = Math.ceil(x2);\n y1 = Math.floor(y1);\n y2 = Math.ceil(y2);\n }\n const cx = ((x1 + x2) / 2 + renderConfig.scrollX) * window.devicePixelRatio;\n const cy = ((y1 + y2) / 2 + renderConfig.scrollY) * window.devicePixelRatio;\n context.save();\n context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio);\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isArrowElement)(element) && boundTextElement) {\n const tempCanvas = document.createElement(\"canvas\");\n const tempCanvasContext = tempCanvas.getContext(\"2d\");\n // Take max dimensions of arrow canvas so that when canvas is rotated\n // the arrow doesn't get clipped\n const maxDim = Math.max((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2), (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2));\n tempCanvas.width =\n maxDim * window.devicePixelRatio * zoom +\n padding * elementWithCanvas.scale * 10;\n tempCanvas.height =\n maxDim * window.devicePixelRatio * zoom +\n padding * elementWithCanvas.scale * 10;\n const offsetX = (tempCanvas.width - elementWithCanvas.canvas.width) / 2;\n const offsetY = (tempCanvas.height - elementWithCanvas.canvas.height) / 2;\n tempCanvasContext.translate(tempCanvas.width / 2, tempCanvas.height / 2);\n tempCanvasContext.rotate(element.angle);\n tempCanvasContext.drawImage(elementWithCanvas.canvas, -elementWithCanvas.canvas.width / 2, -elementWithCanvas.canvas.height / 2, elementWithCanvas.canvas.width, elementWithCanvas.canvas.height);\n const [, , , , boundTextCx, boundTextCy] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(boundTextElement);\n tempCanvasContext.rotate(-element.angle);\n // Shift the canvas to the center of the bound text element\n const shiftX = tempCanvas.width / 2 -\n (boundTextCx - x1) * window.devicePixelRatio * zoom -\n offsetX -\n padding * zoom;\n const shiftY = tempCanvas.height / 2 -\n (boundTextCy - y1) * window.devicePixelRatio * zoom -\n offsetY -\n padding * zoom;\n tempCanvasContext.translate(-shiftX, -shiftY);\n // Clear the bound text area\n tempCanvasContext.clearRect(-(boundTextElement.width / 2 + _constants__WEBPACK_IMPORTED_MODULE_6__.BOUND_TEXT_PADDING) *\n window.devicePixelRatio *\n zoom, -(boundTextElement.height / 2 + _constants__WEBPACK_IMPORTED_MODULE_6__.BOUND_TEXT_PADDING) *\n window.devicePixelRatio *\n zoom, (boundTextElement.width + _constants__WEBPACK_IMPORTED_MODULE_6__.BOUND_TEXT_PADDING * 2) *\n window.devicePixelRatio *\n zoom, (boundTextElement.height + _constants__WEBPACK_IMPORTED_MODULE_6__.BOUND_TEXT_PADDING * 2) *\n window.devicePixelRatio *\n zoom);\n context.translate(cx, cy);\n context.drawImage(tempCanvas, (-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding, (-(y2 - y1) / 2) * window.devicePixelRatio - offsetY / zoom - padding, tempCanvas.width / zoom, tempCanvas.height / zoom);\n }\n else {\n // we translate context to element center so that rotation and scale\n // originates from the element center\n context.translate(cx, cy);\n context.rotate(element.angle);\n if (\"scale\" in elementWithCanvas.element &&\n !isPendingImageElement(element, renderConfig)) {\n context.scale(elementWithCanvas.element.scale[0], elementWithCanvas.element.scale[1]);\n }\n // revert afterwards we don't have account for it during drawing\n context.translate(-cx, -cy);\n context.drawImage(elementWithCanvas.canvas, (x1 + renderConfig.scrollX) * window.devicePixelRatio -\n (padding * elementWithCanvas.scale) / elementWithCanvas.scale, (y1 + renderConfig.scrollY) * window.devicePixelRatio -\n (padding * elementWithCanvas.scale) / elementWithCanvas.scale, elementWithCanvas.canvas.width / elementWithCanvas.scale, elementWithCanvas.canvas.height / elementWithCanvas.scale);\n if (false) {}\n }\n context.restore();\n // Clear the nested element we appended to the DOM\n};\nconst renderElement = (element, rc, context, renderConfig, appState) => {\n const generator = rc.generator;\n switch (element.type) {\n case \"selection\": {\n context.save();\n context.translate(element.x + renderConfig.scrollX, element.y + renderConfig.scrollY);\n context.fillStyle = \"rgba(0, 0, 200, 0.04)\";\n // render from 0.5px offset to get 1px wide line\n // https://stackoverflow.com/questions/7530593/html5-canvas-and-line-width/7531540#7531540\n // TODO can be be improved by offseting to the negative when user selects\n // from right to left\n const offset = 0.5 / renderConfig.zoom.value;\n context.fillRect(offset, offset, element.width, element.height);\n context.lineWidth = 1 / renderConfig.zoom.value;\n context.strokeStyle = \"rgb(105, 101, 219)\";\n context.strokeRect(offset, offset, element.width, element.height);\n context.restore();\n break;\n }\n case \"freedraw\": {\n generateElementShape(element, generator);\n if (renderConfig.isExporting) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2 + renderConfig.scrollX;\n const cy = (y1 + y2) / 2 + renderConfig.scrollY;\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\n context.save();\n context.translate(cx, cy);\n context.rotate(element.angle);\n context.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, rc, context, renderConfig);\n context.restore();\n }\n else {\n const elementWithCanvas = generateElementWithCanvas(element, renderConfig);\n drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig);\n }\n break;\n }\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\":\n case \"line\":\n case \"arrow\":\n case \"image\":\n case \"text\": {\n generateElementShape(element, generator);\n if (renderConfig.isExporting) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2 + renderConfig.scrollX;\n const cy = (y1 + y2) / 2 + renderConfig.scrollY;\n let shiftX = (x2 - x1) / 2 - (element.x - x1);\n let shiftY = (y2 - y1) / 2 - (element.y - y1);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\n const container = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(element);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isArrowElement)(container)) {\n const boundTextCoords = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(container, element);\n shiftX = (x2 - x1) / 2 - (boundTextCoords.x - x1);\n shiftY = (y2 - y1) / 2 - (boundTextCoords.y - y1);\n }\n }\n context.save();\n context.translate(cx, cy);\n if (shouldResetImageFilter(element, renderConfig)) {\n context.filter = \"none\";\n }\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isArrowElement)(element) && boundTextElement) {\n const tempCanvas = document.createElement(\"canvas\");\n const tempCanvasContext = tempCanvas.getContext(\"2d\");\n // Take max dimensions of arrow canvas so that when canvas is rotated\n // the arrow doesn't get clipped\n const maxDim = Math.max((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2), (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2));\n const padding = getCanvasPadding(element);\n tempCanvas.width =\n maxDim * appState.exportScale + padding * 10 * appState.exportScale;\n tempCanvas.height =\n maxDim * appState.exportScale + padding * 10 * appState.exportScale;\n tempCanvasContext.translate(tempCanvas.width / 2, tempCanvas.height / 2);\n tempCanvasContext.scale(appState.exportScale, appState.exportScale);\n // Shift the canvas to left most point of the arrow\n shiftX = element.width / 2 - (element.x - x1);\n shiftY = element.height / 2 - (element.y - y1);\n tempCanvasContext.rotate(element.angle);\n const tempRc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__[\"default\"].canvas(tempCanvas);\n tempCanvasContext.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, tempRc, tempCanvasContext, renderConfig);\n tempCanvasContext.translate(shiftX, shiftY);\n tempCanvasContext.rotate(-element.angle);\n // Shift the canvas to center of bound text\n const [, , , , boundTextCx, boundTextCy] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(boundTextElement);\n const boundTextShiftX = (x1 + x2) / 2 - boundTextCx;\n const boundTextShiftY = (y1 + y2) / 2 - boundTextCy;\n tempCanvasContext.translate(-boundTextShiftX, -boundTextShiftY);\n // Clear the bound text area\n tempCanvasContext.clearRect(-boundTextElement.width / 2, -boundTextElement.height / 2, boundTextElement.width, boundTextElement.height);\n context.scale(1 / appState.exportScale, 1 / appState.exportScale);\n context.drawImage(tempCanvas, -tempCanvas.width / 2, -tempCanvas.height / 2, tempCanvas.width, tempCanvas.height);\n }\n else {\n context.rotate(element.angle);\n if (element.type === \"image\") {\n // note: scale must be applied *after* rotating\n context.scale(element.scale[0], element.scale[1]);\n }\n context.translate(-shiftX, -shiftY);\n drawElementOnCanvas(element, rc, context, renderConfig);\n }\n context.restore();\n // not exporting → optimized rendering (cache & render from element\n // canvases)\n }\n else {\n const elementWithCanvas = generateElementWithCanvas(element, renderConfig);\n const currentImageSmoothingStatus = context.imageSmoothingEnabled;\n if (\n // do not disable smoothing during zoom as blurry shapes look better\n // on low resolution (while still zooming in) than sharp ones\n !(renderConfig === null || renderConfig === void 0 ? void 0 : renderConfig.shouldCacheIgnoreZoom) &&\n // angle is 0 -> always disable smoothing\n (!element.angle ||\n // or check if angle is a right angle in which case we can still\n // disable smoothing without adversely affecting the result\n (0,_math__WEBPACK_IMPORTED_MODULE_3__.isRightAngle)(element.angle))) {\n // Disabling smoothing makes output much sharper, especially for\n // text. Unless for non-right angles, where the aliasing is really\n // terrible on Chromium.\n //\n // Note that `context.imageSmoothingQuality=\"high\"` has almost\n // zero effect.\n //\n context.imageSmoothingEnabled = false;\n }\n drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig);\n // reset\n context.imageSmoothingEnabled = currentImageSmoothingStatus;\n }\n break;\n }\n default: {\n // @ts-ignore\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\nconst roughSVGDrawWithPrecision = (rsvg, drawable, precision) => {\n if (typeof precision === \"undefined\") {\n return rsvg.draw(drawable);\n }\n const pshape = {\n sets: drawable.sets,\n shape: drawable.shape,\n options: Object.assign(Object.assign({}, drawable.options), { fixedDecimalPlaceDigits: precision }),\n };\n return rsvg.draw(pshape);\n};\nconst renderElementToSvg = (element, rsvg, svgRoot, files, offsetX, offsetY, exportWithDarkMode) => {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n let cx = (x2 - x1) / 2 - (element.x - x1);\n let cy = (y2 - y1) / 2 - (element.y - y1);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\n const container = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getContainerElement)(element);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isArrowElement)(container)) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(container);\n const boundTextCoords = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(container, element);\n cx = (x2 - x1) / 2 - (boundTextCoords.x - x1);\n cy = (y2 - y1) / 2 - (boundTextCoords.y - y1);\n offsetX = offsetX + boundTextCoords.x - element.x;\n offsetY = offsetY + boundTextCoords.y - element.y;\n }\n }\n const degree = (180 * element.angle) / Math.PI;\n const generator = rsvg.generator;\n // element to append node to, most of the time svgRoot\n let root = svgRoot;\n // if the element has a link, create an anchor tag and make that the new root\n if (element.link) {\n const anchorTag = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"a\");\n anchorTag.setAttribute(\"href\", element.link);\n root.appendChild(anchorTag);\n root = anchorTag;\n }\n switch (element.type) {\n case \"selection\": {\n // Since this is used only during editing experience, which is canvas based,\n // this should not happen\n throw new Error(\"Selection rendering is not supported for SVG\");\n }\n case \"rectangle\":\n case \"diamond\":\n case \"ellipse\": {\n generateElementShape(element, generator);\n const node = roughSVGDrawWithPrecision(rsvg, getShapeForElement(element), _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT);\n const opacity = element.opacity / 100;\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"stroke-linecap\", \"round\");\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n root.appendChild(node);\n break;\n }\n case \"line\":\n case \"arrow\": {\n const boundText = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getBoundTextElement)(element);\n const maskPath = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"mask\");\n if (boundText) {\n maskPath.setAttribute(\"id\", `mask-${element.id}`);\n const maskRectVisible = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"rect\");\n offsetX = offsetX || 0;\n offsetY = offsetY || 0;\n maskRectVisible.setAttribute(\"x\", \"0\");\n maskRectVisible.setAttribute(\"y\", \"0\");\n maskRectVisible.setAttribute(\"fill\", \"#fff\");\n maskRectVisible.setAttribute(\"width\", `${element.width + 100 + offsetX}`);\n maskRectVisible.setAttribute(\"height\", `${element.height + 100 + offsetY}`);\n maskPath.appendChild(maskRectVisible);\n const maskRectInvisible = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"rect\");\n const boundTextCoords = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(element, boundText);\n const maskX = offsetX + boundTextCoords.x - element.x;\n const maskY = offsetY + boundTextCoords.y - element.y;\n maskRectInvisible.setAttribute(\"x\", maskX.toString());\n maskRectInvisible.setAttribute(\"y\", maskY.toString());\n maskRectInvisible.setAttribute(\"fill\", \"#000\");\n maskRectInvisible.setAttribute(\"width\", `${boundText.width}`);\n maskRectInvisible.setAttribute(\"height\", `${boundText.height}`);\n maskRectInvisible.setAttribute(\"opacity\", \"1\");\n maskPath.appendChild(maskRectInvisible);\n }\n generateElementShape(element, generator);\n const group = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\n if (boundText) {\n group.setAttribute(\"mask\", `url(#mask-${element.id})`);\n }\n const opacity = element.opacity / 100;\n group.setAttribute(\"stroke-linecap\", \"round\");\n getShapeForElement(element).forEach((shape) => {\n const node = roughSVGDrawWithPrecision(rsvg, shape, _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT);\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n if (element.type === \"line\" &&\n (0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points) &&\n element.backgroundColor !== \"transparent\") {\n node.setAttribute(\"fill-rule\", \"evenodd\");\n }\n group.appendChild(node);\n });\n root.appendChild(group);\n root.append(maskPath);\n break;\n }\n case \"freedraw\": {\n generateElementShape(element, generator);\n generateFreeDrawShape(element);\n const opacity = element.opacity / 100;\n const shape = getShapeForElement(element);\n const node = shape\n ? roughSVGDrawWithPrecision(rsvg, shape, _constants__WEBPACK_IMPORTED_MODULE_6__.MAX_DECIMALS_FOR_SVG_EXPORT)\n : svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n node.setAttribute(\"stroke\", \"none\");\n const path = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"path\");\n path.setAttribute(\"fill\", element.strokeColor);\n path.setAttribute(\"d\", getFreeDrawSvgPath(element));\n node.appendChild(path);\n root.appendChild(node);\n break;\n }\n case \"image\": {\n const width = Math.round(element.width);\n const height = Math.round(element.height);\n const fileData = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isInitializedImageElement)(element) && files[element.fileId];\n if (fileData) {\n const symbolId = `image-${fileData.id}`;\n let symbol = svgRoot.querySelector(`#${symbolId}`);\n if (!symbol) {\n symbol = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"symbol\");\n symbol.id = symbolId;\n const image = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"image\");\n image.setAttribute(\"width\", \"100%\");\n image.setAttribute(\"height\", \"100%\");\n image.setAttribute(\"href\", fileData.dataURL);\n symbol.appendChild(image);\n root.prepend(symbol);\n }\n const use = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"use\");\n use.setAttribute(\"href\", `#${symbolId}`);\n // in dark theme, revert the image color filter\n if (exportWithDarkMode && fileData.mimeType !== _constants__WEBPACK_IMPORTED_MODULE_6__.MIME_TYPES.svg) {\n use.setAttribute(\"filter\", IMAGE_INVERT_FILTER);\n }\n use.setAttribute(\"width\", `${width}`);\n use.setAttribute(\"height\", `${height}`);\n // We first apply `scale` transforms (horizontal/vertical mirroring)\n // on the <use> element, then apply translation and rotation\n // on the <g> element which wraps the <use>.\n // Doing this separately is a quick hack to to work around compositing\n // the transformations correctly (the transform-origin was not being\n // applied correctly).\n if (element.scale[0] !== 1 || element.scale[1] !== 1) {\n const translateX = element.scale[0] !== 1 ? -width : 0;\n const translateY = element.scale[1] !== 1 ? -height : 0;\n use.setAttribute(\"transform\", `scale(${element.scale[0]}, ${element.scale[1]}) translate(${translateX} ${translateY})`);\n }\n const g = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\n g.appendChild(use);\n g.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n root.appendChild(g);\n }\n break;\n }\n default: {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\n const opacity = element.opacity / 100;\n const node = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"g\");\n if (opacity !== 1) {\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\n node.setAttribute(\"fill-opacity\", `${opacity}`);\n }\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const lineHeightPx = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_8__.getLineHeightInPx)(element.fontSize, element.lineHeight);\n const horizontalOffset = element.textAlign === \"center\"\n ? element.width / 2\n : element.textAlign === \"right\"\n ? element.width\n : 0;\n const direction = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text) ? \"rtl\" : \"ltr\";\n const textAnchor = element.textAlign === \"center\"\n ? \"middle\"\n : element.textAlign === \"right\" || direction === \"rtl\"\n ? \"end\"\n : \"start\";\n for (let i = 0; i < lines.length; i++) {\n const text = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_6__.SVG_NS, \"text\");\n text.textContent = lines[i];\n text.setAttribute(\"x\", `${horizontalOffset}`);\n text.setAttribute(\"y\", `${i * lineHeightPx}`);\n text.setAttribute(\"font-family\", (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontFamilyString)(element));\n text.setAttribute(\"font-size\", `${element.fontSize}px`);\n text.setAttribute(\"fill\", element.strokeColor);\n text.setAttribute(\"text-anchor\", textAnchor);\n text.setAttribute(\"style\", \"white-space: pre;\");\n text.setAttribute(\"direction\", direction);\n text.setAttribute(\"dominant-baseline\", \"text-before-edge\");\n node.appendChild(text);\n }\n root.appendChild(node);\n }\n else {\n // @ts-ignore\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n }\n};\nlet pathsCache = new WeakMap([]);\nfunction generateFreeDrawShape(element) {\n const svgPathData = getFreeDrawSvgPath(element);\n const path = new Path2D(svgPathData);\n pathsCache.set(element, path);\n return path;\n}\nfunction getFreeDrawPath2D(element) {\n return pathsCache.get(element);\n}\nfunction getFreeDrawSvgPath(element) {\n // If input points are empty (should they ever be?) return a dot\n const inputPoints = element.simulatePressure\n ? element.points\n : element.points.length\n ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\n : [[0, 0, 0.5]];\n // Consider changing the options for simulated pressure vs real pressure\n const options = {\n simulatePressure: element.simulatePressure,\n size: element.strokeWidth * 4.25,\n thinning: 0.6,\n smoothing: 0.5,\n streamline: 0.5,\n easing: (t) => Math.sin((t * Math.PI) / 2),\n last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup\n };\n return getSvgPathFromStroke((0,perfect_freehand__WEBPACK_IMPORTED_MODULE_7__.getStroke)(inputPoints, options));\n}\nfunction med(A, B) {\n return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];\n}\n// Trim SVG path data so number are each two decimal points. This\n// improves SVG exports, and prevents rendering errors on points\n// with long decimals.\nconst TO_FIXED_PRECISION = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g;\nfunction getSvgPathFromStroke(points) {\n if (!points.length) {\n return \"\";\n }\n const max = points.length - 1;\n return points\n .reduce((acc, point, i, arr) => {\n if (i === max) {\n acc.push(point, med(point, arr[0]), \"L\", arr[0], \"Z\");\n }\n else {\n acc.push(point, med(point, arr[i + 1]));\n }\n return acc;\n }, [\"M\", points[0], \"Q\"])\n .join(\" \")\n .replace(TO_FIXED_PRECISION, \"$1\");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUNsQixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFOUIsT0FBTyxNQUFNO1NBQ1YsTUFBTSxDQUNMLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUN0QjtTQUNBLElBQUksQ0FBQyxHQUFHLENBQUM7U0FDVCxPQUFPLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50LnRzP2E2ZGMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEFycm93aGVhZCxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNUZXh0RWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50LFxuICBpc0ZyZWVEcmF3RWxlbWVudCxcbiAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudCxcbiAgaXNBcnJvd0VsZW1lbnQsXG4gIGhhc0JvdW5kVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7XG4gIGdldERpYW1vbmRQb2ludHMsXG4gIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyxcbiAgZ2V0QXJyb3doZWFkUG9pbnRzLFxufSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IFJvdWdoQ2FudmFzIH0gZnJvbSBcInJvdWdoanMvYmluL2NhbnZhc1wiO1xuaW1wb3J0IHsgRHJhd2FibGUsIE9wdGlvbnMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY29yZVwiO1xuaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tIFwicm91Z2hqcy9iaW4vc3ZnXCI7XG5pbXBvcnQgeyBSb3VnaEdlbmVyYXRvciB9IGZyb20gXCJyb3VnaGpzL2Jpbi9nZW5lcmF0b3JcIjtcblxuaW1wb3J0IHsgUmVuZGVyQ29uZmlnIH0gZnJvbSBcIi4uL3NjZW5lL3R5cGVzXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSwgZ2V0Rm9udFN0cmluZywgZ2V0Rm9udEZhbWlseVN0cmluZywgaXNSVEwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGdldENvcm5lclJhZGl1cywgaXNQYXRoQUxvb3AsIGlzUmlnaHRBbmdsZSB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMsIFpvb20gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHtcbiAgQk9VTkRfVEVYVF9QQURESU5HLFxuICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gIE1JTUVfVFlQRVMsXG4gIFNWR19OUyxcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0U3Ryb2tlLCBTdHJva2VPcHRpb25zIH0gZnJvbSBcInBlcmZlY3QtZnJlZWhhbmRcIjtcbmltcG9ydCB7XG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG4gIGdldENvbnRhaW5lckNvb3JkcyxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgZ2V0TGluZUhlaWdodEluUHgsXG4gIGdldE1heENvbnRhaW5lckhlaWdodCxcbiAgZ2V0TWF4Q29udGFpbmVyV2lkdGgsXG59IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4uL2VsZW1lbnQvbGluZWFyRWxlbWVudEVkaXRvclwiO1xuXG4vLyB1c2luZyBhIHN0cm9uZ2VyIGludmVydCAoMTAwJSB2cyBvdXIgcmVndWxhciA5MyUpIGFuZCBzYXR1cmF0ZVxuLy8gYXMgYSB0ZW1wIGhhY2sgdG8gbWFrZSBpbWFnZXMgaW4gZGFyayB0aGVtZSBsb29rIGNsb3NlciB0byBvcmlnaW5hbFxuLy8gY29sb3Igc2NoZW1lIChpdCdzIHN0aWxsIG5vdCBxdWl0ZSB0aGVyZSBhbmQgdGhlIGNvbG9ycyBsb29rIHNsaWdodGx5XG4vLyBkZXNhdHVyZWQsIGFsYXMuLi4pXG5jb25zdCBJTUFHRV9JTlZFUlRfRklMVEVSID0gXCJpbnZlcnQoMTAwJSkgaHVlLXJvdGF0ZSgxODBkZWcpIHNhdHVyYXRlKDEuMjUpXCI7XG5cbmNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG5jb25zdCBpc1BlbmRpbmdJbWFnZUVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICByZW5kZXJDb25maWc6IFJlbmRlckNvbmZpZyxcbikgPT5cbiAgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChlbGVtZW50KSAmJlxuICAhcmVuZGVyQ29uZmlnLmltYWdlQ2FjaGUuaGFzKGVsZW1lbnQuZmlsZUlkKTtcblxuY29uc3Qgc2hvdWxkUmVzZXRJbWFnZUZpbHRlciA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHJlbmRlckNvbmZpZzogUmVuZGVyQ29uZmlnLFxuKSA9PiB7XG4gIHJldHVybiAoXG4gICAgcmVuZGVyQ29uZmlnLnRoZW1lID09PSBcImRhcmtcIiAmJlxuICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAhaXNQZW5kaW5nSW1hZ2VFbGVtZW50KGVsZW1lbnQsIHJlbmRlckNvbmZpZykgJiZcbiAgICByZW5kZXJDb25maWcuaW1hZ2VDYWNoZS5nZXQoZWxlbWVudC5maWxlSWQpPy5taW1lVHlwZSAhPT0gTUlNRV9UWVBFUy5zdmdcbiAgKTtcbn07XG5cbmNvbnN0IGdldERhc2hBcnJheURhc2hlZCA9IChzdHJva2VXaWR0aDogbnVtYmVyKSA9PiBbOCwgOCArIHN0cm9rZVdpZHRoXTtcblxuY29uc3QgZ2V0RGFzaEFycmF5RG90dGVkID0gKHN0cm9rZVdpZHRoOiBudW1iZXIpID0+IFsxLjUsIDYgKyBzdHJva2VXaWR0aF07XG5cbmNvbnN0IGdldENhbnZhc1BhZGRpbmcgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+XG4gIGVsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiID8gZWxlbWVudC5zdHJva2VXaWR0aCAqIDEyIDogMjA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjYWxpZHJhd0VsZW1lbnRXaXRoQ2FudmFzIHtcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHRoZW1lOiBSZW5kZXJDb25maWdbXCJ0aGVtZVwiXTtcbiAgc2NhbGU6IG51bWJlcjtcbiAgY2FudmFzT2Zmc2V0WDogbnVtYmVyO1xuICBjYW52YXNPZmZzZXRZOiBudW1iZXI7XG4gIGJvdW5kVGV4dEVsZW1lbnRWZXJzaW9uOiBudW1iZXIgfCBudWxsO1xufVxuXG5jb25zdCBjYXBwZWRFbGVtZW50Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICB6b29tOiBab29tLFxuKToge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgc2NhbGU6IG51bWJlcjtcbn0gPT4ge1xuICAvLyB0aGVzZSBsaW1pdHMgYXJlIGJhbGxwYXJrLCB0aGV5IGRlcGVuZCBvbiBzcGVjaWZpYyBicm93c2VycyBhbmQgZGV2aWNlLlxuICAvLyBXZSd2ZSBjaG9zZW4gbG93ZXIgbGltaXRzIHRvIGJlIHNhZmUuIFdlIG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoZXNlIGxpbWl0c1xuICAvLyBiYXNlZCBvbiBicm93c2VyL2RldmljZSB0eXBlLCBpZiB3ZSBnZXQgcmVwb3J0cyBvZiBsb3cgcXVhbGl0eSByZW5kZXJpbmdcbiAgLy8gb24gem9vbS5cbiAgLy9cbiAgLy8gfiBzYWZhcmkgbW9iaWxlIGNhbnZhcyBhcmVhIGxpbWl0XG4gIGNvbnN0IEFSRUFfTElNSVQgPSAxNjc3NzIxNjtcbiAgLy8gfiBzYWZhcmkgd2lkdGgvaGVpZ2h0IGxpbWl0IGJhc2VkIG9uIGRldmVsb3Blci5tb3ppbGxhLm9yZy5cbiAgY29uc3QgV0lEVEhfSEVJR0hUX0xJTUlUID0gMzI3Njc7XG5cbiAgY29uc3QgcGFkZGluZyA9IGdldENhbnZhc1BhZGRpbmcoZWxlbWVudCk7XG5cbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgZWxlbWVudFdpZHRoID1cbiAgICBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudClcbiAgICAgID8gZGlzdGFuY2UoeDEsIHgyKVxuICAgICAgOiBlbGVtZW50LndpZHRoO1xuICBjb25zdCBlbGVtZW50SGVpZ2h0ID1cbiAgICBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudClcbiAgICAgID8gZGlzdGFuY2UoeTEsIHkyKVxuICAgICAgOiBlbGVtZW50LmhlaWdodDtcblxuICBsZXQgd2lkdGggPSBlbGVtZW50V2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyArIHBhZGRpbmcgKiAyO1xuICBsZXQgaGVpZ2h0ID0gZWxlbWVudEhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICsgcGFkZGluZyAqIDI7XG5cbiAgbGV0IHNjYWxlOiBudW1iZXIgPSB6b29tLnZhbHVlO1xuXG4gIC8vIHJlc2NhbGUgdG8gZW5zdXJlIHdpZHRoIGFuZCBoZWlnaHQgaXMgd2l0aGluIGxpbWl0c1xuICBpZiAoXG4gICAgd2lkdGggKiBzY2FsZSA+IFdJRFRIX0hFSUdIVF9MSU1JVCB8fFxuICAgIGhlaWdodCAqIHNjYWxlID4gV0lEVEhfSEVJR0hUX0xJTUlUXG4gICkge1xuICAgIHNjYWxlID0gTWF0aC5taW4oV0lEVEhfSEVJR0hUX0xJTUlUIC8gd2lkdGgsIFdJRFRIX0hFSUdIVF9MSU1JVCAvIGhlaWdodCk7XG4gIH1cblxuICAvLyByZXNjYWxlIHRvIGVuc3VyZSBjYW52YXMgYXJlYSBpcyB3aXRoaW4gbGltaXRzXG4gIGlmICh3aWR0aCAqIGhlaWdodCAqIHNjYWxlICogc2NhbGUgPiBBUkVBX0xJTUlUKSB7XG4gICAgc2NhbGUgPSBNYXRoLnNxcnQoQVJFQV9MSU1JVCAvICh3aWR0aCAqIGhlaWdodCkpO1xuICB9XG5cbiAgd2lkdGggPSBNYXRoLmZsb29yKHdpZHRoICogc2NhbGUpO1xuICBoZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAqIHNjYWxlKTtcblxuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0LCBzY2FsZSB9O1xufTtcblxuY29uc3QgZ2VuZXJhdGVFbGVtZW50Q2FudmFzID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHpvb206IFpvb20sXG4gIHJlbmRlckNvbmZpZzogUmVuZGVyQ29uZmlnLFxuKTogRXhjYWxpZHJhd0VsZW1lbnRXaXRoQ2FudmFzID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuICBjb25zdCBwYWRkaW5nID0gZ2V0Q2FudmFzUGFkZGluZyhlbGVtZW50KTtcblxuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHNjYWxlIH0gPSBjYXBwZWRFbGVtZW50Q2FudmFzU2l6ZShlbGVtZW50LCB6b29tKTtcblxuICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICBsZXQgY2FudmFzT2Zmc2V0WCA9IDA7XG4gIGxldCBjYW52YXNPZmZzZXRZID0gMDtcblxuICBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3QgW3gxLCB5MV0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG5cbiAgICBjYW52YXNPZmZzZXRYID1cbiAgICAgIGVsZW1lbnQueCA+IHgxXG4gICAgICAgID8gZGlzdGFuY2UoZWxlbWVudC54LCB4MSkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHNjYWxlXG4gICAgICAgIDogMDtcblxuICAgIGNhbnZhc09mZnNldFkgPVxuICAgICAgZWxlbWVudC55ID4geTFcbiAgICAgICAgPyBkaXN0YW5jZShlbGVtZW50LnksIHkxKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogc2NhbGVcbiAgICAgICAgOiAwO1xuXG4gICAgY29udGV4dC50cmFuc2xhdGUoY2FudmFzT2Zmc2V0WCwgY2FudmFzT2Zmc2V0WSk7XG4gIH1cblxuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC50cmFuc2xhdGUocGFkZGluZyAqIHNjYWxlLCBwYWRkaW5nICogc2NhbGUpO1xuICBjb250ZXh0LnNjYWxlKFxuICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogc2NhbGUsXG4gICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiBzY2FsZSxcbiAgKTtcblxuICBjb25zdCByYyA9IHJvdWdoLmNhbnZhcyhjYW52YXMpO1xuXG4gIC8vIGluIGRhcmsgdGhlbWUsIHJldmVydCB0aGUgaW1hZ2UgY29sb3IgZmlsdGVyXG4gIGlmIChzaG91bGRSZXNldEltYWdlRmlsdGVyKGVsZW1lbnQsIHJlbmRlckNvbmZpZykpIHtcbiAgICBjb250ZXh0LmZpbHRlciA9IElNQUdFX0lOVkVSVF9GSUxURVI7XG4gIH1cblxuICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0LCByZW5kZXJDb25maWcpO1xuICBjb250ZXh0LnJlc3RvcmUoKTtcblxuICByZXR1cm4ge1xuICAgIGVsZW1lbnQsXG4gICAgY2FudmFzLFxuICAgIHRoZW1lOiByZW5kZXJDb25maWcudGhlbWUsXG4gICAgc2NhbGUsXG4gICAgY2FudmFzT2Zmc2V0WCxcbiAgICBjYW52YXNPZmZzZXRZLFxuICAgIGJvdW5kVGV4dEVsZW1lbnRWZXJzaW9uOiBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpPy52ZXJzaW9uIHx8IG51bGwsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9MSU5LX1NJWkUgPSAxNDtcblxuY29uc3QgSU1BR0VfUExBQ0VIT0xERVJfSU1HID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbklNQUdFX1BMQUNFSE9MREVSX0lNRy5zcmMgPSBgZGF0YToke01JTUVfVFlQRVMuc3ZnfSwke2VuY29kZVVSSUNvbXBvbmVudChcbiAgYDxzdmcgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIiBkYXRhLXByZWZpeD1cImZhc1wiIGRhdGEtaWNvbj1cImltYWdlXCIgY2xhc3M9XCJzdmctaW5saW5lLS1mYSBmYS1pbWFnZSBmYS13LTE2XCIgcm9sZT1cImltZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIj48cGF0aCBmaWxsPVwiIzg4OFwiIGQ9XCJNNDY0IDQ0OEg0OGMtMjYuNTEgMC00OC0yMS40OS00OC00OFYxMTJjMC0yNi41MSAyMS40OS00OCA0OC00OGg0MTZjMjYuNTEgMCA0OCAyMS40OSA0OCA0OHYyODhjMCAyNi41MS0yMS40OSA0OC00OCA0OHpNMTEyIDEyMGMtMzAuOTI4IDAtNTYgMjUuMDcyLTU2IDU2czI1LjA3MiA1NiA1NiA1NiA1Ni0yNS4wNzIgNTYtNTYtMjUuMDcyLTU2LTU2LTU2ek02NCAzODRoMzg0VjI3MmwtODcuNTE1LTg3LjUxNWMtNC42ODYtNC42ODYtMTIuMjg0LTQuNjg2LTE2Ljk3MSAwTDIwOCAzMjBsLTU1LjUxNS01NS41MTVjLTQuNjg2LTQuNjg2LTEyLjI4NC00LjY4Ni0xNi45NzEgMEw2NCAzMzZ2NDh6XCI+PC9wYXRoPjwvc3ZnPmAsXG4pfWA7XG5cbmNvbnN0IElNQUdFX0VSUk9SX1BMQUNFSE9MREVSX0lNRyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG5JTUFHRV9FUlJPUl9QTEFDRUhPTERFUl9JTUcuc3JjID0gYGRhdGE6JHtNSU1FX1RZUEVTLnN2Z30sJHtlbmNvZGVVUklDb21wb25lbnQoXG4gIGA8c3ZnIHZpZXdCb3g9XCIwIDAgNjY4IDY2OFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIHN0eWxlPVwiZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjJcIj48cGF0aCBkPVwiTTQ2NCA0NDhINDhjLTI2LjUxIDAtNDgtMjEuNDktNDgtNDhWMTEyYzAtMjYuNTEgMjEuNDktNDggNDgtNDhoNDE2YzI2LjUxIDAgNDggMjEuNDkgNDggNDh2Mjg4YzAgMjYuNTEtMjEuNDkgNDgtNDggNDhaTTExMiAxMjBjLTMwLjkyOCAwLTU2IDI1LjA3Mi01NiA1NnMyNS4wNzIgNTYgNTYgNTYgNTYtMjUuMDcyIDU2LTU2LTI1LjA3Mi01Ni01Ni01NlpNNjQgMzg0aDM4NFYyNzJsLTg3LjUxNS04Ny41MTVjLTQuNjg2LTQuNjg2LTEyLjI4NC00LjY4Ni0xNi45NzEgMEwyMDggMzIwbC01NS41MTUtNTUuNTE1Yy00LjY4Ni00LjY4Ni0xMi4yODQtNC42ODYtMTYuOTcxIDBMNjQgMzM2djQ4WlwiIHN0eWxlPVwiZmlsbDojODg4O2ZpbGwtcnVsZTpub256ZXJvXCIgdHJhbnNmb3JtPVwibWF0cml4KC44MTcwOSAwIDAgLjgxNzA5IDEyNC44MjUgMTQ1LjgyNSlcIi8+PHBhdGggZD1cIk0yNTYgOEMxMTkuMDM0IDggOCAxMTkuMDMzIDggMjU2YzAgMTM2Ljk2NyAxMTEuMDM0IDI0OCAyNDggMjQ4czI0OC0xMTEuMDM0IDI0OC0yNDhTMzkyLjk2NyA4IDI1NiA4Wm0xMzAuMTA4IDExNy44OTJjNjUuNDQ4IDY1LjQ0OCA3MCAxNjUuNDgxIDIwLjY3NyAyMzUuNjM3TDE1MC40NyAxMDUuMjE2YzcwLjIwNC00OS4zNTYgMTcwLjIyNi00NC43MzUgMjM1LjYzOCAyMC42NzZaTTEyNS44OTIgMzg2LjEwOGMtNjUuNDQ4LTY1LjQ0OC03MC0xNjUuNDgxLTIwLjY3Ny0yMzUuNjM3TDM2MS41MyA0MDYuNzg0Yy03MC4yMDMgNDkuMzU2LTE3MC4yMjYgNDQuNzM2LTIzNS42MzgtMjAuNjc2WlwiIHN0eWxlPVwiZmlsbDojODg4O2ZpbGwtcnVsZTpub256ZXJvXCIgdHJhbnNmb3JtPVwibWF0cml4KC4zMDM2NiAwIDAgLjMwMzY2IDUwNi44MjIgNjAuMDY1KVwiLz48L3N2Zz5gLFxuKX1gO1xuXG5jb25zdCBkcmF3SW1hZ2VQbGFjZWhvbGRlciA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICB6b29tVmFsdWU6IEFwcFN0YXRlW1wiem9vbVwiXVtcInZhbHVlXCJdLFxuKSA9PiB7XG4gIGNvbnRleHQuZmlsbFN0eWxlID0gXCIjRTdFN0U3XCI7XG4gIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgZWxlbWVudC53aWR0aCwgZWxlbWVudC5oZWlnaHQpO1xuXG4gIGNvbnN0IGltYWdlTWluV2lkdGhPckhlaWdodCA9IE1hdGgubWluKGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcblxuICBjb25zdCBzaXplID0gTWF0aC5taW4oXG4gICAgaW1hZ2VNaW5XaWR0aE9ySGVpZ2h0LFxuICAgIE1hdGgubWluKGltYWdlTWluV2lkdGhPckhlaWdodCAqIDAuNCwgMTAwKSxcbiAgKTtcblxuICBjb250ZXh0LmRyYXdJbWFnZShcbiAgICBlbGVtZW50LnN0YXR1cyA9PT0gXCJlcnJvclwiXG4gICAgICA/IElNQUdFX0VSUk9SX1BMQUNFSE9MREVSX0lNR1xuICAgICAgOiBJTUFHRV9QTEFDRUhPTERFUl9JTUcsXG4gICAgZWxlbWVudC53aWR0aCAvIDIgLSBzaXplIC8gMixcbiAgICBlbGVtZW50LmhlaWdodCAvIDIgLSBzaXplIC8gMixcbiAgICBzaXplLFxuICAgIHNpemUsXG4gICk7XG59O1xuY29uc3QgZHJhd0VsZW1lbnRPbkNhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgcmVuZGVyQ29uZmlnOiBSZW5kZXJDb25maWcsXG4pID0+IHtcbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICBjYXNlIFwiZWxsaXBzZVwiOiB7XG4gICAgICBjb250ZXh0LmxpbmVKb2luID0gXCJyb3VuZFwiO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuICAgICAgcmMuZHJhdyhnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwibGluZVwiOiB7XG4gICAgICBjb250ZXh0LmxpbmVKb2luID0gXCJyb3VuZFwiO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuXG4gICAgICBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhLmZvckVhY2goKHNoYXBlKSA9PiB7XG4gICAgICAgIHJjLmRyYXcoc2hhcGUpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIC8vIERyYXcgZGlyZWN0bHkgdG8gY2FudmFzXG4gICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZWxlbWVudC5zdHJva2VDb2xvcjtcblxuICAgICAgY29uc3QgcGF0aCA9IGdldEZyZWVEcmF3UGF0aDJEKGVsZW1lbnQpIGFzIFBhdGgyRDtcbiAgICAgIGNvbnN0IGZpbGxTaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgaWYgKGZpbGxTaGFwZSkge1xuICAgICAgICByYy5kcmF3KGZpbGxTaGFwZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZWxlbWVudC5zdHJva2VDb2xvcjtcbiAgICAgIGNvbnRleHQuZmlsbChwYXRoKTtcblxuICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImltYWdlXCI6IHtcbiAgICAgIGNvbnN0IGltZyA9IGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudClcbiAgICAgICAgPyByZW5kZXJDb25maWcuaW1hZ2VDYWNoZS5nZXQoZWxlbWVudC5maWxlSWQpPy5pbWFnZVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChpbWcgIT0gbnVsbCAmJiAhKGltZyBpbnN0YW5jZW9mIFByb21pc2UpKSB7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgICAgIGltZyxcbiAgICAgICAgICAwIC8qIGhhcmRjb2RlZCBmb3IgdGhlIHNlbGVjdGlvbiBib3gqLyxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgZWxlbWVudC5oZWlnaHQsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcmF3SW1hZ2VQbGFjZWhvbGRlcihlbGVtZW50LCBjb250ZXh0LCByZW5kZXJDb25maWcuem9vbS52YWx1ZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgcnRsID0gaXNSVEwoZWxlbWVudC50ZXh0KTtcbiAgICAgICAgY29uc3Qgc2hvdWxkVGVtcG9yYXJpbHlBdHRhY2ggPSBydGwgJiYgIWNvbnRleHQuY2FudmFzLmlzQ29ubmVjdGVkO1xuICAgICAgICBpZiAoc2hvdWxkVGVtcG9yYXJpbHlBdHRhY2gpIHtcbiAgICAgICAgICAvLyB0byBjb3JyZWN0bHkgcmVuZGVyIFJUTCB0ZXh0IG1peGVkIHdpdGggTFRSLCB3ZSBoYXZlIHRvIGFwcGVuZCBpdFxuICAgICAgICAgIC8vIHRvIHRoZSBET01cbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRleHQuY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJkaXJcIiwgcnRsID8gXCJydGxcIiA6IFwibHRyXCIpO1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC5mb250ID0gZ2V0Rm9udFN0cmluZyhlbGVtZW50KTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBlbGVtZW50LnN0cm9rZUNvbG9yO1xuICAgICAgICBjb250ZXh0LnRleHRBbGlnbiA9IGVsZW1lbnQudGV4dEFsaWduIGFzIENhbnZhc1RleHRBbGlnbjtcblxuICAgICAgICAvLyBDYW52YXMgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aWxpbmUgdGV4dCBieSBkZWZhdWx0XG4gICAgICAgIGNvbnN0IGxpbmVzID0gZWxlbWVudC50ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG5cbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9XG4gICAgICAgICAgZWxlbWVudC50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aCAvIDJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgICAgICAgICAgPyBlbGVtZW50LndpZHRoXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGxpbmVIZWlnaHRQeCA9IGdldExpbmVIZWlnaHRJblB4KFxuICAgICAgICAgIGVsZW1lbnQuZm9udFNpemUsXG4gICAgICAgICAgZWxlbWVudC5saW5lSGVpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbE9mZnNldCA9IGVsZW1lbnQuaGVpZ2h0IC0gZWxlbWVudC5iYXNlbGluZTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICBsaW5lc1tpbmRleF0sXG4gICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0LFxuICAgICAgICAgICAgKGluZGV4ICsgMSkgKiBsaW5lSGVpZ2h0UHggLSB2ZXJ0aWNhbE9mZnNldCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICBpZiAoc2hvdWxkVGVtcG9yYXJpbHlBdHRhY2gpIHtcbiAgICAgICAgICBjb250ZXh0LmNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSAxO1xufTtcblxubGV0IGVsZW1lbnRXaXRoQ2FudmFzQ2FjaGUgPSBuZXcgV2Vha01hcDxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhc1xuPigpO1xuXG5sZXQgc2hhcGVDYWNoZSA9IG5ldyBXZWFrTWFwPEV4Y2FsaWRyYXdFbGVtZW50LCBFbGVtZW50U2hhcGU+KCk7XG5cbnR5cGUgRWxlbWVudFNoYXBlID0gRHJhd2FibGUgfCBEcmF3YWJsZVtdIHwgbnVsbDtcblxudHlwZSBFbGVtZW50U2hhcGVzID0ge1xuICBmcmVlZHJhdzogRHJhd2FibGUgfCBudWxsO1xuICBhcnJvdzogRHJhd2FibGVbXTtcbiAgbGluZTogRHJhd2FibGVbXTtcbiAgdGV4dDogbnVsbDtcbiAgaW1hZ2U6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2hhcGVGb3JFbGVtZW50ID0gPFQgZXh0ZW5kcyBFeGNhbGlkcmF3RWxlbWVudD4oZWxlbWVudDogVCkgPT5cbiAgc2hhcGVDYWNoZS5nZXQoZWxlbWVudCkgYXMgVFtcInR5cGVcIl0gZXh0ZW5kcyBrZXlvZiBFbGVtZW50U2hhcGVzXG4gICAgPyBFbGVtZW50U2hhcGVzW1RbXCJ0eXBlXCJdXSB8IHVuZGVmaW5lZFxuICAgIDogRHJhd2FibGUgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgY29uc3Qgc2V0U2hhcGVGb3JFbGVtZW50ID0gPFQgZXh0ZW5kcyBFeGNhbGlkcmF3RWxlbWVudD4oXG4gIGVsZW1lbnQ6IFQsXG4gIHNoYXBlOiBUW1widHlwZVwiXSBleHRlbmRzIGtleW9mIEVsZW1lbnRTaGFwZXNcbiAgICA/IEVsZW1lbnRTaGFwZXNbVFtcInR5cGVcIl1dXG4gICAgOiBEcmF3YWJsZSxcbikgPT4gc2hhcGVDYWNoZS5zZXQoZWxlbWVudCwgc2hhcGUpO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT5cbiAgc2hhcGVDYWNoZS5kZWxldGUoZWxlbWVudCk7XG5cbmV4cG9ydCBjb25zdCBjbGVhclJlbmRlckNhY2hlID0gKCkgPT4ge1xuICBlbGVtZW50V2l0aENhbnZhc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcbiAgc2hhcGVDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHBhdGhzQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlUm91Z2hPcHRpb25zID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgY29udGludW91c1BhdGggPSBmYWxzZSxcbik6IE9wdGlvbnMgPT4ge1xuICBjb25zdCBvcHRpb25zOiBPcHRpb25zID0ge1xuICAgIHNlZWQ6IGVsZW1lbnQuc2VlZCxcbiAgICBzdHJva2VMaW5lRGFzaDpcbiAgICAgIGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFwiZGFzaGVkXCJcbiAgICAgICAgPyBnZXREYXNoQXJyYXlEYXNoZWQoZWxlbWVudC5zdHJva2VXaWR0aClcbiAgICAgICAgOiBlbGVtZW50LnN0cm9rZVN0eWxlID09PSBcImRvdHRlZFwiXG4gICAgICAgID8gZ2V0RGFzaEFycmF5RG90dGVkKGVsZW1lbnQuc3Ryb2tlV2lkdGgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIC8vIGZvciBub24tc29saWQgc3Ryb2tlcywgZGlzYWJsZSBtdWx0aVN0cm9rZSBiZWNhdXNlIGl0IHRlbmRzIHRvIG1ha2VcbiAgICAvLyBkYXNoZXMvZG90cyBvdmVybGF5IGVhY2ggb3RoZXJcbiAgICBkaXNhYmxlTXVsdGlTdHJva2U6IGVsZW1lbnQuc3Ryb2tlU3R5bGUgIT09IFwic29saWRcIixcbiAgICAvLyBmb3Igbm9uLXNvbGlkIHN0cm9rZXMsIGluY3JlYXNlIHRoZSB3aWR0aCBhIGJpdCB0byBtYWtlIGl0IHZpc3VhbGx5XG4gICAgLy8gc2ltaWxhciB0byBzb2xpZCBzdHJva2VzLCBiZWNhdXNlIHdlJ3JlIGFsc28gZGlzYWJsaW5nIG11bHRpU3Ryb2tlXG4gICAgc3Ryb2tlV2lkdGg6XG4gICAgICBlbGVtZW50LnN0cm9rZVN0eWxlICE9PSBcInNvbGlkXCJcbiAgICAgICAgPyBlbGVtZW50LnN0cm9rZVdpZHRoICsgMC41XG4gICAgICAgIDogZWxlbWVudC5zdHJva2VXaWR0aCxcbiAgICAvLyB3aGVuIGluY3JlYXNpbmcgc3Ryb2tlV2lkdGgsIHdlIG11c3QgZXhwbGljaXRseSBzZXQgZmlsbFdlaWdodCBhbmRcbiAgICAvLyBoYWNodXJlR2FwIGJlY2F1c2UgaWYgbm90IHNwZWNpZmllZCwgcm91Z2hqcyB1c2VzIHN0cm9rZVdpZHRoIHRvXG4gICAgLy8gY2FsY3VsYXRlIHRoZW0gKGFuZCB3ZSBkb24ndCB3YW50IHRoZSBmaWxscyB0byBiZSBtb2RpZmllZClcbiAgICBmaWxsV2VpZ2h0OiBlbGVtZW50LnN0cm9rZVdpZHRoIC8gMixcbiAgICBoYWNodXJlR2FwOiBlbGVtZW50LnN0cm9rZVdpZHRoICogNCxcbiAgICByb3VnaG5lc3M6IGVsZW1lbnQucm91Z2huZXNzLFxuICAgIHN0cm9rZTogZWxlbWVudC5zdHJva2VDb2xvcixcbiAgICBwcmVzZXJ2ZVZlcnRpY2VzOiBjb250aW51b3VzUGF0aCxcbiAgfTtcblxuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6IHtcbiAgICAgIG9wdGlvbnMuZmlsbFN0eWxlID0gZWxlbWVudC5maWxsU3R5bGU7XG4gICAgICBvcHRpb25zLmZpbGwgPVxuICAgICAgICBlbGVtZW50LmJhY2tncm91bmRDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yO1xuICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAgICAgb3B0aW9ucy5jdXJ2ZUZpdHRpbmcgPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIGlmIChpc1BhdGhBTG9vcChlbGVtZW50LnBvaW50cykpIHtcbiAgICAgICAgb3B0aW9ucy5maWxsU3R5bGUgPSBlbGVtZW50LmZpbGxTdHlsZTtcbiAgICAgICAgb3B0aW9ucy5maWxsID1cbiAgICAgICAgICBlbGVtZW50LmJhY2tncm91bmRDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBlbGVtZW50LmJhY2tncm91bmRDb2xvcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5pbXBsZW1lbnRlZCB0eXBlICR7ZWxlbWVudC50eXBlfWApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGVsZW1lbnQncyBzaGFwZSBhbmQgcHV0cyBpdCBpbnRvIHRoZSBjYWNoZS5cbiAqIEBwYXJhbSBlbGVtZW50XG4gKiBAcGFyYW0gZ2VuZXJhdG9yXG4gKi9cbmNvbnN0IGdlbmVyYXRlRWxlbWVudFNoYXBlID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGdlbmVyYXRvcjogUm91Z2hHZW5lcmF0b3IsXG4pID0+IHtcbiAgbGV0IHNoYXBlID0gc2hhcGVDYWNoZS5nZXQoZWxlbWVudCk7XG5cbiAgLy8gYG51bGxgIGluZGljYXRlcyBubyByYyBzaGFwZSBhcHBsaWNhYmxlIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAvLyAoPSBkbyBub3QgZ2VuZXJhdGUgYW55dGhpbmcpXG4gIGlmIChzaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZWxlbWVudFdpdGhDYW52YXNDYWNoZS5kZWxldGUoZWxlbWVudCk7XG5cbiAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgICAgICBpZiAoZWxlbWVudC5yb3VuZG5lc3MpIHtcbiAgICAgICAgICBjb25zdCB3ID0gZWxlbWVudC53aWR0aDtcbiAgICAgICAgICBjb25zdCBoID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgICAgICAgY29uc3QgciA9IGdldENvcm5lclJhZGl1cyhNYXRoLm1pbih3LCBoKSwgZWxlbWVudCk7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucGF0aChcbiAgICAgICAgICAgIGBNICR7cn0gMCBMICR7dyAtIHJ9IDAgUSAke3d9IDAsICR7d30gJHtyfSBMICR7d30gJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gUSAke3d9ICR7aH0sICR7dyAtIHJ9ICR7aH0gTCAke3J9ICR7aH0gUSAwICR7aH0sIDAgJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gTCAwICR7cn0gUSAwIDAsICR7cn0gMGAsXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50LCB0cnVlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnJlY3RhbmdsZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZWxlbWVudC53aWR0aCxcbiAgICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgc2hhcGUpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRpYW1vbmRcIjoge1xuICAgICAgICBjb25zdCBbdG9wWCwgdG9wWSwgcmlnaHRYLCByaWdodFksIGJvdHRvbVgsIGJvdHRvbVksIGxlZnRYLCBsZWZ0WV0gPVxuICAgICAgICAgIGdldERpYW1vbmRQb2ludHMoZWxlbWVudCk7XG4gICAgICAgIGlmIChlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgICAgIGNvbnN0IHZlcnRpY2FsUmFkaXVzID0gZ2V0Q29ybmVyUmFkaXVzKFxuICAgICAgICAgICAgTWF0aC5hYnModG9wWCAtIGxlZnRYKSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGhvcml6b250YWxSYWRpdXMgPSBnZXRDb3JuZXJSYWRpdXMoXG4gICAgICAgICAgICBNYXRoLmFicyhyaWdodFkgLSB0b3BZKSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnBhdGgoXG4gICAgICAgICAgICBgTSAke3RvcFggKyB2ZXJ0aWNhbFJhZGl1c30gJHt0b3BZICsgaG9yaXpvbnRhbFJhZGl1c30gTCAke1xuICAgICAgICAgICAgICByaWdodFggLSB2ZXJ0aWNhbFJhZGl1c1xuICAgICAgICAgICAgfSAke3JpZ2h0WSAtIGhvcml6b250YWxSYWRpdXN9XG4gICAgICAgICAgICBDICR7cmlnaHRYfSAke3JpZ2h0WX0sICR7cmlnaHRYfSAke3JpZ2h0WX0sICR7XG4gICAgICAgICAgICAgIHJpZ2h0WCAtIHZlcnRpY2FsUmFkaXVzXG4gICAgICAgICAgICB9ICR7cmlnaHRZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEwgJHtib3R0b21YICsgdmVydGljYWxSYWRpdXN9ICR7Ym90dG9tWSAtIGhvcml6b250YWxSYWRpdXN9XG4gICAgICAgICAgICBDICR7Ym90dG9tWH0gJHtib3R0b21ZfSwgJHtib3R0b21YfSAke2JvdHRvbVl9LCAke1xuICAgICAgICAgICAgICBib3R0b21YIC0gdmVydGljYWxSYWRpdXNcbiAgICAgICAgICAgIH0gJHtib3R0b21ZIC0gaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEwgJHtsZWZ0WCArIHZlcnRpY2FsUmFkaXVzfSAke2xlZnRZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEMgJHtsZWZ0WH0gJHtsZWZ0WX0sICR7bGVmdFh9ICR7bGVmdFl9LCAke2xlZnRYICsgdmVydGljYWxSYWRpdXN9ICR7XG4gICAgICAgICAgICAgIGxlZnRZIC0gaG9yaXpvbnRhbFJhZGl1c1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTCAke3RvcFggLSB2ZXJ0aWNhbFJhZGl1c30gJHt0b3BZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEMgJHt0b3BYfSAke3RvcFl9LCAke3RvcFh9ICR7dG9wWX0sICR7dG9wWCArIHZlcnRpY2FsUmFkaXVzfSAke1xuICAgICAgICAgICAgICB0b3BZICsgaG9yaXpvbnRhbFJhZGl1c1xuICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50LCB0cnVlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnBvbHlnb24oXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFt0b3BYLCB0b3BZXSxcbiAgICAgICAgICAgICAgW3JpZ2h0WCwgcmlnaHRZXSxcbiAgICAgICAgICAgICAgW2JvdHRvbVgsIGJvdHRvbVldLFxuICAgICAgICAgICAgICBbbGVmdFgsIGxlZnRZXSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHNldFNoYXBlRm9yRWxlbWVudChlbGVtZW50LCBzaGFwZSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5lbGxpcHNlKFxuICAgICAgICAgIGVsZW1lbnQud2lkdGggLyAyLFxuICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgc2hhcGUpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgIGNhc2UgXCJhcnJvd1wiOiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KTtcblxuICAgICAgICAvLyBwb2ludHMgYXJyYXkgY2FuIGJlIGVtcHR5IGluIHRoZSBiZWdpbm5pbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0byBhZGRcbiAgICAgICAgLy8gaW5pdGlhbCBwb3NpdGlvbiB0byBpdFxuICAgICAgICBjb25zdCBwb2ludHMgPSBlbGVtZW50LnBvaW50cy5sZW5ndGggPyBlbGVtZW50LnBvaW50cyA6IFtbMCwgMF1dO1xuXG4gICAgICAgIC8vIGN1cnZlIGlzIGFsd2F5cyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAvLyB0aGlzIHNpbXBsaWZpZXMgZmluZGluZyB0aGUgY3VydmUgZm9yIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKCFlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgICAgIGlmIChvcHRpb25zLmZpbGwpIHtcbiAgICAgICAgICAgIHNoYXBlID0gW2dlbmVyYXRvci5wb2x5Z29uKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hhcGUgPSBbXG4gICAgICAgICAgICAgIGdlbmVyYXRvci5saW5lYXJQYXRoKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hhcGUgPSBbZ2VuZXJhdG9yLmN1cnZlKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBsaW5lcyBvbmx5IGluIGFycm93XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIikge1xuICAgICAgICAgIGNvbnN0IHsgc3RhcnRBcnJvd2hlYWQgPSBudWxsLCBlbmRBcnJvd2hlYWQgPSBcImFycm93XCIgfSA9IGVsZW1lbnQ7XG5cbiAgICAgICAgICBjb25zdCBnZXRBcnJvd2hlYWRTaGFwZXMgPSAoXG4gICAgICAgICAgICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgIHNoYXBlOiBEcmF3YWJsZVtdLFxuICAgICAgICAgICAgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIsXG4gICAgICAgICAgICBhcnJvd2hlYWQ6IEFycm93aGVhZCxcbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFycm93aGVhZFBvaW50cyA9IGdldEFycm93aGVhZFBvaW50cyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgICBhcnJvd2hlYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoYXJyb3doZWFkUG9pbnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3RoZXIgYXJyb3doZWFkcyBoZXJlLi4uXG4gICAgICAgICAgICBpZiAoYXJyb3doZWFkID09PSBcImRvdFwiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFt4LCB5LCByXSA9IGFycm93aGVhZFBvaW50cztcblxuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRvci5jaXJjbGUoeCwgeSwgciwge1xuICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGZpbGw6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IFwic29saWRcIixcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhcnJvd2hlYWQgPT09IFwidHJpYW5nbGVcIikge1xuICAgICAgICAgICAgICBjb25zdCBbeCwgeSwgeDIsIHkyLCB4MywgeTNdID0gYXJyb3doZWFkUG9pbnRzO1xuXG4gICAgICAgICAgICAgIC8vIGFsd2F5cyB1c2Ugc29saWQgc3Ryb2tlIGZvciB0cmlhbmdsZSBhcnJvd2hlYWRcbiAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuc3Ryb2tlTGluZURhc2g7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3IucG9seWdvbihcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgW3gsIHldLFxuICAgICAgICAgICAgICAgICAgICBbeDIsIHkyXSxcbiAgICAgICAgICAgICAgICAgICAgW3gzLCB5M10sXG4gICAgICAgICAgICAgICAgICAgIFt4LCB5XSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogXCJzb2xpZFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBcnJvdyBhcnJvd2hlYWRzXG4gICAgICAgICAgICBjb25zdCBbeDIsIHkyLCB4MywgeTMsIHg0LCB5NF0gPSBhcnJvd2hlYWRQb2ludHM7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LnN0cm9rZVN0eWxlID09PSBcImRvdHRlZFwiKSB7XG4gICAgICAgICAgICAgIC8vIGZvciBkb3R0ZWQgYXJyb3dzIGNhcHMsIHJlZHVjZSBnYXAgdG8gbWFrZSBpdCBtb3JlIGxlZ2libGVcbiAgICAgICAgICAgICAgY29uc3QgZGFzaCA9IGdldERhc2hBcnJheURvdHRlZChlbGVtZW50LnN0cm9rZVdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgIG9wdGlvbnMuc3Ryb2tlTGluZURhc2ggPSBbZGFzaFswXSwgZGFzaFsxXSAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gZm9yIHNvbGlkL2Rhc2hlZCwga2VlcCBzb2xpZCBhcnJvdyBjYXBcbiAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuc3Ryb2tlTGluZURhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBnZW5lcmF0b3IubGluZSh4MywgeTMsIHgyLCB5Miwgb3B0aW9ucyksXG4gICAgICAgICAgICAgIGdlbmVyYXRvci5saW5lKHg0LCB5NCwgeDIsIHkyLCBvcHRpb25zKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChzdGFydEFycm93aGVhZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gZ2V0QXJyb3doZWFkU2hhcGVzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgICAgXCJzdGFydFwiLFxuICAgICAgICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzaGFwZS5wdXNoKC4uLnNoYXBlcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGVuZEFycm93aGVhZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGVuZEFycm93aGVhZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIEhleSwgd2UgaGF2ZSBhbiBvbGQgYXJyb3cgaGVyZSFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gZ2V0QXJyb3doZWFkU2hhcGVzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgICAgXCJlbmRcIixcbiAgICAgICAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNoYXBlLnB1c2goLi4uc2hhcGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgc2hhcGUpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgICAgZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChlbGVtZW50LnBvaW50cykpIHtcbiAgICAgICAgICAvLyBnZW5lcmF0ZSByb3VnaCBwb2x5Z29uIHRvIGZpbGwgZnJlZWRyYXcgc2hhcGVcbiAgICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5wb2x5Z29uKGVsZW1lbnQucG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSwge1xuICAgICAgICAgICAgLi4uZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgICBzdHJva2U6IFwibm9uZVwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgc2hhcGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBjYXNlIFwiaW1hZ2VcIjoge1xuICAgICAgICAvLyBqdXN0IHRvIGVuc3VyZSB3ZSBkb24ndCByZWdlbmVyYXRlIGVsZW1lbnQuY2FudmFzIG9uIHJlcmVuZGVyc1xuICAgICAgICBzZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZ2VuZXJhdGVFbGVtZW50V2l0aENhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByZW5kZXJDb25maWc6IFJlbmRlckNvbmZpZyxcbikgPT4ge1xuICBjb25zdCB6b29tOiBab29tID0gcmVuZGVyQ29uZmlnID8gcmVuZGVyQ29uZmlnLnpvb20gOiBkZWZhdWx0QXBwU3RhdGUuem9vbTtcbiAgY29uc3QgcHJldkVsZW1lbnRXaXRoQ2FudmFzID0gZWxlbWVudFdpdGhDYW52YXNDYWNoZS5nZXQoZWxlbWVudCk7XG4gIGNvbnN0IHNob3VsZFJlZ2VuZXJhdGVCZWNhdXNlWm9vbSA9XG4gICAgcHJldkVsZW1lbnRXaXRoQ2FudmFzICYmXG4gICAgcHJldkVsZW1lbnRXaXRoQ2FudmFzLnNjYWxlICE9PSB6b29tLnZhbHVlICYmXG4gICAgIXJlbmRlckNvbmZpZz8uc2hvdWxkQ2FjaGVJZ25vcmVab29tO1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50VmVyc2lvbiA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk/LnZlcnNpb24gfHwgbnVsbDtcblxuICBpZiAoXG4gICAgIXByZXZFbGVtZW50V2l0aENhbnZhcyB8fFxuICAgIHNob3VsZFJlZ2VuZXJhdGVCZWNhdXNlWm9vbSB8fFxuICAgIHByZXZFbGVtZW50V2l0aENhbnZhcy50aGVtZSAhPT0gcmVuZGVyQ29uZmlnLnRoZW1lIHx8XG4gICAgcHJldkVsZW1lbnRXaXRoQ2FudmFzLmJvdW5kVGV4dEVsZW1lbnRWZXJzaW9uICE9PSBib3VuZFRleHRFbGVtZW50VmVyc2lvblxuICApIHtcbiAgICBjb25zdCBlbGVtZW50V2l0aENhbnZhcyA9IGdlbmVyYXRlRWxlbWVudENhbnZhcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICB6b29tLFxuICAgICAgcmVuZGVyQ29uZmlnLFxuICAgICk7XG5cbiAgICBlbGVtZW50V2l0aENhbnZhc0NhY2hlLnNldChlbGVtZW50LCBlbGVtZW50V2l0aENhbnZhcyk7XG5cbiAgICByZXR1cm4gZWxlbWVudFdpdGhDYW52YXM7XG4gIH1cbiAgcmV0dXJuIHByZXZFbGVtZW50V2l0aENhbnZhcztcbn07XG5cbmNvbnN0IGRyYXdFbGVtZW50RnJvbUNhbnZhcyA9IChcbiAgZWxlbWVudFdpdGhDYW52YXM6IEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhcyxcbiAgcmM6IFJvdWdoQ2FudmFzLFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHJlbmRlckNvbmZpZzogUmVuZGVyQ29uZmlnLFxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50V2l0aENhbnZhcy5lbGVtZW50O1xuICBjb25zdCBwYWRkaW5nID0gZ2V0Q2FudmFzUGFkZGluZyhlbGVtZW50KTtcbiAgY29uc3Qgem9vbSA9IGVsZW1lbnRXaXRoQ2FudmFzLnNjYWxlO1xuICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAvLyBGcmVlIGRyYXcgZWxlbWVudHMgd2lsbCBvdGhlcndpc2UgXCJzaHVmZmxlXCIgYXMgdGhlIG1pbiB4IGFuZCB5IGNoYW5nZVxuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICB4MSA9IE1hdGguZmxvb3IoeDEpO1xuICAgIHgyID0gTWF0aC5jZWlsKHgyKTtcbiAgICB5MSA9IE1hdGguZmxvb3IoeTEpO1xuICAgIHkyID0gTWF0aC5jZWlsKHkyKTtcbiAgfVxuXG4gIGNvbnN0IGN4ID0gKCh4MSArIHgyKSAvIDIgKyByZW5kZXJDb25maWcuc2Nyb2xsWCkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgY29uc3QgY3kgPSAoKHkxICsgeTIpIC8gMiArIHJlbmRlckNvbmZpZy5zY3JvbGxZKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuXG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnNjYWxlKDEgLyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMSAvIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpICYmIGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICBjb25zdCB0ZW1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjb25zdCB0ZW1wQ2FudmFzQ29udGV4dCA9IHRlbXBDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcblxuICAgIC8vIFRha2UgbWF4IGRpbWVuc2lvbnMgb2YgYXJyb3cgY2FudmFzIHNvIHRoYXQgd2hlbiBjYW52YXMgaXMgcm90YXRlZFxuICAgIC8vIHRoZSBhcnJvdyBkb2Vzbid0IGdldCBjbGlwcGVkXG4gICAgY29uc3QgbWF4RGltID0gTWF0aC5tYXgoZGlzdGFuY2UoeDEsIHgyKSwgZGlzdGFuY2UoeTEsIHkyKSk7XG4gICAgdGVtcENhbnZhcy53aWR0aCA9XG4gICAgICBtYXhEaW0gKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20gK1xuICAgICAgcGFkZGluZyAqIGVsZW1lbnRXaXRoQ2FudmFzLnNjYWxlICogMTA7XG4gICAgdGVtcENhbnZhcy5oZWlnaHQgPVxuICAgICAgbWF4RGltICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tICtcbiAgICAgIHBhZGRpbmcgKiBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSAqIDEwO1xuICAgIGNvbnN0IG9mZnNldFggPSAodGVtcENhbnZhcy53aWR0aCAtIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEud2lkdGgpIC8gMjtcbiAgICBjb25zdCBvZmZzZXRZID0gKHRlbXBDYW52YXMuaGVpZ2h0IC0gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzIS5oZWlnaHQpIC8gMjtcblxuICAgIHRlbXBDYW52YXNDb250ZXh0LnRyYW5zbGF0ZSh0ZW1wQ2FudmFzLndpZHRoIC8gMiwgdGVtcENhbnZhcy5oZWlnaHQgLyAyKTtcbiAgICB0ZW1wQ2FudmFzQ29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG5cbiAgICB0ZW1wQ2FudmFzQ29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMhLFxuICAgICAgLWVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcy53aWR0aCAvIDIsXG4gICAgICAtZWxlbWVudFdpdGhDYW52YXMuY2FudmFzLmhlaWdodCAvIDIsXG4gICAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMud2lkdGgsXG4gICAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMuaGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCBbLCAsICwgLCBib3VuZFRleHRDeCwgYm91bmRUZXh0Q3ldID1cbiAgICAgIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3Jkcyhib3VuZFRleHRFbGVtZW50KTtcblxuICAgIHRlbXBDYW52YXNDb250ZXh0LnJvdGF0ZSgtZWxlbWVudC5hbmdsZSk7XG5cbiAgICAvLyBTaGlmdCB0aGUgY2FudmFzIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGJvdW5kIHRleHQgZWxlbWVudFxuICAgIGNvbnN0IHNoaWZ0WCA9XG4gICAgICB0ZW1wQ2FudmFzLndpZHRoIC8gMiAtXG4gICAgICAoYm91bmRUZXh0Q3ggLSB4MSkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20gLVxuICAgICAgb2Zmc2V0WCAtXG4gICAgICBwYWRkaW5nICogem9vbTtcblxuICAgIGNvbnN0IHNoaWZ0WSA9XG4gICAgICB0ZW1wQ2FudmFzLmhlaWdodCAvIDIgLVxuICAgICAgKGJvdW5kVGV4dEN5IC0geTEpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tIC1cbiAgICAgIG9mZnNldFkgLVxuICAgICAgcGFkZGluZyAqIHpvb207XG4gICAgdGVtcENhbnZhc0NvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGJvdW5kIHRleHQgYXJlYVxuICAgIHRlbXBDYW52YXNDb250ZXh0LmNsZWFyUmVjdChcbiAgICAgIC0oYm91bmRUZXh0RWxlbWVudC53aWR0aCAvIDIgKyBCT1VORF9URVhUX1BBRERJTkcpICpcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKlxuICAgICAgICB6b29tLFxuICAgICAgLShib3VuZFRleHRFbGVtZW50LmhlaWdodCAvIDIgKyBCT1VORF9URVhUX1BBRERJTkcpICpcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKlxuICAgICAgICB6b29tLFxuICAgICAgKGJvdW5kVGV4dEVsZW1lbnQud2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyKSAqXG4gICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICpcbiAgICAgICAgem9vbSxcbiAgICAgIChib3VuZFRleHRFbGVtZW50LmhlaWdodCArIEJPVU5EX1RFWFRfUEFERElORyAqIDIpICpcbiAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKlxuICAgICAgICB6b29tLFxuICAgICk7XG5cbiAgICBjb250ZXh0LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgdGVtcENhbnZhcyxcbiAgICAgICgtKHgyIC0geDEpIC8gMikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAtIG9mZnNldFggLyB6b29tIC0gcGFkZGluZyxcbiAgICAgICgtKHkyIC0geTEpIC8gMikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAtIG9mZnNldFkgLyB6b29tIC0gcGFkZGluZyxcbiAgICAgIHRlbXBDYW52YXMud2lkdGggLyB6b29tLFxuICAgICAgdGVtcENhbnZhcy5oZWlnaHQgLyB6b29tLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gd2UgdHJhbnNsYXRlIGNvbnRleHQgdG8gZWxlbWVudCBjZW50ZXIgc28gdGhhdCByb3RhdGlvbiBhbmQgc2NhbGVcbiAgICAvLyBvcmlnaW5hdGVzIGZyb20gdGhlIGVsZW1lbnQgY2VudGVyXG4gICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcblxuICAgIGNvbnRleHQucm90YXRlKGVsZW1lbnQuYW5nbGUpO1xuXG4gICAgaWYgKFxuICAgICAgXCJzY2FsZVwiIGluIGVsZW1lbnRXaXRoQ2FudmFzLmVsZW1lbnQgJiZcbiAgICAgICFpc1BlbmRpbmdJbWFnZUVsZW1lbnQoZWxlbWVudCwgcmVuZGVyQ29uZmlnKVxuICAgICkge1xuICAgICAgY29udGV4dC5zY2FsZShcbiAgICAgICAgZWxlbWVudFdpdGhDYW52YXMuZWxlbWVudC5zY2FsZVswXSxcbiAgICAgICAgZWxlbWVudFdpdGhDYW52YXMuZWxlbWVudC5zY2FsZVsxXSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gcmV2ZXJ0IGFmdGVyd2FyZHMgd2UgZG9uJ3QgaGF2ZSBhY2NvdW50IGZvciBpdCBkdXJpbmcgZHJhd2luZ1xuICAgIGNvbnRleHQudHJhbnNsYXRlKC1jeCwgLWN5KTtcblxuICAgIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgICAgZWxlbWVudFdpdGhDYW52YXMuY2FudmFzISxcbiAgICAgICh4MSArIHJlbmRlckNvbmZpZy5zY3JvbGxYKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC1cbiAgICAgICAgKHBhZGRpbmcgKiBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSkgLyBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSxcbiAgICAgICh5MSArIHJlbmRlckNvbmZpZy5zY3JvbGxZKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC1cbiAgICAgICAgKHBhZGRpbmcgKiBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSkgLyBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSxcbiAgICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEud2lkdGggLyBlbGVtZW50V2l0aENhbnZhcy5zY2FsZSxcbiAgICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEuaGVpZ2h0IC8gZWxlbWVudFdpdGhDYW52YXMuc2NhbGUsXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52LlJFQUNUX0FQUF9ERUJVR19FTkFCTEVfVEVYVF9DT05UQUlORVJfQk9VTkRJTkdfQk9YICYmXG4gICAgICBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpXG4gICAgKSB7XG4gICAgICBjb25zdCBjb29yZHMgPSBnZXRDb250YWluZXJDb29yZHMoZWxlbWVudCk7XG4gICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gXCIjYzkyYTJhXCI7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDM7XG4gICAgICBjb250ZXh0LnN0cm9rZVJlY3QoXG4gICAgICAgIChjb29yZHMueCArIHJlbmRlckNvbmZpZy5zY3JvbGxYKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAoY29vcmRzLnkgKyByZW5kZXJDb25maWcuc2Nyb2xsWSkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgZ2V0TWF4Q29udGFpbmVyV2lkdGgoZWxlbWVudCkgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGVsZW1lbnQpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb250ZXh0LnJlc3RvcmUoKTtcblxuICAvLyBDbGVhciB0aGUgbmVzdGVkIGVsZW1lbnQgd2UgYXBwZW5kZWQgdG8gdGhlIERPTVxufTtcblxuZXhwb3J0IGNvbnN0IHJlbmRlckVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgcmM6IFJvdWdoQ2FudmFzLFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHJlbmRlckNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcmMuZ2VuZXJhdG9yO1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJzZWxlY3Rpb25cIjoge1xuICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICBjb250ZXh0LnRyYW5zbGF0ZShcbiAgICAgICAgZWxlbWVudC54ICsgcmVuZGVyQ29uZmlnLnNjcm9sbFgsXG4gICAgICAgIGVsZW1lbnQueSArIHJlbmRlckNvbmZpZy5zY3JvbGxZLFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gXCJyZ2JhKDAsIDAsIDIwMCwgMC4wNClcIjtcblxuICAgICAgLy8gcmVuZGVyIGZyb20gMC41cHggb2Zmc2V0ICB0byBnZXQgMXB4IHdpZGUgbGluZVxuICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzUzMDU5My9odG1sNS1jYW52YXMtYW5kLWxpbmUtd2lkdGgvNzUzMTU0MCM3NTMxNTQwXG4gICAgICAvLyBUT0RPIGNhbiBiZSBiZSBpbXByb3ZlZCBieSBvZmZzZXRpbmcgdG8gdGhlIG5lZ2F0aXZlIHdoZW4gdXNlciBzZWxlY3RzXG4gICAgICAvLyBmcm9tIHJpZ2h0IHRvIGxlZnRcbiAgICAgIGNvbnN0IG9mZnNldCA9IDAuNSAvIHJlbmRlckNvbmZpZy56b29tLnZhbHVlO1xuXG4gICAgICBjb250ZXh0LmZpbGxSZWN0KG9mZnNldCwgb2Zmc2V0LCBlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7XG4gICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IDEgLyByZW5kZXJDb25maWcuem9vbS52YWx1ZTtcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBcInJnYigxMDUsIDEwMSwgMjE5KVwiO1xuICAgICAgY29udGV4dC5zdHJva2VSZWN0KG9mZnNldCwgb2Zmc2V0LCBlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7XG5cbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuXG4gICAgICBpZiAocmVuZGVyQ29uZmlnLmlzRXhwb3J0aW5nKSB7XG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMiArIHJlbmRlckNvbmZpZy5zY3JvbGxYO1xuICAgICAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDIgKyByZW5kZXJDb25maWcuc2Nyb2xsWTtcbiAgICAgICAgY29uc3Qgc2hpZnRYID0gKHgyIC0geDEpIC8gMiAtIChlbGVtZW50LnggLSB4MSk7XG4gICAgICAgIGNvbnN0IHNoaWZ0WSA9ICh5MiAtIHkxKSAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgY29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuICAgICAgICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0LCByZW5kZXJDb25maWcpO1xuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaXRoQ2FudmFzID0gZ2VuZXJhdGVFbGVtZW50V2l0aENhbnZhcyhcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHJlbmRlckNvbmZpZyxcbiAgICAgICAgKTtcbiAgICAgICAgZHJhd0VsZW1lbnRGcm9tQ2FudmFzKGVsZW1lbnRXaXRoQ2FudmFzLCByYywgY29udGV4dCwgcmVuZGVyQ29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuICAgICAgaWYgKHJlbmRlckNvbmZpZy5pc0V4cG9ydGluZykge1xuICAgICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDIgKyByZW5kZXJDb25maWcuc2Nyb2xsWDtcbiAgICAgICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyICsgcmVuZGVyQ29uZmlnLnNjcm9sbFk7XG4gICAgICAgIGxldCBzaGlmdFggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgICAgICAgbGV0IHNoaWZ0WSA9ICh5MiAtIHkxKSAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuICAgICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dENvb3JkcyA9XG4gICAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBlbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzaGlmdFggPSAoeDIgLSB4MSkgLyAyIC0gKGJvdW5kVGV4dENvb3Jkcy54IC0geDEpO1xuICAgICAgICAgICAgc2hpZnRZID0gKHkyIC0geTEpIC8gMiAtIChib3VuZFRleHRDb29yZHMueSAtIHkxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG5cbiAgICAgICAgaWYgKHNob3VsZFJlc2V0SW1hZ2VGaWx0ZXIoZWxlbWVudCwgcmVuZGVyQ29uZmlnKSkge1xuICAgICAgICAgIGNvbnRleHQuZmlsdGVyID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpICYmIGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB0ZW1wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAgICAgICAgIGNvbnN0IHRlbXBDYW52YXNDb250ZXh0ID0gdGVtcENhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuXG4gICAgICAgICAgLy8gVGFrZSBtYXggZGltZW5zaW9ucyBvZiBhcnJvdyBjYW52YXMgc28gdGhhdCB3aGVuIGNhbnZhcyBpcyByb3RhdGVkXG4gICAgICAgICAgLy8gdGhlIGFycm93IGRvZXNuJ3QgZ2V0IGNsaXBwZWRcbiAgICAgICAgICBjb25zdCBtYXhEaW0gPSBNYXRoLm1heChkaXN0YW5jZSh4MSwgeDIpLCBkaXN0YW5jZSh5MSwgeTIpKTtcbiAgICAgICAgICBjb25zdCBwYWRkaW5nID0gZ2V0Q2FudmFzUGFkZGluZyhlbGVtZW50KTtcbiAgICAgICAgICB0ZW1wQ2FudmFzLndpZHRoID1cbiAgICAgICAgICAgIG1heERpbSAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlICsgcGFkZGluZyAqIDEwICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgICAgICAgdGVtcENhbnZhcy5oZWlnaHQgPVxuICAgICAgICAgICAgbWF4RGltICogYXBwU3RhdGUuZXhwb3J0U2NhbGUgKyBwYWRkaW5nICogMTAgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcblxuICAgICAgICAgIHRlbXBDYW52YXNDb250ZXh0LnRyYW5zbGF0ZShcbiAgICAgICAgICAgIHRlbXBDYW52YXMud2lkdGggLyAyLFxuICAgICAgICAgICAgdGVtcENhbnZhcy5oZWlnaHQgLyAyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcENhbnZhc0NvbnRleHQuc2NhbGUoYXBwU3RhdGUuZXhwb3J0U2NhbGUsIGFwcFN0YXRlLmV4cG9ydFNjYWxlKTtcblxuICAgICAgICAgIC8vIFNoaWZ0IHRoZSBjYW52YXMgdG8gbGVmdCBtb3N0IHBvaW50IG9mIHRoZSBhcnJvd1xuICAgICAgICAgIHNoaWZ0WCA9IGVsZW1lbnQud2lkdGggLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgICAgICAgICBzaGlmdFkgPSBlbGVtZW50LmhlaWdodCAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuXG4gICAgICAgICAgdGVtcENhbnZhc0NvbnRleHQucm90YXRlKGVsZW1lbnQuYW5nbGUpO1xuICAgICAgICAgIGNvbnN0IHRlbXBSYyA9IHJvdWdoLmNhbnZhcyh0ZW1wQ2FudmFzKTtcblxuICAgICAgICAgIHRlbXBDYW52YXNDb250ZXh0LnRyYW5zbGF0ZSgtc2hpZnRYLCAtc2hpZnRZKTtcblxuICAgICAgICAgIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgdGVtcFJjLCB0ZW1wQ2FudmFzQ29udGV4dCwgcmVuZGVyQ29uZmlnKTtcblxuICAgICAgICAgIHRlbXBDYW52YXNDb250ZXh0LnRyYW5zbGF0ZShzaGlmdFgsIHNoaWZ0WSk7XG5cbiAgICAgICAgICB0ZW1wQ2FudmFzQ29udGV4dC5yb3RhdGUoLWVsZW1lbnQuYW5nbGUpO1xuXG4gICAgICAgICAgLy8gU2hpZnQgdGhlIGNhbnZhcyB0byBjZW50ZXIgb2YgYm91bmQgdGV4dFxuICAgICAgICAgIGNvbnN0IFssICwgLCAsIGJvdW5kVGV4dEN4LCBib3VuZFRleHRDeV0gPVxuICAgICAgICAgICAgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGJvdW5kVGV4dEVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGJvdW5kVGV4dFNoaWZ0WCA9ICh4MSArIHgyKSAvIDIgLSBib3VuZFRleHRDeDtcbiAgICAgICAgICBjb25zdCBib3VuZFRleHRTaGlmdFkgPSAoeTEgKyB5MikgLyAyIC0gYm91bmRUZXh0Q3k7XG4gICAgICAgICAgdGVtcENhbnZhc0NvbnRleHQudHJhbnNsYXRlKC1ib3VuZFRleHRTaGlmdFgsIC1ib3VuZFRleHRTaGlmdFkpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGhlIGJvdW5kIHRleHQgYXJlYVxuICAgICAgICAgIHRlbXBDYW52YXNDb250ZXh0LmNsZWFyUmVjdChcbiAgICAgICAgICAgIC1ib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMixcbiAgICAgICAgICAgIC1ib3VuZFRleHRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgICBib3VuZFRleHRFbGVtZW50LndpZHRoLFxuICAgICAgICAgICAgYm91bmRUZXh0RWxlbWVudC5oZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250ZXh0LnNjYWxlKDEgLyBhcHBTdGF0ZS5leHBvcnRTY2FsZSwgMSAvIGFwcFN0YXRlLmV4cG9ydFNjYWxlKTtcbiAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgICAgIHRlbXBDYW52YXMsXG4gICAgICAgICAgICAtdGVtcENhbnZhcy53aWR0aCAvIDIsXG4gICAgICAgICAgICAtdGVtcENhbnZhcy5oZWlnaHQgLyAyLFxuICAgICAgICAgICAgdGVtcENhbnZhcy53aWR0aCxcbiAgICAgICAgICAgIHRlbXBDYW52YXMuaGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG5cbiAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIC8vIG5vdGU6IHNjYWxlIG11c3QgYmUgYXBwbGllZCAqYWZ0ZXIqIHJvdGF0aW5nXG4gICAgICAgICAgICBjb250ZXh0LnNjYWxlKGVsZW1lbnQuc2NhbGVbMF0sIGVsZW1lbnQuc2NhbGVbMV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuICAgICAgICAgIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgcmMsIGNvbnRleHQsIHJlbmRlckNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgLy8gbm90IGV4cG9ydGluZyDihpIgb3B0aW1pemVkIHJlbmRlcmluZyAoY2FjaGUgJiByZW5kZXIgZnJvbSBlbGVtZW50XG4gICAgICAgIC8vIGNhbnZhc2VzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFdpdGhDYW52YXMgPSBnZW5lcmF0ZUVsZW1lbnRXaXRoQ2FudmFzKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgcmVuZGVyQ29uZmlnLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbWFnZVNtb290aGluZ1N0YXR1cyA9IGNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyBkbyBub3QgZGlzYWJsZSBzbW9vdGhpbmcgZHVyaW5nIHpvb20gYXMgYmx1cnJ5IHNoYXBlcyBsb29rIGJldHRlclxuICAgICAgICAgIC8vIG9uIGxvdyByZXNvbHV0aW9uICh3aGlsZSBzdGlsbCB6b29taW5nIGluKSB0aGFuIHNoYXJwIG9uZXNcbiAgICAgICAgICAhcmVuZGVyQ29uZmlnPy5zaG91bGRDYWNoZUlnbm9yZVpvb20gJiZcbiAgICAgICAgICAvLyBhbmdsZSBpcyAwIC0+IGFsd2F5cyBkaXNhYmxlIHNtb290aGluZ1xuICAgICAgICAgICghZWxlbWVudC5hbmdsZSB8fFxuICAgICAgICAgICAgLy8gb3IgY2hlY2sgaWYgYW5nbGUgaXMgYSByaWdodCBhbmdsZSBpbiB3aGljaCBjYXNlIHdlIGNhbiBzdGlsbFxuICAgICAgICAgICAgLy8gZGlzYWJsZSBzbW9vdGhpbmcgd2l0aG91dCBhZHZlcnNlbHkgYWZmZWN0aW5nIHRoZSByZXN1bHRcbiAgICAgICAgICAgIGlzUmlnaHRBbmdsZShlbGVtZW50LmFuZ2xlKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gRGlzYWJsaW5nIHNtb290aGluZyBtYWtlcyBvdXRwdXQgbXVjaCBzaGFycGVyLCBlc3BlY2lhbGx5IGZvclxuICAgICAgICAgIC8vIHRleHQuIFVubGVzcyBmb3Igbm9uLXJpZ2h0IGFuZ2xlcywgd2hlcmUgdGhlIGFsaWFzaW5nIGlzIHJlYWxseVxuICAgICAgICAgIC8vIHRlcnJpYmxlIG9uIENocm9taXVtLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IGBjb250ZXh0LmltYWdlU21vb3RoaW5nUXVhbGl0eT1cImhpZ2hcImAgaGFzIGFsbW9zdFxuICAgICAgICAgIC8vIHplcm8gZWZmZWN0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRyYXdFbGVtZW50RnJvbUNhbnZhcyhlbGVtZW50V2l0aENhbnZhcywgcmMsIGNvbnRleHQsIHJlbmRlckNvbmZpZyk7XG5cbiAgICAgICAgLy8gcmVzZXRcbiAgICAgICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBjdXJyZW50SW1hZ2VTbW9vdGhpbmdTdGF0dXM7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uID0gKFxuICByc3ZnOiBSb3VnaFNWRyxcbiAgZHJhd2FibGU6IERyYXdhYmxlLFxuICBwcmVjaXNpb24/OiBudW1iZXIsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBwcmVjaXNpb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gcnN2Zy5kcmF3KGRyYXdhYmxlKTtcbiAgfVxuICBjb25zdCBwc2hhcGU6IERyYXdhYmxlID0ge1xuICAgIHNldHM6IGRyYXdhYmxlLnNldHMsXG4gICAgc2hhcGU6IGRyYXdhYmxlLnNoYXBlLFxuICAgIG9wdGlvbnM6IHsgLi4uZHJhd2FibGUub3B0aW9ucywgZml4ZWREZWNpbWFsUGxhY2VEaWdpdHM6IHByZWNpc2lvbiB9LFxuICB9O1xuICByZXR1cm4gcnN2Zy5kcmF3KHBzaGFwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyRWxlbWVudFRvU3ZnID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHJzdmc6IFJvdWdoU1ZHLFxuICBzdmdSb290OiBTVkdFbGVtZW50LFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIG9mZnNldFg6IG51bWJlcixcbiAgb2Zmc2V0WTogbnVtYmVyLFxuICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuLFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGxldCBjeCA9ICh4MiAtIHgxKSAvIDIgLSAoZWxlbWVudC54IC0geDEpO1xuICBsZXQgY3kgPSAoeTIgLSB5MSkgLyAyIC0gKGVsZW1lbnQueSAtIHkxKTtcbiAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGNvbnRhaW5lcik7XG5cbiAgICAgIGNvbnN0IGJvdW5kVGV4dENvb3JkcyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICAgICk7XG4gICAgICBjeCA9ICh4MiAtIHgxKSAvIDIgLSAoYm91bmRUZXh0Q29vcmRzLnggLSB4MSk7XG4gICAgICBjeSA9ICh5MiAtIHkxKSAvIDIgLSAoYm91bmRUZXh0Q29vcmRzLnkgLSB5MSk7XG4gICAgICBvZmZzZXRYID0gb2Zmc2V0WCArIGJvdW5kVGV4dENvb3Jkcy54IC0gZWxlbWVudC54O1xuICAgICAgb2Zmc2V0WSA9IG9mZnNldFkgKyBib3VuZFRleHRDb29yZHMueSAtIGVsZW1lbnQueTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGVsZW1lbnQuYW5nbGUpIC8gTWF0aC5QSTtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcnN2Zy5nZW5lcmF0b3I7XG5cbiAgLy8gZWxlbWVudCB0byBhcHBlbmQgbm9kZSB0bywgbW9zdCBvZiB0aGUgdGltZSBzdmdSb290XG4gIGxldCByb290ID0gc3ZnUm9vdDtcblxuICAvLyBpZiB0aGUgZWxlbWVudCBoYXMgYSBsaW5rLCBjcmVhdGUgYW4gYW5jaG9yIHRhZyBhbmQgbWFrZSB0aGF0IHRoZSBuZXcgcm9vdFxuICBpZiAoZWxlbWVudC5saW5rKSB7XG4gICAgY29uc3QgYW5jaG9yVGFnID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImFcIik7XG4gICAgYW5jaG9yVGFnLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgZWxlbWVudC5saW5rKTtcbiAgICByb290LmFwcGVuZENoaWxkKGFuY2hvclRhZyk7XG4gICAgcm9vdCA9IGFuY2hvclRhZztcbiAgfVxuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOiB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGlzIHVzZWQgb25seSBkdXJpbmcgZWRpdGluZyBleHBlcmllbmNlLCB3aGljaCBpcyBjYW52YXMgYmFzZWQsXG4gICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3Rpb24gcmVuZGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNWR1wiKTtcbiAgICB9XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGNvbnN0IG5vZGUgPSByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uKFxuICAgICAgICByc3ZnLFxuICAgICAgICBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhLFxuICAgICAgICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gICAgICApO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLWxpbmVjYXBcIiwgXCJyb3VuZFwiKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICApO1xuICAgICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwibGluZVwiOlxuICAgIGNhc2UgXCJhcnJvd1wiOiB7XG4gICAgICBjb25zdCBib3VuZFRleHQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgY29uc3QgbWFza1BhdGggPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwibWFza1wiKTtcbiAgICAgIGlmIChib3VuZFRleHQpIHtcbiAgICAgICAgbWFza1BhdGguc2V0QXR0cmlidXRlKFwiaWRcIiwgYG1hc2stJHtlbGVtZW50LmlkfWApO1xuICAgICAgICBjb25zdCBtYXNrUmVjdFZpc2libGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICBTVkdfTlMsXG4gICAgICAgICAgXCJyZWN0XCIsXG4gICAgICAgICk7XG4gICAgICAgIG9mZnNldFggPSBvZmZzZXRYIHx8IDA7XG4gICAgICAgIG9mZnNldFkgPSBvZmZzZXRZIHx8IDA7XG4gICAgICAgIG1hc2tSZWN0VmlzaWJsZS5zZXRBdHRyaWJ1dGUoXCJ4XCIsIFwiMFwiKTtcbiAgICAgICAgbWFza1JlY3RWaXNpYmxlLnNldEF0dHJpYnV0ZShcInlcIiwgXCIwXCIpO1xuICAgICAgICBtYXNrUmVjdFZpc2libGUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIiNmZmZcIik7XG4gICAgICAgIG1hc2tSZWN0VmlzaWJsZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJ3aWR0aFwiLFxuICAgICAgICAgIGAke2VsZW1lbnQud2lkdGggKyAxMDAgKyBvZmZzZXRYfWAsXG4gICAgICAgICk7XG4gICAgICAgIG1hc2tSZWN0VmlzaWJsZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJoZWlnaHRcIixcbiAgICAgICAgICBgJHtlbGVtZW50LmhlaWdodCArIDEwMCArIG9mZnNldFl9YCxcbiAgICAgICAgKTtcblxuICAgICAgICBtYXNrUGF0aC5hcHBlbmRDaGlsZChtYXNrUmVjdFZpc2libGUpO1xuICAgICAgICBjb25zdCBtYXNrUmVjdEludmlzaWJsZSA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgIFNWR19OUyxcbiAgICAgICAgICBcInJlY3RcIixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYm91bmRUZXh0Q29vcmRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBib3VuZFRleHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbWFza1ggPSBvZmZzZXRYICsgYm91bmRUZXh0Q29vcmRzLnggLSBlbGVtZW50Lng7XG4gICAgICAgIGNvbnN0IG1hc2tZID0gb2Zmc2V0WSArIGJvdW5kVGV4dENvb3Jkcy55IC0gZWxlbWVudC55O1xuXG4gICAgICAgIG1hc2tSZWN0SW52aXNpYmxlLnNldEF0dHJpYnV0ZShcInhcIiwgbWFza1gudG9TdHJpbmcoKSk7XG4gICAgICAgIG1hc2tSZWN0SW52aXNpYmxlLnNldEF0dHJpYnV0ZShcInlcIiwgbWFza1kudG9TdHJpbmcoKSk7XG4gICAgICAgIG1hc2tSZWN0SW52aXNpYmxlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCIjMDAwXCIpO1xuICAgICAgICBtYXNrUmVjdEludmlzaWJsZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHtib3VuZFRleHQud2lkdGh9YCk7XG4gICAgICAgIG1hc2tSZWN0SW52aXNpYmxlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtib3VuZFRleHQuaGVpZ2h0fWApO1xuICAgICAgICBtYXNrUmVjdEludmlzaWJsZS5zZXRBdHRyaWJ1dGUoXCJvcGFjaXR5XCIsIFwiMVwiKTtcbiAgICAgICAgbWFza1BhdGguYXBwZW5kQ2hpbGQobWFza1JlY3RJbnZpc2libGUpO1xuICAgICAgfVxuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGNvbnN0IGdyb3VwID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImdcIik7XG4gICAgICBpZiAoYm91bmRUZXh0KSB7XG4gICAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcIm1hc2tcIiwgYHVybCgjbWFzay0ke2VsZW1lbnQuaWR9KWApO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcInN0cm9rZS1saW5lY2FwXCIsIFwicm91bmRcIik7XG5cbiAgICAgIGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSEuZm9yRWFjaCgoc2hhcGUpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHJvdWdoU1ZHRHJhd1dpdGhQcmVjaXNpb24oXG4gICAgICAgICAgcnN2ZyxcbiAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgICAgfSkgcm90YXRlKCR7ZGVncmVlfSAke2N4fSAke2N5fSlgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJlxuICAgICAgICAgIGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSAmJlxuICAgICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yICE9PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICByb290LmFwcGVuZENoaWxkKGdyb3VwKTtcbiAgICAgIHJvb3QuYXBwZW5kKG1hc2tQYXRoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGdlbmVyYXRlRnJlZURyYXdTaGFwZShlbGVtZW50KTtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gICAgICBjb25zdCBzaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGNvbnN0IG5vZGUgPSBzaGFwZVxuICAgICAgICA/IHJvdWdoU1ZHRHJhd1dpdGhQcmVjaXNpb24ocnN2Zywgc2hhcGUsIE1BWF9ERUNJTUFMU19GT1JfU1ZHX0VYUE9SVClcbiAgICAgICAgOiBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICApO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJub25lXCIpO1xuICAgICAgY29uc3QgcGF0aCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJwYXRoXCIpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGVsZW1lbnQuc3Ryb2tlQ29sb3IpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGdldEZyZWVEcmF3U3ZnUGF0aChlbGVtZW50KSk7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiaW1hZ2VcIjoge1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLnJvdW5kKGVsZW1lbnQud2lkdGgpO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5yb3VuZChlbGVtZW50LmhlaWdodCk7XG4gICAgICBjb25zdCBmaWxlRGF0YSA9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiYgZmlsZXNbZWxlbWVudC5maWxlSWRdO1xuICAgICAgaWYgKGZpbGVEYXRhKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbElkID0gYGltYWdlLSR7ZmlsZURhdGEuaWR9YDtcbiAgICAgICAgbGV0IHN5bWJvbCA9IHN2Z1Jvb3QucXVlcnlTZWxlY3RvcihgIyR7c3ltYm9sSWR9YCk7XG4gICAgICAgIGlmICghc3ltYm9sKSB7XG4gICAgICAgICAgc3ltYm9sID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN5bWJvbFwiKTtcbiAgICAgICAgICBzeW1ib2wuaWQgPSBzeW1ib2xJZDtcblxuICAgICAgICAgIGNvbnN0IGltYWdlID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImltYWdlXCIpO1xuXG4gICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAgIGltYWdlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjEwMCVcIik7XG4gICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBmaWxlRGF0YS5kYXRhVVJMKTtcblxuICAgICAgICAgIHN5bWJvbC5hcHBlbmRDaGlsZChpbWFnZSk7XG5cbiAgICAgICAgICByb290LnByZXBlbmQoc3ltYm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVzZSA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJ1c2VcIik7XG4gICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGAjJHtzeW1ib2xJZH1gKTtcblxuICAgICAgICAvLyBpbiBkYXJrIHRoZW1lLCByZXZlcnQgdGhlIGltYWdlIGNvbG9yIGZpbHRlclxuICAgICAgICBpZiAoZXhwb3J0V2l0aERhcmtNb2RlICYmIGZpbGVEYXRhLm1pbWVUeXBlICE9PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgSU1BR0VfSU5WRVJUX0ZJTFRFUik7XG4gICAgICAgIH1cblxuICAgICAgICB1c2Uuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGh9YCk7XG4gICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0fWApO1xuXG4gICAgICAgIC8vIFdlIGZpcnN0IGFwcGx5IGBzY2FsZWAgdHJhbnNmb3JtcyAoaG9yaXpvbnRhbC92ZXJ0aWNhbCBtaXJyb3JpbmcpXG4gICAgICAgIC8vIG9uIHRoZSA8dXNlPiBlbGVtZW50LCB0aGVuIGFwcGx5IHRyYW5zbGF0aW9uIGFuZCByb3RhdGlvblxuICAgICAgICAvLyBvbiB0aGUgPGc+IGVsZW1lbnQgd2hpY2ggd3JhcHMgdGhlIDx1c2U+LlxuICAgICAgICAvLyBEb2luZyB0aGlzIHNlcGFyYXRlbHkgaXMgYSBxdWljayBoYWNrIHRvIHRvIHdvcmsgYXJvdW5kIGNvbXBvc2l0aW5nXG4gICAgICAgIC8vIHRoZSB0cmFuc2Zvcm1hdGlvbnMgY29ycmVjdGx5ICh0aGUgdHJhbnNmb3JtLW9yaWdpbiB3YXMgbm90IGJlaW5nXG4gICAgICAgIC8vIGFwcGxpZWQgY29ycmVjdGx5KS5cbiAgICAgICAgaWYgKGVsZW1lbnQuc2NhbGVbMF0gIT09IDEgfHwgZWxlbWVudC5zY2FsZVsxXSAhPT0gMSkge1xuICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZVggPSBlbGVtZW50LnNjYWxlWzBdICE9PSAxID8gLXdpZHRoIDogMDtcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGVZID0gZWxlbWVudC5zY2FsZVsxXSAhPT0gMSA/IC1oZWlnaHQgOiAwO1xuICAgICAgICAgIHVzZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICAgICAgYHNjYWxlKCR7ZWxlbWVudC5zY2FsZVswXX0sICR7ZWxlbWVudC5zY2FsZVsxXX0pIHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9ICR7dHJhbnNsYXRlWX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZyA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJnXCIpO1xuICAgICAgICBnLmFwcGVuZENoaWxkKHVzZSk7XG4gICAgICAgIGcuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgICAgYHRyYW5zbGF0ZSgke29mZnNldFggfHwgMH0gJHtcbiAgICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICAgKTtcblxuICAgICAgICByb290LmFwcGVuZENoaWxkKGcpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IG9wYWNpdHkgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcInN0cm9rZS1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgICAgYHRyYW5zbGF0ZSgke29mZnNldFggfHwgMH0gJHtcbiAgICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBlbGVtZW50LnRleHQucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodFB4ID0gZ2V0TGluZUhlaWdodEluUHgoXG4gICAgICAgICAgZWxlbWVudC5mb250U2l6ZSxcbiAgICAgICAgICBlbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPVxuICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgICAgICA/IGVsZW1lbnQud2lkdGggLyAyXG4gICAgICAgICAgICA6IGVsZW1lbnQudGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aFxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1JUTChlbGVtZW50LnRleHQpID8gXCJydGxcIiA6IFwibHRyXCI7XG4gICAgICAgIGNvbnN0IHRleHRBbmNob3IgPVxuICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgICAgICA/IFwibWlkZGxlXCJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIiB8fCBkaXJlY3Rpb24gPT09IFwicnRsXCJcbiAgICAgICAgICAgID8gXCJlbmRcIlxuICAgICAgICAgICAgOiBcInN0YXJ0XCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInRleHRcIik7XG4gICAgICAgICAgdGV4dC50ZXh0Q29udGVudCA9IGxpbmVzW2ldO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwieFwiLCBgJHtob3Jpem9udGFsT2Zmc2V0fWApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwieVwiLCBgJHtpICogbGluZUhlaWdodFB4fWApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZm9udC1mYW1pbHlcIiwgZ2V0Rm9udEZhbWlseVN0cmluZyhlbGVtZW50KSk7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJmb250LXNpemVcIiwgYCR7ZWxlbWVudC5mb250U2l6ZX1weGApO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBlbGVtZW50LnN0cm9rZUNvbG9yKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcInRleHQtYW5jaG9yXCIsIHRleHRBbmNob3IpO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJ3aGl0ZS1zcGFjZTogcHJlO1wiKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcImRpcmVjdGlvblwiLCBkaXJlY3Rpb24pO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZG9taW5hbnQtYmFzZWxpbmVcIiwgXCJ0ZXh0LWJlZm9yZS1lZGdlXCIpO1xuICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgbGV0IHBhdGhzQ2FjaGUgPSBuZXcgV2Vha01hcDxFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LCBQYXRoMkQ+KFtdKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRnJlZURyYXdTaGFwZShlbGVtZW50OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50KSB7XG4gIGNvbnN0IHN2Z1BhdGhEYXRhID0gZ2V0RnJlZURyYXdTdmdQYXRoKGVsZW1lbnQpO1xuICBjb25zdCBwYXRoID0gbmV3IFBhdGgyRChzdmdQYXRoRGF0YSk7XG4gIHBhdGhzQ2FjaGUuc2V0KGVsZW1lbnQsIHBhdGgpO1xuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyZWVEcmF3UGF0aDJEKGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQpIHtcbiAgcmV0dXJuIHBhdGhzQ2FjaGUuZ2V0KGVsZW1lbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJlZURyYXdTdmdQYXRoKGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQpIHtcbiAgLy8gSWYgaW5wdXQgcG9pbnRzIGFyZSBlbXB0eSAoc2hvdWxkIHRoZXkgZXZlciBiZT8pIHJldHVybiBhIGRvdFxuICBjb25zdCBpbnB1dFBvaW50cyA9IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgID8gZWxlbWVudC5wb2ludHNcbiAgICA6IGVsZW1lbnQucG9pbnRzLmxlbmd0aFxuICAgID8gZWxlbWVudC5wb2ludHMubWFwKChbeCwgeV0sIGkpID0+IFt4LCB5LCBlbGVtZW50LnByZXNzdXJlc1tpXV0pXG4gICAgOiBbWzAsIDAsIDAuNV1dO1xuXG4gIC8vIENvbnNpZGVyIGNoYW5naW5nIHRoZSBvcHRpb25zIGZvciBzaW11bGF0ZWQgcHJlc3N1cmUgdnMgcmVhbCBwcmVzc3VyZVxuICBjb25zdCBvcHRpb25zOiBTdHJva2VPcHRpb25zID0ge1xuICAgIHNpbXVsYXRlUHJlc3N1cmU6IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSxcbiAgICBzaXplOiBlbGVtZW50LnN0cm9rZVdpZHRoICogNC4yNSxcbiAgICB0aGlubmluZzogMC42LFxuICAgIHNtb290aGluZzogMC41LFxuICAgIHN0cmVhbWxpbmU6IDAuNSxcbiAgICBlYXNpbmc6ICh0KSA9PiBNYXRoLnNpbigodCAqIE1hdGguUEkpIC8gMiksIC8vIGh0dHBzOi8vZWFzaW5ncy5uZXQvI2Vhc2VPdXRTaW5lXG4gICAgbGFzdDogISFlbGVtZW50Lmxhc3RDb21taXR0ZWRQb2ludCwgLy8gTGFzdENvbW1pdHRlZFBvaW50IGlzIGFkZGVkIG9uIHBvaW50ZXJ1cFxuICB9O1xuXG4gIHJldHVybiBnZXRTdmdQYXRoRnJvbVN0cm9rZShnZXRTdHJva2UoaW5wdXRQb2ludHMgYXMgbnVtYmVyW11bXSwgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBtZWQoQTogbnVtYmVyW10sIEI6IG51bWJlcltdKSB7XG4gIHJldHVybiBbKEFbMF0gKyBCWzBdKSAvIDIsIChBWzFdICsgQlsxXSkgLyAyXTtcbn1cblxuLy8gVHJpbSBTVkcgcGF0aCBkYXRhIHNvIG51bWJlciBhcmUgZWFjaCB0d28gZGVjaW1hbCBwb2ludHMuIFRoaXNcbi8vIGltcHJvdmVzIFNWRyBleHBvcnRzLCBhbmQgcHJldmVudHMgcmVuZGVyaW5nIGVycm9ycyBvbiBwb2ludHNcbi8vIHdpdGggbG9uZyBkZWNpbWFscy5cbmNvbnN0IFRPX0ZJWEVEX1BSRUNJU0lPTiA9IC8oXFxzP1tBLVpdPyw/LT9bMC05XSpcXC5bMC05XXswLDJ9KSgoWzAtOV18ZXwtKSopL2c7XG5cbmZ1bmN0aW9uIGdldFN2Z1BhdGhGcm9tU3Ryb2tlKHBvaW50czogbnVtYmVyW11bXSk6IHN0cmluZyB7XG4gIGlmICghcG9pbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3QgbWF4ID0gcG9pbnRzLmxlbmd0aCAtIDE7XG5cbiAgcmV0dXJuIHBvaW50c1xuICAgIC5yZWR1Y2UoXG4gICAgICAoYWNjLCBwb2ludCwgaSwgYXJyKSA9PiB7XG4gICAgICAgIGlmIChpID09PSBtYXgpIHtcbiAgICAgICAgICBhY2MucHVzaChwb2ludCwgbWVkKHBvaW50LCBhcnJbMF0pLCBcIkxcIiwgYXJyWzBdLCBcIlpcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjLnB1c2gocG9pbnQsIG1lZChwb2ludCwgYXJyW2kgKyAxXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgW1wiTVwiLCBwb2ludHNbMF0sIFwiUVwiXSxcbiAgICApXG4gICAgLmpvaW4oXCIgXCIpXG4gICAgLnJlcGxhY2UoVE9fRklYRURfUFJFQ0lTSU9OLCBcIiQxXCIpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../renderer/renderElement.ts\n");
|
|
3630
3630
|
|
|
3631
3631
|
/***/ }),
|
|
3632
3632
|
|
|
@@ -3692,7 +3692,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3692
3692
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3693
3693
|
|
|
3694
3694
|
"use strict";
|
|
3695
|
-
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 _data_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\n/**\n * This API is usually used as a precursor to searializing to Blob or PNG,\n * but can also be used to create a canvas for other purposes.\n */\nconst exportToCanvas = ({ data, config, }) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n // initialize defaults\n // ---------------------------------------------------------------------------\n const { elements, files } = data;\n const appState = (0,_data_restore__WEBPACK_IMPORTED_MODULE_7__.restoreAppState)(data.appState, null);\n // clone\n const cfg = Object.assign({}, config);\n if (cfg.x != null || cfg.x != null) {\n if (cfg.fit != null && cfg.fit !== \"none\") {\n if (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_4__.ENV.PRODUCTION) {\n console.warn(\"`fit` will be ignored (automatically set to `none`) when you specify `x` or `y` offsets\");\n }\n }\n cfg.fit = \"none\";\n }\n cfg.fit = (_a = cfg.fit) !== null && _a !== void 0 ? _a : \"contain\";\n if (cfg.fit === \"cover\" && cfg.padding) {\n if (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_4__.ENV.PRODUCTION) {\n console.warn(\"`padding` is ignored when `fit` is set to `cover`\");\n }\n cfg.padding = 0;\n }\n cfg.scale = (_b = cfg.scale) !== null && _b !== void 0 ? _b : 1;\n cfg.origin = (_c = cfg.origin) !== null && _c !== void 0 ? _c : \"canvas\";\n cfg.position = (_d = cfg.position) !== null && _d !== void 0 ? _d : \"center\";\n cfg.padding = (_e = cfg.padding) !== null && _e !== void 0 ? _e : _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING;\n if ((cfg.maxWidthOrHeight != null || cfg.width != null || cfg.height != null) &&\n cfg.getDimensions) {\n if (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_4__.ENV.PRODUCTION) {\n console.warn(\"`getDimensions` is ignored when `width`, `height`, or `maxWidthOrHeight` is set\");\n }\n cfg.getDimensions = undefined;\n }\n // ---------------------------------------------------------------------------\n // value used to scale the canvas context. By default, we use this to\n // make the canvas fit into the frame (e.g. for `cfg.fit` set to `contain`).\n // If `cfg.scale` is set, we multiply the resulting canvasScale by it to\n // scale the output further.\n let canvasScale = 1;\n const origCanvasSize = getCanvasSize(elements, cfg.padding);\n // variables for original content bounding box\n const [origX, origY, origWidth, origHeight] = origCanvasSize;\n // variables for target bounding box\n let [x, y, width, height] = origCanvasSize;\n if (cfg.maxWidthOrHeight != null) {\n // calculate by how much do we need to scale the canvas to fit into the\n // target dimension (e.g. target: max 50px, actual: 70x100px => scale: 0.5)\n canvasScale = cfg.maxWidthOrHeight / Math.max(origWidth, origHeight);\n width *= canvasScale;\n height *= canvasScale;\n }\n else if (cfg.width != null) {\n width = cfg.width;\n if (cfg.height) {\n height = cfg.height;\n }\n else {\n // if height not specified, scale the original height to match the new\n // width while maintaining aspect ratio\n height *= width / origWidth;\n }\n }\n else if (cfg.height != null) {\n height = cfg.height;\n // width not specified, so scale the original width to match the new\n // height while maintaining aspect ratio\n width *= height / origHeight;\n }\n else if (cfg.getDimensions) {\n const ret = cfg.getDimensions(width, height);\n width = ret.width;\n height = ret.height;\n cfg.scale = (_f = ret.scale) !== null && _f !== void 0 ? _f : cfg.scale;\n }\n if (cfg.fit === \"contain\" && !cfg.maxWidthOrHeight) {\n const wRatio = width / origWidth;\n const hRatio = height / origHeight;\n // scale the orig canvas to fit in the target frame\n canvasScale = Math.min(wRatio, hRatio);\n }\n else if (cfg.fit === \"cover\") {\n const wRatio = width / origWidth;\n const hRatio = height / origHeight;\n // scale the orig canvas to fill the the target frame\n // (opposite of \"contain\")\n canvasScale = Math.max(wRatio, hRatio);\n }\n x = (_g = cfg.x) !== null && _g !== void 0 ? _g : origX;\n y = (_h = cfg.y) !== null && _h !== void 0 ? _h : origY;\n // if we switch to \"content\" coords, we need to offset cfg-supplied\n // coords by the x/y of content bounding box\n if (cfg.origin === \"content\") {\n if (cfg.x != null) {\n x += origX;\n }\n if (cfg.y != null) {\n y += origY;\n }\n }\n // Centering the content to the frame.\n // We divide width/height by canvasScale so that we calculate in the original\n // aspect ratio dimensions.\n if (cfg.position === \"center\") {\n if (cfg.x == null) {\n x -= width / canvasScale / 2 - origWidth / 2;\n }\n if (cfg.y == null) {\n y -= height / canvasScale / 2 - origHeight / 2;\n }\n }\n const canvas = cfg.createCanvas\n ? cfg.createCanvas()\n : document.createElement(\"canvas\");\n // scale the whole frame by cfg.scale (on top of whatever canvasScale we\n // calculated above)\n canvasScale *= cfg.scale;\n width *= cfg.scale;\n height *= cfg.scale;\n canvas.width = width;\n canvas.height = height;\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_6__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_6__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files: files || {},\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState: Object.assign(Object.assign({}, appState), { width, height, offsetLeft: 0, offsetTop: 0 }),\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n canvasBackgroundColor: cfg.canvasBackgroundColor === false\n ? // null indicates transparent background\n null\n : cfg.canvasBackgroundColor ||\n appState.viewBackgroundColor ||\n _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_BACKGROUND_COLOR,\n scrollX: -x + cfg.padding,\n scrollY: -y + cfg.padding,\n canvasScale,\n zoom: { value: _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_ZOOM_VALUE },\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: cfg.theme || _constants__WEBPACK_IMPORTED_MODULE_4__.THEME.LIGHT,\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_5__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@dwelle/excalidraw\"}@${\"0.4.0-4851a85\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\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 `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, padding, scale) => {\n const [, , width, height] = getCanvasSize(elements, padding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDakQsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsUUFBZ0QsRUFDaEQsYUFBcUIsRUFDd0MsRUFBRTtJQUMvRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZ0VBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxNQUFNLEtBQUssR0FBRyxnREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLGdEQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFFcEUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVLLE1BQU0sYUFBYSxHQUFHLENBQzNCLFFBQWdELEVBQ2hELE9BQWUsRUFDZixLQUFhLEVBQ0ssRUFBRTtJQUNwQixNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FDOUQsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUM3QyxDQUFDO0lBRUYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LCBUaGVtZSB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IsXG4gIERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gIERFRkFVTFRfWk9PTV9WQUxVRSxcbiAgRU5WLFxuICBTVkdfTlMsXG4gIFRIRU1FLFxuICBUSEVNRV9GSUxURVIsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7XG4gIGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyxcbiAgdXBkYXRlSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCB7IHJlc3RvcmVBcHBTdGF0ZSB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcblxuZXhwb3J0IGNvbnN0IFNWR19FWFBPUlRfVEFHID0gYDwhLS0gc3ZnLXNvdXJjZTpleGNhbGlkcmF3IC0tPmA7XG5cbmV4cG9ydCB0eXBlIEV4cG9ydFRvQ2FudmFzRGF0YSA9IHtcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdO1xuICBhcHBTdGF0ZT86IFBhcnRpYWw8T21pdDxBcHBTdGF0ZSwgXCJvZmZzZXRUb3BcIiB8IFwib2Zmc2V0TGVmdFwiPj47XG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBvcnRUb0NhbnZhc0NvbmZpZyA9IHtcbiAgdGhlbWU/OiBUaGVtZTtcbiAgLyoqXG4gICAqIENhbnZhcyBiYWNrZ3JvdW5kLiBWYWxpZCB2YWx1ZXMgYXJlOlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIC0gdGhlIGJhY2tncm91bmQgb2YgXCJhcHBTdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yXCIgaXMgdXNlZC5cbiAgICogLSBgZmFsc2VgIC0gbm8gYmFja2dyb3VuZCBpcyB1c2VkIChzZXQgdG8gXCJ0cmFuc3BhcmVudFwiKS5cbiAgICogLSBgc3RyaW5nYCAtIHNob3VsZCBiZSBhIHZhbGlkIENTUyBjb2xvci5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBjYW52YXNCYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmcgfCBmYWxzZTtcbiAgLyoqXG4gICAqIENhbnZhcyBwYWRkaW5nIGluIHBpeGVscy4gQWZmZWN0ZWQgYnkgc2NhbGUuIElnbm9yZWQgaWYgYGZpdGAgaXMgc2V0IHRvXG4gICAqIGBjb3ZlcmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBwYWRkaW5nPzogbnVtYmVyO1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBNYWtlcyBzdXJlIHRoZSBjYW52YXMgY29udGVudCBmaXRzIGludG8gYSBmcmFtZSBvZiB3aWR0aC9oZWlnaHQgbm8gbGFyZ2VyXG4gICAqIHRoYW4gdGhpcyB2YWx1ZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGFzcGVjdCByYXRpby5cbiAgICpcbiAgICogRmluYWwgZGltZW5zaW9ucyBjYW4gZ2V0IHNtYWxsZXIvbGFyZ2VyIGlmIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgKiBgc2NhbGVgLlxuICAgKi9cbiAgbWF4V2lkdGhPckhlaWdodD86IG51bWJlcjtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogV2lkdGggb2YgdGhlIGZyYW1lLiBTdXBwbHkgYHhgIG9yIGB5YCBpZiB5b3Ugd2FudCB0byBvZnNzZXQgdGhlIGNhbnZhc1xuICAgKiBjb250ZW50LlxuICAgKlxuICAgKiBJZiBgd2lkdGhgIG9taXR0ZWQgYnV0IGBoZWlnaHRgIHN1cHBsaWVkLCBgd2lkdGhgIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGVcbiAgICogdGhlIGNvbnRlbnQncyBib3VuZGluZyBib3ggdG8gcHJlc2VydmUgdGhlIGFzcGVjdCByYXRpby5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGNvbnRlbnQgYm91bmRpbmcgYm94IHdpZHRoIHdoZW4gYm90aCBgd2lkdGhgIGFuZCBgaGVpZ2h0YFxuICAgKiBhcmUgb21pdHRlZC5cbiAgICovXG4gIHdpZHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogSGVpZ2h0IG9mIHRoZSBmcmFtZS5cbiAgICpcbiAgICogSWYgYGhlaWdodGAgb21pdHRlZCBidXQgYHdpZHRoYCBzdXBwbGllZCwgYGhlaWdodGAgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZVxuICAgKiBjb250ZW50J3MgYm91bmRpbmcgYm94IHRvIHByZXNlcnZlIHRoZSBhc3BlY3QgcmF0aW8uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBjb250ZW50IGJvdW5kaW5nIGJveCBoZWlnaHQgd2hlbiBib3RoIGB3aWR0aGAgYW5kIGBoZWlnaHRgXG4gICAqIGFyZSBvbWl0dGVkLlxuICAgKi9cbiAgaGVpZ2h0PzogbnVtYmVyO1xuICAvKipcbiAgICogTGVmdCBjYW52YXMgb2Zmc2V0LiBCeSBkZWZhdWx0IHRoZSBjb29yZGluYXRlIGlzIHJlbGF0aXZlIHRvIHRoZSBjYW52YXMuXG4gICAqIFlvdSBjYW4gc3dpdGNoIHRvIGNvbnRlbnQgY29vcmRpbmF0ZXMgYnkgc2V0dGluZyBgb3JpZ2luYCB0byBgY29udGVudGAuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBgeGAgcG9zdGlvbiBvZiB0aGUgY29udGVudCBib3VuZGluZyBib3guXG4gICAqL1xuICB4PzogbnVtYmVyO1xuICAvKipcbiAgICogVG9wIGNhbnZhcyBvZmZzZXQuIEJ5IGRlZmF1bHQgdGhlIGNvb3JkaW5hdGUgaXMgcmVsYXRpdmUgdG8gdGhlIGNhbnZhcy5cbiAgICogWW91IGNhbiBzd2l0Y2ggdG8gY29udGVudCBjb29yZGluYXRlcyBieSBzZXR0aW5nIGBvcmlnaW5gIHRvIGBjb250ZW50YC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGB5YCBwb3N0aW9uIG9mIHRoZSBjb250ZW50IGJvdW5kaW5nIGJveC5cbiAgICovXG4gIHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBgeGAgYW5kIGB5YCB2YWx1ZXMuXG4gICAqXG4gICAqIC0gYGNhbnZhc2AgLSBgeGAgYW5kIGB5YCBhcmUgcmVsYXRpdmUgdG8gdGhlIGNhbnZhcyBbMCwgMF0gcG9zaXRpb24uXG4gICAqIC0gYGNvbnRlbnRgIC0gYHhgIGFuZCBgeWAgYXJlIHJlbGF0aXZlIHRvIHRoZSBjb250ZW50IGJvdW5kaW5nIGJveC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJjYW52YXNcIlxuICAgKi9cbiAgb3JpZ2luPzogXCJjYW52YXNcIiB8IFwiY29udGVudFwiO1xuICAvKipcbiAgICogSWYgZGltZW5zaW9ucyBzcGVjaWZpZWQgYW5kIGB4YCBhbmQgYHlgIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGlzIGluZGljYXRlc1xuICAgKiBob3cgdGhlIGNhbnZhcyBzaG91bGQgYmUgc2NhbGVkLlxuICAgKlxuICAgKiBCZWhhdmlvciBhbGlnbnMgd2l0aCB0aGUgYG9iamVjdC1maXRgIENTUyBwcm9wZXJ0eS5cbiAgICpcbiAgICogLSBgbm9uZWAgICAgLSBubyBzY2FsaW5nLlxuICAgKiAtIGBjb250YWluYCAtIHNjYWxlIHRvIGZpdCB0aGUgZnJhbWUuXG4gICAqIC0gYGNvdmVyYCAgIC0gc2NhbGUgdG8gZmlsbCB0aGUgZnJhbWUgd2hpbGUgbWFpbnRhaW5pbmcgYXNwZWN0IHJhdGlvLiBJZlxuICAgKiAgICAgICAgICAgICAgIGNvbnRlbnQgb3ZlcmZsb3dzLCBpdCB3aWxsIGJlIGNyb3BwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiY29udGFpblwiIHVubGVzcyBgeGAgb3IgYHlgIGFyZSBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgXCJub25lXCJcbiAgICogaXMgdXNlZCAoZm9yY2VkKS5cbiAgICovXG4gIGZpdD86IFwibm9uZVwiIHwgXCJjb250YWluXCIgfCBcImNvdmVyXCI7XG4gIC8qKlxuICAgKiBXaGVuIGVpdGhlciBgeGAgb3IgYHlgIGFyZSBub3Qgc3BlY2lmaWVkLCBpbmRpY2F0ZXMgaG93IHRoZSBjYW52YXMgc2hvdWxkXG4gICAqIGJlIGFsaWduZWQgb24gdGhlIHJlc3BlY3RpdmUgYXhpcy5cbiAgICpcbiAgICogLSBgbm9uZWAgICAtIGNhbnZhcyBhbGlnbmVkIHRvIHRvcCBsZWZ0LlxuICAgKiAtIGBjZW50ZXJgIC0gY2FudmFzIGlzIGNlbnRlcmVkIG9uIHRoZSBheGlzIHdoaWNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICogICAgICAgICAgICAgIChvciBib3RoKS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJjZW50ZXJcIlxuICAgKi9cbiAgcG9zaXRpb24/OiBcImNlbnRlclwiIHwgXCJub25lXCI7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIEEgbXVsdGlwbGllciB0byBpbmNyZWFzZS9kZWNyZWFzZSB0aGUgZnJhbWUgZGltZW5zaW9uc1xuICAgKiAoY29udGVudCByZXNvbHV0aW9uKS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdXIgY2FudmFzIGlzIDMwMHgxNTAgYW5kIHlvdSBzZXQgc2NhbGUgdG8gMiwgdGhlXG4gICAqIHJlc3VsdGluZyBzaXplIHdpbGwgYmUgNjAweDMwMC5cbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgc2NhbGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiB5b3UgbmVlZCB0byBzdXBseSB5b3VyIG93biBjYW52YXMsIGUuZy4gaW4gdGVzdCBlbnZpcm9ubWVudHMgb3IgaW5cbiAgICogTm9kZS5qcy5cbiAgICpcbiAgICogRG8gbm90IHNldCBgY2FudmFzLndpZHRoL2hlaWdodGAgb3IgbW9kaWZ5IHRoZSBjYW52YXMgY29udGV4dCBhcyB0aGF0J3NcbiAgICogaGFuZGxlZCBieSBFeGNhbGlkcmF3LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKWAuXG4gICAqL1xuICBjcmVhdGVDYW52YXM/OiAoKSA9PiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgLyoqXG4gICAqIElmIHlvdSB3YW50IHRvIHN1cHBseSBgd2lkdGhgL2BoZWlnaHRgIGR5bmFtaWNhbGx5IChvciBkZXJpdmUgZnJvbSB0aGVcbiAgICogY29udGVudCBib3VuZGluZyBib3gpLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBJZ25vcmVkIGlmIGBtYXhXaWR0aE9ySGVpZ2h0YCwgYHdpZHRoYCwgb3IgYGhlaWdodGAgaXMgc2V0LlxuICAgKi9cbiAgZ2V0RGltZW5zaW9ucz86IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IHNjYWxlPzogbnVtYmVyIH07XG59O1xuXG4vKipcbiAqIFRoaXMgQVBJIGlzIHVzdWFsbHkgdXNlZCBhcyBhIHByZWN1cnNvciB0byBzZWFyaWFsaXppbmcgdG8gQmxvYiBvciBQTkcsXG4gKiBidXQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSBjYW52YXMgZm9yIG90aGVyIHB1cnBvc2VzLlxuICovXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoe1xuICBkYXRhLFxuICBjb25maWcsXG59OiB7XG4gIGRhdGE6IEV4cG9ydFRvQ2FudmFzRGF0YTtcbiAgY29uZmlnPzogRXhwb3J0VG9DYW52YXNDb25maWc7XG59KSA9PiB7XG4gIC8vIGluaXRpYWxpemUgZGVmYXVsdHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGNvbnN0IHsgZWxlbWVudHMsIGZpbGVzIH0gPSBkYXRhO1xuXG4gIGNvbnN0IGFwcFN0YXRlID0gcmVzdG9yZUFwcFN0YXRlKGRhdGEuYXBwU3RhdGUsIG51bGwpO1xuXG4gIC8vIGNsb25lXG4gIGNvbnN0IGNmZyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZyk7XG5cbiAgaWYgKGNmZy54ICE9IG51bGwgfHwgY2ZnLnggIT0gbnVsbCkge1xuICAgIGlmIChjZmcuZml0ICE9IG51bGwgJiYgY2ZnLmZpdCAhPT0gXCJub25lXCIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gRU5WLlBST0RVQ1RJT04pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiYGZpdGAgd2lsbCBiZSBpZ25vcmVkIChhdXRvbWF0aWNhbGx5IHNldCB0byBgbm9uZWApIHdoZW4geW91IHNwZWNpZnkgYHhgIG9yIGB5YCBvZmZzZXRzXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNmZy5maXQgPSBcIm5vbmVcIjtcbiAgfVxuXG4gIGNmZy5maXQgPSBjZmcuZml0ID8/IFwiY29udGFpblwiO1xuXG4gIGlmIChjZmcuZml0ID09PSBcImNvdmVyXCIgJiYgY2ZnLnBhZGRpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IEVOVi5QUk9EVUNUSU9OKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJgcGFkZGluZ2AgaXMgaWdub3JlZCB3aGVuIGBmaXRgIGlzIHNldCB0byBgY292ZXJgXCIpO1xuICAgIH1cbiAgICBjZmcucGFkZGluZyA9IDA7XG4gIH1cblxuICBjZmcuc2NhbGUgPSBjZmcuc2NhbGUgPz8gMTtcblxuICBjZmcub3JpZ2luID0gY2ZnLm9yaWdpbiA/PyBcImNhbnZhc1wiO1xuICBjZmcucG9zaXRpb24gPSBjZmcucG9zaXRpb24gPz8gXCJjZW50ZXJcIjtcbiAgY2ZnLnBhZGRpbmcgPSBjZmcucGFkZGluZyA/PyBERUZBVUxUX0VYUE9SVF9QQURESU5HO1xuXG4gIGlmIChcbiAgICAoY2ZnLm1heFdpZHRoT3JIZWlnaHQgIT0gbnVsbCB8fCBjZmcud2lkdGggIT0gbnVsbCB8fCBjZmcuaGVpZ2h0ICE9IG51bGwpICYmXG4gICAgY2ZnLmdldERpbWVuc2lvbnNcbiAgKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuUFJPRFVDVElPTikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcImBnZXREaW1lbnNpb25zYCBpcyBpZ25vcmVkIHdoZW4gYHdpZHRoYCwgYGhlaWdodGAsIG9yIGBtYXhXaWR0aE9ySGVpZ2h0YCBpcyBzZXRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNmZy5nZXREaW1lbnNpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIHZhbHVlIHVzZWQgdG8gc2NhbGUgdGhlIGNhbnZhcyBjb250ZXh0LiBCeSBkZWZhdWx0LCB3ZSB1c2UgdGhpcyB0b1xuICAvLyBtYWtlIHRoZSBjYW52YXMgZml0IGludG8gdGhlIGZyYW1lIChlLmcuIGZvciBgY2ZnLmZpdGAgc2V0IHRvIGBjb250YWluYCkuXG4gIC8vIElmIGBjZmcuc2NhbGVgIGlzIHNldCwgd2UgbXVsdGlwbHkgdGhlIHJlc3VsdGluZyBjYW52YXNTY2FsZSBieSBpdCB0b1xuICAvLyBzY2FsZSB0aGUgb3V0cHV0IGZ1cnRoZXIuXG4gIGxldCBjYW52YXNTY2FsZSA9IDE7XG5cbiAgY29uc3Qgb3JpZ0NhbnZhc1NpemUgPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBjZmcucGFkZGluZyk7XG5cbiAgLy8gdmFyaWFibGVzIGZvciBvcmlnaW5hbCBjb250ZW50IGJvdW5kaW5nIGJveFxuICBjb25zdCBbb3JpZ1gsIG9yaWdZLCBvcmlnV2lkdGgsIG9yaWdIZWlnaHRdID0gb3JpZ0NhbnZhc1NpemU7XG4gIC8vIHZhcmlhYmxlcyBmb3IgdGFyZ2V0IGJvdW5kaW5nIGJveFxuICBsZXQgW3gsIHksIHdpZHRoLCBoZWlnaHRdID0gb3JpZ0NhbnZhc1NpemU7XG5cbiAgaWYgKGNmZy5tYXhXaWR0aE9ySGVpZ2h0ICE9IG51bGwpIHtcbiAgICAvLyBjYWxjdWxhdGUgYnkgaG93IG11Y2ggZG8gd2UgbmVlZCB0byBzY2FsZSB0aGUgY2FudmFzIHRvIGZpdCBpbnRvIHRoZVxuICAgIC8vIHRhcmdldCBkaW1lbnNpb24gKGUuZy4gdGFyZ2V0OiBtYXggNTBweCwgYWN0dWFsOiA3MHgxMDBweCA9PiBzY2FsZTogMC41KVxuICAgIGNhbnZhc1NjYWxlID0gY2ZnLm1heFdpZHRoT3JIZWlnaHQgLyBNYXRoLm1heChvcmlnV2lkdGgsIG9yaWdIZWlnaHQpO1xuXG4gICAgd2lkdGggKj0gY2FudmFzU2NhbGU7XG4gICAgaGVpZ2h0ICo9IGNhbnZhc1NjYWxlO1xuICB9IGVsc2UgaWYgKGNmZy53aWR0aCAhPSBudWxsKSB7XG4gICAgd2lkdGggPSBjZmcud2lkdGg7XG5cbiAgICBpZiAoY2ZnLmhlaWdodCkge1xuICAgICAgaGVpZ2h0ID0gY2ZnLmhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgaGVpZ2h0IG5vdCBzcGVjaWZpZWQsIHNjYWxlIHRoZSBvcmlnaW5hbCBoZWlnaHQgdG8gbWF0Y2ggdGhlIG5ld1xuICAgICAgLy8gd2lkdGggd2hpbGUgbWFpbnRhaW5pbmcgYXNwZWN0IHJhdGlvXG4gICAgICBoZWlnaHQgKj0gd2lkdGggLyBvcmlnV2lkdGg7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNmZy5oZWlnaHQgIT0gbnVsbCkge1xuICAgIGhlaWdodCA9IGNmZy5oZWlnaHQ7XG4gICAgLy8gd2lkdGggbm90IHNwZWNpZmllZCwgc28gc2NhbGUgdGhlIG9yaWdpbmFsIHdpZHRoIHRvIG1hdGNoIHRoZSBuZXdcbiAgICAvLyBoZWlnaHQgd2hpbGUgbWFpbnRhaW5pbmcgYXNwZWN0IHJhdGlvXG4gICAgd2lkdGggKj0gaGVpZ2h0IC8gb3JpZ0hlaWdodDtcbiAgfSBlbHNlIGlmIChjZmcuZ2V0RGltZW5zaW9ucykge1xuICAgIGNvbnN0IHJldCA9IGNmZy5nZXREaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgd2lkdGggPSByZXQud2lkdGg7XG4gICAgaGVpZ2h0ID0gcmV0LmhlaWdodDtcbiAgICBjZmcuc2NhbGUgPSByZXQuc2NhbGUgPz8gY2ZnLnNjYWxlO1xuICB9XG5cbiAgaWYgKGNmZy5maXQgPT09IFwiY29udGFpblwiICYmICFjZmcubWF4V2lkdGhPckhlaWdodCkge1xuICAgIGNvbnN0IHdSYXRpbyA9IHdpZHRoIC8gb3JpZ1dpZHRoO1xuICAgIGNvbnN0IGhSYXRpbyA9IGhlaWdodCAvIG9yaWdIZWlnaHQ7XG4gICAgLy8gc2NhbGUgdGhlIG9yaWcgY2FudmFzIHRvIGZpdCBpbiB0aGUgdGFyZ2V0IGZyYW1lXG4gICAgY2FudmFzU2NhbGUgPSBNYXRoLm1pbih3UmF0aW8sIGhSYXRpbyk7XG4gIH0gZWxzZSBpZiAoY2ZnLmZpdCA9PT0gXCJjb3ZlclwiKSB7XG4gICAgY29uc3Qgd1JhdGlvID0gd2lkdGggLyBvcmlnV2lkdGg7XG4gICAgY29uc3QgaFJhdGlvID0gaGVpZ2h0IC8gb3JpZ0hlaWdodDtcbiAgICAvLyBzY2FsZSB0aGUgb3JpZyBjYW52YXMgdG8gZmlsbCB0aGUgdGhlIHRhcmdldCBmcmFtZVxuICAgIC8vIChvcHBvc2l0ZSBvZiBcImNvbnRhaW5cIilcbiAgICBjYW52YXNTY2FsZSA9IE1hdGgubWF4KHdSYXRpbywgaFJhdGlvKTtcbiAgfVxuXG4gIHggPSBjZmcueCA/PyBvcmlnWDtcbiAgeSA9IGNmZy55ID8/IG9yaWdZO1xuXG4gIC8vIGlmIHdlIHN3aXRjaCB0byBcImNvbnRlbnRcIiBjb29yZHMsIHdlIG5lZWQgdG8gb2Zmc2V0IGNmZy1zdXBwbGllZFxuICAvLyBjb29yZHMgYnkgdGhlIHgveSBvZiBjb250ZW50IGJvdW5kaW5nIGJveFxuICBpZiAoY2ZnLm9yaWdpbiA9PT0gXCJjb250ZW50XCIpIHtcbiAgICBpZiAoY2ZnLnggIT0gbnVsbCkge1xuICAgICAgeCArPSBvcmlnWDtcbiAgICB9XG4gICAgaWYgKGNmZy55ICE9IG51bGwpIHtcbiAgICAgIHkgKz0gb3JpZ1k7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2VudGVyaW5nIHRoZSBjb250ZW50IHRvIHRoZSBmcmFtZS5cbiAgLy8gV2UgZGl2aWRlIHdpZHRoL2hlaWdodCBieSBjYW52YXNTY2FsZSBzbyB0aGF0IHdlIGNhbGN1bGF0ZSBpbiB0aGUgb3JpZ2luYWxcbiAgLy8gYXNwZWN0IHJhdGlvIGRpbWVuc2lvbnMuXG4gIGlmIChjZmcucG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcbiAgICBpZiAoY2ZnLnggPT0gbnVsbCkge1xuICAgICAgeCAtPSB3aWR0aCAvIGNhbnZhc1NjYWxlIC8gMiAtIG9yaWdXaWR0aCAvIDI7XG4gICAgfVxuICAgIGlmIChjZmcueSA9PSBudWxsKSB7XG4gICAgICB5IC09IGhlaWdodCAvIGNhbnZhc1NjYWxlIC8gMiAtIG9yaWdIZWlnaHQgLyAyO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNhbnZhcyA9IGNmZy5jcmVhdGVDYW52YXNcbiAgICA/IGNmZy5jcmVhdGVDYW52YXMoKVxuICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAvLyBzY2FsZSB0aGUgd2hvbGUgZnJhbWUgYnkgY2ZnLnNjYWxlIChvbiB0b3Agb2Ygd2hhdGV2ZXIgY2FudmFzU2NhbGUgd2VcbiAgLy8gY2FsY3VsYXRlZCBhYm92ZSlcbiAgY2FudmFzU2NhbGUgKj0gY2ZnLnNjYWxlO1xuICB3aWR0aCAqPSBjZmcuc2NhbGU7XG4gIGhlaWdodCAqPSBjZmcuc2NhbGU7XG5cbiAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgY29uc3QgeyBpbWFnZUNhY2hlIH0gPSBhd2FpdCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoXG4gICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5maWxlSWQsXG4gICAgKSxcbiAgICBmaWxlczogZmlsZXMgfHwge30sXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKHtcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgd2lkdGgsIGhlaWdodCwgb2Zmc2V0TGVmdDogMCwgb2Zmc2V0VG9wOiAwIH0sXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIGNhbnZhc0JhY2tncm91bmRDb2xvcjpcbiAgICAgICAgY2ZnLmNhbnZhc0JhY2tncm91bmRDb2xvciA9PT0gZmFsc2VcbiAgICAgICAgICA/IC8vIG51bGwgaW5kaWNhdGVzIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICA6IGNmZy5jYW52YXNCYWNrZ3JvdW5kQ29sb3IgfHxcbiAgICAgICAgICAgIGFwcFN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IgfHxcbiAgICAgICAgICAgIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUixcbiAgICAgIHNjcm9sbFg6IC14ICsgY2ZnLnBhZGRpbmcsXG4gICAgICBzY3JvbGxZOiAteSArIGNmZy5wYWRkaW5nLFxuICAgICAgY2FudmFzU2NhbGUsXG4gICAgICB6b29tOiB7IHZhbHVlOiBERUZBVUxUX1pPT01fVkFMVUUgfSxcbiAgICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3Jkczoge30sXG4gICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHt9LFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHt9LFxuICAgICAgdGhlbWU6IGNmZy50aGVtZSB8fCBUSEVNRS5MSUdIVCxcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4pOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+ID0+IHtcbiAgY29uc3Qge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmUsXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi8gXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKVxuICAgICAgKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vVmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbWluWDogbnVtYmVyLCBtaW5ZOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgcGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBwYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3695
|
+
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 _data_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\n/**\n * This API is usually used as a precursor to searializing to Blob or PNG,\n * but can also be used to create a canvas for other purposes.\n */\nconst exportToCanvas = ({ data, config, }) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n // initialize defaults\n // ---------------------------------------------------------------------------\n const { elements, files } = data;\n const appState = (0,_data_restore__WEBPACK_IMPORTED_MODULE_7__.restoreAppState)(data.appState, null);\n // clone\n const cfg = Object.assign({}, config);\n if (cfg.x != null || cfg.x != null) {\n if (cfg.fit != null && cfg.fit !== \"none\") {\n if (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_4__.ENV.PRODUCTION) {\n console.warn(\"`fit` will be ignored (automatically set to `none`) when you specify `x` or `y` offsets\");\n }\n }\n cfg.fit = \"none\";\n }\n cfg.fit = (_a = cfg.fit) !== null && _a !== void 0 ? _a : \"contain\";\n if (cfg.fit === \"cover\" && cfg.padding) {\n if (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_4__.ENV.PRODUCTION) {\n console.warn(\"`padding` is ignored when `fit` is set to `cover`\");\n }\n cfg.padding = 0;\n }\n cfg.scale = (_b = cfg.scale) !== null && _b !== void 0 ? _b : 1;\n cfg.origin = (_c = cfg.origin) !== null && _c !== void 0 ? _c : \"canvas\";\n cfg.position = (_d = cfg.position) !== null && _d !== void 0 ? _d : \"center\";\n cfg.padding = (_e = cfg.padding) !== null && _e !== void 0 ? _e : _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING;\n if ((cfg.maxWidthOrHeight != null || cfg.width != null || cfg.height != null) &&\n cfg.getDimensions) {\n if (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_4__.ENV.PRODUCTION) {\n console.warn(\"`getDimensions` is ignored when `width`, `height`, or `maxWidthOrHeight` is set\");\n }\n cfg.getDimensions = undefined;\n }\n // ---------------------------------------------------------------------------\n // value used to scale the canvas context. By default, we use this to\n // make the canvas fit into the frame (e.g. for `cfg.fit` set to `contain`).\n // If `cfg.scale` is set, we multiply the resulting canvasScale by it to\n // scale the output further.\n let canvasScale = 1;\n const origCanvasSize = getCanvasSize(elements, cfg.padding);\n // variables for original content bounding box\n const [origX, origY, origWidth, origHeight] = origCanvasSize;\n // variables for target bounding box\n let [x, y, width, height] = origCanvasSize;\n if (cfg.maxWidthOrHeight != null) {\n // calculate by how much do we need to scale the canvas to fit into the\n // target dimension (e.g. target: max 50px, actual: 70x100px => scale: 0.5)\n canvasScale = cfg.maxWidthOrHeight / Math.max(origWidth, origHeight);\n width *= canvasScale;\n height *= canvasScale;\n }\n else if (cfg.width != null) {\n width = cfg.width;\n if (cfg.height) {\n height = cfg.height;\n }\n else {\n // if height not specified, scale the original height to match the new\n // width while maintaining aspect ratio\n height *= width / origWidth;\n }\n }\n else if (cfg.height != null) {\n height = cfg.height;\n // width not specified, so scale the original width to match the new\n // height while maintaining aspect ratio\n width *= height / origHeight;\n }\n else if (cfg.getDimensions) {\n const ret = cfg.getDimensions(width, height);\n width = ret.width;\n height = ret.height;\n cfg.scale = (_f = ret.scale) !== null && _f !== void 0 ? _f : cfg.scale;\n }\n if (cfg.fit === \"contain\" && !cfg.maxWidthOrHeight) {\n const wRatio = width / origWidth;\n const hRatio = height / origHeight;\n // scale the orig canvas to fit in the target frame\n canvasScale = Math.min(wRatio, hRatio);\n }\n else if (cfg.fit === \"cover\") {\n const wRatio = width / origWidth;\n const hRatio = height / origHeight;\n // scale the orig canvas to fill the the target frame\n // (opposite of \"contain\")\n canvasScale = Math.max(wRatio, hRatio);\n }\n x = (_g = cfg.x) !== null && _g !== void 0 ? _g : origX;\n y = (_h = cfg.y) !== null && _h !== void 0 ? _h : origY;\n // if we switch to \"content\" coords, we need to offset cfg-supplied\n // coords by the x/y of content bounding box\n if (cfg.origin === \"content\") {\n if (cfg.x != null) {\n x += origX;\n }\n if (cfg.y != null) {\n y += origY;\n }\n }\n // Centering the content to the frame.\n // We divide width/height by canvasScale so that we calculate in the original\n // aspect ratio dimensions.\n if (cfg.position === \"center\") {\n if (cfg.x == null) {\n x -= width / canvasScale / 2 - origWidth / 2;\n }\n if (cfg.y == null) {\n y -= height / canvasScale / 2 - origHeight / 2;\n }\n }\n const canvas = cfg.createCanvas\n ? cfg.createCanvas()\n : document.createElement(\"canvas\");\n // scale the whole frame by cfg.scale (on top of whatever canvasScale we\n // calculated above)\n canvasScale *= cfg.scale;\n width *= cfg.scale;\n height *= cfg.scale;\n canvas.width = width;\n canvas.height = height;\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_6__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_6__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files: files || {},\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState: Object.assign(Object.assign({}, appState), { width, height, offsetLeft: 0, offsetTop: 0 }),\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n canvasBackgroundColor: cfg.canvasBackgroundColor === false\n ? // null indicates transparent background\n null\n : cfg.canvasBackgroundColor ||\n appState.viewBackgroundColor ||\n _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_BACKGROUND_COLOR,\n scrollX: -x + cfg.padding,\n scrollY: -y + cfg.padding,\n canvasScale,\n zoom: { value: _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_ZOOM_VALUE },\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: cfg.theme || _constants__WEBPACK_IMPORTED_MODULE_4__.THEME.LIGHT,\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_5__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@dwelle/excalidraw\"}@${\"0.4.0-570820c\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\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 `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, padding, scale) => {\n const [, , width, height] = getCanvasSize(elements, padding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDakQsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsUUFBZ0QsRUFDaEQsYUFBcUIsRUFDd0MsRUFBRTtJQUMvRCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZ0VBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxNQUFNLEtBQUssR0FBRyxnREFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLGdEQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFFcEUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVLLE1BQU0sYUFBYSxHQUFHLENBQzNCLFFBQWdELEVBQ2hELE9BQWUsRUFDZixLQUFhLEVBQ0ssRUFBRTtJQUNwQixNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FDOUQsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUM3QyxDQUFDO0lBRUYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LCBUaGVtZSB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1IsXG4gIERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gIERFRkFVTFRfWk9PTV9WQUxVRSxcbiAgRU5WLFxuICBTVkdfTlMsXG4gIFRIRU1FLFxuICBUSEVNRV9GSUxURVIsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUFzSlNPTiB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCB7XG4gIGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyxcbiAgdXBkYXRlSW1hZ2VDYWNoZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCB7IHJlc3RvcmVBcHBTdGF0ZSB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcblxuZXhwb3J0IGNvbnN0IFNWR19FWFBPUlRfVEFHID0gYDwhLS0gc3ZnLXNvdXJjZTpleGNhbGlkcmF3IC0tPmA7XG5cbmV4cG9ydCB0eXBlIEV4cG9ydFRvQ2FudmFzRGF0YSA9IHtcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdO1xuICBhcHBTdGF0ZT86IFBhcnRpYWw8T21pdDxBcHBTdGF0ZSwgXCJvZmZzZXRUb3BcIiB8IFwib2Zmc2V0TGVmdFwiPj47XG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBvcnRUb0NhbnZhc0NvbmZpZyA9IHtcbiAgdGhlbWU/OiBUaGVtZTtcbiAgLyoqXG4gICAqIENhbnZhcyBiYWNrZ3JvdW5kLiBWYWxpZCB2YWx1ZXMgYXJlOlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIC0gdGhlIGJhY2tncm91bmQgb2YgXCJhcHBTdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yXCIgaXMgdXNlZC5cbiAgICogLSBgZmFsc2VgIC0gbm8gYmFja2dyb3VuZCBpcyB1c2VkIChzZXQgdG8gXCJ0cmFuc3BhcmVudFwiKS5cbiAgICogLSBgc3RyaW5nYCAtIHNob3VsZCBiZSBhIHZhbGlkIENTUyBjb2xvci5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBjYW52YXNCYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmcgfCBmYWxzZTtcbiAgLyoqXG4gICAqIENhbnZhcyBwYWRkaW5nIGluIHBpeGVscy4gQWZmZWN0ZWQgYnkgc2NhbGUuIElnbm9yZWQgaWYgYGZpdGAgaXMgc2V0IHRvXG4gICAqIGBjb3ZlcmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBwYWRkaW5nPzogbnVtYmVyO1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBNYWtlcyBzdXJlIHRoZSBjYW52YXMgY29udGVudCBmaXRzIGludG8gYSBmcmFtZSBvZiB3aWR0aC9oZWlnaHQgbm8gbGFyZ2VyXG4gICAqIHRoYW4gdGhpcyB2YWx1ZSwgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGFzcGVjdCByYXRpby5cbiAgICpcbiAgICogRmluYWwgZGltZW5zaW9ucyBjYW4gZ2V0IHNtYWxsZXIvbGFyZ2VyIGlmIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgKiBgc2NhbGVgLlxuICAgKi9cbiAgbWF4V2lkdGhPckhlaWdodD86IG51bWJlcjtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogV2lkdGggb2YgdGhlIGZyYW1lLiBTdXBwbHkgYHhgIG9yIGB5YCBpZiB5b3Ugd2FudCB0byBvZnNzZXQgdGhlIGNhbnZhc1xuICAgKiBjb250ZW50LlxuICAgKlxuICAgKiBJZiBgd2lkdGhgIG9taXR0ZWQgYnV0IGBoZWlnaHRgIHN1cHBsaWVkLCBgd2lkdGhgIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGVcbiAgICogdGhlIGNvbnRlbnQncyBib3VuZGluZyBib3ggdG8gcHJlc2VydmUgdGhlIGFzcGVjdCByYXRpby5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGNvbnRlbnQgYm91bmRpbmcgYm94IHdpZHRoIHdoZW4gYm90aCBgd2lkdGhgIGFuZCBgaGVpZ2h0YFxuICAgKiBhcmUgb21pdHRlZC5cbiAgICovXG4gIHdpZHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogSGVpZ2h0IG9mIHRoZSBmcmFtZS5cbiAgICpcbiAgICogSWYgYGhlaWdodGAgb21pdHRlZCBidXQgYHdpZHRoYCBzdXBwbGllZCwgYGhlaWdodGAgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZVxuICAgKiBjb250ZW50J3MgYm91bmRpbmcgYm94IHRvIHByZXNlcnZlIHRoZSBhc3BlY3QgcmF0aW8uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBjb250ZW50IGJvdW5kaW5nIGJveCBoZWlnaHQgd2hlbiBib3RoIGB3aWR0aGAgYW5kIGBoZWlnaHRgXG4gICAqIGFyZSBvbWl0dGVkLlxuICAgKi9cbiAgaGVpZ2h0PzogbnVtYmVyO1xuICAvKipcbiAgICogTGVmdCBjYW52YXMgb2Zmc2V0LiBCeSBkZWZhdWx0IHRoZSBjb29yZGluYXRlIGlzIHJlbGF0aXZlIHRvIHRoZSBjYW52YXMuXG4gICAqIFlvdSBjYW4gc3dpdGNoIHRvIGNvbnRlbnQgY29vcmRpbmF0ZXMgYnkgc2V0dGluZyBgb3JpZ2luYCB0byBgY29udGVudGAuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBgeGAgcG9zdGlvbiBvZiB0aGUgY29udGVudCBib3VuZGluZyBib3guXG4gICAqL1xuICB4PzogbnVtYmVyO1xuICAvKipcbiAgICogVG9wIGNhbnZhcyBvZmZzZXQuIEJ5IGRlZmF1bHQgdGhlIGNvb3JkaW5hdGUgaXMgcmVsYXRpdmUgdG8gdGhlIGNhbnZhcy5cbiAgICogWW91IGNhbiBzd2l0Y2ggdG8gY29udGVudCBjb29yZGluYXRlcyBieSBzZXR0aW5nIGBvcmlnaW5gIHRvIGBjb250ZW50YC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGB5YCBwb3N0aW9uIG9mIHRoZSBjb250ZW50IGJvdW5kaW5nIGJveC5cbiAgICovXG4gIHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSBgeGAgYW5kIGB5YCB2YWx1ZXMuXG4gICAqXG4gICAqIC0gYGNhbnZhc2AgLSBgeGAgYW5kIGB5YCBhcmUgcmVsYXRpdmUgdG8gdGhlIGNhbnZhcyBbMCwgMF0gcG9zaXRpb24uXG4gICAqIC0gYGNvbnRlbnRgIC0gYHhgIGFuZCBgeWAgYXJlIHJlbGF0aXZlIHRvIHRoZSBjb250ZW50IGJvdW5kaW5nIGJveC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJjYW52YXNcIlxuICAgKi9cbiAgb3JpZ2luPzogXCJjYW52YXNcIiB8IFwiY29udGVudFwiO1xuICAvKipcbiAgICogSWYgZGltZW5zaW9ucyBzcGVjaWZpZWQgYW5kIGB4YCBhbmQgYHlgIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGlzIGluZGljYXRlc1xuICAgKiBob3cgdGhlIGNhbnZhcyBzaG91bGQgYmUgc2NhbGVkLlxuICAgKlxuICAgKiBCZWhhdmlvciBhbGlnbnMgd2l0aCB0aGUgYG9iamVjdC1maXRgIENTUyBwcm9wZXJ0eS5cbiAgICpcbiAgICogLSBgbm9uZWAgICAgLSBubyBzY2FsaW5nLlxuICAgKiAtIGBjb250YWluYCAtIHNjYWxlIHRvIGZpdCB0aGUgZnJhbWUuXG4gICAqIC0gYGNvdmVyYCAgIC0gc2NhbGUgdG8gZmlsbCB0aGUgZnJhbWUgd2hpbGUgbWFpbnRhaW5pbmcgYXNwZWN0IHJhdGlvLiBJZlxuICAgKiAgICAgICAgICAgICAgIGNvbnRlbnQgb3ZlcmZsb3dzLCBpdCB3aWxsIGJlIGNyb3BwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiY29udGFpblwiIHVubGVzcyBgeGAgb3IgYHlgIGFyZSBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgXCJub25lXCJcbiAgICogaXMgdXNlZCAoZm9yY2VkKS5cbiAgICovXG4gIGZpdD86IFwibm9uZVwiIHwgXCJjb250YWluXCIgfCBcImNvdmVyXCI7XG4gIC8qKlxuICAgKiBXaGVuIGVpdGhlciBgeGAgb3IgYHlgIGFyZSBub3Qgc3BlY2lmaWVkLCBpbmRpY2F0ZXMgaG93IHRoZSBjYW52YXMgc2hvdWxkXG4gICAqIGJlIGFsaWduZWQgb24gdGhlIHJlc3BlY3RpdmUgYXhpcy5cbiAgICpcbiAgICogLSBgbm9uZWAgICAtIGNhbnZhcyBhbGlnbmVkIHRvIHRvcCBsZWZ0LlxuICAgKiAtIGBjZW50ZXJgIC0gY2FudmFzIGlzIGNlbnRlcmVkIG9uIHRoZSBheGlzIHdoaWNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICogICAgICAgICAgICAgIChvciBib3RoKS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJjZW50ZXJcIlxuICAgKi9cbiAgcG9zaXRpb24/OiBcImNlbnRlclwiIHwgXCJub25lXCI7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIEEgbXVsdGlwbGllciB0byBpbmNyZWFzZS9kZWNyZWFzZSB0aGUgZnJhbWUgZGltZW5zaW9uc1xuICAgKiAoY29udGVudCByZXNvbHV0aW9uKS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdXIgY2FudmFzIGlzIDMwMHgxNTAgYW5kIHlvdSBzZXQgc2NhbGUgdG8gMiwgdGhlXG4gICAqIHJlc3VsdGluZyBzaXplIHdpbGwgYmUgNjAweDMwMC5cbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgc2NhbGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiB5b3UgbmVlZCB0byBzdXBseSB5b3VyIG93biBjYW52YXMsIGUuZy4gaW4gdGVzdCBlbnZpcm9ubWVudHMgb3IgaW5cbiAgICogTm9kZS5qcy5cbiAgICpcbiAgICogRG8gbm90IHNldCBgY2FudmFzLndpZHRoL2hlaWdodGAgb3IgbW9kaWZ5IHRoZSBjYW52YXMgY29udGV4dCBhcyB0aGF0J3NcbiAgICogaGFuZGxlZCBieSBFeGNhbGlkcmF3LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKWAuXG4gICAqL1xuICBjcmVhdGVDYW52YXM/OiAoKSA9PiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgLyoqXG4gICAqIElmIHlvdSB3YW50IHRvIHN1cHBseSBgd2lkdGhgL2BoZWlnaHRgIGR5bmFtaWNhbGx5IChvciBkZXJpdmUgZnJvbSB0aGVcbiAgICogY29udGVudCBib3VuZGluZyBib3gpLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBJZ25vcmVkIGlmIGBtYXhXaWR0aE9ySGVpZ2h0YCwgYHdpZHRoYCwgb3IgYGhlaWdodGAgaXMgc2V0LlxuICAgKi9cbiAgZ2V0RGltZW5zaW9ucz86IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IHNjYWxlPzogbnVtYmVyIH07XG59O1xuXG4vKipcbiAqIFRoaXMgQVBJIGlzIHVzdWFsbHkgdXNlZCBhcyBhIHByZWN1cnNvciB0byBzZWFyaWFsaXppbmcgdG8gQmxvYiBvciBQTkcsXG4gKiBidXQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSBjYW52YXMgZm9yIG90aGVyIHB1cnBvc2VzLlxuICovXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoe1xuICBkYXRhLFxuICBjb25maWcsXG59OiB7XG4gIGRhdGE6IEV4cG9ydFRvQ2FudmFzRGF0YTtcbiAgY29uZmlnPzogRXhwb3J0VG9DYW52YXNDb25maWc7XG59KSA9PiB7XG4gIC8vIGluaXRpYWxpemUgZGVmYXVsdHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGNvbnN0IHsgZWxlbWVudHMsIGZpbGVzIH0gPSBkYXRhO1xuXG4gIGNvbnN0IGFwcFN0YXRlID0gcmVzdG9yZUFwcFN0YXRlKGRhdGEuYXBwU3RhdGUsIG51bGwpO1xuXG4gIC8vIGNsb25lXG4gIGNvbnN0IGNmZyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZyk7XG5cbiAgaWYgKGNmZy54ICE9IG51bGwgfHwgY2ZnLnggIT0gbnVsbCkge1xuICAgIGlmIChjZmcuZml0ICE9IG51bGwgJiYgY2ZnLmZpdCAhPT0gXCJub25lXCIpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gRU5WLlBST0RVQ1RJT04pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiYGZpdGAgd2lsbCBiZSBpZ25vcmVkIChhdXRvbWF0aWNhbGx5IHNldCB0byBgbm9uZWApIHdoZW4geW91IHNwZWNpZnkgYHhgIG9yIGB5YCBvZmZzZXRzXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNmZy5maXQgPSBcIm5vbmVcIjtcbiAgfVxuXG4gIGNmZy5maXQgPSBjZmcuZml0ID8/IFwiY29udGFpblwiO1xuXG4gIGlmIChjZmcuZml0ID09PSBcImNvdmVyXCIgJiYgY2ZnLnBhZGRpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IEVOVi5QUk9EVUNUSU9OKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJgcGFkZGluZ2AgaXMgaWdub3JlZCB3aGVuIGBmaXRgIGlzIHNldCB0byBgY292ZXJgXCIpO1xuICAgIH1cbiAgICBjZmcucGFkZGluZyA9IDA7XG4gIH1cblxuICBjZmcuc2NhbGUgPSBjZmcuc2NhbGUgPz8gMTtcblxuICBjZmcub3JpZ2luID0gY2ZnLm9yaWdpbiA/PyBcImNhbnZhc1wiO1xuICBjZmcucG9zaXRpb24gPSBjZmcucG9zaXRpb24gPz8gXCJjZW50ZXJcIjtcbiAgY2ZnLnBhZGRpbmcgPSBjZmcucGFkZGluZyA/PyBERUZBVUxUX0VYUE9SVF9QQURESU5HO1xuXG4gIGlmIChcbiAgICAoY2ZnLm1heFdpZHRoT3JIZWlnaHQgIT0gbnVsbCB8fCBjZmcud2lkdGggIT0gbnVsbCB8fCBjZmcuaGVpZ2h0ICE9IG51bGwpICYmXG4gICAgY2ZnLmdldERpbWVuc2lvbnNcbiAgKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuUFJPRFVDVElPTikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcImBnZXREaW1lbnNpb25zYCBpcyBpZ25vcmVkIHdoZW4gYHdpZHRoYCwgYGhlaWdodGAsIG9yIGBtYXhXaWR0aE9ySGVpZ2h0YCBpcyBzZXRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNmZy5nZXREaW1lbnNpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIHZhbHVlIHVzZWQgdG8gc2NhbGUgdGhlIGNhbnZhcyBjb250ZXh0LiBCeSBkZWZhdWx0LCB3ZSB1c2UgdGhpcyB0b1xuICAvLyBtYWtlIHRoZSBjYW52YXMgZml0IGludG8gdGhlIGZyYW1lIChlLmcuIGZvciBgY2ZnLmZpdGAgc2V0IHRvIGBjb250YWluYCkuXG4gIC8vIElmIGBjZmcuc2NhbGVgIGlzIHNldCwgd2UgbXVsdGlwbHkgdGhlIHJlc3VsdGluZyBjYW52YXNTY2FsZSBieSBpdCB0b1xuICAvLyBzY2FsZSB0aGUgb3V0cHV0IGZ1cnRoZXIuXG4gIGxldCBjYW52YXNTY2FsZSA9IDE7XG5cbiAgY29uc3Qgb3JpZ0NhbnZhc1NpemUgPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBjZmcucGFkZGluZyk7XG5cbiAgLy8gdmFyaWFibGVzIGZvciBvcmlnaW5hbCBjb250ZW50IGJvdW5kaW5nIGJveFxuICBjb25zdCBbb3JpZ1gsIG9yaWdZLCBvcmlnV2lkdGgsIG9yaWdIZWlnaHRdID0gb3JpZ0NhbnZhc1NpemU7XG4gIC8vIHZhcmlhYmxlcyBmb3IgdGFyZ2V0IGJvdW5kaW5nIGJveFxuICBsZXQgW3gsIHksIHdpZHRoLCBoZWlnaHRdID0gb3JpZ0NhbnZhc1NpemU7XG5cbiAgaWYgKGNmZy5tYXhXaWR0aE9ySGVpZ2h0ICE9IG51bGwpIHtcbiAgICAvLyBjYWxjdWxhdGUgYnkgaG93IG11Y2ggZG8gd2UgbmVlZCB0byBzY2FsZSB0aGUgY2FudmFzIHRvIGZpdCBpbnRvIHRoZVxuICAgIC8vIHRhcmdldCBkaW1lbnNpb24gKGUuZy4gdGFyZ2V0OiBtYXggNTBweCwgYWN0dWFsOiA3MHgxMDBweCA9PiBzY2FsZTogMC41KVxuICAgIGNhbnZhc1NjYWxlID0gY2ZnLm1heFdpZHRoT3JIZWlnaHQgLyBNYXRoLm1heChvcmlnV2lkdGgsIG9yaWdIZWlnaHQpO1xuXG4gICAgd2lkdGggKj0gY2FudmFzU2NhbGU7XG4gICAgaGVpZ2h0ICo9IGNhbnZhc1NjYWxlO1xuICB9IGVsc2UgaWYgKGNmZy53aWR0aCAhPSBudWxsKSB7XG4gICAgd2lkdGggPSBjZmcud2lkdGg7XG5cbiAgICBpZiAoY2ZnLmhlaWdodCkge1xuICAgICAgaGVpZ2h0ID0gY2ZnLmhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgaGVpZ2h0IG5vdCBzcGVjaWZpZWQsIHNjYWxlIHRoZSBvcmlnaW5hbCBoZWlnaHQgdG8gbWF0Y2ggdGhlIG5ld1xuICAgICAgLy8gd2lkdGggd2hpbGUgbWFpbnRhaW5pbmcgYXNwZWN0IHJhdGlvXG4gICAgICBoZWlnaHQgKj0gd2lkdGggLyBvcmlnV2lkdGg7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNmZy5oZWlnaHQgIT0gbnVsbCkge1xuICAgIGhlaWdodCA9IGNmZy5oZWlnaHQ7XG4gICAgLy8gd2lkdGggbm90IHNwZWNpZmllZCwgc28gc2NhbGUgdGhlIG9yaWdpbmFsIHdpZHRoIHRvIG1hdGNoIHRoZSBuZXdcbiAgICAvLyBoZWlnaHQgd2hpbGUgbWFpbnRhaW5pbmcgYXNwZWN0IHJhdGlvXG4gICAgd2lkdGggKj0gaGVpZ2h0IC8gb3JpZ0hlaWdodDtcbiAgfSBlbHNlIGlmIChjZmcuZ2V0RGltZW5zaW9ucykge1xuICAgIGNvbnN0IHJldCA9IGNmZy5nZXREaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgd2lkdGggPSByZXQud2lkdGg7XG4gICAgaGVpZ2h0ID0gcmV0LmhlaWdodDtcbiAgICBjZmcuc2NhbGUgPSByZXQuc2NhbGUgPz8gY2ZnLnNjYWxlO1xuICB9XG5cbiAgaWYgKGNmZy5maXQgPT09IFwiY29udGFpblwiICYmICFjZmcubWF4V2lkdGhPckhlaWdodCkge1xuICAgIGNvbnN0IHdSYXRpbyA9IHdpZHRoIC8gb3JpZ1dpZHRoO1xuICAgIGNvbnN0IGhSYXRpbyA9IGhlaWdodCAvIG9yaWdIZWlnaHQ7XG4gICAgLy8gc2NhbGUgdGhlIG9yaWcgY2FudmFzIHRvIGZpdCBpbiB0aGUgdGFyZ2V0IGZyYW1lXG4gICAgY2FudmFzU2NhbGUgPSBNYXRoLm1pbih3UmF0aW8sIGhSYXRpbyk7XG4gIH0gZWxzZSBpZiAoY2ZnLmZpdCA9PT0gXCJjb3ZlclwiKSB7XG4gICAgY29uc3Qgd1JhdGlvID0gd2lkdGggLyBvcmlnV2lkdGg7XG4gICAgY29uc3QgaFJhdGlvID0gaGVpZ2h0IC8gb3JpZ0hlaWdodDtcbiAgICAvLyBzY2FsZSB0aGUgb3JpZyBjYW52YXMgdG8gZmlsbCB0aGUgdGhlIHRhcmdldCBmcmFtZVxuICAgIC8vIChvcHBvc2l0ZSBvZiBcImNvbnRhaW5cIilcbiAgICBjYW52YXNTY2FsZSA9IE1hdGgubWF4KHdSYXRpbywgaFJhdGlvKTtcbiAgfVxuXG4gIHggPSBjZmcueCA/PyBvcmlnWDtcbiAgeSA9IGNmZy55ID8/IG9yaWdZO1xuXG4gIC8vIGlmIHdlIHN3aXRjaCB0byBcImNvbnRlbnRcIiBjb29yZHMsIHdlIG5lZWQgdG8gb2Zmc2V0IGNmZy1zdXBwbGllZFxuICAvLyBjb29yZHMgYnkgdGhlIHgveSBvZiBjb250ZW50IGJvdW5kaW5nIGJveFxuICBpZiAoY2ZnLm9yaWdpbiA9PT0gXCJjb250ZW50XCIpIHtcbiAgICBpZiAoY2ZnLnggIT0gbnVsbCkge1xuICAgICAgeCArPSBvcmlnWDtcbiAgICB9XG4gICAgaWYgKGNmZy55ICE9IG51bGwpIHtcbiAgICAgIHkgKz0gb3JpZ1k7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2VudGVyaW5nIHRoZSBjb250ZW50IHRvIHRoZSBmcmFtZS5cbiAgLy8gV2UgZGl2aWRlIHdpZHRoL2hlaWdodCBieSBjYW52YXNTY2FsZSBzbyB0aGF0IHdlIGNhbGN1bGF0ZSBpbiB0aGUgb3JpZ2luYWxcbiAgLy8gYXNwZWN0IHJhdGlvIGRpbWVuc2lvbnMuXG4gIGlmIChjZmcucG9zaXRpb24gPT09IFwiY2VudGVyXCIpIHtcbiAgICBpZiAoY2ZnLnggPT0gbnVsbCkge1xuICAgICAgeCAtPSB3aWR0aCAvIGNhbnZhc1NjYWxlIC8gMiAtIG9yaWdXaWR0aCAvIDI7XG4gICAgfVxuICAgIGlmIChjZmcueSA9PSBudWxsKSB7XG4gICAgICB5IC09IGhlaWdodCAvIGNhbnZhc1NjYWxlIC8gMiAtIG9yaWdIZWlnaHQgLyAyO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNhbnZhcyA9IGNmZy5jcmVhdGVDYW52YXNcbiAgICA/IGNmZy5jcmVhdGVDYW52YXMoKVxuICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblxuICAvLyBzY2FsZSB0aGUgd2hvbGUgZnJhbWUgYnkgY2ZnLnNjYWxlIChvbiB0b3Agb2Ygd2hhdGV2ZXIgY2FudmFzU2NhbGUgd2VcbiAgLy8gY2FsY3VsYXRlZCBhYm92ZSlcbiAgY2FudmFzU2NhbGUgKj0gY2ZnLnNjYWxlO1xuICB3aWR0aCAqPSBjZmcuc2NhbGU7XG4gIGhlaWdodCAqPSBjZmcuc2NhbGU7XG5cbiAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgY29uc3QgeyBpbWFnZUNhY2hlIH0gPSBhd2FpdCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoXG4gICAgICAoZWxlbWVudCkgPT4gZWxlbWVudC5maWxlSWQsXG4gICAgKSxcbiAgICBmaWxlczogZmlsZXMgfHwge30sXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKHtcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZTogeyAuLi5hcHBTdGF0ZSwgd2lkdGgsIGhlaWdodCwgb2Zmc2V0TGVmdDogMCwgb2Zmc2V0VG9wOiAwIH0sXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIGNhbnZhc0JhY2tncm91bmRDb2xvcjpcbiAgICAgICAgY2ZnLmNhbnZhc0JhY2tncm91bmRDb2xvciA9PT0gZmFsc2VcbiAgICAgICAgICA/IC8vIG51bGwgaW5kaWNhdGVzIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICA6IGNmZy5jYW52YXNCYWNrZ3JvdW5kQ29sb3IgfHxcbiAgICAgICAgICAgIGFwcFN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IgfHxcbiAgICAgICAgICAgIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUixcbiAgICAgIHNjcm9sbFg6IC14ICsgY2ZnLnBhZGRpbmcsXG4gICAgICBzY3JvbGxZOiAteSArIGNmZy5wYWRkaW5nLFxuICAgICAgY2FudmFzU2NhbGUsXG4gICAgICB6b29tOiB7IHZhbHVlOiBERUZBVUxUX1pPT01fVkFMVUUgfSxcbiAgICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3Jkczoge30sXG4gICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHt9LFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHt9LFxuICAgICAgdGhlbWU6IGNmZy50aGVtZSB8fCBUSEVNRS5MSUdIVCxcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4pOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+ID0+IHtcbiAgY29uc3Qge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmUsXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi8gXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKVxuICAgICAgKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vVmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbWluWDogbnVtYmVyLCBtaW5ZOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgcGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBwYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3696
3696
|
|
|
3697
3697
|
/***/ }),
|
|
3698
3698
|
|