@excalidraw/excalidraw 0.16.1-4c35eba → 0.16.1-ceb637f
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.
|
@@ -2386,7 +2386,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2386
2386
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2387
2387
|
|
|
2388
2388
|
"use strict";
|
|
2389
|
-
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 // place here categories that you want to track as events\n // KEEP IN MIND THE PRICING\n const ALLOWED_CATEGORIES_TO_TRACK = []; // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n\n if (typeof window === \"undefined\" || ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_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\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.16.1-
|
|
2389
|
+
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 // place here categories that you want to track as events\n // KEEP IN MIND THE PRICING\n const ALLOWED_CATEGORIES_TO_TRACK = []; // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n\n if (typeof window === \"undefined\" || ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_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\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.16.1-ceb637f\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).VITE_WORKER_ID) {\n return;\n }\n\n if (!ALLOWED_CATEGORIES_TO_TRACK.includes(category)) {\n return;\n }\n\n if (window.sa_event) {\n window.sa_event(action, {\n category,\n label,\n value\n });\n }\n } catch (error) {\n console.error(\"error during analytics\", error);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QyxvQ0FBb0MsZ0NBQWdDOztBQUVwRSx5Q0FBeUMsOHFDQUFXO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FuYWx5dGljcy50cz81NjYxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0cmFja0V2ZW50ID0gKGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSkgPT4ge1xuICB0cnkge1xuICAgIC8vIHBsYWNlIGhlcmUgY2F0ZWdvcmllcyB0aGF0IHlvdSB3YW50IHRvIHRyYWNrIGFzIGV2ZW50c1xuICAgIC8vIEtFRVAgSU4gTUlORCBUSEUgUFJJQ0lOR1xuICAgIGNvbnN0IEFMTE9XRURfQ0FURUdPUklFU19UT19UUkFDSyA9IFtdOyAvLyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byB0cmFjayBsb2NhbGx5XG4gICAgLy8gY29uc29sZS5sb2coXCJUcmFjayBFdmVudFwiLCB7IGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSB9KTtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8IHByb2Nlc3MuZW52LlZJVEVfV09SS0VSX0lEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFBTExPV0VEX0NBVEVHT1JJRVNfVE9fVFJBQ0suaW5jbHVkZXMoY2F0ZWdvcnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5zYV9ldmVudCkge1xuICAgICAgd2luZG93LnNhX2V2ZW50KGFjdGlvbiwge1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcImVycm9yIGR1cmluZyBhbmFseXRpY3NcIiwgZXJyb3IpO1xuICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
|
|
2390
2390
|
|
|
2391
2391
|
/***/ }),
|
|
2392
2392
|
|
|
@@ -3992,7 +3992,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3992
3992
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3993
3993
|
|
|
3994
3994
|
"use strict";
|
|
3995
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElementsToFrame\": () => (/* binding */ addElementsToFrame),\n/* harmony export */ \"bindElementsToFramesAfterDuplication\": () => (/* binding */ bindElementsToFramesAfterDuplication),\n/* harmony export */ \"elementOverlapsWithFrame\": () => (/* binding */ elementOverlapsWithFrame),\n/* harmony export */ \"elementsAreInFrameBounds\": () => (/* binding */ elementsAreInFrameBounds),\n/* harmony export */ \"getContainingFrame\": () => (/* binding */ getContainingFrame),\n/* harmony export */ \"getElementsCompletelyInFrame\": () => (/* binding */ getElementsCompletelyInFrame),\n/* harmony export */ \"getElementsInNewFrame\": () => (/* binding */ getElementsInNewFrame),\n/* harmony export */ \"getElementsInResizingFrame\": () => (/* binding */ getElementsInResizingFrame),\n/* harmony export */ \"getElementsIntersectingFrame\": () => (/* binding */ getElementsIntersectingFrame),\n/* harmony export */ \"getFrameElements\": () => (/* binding */ getFrameElements),\n/* harmony export */ \"getTargetFrame\": () => (/* binding */ getTargetFrame),\n/* harmony export */ \"groupByFrames\": () => (/* binding */ groupByFrames),\n/* harmony export */ \"groupsAreAtLeastIntersectingTheFrame\": () => (/* binding */ groupsAreAtLeastIntersectingTheFrame),\n/* harmony export */ \"groupsAreCompletelyOutOfFrame\": () => (/* binding */ groupsAreCompletelyOutOfFrame),\n/* harmony export */ \"isCursorInFrame\": () => (/* binding */ isCursorInFrame),\n/* harmony export */ \"isElementContainingFrame\": () => (/* binding */ isElementContainingFrame),\n/* harmony export */ \"isElementInFrame\": () => (/* binding */ isElementInFrame),\n/* harmony export */ \"omitGroupsContainingFrames\": () => (/* binding */ omitGroupsContainingFrames),\n/* harmony export */ \"removeAllElementsFromFrame\": () => (/* binding */ removeAllElementsFromFrame),\n/* harmony export */ \"removeElementsFromFrame\": () => (/* binding */ removeElementsFromFrame),\n/* harmony export */ \"replaceAllElementsInFrame\": () => (/* binding */ replaceAllElementsInFrame),\n/* harmony export */ \"updateFrameMembershipOfSelectedElements\": () => (/* binding */ updateFrameMembershipOfSelectedElements)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math */ \"../../math.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"../../utils.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scene */ \"../../scene/index.ts\");\n/* harmony import */ var _zindex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./zindex */ \"../../zindex.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./groups */ \"../../groups.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./element/bounds */ \"../../element/bounds.ts\");\n\n\n\n\n\n\n\n\n\n\n // --------------------------- Frame State ------------------------------------\n\nconst bindElementsToFramesAfterDuplication = (nextElements, oldElements, oldIdToDuplicatedId) => {\n const nextElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.arrayToMap)(nextElements);\n\n for (const element of oldElements) {\n if (element.frameId) {\n // use its frameId to get the new frameId\n const nextElementId = oldIdToDuplicatedId.get(element.id);\n const nextFrameId = oldIdToDuplicatedId.get(element.frameId);\n\n if (nextElementId) {\n const nextElement = nextElementMap.get(nextElementId);\n\n if (nextElement) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(nextElement, {\n frameId: nextFrameId !== null && nextFrameId !== void 0 ? nextFrameId : element.frameId\n }, false);\n }\n }\n }\n }\n}; // --------------------------- Frame Geometry ---------------------------------\n\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n\n}\n\nclass LineSegment {\n constructor(pointA, pointB) {\n this.first = pointA;\n this.second = pointB;\n }\n\n getBoundingBox() {\n return [new Point(Math.min(this.first.x, this.second.x), Math.min(this.first.y, this.second.y)), new Point(Math.max(this.first.x, this.second.x), Math.max(this.first.y, this.second.y))];\n }\n\n} // https://martin-thoma.com/how-to-check-if-two-line-segments-intersect/\n\n\nclass FrameGeometry {\n static crossProduct(a, b) {\n return a.x * b.y - b.x * a.y;\n }\n\n static doBoundingBoxesIntersect(a, b) {\n return a[0].x <= b[1].x && a[1].x >= b[0].x && a[0].y <= b[1].y && a[1].y >= b[0].y;\n }\n\n static isPointOnLine(a, b) {\n const aTmp = new LineSegment(new Point(0, 0), new Point(a.second.x - a.first.x, a.second.y - a.first.y));\n const bTmp = new Point(b.x - a.first.x, b.y - a.first.y);\n const r = this.crossProduct(aTmp.second, bTmp);\n return Math.abs(r) < this.EPSILON;\n }\n\n static isPointRightOfLine(a, b) {\n const aTmp = new LineSegment(new Point(0, 0), new Point(a.second.x - a.first.x, a.second.y - a.first.y));\n const bTmp = new Point(b.x - a.first.x, b.y - a.first.y);\n return this.crossProduct(aTmp.second, bTmp) < 0;\n }\n\n static lineSegmentTouchesOrCrossesLine(a, b) {\n return this.isPointOnLine(a, b.first) || this.isPointOnLine(a, b.second) || (this.isPointRightOfLine(a, b.first) ? !this.isPointRightOfLine(a, b.second) : this.isPointRightOfLine(a, b.second));\n }\n\n static doLineSegmentsIntersect(a, b) {\n const aSegment = new LineSegment(new Point(a[0][0], a[0][1]), new Point(a[1][0], a[1][1]));\n const bSegment = new LineSegment(new Point(b[0][0], b[0][1]), new Point(b[1][0], b[1][1]));\n const box1 = aSegment.getBoundingBox();\n const box2 = bSegment.getBoundingBox();\n return this.doBoundingBoxesIntersect(box1, box2) && this.lineSegmentTouchesOrCrossesLine(aSegment, bSegment) && this.lineSegmentTouchesOrCrossesLine(bSegment, aSegment);\n }\n\n static isElementIntersectingFrame(element, frame) {\n const frameLineSegments = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_9__.getElementLineSegments)(frame);\n const elementLineSegments = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_9__.getElementLineSegments)(element);\n const intersecting = frameLineSegments.some(frameLineSegment => elementLineSegments.some(elementLineSegment => this.doLineSegmentsIntersect(frameLineSegment, elementLineSegment)));\n return intersecting;\n }\n\n}\n\nFrameGeometry.EPSILON = 0.000001;\nconst getElementsCompletelyInFrame = (elements, frame) => omitGroupsContainingFrames((0,_scene__WEBPACK_IMPORTED_MODULE_5__.getElementsWithinSelection)(elements, frame, false)).filter(element => element.type !== \"frame\" && !element.frameId || element.frameId === frame.id);\nconst isElementContainingFrame = (elements, element, frame) => {\n return (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getElementsWithinSelection)(elements, element).some(e => e.id === frame.id);\n};\nconst getElementsIntersectingFrame = (elements, frame) => elements.filter(element => FrameGeometry.isElementIntersectingFrame(element, frame));\nconst elementsAreInFrameBounds = (elements, frame) => {\n const [selectionX1, selectionY1, selectionX2, selectionY2] = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getElementAbsoluteCoords)(frame);\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getCommonBounds)(elements);\n return selectionX1 <= elementX1 && selectionY1 <= elementY1 && selectionX2 >= elementX2 && selectionY2 >= elementY2;\n};\nconst elementOverlapsWithFrame = (element, frame) => {\n return elementsAreInFrameBounds([element], frame) || FrameGeometry.isElementIntersectingFrame(element, frame) || isElementContainingFrame([frame], element, frame);\n};\nconst isCursorInFrame = (cursorCoords, frame) => {\n const [fx1, fy1, fx2, fy2] = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getElementAbsoluteCoords)(frame);\n return (0,_math__WEBPACK_IMPORTED_MODULE_1__.isPointWithinBounds)([fx1, fy1], [cursorCoords.x, cursorCoords.y], [fx2, fy2]);\n};\nconst groupsAreAtLeastIntersectingTheFrame = (elements, groupIds, frame) => {\n const elementsInGroup = groupIds.flatMap(groupId => (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(elements, groupId));\n\n if (elementsInGroup.length === 0) {\n return true;\n }\n\n return !!elementsInGroup.find(element => elementsAreInFrameBounds([element], frame) || FrameGeometry.isElementIntersectingFrame(element, frame));\n};\nconst groupsAreCompletelyOutOfFrame = (elements, groupIds, frame) => {\n const elementsInGroup = groupIds.flatMap(groupId => (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(elements, groupId));\n\n if (elementsInGroup.length === 0) {\n return true;\n }\n\n return elementsInGroup.find(element => elementsAreInFrameBounds([element], frame) || FrameGeometry.isElementIntersectingFrame(element, frame)) === undefined;\n}; // --------------------------- Frame Utils ------------------------------------\n\n/**\n * Returns a map of frameId to frame elements. Includes empty frames.\n */\n\nconst groupByFrames = elements => {\n const frameElementsMap = new Map();\n\n for (const element of elements) {\n const frameId = (0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(element) ? element.id : element.frameId;\n\n if (frameId && !frameElementsMap.has(frameId)) {\n frameElementsMap.set(frameId, getFrameElements(elements, frameId));\n }\n }\n\n return frameElementsMap;\n};\nconst getFrameElements = (allElements, frameId) => allElements.filter(element => element.frameId === frameId);\nconst getElementsInResizingFrame = (allElements, frame, appState) => {\n const prevElementsInFrame = getFrameElements(allElements, frame.id);\n const nextElementsInFrame = new Set(prevElementsInFrame);\n const elementsCompletelyInFrame = new Set([...getElementsCompletelyInFrame(allElements, frame), ...prevElementsInFrame.filter(element => isElementContainingFrame(allElements, element, frame))]);\n const elementsNotCompletelyInFrame = prevElementsInFrame.filter(element => !elementsCompletelyInFrame.has(element)); // for elements that are completely in the frame\n // if they are part of some groups, then those groups are still\n // considered to belong to the frame\n\n const groupsToKeep = new Set(Array.from(elementsCompletelyInFrame).flatMap(element => element.groupIds));\n\n for (const element of elementsNotCompletelyInFrame) {\n if (!FrameGeometry.isElementIntersectingFrame(element, frame)) {\n if (element.groupIds.length === 0) {\n nextElementsInFrame.delete(element);\n }\n } else if (element.groupIds.length > 0) {\n // group element intersects with the frame, we should keep the groups\n // that this element is part of\n for (const id of element.groupIds) {\n groupsToKeep.add(id);\n }\n }\n }\n\n for (const element of elementsNotCompletelyInFrame) {\n if (element.groupIds.length > 0) {\n let shouldRemoveElement = true;\n\n for (const id of element.groupIds) {\n if (groupsToKeep.has(id)) {\n shouldRemoveElement = false;\n }\n }\n\n if (shouldRemoveElement) {\n nextElementsInFrame.delete(element);\n }\n }\n }\n\n const individualElementsCompletelyInFrame = Array.from(elementsCompletelyInFrame).filter(element => element.groupIds.length === 0);\n\n for (const element of individualElementsCompletelyInFrame) {\n nextElementsInFrame.add(element);\n }\n\n const newGroupElementsCompletelyInFrame = Array.from(elementsCompletelyInFrame).filter(element => element.groupIds.length > 0);\n const groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_7__.selectGroupsFromGivenElements)(newGroupElementsCompletelyInFrame, appState); // new group elements\n\n for (const [id, isSelected] of Object.entries(groupIds)) {\n if (isSelected) {\n const elementsInGroup = (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(allElements, id);\n\n if (elementsAreInFrameBounds(elementsInGroup, frame)) {\n for (const element of elementsInGroup) {\n nextElementsInFrame.add(element);\n }\n }\n }\n }\n\n return [...nextElementsInFrame].filter(element => {\n return !((0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element) && element.containerId);\n });\n};\nconst getElementsInNewFrame = (allElements, frame) => {\n return omitGroupsContainingFrames(allElements, getElementsCompletelyInFrame(allElements, frame));\n};\nconst getContainingFrame = (element,\n/**\n * Optionally an elements map, in case the elements aren't in the Scene yet.\n * Takes precedence over Scene elements, even if the element exists\n * in Scene elements and not the supplied elements map.\n */\nelementsMap) => {\n var _a;\n\n if (element.frameId) {\n if (elementsMap) {\n return elementsMap.get(element.frameId) || null;\n }\n\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.frameId)) || null;\n }\n\n return null;\n}; // --------------------------- Frame Operations -------------------------------\n\nconst addElementsToFrame = (allElements, elementsToAdd, frame) => {\n const _elementsToAdd = [];\n\n for (const element of elementsToAdd) {\n _elementsToAdd.push(element);\n\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getBoundTextElement)(element);\n\n if (boundTextElement) {\n _elementsToAdd.push(boundTextElement);\n }\n }\n\n const allElementsIndex = allElements.reduce((acc, element, index) => {\n acc[element.id] = index;\n return acc;\n }, {});\n const frameIndex = allElementsIndex[frame.id]; // need to be calculated before the mutation below occurs\n\n const leftFrameBoundaryIndex = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.findIndex)(allElements, e => e.frameId === frame.id);\n const existingFrameChildren = allElements.filter(element => element.frameId === frame.id);\n const addedFrameChildren_left = [];\n const addedFrameChildren_right = [];\n\n for (const element of omitGroupsContainingFrames(allElements, _elementsToAdd)) {\n if (element.frameId !== frame.id && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(element)) {\n if (allElementsIndex[element.id] > frameIndex) {\n addedFrameChildren_right.push(element);\n } else {\n addedFrameChildren_left.push(element);\n }\n\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(element, {\n frameId: frame.id\n }, false);\n }\n }\n\n const frameElement = allElements[frameIndex];\n const nextFrameChildren = addedFrameChildren_left.concat(existingFrameChildren).concat(addedFrameChildren_right);\n const nextFrameChildrenMap = nextFrameChildren.reduce((acc, element) => {\n acc[element.id] = true;\n return acc;\n }, {});\n const nextOtherElements_left = allElements.slice(0, leftFrameBoundaryIndex >= 0 ? leftFrameBoundaryIndex : frameIndex).filter(element => !nextFrameChildrenMap[element.id]);\n const nextOtherElement_right = allElements.slice(frameIndex + 1).filter(element => !nextFrameChildrenMap[element.id]);\n const nextElements = nextOtherElements_left.concat(nextFrameChildren).concat([frameElement]).concat(nextOtherElement_right);\n return nextElements;\n};\nconst removeElementsFromFrame = (allElements, elementsToRemove, appState) => {\n const _elementsToRemove = [];\n\n for (const element of elementsToRemove) {\n if (element.frameId) {\n _elementsToRemove.push(element);\n\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getBoundTextElement)(element);\n\n if (boundTextElement) {\n _elementsToRemove.push(boundTextElement);\n }\n }\n }\n\n for (const element of _elementsToRemove) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(element, {\n frameId: null\n }, false);\n }\n\n const nextElements = (0,_zindex__WEBPACK_IMPORTED_MODULE_6__.moveOneRight)(allElements, appState, Array.from(_elementsToRemove));\n return nextElements;\n};\nconst removeAllElementsFromFrame = (allElements, frame, appState) => {\n const elementsInFrame = getFrameElements(allElements, frame.id);\n return removeElementsFromFrame(allElements, elementsInFrame, appState);\n};\nconst replaceAllElementsInFrame = (allElements, nextElementsInFrame, frame, appState) => {\n return addElementsToFrame(removeAllElementsFromFrame(allElements, frame, appState), nextElementsInFrame, frame);\n};\n/** does not mutate elements, but returns new ones */\n\nconst updateFrameMembershipOfSelectedElements = (allElements, appState, app) => {\n const selectedElements = app.scene.getSelectedElements({\n selectedElementIds: appState.selectedElementIds,\n // supplying elements explicitly in case we're passed non-state elements\n elements: allElements\n });\n const elementsToFilter = new Set(selectedElements);\n\n if (appState.editingGroupId) {\n for (const element of selectedElements) {\n if (element.groupIds.length === 0) {\n elementsToFilter.add(element);\n } else {\n element.groupIds.flatMap(gid => (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(allElements, gid)).forEach(element => elementsToFilter.add(element));\n }\n }\n }\n\n const elementsToRemove = new Set();\n elementsToFilter.forEach(element => {\n if (element.frameId && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(element) && !isElementInFrame(element, allElements, appState)) {\n elementsToRemove.add(element);\n }\n });\n return elementsToRemove.size > 0 ? removeElementsFromFrame(allElements, [...elementsToRemove], appState) : allElements;\n};\n/**\n * filters out elements that are inside groups that contain a frame element\n * anywhere in the group tree\n */\n\nconst omitGroupsContainingFrames = (allElements,\n/** subset of elements you want to filter. Optional perf optimization so we\n * don't have to filter all elements unnecessarily\n */\nselectedElements) => {\n const uniqueGroupIds = new Set();\n\n for (const el of selectedElements || allElements) {\n const topMostGroupId = el.groupIds[el.groupIds.length - 1];\n\n if (topMostGroupId) {\n uniqueGroupIds.add(topMostGroupId);\n }\n }\n\n const rejectedGroupIds = new Set();\n\n for (const groupId of uniqueGroupIds) {\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(allElements, groupId).some(el => (0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(el))) {\n rejectedGroupIds.add(groupId);\n }\n }\n\n return (selectedElements || allElements).filter(el => !rejectedGroupIds.has(el.groupIds[el.groupIds.length - 1]));\n};\n/**\n * depending on the appState, return target frame, which is the frame the given element\n * is going to be added to or remove from\n */\n\nconst getTargetFrame = (element, appState) => {\n const _element = (0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element) ? (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getContainerElement)(element) || element : element;\n\n return appState.selectedElementIds[_element.id] && appState.selectedElementsAreBeingDragged ? appState.frameToHighlight : getContainingFrame(_element);\n}; // TODO: this a huge bottleneck for large scenes, optimise\n// given an element, return if the element is in some frame\n\nconst isElementInFrame = (element, allElements, appState) => {\n const frame = getTargetFrame(element, appState);\n\n const _element = (0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element) ? (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getContainerElement)(element) || element : element;\n\n if (frame) {\n if (_element.groupIds.length === 0) {\n return elementOverlapsWithFrame(_element, frame);\n }\n\n const allElementsInGroup = new Set(_element.groupIds.flatMap(gid => (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(allElements, gid)));\n\n if (appState.editingGroupId && appState.selectedElementsAreBeingDragged) {\n const selectedElements = new Set((0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)(allElements, appState));\n const editingGroupOverlapsFrame = appState.frameToHighlight !== null;\n\n if (editingGroupOverlapsFrame) {\n return true;\n }\n\n selectedElements.forEach(selectedElement => {\n allElementsInGroup.delete(selectedElement);\n });\n }\n\n for (const elementInGroup of allElementsInGroup) {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(elementInGroup)) {\n return false;\n }\n }\n\n for (const elementInGroup of allElementsInGroup) {\n if (elementOverlapsWithFrame(elementInGroup, frame)) {\n return true;\n }\n }\n }\n\n return false;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTs7QUFFQTtBQUNBLElBQUkscUVBQWE7QUFDakI7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsdUJBQXVCLHFEQUFZO0FBQ25DO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1Isd0NBQXdDLDJEQUFrQjtBQUMxRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qix3REFBYztBQUMxQztBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFFBQVEsMkRBQWtCLGtDQUFrQyx3REFBYztBQUMxRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1AsbUJBQW1CLHVEQUFhLFlBQVkseUVBQW1COztBQUUvRDtBQUNBLEdBQUc7QUFDSDs7QUFFTztBQUNQOztBQUVBLG1CQUFtQix1REFBYSxZQUFZLHlFQUFtQjs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0VBQXdFLDJEQUFrQjs7QUFFMUY7QUFDQSx1Q0FBdUMsMkRBQW1CO0FBQzFEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsVUFBVSx3REFBYztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZnJhbWUudHM/ZGU0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMsIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcywgaXNUZXh0RWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnRcIjtcbmltcG9ydCB7IGlzUG9pbnRXaXRoaW5Cb3VuZHMgfSBmcm9tIFwiLi9tYXRoXCI7XG5pbXBvcnQgeyBnZXRCb3VuZFRleHRFbGVtZW50LCBnZXRDb250YWluZXJFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgYXJyYXlUb01hcCwgZmluZEluZGV4IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLCBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzRnJhbWVFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgbW92ZU9uZVJpZ2h0IH0gZnJvbSBcIi4vemluZGV4XCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50c0luR3JvdXAsIHNlbGVjdEdyb3Vwc0Zyb21HaXZlbkVsZW1lbnRzIH0gZnJvbSBcIi4vZ3JvdXBzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRMaW5lU2VnbWVudHMgfSBmcm9tIFwiLi9lbGVtZW50L2JvdW5kc1wiOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnJhbWUgU3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBiaW5kRWxlbWVudHNUb0ZyYW1lc0FmdGVyRHVwbGljYXRpb24gPSAobmV4dEVsZW1lbnRzLCBvbGRFbGVtZW50cywgb2xkSWRUb0R1cGxpY2F0ZWRJZCkgPT4ge1xuICBjb25zdCBuZXh0RWxlbWVudE1hcCA9IGFycmF5VG9NYXAobmV4dEVsZW1lbnRzKTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygb2xkRWxlbWVudHMpIHtcbiAgICBpZiAoZWxlbWVudC5mcmFtZUlkKSB7XG4gICAgICAvLyB1c2UgaXRzIGZyYW1lSWQgdG8gZ2V0IHRoZSBuZXcgZnJhbWVJZFxuICAgICAgY29uc3QgbmV4dEVsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGVsZW1lbnQuaWQpO1xuICAgICAgY29uc3QgbmV4dEZyYW1lSWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChlbGVtZW50LmZyYW1lSWQpO1xuXG4gICAgICBpZiAobmV4dEVsZW1lbnRJZCkge1xuICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IG5leHRFbGVtZW50TWFwLmdldChuZXh0RWxlbWVudElkKTtcblxuICAgICAgICBpZiAobmV4dEVsZW1lbnQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG5leHRFbGVtZW50LCB7XG4gICAgICAgICAgICBmcmFtZUlkOiBuZXh0RnJhbWVJZCAhPT0gbnVsbCAmJiBuZXh0RnJhbWVJZCAhPT0gdm9pZCAwID8gbmV4dEZyYW1lSWQgOiBlbGVtZW50LmZyYW1lSWRcbiAgICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGcmFtZSBHZW9tZXRyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY2xhc3MgUG9pbnQge1xuICBjb25zdHJ1Y3Rvcih4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbn1cblxuY2xhc3MgTGluZVNlZ21lbnQge1xuICBjb25zdHJ1Y3Rvcihwb2ludEEsIHBvaW50Qikge1xuICAgIHRoaXMuZmlyc3QgPSBwb2ludEE7XG4gICAgdGhpcy5zZWNvbmQgPSBwb2ludEI7XG4gIH1cblxuICBnZXRCb3VuZGluZ0JveCgpIHtcbiAgICByZXR1cm4gW25ldyBQb2ludChNYXRoLm1pbih0aGlzLmZpcnN0LngsIHRoaXMuc2Vjb25kLngpLCBNYXRoLm1pbih0aGlzLmZpcnN0LnksIHRoaXMuc2Vjb25kLnkpKSwgbmV3IFBvaW50KE1hdGgubWF4KHRoaXMuZmlyc3QueCwgdGhpcy5zZWNvbmQueCksIE1hdGgubWF4KHRoaXMuZmlyc3QueSwgdGhpcy5zZWNvbmQueSkpXTtcbiAgfVxuXG59IC8vIGh0dHBzOi8vbWFydGluLXRob21hLmNvbS9ob3ctdG8tY2hlY2staWYtdHdvLWxpbmUtc2VnbWVudHMtaW50ZXJzZWN0L1xuXG5cbmNsYXNzIEZyYW1lR2VvbWV0cnkge1xuICBzdGF0aWMgY3Jvc3NQcm9kdWN0KGEsIGIpIHtcbiAgICByZXR1cm4gYS54ICogYi55IC0gYi54ICogYS55O1xuICB9XG5cbiAgc3RhdGljIGRvQm91bmRpbmdCb3hlc0ludGVyc2VjdChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0ueCA8PSBiWzFdLnggJiYgYVsxXS54ID49IGJbMF0ueCAmJiBhWzBdLnkgPD0gYlsxXS55ICYmIGFbMV0ueSA+PSBiWzBdLnk7XG4gIH1cblxuICBzdGF0aWMgaXNQb2ludE9uTGluZShhLCBiKSB7XG4gICAgY29uc3QgYVRtcCA9IG5ldyBMaW5lU2VnbWVudChuZXcgUG9pbnQoMCwgMCksIG5ldyBQb2ludChhLnNlY29uZC54IC0gYS5maXJzdC54LCBhLnNlY29uZC55IC0gYS5maXJzdC55KSk7XG4gICAgY29uc3QgYlRtcCA9IG5ldyBQb2ludChiLnggLSBhLmZpcnN0LngsIGIueSAtIGEuZmlyc3QueSk7XG4gICAgY29uc3QgciA9IHRoaXMuY3Jvc3NQcm9kdWN0KGFUbXAuc2Vjb25kLCBiVG1wKTtcbiAgICByZXR1cm4gTWF0aC5hYnMocikgPCB0aGlzLkVQU0lMT047XG4gIH1cblxuICBzdGF0aWMgaXNQb2ludFJpZ2h0T2ZMaW5lKGEsIGIpIHtcbiAgICBjb25zdCBhVG1wID0gbmV3IExpbmVTZWdtZW50KG5ldyBQb2ludCgwLCAwKSwgbmV3IFBvaW50KGEuc2Vjb25kLnggLSBhLmZpcnN0LngsIGEuc2Vjb25kLnkgLSBhLmZpcnN0LnkpKTtcbiAgICBjb25zdCBiVG1wID0gbmV3IFBvaW50KGIueCAtIGEuZmlyc3QueCwgYi55IC0gYS5maXJzdC55KTtcbiAgICByZXR1cm4gdGhpcy5jcm9zc1Byb2R1Y3QoYVRtcC5zZWNvbmQsIGJUbXApIDwgMDtcbiAgfVxuXG4gIHN0YXRpYyBsaW5lU2VnbWVudFRvdWNoZXNPckNyb3NzZXNMaW5lKGEsIGIpIHtcbiAgICByZXR1cm4gdGhpcy5pc1BvaW50T25MaW5lKGEsIGIuZmlyc3QpIHx8IHRoaXMuaXNQb2ludE9uTGluZShhLCBiLnNlY29uZCkgfHwgKHRoaXMuaXNQb2ludFJpZ2h0T2ZMaW5lKGEsIGIuZmlyc3QpID8gIXRoaXMuaXNQb2ludFJpZ2h0T2ZMaW5lKGEsIGIuc2Vjb25kKSA6IHRoaXMuaXNQb2ludFJpZ2h0T2ZMaW5lKGEsIGIuc2Vjb25kKSk7XG4gIH1cblxuICBzdGF0aWMgZG9MaW5lU2VnbWVudHNJbnRlcnNlY3QoYSwgYikge1xuICAgIGNvbnN0IGFTZWdtZW50ID0gbmV3IExpbmVTZWdtZW50KG5ldyBQb2ludChhWzBdWzBdLCBhWzBdWzFdKSwgbmV3IFBvaW50KGFbMV1bMF0sIGFbMV1bMV0pKTtcbiAgICBjb25zdCBiU2VnbWVudCA9IG5ldyBMaW5lU2VnbWVudChuZXcgUG9pbnQoYlswXVswXSwgYlswXVsxXSksIG5ldyBQb2ludChiWzFdWzBdLCBiWzFdWzFdKSk7XG4gICAgY29uc3QgYm94MSA9IGFTZWdtZW50LmdldEJvdW5kaW5nQm94KCk7XG4gICAgY29uc3QgYm94MiA9IGJTZWdtZW50LmdldEJvdW5kaW5nQm94KCk7XG4gICAgcmV0dXJuIHRoaXMuZG9Cb3VuZGluZ0JveGVzSW50ZXJzZWN0KGJveDEsIGJveDIpICYmIHRoaXMubGluZVNlZ21lbnRUb3VjaGVzT3JDcm9zc2VzTGluZShhU2VnbWVudCwgYlNlZ21lbnQpICYmIHRoaXMubGluZVNlZ21lbnRUb3VjaGVzT3JDcm9zc2VzTGluZShiU2VnbWVudCwgYVNlZ21lbnQpO1xuICB9XG5cbiAgc3RhdGljIGlzRWxlbWVudEludGVyc2VjdGluZ0ZyYW1lKGVsZW1lbnQsIGZyYW1lKSB7XG4gICAgY29uc3QgZnJhbWVMaW5lU2VnbWVudHMgPSBnZXRFbGVtZW50TGluZVNlZ21lbnRzKGZyYW1lKTtcbiAgICBjb25zdCBlbGVtZW50TGluZVNlZ21lbnRzID0gZ2V0RWxlbWVudExpbmVTZWdtZW50cyhlbGVtZW50KTtcbiAgICBjb25zdCBpbnRlcnNlY3RpbmcgPSBmcmFtZUxpbmVTZWdtZW50cy5zb21lKGZyYW1lTGluZVNlZ21lbnQgPT4gZWxlbWVudExpbmVTZWdtZW50cy5zb21lKGVsZW1lbnRMaW5lU2VnbWVudCA9PiB0aGlzLmRvTGluZVNlZ21lbnRzSW50ZXJzZWN0KGZyYW1lTGluZVNlZ21lbnQsIGVsZW1lbnRMaW5lU2VnbWVudCkpKTtcbiAgICByZXR1cm4gaW50ZXJzZWN0aW5nO1xuICB9XG5cbn1cblxuRnJhbWVHZW9tZXRyeS5FUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSA9IChlbGVtZW50cywgZnJhbWUpID0+IG9taXRHcm91cHNDb250YWluaW5nRnJhbWVzKGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uKGVsZW1lbnRzLCBmcmFtZSwgZmFsc2UpKS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50LnR5cGUgIT09IFwiZnJhbWVcIiAmJiAhZWxlbWVudC5mcmFtZUlkIHx8IGVsZW1lbnQuZnJhbWVJZCA9PT0gZnJhbWUuaWQpO1xuZXhwb3J0IGNvbnN0IGlzRWxlbWVudENvbnRhaW5pbmdGcmFtZSA9IChlbGVtZW50cywgZWxlbWVudCwgZnJhbWUpID0+IHtcbiAgcmV0dXJuIGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uKGVsZW1lbnRzLCBlbGVtZW50KS5zb21lKGUgPT4gZS5pZCA9PT0gZnJhbWUuaWQpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0ludGVyc2VjdGluZ0ZyYW1lID0gKGVsZW1lbnRzLCBmcmFtZSkgPT4gZWxlbWVudHMuZmlsdGVyKGVsZW1lbnQgPT4gRnJhbWVHZW9tZXRyeS5pc0VsZW1lbnRJbnRlcnNlY3RpbmdGcmFtZShlbGVtZW50LCBmcmFtZSkpO1xuZXhwb3J0IGNvbnN0IGVsZW1lbnRzQXJlSW5GcmFtZUJvdW5kcyA9IChlbGVtZW50cywgZnJhbWUpID0+IHtcbiAgY29uc3QgW3NlbGVjdGlvblgxLCBzZWxlY3Rpb25ZMSwgc2VsZWN0aW9uWDIsIHNlbGVjdGlvblkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhmcmFtZSk7XG4gIGNvbnN0IFtlbGVtZW50WDEsIGVsZW1lbnRZMSwgZWxlbWVudFgyLCBlbGVtZW50WTJdID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIHNlbGVjdGlvblgxIDw9IGVsZW1lbnRYMSAmJiBzZWxlY3Rpb25ZMSA8PSBlbGVtZW50WTEgJiYgc2VsZWN0aW9uWDIgPj0gZWxlbWVudFgyICYmIHNlbGVjdGlvblkyID49IGVsZW1lbnRZMjtcbn07XG5leHBvcnQgY29uc3QgZWxlbWVudE92ZXJsYXBzV2l0aEZyYW1lID0gKGVsZW1lbnQsIGZyYW1lKSA9PiB7XG4gIHJldHVybiBlbGVtZW50c0FyZUluRnJhbWVCb3VuZHMoW2VsZW1lbnRdLCBmcmFtZSkgfHwgRnJhbWVHZW9tZXRyeS5pc0VsZW1lbnRJbnRlcnNlY3RpbmdGcmFtZShlbGVtZW50LCBmcmFtZSkgfHwgaXNFbGVtZW50Q29udGFpbmluZ0ZyYW1lKFtmcmFtZV0sIGVsZW1lbnQsIGZyYW1lKTtcbn07XG5leHBvcnQgY29uc3QgaXNDdXJzb3JJbkZyYW1lID0gKGN1cnNvckNvb3JkcywgZnJhbWUpID0+IHtcbiAgY29uc3QgW2Z4MSwgZnkxLCBmeDIsIGZ5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZnJhbWUpO1xuICByZXR1cm4gaXNQb2ludFdpdGhpbkJvdW5kcyhbZngxLCBmeTFdLCBbY3Vyc29yQ29vcmRzLngsIGN1cnNvckNvb3Jkcy55XSwgW2Z4MiwgZnkyXSk7XG59O1xuZXhwb3J0IGNvbnN0IGdyb3Vwc0FyZUF0TGVhc3RJbnRlcnNlY3RpbmdUaGVGcmFtZSA9IChlbGVtZW50cywgZ3JvdXBJZHMsIGZyYW1lKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzSW5Hcm91cCA9IGdyb3VwSWRzLmZsYXRNYXAoZ3JvdXBJZCA9PiBnZXRFbGVtZW50c0luR3JvdXAoZWxlbWVudHMsIGdyb3VwSWQpKTtcblxuICBpZiAoZWxlbWVudHNJbkdyb3VwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuICEhZWxlbWVudHNJbkdyb3VwLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50c0FyZUluRnJhbWVCb3VuZHMoW2VsZW1lbnRdLCBmcmFtZSkgfHwgRnJhbWVHZW9tZXRyeS5pc0VsZW1lbnRJbnRlcnNlY3RpbmdGcmFtZShlbGVtZW50LCBmcmFtZSkpO1xufTtcbmV4cG9ydCBjb25zdCBncm91cHNBcmVDb21wbGV0ZWx5T3V0T2ZGcmFtZSA9IChlbGVtZW50cywgZ3JvdXBJZHMsIGZyYW1lKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzSW5Hcm91cCA9IGdyb3VwSWRzLmZsYXRNYXAoZ3JvdXBJZCA9PiBnZXRFbGVtZW50c0luR3JvdXAoZWxlbWVudHMsIGdyb3VwSWQpKTtcblxuICBpZiAoZWxlbWVudHNJbkdyb3VwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRzSW5Hcm91cC5maW5kKGVsZW1lbnQgPT4gZWxlbWVudHNBcmVJbkZyYW1lQm91bmRzKFtlbGVtZW50XSwgZnJhbWUpIHx8IEZyYW1lR2VvbWV0cnkuaXNFbGVtZW50SW50ZXJzZWN0aW5nRnJhbWUoZWxlbWVudCwgZnJhbWUpKSA9PT0gdW5kZWZpbmVkO1xufTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZyYW1lIFV0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgZnJhbWVJZCB0byBmcmFtZSBlbGVtZW50cy4gSW5jbHVkZXMgZW1wdHkgZnJhbWVzLlxuICovXG5cbmV4cG9ydCBjb25zdCBncm91cEJ5RnJhbWVzID0gZWxlbWVudHMgPT4ge1xuICBjb25zdCBmcmFtZUVsZW1lbnRzTWFwID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IGZyYW1lSWQgPSBpc0ZyYW1lRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQuaWQgOiBlbGVtZW50LmZyYW1lSWQ7XG5cbiAgICBpZiAoZnJhbWVJZCAmJiAhZnJhbWVFbGVtZW50c01hcC5oYXMoZnJhbWVJZCkpIHtcbiAgICAgIGZyYW1lRWxlbWVudHNNYXAuc2V0KGZyYW1lSWQsIGdldEZyYW1lRWxlbWVudHMoZWxlbWVudHMsIGZyYW1lSWQpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnJhbWVFbGVtZW50c01hcDtcbn07XG5leHBvcnQgY29uc3QgZ2V0RnJhbWVFbGVtZW50cyA9IChhbGxFbGVtZW50cywgZnJhbWVJZCkgPT4gYWxsRWxlbWVudHMuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC5mcmFtZUlkID09PSBmcmFtZUlkKTtcbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0luUmVzaXppbmdGcmFtZSA9IChhbGxFbGVtZW50cywgZnJhbWUsIGFwcFN0YXRlKSA9PiB7XG4gIGNvbnN0IHByZXZFbGVtZW50c0luRnJhbWUgPSBnZXRGcmFtZUVsZW1lbnRzKGFsbEVsZW1lbnRzLCBmcmFtZS5pZCk7XG4gIGNvbnN0IG5leHRFbGVtZW50c0luRnJhbWUgPSBuZXcgU2V0KHByZXZFbGVtZW50c0luRnJhbWUpO1xuICBjb25zdCBlbGVtZW50c0NvbXBsZXRlbHlJbkZyYW1lID0gbmV3IFNldChbLi4uZ2V0RWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZShhbGxFbGVtZW50cywgZnJhbWUpLCAuLi5wcmV2RWxlbWVudHNJbkZyYW1lLmZpbHRlcihlbGVtZW50ID0+IGlzRWxlbWVudENvbnRhaW5pbmdGcmFtZShhbGxFbGVtZW50cywgZWxlbWVudCwgZnJhbWUpKV0pO1xuICBjb25zdCBlbGVtZW50c05vdENvbXBsZXRlbHlJbkZyYW1lID0gcHJldkVsZW1lbnRzSW5GcmFtZS5maWx0ZXIoZWxlbWVudCA9PiAhZWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZS5oYXMoZWxlbWVudCkpOyAvLyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgY29tcGxldGVseSBpbiB0aGUgZnJhbWVcbiAgLy8gaWYgdGhleSBhcmUgcGFydCBvZiBzb21lIGdyb3VwcywgdGhlbiB0aG9zZSBncm91cHMgYXJlIHN0aWxsXG4gIC8vIGNvbnNpZGVyZWQgdG8gYmVsb25nIHRvIHRoZSBmcmFtZVxuXG4gIGNvbnN0IGdyb3Vwc1RvS2VlcCA9IG5ldyBTZXQoQXJyYXkuZnJvbShlbGVtZW50c0NvbXBsZXRlbHlJbkZyYW1lKS5mbGF0TWFwKGVsZW1lbnQgPT4gZWxlbWVudC5ncm91cElkcykpO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c05vdENvbXBsZXRlbHlJbkZyYW1lKSB7XG4gICAgaWYgKCFGcmFtZUdlb21ldHJ5LmlzRWxlbWVudEludGVyc2VjdGluZ0ZyYW1lKGVsZW1lbnQsIGZyYW1lKSkge1xuICAgICAgaWYgKGVsZW1lbnQuZ3JvdXBJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG5leHRFbGVtZW50c0luRnJhbWUuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ncm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBncm91cCBlbGVtZW50IGludGVyc2VjdHMgd2l0aCB0aGUgZnJhbWUsIHdlIHNob3VsZCBrZWVwIHRoZSBncm91cHNcbiAgICAgIC8vIHRoYXQgdGhpcyBlbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgIGZvciAoY29uc3QgaWQgb2YgZWxlbWVudC5ncm91cElkcykge1xuICAgICAgICBncm91cHNUb0tlZXAuYWRkKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNOb3RDb21wbGV0ZWx5SW5GcmFtZSkge1xuICAgIGlmIChlbGVtZW50Lmdyb3VwSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBzaG91bGRSZW1vdmVFbGVtZW50ID0gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBpZCBvZiBlbGVtZW50Lmdyb3VwSWRzKSB7XG4gICAgICAgIGlmIChncm91cHNUb0tlZXAuaGFzKGlkKSkge1xuICAgICAgICAgIHNob3VsZFJlbW92ZUVsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlRWxlbWVudCkge1xuICAgICAgICBuZXh0RWxlbWVudHNJbkZyYW1lLmRlbGV0ZShlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBpbmRpdmlkdWFsRWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSA9IEFycmF5LmZyb20oZWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSkuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC5ncm91cElkcy5sZW5ndGggPT09IDApO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBpbmRpdmlkdWFsRWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSkge1xuICAgIG5leHRFbGVtZW50c0luRnJhbWUuYWRkKGVsZW1lbnQpO1xuICB9XG5cbiAgY29uc3QgbmV3R3JvdXBFbGVtZW50c0NvbXBsZXRlbHlJbkZyYW1lID0gQXJyYXkuZnJvbShlbGVtZW50c0NvbXBsZXRlbHlJbkZyYW1lKS5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50Lmdyb3VwSWRzLmxlbmd0aCA+IDApO1xuICBjb25zdCBncm91cElkcyA9IHNlbGVjdEdyb3Vwc0Zyb21HaXZlbkVsZW1lbnRzKG5ld0dyb3VwRWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSwgYXBwU3RhdGUpOyAvLyBuZXcgZ3JvdXAgZWxlbWVudHNcblxuICBmb3IgKGNvbnN0IFtpZCwgaXNTZWxlY3RlZF0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXBJZHMpKSB7XG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzSW5Hcm91cCA9IGdldEVsZW1lbnRzSW5Hcm91cChhbGxFbGVtZW50cywgaWQpO1xuXG4gICAgICBpZiAoZWxlbWVudHNBcmVJbkZyYW1lQm91bmRzKGVsZW1lbnRzSW5Hcm91cCwgZnJhbWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c0luR3JvdXApIHtcbiAgICAgICAgICBuZXh0RWxlbWVudHNJbkZyYW1lLmFkZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ubmV4dEVsZW1lbnRzSW5GcmFtZV0uZmlsdGVyKGVsZW1lbnQgPT4ge1xuICAgIHJldHVybiAhKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCk7XG4gIH0pO1xufTtcbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50c0luTmV3RnJhbWUgPSAoYWxsRWxlbWVudHMsIGZyYW1lKSA9PiB7XG4gIHJldHVybiBvbWl0R3JvdXBzQ29udGFpbmluZ0ZyYW1lcyhhbGxFbGVtZW50cywgZ2V0RWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZShhbGxFbGVtZW50cywgZnJhbWUpKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmluZ0ZyYW1lID0gKGVsZW1lbnQsXG4vKipcbiAqIE9wdGlvbmFsbHkgYW4gZWxlbWVudHMgbWFwLCBpbiBjYXNlIHRoZSBlbGVtZW50cyBhcmVuJ3QgaW4gdGhlIFNjZW5lIHlldC5cbiAqIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBTY2VuZSBlbGVtZW50cywgZXZlbiBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAqIGluIFNjZW5lIGVsZW1lbnRzIGFuZCBub3QgdGhlIHN1cHBsaWVkIGVsZW1lbnRzIG1hcC5cbiAqL1xuZWxlbWVudHNNYXApID0+IHtcbiAgdmFyIF9hO1xuXG4gIGlmIChlbGVtZW50LmZyYW1lSWQpIHtcbiAgICBpZiAoZWxlbWVudHNNYXApIHtcbiAgICAgIHJldHVybiBlbGVtZW50c01hcC5nZXQoZWxlbWVudC5mcmFtZUlkKSB8fCBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiAoKF9hID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRFbGVtZW50KGVsZW1lbnQuZnJhbWVJZCkpIHx8IG51bGw7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGcmFtZSBPcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IGFkZEVsZW1lbnRzVG9GcmFtZSA9IChhbGxFbGVtZW50cywgZWxlbWVudHNUb0FkZCwgZnJhbWUpID0+IHtcbiAgY29uc3QgX2VsZW1lbnRzVG9BZGQgPSBbXTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0FkZCkge1xuICAgIF9lbGVtZW50c1RvQWRkLnB1c2goZWxlbWVudCk7XG5cbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICBfZWxlbWVudHNUb0FkZC5wdXNoKGJvdW5kVGV4dEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFsbEVsZW1lbnRzSW5kZXggPSBhbGxFbGVtZW50cy5yZWR1Y2UoKGFjYywgZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICBhY2NbZWxlbWVudC5pZF0gPSBpbmRleDtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIGNvbnN0IGZyYW1lSW5kZXggPSBhbGxFbGVtZW50c0luZGV4W2ZyYW1lLmlkXTsgLy8gbmVlZCB0byBiZSBjYWxjdWxhdGVkIGJlZm9yZSB0aGUgbXV0YXRpb24gYmVsb3cgb2NjdXJzXG5cbiAgY29uc3QgbGVmdEZyYW1lQm91bmRhcnlJbmRleCA9IGZpbmRJbmRleChhbGxFbGVtZW50cywgZSA9PiBlLmZyYW1lSWQgPT09IGZyYW1lLmlkKTtcbiAgY29uc3QgZXhpc3RpbmdGcmFtZUNoaWxkcmVuID0gYWxsRWxlbWVudHMuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC5mcmFtZUlkID09PSBmcmFtZS5pZCk7XG4gIGNvbnN0IGFkZGVkRnJhbWVDaGlsZHJlbl9sZWZ0ID0gW107XG4gIGNvbnN0IGFkZGVkRnJhbWVDaGlsZHJlbl9yaWdodCA9IFtdO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBvbWl0R3JvdXBzQ29udGFpbmluZ0ZyYW1lcyhhbGxFbGVtZW50cywgX2VsZW1lbnRzVG9BZGQpKSB7XG4gICAgaWYgKGVsZW1lbnQuZnJhbWVJZCAhPT0gZnJhbWUuaWQgJiYgIWlzRnJhbWVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBpZiAoYWxsRWxlbWVudHNJbmRleFtlbGVtZW50LmlkXSA+IGZyYW1lSW5kZXgpIHtcbiAgICAgICAgYWRkZWRGcmFtZUNoaWxkcmVuX3JpZ2h0LnB1c2goZWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRlZEZyYW1lQ2hpbGRyZW5fbGVmdC5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgZnJhbWVJZDogZnJhbWUuaWRcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmcmFtZUVsZW1lbnQgPSBhbGxFbGVtZW50c1tmcmFtZUluZGV4XTtcbiAgY29uc3QgbmV4dEZyYW1lQ2hpbGRyZW4gPSBhZGRlZEZyYW1lQ2hpbGRyZW5fbGVmdC5jb25jYXQoZXhpc3RpbmdGcmFtZUNoaWxkcmVuKS5jb25jYXQoYWRkZWRGcmFtZUNoaWxkcmVuX3JpZ2h0KTtcbiAgY29uc3QgbmV4dEZyYW1lQ2hpbGRyZW5NYXAgPSBuZXh0RnJhbWVDaGlsZHJlbi5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgIGFjY1tlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICBjb25zdCBuZXh0T3RoZXJFbGVtZW50c19sZWZ0ID0gYWxsRWxlbWVudHMuc2xpY2UoMCwgbGVmdEZyYW1lQm91bmRhcnlJbmRleCA+PSAwID8gbGVmdEZyYW1lQm91bmRhcnlJbmRleCA6IGZyYW1lSW5kZXgpLmZpbHRlcihlbGVtZW50ID0+ICFuZXh0RnJhbWVDaGlsZHJlbk1hcFtlbGVtZW50LmlkXSk7XG4gIGNvbnN0IG5leHRPdGhlckVsZW1lbnRfcmlnaHQgPSBhbGxFbGVtZW50cy5zbGljZShmcmFtZUluZGV4ICsgMSkuZmlsdGVyKGVsZW1lbnQgPT4gIW5leHRGcmFtZUNoaWxkcmVuTWFwW2VsZW1lbnQuaWRdKTtcbiAgY29uc3QgbmV4dEVsZW1lbnRzID0gbmV4dE90aGVyRWxlbWVudHNfbGVmdC5jb25jYXQobmV4dEZyYW1lQ2hpbGRyZW4pLmNvbmNhdChbZnJhbWVFbGVtZW50XSkuY29uY2F0KG5leHRPdGhlckVsZW1lbnRfcmlnaHQpO1xuICByZXR1cm4gbmV4dEVsZW1lbnRzO1xufTtcbmV4cG9ydCBjb25zdCByZW1vdmVFbGVtZW50c0Zyb21GcmFtZSA9IChhbGxFbGVtZW50cywgZWxlbWVudHNUb1JlbW92ZSwgYXBwU3RhdGUpID0+IHtcbiAgY29uc3QgX2VsZW1lbnRzVG9SZW1vdmUgPSBbXTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb1JlbW92ZSkge1xuICAgIGlmIChlbGVtZW50LmZyYW1lSWQpIHtcbiAgICAgIF9lbGVtZW50c1RvUmVtb3ZlLnB1c2goZWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgICBfZWxlbWVudHNUb1JlbW92ZS5wdXNoKGJvdW5kVGV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBfZWxlbWVudHNUb1JlbW92ZSkge1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgZnJhbWVJZDogbnVsbFxuICAgIH0sIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IG5leHRFbGVtZW50cyA9IG1vdmVPbmVSaWdodChhbGxFbGVtZW50cywgYXBwU3RhdGUsIEFycmF5LmZyb20oX2VsZW1lbnRzVG9SZW1vdmUpKTtcbiAgcmV0dXJuIG5leHRFbGVtZW50cztcbn07XG5leHBvcnQgY29uc3QgcmVtb3ZlQWxsRWxlbWVudHNGcm9tRnJhbWUgPSAoYWxsRWxlbWVudHMsIGZyYW1lLCBhcHBTdGF0ZSkgPT4ge1xuICBjb25zdCBlbGVtZW50c0luRnJhbWUgPSBnZXRGcmFtZUVsZW1lbnRzKGFsbEVsZW1lbnRzLCBmcmFtZS5pZCk7XG4gIHJldHVybiByZW1vdmVFbGVtZW50c0Zyb21GcmFtZShhbGxFbGVtZW50cywgZWxlbWVudHNJbkZyYW1lLCBhcHBTdGF0ZSk7XG59O1xuZXhwb3J0IGNvbnN0IHJlcGxhY2VBbGxFbGVtZW50c0luRnJhbWUgPSAoYWxsRWxlbWVudHMsIG5leHRFbGVtZW50c0luRnJhbWUsIGZyYW1lLCBhcHBTdGF0ZSkgPT4ge1xuICByZXR1cm4gYWRkRWxlbWVudHNUb0ZyYW1lKHJlbW92ZUFsbEVsZW1lbnRzRnJvbUZyYW1lKGFsbEVsZW1lbnRzLCBmcmFtZSwgYXBwU3RhdGUpLCBuZXh0RWxlbWVudHNJbkZyYW1lLCBmcmFtZSk7XG59O1xuLyoqIGRvZXMgbm90IG11dGF0ZSBlbGVtZW50cywgYnV0IHJldHVybnMgbmV3IG9uZXMgKi9cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUZyYW1lTWVtYmVyc2hpcE9mU2VsZWN0ZWRFbGVtZW50cyA9IChhbGxFbGVtZW50cywgYXBwU3RhdGUsIGFwcCkgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gYXBwLnNjZW5lLmdldFNlbGVjdGVkRWxlbWVudHMoe1xuICAgIHNlbGVjdGVkRWxlbWVudElkczogYXBwU3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgIC8vIHN1cHBseWluZyBlbGVtZW50cyBleHBsaWNpdGx5IGluIGNhc2Ugd2UncmUgcGFzc2VkIG5vbi1zdGF0ZSBlbGVtZW50c1xuICAgIGVsZW1lbnRzOiBhbGxFbGVtZW50c1xuICB9KTtcbiAgY29uc3QgZWxlbWVudHNUb0ZpbHRlciA9IG5ldyBTZXQoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgaWYgKGFwcFN0YXRlLmVkaXRpbmdHcm91cElkKSB7XG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHNlbGVjdGVkRWxlbWVudHMpIHtcbiAgICAgIGlmIChlbGVtZW50Lmdyb3VwSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBlbGVtZW50c1RvRmlsdGVyLmFkZChlbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuZ3JvdXBJZHMuZmxhdE1hcChnaWQgPT4gZ2V0RWxlbWVudHNJbkdyb3VwKGFsbEVsZW1lbnRzLCBnaWQpKS5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudHNUb0ZpbHRlci5hZGQoZWxlbWVudCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnRzVG9SZW1vdmUgPSBuZXcgU2V0KCk7XG4gIGVsZW1lbnRzVG9GaWx0ZXIuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBpZiAoZWxlbWVudC5mcmFtZUlkICYmICFpc0ZyYW1lRWxlbWVudChlbGVtZW50KSAmJiAhaXNFbGVtZW50SW5GcmFtZShlbGVtZW50LCBhbGxFbGVtZW50cywgYXBwU3RhdGUpKSB7XG4gICAgICBlbGVtZW50c1RvUmVtb3ZlLmFkZChlbGVtZW50KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZWxlbWVudHNUb1JlbW92ZS5zaXplID4gMCA/IHJlbW92ZUVsZW1lbnRzRnJvbUZyYW1lKGFsbEVsZW1lbnRzLCBbLi4uZWxlbWVudHNUb1JlbW92ZV0sIGFwcFN0YXRlKSA6IGFsbEVsZW1lbnRzO1xufTtcbi8qKlxuICogZmlsdGVycyBvdXQgZWxlbWVudHMgdGhhdCBhcmUgaW5zaWRlIGdyb3VwcyB0aGF0IGNvbnRhaW4gYSBmcmFtZSBlbGVtZW50XG4gKiBhbnl3aGVyZSBpbiB0aGUgZ3JvdXAgdHJlZVxuICovXG5cbmV4cG9ydCBjb25zdCBvbWl0R3JvdXBzQ29udGFpbmluZ0ZyYW1lcyA9IChhbGxFbGVtZW50cyxcbi8qKiBzdWJzZXQgb2YgZWxlbWVudHMgeW91IHdhbnQgdG8gZmlsdGVyLiBPcHRpb25hbCBwZXJmIG9wdGltaXphdGlvbiBzbyB3ZVxuICogZG9uJ3QgaGF2ZSB0byBmaWx0ZXIgYWxsIGVsZW1lbnRzIHVubmVjZXNzYXJpbHlcbiAqL1xuc2VsZWN0ZWRFbGVtZW50cykgPT4ge1xuICBjb25zdCB1bmlxdWVHcm91cElkcyA9IG5ldyBTZXQoKTtcblxuICBmb3IgKGNvbnN0IGVsIG9mIHNlbGVjdGVkRWxlbWVudHMgfHwgYWxsRWxlbWVudHMpIHtcbiAgICBjb25zdCB0b3BNb3N0R3JvdXBJZCA9IGVsLmdyb3VwSWRzW2VsLmdyb3VwSWRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKHRvcE1vc3RHcm91cElkKSB7XG4gICAgICB1bmlxdWVHcm91cElkcy5hZGQodG9wTW9zdEdyb3VwSWQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlamVjdGVkR3JvdXBJZHMgPSBuZXcgU2V0KCk7XG5cbiAgZm9yIChjb25zdCBncm91cElkIG9mIHVuaXF1ZUdyb3VwSWRzKSB7XG4gICAgaWYgKGdldEVsZW1lbnRzSW5Hcm91cChhbGxFbGVtZW50cywgZ3JvdXBJZCkuc29tZShlbCA9PiBpc0ZyYW1lRWxlbWVudChlbCkpKSB7XG4gICAgICByZWplY3RlZEdyb3VwSWRzLmFkZChncm91cElkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKHNlbGVjdGVkRWxlbWVudHMgfHwgYWxsRWxlbWVudHMpLmZpbHRlcihlbCA9PiAhcmVqZWN0ZWRHcm91cElkcy5oYXMoZWwuZ3JvdXBJZHNbZWwuZ3JvdXBJZHMubGVuZ3RoIC0gMV0pKTtcbn07XG4vKipcbiAqIGRlcGVuZGluZyBvbiB0aGUgYXBwU3RhdGUsIHJldHVybiB0YXJnZXQgZnJhbWUsIHdoaWNoIGlzIHRoZSBmcmFtZSB0aGUgZ2l2ZW4gZWxlbWVudFxuICogaXMgZ29pbmcgdG8gYmUgYWRkZWQgdG8gb3IgcmVtb3ZlIGZyb21cbiAqL1xuXG5leHBvcnQgY29uc3QgZ2V0VGFyZ2V0RnJhbWUgPSAoZWxlbWVudCwgYXBwU3RhdGUpID0+IHtcbiAgY29uc3QgX2VsZW1lbnQgPSBpc1RleHRFbGVtZW50KGVsZW1lbnQpID8gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50IDogZWxlbWVudDtcblxuICByZXR1cm4gYXBwU3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW19lbGVtZW50LmlkXSAmJiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRzQXJlQmVpbmdEcmFnZ2VkID8gYXBwU3RhdGUuZnJhbWVUb0hpZ2hsaWdodCA6IGdldENvbnRhaW5pbmdGcmFtZShfZWxlbWVudCk7XG59OyAvLyBUT0RPOiB0aGlzIGEgaHVnZSBib3R0bGVuZWNrIGZvciBsYXJnZSBzY2VuZXMsIG9wdGltaXNlXG4vLyBnaXZlbiBhbiBlbGVtZW50LCByZXR1cm4gaWYgdGhlIGVsZW1lbnQgaXMgaW4gc29tZSBmcmFtZVxuXG5leHBvcnQgY29uc3QgaXNFbGVtZW50SW5GcmFtZSA9IChlbGVtZW50LCBhbGxFbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgY29uc3QgZnJhbWUgPSBnZXRUYXJnZXRGcmFtZShlbGVtZW50LCBhcHBTdGF0ZSk7XG5cbiAgY29uc3QgX2VsZW1lbnQgPSBpc1RleHRFbGVtZW50KGVsZW1lbnQpID8gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50IDogZWxlbWVudDtcblxuICBpZiAoZnJhbWUpIHtcbiAgICBpZiAoX2VsZW1lbnQuZ3JvdXBJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZWxlbWVudE92ZXJsYXBzV2l0aEZyYW1lKF9lbGVtZW50LCBmcmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsRWxlbWVudHNJbkdyb3VwID0gbmV3IFNldChfZWxlbWVudC5ncm91cElkcy5mbGF0TWFwKGdpZCA9PiBnZXRFbGVtZW50c0luR3JvdXAoYWxsRWxlbWVudHMsIGdpZCkpKTtcblxuICAgIGlmIChhcHBTdGF0ZS5lZGl0aW5nR3JvdXBJZCAmJiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRzQXJlQmVpbmdEcmFnZ2VkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gbmV3IFNldChnZXRTZWxlY3RlZEVsZW1lbnRzKGFsbEVsZW1lbnRzLCBhcHBTdGF0ZSkpO1xuICAgICAgY29uc3QgZWRpdGluZ0dyb3VwT3ZlcmxhcHNGcmFtZSA9IGFwcFN0YXRlLmZyYW1lVG9IaWdobGlnaHQgIT09IG51bGw7XG5cbiAgICAgIGlmIChlZGl0aW5nR3JvdXBPdmVybGFwc0ZyYW1lKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZWxlY3RlZEVsZW1lbnRzLmZvckVhY2goc2VsZWN0ZWRFbGVtZW50ID0+IHtcbiAgICAgICAgYWxsRWxlbWVudHNJbkdyb3VwLmRlbGV0ZShzZWxlY3RlZEVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50SW5Hcm91cCBvZiBhbGxFbGVtZW50c0luR3JvdXApIHtcbiAgICAgIGlmIChpc0ZyYW1lRWxlbWVudChlbGVtZW50SW5Hcm91cCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWxlbWVudEluR3JvdXAgb2YgYWxsRWxlbWVudHNJbkdyb3VwKSB7XG4gICAgICBpZiAoZWxlbWVudE92ZXJsYXBzV2l0aEZyYW1lKGVsZW1lbnRJbkdyb3VwLCBmcmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../frame.ts\n");
|
|
3995
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"addElementsToFrame\": () => (/* binding */ addElementsToFrame),\n/* harmony export */ \"bindElementsToFramesAfterDuplication\": () => (/* binding */ bindElementsToFramesAfterDuplication),\n/* harmony export */ \"elementOverlapsWithFrame\": () => (/* binding */ elementOverlapsWithFrame),\n/* harmony export */ \"elementsAreInFrameBounds\": () => (/* binding */ elementsAreInFrameBounds),\n/* harmony export */ \"getContainingFrame\": () => (/* binding */ getContainingFrame),\n/* harmony export */ \"getElementsCompletelyInFrame\": () => (/* binding */ getElementsCompletelyInFrame),\n/* harmony export */ \"getElementsInNewFrame\": () => (/* binding */ getElementsInNewFrame),\n/* harmony export */ \"getElementsInResizingFrame\": () => (/* binding */ getElementsInResizingFrame),\n/* harmony export */ \"getElementsIntersectingFrame\": () => (/* binding */ getElementsIntersectingFrame),\n/* harmony export */ \"getFrameElements\": () => (/* binding */ getFrameElements),\n/* harmony export */ \"getTargetFrame\": () => (/* binding */ getTargetFrame),\n/* harmony export */ \"groupByFrames\": () => (/* binding */ groupByFrames),\n/* harmony export */ \"groupsAreAtLeastIntersectingTheFrame\": () => (/* binding */ groupsAreAtLeastIntersectingTheFrame),\n/* harmony export */ \"groupsAreCompletelyOutOfFrame\": () => (/* binding */ groupsAreCompletelyOutOfFrame),\n/* harmony export */ \"isCursorInFrame\": () => (/* binding */ isCursorInFrame),\n/* harmony export */ \"isElementContainingFrame\": () => (/* binding */ isElementContainingFrame),\n/* harmony export */ \"isElementInFrame\": () => (/* binding */ isElementInFrame),\n/* harmony export */ \"omitGroupsContainingFrames\": () => (/* binding */ omitGroupsContainingFrames),\n/* harmony export */ \"removeAllElementsFromFrame\": () => (/* binding */ removeAllElementsFromFrame),\n/* harmony export */ \"removeElementsFromFrame\": () => (/* binding */ removeElementsFromFrame),\n/* harmony export */ \"replaceAllElementsInFrame\": () => (/* binding */ replaceAllElementsInFrame),\n/* harmony export */ \"updateFrameMembershipOfSelectedElements\": () => (/* binding */ updateFrameMembershipOfSelectedElements)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math */ \"../../math.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"../../utils.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scene */ \"../../scene/index.ts\");\n/* harmony import */ var _zindex__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./zindex */ \"../../zindex.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./groups */ \"../../groups.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./element/bounds */ \"../../element/bounds.ts\");\n\n\n\n\n\n\n\n\n\n\n // --------------------------- Frame State ------------------------------------\n\nconst bindElementsToFramesAfterDuplication = (nextElements, oldElements, oldIdToDuplicatedId) => {\n const nextElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.arrayToMap)(nextElements);\n\n for (const element of oldElements) {\n if (element.frameId) {\n // use its frameId to get the new frameId\n const nextElementId = oldIdToDuplicatedId.get(element.id);\n const nextFrameId = oldIdToDuplicatedId.get(element.frameId);\n\n if (nextElementId) {\n const nextElement = nextElementMap.get(nextElementId);\n\n if (nextElement) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(nextElement, {\n frameId: nextFrameId !== null && nextFrameId !== void 0 ? nextFrameId : element.frameId\n }, false);\n }\n }\n }\n }\n}; // --------------------------- Frame Geometry ---------------------------------\n\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n\n}\n\nclass LineSegment {\n constructor(pointA, pointB) {\n this.first = pointA;\n this.second = pointB;\n }\n\n getBoundingBox() {\n return [new Point(Math.min(this.first.x, this.second.x), Math.min(this.first.y, this.second.y)), new Point(Math.max(this.first.x, this.second.x), Math.max(this.first.y, this.second.y))];\n }\n\n} // https://martin-thoma.com/how-to-check-if-two-line-segments-intersect/\n\n\nclass FrameGeometry {\n static crossProduct(a, b) {\n return a.x * b.y - b.x * a.y;\n }\n\n static doBoundingBoxesIntersect(a, b) {\n return a[0].x <= b[1].x && a[1].x >= b[0].x && a[0].y <= b[1].y && a[1].y >= b[0].y;\n }\n\n static isPointOnLine(a, b) {\n const aTmp = new LineSegment(new Point(0, 0), new Point(a.second.x - a.first.x, a.second.y - a.first.y));\n const bTmp = new Point(b.x - a.first.x, b.y - a.first.y);\n const r = this.crossProduct(aTmp.second, bTmp);\n return Math.abs(r) < this.EPSILON;\n }\n\n static isPointRightOfLine(a, b) {\n const aTmp = new LineSegment(new Point(0, 0), new Point(a.second.x - a.first.x, a.second.y - a.first.y));\n const bTmp = new Point(b.x - a.first.x, b.y - a.first.y);\n return this.crossProduct(aTmp.second, bTmp) < 0;\n }\n\n static lineSegmentTouchesOrCrossesLine(a, b) {\n return this.isPointOnLine(a, b.first) || this.isPointOnLine(a, b.second) || (this.isPointRightOfLine(a, b.first) ? !this.isPointRightOfLine(a, b.second) : this.isPointRightOfLine(a, b.second));\n }\n\n static doLineSegmentsIntersect(a, b) {\n const aSegment = new LineSegment(new Point(a[0][0], a[0][1]), new Point(a[1][0], a[1][1]));\n const bSegment = new LineSegment(new Point(b[0][0], b[0][1]), new Point(b[1][0], b[1][1]));\n const box1 = aSegment.getBoundingBox();\n const box2 = bSegment.getBoundingBox();\n return this.doBoundingBoxesIntersect(box1, box2) && this.lineSegmentTouchesOrCrossesLine(aSegment, bSegment) && this.lineSegmentTouchesOrCrossesLine(bSegment, aSegment);\n }\n\n static isElementIntersectingFrame(element, frame) {\n const frameLineSegments = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_9__.getElementLineSegments)(frame);\n const elementLineSegments = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_9__.getElementLineSegments)(element);\n const intersecting = frameLineSegments.some(frameLineSegment => elementLineSegments.some(elementLineSegment => this.doLineSegmentsIntersect(frameLineSegment, elementLineSegment)));\n return intersecting;\n }\n\n}\n\nFrameGeometry.EPSILON = 0.000001;\nconst getElementsCompletelyInFrame = (elements, frame) => omitGroupsContainingFrames((0,_scene__WEBPACK_IMPORTED_MODULE_5__.getElementsWithinSelection)(elements, frame, false)).filter(element => element.type !== \"frame\" && !element.frameId || element.frameId === frame.id);\nconst isElementContainingFrame = (elements, element, frame) => {\n return (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getElementsWithinSelection)(elements, element).some(e => e.id === frame.id);\n};\nconst getElementsIntersectingFrame = (elements, frame) => elements.filter(element => FrameGeometry.isElementIntersectingFrame(element, frame));\nconst elementsAreInFrameBounds = (elements, frame) => {\n const [selectionX1, selectionY1, selectionX2, selectionY2] = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getElementAbsoluteCoords)(frame);\n const [elementX1, elementY1, elementX2, elementY2] = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getCommonBounds)(elements);\n return selectionX1 <= elementX1 && selectionY1 <= elementY1 && selectionX2 >= elementX2 && selectionY2 >= elementY2;\n};\nconst elementOverlapsWithFrame = (element, frame) => {\n return elementsAreInFrameBounds([element], frame) || FrameGeometry.isElementIntersectingFrame(element, frame) || isElementContainingFrame([frame], element, frame);\n};\nconst isCursorInFrame = (cursorCoords, frame) => {\n const [fx1, fy1, fx2, fy2] = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getElementAbsoluteCoords)(frame);\n return (0,_math__WEBPACK_IMPORTED_MODULE_1__.isPointWithinBounds)([fx1, fy1], [cursorCoords.x, cursorCoords.y], [fx2, fy2]);\n};\nconst groupsAreAtLeastIntersectingTheFrame = (elements, groupIds, frame) => {\n const elementsInGroup = groupIds.flatMap(groupId => (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(elements, groupId));\n\n if (elementsInGroup.length === 0) {\n return true;\n }\n\n return !!elementsInGroup.find(element => elementsAreInFrameBounds([element], frame) || FrameGeometry.isElementIntersectingFrame(element, frame));\n};\nconst groupsAreCompletelyOutOfFrame = (elements, groupIds, frame) => {\n const elementsInGroup = groupIds.flatMap(groupId => (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(elements, groupId));\n\n if (elementsInGroup.length === 0) {\n return true;\n }\n\n return elementsInGroup.find(element => elementsAreInFrameBounds([element], frame) || FrameGeometry.isElementIntersectingFrame(element, frame)) === undefined;\n}; // --------------------------- Frame Utils ------------------------------------\n\n/**\n * Returns a map of frameId to frame elements. Includes empty frames.\n */\n\nconst groupByFrames = elements => {\n const frameElementsMap = new Map();\n\n for (const element of elements) {\n const frameId = (0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(element) ? element.id : element.frameId;\n\n if (frameId && !frameElementsMap.has(frameId)) {\n frameElementsMap.set(frameId, getFrameElements(elements, frameId));\n }\n }\n\n return frameElementsMap;\n};\nconst getFrameElements = (allElements, frameId) => allElements.filter(element => element.frameId === frameId);\nconst getElementsInResizingFrame = (allElements, frame, appState) => {\n const prevElementsInFrame = getFrameElements(allElements, frame.id);\n const nextElementsInFrame = new Set(prevElementsInFrame);\n const elementsCompletelyInFrame = new Set([...getElementsCompletelyInFrame(allElements, frame), ...prevElementsInFrame.filter(element => isElementContainingFrame(allElements, element, frame))]);\n const elementsNotCompletelyInFrame = prevElementsInFrame.filter(element => !elementsCompletelyInFrame.has(element)); // for elements that are completely in the frame\n // if they are part of some groups, then those groups are still\n // considered to belong to the frame\n\n const groupsToKeep = new Set(Array.from(elementsCompletelyInFrame).flatMap(element => element.groupIds));\n\n for (const element of elementsNotCompletelyInFrame) {\n if (!FrameGeometry.isElementIntersectingFrame(element, frame)) {\n if (element.groupIds.length === 0) {\n nextElementsInFrame.delete(element);\n }\n } else if (element.groupIds.length > 0) {\n // group element intersects with the frame, we should keep the groups\n // that this element is part of\n for (const id of element.groupIds) {\n groupsToKeep.add(id);\n }\n }\n }\n\n for (const element of elementsNotCompletelyInFrame) {\n if (element.groupIds.length > 0) {\n let shouldRemoveElement = true;\n\n for (const id of element.groupIds) {\n if (groupsToKeep.has(id)) {\n shouldRemoveElement = false;\n }\n }\n\n if (shouldRemoveElement) {\n nextElementsInFrame.delete(element);\n }\n }\n }\n\n const individualElementsCompletelyInFrame = Array.from(elementsCompletelyInFrame).filter(element => element.groupIds.length === 0);\n\n for (const element of individualElementsCompletelyInFrame) {\n nextElementsInFrame.add(element);\n }\n\n const newGroupElementsCompletelyInFrame = Array.from(elementsCompletelyInFrame).filter(element => element.groupIds.length > 0);\n const groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_7__.selectGroupsFromGivenElements)(newGroupElementsCompletelyInFrame, appState); // new group elements\n\n for (const [id, isSelected] of Object.entries(groupIds)) {\n if (isSelected) {\n const elementsInGroup = (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(allElements, id);\n\n if (elementsAreInFrameBounds(elementsInGroup, frame)) {\n for (const element of elementsInGroup) {\n nextElementsInFrame.add(element);\n }\n }\n }\n }\n\n return [...nextElementsInFrame].filter(element => {\n return !((0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element) && element.containerId);\n });\n};\nconst getElementsInNewFrame = (allElements, frame) => {\n return omitGroupsContainingFrames(allElements, getElementsCompletelyInFrame(allElements, frame));\n};\nconst getContainingFrame = (element,\n/**\n * Optionally an elements map, in case the elements aren't in the Scene yet.\n * Takes precedence over Scene elements, even if the element exists\n * in Scene elements and not the supplied elements map.\n */\nelementsMap) => {\n var _a;\n\n if (element.frameId) {\n if (elementsMap) {\n return elementsMap.get(element.frameId) || null;\n }\n\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.frameId)) || null;\n }\n\n return null;\n}; // --------------------------- Frame Operations -------------------------------\n\nconst addElementsToFrame = (allElements, elementsToAdd, frame) => {\n const currTargetFrameChildrenMap = new Map(allElements.reduce((acc, element) => {\n if (element.frameId === frame.id) {\n acc.push([element.id, element]);\n }\n\n return acc;\n }, []));\n const suppliedElementsToAddSet = new Set(elementsToAdd.map(el => el.id));\n const finalElementsToAdd = []; // - add bound text elements if not already in the array\n // - filter out elements that are already in the frame\n\n for (const element of omitGroupsContainingFrames(allElements, elementsToAdd)) {\n if (!currTargetFrameChildrenMap.has(element.id)) {\n finalElementsToAdd.push(element);\n }\n\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getBoundTextElement)(element);\n\n if (boundTextElement && !suppliedElementsToAddSet.has(boundTextElement.id) && !currTargetFrameChildrenMap.has(boundTextElement.id)) {\n finalElementsToAdd.push(boundTextElement);\n }\n }\n\n const finalElementsToAddSet = new Set(finalElementsToAdd.map(el => el.id));\n const nextElements = [];\n const processedElements = new Set();\n\n for (const element of allElements) {\n if (processedElements.has(element.id)) {\n continue;\n }\n\n processedElements.add(element.id);\n\n if (finalElementsToAddSet.has(element.id) || element.frameId && element.frameId === frame.id) {\n // will be added in bulk once we process target frame\n continue;\n } // target frame\n\n\n if (element.id === frame.id) {\n const currFrameChildren = getFrameElements(allElements, frame.id);\n currFrameChildren.forEach(child => {\n processedElements.add(child.id);\n }); // console.log(currFrameChildren, finalElementsToAdd, element);\n\n nextElements.push(...currFrameChildren, ...finalElementsToAdd, element);\n continue;\n } // console.log(\"(2)\", element.frameId);\n\n\n nextElements.push(element);\n }\n\n for (const element of finalElementsToAdd) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(element, {\n frameId: frame.id\n }, false);\n }\n\n return nextElements;\n};\nconst removeElementsFromFrame = (allElements, elementsToRemove, appState) => {\n const _elementsToRemove = [];\n\n for (const element of elementsToRemove) {\n if (element.frameId) {\n _elementsToRemove.push(element);\n\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getBoundTextElement)(element);\n\n if (boundTextElement) {\n _elementsToRemove.push(boundTextElement);\n }\n }\n }\n\n for (const element of _elementsToRemove) {\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(element, {\n frameId: null\n }, false);\n }\n\n const nextElements = (0,_zindex__WEBPACK_IMPORTED_MODULE_6__.moveOneRight)(allElements, appState, Array.from(_elementsToRemove));\n return nextElements;\n};\nconst removeAllElementsFromFrame = (allElements, frame, appState) => {\n const elementsInFrame = getFrameElements(allElements, frame.id);\n return removeElementsFromFrame(allElements, elementsInFrame, appState);\n};\nconst replaceAllElementsInFrame = (allElements, nextElementsInFrame, frame, appState) => {\n return addElementsToFrame(removeAllElementsFromFrame(allElements, frame, appState), nextElementsInFrame, frame);\n};\n/** does not mutate elements, but returns new ones */\n\nconst updateFrameMembershipOfSelectedElements = (allElements, appState, app) => {\n const selectedElements = app.scene.getSelectedElements({\n selectedElementIds: appState.selectedElementIds,\n // supplying elements explicitly in case we're passed non-state elements\n elements: allElements\n });\n const elementsToFilter = new Set(selectedElements);\n\n if (appState.editingGroupId) {\n for (const element of selectedElements) {\n if (element.groupIds.length === 0) {\n elementsToFilter.add(element);\n } else {\n element.groupIds.flatMap(gid => (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(allElements, gid)).forEach(element => elementsToFilter.add(element));\n }\n }\n }\n\n const elementsToRemove = new Set();\n elementsToFilter.forEach(element => {\n if (element.frameId && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(element) && !isElementInFrame(element, allElements, appState)) {\n elementsToRemove.add(element);\n }\n });\n return elementsToRemove.size > 0 ? removeElementsFromFrame(allElements, [...elementsToRemove], appState) : allElements;\n};\n/**\n * filters out elements that are inside groups that contain a frame element\n * anywhere in the group tree\n */\n\nconst omitGroupsContainingFrames = (allElements,\n/** subset of elements you want to filter. Optional perf optimization so we\n * don't have to filter all elements unnecessarily\n */\nselectedElements) => {\n const uniqueGroupIds = new Set();\n\n for (const el of selectedElements || allElements) {\n const topMostGroupId = el.groupIds[el.groupIds.length - 1];\n\n if (topMostGroupId) {\n uniqueGroupIds.add(topMostGroupId);\n }\n }\n\n const rejectedGroupIds = new Set();\n\n for (const groupId of uniqueGroupIds) {\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(allElements, groupId).some(el => (0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(el))) {\n rejectedGroupIds.add(groupId);\n }\n }\n\n return (selectedElements || allElements).filter(el => !rejectedGroupIds.has(el.groupIds[el.groupIds.length - 1]));\n};\n/**\n * depending on the appState, return target frame, which is the frame the given element\n * is going to be added to or remove from\n */\n\nconst getTargetFrame = (element, appState) => {\n const _element = (0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element) ? (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getContainerElement)(element) || element : element;\n\n return appState.selectedElementIds[_element.id] && appState.selectedElementsAreBeingDragged ? appState.frameToHighlight : getContainingFrame(_element);\n}; // TODO: this a huge bottleneck for large scenes, optimise\n// given an element, return if the element is in some frame\n\nconst isElementInFrame = (element, allElements, appState) => {\n const frame = getTargetFrame(element, appState);\n\n const _element = (0,_element__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element) ? (0,_element_textElement__WEBPACK_IMPORTED_MODULE_2__.getContainerElement)(element) || element : element;\n\n if (frame) {\n if (_element.groupIds.length === 0) {\n return elementOverlapsWithFrame(_element, frame);\n }\n\n const allElementsInGroup = new Set(_element.groupIds.flatMap(gid => (0,_groups__WEBPACK_IMPORTED_MODULE_7__.getElementsInGroup)(allElements, gid)));\n\n if (appState.editingGroupId && appState.selectedElementsAreBeingDragged) {\n const selectedElements = new Set((0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)(allElements, appState));\n const editingGroupOverlapsFrame = appState.frameToHighlight !== null;\n\n if (editingGroupOverlapsFrame) {\n return true;\n }\n\n selectedElements.forEach(selectedElement => {\n allElementsInGroup.delete(selectedElement);\n });\n }\n\n for (const elementInGroup of allElementsInGroup) {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_0__.isFrameElement)(elementInGroup)) {\n return false;\n }\n }\n\n for (const elementInGroup of allElementsInGroup) {\n if (elementOverlapsWithFrame(elementInGroup, frame)) {\n return true;\n }\n }\n }\n\n return false;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUkscUVBQWE7QUFDakI7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsdUJBQXVCLHFEQUFZO0FBQ25DO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1Isd0NBQXdDLDJEQUFrQjtBQUMxRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRCQUE0Qix3REFBYztBQUMxQztBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFFBQVEsMkRBQWtCLGtDQUFrQyx3REFBYztBQUMxRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1AsbUJBQW1CLHVEQUFhLFlBQVkseUVBQW1COztBQUUvRDtBQUNBLEdBQUc7QUFDSDs7QUFFTztBQUNQOztBQUVBLG1CQUFtQix1REFBYSxZQUFZLHlFQUFtQjs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0VBQXdFLDJEQUFrQjs7QUFFMUY7QUFDQSx1Q0FBdUMsMkRBQW1CO0FBQzFEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsVUFBVSx3REFBYztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZnJhbWUudHM/ZGU0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMsIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcywgaXNUZXh0RWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnRcIjtcbmltcG9ydCB7IGlzUG9pbnRXaXRoaW5Cb3VuZHMgfSBmcm9tIFwiLi9tYXRoXCI7XG5pbXBvcnQgeyBnZXRCb3VuZFRleHRFbGVtZW50LCBnZXRDb250YWluZXJFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgYXJyYXlUb01hcCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbiwgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuL3NjZW5lXCI7XG5pbXBvcnQgeyBpc0ZyYW1lRWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnRcIjtcbmltcG9ydCB7IG1vdmVPbmVSaWdodCB9IGZyb20gXCIuL3ppbmRleFwiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudHNJbkdyb3VwLCBzZWxlY3RHcm91cHNGcm9tR2l2ZW5FbGVtZW50cyB9IGZyb20gXCIuL2dyb3Vwc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50TGluZVNlZ21lbnRzIH0gZnJvbSBcIi4vZWxlbWVudC9ib3VuZHNcIjsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZyYW1lIFN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgYmluZEVsZW1lbnRzVG9GcmFtZXNBZnRlckR1cGxpY2F0aW9uID0gKG5leHRFbGVtZW50cywgb2xkRWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpID0+IHtcbiAgY29uc3QgbmV4dEVsZW1lbnRNYXAgPSBhcnJheVRvTWFwKG5leHRFbGVtZW50cyk7XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIG9sZEVsZW1lbnRzKSB7XG4gICAgaWYgKGVsZW1lbnQuZnJhbWVJZCkge1xuICAgICAgLy8gdXNlIGl0cyBmcmFtZUlkIHRvIGdldCB0aGUgbmV3IGZyYW1lSWRcbiAgICAgIGNvbnN0IG5leHRFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChlbGVtZW50LmlkKTtcbiAgICAgIGNvbnN0IG5leHRGcmFtZUlkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoZWxlbWVudC5mcmFtZUlkKTtcblxuICAgICAgaWYgKG5leHRFbGVtZW50SWQpIHtcbiAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBuZXh0RWxlbWVudE1hcC5nZXQobmV4dEVsZW1lbnRJZCk7XG5cbiAgICAgICAgaWYgKG5leHRFbGVtZW50KSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXh0RWxlbWVudCwge1xuICAgICAgICAgICAgZnJhbWVJZDogbmV4dEZyYW1lSWQgIT09IG51bGwgJiYgbmV4dEZyYW1lSWQgIT09IHZvaWQgMCA/IG5leHRGcmFtZUlkIDogZWxlbWVudC5mcmFtZUlkXG4gICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnJhbWUgR2VvbWV0cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNsYXNzIFBvaW50IHtcbiAgY29uc3RydWN0b3IoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxuXG59XG5cbmNsYXNzIExpbmVTZWdtZW50IHtcbiAgY29uc3RydWN0b3IocG9pbnRBLCBwb2ludEIpIHtcbiAgICB0aGlzLmZpcnN0ID0gcG9pbnRBO1xuICAgIHRoaXMuc2Vjb25kID0gcG9pbnRCO1xuICB9XG5cbiAgZ2V0Qm91bmRpbmdCb3goKSB7XG4gICAgcmV0dXJuIFtuZXcgUG9pbnQoTWF0aC5taW4odGhpcy5maXJzdC54LCB0aGlzLnNlY29uZC54KSwgTWF0aC5taW4odGhpcy5maXJzdC55LCB0aGlzLnNlY29uZC55KSksIG5ldyBQb2ludChNYXRoLm1heCh0aGlzLmZpcnN0LngsIHRoaXMuc2Vjb25kLngpLCBNYXRoLm1heCh0aGlzLmZpcnN0LnksIHRoaXMuc2Vjb25kLnkpKV07XG4gIH1cblxufSAvLyBodHRwczovL21hcnRpbi10aG9tYS5jb20vaG93LXRvLWNoZWNrLWlmLXR3by1saW5lLXNlZ21lbnRzLWludGVyc2VjdC9cblxuXG5jbGFzcyBGcmFtZUdlb21ldHJ5IHtcbiAgc3RhdGljIGNyb3NzUHJvZHVjdChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAqIGIueSAtIGIueCAqIGEueTtcbiAgfVxuXG4gIHN0YXRpYyBkb0JvdW5kaW5nQm94ZXNJbnRlcnNlY3QoYSwgYikge1xuICAgIHJldHVybiBhWzBdLnggPD0gYlsxXS54ICYmIGFbMV0ueCA+PSBiWzBdLnggJiYgYVswXS55IDw9IGJbMV0ueSAmJiBhWzFdLnkgPj0gYlswXS55O1xuICB9XG5cbiAgc3RhdGljIGlzUG9pbnRPbkxpbmUoYSwgYikge1xuICAgIGNvbnN0IGFUbXAgPSBuZXcgTGluZVNlZ21lbnQobmV3IFBvaW50KDAsIDApLCBuZXcgUG9pbnQoYS5zZWNvbmQueCAtIGEuZmlyc3QueCwgYS5zZWNvbmQueSAtIGEuZmlyc3QueSkpO1xuICAgIGNvbnN0IGJUbXAgPSBuZXcgUG9pbnQoYi54IC0gYS5maXJzdC54LCBiLnkgLSBhLmZpcnN0LnkpO1xuICAgIGNvbnN0IHIgPSB0aGlzLmNyb3NzUHJvZHVjdChhVG1wLnNlY29uZCwgYlRtcCk7XG4gICAgcmV0dXJuIE1hdGguYWJzKHIpIDwgdGhpcy5FUFNJTE9OO1xuICB9XG5cbiAgc3RhdGljIGlzUG9pbnRSaWdodE9mTGluZShhLCBiKSB7XG4gICAgY29uc3QgYVRtcCA9IG5ldyBMaW5lU2VnbWVudChuZXcgUG9pbnQoMCwgMCksIG5ldyBQb2ludChhLnNlY29uZC54IC0gYS5maXJzdC54LCBhLnNlY29uZC55IC0gYS5maXJzdC55KSk7XG4gICAgY29uc3QgYlRtcCA9IG5ldyBQb2ludChiLnggLSBhLmZpcnN0LngsIGIueSAtIGEuZmlyc3QueSk7XG4gICAgcmV0dXJuIHRoaXMuY3Jvc3NQcm9kdWN0KGFUbXAuc2Vjb25kLCBiVG1wKSA8IDA7XG4gIH1cblxuICBzdGF0aWMgbGluZVNlZ21lbnRUb3VjaGVzT3JDcm9zc2VzTGluZShhLCBiKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQb2ludE9uTGluZShhLCBiLmZpcnN0KSB8fCB0aGlzLmlzUG9pbnRPbkxpbmUoYSwgYi5zZWNvbmQpIHx8ICh0aGlzLmlzUG9pbnRSaWdodE9mTGluZShhLCBiLmZpcnN0KSA/ICF0aGlzLmlzUG9pbnRSaWdodE9mTGluZShhLCBiLnNlY29uZCkgOiB0aGlzLmlzUG9pbnRSaWdodE9mTGluZShhLCBiLnNlY29uZCkpO1xuICB9XG5cbiAgc3RhdGljIGRvTGluZVNlZ21lbnRzSW50ZXJzZWN0KGEsIGIpIHtcbiAgICBjb25zdCBhU2VnbWVudCA9IG5ldyBMaW5lU2VnbWVudChuZXcgUG9pbnQoYVswXVswXSwgYVswXVsxXSksIG5ldyBQb2ludChhWzFdWzBdLCBhWzFdWzFdKSk7XG4gICAgY29uc3QgYlNlZ21lbnQgPSBuZXcgTGluZVNlZ21lbnQobmV3IFBvaW50KGJbMF1bMF0sIGJbMF1bMV0pLCBuZXcgUG9pbnQoYlsxXVswXSwgYlsxXVsxXSkpO1xuICAgIGNvbnN0IGJveDEgPSBhU2VnbWVudC5nZXRCb3VuZGluZ0JveCgpO1xuICAgIGNvbnN0IGJveDIgPSBiU2VnbWVudC5nZXRCb3VuZGluZ0JveCgpO1xuICAgIHJldHVybiB0aGlzLmRvQm91bmRpbmdCb3hlc0ludGVyc2VjdChib3gxLCBib3gyKSAmJiB0aGlzLmxpbmVTZWdtZW50VG91Y2hlc09yQ3Jvc3Nlc0xpbmUoYVNlZ21lbnQsIGJTZWdtZW50KSAmJiB0aGlzLmxpbmVTZWdtZW50VG91Y2hlc09yQ3Jvc3Nlc0xpbmUoYlNlZ21lbnQsIGFTZWdtZW50KTtcbiAgfVxuXG4gIHN0YXRpYyBpc0VsZW1lbnRJbnRlcnNlY3RpbmdGcmFtZShlbGVtZW50LCBmcmFtZSkge1xuICAgIGNvbnN0IGZyYW1lTGluZVNlZ21lbnRzID0gZ2V0RWxlbWVudExpbmVTZWdtZW50cyhmcmFtZSk7XG4gICAgY29uc3QgZWxlbWVudExpbmVTZWdtZW50cyA9IGdldEVsZW1lbnRMaW5lU2VnbWVudHMoZWxlbWVudCk7XG4gICAgY29uc3QgaW50ZXJzZWN0aW5nID0gZnJhbWVMaW5lU2VnbWVudHMuc29tZShmcmFtZUxpbmVTZWdtZW50ID0+IGVsZW1lbnRMaW5lU2VnbWVudHMuc29tZShlbGVtZW50TGluZVNlZ21lbnQgPT4gdGhpcy5kb0xpbmVTZWdtZW50c0ludGVyc2VjdChmcmFtZUxpbmVTZWdtZW50LCBlbGVtZW50TGluZVNlZ21lbnQpKSk7XG4gICAgcmV0dXJuIGludGVyc2VjdGluZztcbiAgfVxuXG59XG5cbkZyYW1lR2VvbWV0cnkuRVBTSUxPTiA9IDAuMDAwMDAxO1xuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRzQ29tcGxldGVseUluRnJhbWUgPSAoZWxlbWVudHMsIGZyYW1lKSA9PiBvbWl0R3JvdXBzQ29udGFpbmluZ0ZyYW1lcyhnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihlbGVtZW50cywgZnJhbWUsIGZhbHNlKSkuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC50eXBlICE9PSBcImZyYW1lXCIgJiYgIWVsZW1lbnQuZnJhbWVJZCB8fCBlbGVtZW50LmZyYW1lSWQgPT09IGZyYW1lLmlkKTtcbmV4cG9ydCBjb25zdCBpc0VsZW1lbnRDb250YWluaW5nRnJhbWUgPSAoZWxlbWVudHMsIGVsZW1lbnQsIGZyYW1lKSA9PiB7XG4gIHJldHVybiBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihlbGVtZW50cywgZWxlbWVudCkuc29tZShlID0+IGUuaWQgPT09IGZyYW1lLmlkKTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNJbnRlcnNlY3RpbmdGcmFtZSA9IChlbGVtZW50cywgZnJhbWUpID0+IGVsZW1lbnRzLmZpbHRlcihlbGVtZW50ID0+IEZyYW1lR2VvbWV0cnkuaXNFbGVtZW50SW50ZXJzZWN0aW5nRnJhbWUoZWxlbWVudCwgZnJhbWUpKTtcbmV4cG9ydCBjb25zdCBlbGVtZW50c0FyZUluRnJhbWVCb3VuZHMgPSAoZWxlbWVudHMsIGZyYW1lKSA9PiB7XG4gIGNvbnN0IFtzZWxlY3Rpb25YMSwgc2VsZWN0aW9uWTEsIHNlbGVjdGlvblgyLCBzZWxlY3Rpb25ZMl0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZnJhbWUpO1xuICBjb25zdCBbZWxlbWVudFgxLCBlbGVtZW50WTEsIGVsZW1lbnRYMiwgZWxlbWVudFkyXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIHJldHVybiBzZWxlY3Rpb25YMSA8PSBlbGVtZW50WDEgJiYgc2VsZWN0aW9uWTEgPD0gZWxlbWVudFkxICYmIHNlbGVjdGlvblgyID49IGVsZW1lbnRYMiAmJiBzZWxlY3Rpb25ZMiA+PSBlbGVtZW50WTI7XG59O1xuZXhwb3J0IGNvbnN0IGVsZW1lbnRPdmVybGFwc1dpdGhGcmFtZSA9IChlbGVtZW50LCBmcmFtZSkgPT4ge1xuICByZXR1cm4gZWxlbWVudHNBcmVJbkZyYW1lQm91bmRzKFtlbGVtZW50XSwgZnJhbWUpIHx8IEZyYW1lR2VvbWV0cnkuaXNFbGVtZW50SW50ZXJzZWN0aW5nRnJhbWUoZWxlbWVudCwgZnJhbWUpIHx8IGlzRWxlbWVudENvbnRhaW5pbmdGcmFtZShbZnJhbWVdLCBlbGVtZW50LCBmcmFtZSk7XG59O1xuZXhwb3J0IGNvbnN0IGlzQ3Vyc29ySW5GcmFtZSA9IChjdXJzb3JDb29yZHMsIGZyYW1lKSA9PiB7XG4gIGNvbnN0IFtmeDEsIGZ5MSwgZngyLCBmeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGZyYW1lKTtcbiAgcmV0dXJuIGlzUG9pbnRXaXRoaW5Cb3VuZHMoW2Z4MSwgZnkxXSwgW2N1cnNvckNvb3Jkcy54LCBjdXJzb3JDb29yZHMueV0sIFtmeDIsIGZ5Ml0pO1xufTtcbmV4cG9ydCBjb25zdCBncm91cHNBcmVBdExlYXN0SW50ZXJzZWN0aW5nVGhlRnJhbWUgPSAoZWxlbWVudHMsIGdyb3VwSWRzLCBmcmFtZSkgPT4ge1xuICBjb25zdCBlbGVtZW50c0luR3JvdXAgPSBncm91cElkcy5mbGF0TWFwKGdyb3VwSWQgPT4gZ2V0RWxlbWVudHNJbkdyb3VwKGVsZW1lbnRzLCBncm91cElkKSk7XG5cbiAgaWYgKGVsZW1lbnRzSW5Hcm91cC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiAhIWVsZW1lbnRzSW5Hcm91cC5maW5kKGVsZW1lbnQgPT4gZWxlbWVudHNBcmVJbkZyYW1lQm91bmRzKFtlbGVtZW50XSwgZnJhbWUpIHx8IEZyYW1lR2VvbWV0cnkuaXNFbGVtZW50SW50ZXJzZWN0aW5nRnJhbWUoZWxlbWVudCwgZnJhbWUpKTtcbn07XG5leHBvcnQgY29uc3QgZ3JvdXBzQXJlQ29tcGxldGVseU91dE9mRnJhbWUgPSAoZWxlbWVudHMsIGdyb3VwSWRzLCBmcmFtZSkgPT4ge1xuICBjb25zdCBlbGVtZW50c0luR3JvdXAgPSBncm91cElkcy5mbGF0TWFwKGdyb3VwSWQgPT4gZ2V0RWxlbWVudHNJbkdyb3VwKGVsZW1lbnRzLCBncm91cElkKSk7XG5cbiAgaWYgKGVsZW1lbnRzSW5Hcm91cC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50c0luR3JvdXAuZmluZChlbGVtZW50ID0+IGVsZW1lbnRzQXJlSW5GcmFtZUJvdW5kcyhbZWxlbWVudF0sIGZyYW1lKSB8fCBGcmFtZUdlb21ldHJ5LmlzRWxlbWVudEludGVyc2VjdGluZ0ZyYW1lKGVsZW1lbnQsIGZyYW1lKSkgPT09IHVuZGVmaW5lZDtcbn07IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGcmFtZSBVdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWFwIG9mIGZyYW1lSWQgdG8gZnJhbWUgZWxlbWVudHMuIEluY2x1ZGVzIGVtcHR5IGZyYW1lcy5cbiAqL1xuXG5leHBvcnQgY29uc3QgZ3JvdXBCeUZyYW1lcyA9IGVsZW1lbnRzID0+IHtcbiAgY29uc3QgZnJhbWVFbGVtZW50c01hcCA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBmcmFtZUlkID0gaXNGcmFtZUVsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50LmlkIDogZWxlbWVudC5mcmFtZUlkO1xuXG4gICAgaWYgKGZyYW1lSWQgJiYgIWZyYW1lRWxlbWVudHNNYXAuaGFzKGZyYW1lSWQpKSB7XG4gICAgICBmcmFtZUVsZW1lbnRzTWFwLnNldChmcmFtZUlkLCBnZXRGcmFtZUVsZW1lbnRzKGVsZW1lbnRzLCBmcmFtZUlkKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZyYW1lRWxlbWVudHNNYXA7XG59O1xuZXhwb3J0IGNvbnN0IGdldEZyYW1lRWxlbWVudHMgPSAoYWxsRWxlbWVudHMsIGZyYW1lSWQpID0+IGFsbEVsZW1lbnRzLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuZnJhbWVJZCA9PT0gZnJhbWVJZCk7XG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNJblJlc2l6aW5nRnJhbWUgPSAoYWxsRWxlbWVudHMsIGZyYW1lLCBhcHBTdGF0ZSkgPT4ge1xuICBjb25zdCBwcmV2RWxlbWVudHNJbkZyYW1lID0gZ2V0RnJhbWVFbGVtZW50cyhhbGxFbGVtZW50cywgZnJhbWUuaWQpO1xuICBjb25zdCBuZXh0RWxlbWVudHNJbkZyYW1lID0gbmV3IFNldChwcmV2RWxlbWVudHNJbkZyYW1lKTtcbiAgY29uc3QgZWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSA9IG5ldyBTZXQoWy4uLmdldEVsZW1lbnRzQ29tcGxldGVseUluRnJhbWUoYWxsRWxlbWVudHMsIGZyYW1lKSwgLi4ucHJldkVsZW1lbnRzSW5GcmFtZS5maWx0ZXIoZWxlbWVudCA9PiBpc0VsZW1lbnRDb250YWluaW5nRnJhbWUoYWxsRWxlbWVudHMsIGVsZW1lbnQsIGZyYW1lKSldKTtcbiAgY29uc3QgZWxlbWVudHNOb3RDb21wbGV0ZWx5SW5GcmFtZSA9IHByZXZFbGVtZW50c0luRnJhbWUuZmlsdGVyKGVsZW1lbnQgPT4gIWVsZW1lbnRzQ29tcGxldGVseUluRnJhbWUuaGFzKGVsZW1lbnQpKTsgLy8gZm9yIGVsZW1lbnRzIHRoYXQgYXJlIGNvbXBsZXRlbHkgaW4gdGhlIGZyYW1lXG4gIC8vIGlmIHRoZXkgYXJlIHBhcnQgb2Ygc29tZSBncm91cHMsIHRoZW4gdGhvc2UgZ3JvdXBzIGFyZSBzdGlsbFxuICAvLyBjb25zaWRlcmVkIHRvIGJlbG9uZyB0byB0aGUgZnJhbWVcblxuICBjb25zdCBncm91cHNUb0tlZXAgPSBuZXcgU2V0KEFycmF5LmZyb20oZWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSkuZmxhdE1hcChlbGVtZW50ID0+IGVsZW1lbnQuZ3JvdXBJZHMpKTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNOb3RDb21wbGV0ZWx5SW5GcmFtZSkge1xuICAgIGlmICghRnJhbWVHZW9tZXRyeS5pc0VsZW1lbnRJbnRlcnNlY3RpbmdGcmFtZShlbGVtZW50LCBmcmFtZSkpIHtcbiAgICAgIGlmIChlbGVtZW50Lmdyb3VwSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBuZXh0RWxlbWVudHNJbkZyYW1lLmRlbGV0ZShlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ3JvdXBJZHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gZ3JvdXAgZWxlbWVudCBpbnRlcnNlY3RzIHdpdGggdGhlIGZyYW1lLCB3ZSBzaG91bGQga2VlcCB0aGUgZ3JvdXBzXG4gICAgICAvLyB0aGF0IHRoaXMgZWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIGVsZW1lbnQuZ3JvdXBJZHMpIHtcbiAgICAgICAgZ3JvdXBzVG9LZWVwLmFkZChpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzTm90Q29tcGxldGVseUluRnJhbWUpIHtcbiAgICBpZiAoZWxlbWVudC5ncm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgc2hvdWxkUmVtb3ZlRWxlbWVudCA9IHRydWU7XG5cbiAgICAgIGZvciAoY29uc3QgaWQgb2YgZWxlbWVudC5ncm91cElkcykge1xuICAgICAgICBpZiAoZ3JvdXBzVG9LZWVwLmhhcyhpZCkpIHtcbiAgICAgICAgICBzaG91bGRSZW1vdmVFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFJlbW92ZUVsZW1lbnQpIHtcbiAgICAgICAgbmV4dEVsZW1lbnRzSW5GcmFtZS5kZWxldGUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaW5kaXZpZHVhbEVsZW1lbnRzQ29tcGxldGVseUluRnJhbWUgPSBBcnJheS5mcm9tKGVsZW1lbnRzQ29tcGxldGVseUluRnJhbWUpLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuZ3JvdXBJZHMubGVuZ3RoID09PSAwKTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaW5kaXZpZHVhbEVsZW1lbnRzQ29tcGxldGVseUluRnJhbWUpIHtcbiAgICBuZXh0RWxlbWVudHNJbkZyYW1lLmFkZChlbGVtZW50KTtcbiAgfVxuXG4gIGNvbnN0IG5ld0dyb3VwRWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSA9IEFycmF5LmZyb20oZWxlbWVudHNDb21wbGV0ZWx5SW5GcmFtZSkuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC5ncm91cElkcy5sZW5ndGggPiAwKTtcbiAgY29uc3QgZ3JvdXBJZHMgPSBzZWxlY3RHcm91cHNGcm9tR2l2ZW5FbGVtZW50cyhuZXdHcm91cEVsZW1lbnRzQ29tcGxldGVseUluRnJhbWUsIGFwcFN0YXRlKTsgLy8gbmV3IGdyb3VwIGVsZW1lbnRzXG5cbiAgZm9yIChjb25zdCBbaWQsIGlzU2VsZWN0ZWRdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwSWRzKSkge1xuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICBjb25zdCBlbGVtZW50c0luR3JvdXAgPSBnZXRFbGVtZW50c0luR3JvdXAoYWxsRWxlbWVudHMsIGlkKTtcblxuICAgICAgaWYgKGVsZW1lbnRzQXJlSW5GcmFtZUJvdW5kcyhlbGVtZW50c0luR3JvdXAsIGZyYW1lKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNJbkdyb3VwKSB7XG4gICAgICAgICAgbmV4dEVsZW1lbnRzSW5GcmFtZS5hZGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gWy4uLm5leHRFbGVtZW50c0luRnJhbWVdLmZpbHRlcihlbGVtZW50ID0+IHtcbiAgICByZXR1cm4gIShpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQuY29udGFpbmVySWQpO1xuICB9KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNJbk5ld0ZyYW1lID0gKGFsbEVsZW1lbnRzLCBmcmFtZSkgPT4ge1xuICByZXR1cm4gb21pdEdyb3Vwc0NvbnRhaW5pbmdGcmFtZXMoYWxsRWxlbWVudHMsIGdldEVsZW1lbnRzQ29tcGxldGVseUluRnJhbWUoYWxsRWxlbWVudHMsIGZyYW1lKSk7XG59O1xuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5pbmdGcmFtZSA9IChlbGVtZW50LFxuLyoqXG4gKiBPcHRpb25hbGx5IGFuIGVsZW1lbnRzIG1hcCwgaW4gY2FzZSB0aGUgZWxlbWVudHMgYXJlbid0IGluIHRoZSBTY2VuZSB5ZXQuXG4gKiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgU2NlbmUgZWxlbWVudHMsIGV2ZW4gaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG4gKiBpbiBTY2VuZSBlbGVtZW50cyBhbmQgbm90IHRoZSBzdXBwbGllZCBlbGVtZW50cyBtYXAuXG4gKi9cbmVsZW1lbnRzTWFwKSA9PiB7XG4gIHZhciBfYTtcblxuICBpZiAoZWxlbWVudC5mcmFtZUlkKSB7XG4gICAgaWYgKGVsZW1lbnRzTWFwKSB7XG4gICAgICByZXR1cm4gZWxlbWVudHNNYXAuZ2V0KGVsZW1lbnQuZnJhbWVJZCkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gKChfYSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0RWxlbWVudChlbGVtZW50LmZyYW1lSWQpKSB8fCBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnJhbWUgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50c1RvRnJhbWUgPSAoYWxsRWxlbWVudHMsIGVsZW1lbnRzVG9BZGQsIGZyYW1lKSA9PiB7XG4gIGNvbnN0IGN1cnJUYXJnZXRGcmFtZUNoaWxkcmVuTWFwID0gbmV3IE1hcChhbGxFbGVtZW50cy5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgIGlmIChlbGVtZW50LmZyYW1lSWQgPT09IGZyYW1lLmlkKSB7XG4gICAgICBhY2MucHVzaChbZWxlbWVudC5pZCwgZWxlbWVudF0pO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKSk7XG4gIGNvbnN0IHN1cHBsaWVkRWxlbWVudHNUb0FkZFNldCA9IG5ldyBTZXQoZWxlbWVudHNUb0FkZC5tYXAoZWwgPT4gZWwuaWQpKTtcbiAgY29uc3QgZmluYWxFbGVtZW50c1RvQWRkID0gW107IC8vIC0gYWRkIGJvdW5kIHRleHQgZWxlbWVudHMgaWYgbm90IGFscmVhZHkgaW4gdGhlIGFycmF5XG4gIC8vIC0gZmlsdGVyIG91dCBlbGVtZW50cyB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBmcmFtZVxuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBvbWl0R3JvdXBzQ29udGFpbmluZ0ZyYW1lcyhhbGxFbGVtZW50cywgZWxlbWVudHNUb0FkZCkpIHtcbiAgICBpZiAoIWN1cnJUYXJnZXRGcmFtZUNoaWxkcmVuTWFwLmhhcyhlbGVtZW50LmlkKSkge1xuICAgICAgZmluYWxFbGVtZW50c1RvQWRkLnB1c2goZWxlbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCAmJiAhc3VwcGxpZWRFbGVtZW50c1RvQWRkU2V0Lmhhcyhib3VuZFRleHRFbGVtZW50LmlkKSAmJiAhY3VyclRhcmdldEZyYW1lQ2hpbGRyZW5NYXAuaGFzKGJvdW5kVGV4dEVsZW1lbnQuaWQpKSB7XG4gICAgICBmaW5hbEVsZW1lbnRzVG9BZGQucHVzaChib3VuZFRleHRFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBmaW5hbEVsZW1lbnRzVG9BZGRTZXQgPSBuZXcgU2V0KGZpbmFsRWxlbWVudHNUb0FkZC5tYXAoZWwgPT4gZWwuaWQpKTtcbiAgY29uc3QgbmV4dEVsZW1lbnRzID0gW107XG4gIGNvbnN0IHByb2Nlc3NlZEVsZW1lbnRzID0gbmV3IFNldCgpO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhbGxFbGVtZW50cykge1xuICAgIGlmIChwcm9jZXNzZWRFbGVtZW50cy5oYXMoZWxlbWVudC5pZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHByb2Nlc3NlZEVsZW1lbnRzLmFkZChlbGVtZW50LmlkKTtcblxuICAgIGlmIChmaW5hbEVsZW1lbnRzVG9BZGRTZXQuaGFzKGVsZW1lbnQuaWQpIHx8IGVsZW1lbnQuZnJhbWVJZCAmJiBlbGVtZW50LmZyYW1lSWQgPT09IGZyYW1lLmlkKSB7XG4gICAgICAvLyB3aWxsIGJlIGFkZGVkIGluIGJ1bGsgb25jZSB3ZSBwcm9jZXNzIHRhcmdldCBmcmFtZVxuICAgICAgY29udGludWU7XG4gICAgfSAvLyB0YXJnZXQgZnJhbWVcblxuXG4gICAgaWYgKGVsZW1lbnQuaWQgPT09IGZyYW1lLmlkKSB7XG4gICAgICBjb25zdCBjdXJyRnJhbWVDaGlsZHJlbiA9IGdldEZyYW1lRWxlbWVudHMoYWxsRWxlbWVudHMsIGZyYW1lLmlkKTtcbiAgICAgIGN1cnJGcmFtZUNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICBwcm9jZXNzZWRFbGVtZW50cy5hZGQoY2hpbGQuaWQpO1xuICAgICAgfSk7IC8vIGNvbnNvbGUubG9nKGN1cnJGcmFtZUNoaWxkcmVuLCBmaW5hbEVsZW1lbnRzVG9BZGQsIGVsZW1lbnQpO1xuXG4gICAgICBuZXh0RWxlbWVudHMucHVzaCguLi5jdXJyRnJhbWVDaGlsZHJlbiwgLi4uZmluYWxFbGVtZW50c1RvQWRkLCBlbGVtZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gLy8gY29uc29sZS5sb2coXCIoMilcIiwgZWxlbWVudC5mcmFtZUlkKTtcblxuXG4gICAgbmV4dEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZmluYWxFbGVtZW50c1RvQWRkKSB7XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBmcmFtZUlkOiBmcmFtZS5pZFxuICAgIH0sIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0RWxlbWVudHM7XG59O1xuZXhwb3J0IGNvbnN0IHJlbW92ZUVsZW1lbnRzRnJvbUZyYW1lID0gKGFsbEVsZW1lbnRzLCBlbGVtZW50c1RvUmVtb3ZlLCBhcHBTdGF0ZSkgPT4ge1xuICBjb25zdCBfZWxlbWVudHNUb1JlbW92ZSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvUmVtb3ZlKSB7XG4gICAgaWYgKGVsZW1lbnQuZnJhbWVJZCkge1xuICAgICAgX2VsZW1lbnRzVG9SZW1vdmUucHVzaChlbGVtZW50KTtcblxuICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgIF9lbGVtZW50c1RvUmVtb3ZlLnB1c2goYm91bmRUZXh0RWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIF9lbGVtZW50c1RvUmVtb3ZlKSB7XG4gICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICBmcmFtZUlkOiBudWxsXG4gICAgfSwgZmFsc2UpO1xuICB9XG5cbiAgY29uc3QgbmV4dEVsZW1lbnRzID0gbW92ZU9uZVJpZ2h0KGFsbEVsZW1lbnRzLCBhcHBTdGF0ZSwgQXJyYXkuZnJvbShfZWxlbWVudHNUb1JlbW92ZSkpO1xuICByZXR1cm4gbmV4dEVsZW1lbnRzO1xufTtcbmV4cG9ydCBjb25zdCByZW1vdmVBbGxFbGVtZW50c0Zyb21GcmFtZSA9IChhbGxFbGVtZW50cywgZnJhbWUsIGFwcFN0YXRlKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzSW5GcmFtZSA9IGdldEZyYW1lRWxlbWVudHMoYWxsRWxlbWVudHMsIGZyYW1lLmlkKTtcbiAgcmV0dXJuIHJlbW92ZUVsZW1lbnRzRnJvbUZyYW1lKGFsbEVsZW1lbnRzLCBlbGVtZW50c0luRnJhbWUsIGFwcFN0YXRlKTtcbn07XG5leHBvcnQgY29uc3QgcmVwbGFjZUFsbEVsZW1lbnRzSW5GcmFtZSA9IChhbGxFbGVtZW50cywgbmV4dEVsZW1lbnRzSW5GcmFtZSwgZnJhbWUsIGFwcFN0YXRlKSA9PiB7XG4gIHJldHVybiBhZGRFbGVtZW50c1RvRnJhbWUocmVtb3ZlQWxsRWxlbWVudHNGcm9tRnJhbWUoYWxsRWxlbWVudHMsIGZyYW1lLCBhcHBTdGF0ZSksIG5leHRFbGVtZW50c0luRnJhbWUsIGZyYW1lKTtcbn07XG4vKiogZG9lcyBub3QgbXV0YXRlIGVsZW1lbnRzLCBidXQgcmV0dXJucyBuZXcgb25lcyAqL1xuXG5leHBvcnQgY29uc3QgdXBkYXRlRnJhbWVNZW1iZXJzaGlwT2ZTZWxlY3RlZEVsZW1lbnRzID0gKGFsbEVsZW1lbnRzLCBhcHBTdGF0ZSwgYXBwKSA9PiB7XG4gIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBhcHAuc2NlbmUuZ2V0U2VsZWN0ZWRFbGVtZW50cyh7XG4gICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgLy8gc3VwcGx5aW5nIGVsZW1lbnRzIGV4cGxpY2l0bHkgaW4gY2FzZSB3ZSdyZSBwYXNzZWQgbm9uLXN0YXRlIGVsZW1lbnRzXG4gICAgZWxlbWVudHM6IGFsbEVsZW1lbnRzXG4gIH0pO1xuICBjb25zdCBlbGVtZW50c1RvRmlsdGVyID0gbmV3IFNldChzZWxlY3RlZEVsZW1lbnRzKTtcblxuICBpZiAoYXBwU3RhdGUuZWRpdGluZ0dyb3VwSWQpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnQuZ3JvdXBJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRzVG9GaWx0ZXIuYWRkKGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5ncm91cElkcy5mbGF0TWFwKGdpZCA9PiBnZXRFbGVtZW50c0luR3JvdXAoYWxsRWxlbWVudHMsIGdpZCkpLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50c1RvRmlsdGVyLmFkZChlbGVtZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZWxlbWVudHNUb1JlbW92ZSA9IG5ldyBTZXQoKTtcbiAgZWxlbWVudHNUb0ZpbHRlci5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGlmIChlbGVtZW50LmZyYW1lSWQgJiYgIWlzRnJhbWVFbGVtZW50KGVsZW1lbnQpICYmICFpc0VsZW1lbnRJbkZyYW1lKGVsZW1lbnQsIGFsbEVsZW1lbnRzLCBhcHBTdGF0ZSkpIHtcbiAgICAgIGVsZW1lbnRzVG9SZW1vdmUuYWRkKGVsZW1lbnQpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBlbGVtZW50c1RvUmVtb3ZlLnNpemUgPiAwID8gcmVtb3ZlRWxlbWVudHNGcm9tRnJhbWUoYWxsRWxlbWVudHMsIFsuLi5lbGVtZW50c1RvUmVtb3ZlXSwgYXBwU3RhdGUpIDogYWxsRWxlbWVudHM7XG59O1xuLyoqXG4gKiBmaWx0ZXJzIG91dCBlbGVtZW50cyB0aGF0IGFyZSBpbnNpZGUgZ3JvdXBzIHRoYXQgY29udGFpbiBhIGZyYW1lIGVsZW1lbnRcbiAqIGFueXdoZXJlIGluIHRoZSBncm91cCB0cmVlXG4gKi9cblxuZXhwb3J0IGNvbnN0IG9taXRHcm91cHNDb250YWluaW5nRnJhbWVzID0gKGFsbEVsZW1lbnRzLFxuLyoqIHN1YnNldCBvZiBlbGVtZW50cyB5b3Ugd2FudCB0byBmaWx0ZXIuIE9wdGlvbmFsIHBlcmYgb3B0aW1pemF0aW9uIHNvIHdlXG4gKiBkb24ndCBoYXZlIHRvIGZpbHRlciBhbGwgZWxlbWVudHMgdW5uZWNlc3NhcmlseVxuICovXG5zZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gIGNvbnN0IHVuaXF1ZUdyb3VwSWRzID0gbmV3IFNldCgpO1xuXG4gIGZvciAoY29uc3QgZWwgb2Ygc2VsZWN0ZWRFbGVtZW50cyB8fCBhbGxFbGVtZW50cykge1xuICAgIGNvbnN0IHRvcE1vc3RHcm91cElkID0gZWwuZ3JvdXBJZHNbZWwuZ3JvdXBJZHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAodG9wTW9zdEdyb3VwSWQpIHtcbiAgICAgIHVuaXF1ZUdyb3VwSWRzLmFkZCh0b3BNb3N0R3JvdXBJZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVqZWN0ZWRHcm91cElkcyA9IG5ldyBTZXQoKTtcblxuICBmb3IgKGNvbnN0IGdyb3VwSWQgb2YgdW5pcXVlR3JvdXBJZHMpIHtcbiAgICBpZiAoZ2V0RWxlbWVudHNJbkdyb3VwKGFsbEVsZW1lbnRzLCBncm91cElkKS5zb21lKGVsID0+IGlzRnJhbWVFbGVtZW50KGVsKSkpIHtcbiAgICAgIHJlamVjdGVkR3JvdXBJZHMuYWRkKGdyb3VwSWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoc2VsZWN0ZWRFbGVtZW50cyB8fCBhbGxFbGVtZW50cykuZmlsdGVyKGVsID0+ICFyZWplY3RlZEdyb3VwSWRzLmhhcyhlbC5ncm91cElkc1tlbC5ncm91cElkcy5sZW5ndGggLSAxXSkpO1xufTtcbi8qKlxuICogZGVwZW5kaW5nIG9uIHRoZSBhcHBTdGF0ZSwgcmV0dXJuIHRhcmdldCBmcmFtZSwgd2hpY2ggaXMgdGhlIGZyYW1lIHRoZSBnaXZlbiBlbGVtZW50XG4gKiBpcyBnb2luZyB0byBiZSBhZGRlZCB0byBvciByZW1vdmUgZnJvbVxuICovXG5cbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRGcmFtZSA9IChlbGVtZW50LCBhcHBTdGF0ZSkgPT4ge1xuICBjb25zdCBfZWxlbWVudCA9IGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgPyBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpIHx8IGVsZW1lbnQgOiBlbGVtZW50O1xuXG4gIHJldHVybiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbX2VsZW1lbnQuaWRdICYmIGFwcFN0YXRlLnNlbGVjdGVkRWxlbWVudHNBcmVCZWluZ0RyYWdnZWQgPyBhcHBTdGF0ZS5mcmFtZVRvSGlnaGxpZ2h0IDogZ2V0Q29udGFpbmluZ0ZyYW1lKF9lbGVtZW50KTtcbn07IC8vIFRPRE86IHRoaXMgYSBodWdlIGJvdHRsZW5lY2sgZm9yIGxhcmdlIHNjZW5lcywgb3B0aW1pc2Vcbi8vIGdpdmVuIGFuIGVsZW1lbnQsIHJldHVybiBpZiB0aGUgZWxlbWVudCBpcyBpbiBzb21lIGZyYW1lXG5cbmV4cG9ydCBjb25zdCBpc0VsZW1lbnRJbkZyYW1lID0gKGVsZW1lbnQsIGFsbEVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICBjb25zdCBmcmFtZSA9IGdldFRhcmdldEZyYW1lKGVsZW1lbnQsIGFwcFN0YXRlKTtcblxuICBjb25zdCBfZWxlbWVudCA9IGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgPyBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpIHx8IGVsZW1lbnQgOiBlbGVtZW50O1xuXG4gIGlmIChmcmFtZSkge1xuICAgIGlmIChfZWxlbWVudC5ncm91cElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBlbGVtZW50T3ZlcmxhcHNXaXRoRnJhbWUoX2VsZW1lbnQsIGZyYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxFbGVtZW50c0luR3JvdXAgPSBuZXcgU2V0KF9lbGVtZW50Lmdyb3VwSWRzLmZsYXRNYXAoZ2lkID0+IGdldEVsZW1lbnRzSW5Hcm91cChhbGxFbGVtZW50cywgZ2lkKSkpO1xuXG4gICAgaWYgKGFwcFN0YXRlLmVkaXRpbmdHcm91cElkICYmIGFwcFN0YXRlLnNlbGVjdGVkRWxlbWVudHNBcmVCZWluZ0RyYWdnZWQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBuZXcgU2V0KGdldFNlbGVjdGVkRWxlbWVudHMoYWxsRWxlbWVudHMsIGFwcFN0YXRlKSk7XG4gICAgICBjb25zdCBlZGl0aW5nR3JvdXBPdmVybGFwc0ZyYW1lID0gYXBwU3RhdGUuZnJhbWVUb0hpZ2hsaWdodCAhPT0gbnVsbDtcblxuICAgICAgaWYgKGVkaXRpbmdHcm91cE92ZXJsYXBzRnJhbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaChzZWxlY3RlZEVsZW1lbnQgPT4ge1xuICAgICAgICBhbGxFbGVtZW50c0luR3JvdXAuZGVsZXRlKHNlbGVjdGVkRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRJbkdyb3VwIG9mIGFsbEVsZW1lbnRzSW5Hcm91cCkge1xuICAgICAgaWYgKGlzRnJhbWVFbGVtZW50KGVsZW1lbnRJbkdyb3VwKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50SW5Hcm91cCBvZiBhbGxFbGVtZW50c0luR3JvdXApIHtcbiAgICAgIGlmIChlbGVtZW50T3ZlcmxhcHNXaXRoRnJhbWUoZWxlbWVudEluR3JvdXAsIGZyYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../frame.ts\n");
|
|
3996
3996
|
|
|
3997
3997
|
/***/ }),
|
|
3998
3998
|
|
|
@@ -4234,7 +4234,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
4234
4234
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4235
4235
|
|
|
4236
4236
|
"use strict";
|
|
4237
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n\n /* global __webpack_public_path__:writable */\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.16.1-
|
|
4237
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n\n /* global __webpack_public_path__:writable */\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.16.1-ceb637f\"}/dist/`;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDOztBQUV0QyxJQUFJLGFBQW9CLEtBQUssZ0RBQVE7QUFDckM7O0FBRUE7QUFDQSxFQUFFLHFCQUF1Qix3REFBd0Qsd0JBQXlCLENBQUMsR0FBRyxnQkFBNEIsQ0FBQztBQUMzSSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3B1YmxpY1BhdGguanM/MGUzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlYgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gRU5WLlRFU1QpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSB3aW5kb3cuRVhDQUxJRFJBV19BU1NFVF9QQVRIIHx8IGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlZJVEVfUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuVklURV9QS0dfVkVSU0lPTn0vZGlzdC9gO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./publicPath.js\n");
|
|
4238
4238
|
|
|
4239
4239
|
/***/ }),
|
|
4240
4240
|
|
|
@@ -4399,7 +4399,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
4399
4399
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4400
4400
|
|
|
4401
4401
|
"use strict";
|
|
4402
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Scene */ \"../../scene/Scene.ts\");\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, {\n exportBackground,\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n viewBackgroundColor\n}, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return {\n canvas,\n scale: appState.exportScale\n };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const {\n canvas,\n scale = 1\n } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const {\n imageCache\n } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map(element => element.fileId),\n files\n });\n const onlyExportingSingleFrame = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isOnlyExportingSingleFrame)(elements);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderStaticScene)({\n canvas,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n elements,\n visibleElements: elements,\n scale,\n appState: Object.assign(Object.assign({}, appState), {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + (onlyExportingSingleFrame ? 0 : exportPadding),\n scrollY: -minY + (onlyExportingSingleFrame ? 0 : exportPadding),\n zoom: defaultAppState.zoom,\n shouldCacheIgnoreZoom: false,\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\"\n }),\n renderConfig: {\n imageCache,\n renderGrid: false,\n isExporting: true\n }\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c;\n\n const {\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n viewBackgroundColor,\n exportScale = 1,\n exportEmbedScene\n } = appState;\n let metadata = \"\";\n\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: (opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON) ? (_a = opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON) === null || _a === void 0 ? void 0 : _a.call(opts) : (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\")\n });\n } catch (error) {\n console.error(error);\n }\n }\n\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding); // initialize SVG root\n\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\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n\n let assetPath = \"https://excalidraw.com/\"; // Asset path needs to be determined only when using package\n\n if (true) {\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_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\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.16.1-4c35eba\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}`;\n\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n } // do not apply clipping when we're exporting the whole scene\n\n\n const isExportingWholeCanvas = ((_c = (_b = _Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(elements[0])) === null || _b === void 0 ? void 0 : _b.getNonDeletedElements()) === null || _c === void 0 ? void 0 : _c.length) === elements.length;\n const onlyExportingSingleFrame = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isOnlyExportingSingleFrame)(elements);\n const offsetX = -minX + (onlyExportingSingleFrame ? 0 : exportPadding);\n const offsetY = -minY + (onlyExportingSingleFrame ? 0 : exportPadding);\n const exportingFrame = isExportingWholeCanvas || !onlyExportingSingleFrame ? undefined : elements.find(element => element.type === \"frame\");\n let exportingFrameClipPath = \"\";\n\n if (exportingFrame) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(exportingFrame);\n const cx = (x2 - x1) / 2 - (exportingFrame.x - x1);\n const cy = (y2 - y1) / 2 - (exportingFrame.y - y1);\n exportingFrameClipPath = `<clipPath id=${exportingFrame.id}>\n <rect transform=\"translate(${exportingFrame.x + offsetX} ${exportingFrame.y + offsetY}) rotate(${exportingFrame.angle} ${cx} ${cy})\"\n width=\"${exportingFrame.width}\"\n height=\"${exportingFrame.height}\"\n >\n </rect>\n </clipPath>`;\n }\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(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n ${exportingFrameClipPath}\n </defs>\n `; // render background rect\n\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\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,\n offsetY,\n exportWithDarkMode: appState.exportWithDarkMode,\n exportingFrameId: (exportingFrame === null || exportingFrame === void 0 ? void 0 : exportingFrame.id) || null,\n renderEmbeddables: opts === null || opts === void 0 ? void 0 : opts.renderEmbeddables\n });\n return svgRoot;\n}); // calculate smallest area to fit the contents in\n\nconst getCanvasSize = (elements, exportPadding) => {\n // we should decide if we are exporting the whole canvas\n // if so, we are not clipping elements in the frame\n // and therefore, we should not do anything special\n var _a, _b;\n\n const isExportingWholeCanvas = ((_b = (_a = _Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(elements[0])) === null || _a === void 0 ? void 0 : _a.getNonDeletedElements()) === null || _b === void 0 ? void 0 : _b.length) === elements.length;\n const onlyExportingSingleFrame = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isOnlyExportingSingleFrame)(elements);\n\n if (!isExportingWholeCanvas || onlyExportingSingleFrame) {\n const frames = elements.filter(element => element.type === \"frame\");\n const exportedFrameIds = frames.reduce((acc, frame) => {\n acc[frame.id] = true;\n return acc;\n }, {}); // elements in a frame do not affect the canvas size if we're not exporting\n // the whole canvas\n\n elements = elements.filter(element => {\n var _a;\n\n return !exportedFrameIds[(_a = element.frameId) !== null && _a !== void 0 ? _a : \"\"];\n });\n }\n\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) + (onlyExportingSingleFrame ? 0 : exportPadding * 2);\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + (onlyExportingSingleFrame ? 0 : exportPadding * 2);\n return [minX, minY, width, height];\n};\n\nconst getExportSize = (elements, exportPadding, scale) => {\n const [,, width, height] = getCanvasSize(elements, exportPadding).map(dimension => Math.trunc(dimension * scale));\n return [width, height];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBLEtBQUssSUFBSSxHQUFHO0FBQ1o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxtQ0FBbUMsZ0VBQWU7QUFDbEQsZ0JBQWdCLGdEQUFRO0FBQ3hCLGlCQUFpQixnREFBUTtBQUN6QjtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz8zZjRlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSB0aGlzICYmIHRoaXMuX19hd2FpdGVyIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuXG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn07XG5cbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcywgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZVRvU3ZnLCByZW5kZXJTdGF0aWNTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJTY2VuZVwiO1xuaW1wb3J0IHsgZGlzdGFuY2UsIGlzT25seUV4cG9ydGluZ1NpbmdsZUZyYW1lIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLCB1cGRhdGVJbWFnZUNhY2hlIH0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi9TY2VuZVwiO1xuZXhwb3J0IGNvbnN0IFNWR19FWFBPUlRfVEFHID0gYDwhLS0gc3ZnLXNvdXJjZTpleGNhbGlkcmF3IC0tPmA7XG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSAoZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcywge1xuICBleHBvcnRCYWNrZ3JvdW5kLFxuICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgdmlld0JhY2tncm91bmRDb2xvclxufSwgY3JlYXRlQ2FudmFzID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICByZXR1cm4ge1xuICAgIGNhbnZhcyxcbiAgICBzY2FsZTogYXBwU3RhdGUuZXhwb3J0U2NhbGVcbiAgfTtcbn0pID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcbiAgY29uc3Qge1xuICAgIGNhbnZhcyxcbiAgICBzY2FsZSA9IDFcbiAgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gIGNvbnN0IHtcbiAgICBpbWFnZUNhY2hlXG4gIH0gPSB5aWVsZCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoZWxlbWVudCA9PiBlbGVtZW50LmZpbGVJZCksXG4gICAgZmlsZXNcbiAgfSk7XG4gIGNvbnN0IG9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSA9IGlzT25seUV4cG9ydGluZ1NpbmdsZUZyYW1lKGVsZW1lbnRzKTtcbiAgcmVuZGVyU3RhdGljU2NlbmUoe1xuICAgIGNhbnZhcyxcbiAgICByYzogcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgZWxlbWVudHMsXG4gICAgdmlzaWJsZUVsZW1lbnRzOiBlbGVtZW50cyxcbiAgICBzY2FsZSxcbiAgICBhcHBTdGF0ZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhcHBTdGF0ZSksIHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgKG9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSA/IDAgOiBleHBvcnRQYWRkaW5nKSxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgKG9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSA/IDAgOiBleHBvcnRQYWRkaW5nKSxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIlxuICAgIH0pLFxuICAgIHJlbmRlckNvbmZpZzoge1xuICAgICAgaW1hZ2VDYWNoZSxcbiAgICAgIHJlbmRlckdyaWQ6IGZhbHNlLFxuICAgICAgaXNFeHBvcnRpbmc6IHRydWVcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2FudmFzO1xufSk7XG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSAoZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcywgb3B0cykgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gIHZhciBfYSwgX2IsIF9jO1xuXG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcblxuICBpZiAoZXhwb3J0RW1iZWRTY2VuZSkge1xuICAgIHRyeSB7XG4gICAgICBtZXRhZGF0YSA9IHlpZWxkICh5aWVsZCBpbXBvcnQoXG4gICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi9cbiAgICAgIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIikpLmVuY29kZVN2Z01ldGFkYXRhKHtcbiAgICAgICAgdGV4dDogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5zZXJpYWxpemVBc0pTT04pID8gKF9hID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLnNlcmlhbGl6ZUFzSlNPTikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwob3B0cykgOiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpOyAvLyBpbml0aWFsaXplIFNWRyByb290XG5cbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG5cbiAgaWYgKGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSkge1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gIH1cblxuICBsZXQgYXNzZXRQYXRoID0gXCJodHRwczovL2V4Y2FsaWRyYXcuY29tL1wiOyAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcblxuICBpZiAocHJvY2Vzcy5lbnYuVklURV9JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID0gd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fCBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5WSVRFX1BLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoID09PSBudWxsIHx8IGFzc2V0UGF0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXNzZXRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuXG4gICAgYXNzZXRQYXRoID0gYCR7YXNzZXRQYXRofS9kaXN0L2V4Y2FsaWRyYXctYXNzZXRzL2A7XG4gIH0gLy8gZG8gbm90IGFwcGx5IGNsaXBwaW5nIHdoZW4gd2UncmUgZXhwb3J0aW5nIHRoZSB3aG9sZSBzY2VuZVxuXG5cbiAgY29uc3QgaXNFeHBvcnRpbmdXaG9sZUNhbnZhcyA9ICgoX2MgPSAoX2IgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50c1swXSkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5nZXROb25EZWxldGVkRWxlbWVudHMoKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxlbmd0aCkgPT09IGVsZW1lbnRzLmxlbmd0aDtcbiAgY29uc3Qgb25seUV4cG9ydGluZ1NpbmdsZUZyYW1lID0gaXNPbmx5RXhwb3J0aW5nU2luZ2xlRnJhbWUoZWxlbWVudHMpO1xuICBjb25zdCBvZmZzZXRYID0gLW1pblggKyAob25seUV4cG9ydGluZ1NpbmdsZUZyYW1lID8gMCA6IGV4cG9ydFBhZGRpbmcpO1xuICBjb25zdCBvZmZzZXRZID0gLW1pblkgKyAob25seUV4cG9ydGluZ1NpbmdsZUZyYW1lID8gMCA6IGV4cG9ydFBhZGRpbmcpO1xuICBjb25zdCBleHBvcnRpbmdGcmFtZSA9IGlzRXhwb3J0aW5nV2hvbGVDYW52YXMgfHwgIW9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSA/IHVuZGVmaW5lZCA6IGVsZW1lbnRzLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LnR5cGUgPT09IFwiZnJhbWVcIik7XG4gIGxldCBleHBvcnRpbmdGcmFtZUNsaXBQYXRoID0gXCJcIjtcblxuICBpZiAoZXhwb3J0aW5nRnJhbWUpIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGV4cG9ydGluZ0ZyYW1lKTtcbiAgICBjb25zdCBjeCA9ICh4MiAtIHgxKSAvIDIgLSAoZXhwb3J0aW5nRnJhbWUueCAtIHgxKTtcbiAgICBjb25zdCBjeSA9ICh5MiAtIHkxKSAvIDIgLSAoZXhwb3J0aW5nRnJhbWUueSAtIHkxKTtcbiAgICBleHBvcnRpbmdGcmFtZUNsaXBQYXRoID0gYDxjbGlwUGF0aCBpZD0ke2V4cG9ydGluZ0ZyYW1lLmlkfT5cbiAgICAgICAgICAgIDxyZWN0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgke2V4cG9ydGluZ0ZyYW1lLnggKyBvZmZzZXRYfSAke2V4cG9ydGluZ0ZyYW1lLnkgKyBvZmZzZXRZfSkgcm90YXRlKCR7ZXhwb3J0aW5nRnJhbWUuYW5nbGV9ICR7Y3h9ICR7Y3l9KVwiXG4gICAgICAgICAgd2lkdGg9XCIke2V4cG9ydGluZ0ZyYW1lLndpZHRofVwiXG4gICAgICAgICAgaGVpZ2h0PVwiJHtleHBvcnRpbmdGcmFtZS5oZWlnaHR9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9yZWN0PlxuICAgICAgICA8L2NsaXBQYXRoPmA7XG4gIH1cblxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlIGNsYXNzPVwic3R5bGUtZm9udHNcIj5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgICR7ZXhwb3J0aW5nRnJhbWVDbGlwUGF0aH1cbiAgPC9kZWZzPlxuICBgOyAvLyByZW5kZXIgYmFja2dyb3VuZCByZWN0XG5cbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WCxcbiAgICBvZmZzZXRZLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlLFxuICAgIGV4cG9ydGluZ0ZyYW1lSWQ6IChleHBvcnRpbmdGcmFtZSA9PT0gbnVsbCB8fCBleHBvcnRpbmdGcmFtZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhwb3J0aW5nRnJhbWUuaWQpIHx8IG51bGwsXG4gICAgcmVuZGVyRW1iZWRkYWJsZXM6IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5yZW5kZXJFbWJlZGRhYmxlc1xuICB9KTtcbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59KTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSA9PiB7XG4gIC8vIHdlIHNob3VsZCBkZWNpZGUgaWYgd2UgYXJlIGV4cG9ydGluZyB0aGUgd2hvbGUgY2FudmFzXG4gIC8vIGlmIHNvLCB3ZSBhcmUgbm90IGNsaXBwaW5nIGVsZW1lbnRzIGluIHRoZSBmcmFtZVxuICAvLyBhbmQgdGhlcmVmb3JlLCB3ZSBzaG91bGQgbm90IGRvIGFueXRoaW5nIHNwZWNpYWxcbiAgdmFyIF9hLCBfYjtcblxuICBjb25zdCBpc0V4cG9ydGluZ1dob2xlQ2FudmFzID0gKChfYiA9IChfYSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnRzWzBdKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSA9PT0gZWxlbWVudHMubGVuZ3RoO1xuICBjb25zdCBvbmx5RXhwb3J0aW5nU2luZ2xlRnJhbWUgPSBpc09ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZShlbGVtZW50cyk7XG5cbiAgaWYgKCFpc0V4cG9ydGluZ1dob2xlQ2FudmFzIHx8IG9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSkge1xuICAgIGNvbnN0IGZyYW1lcyA9IGVsZW1lbnRzLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQudHlwZSA9PT0gXCJmcmFtZVwiKTtcbiAgICBjb25zdCBleHBvcnRlZEZyYW1lSWRzID0gZnJhbWVzLnJlZHVjZSgoYWNjLCBmcmFtZSkgPT4ge1xuICAgICAgYWNjW2ZyYW1lLmlkXSA9IHRydWU7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTsgLy8gZWxlbWVudHMgaW4gYSBmcmFtZSBkbyBub3QgYWZmZWN0IHRoZSBjYW52YXMgc2l6ZSBpZiB3ZSdyZSBub3QgZXhwb3J0aW5nXG4gICAgLy8gdGhlIHdob2xlIGNhbnZhc1xuXG4gICAgZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoZWxlbWVudCA9PiB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIHJldHVybiAhZXhwb3J0ZWRGcmFtZUlkc1soX2EgPSBlbGVtZW50LmZyYW1lSWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCJdO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIChvbmx5RXhwb3J0aW5nU2luZ2xlRnJhbWUgPyAwIDogZXhwb3J0UGFkZGluZyAqIDIpO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIChvbmx5RXhwb3J0aW5nU2luZ2xlRnJhbWUgPyAwIDogZXhwb3J0UGFkZGluZyAqIDIpO1xuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcsIHNjYWxlKSA9PiB7XG4gIGNvbnN0IFssLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChkaW1lbnNpb24gPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSkpO1xuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
4402
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Scene */ \"../../scene/Scene.ts\");\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, {\n exportBackground,\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n viewBackgroundColor\n}, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return {\n canvas,\n scale: appState.exportScale\n };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const {\n canvas,\n scale = 1\n } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const {\n imageCache\n } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map(element => element.fileId),\n files\n });\n const onlyExportingSingleFrame = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isOnlyExportingSingleFrame)(elements);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderStaticScene)({\n canvas,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n elements,\n visibleElements: elements,\n scale,\n appState: Object.assign(Object.assign({}, appState), {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + (onlyExportingSingleFrame ? 0 : exportPadding),\n scrollY: -minY + (onlyExportingSingleFrame ? 0 : exportPadding),\n zoom: defaultAppState.zoom,\n shouldCacheIgnoreZoom: false,\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\"\n }),\n renderConfig: {\n imageCache,\n renderGrid: false,\n isExporting: true\n }\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b, _c;\n\n const {\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n viewBackgroundColor,\n exportScale = 1,\n exportEmbedScene\n } = appState;\n let metadata = \"\";\n\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: (opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON) ? (_a = opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON) === null || _a === void 0 ? void 0 : _a.call(opts) : (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\")\n });\n } catch (error) {\n console.error(error);\n }\n }\n\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding); // initialize SVG root\n\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\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n\n let assetPath = \"https://excalidraw.com/\"; // Asset path needs to be determined only when using package\n\n if (true) {\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_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\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.16.1-ceb637f\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}`;\n\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n } // do not apply clipping when we're exporting the whole scene\n\n\n const isExportingWholeCanvas = ((_c = (_b = _Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(elements[0])) === null || _b === void 0 ? void 0 : _b.getNonDeletedElements()) === null || _c === void 0 ? void 0 : _c.length) === elements.length;\n const onlyExportingSingleFrame = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isOnlyExportingSingleFrame)(elements);\n const offsetX = -minX + (onlyExportingSingleFrame ? 0 : exportPadding);\n const offsetY = -minY + (onlyExportingSingleFrame ? 0 : exportPadding);\n const exportingFrame = isExportingWholeCanvas || !onlyExportingSingleFrame ? undefined : elements.find(element => element.type === \"frame\");\n let exportingFrameClipPath = \"\";\n\n if (exportingFrame) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(exportingFrame);\n const cx = (x2 - x1) / 2 - (exportingFrame.x - x1);\n const cy = (y2 - y1) / 2 - (exportingFrame.y - y1);\n exportingFrameClipPath = `<clipPath id=${exportingFrame.id}>\n <rect transform=\"translate(${exportingFrame.x + offsetX} ${exportingFrame.y + offsetY}) rotate(${exportingFrame.angle} ${cx} ${cy})\"\n width=\"${exportingFrame.width}\"\n height=\"${exportingFrame.height}\"\n >\n </rect>\n </clipPath>`;\n }\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(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n ${exportingFrameClipPath}\n </defs>\n `; // render background rect\n\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\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,\n offsetY,\n exportWithDarkMode: appState.exportWithDarkMode,\n exportingFrameId: (exportingFrame === null || exportingFrame === void 0 ? void 0 : exportingFrame.id) || null,\n renderEmbeddables: opts === null || opts === void 0 ? void 0 : opts.renderEmbeddables\n });\n return svgRoot;\n}); // calculate smallest area to fit the contents in\n\nconst getCanvasSize = (elements, exportPadding) => {\n // we should decide if we are exporting the whole canvas\n // if so, we are not clipping elements in the frame\n // and therefore, we should not do anything special\n var _a, _b;\n\n const isExportingWholeCanvas = ((_b = (_a = _Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(elements[0])) === null || _a === void 0 ? void 0 : _a.getNonDeletedElements()) === null || _b === void 0 ? void 0 : _b.length) === elements.length;\n const onlyExportingSingleFrame = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isOnlyExportingSingleFrame)(elements);\n\n if (!isExportingWholeCanvas || onlyExportingSingleFrame) {\n const frames = elements.filter(element => element.type === \"frame\");\n const exportedFrameIds = frames.reduce((acc, frame) => {\n acc[frame.id] = true;\n return acc;\n }, {}); // elements in a frame do not affect the canvas size if we're not exporting\n // the whole canvas\n\n elements = elements.filter(element => {\n var _a;\n\n return !exportedFrameIds[(_a = element.frameId) !== null && _a !== void 0 ? _a : \"\"];\n });\n }\n\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) + (onlyExportingSingleFrame ? 0 : exportPadding * 2);\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + (onlyExportingSingleFrame ? 0 : exportPadding * 2);\n return [minX, minY, width, height];\n};\n\nconst getExportSize = (elements, exportPadding, scale) => {\n const [,, width, height] = getCanvasSize(elements, exportPadding).map(dimension => Math.trunc(dimension * scale));\n return [width, height];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBLEtBQUssSUFBSSxHQUFHO0FBQ1o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxtQ0FBbUMsZ0VBQWU7QUFDbEQsZ0JBQWdCLGdEQUFRO0FBQ3hCLGlCQUFpQixnREFBUTtBQUN6QjtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz8zZjRlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSB0aGlzICYmIHRoaXMuX19hd2FpdGVyIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuXG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn07XG5cbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcywgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZVRvU3ZnLCByZW5kZXJTdGF0aWNTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJTY2VuZVwiO1xuaW1wb3J0IHsgZGlzdGFuY2UsIGlzT25seUV4cG9ydGluZ1NpbmdsZUZyYW1lIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLCB1cGRhdGVJbWFnZUNhY2hlIH0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi9TY2VuZVwiO1xuZXhwb3J0IGNvbnN0IFNWR19FWFBPUlRfVEFHID0gYDwhLS0gc3ZnLXNvdXJjZTpleGNhbGlkcmF3IC0tPmA7XG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSAoZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcywge1xuICBleHBvcnRCYWNrZ3JvdW5kLFxuICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgdmlld0JhY2tncm91bmRDb2xvclxufSwgY3JlYXRlQ2FudmFzID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICByZXR1cm4ge1xuICAgIGNhbnZhcyxcbiAgICBzY2FsZTogYXBwU3RhdGUuZXhwb3J0U2NhbGVcbiAgfTtcbn0pID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcbiAgY29uc3Qge1xuICAgIGNhbnZhcyxcbiAgICBzY2FsZSA9IDFcbiAgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gIGNvbnN0IHtcbiAgICBpbWFnZUNhY2hlXG4gIH0gPSB5aWVsZCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzKS5tYXAoZWxlbWVudCA9PiBlbGVtZW50LmZpbGVJZCksXG4gICAgZmlsZXNcbiAgfSk7XG4gIGNvbnN0IG9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSA9IGlzT25seUV4cG9ydGluZ1NpbmdsZUZyYW1lKGVsZW1lbnRzKTtcbiAgcmVuZGVyU3RhdGljU2NlbmUoe1xuICAgIGNhbnZhcyxcbiAgICByYzogcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgZWxlbWVudHMsXG4gICAgdmlzaWJsZUVsZW1lbnRzOiBlbGVtZW50cyxcbiAgICBzY2FsZSxcbiAgICBhcHBTdGF0ZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhcHBTdGF0ZSksIHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgKG9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSA/IDAgOiBleHBvcnRQYWRkaW5nKSxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgKG9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSA/IDAgOiBleHBvcnRQYWRkaW5nKSxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIlxuICAgIH0pLFxuICAgIHJlbmRlckNvbmZpZzoge1xuICAgICAgaW1hZ2VDYWNoZSxcbiAgICAgIHJlbmRlckdyaWQ6IGZhbHNlLFxuICAgICAgaXNFeHBvcnRpbmc6IHRydWVcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY2FudmFzO1xufSk7XG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSAoZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcywgb3B0cykgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gIHZhciBfYSwgX2IsIF9jO1xuXG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcblxuICBpZiAoZXhwb3J0RW1iZWRTY2VuZSkge1xuICAgIHRyeSB7XG4gICAgICBtZXRhZGF0YSA9IHlpZWxkICh5aWVsZCBpbXBvcnQoXG4gICAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi9cbiAgICAgIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIikpLmVuY29kZVN2Z01ldGFkYXRhKHtcbiAgICAgICAgdGV4dDogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5zZXJpYWxpemVBc0pTT04pID8gKF9hID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLnNlcmlhbGl6ZUFzSlNPTikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwob3B0cykgOiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpOyAvLyBpbml0aWFsaXplIFNWRyByb290XG5cbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG5cbiAgaWYgKGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSkge1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gIH1cblxuICBsZXQgYXNzZXRQYXRoID0gXCJodHRwczovL2V4Y2FsaWRyYXcuY29tL1wiOyAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcblxuICBpZiAocHJvY2Vzcy5lbnYuVklURV9JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID0gd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fCBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5WSVRFX1BLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoID09PSBudWxsIHx8IGFzc2V0UGF0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXNzZXRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuXG4gICAgYXNzZXRQYXRoID0gYCR7YXNzZXRQYXRofS9kaXN0L2V4Y2FsaWRyYXctYXNzZXRzL2A7XG4gIH0gLy8gZG8gbm90IGFwcGx5IGNsaXBwaW5nIHdoZW4gd2UncmUgZXhwb3J0aW5nIHRoZSB3aG9sZSBzY2VuZVxuXG5cbiAgY29uc3QgaXNFeHBvcnRpbmdXaG9sZUNhbnZhcyA9ICgoX2MgPSAoX2IgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50c1swXSkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5nZXROb25EZWxldGVkRWxlbWVudHMoKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxlbmd0aCkgPT09IGVsZW1lbnRzLmxlbmd0aDtcbiAgY29uc3Qgb25seUV4cG9ydGluZ1NpbmdsZUZyYW1lID0gaXNPbmx5RXhwb3J0aW5nU2luZ2xlRnJhbWUoZWxlbWVudHMpO1xuICBjb25zdCBvZmZzZXRYID0gLW1pblggKyAob25seUV4cG9ydGluZ1NpbmdsZUZyYW1lID8gMCA6IGV4cG9ydFBhZGRpbmcpO1xuICBjb25zdCBvZmZzZXRZID0gLW1pblkgKyAob25seUV4cG9ydGluZ1NpbmdsZUZyYW1lID8gMCA6IGV4cG9ydFBhZGRpbmcpO1xuICBjb25zdCBleHBvcnRpbmdGcmFtZSA9IGlzRXhwb3J0aW5nV2hvbGVDYW52YXMgfHwgIW9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSA/IHVuZGVmaW5lZCA6IGVsZW1lbnRzLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LnR5cGUgPT09IFwiZnJhbWVcIik7XG4gIGxldCBleHBvcnRpbmdGcmFtZUNsaXBQYXRoID0gXCJcIjtcblxuICBpZiAoZXhwb3J0aW5nRnJhbWUpIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGV4cG9ydGluZ0ZyYW1lKTtcbiAgICBjb25zdCBjeCA9ICh4MiAtIHgxKSAvIDIgLSAoZXhwb3J0aW5nRnJhbWUueCAtIHgxKTtcbiAgICBjb25zdCBjeSA9ICh5MiAtIHkxKSAvIDIgLSAoZXhwb3J0aW5nRnJhbWUueSAtIHkxKTtcbiAgICBleHBvcnRpbmdGcmFtZUNsaXBQYXRoID0gYDxjbGlwUGF0aCBpZD0ke2V4cG9ydGluZ0ZyYW1lLmlkfT5cbiAgICAgICAgICAgIDxyZWN0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgke2V4cG9ydGluZ0ZyYW1lLnggKyBvZmZzZXRYfSAke2V4cG9ydGluZ0ZyYW1lLnkgKyBvZmZzZXRZfSkgcm90YXRlKCR7ZXhwb3J0aW5nRnJhbWUuYW5nbGV9ICR7Y3h9ICR7Y3l9KVwiXG4gICAgICAgICAgd2lkdGg9XCIke2V4cG9ydGluZ0ZyYW1lLndpZHRofVwiXG4gICAgICAgICAgaGVpZ2h0PVwiJHtleHBvcnRpbmdGcmFtZS5oZWlnaHR9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9yZWN0PlxuICAgICAgICA8L2NsaXBQYXRoPmA7XG4gIH1cblxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlIGNsYXNzPVwic3R5bGUtZm9udHNcIj5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgICR7ZXhwb3J0aW5nRnJhbWVDbGlwUGF0aH1cbiAgPC9kZWZzPlxuICBgOyAvLyByZW5kZXIgYmFja2dyb3VuZCByZWN0XG5cbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WCxcbiAgICBvZmZzZXRZLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlLFxuICAgIGV4cG9ydGluZ0ZyYW1lSWQ6IChleHBvcnRpbmdGcmFtZSA9PT0gbnVsbCB8fCBleHBvcnRpbmdGcmFtZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXhwb3J0aW5nRnJhbWUuaWQpIHx8IG51bGwsXG4gICAgcmVuZGVyRW1iZWRkYWJsZXM6IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5yZW5kZXJFbWJlZGRhYmxlc1xuICB9KTtcbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59KTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSA9PiB7XG4gIC8vIHdlIHNob3VsZCBkZWNpZGUgaWYgd2UgYXJlIGV4cG9ydGluZyB0aGUgd2hvbGUgY2FudmFzXG4gIC8vIGlmIHNvLCB3ZSBhcmUgbm90IGNsaXBwaW5nIGVsZW1lbnRzIGluIHRoZSBmcmFtZVxuICAvLyBhbmQgdGhlcmVmb3JlLCB3ZSBzaG91bGQgbm90IGRvIGFueXRoaW5nIHNwZWNpYWxcbiAgdmFyIF9hLCBfYjtcblxuICBjb25zdCBpc0V4cG9ydGluZ1dob2xlQ2FudmFzID0gKChfYiA9IChfYSA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnRzWzBdKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSA9PT0gZWxlbWVudHMubGVuZ3RoO1xuICBjb25zdCBvbmx5RXhwb3J0aW5nU2luZ2xlRnJhbWUgPSBpc09ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZShlbGVtZW50cyk7XG5cbiAgaWYgKCFpc0V4cG9ydGluZ1dob2xlQ2FudmFzIHx8IG9ubHlFeHBvcnRpbmdTaW5nbGVGcmFtZSkge1xuICAgIGNvbnN0IGZyYW1lcyA9IGVsZW1lbnRzLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQudHlwZSA9PT0gXCJmcmFtZVwiKTtcbiAgICBjb25zdCBleHBvcnRlZEZyYW1lSWRzID0gZnJhbWVzLnJlZHVjZSgoYWNjLCBmcmFtZSkgPT4ge1xuICAgICAgYWNjW2ZyYW1lLmlkXSA9IHRydWU7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTsgLy8gZWxlbWVudHMgaW4gYSBmcmFtZSBkbyBub3QgYWZmZWN0IHRoZSBjYW52YXMgc2l6ZSBpZiB3ZSdyZSBub3QgZXhwb3J0aW5nXG4gICAgLy8gdGhlIHdob2xlIGNhbnZhc1xuXG4gICAgZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoZWxlbWVudCA9PiB7XG4gICAgICB2YXIgX2E7XG5cbiAgICAgIHJldHVybiAhZXhwb3J0ZWRGcmFtZUlkc1soX2EgPSBlbGVtZW50LmZyYW1lSWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwiXCJdO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIChvbmx5RXhwb3J0aW5nU2luZ2xlRnJhbWUgPyAwIDogZXhwb3J0UGFkZGluZyAqIDIpO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIChvbmx5RXhwb3J0aW5nU2luZ2xlRnJhbWUgPyAwIDogZXhwb3J0UGFkZGluZyAqIDIpO1xuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcsIHNjYWxlKSA9PiB7XG4gIGNvbnN0IFssLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChkaW1lbnNpb24gPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSkpO1xuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
4403
4403
|
|
|
4404
4404
|
/***/ }),
|
|
4405
4405
|
|