@openmrs/esm-app-shell 10.0.1-pre.5009 → 10.0.1-pre.5045

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.
@@ -1995,7 +1995,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
1995
1995
  },
1996
1996
  "../../framework/esm-styleguide/dist/workspaces2/workspace2.js"(__unused_rspack_module, __webpack_exports__, __webpack_require__) {
1997
1997
  "use strict";
1998
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n closeWorkspaceGroup2: () => (closeWorkspaceGroup2),\n getRegisteredWorkspace2Names: () => (getRegisteredWorkspace2Names),\n launchWorkspace2: () => (launchWorkspace2),\n launchWorkspaceGroup2: () => (launchWorkspaceGroup2),\n promptForClosingWorkspaces: () => (promptForClosingWorkspaces),\n useWorkspace2Context: () => (useWorkspace2Context),\n useWorkspace2Store: () => (useWorkspace2Store),\n workspace2StoreActions: () => (workspace2StoreActions)\n});\n/* import */ var react__rspack_import_0 = __webpack_require__(\"webpack/sharing/consume/default/react/react\");\n/* import */ var react__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(react__rspack_import_0);\n/* import */ var single_spa_react__rspack_import_1 = __webpack_require__(\"../../../node_modules/single-spa-react/lib/esm/single-spa-react.js\");\n/* import */ var uuid__rspack_import_6 = __webpack_require__(\"../../../node_modules/uuid/dist/esm-browser/v4.js\");\n/* import */ var _openmrs_esm_extensions__rspack_import_2 = __webpack_require__(\"../../framework/esm-extensions/dist/index.js\");\n/* import */ var _openmrs_esm_react_utils__rspack_import_3 = __webpack_require__(\"../../framework/esm-react-utils/dist/index.js\");\n/* import */ var _openmrs_esm_utils__rspack_import_5 = __webpack_require__(\"../../framework/esm-utils/dist/shallowEqual.js\");\n/* import */ var _modals_index_js__rspack_import_4 = __webpack_require__(\"../../framework/esm-styleguide/dist/modals/index.js\");\nfunction _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction _array_without_holes(arr) {\n if (Array.isArray(arr)) return _array_like_to_array(arr);\n}\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _iterable_to_array(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _non_iterable_spread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _to_consumable_array(arr) {\n return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();\n}\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nfunction _ts_generator(thisArg, body) {\n var f, y, t, _ = {\n label: 0,\n sent: function() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n }, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype), d = Object.defineProperty;\n return d(g, \"next\", {\n value: verb(0)\n }), d(g, \"throw\", {\n value: verb(1)\n }), d(g, \"return\", {\n value: verb(2)\n }), typeof Symbol === \"function\" && d(g, Symbol.iterator, {\n value: function() {\n return this;\n }\n }), g;\n function verb(n) {\n return function(v) {\n return step([\n n,\n v\n ]);\n };\n }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while(g && (g = 0, op[0] && (_ = 0)), _)try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [\n op[0] & 2,\n t.value\n ];\n switch(op[0]){\n case 0:\n case 1:\n t = op;\n break;\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n case 5:\n _.label++;\n y = op[1];\n op = [\n 0\n ];\n continue;\n case 7:\n op = _.ops.pop();\n _.trys.pop();\n continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n if (t && _.label < t[2]) {\n _.label = t[2];\n _.ops.push(op);\n break;\n }\n if (t[2]) _.ops.pop();\n _.trys.pop();\n continue;\n }\n op = body.call(thisArg, _);\n } catch (e) {\n op = [\n 6,\n e\n ];\n y = 0;\n } finally{\n f = t = 0;\n }\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\n\n\n\n\n\n\n\n/**\n * Attempts to launch the specified workspace group with the given group props. Note that only one workspace group\n * may be opened at any given time. If a workspace group is already opened, calling `launchWorkspaceGroup2` with\n * either a different group name, or same group name but different incompatible props**, will result in prompting to\n * confirm closing workspaces. If the user confirms, the opened group, along with its windows (and their workspaces), is closed, and\n * the requested group is immediately opened.\n *\n * ** 2 sets of props are compatible if either one is nullish, or if they are shallow equal.\n * @param groupName\n * @param groupProps\n * @returns a Promise that resolves to true if the specified workspace group with the specified group props\n * is successfully opened, or that it already is opened.\n */ function launchWorkspaceGroup2(groupName, groupProps) {\n return _async_to_generator(function() {\n var openedGroup, okToCloseWorkspaces;\n return _ts_generator(this, function(_state) {\n switch(_state.label){\n case 0:\n openedGroup = _openmrs_esm_extensions__rspack_import_2.workspace2Store.getState().openedGroup;\n if (!openedGroup) return [\n 3,\n 3\n ];\n if (!(openedGroup.groupName !== groupName || !arePropsCompatible(openedGroup.props, groupProps))) return [\n 3,\n 2\n ];\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WORKSPACE_GROUP',\n explicit: false\n })\n ];\n case 1:\n okToCloseWorkspaces = _state.sent();\n if (!okToCloseWorkspaces) {\n return [\n 2,\n false\n ];\n }\n return [\n 3,\n 3\n ];\n case 2:\n // no-op, group with group props is already opened\n return [\n 2,\n true\n ];\n case 3:\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n openedGroup: {\n groupName: groupName,\n props: groupProps\n },\n openedWindows: []\n });\n });\n return [\n 2,\n true\n ];\n }\n });\n })();\n}\n/**\n * Closes the workspace group that is currently opened. Note that only one workspace group\n * may be opened at any given time\n * @param discardUnsavedChanges If true, then the workspace group is forced closed, with no prompt\n * for confirmation for unsaved changes in any opened workspace. This should be used sparingly\n * for clean-up purpose, ex: when exiting an app.\n * @returns a Promise that resolves to true if there is no opened group to begin with or we successfully closed\n * the opened group; false otherwise.\n */ function closeWorkspaceGroup2(discardUnsavedChanges) {\n return _async_to_generator(function() {\n var state, openedGroup, openedWindows, okToCloseWorkspaces, _tmp;\n return _ts_generator(this, function(_state) {\n switch(_state.label){\n case 0:\n state = _openmrs_esm_extensions__rspack_import_2.workspace2Store.getState();\n openedGroup = state.openedGroup, openedWindows = state.openedWindows;\n if (!openedGroup) return [\n 3,\n 4\n ];\n if (!(openedWindows.length > 0)) return [\n 3,\n 3\n ];\n _tmp = discardUnsavedChanges;\n if (_tmp) return [\n 3,\n 2\n ];\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WORKSPACE_GROUP',\n explicit: true\n })\n ];\n case 1:\n _tmp = _state.sent();\n _state.label = 2;\n case 2:\n okToCloseWorkspaces = _tmp;\n if (!okToCloseWorkspaces) {\n return [\n 2,\n false\n ];\n }\n _state.label = 3;\n case 3:\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n openedGroup: null,\n openedWindows: []\n });\n });\n return [\n 2,\n true\n ];\n case 4:\n // no openedGroup with begin with, return true\n return [\n 2,\n true\n ];\n }\n });\n })();\n}\n/**\n * Attempts to launch the specified workspace with the given workspace props. This also implicitly opens\n * the workspace window to which the workspace belongs (if it's not opened already),\n * and the workspace group to which the window belongs (if it's not opened already).\n *\n * When calling `launchWorkspace2`, we need to also pass in the workspace props. While not required,\n * we can also pass in the window props (shared by other workspaces in the window) and the group props\n * (shared by all windows and their workspaces). Omitting the window props or the group props[^1] means the caller\n * explicitly does not care what the current window props and group props are, and that they may be set\n * by other actions (like calling `launchWorkspace2` on a different workspace with those props passed in)\n * at a later time.\n *\n * If there is already an opened workspace group, and it's not the group the workspace belongs to\n * or has incompatible[^2] group props, then we prompt the user to close the group (and its windows and their workspaces).\n * On user confirm, the existing opened group is closed and the new workspace, along with its window and its group,\n * is opened.\n *\n * If the window is already opened, but with incompatible window props, we prompt the user to close\n * the window (and all its opened workspaces), and reopen the window with (only) the newly requested workspace.\n *\n * If the workspace is already opened, but with incompatible workspace props, we also prompt the user to close\n * the **window** (and all its opened workspaces), and reopen the window with (only) the newly requested workspace.\n * This is true regardless of whether the already opened workspace has any child workspaces.\n *\n * Note that calling this function *never* results in creating a child workspace in the affected window.\n * To do so, we need to call `launchChildWorkspace` instead.\n *\n * [^1] Omitting window or group props is useful for workspaces that don't have ties to the window or group \"context\" (props).\n * For example, in the patient chart, the visit notes / clinical forms / order basket action menu button all share\n * a \"group context\" of the current visit. However, the \"patient list\" action menu button does not need to share that group\n * context, so opening that workspace should not need to cause other workspaces / windows / groups to potentially close.\n * The \"patient search\" workspace in the queues and ward apps is another example.\n *\n * [^2] 2 sets of props are compatible if either one is nullish, or if they are shallow equal.\n */ function launchWorkspace2(workspaceName) {\n var workspaceProps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null, windowProps = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null, groupProps = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : null;\n return _async_to_generator(function() {\n var storeState, windowDef, openedGroup, windowName, groupDef, openedWindowIndex, isWindowAlreadyOpened, okToCloseWorkspaces, _ref, _storeState_openedGroup, openedWindow, groupProps1, isMostRecentlyOpenedWindowHidden, openedWorkspaces, openedWorkspace, okToCloseWorkspaces1, _ref1, _ref2, _storeState_openedGroup1, okToCloseWorkspaces2, _storeState_openedGroup2, okToCloseWorkspaces3, _ref3, _storeState_openedGroup3, _ref4, _storeState_openedGroup4;\n return _ts_generator(this, function(_state) {\n switch(_state.label){\n case 0:\n storeState = _openmrs_esm_extensions__rspack_import_2.workspace2Store.getState();\n if (!storeState.registeredWorkspacesByName[workspaceName]) {\n throw new Error(\"Unable to launch workspace \".concat(workspaceName, \". Workspace is not registered\"));\n }\n windowDef = (0,_openmrs_esm_extensions__rspack_import_2.getWindowByWorkspaceName)(workspaceName);\n if (!windowDef) {\n throw new Error(\"Unable to launch workspace \".concat(workspaceName, \". Workspace is not registered to a workspace window\"));\n }\n openedGroup = storeState.openedGroup;\n windowName = windowDef.name;\n groupDef = (0,_openmrs_esm_extensions__rspack_import_2.getGroupByWindowName)(windowName);\n if (!groupDef) {\n throw new Error(\"Unable to launch workspace \".concat(workspaceName, \". Workspace window \").concat(windowDef.name, \" is not registered to a workspace group\"));\n }\n openedWindowIndex = (0,_openmrs_esm_extensions__rspack_import_2.getOpenedWindowIndexByWorkspace)(workspaceName);\n isWindowAlreadyOpened = openedWindowIndex >= 0;\n if (!(openedGroup && (openedGroup.groupName !== groupDef.name || !arePropsCompatible(openedGroup.props, groupProps)))) return [\n 3,\n 2\n ];\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WORKSPACE_GROUP',\n explicit: true\n })\n ];\n case 1:\n okToCloseWorkspaces = _state.sent();\n if (okToCloseWorkspaces) {\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: groupProps\n },\n openedWindows: [\n // discard all opened windows, open a new one with the requested workspace\n // most recently opened action appended to the end\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: windowProps,\n maximized: false\n }\n ],\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n } else {\n return [\n 2,\n false\n ];\n }\n return [\n 3,\n 12\n ];\n case 2:\n if (!isWindowAlreadyOpened) return [\n 3,\n 9\n ];\n openedWindow = storeState.openedWindows[openedWindowIndex];\n groupProps1 = (_ref = (_storeState_openedGroup = storeState.openedGroup) === null || _storeState_openedGroup === void 0 ? void 0 : _storeState_openedGroup.props) !== null && _ref !== void 0 ? _ref : {};\n isMostRecentlyOpenedWindowHidden = storeState.isMostRecentlyOpenedWindowHidden;\n openedWorkspaces = openedWindow.openedWorkspaces;\n if (!arePropsCompatible(openedWindow.props, windowProps)) return [\n 3,\n 6\n ];\n // this case is tricky, this results in restoring the window if:\n // 1. the workspace is opened (but not necessarily as a leaf workspace)\n // 2. the props of the opened workspace is same as workspace props (from the function input)\n //\n // Otherwise, we close all workspaces in this window, and open this newly requested one\n openedWorkspace = openedWorkspaces.find(function(w) {\n return w.workspaceName === workspaceName;\n });\n if (!(openedWorkspace && arePropsCompatible(openedWorkspace.props, workspaceProps))) return [\n 3,\n 3\n ];\n // restore the window if it is hidden or not the most recently opened one\n if (isMostRecentlyOpenedWindowHidden || openedWindowIndex !== storeState.openedWindows.length - 1) {\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(workspace2StoreActions.restoreWindow(storeState, windowName));\n }\n return [\n 2,\n true\n ];\n case 3:\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WORKSPACE',\n explicit: false,\n windowName: windowName,\n workspaceName: workspaceName\n })\n ];\n case 4:\n okToCloseWorkspaces1 = _state.sent();\n if (okToCloseWorkspaces1) {\n ;\n ;\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: (_ref1 = storeState === null || storeState === void 0 ? void 0 : (_storeState_openedGroup1 = storeState.openedGroup) === null || _storeState_openedGroup1 === void 0 ? void 0 : _storeState_openedGroup1.props) !== null && _ref1 !== void 0 ? _ref1 : groupProps1\n },\n openedWindows: _to_consumable_array(storeState.openedWindows.filter(function(_, i) {\n return i !== openedWindowIndex;\n })).concat([\n // most recently opened workspace at the end of the array\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: (_ref2 = openedWindow === null || openedWindow === void 0 ? void 0 : openedWindow.props) !== null && _ref2 !== void 0 ? _ref2 : windowProps,\n maximized: false\n }\n ]),\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n } else {\n return [\n 2,\n false\n ];\n }\n _state.label = 5;\n case 5:\n return [\n 3,\n 8\n ];\n case 6:\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WINDOW',\n explicit: false,\n windowName: windowName\n })\n ];\n case 7:\n okToCloseWorkspaces2 = _state.sent();\n if (okToCloseWorkspaces2) {\n ;\n // discard the openedWindows element at openedWindowIndex\n // and create a new one with the requested workspace opened\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: groupProps1 !== null && groupProps1 !== void 0 ? groupProps1 : storeState === null || storeState === void 0 ? void 0 : (_storeState_openedGroup2 = storeState.openedGroup) === null || _storeState_openedGroup2 === void 0 ? void 0 : _storeState_openedGroup2.props\n },\n openedWindows: _to_consumable_array(storeState.openedWindows.filter(function(_, i) {\n return i !== openedWindowIndex;\n })).concat([\n // most recently opened workspace at the end of the array\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: windowProps,\n maximized: false\n }\n ]),\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n } else {\n return [\n 2,\n false\n ];\n }\n _state.label = 8;\n case 8:\n return [\n 3,\n 12\n ];\n case 9:\n if (!(groupDef.persistence == 'closable')) return [\n 3,\n 11\n ];\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_OTHER_WINDOWS',\n explicit: false,\n windowNameToSpare: windowDef.name\n })\n ];\n case 10:\n okToCloseWorkspaces3 = _state.sent();\n if (okToCloseWorkspaces3) {\n ;\n ;\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: (_ref3 = groupProps !== null && groupProps !== void 0 ? groupProps : storeState === null || storeState === void 0 ? void 0 : (_storeState_openedGroup3 = storeState.openedGroup) === null || _storeState_openedGroup3 === void 0 ? void 0 : _storeState_openedGroup3.props) !== null && _ref3 !== void 0 ? _ref3 : null\n },\n openedWindows: [\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: windowProps,\n maximized: false\n }\n ],\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n } else {\n return [\n 2,\n false\n ];\n }\n return [\n 3,\n 12\n ];\n case 11:\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: (_ref4 = groupProps !== null && groupProps !== void 0 ? groupProps : storeState === null || storeState === void 0 ? void 0 : (_storeState_openedGroup4 = storeState.openedGroup) === null || _storeState_openedGroup4 === void 0 ? void 0 : _storeState_openedGroup4.props) !== null && _ref4 !== void 0 ? _ref4 : null\n },\n openedWindows: _to_consumable_array(storeState.openedWindows).concat([\n // most recently opened workspace at the end of the array\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: windowProps,\n maximized: false\n }\n ]),\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n case 12:\n return [\n 2\n ];\n }\n });\n })();\n}\n/**\n * When we launch a workspace, we may pass in workspace / windows / group props. If the workspace or\n * window or group is currently opened, we have to check whether the current props are compatible with\n * the passed in props. 2 props A and B are compatible if:\n * either one is nullish (because this indicates that the caller does not care about prop incompatibility)\n * neither is nullish, and A and B are shallow equal.\n * @param a props\n * @param b props\n * @returns whether props a and b are compatible\n */ function arePropsCompatible(a, b) {\n if (a == null || b == null) {\n return true;\n }\n return (0,_openmrs_esm_utils__rspack_import_5.shallowEqual)(a, b);\n}\n/**\n * A user can perform actions that explicitly result in closing workspaces\n * (such that clicking the 'X' button for the workspace or workspace group), or\n * implicitly (by opening a workspace with different props than the one that is already opened).\n * Calls to closeWorkspace2() or closeWorkspaceGroup2() are considered explicit, while calls\n * to launchWorkspace2() or launchWorkspaceGroup2() are considered implicit.\n *\n * This function prompts the user for confirmation to close workspaces with a modal dialog.\n * When the closing is explicit, it prompts for confirmation for affected workspaces with unsaved changes.\n * When the closing is implicit, it prompts for confirmation for all affected workspaces, regardless of\n * whether they have unsaved changes.\n * @param promptReason\n * @returns a Promise that resolves to true if the user confirmed closing the workspaces; false otherwise.\n */ function promptForClosingWorkspaces(promptReason) {\n // if onlyUpToThisWorkspace is provided, we will only loop till we hit that workspace\n function getAffectedWorkspacesInWindow(openedWindow, onlyUpToThisWorkspace) {\n var ret = [];\n for(var i = openedWindow.openedWorkspaces.length - 1; i >= 0; i--){\n var openedWorkspace = openedWindow.openedWorkspaces[i];\n if (openedWorkspace.hasUnsavedChanges) {\n ret.push(openedWorkspace);\n }\n if (onlyUpToThisWorkspace && openedWorkspace.workspaceName === onlyUpToThisWorkspace) {\n break;\n }\n }\n return ret;\n }\n var _workspace2Store_getState = _openmrs_esm_extensions__rspack_import_2.workspace2Store.getState(), openedWindows = _workspace2Store_getState.openedWindows, workspaceTitleByWorkspaceName = _workspace2Store_getState.workspaceTitleByWorkspaceName;\n var affectedWorkspaces = [];\n switch(promptReason.reason){\n case 'CLOSE_WORKSPACE_GROUP':\n {\n affectedWorkspaces = openedWindows.flatMap(function(window) {\n return getAffectedWorkspacesInWindow(window);\n });\n break;\n }\n case 'CLOSE_WINDOW':\n {\n var openedWindow = openedWindows.find(function(window) {\n return window.windowName === promptReason.windowName;\n });\n if (!openedWindow) {\n throw new Error(\"Window \".concat(promptReason.windowName, \" not found in opened windows.\"));\n }\n affectedWorkspaces = getAffectedWorkspacesInWindow(openedWindow);\n break;\n }\n case 'CLOSE_WORKSPACE':\n {\n var openedWindow1 = openedWindows.find(function(window) {\n return window.windowName === promptReason.windowName;\n });\n if (!openedWindow1) {\n throw new Error(\"Window \".concat(promptReason.windowName, \" not found in opened windows.\"));\n }\n affectedWorkspaces = getAffectedWorkspacesInWindow(openedWindow1, promptReason.workspaceName);\n break;\n }\n case 'CLOSE_OTHER_WINDOWS':\n {\n var windowsToClose = openedWindows.filter(function(window) {\n return window.windowName !== promptReason.windowNameToSpare;\n });\n affectedWorkspaces = windowsToClose.flatMap(function(w) {\n return getAffectedWorkspacesInWindow(w);\n });\n break;\n }\n }\n if (affectedWorkspaces.length === 0) {\n return Promise.resolve(true); // no unsaved changes, no need to prompt\n }\n return new Promise(function(resolve) {\n var dispose = (0,_modals_index_js__rspack_import_4.showModal)('workspace2-close-prompt', {\n onConfirm: function onConfirm() {\n dispose();\n resolve(true);\n },\n onCancel: function onCancel() {\n dispose();\n resolve(false);\n },\n affectedWorkspaceTitles: affectedWorkspaces.map(function(workspace) {\n return workspaceTitleByWorkspaceName[workspace.workspaceName];\n })\n });\n });\n}\nvar workspace2StoreActions = {\n setWindowMaximized: function setWindowMaximized(state, windowName, maximized) {\n var openedWindowIndex = state.openedWindows.findIndex(function(a) {\n return a.windowName === windowName;\n });\n var openedWindows = _to_consumable_array(state.openedWindows);\n var currentWindow = _object_spread_props(_object_spread({}, openedWindows[openedWindowIndex]), {\n maximized: maximized\n });\n openedWindows[openedWindowIndex] = currentWindow;\n return _object_spread_props(_object_spread({}, state), {\n openedWindows: openedWindows\n });\n },\n // hides the most recently opened window (all other opened windows are implicitly hidden)\n hideWindow: function hideWindow(state) {\n return _object_spread_props(_object_spread({}, state), {\n isMostRecentlyOpenedWindowHidden: true\n });\n },\n restoreWindow: function restoreWindow(state, windowName) {\n var openedWindowIndex = state.openedWindows.findIndex(function(a) {\n return a.windowName === windowName;\n });\n var currentWindow = state.openedWindows[openedWindowIndex];\n var openedWindows = _to_consumable_array(state.openedWindows.filter(function(_, i) {\n return i !== openedWindowIndex;\n })).concat([\n currentWindow\n ]);\n return _object_spread_props(_object_spread({}, state), {\n openedWindows: openedWindows,\n isMostRecentlyOpenedWindowHidden: false\n });\n },\n closeWorkspace: function closeWorkspace(state, workspaceName) {\n var openedWindowIndex = (0,_openmrs_esm_extensions__rspack_import_2.getOpenedWindowIndexByWorkspace)(workspaceName);\n if (openedWindowIndex < 0) {\n return state; // no-op if the window does not exist\n }\n var window = _object_spread({}, state.openedWindows[openedWindowIndex]);\n var workspaceIndex = window.openedWorkspaces.findIndex(function(w) {\n return w.workspaceName === workspaceName;\n });\n var openedWindows = _to_consumable_array(state.openedWindows);\n // close all children of the input workspace as well\n window.openedWorkspaces = window.openedWorkspaces.slice(0, workspaceIndex);\n var hidden = state.isMostRecentlyOpenedWindowHidden;\n if (window.openedWorkspaces.length === 0) {\n var wasMostRecentWindow = openedWindowIndex === state.openedWindows.length - 1;\n // if no workspaces left, remove the window\n openedWindows.splice(openedWindowIndex, 1);\n // If we removed the most recent window and there are still windows left,\n // the new most recent window should be shown\n if (wasMostRecentWindow && openedWindows.length > 0) {\n hidden = false;\n }\n } else {\n // if there are still workspaces left, just update the window\n openedWindows[openedWindowIndex] = window;\n }\n return _object_spread_props(_object_spread({}, state), {\n openedWindows: openedWindows,\n isMostRecentlyOpenedWindowHidden: hidden\n });\n },\n openChildWorkspace: function openChildWorkspace(state, parentWorkspaceName, childWorkspaceName, childWorkspaceProps) {\n var childWorkspaceDef = state.registeredWorkspacesByName[childWorkspaceName];\n if (!childWorkspaceDef) {\n throw new Error('No workspace named \"'.concat(childWorkspaceName, '\" registered'));\n }\n var parentWorkspaceDef = state.registeredWorkspacesByName[parentWorkspaceName];\n if (!parentWorkspaceDef) {\n throw new Error('No workspace named \"'.concat(parentWorkspaceName, '\" registered'));\n }\n if (parentWorkspaceDef.window !== childWorkspaceDef.window) {\n throw new Error(\"Child workspace \".concat(childWorkspaceName, \" does not belong to the same workspace window as parent workspace \").concat(parentWorkspaceName));\n }\n // as the request workspace should be a child workspace, the corresponding window\n // to contain the workspace should already be opened\n var openedWindowIndex = state.openedWindows.findIndex(function(window) {\n return window.windowName === childWorkspaceDef.window;\n });\n if (openedWindowIndex == -1) {\n throw new Error(\"Cannot open child workspace \".concat(childWorkspaceName, \" as window \").concat(childWorkspaceDef.window, \" is not opened\"));\n }\n var openedWindow = state.openedWindows[openedWindowIndex];\n var openedWorkspaces = openedWindow.openedWorkspaces;\n var parentIndex = openedWorkspaces.findIndex(function(w) {\n return w.workspaceName === parentWorkspaceName;\n });\n if (parentIndex === -1) {\n throw new Error(\"Cannot open child workspace \".concat(childWorkspaceName, \" from parent workspace \").concat(parentWorkspaceName, \" as the parent is not opened within the workspace window\"));\n }\n // Close any workspaces above the parent (analogous to closeWorkspace's slice behavior)\n var trimmedWorkspaces = openedWorkspaces.slice(0, parentIndex + 1);\n return {\n openedWindows: state.openedWindows.map(function(w, i) {\n if (i == openedWindowIndex) {\n return _object_spread_props(_object_spread({}, w), {\n openedWorkspaces: _to_consumable_array(trimmedWorkspaces).concat([\n newOpenedWorkspace(childWorkspaceName, childWorkspaceProps)\n ])\n });\n } else {\n return w;\n }\n })\n };\n },\n setHasUnsavedChanges: function setHasUnsavedChanges(state, workspaceName, hasUnsavedChanges) {\n var openedWindowIndex = (0,_openmrs_esm_extensions__rspack_import_2.getOpenedWindowIndexByWorkspace)(workspaceName);\n if (openedWindowIndex < 0) {\n return state; // no-op if the window does not exist\n }\n var openedWindow = _object_spread({}, state.openedWindows[openedWindowIndex]);\n var workspaceIndex = openedWindow.openedWorkspaces.findIndex(function(w) {\n return w.workspaceName === workspaceName;\n });\n if (workspaceIndex < 0) {\n return state; // no-op if the workspace is not found\n }\n openedWindow.openedWorkspaces[workspaceIndex] = _object_spread_props(_object_spread({}, openedWindow.openedWorkspaces[workspaceIndex]), {\n hasUnsavedChanges: hasUnsavedChanges\n });\n var openedWindows = _to_consumable_array(state.openedWindows);\n openedWindows[openedWindowIndex] = openedWindow;\n return _object_spread_props(_object_spread({}, state), {\n openedWindows: openedWindows\n });\n },\n setWorkspaceTitle: function setWorkspaceTitle(state, workspaceName, title) {\n var newWorkspaceTitleByWorkspaceName = _object_spread({}, state.workspaceTitleByWorkspaceName);\n if (title === null) {\n delete newWorkspaceTitleByWorkspaceName[workspaceName];\n } else {\n newWorkspaceTitleByWorkspaceName[workspaceName] = title;\n }\n return _object_spread_props(_object_spread({}, state), {\n workspaceTitleByWorkspaceName: newWorkspaceTitleByWorkspaceName\n });\n }\n};\nfunction useWorkspace2Store() {\n return (0,_openmrs_esm_react_utils__rspack_import_3.useStoreWithActions)(_openmrs_esm_extensions__rspack_import_2.workspace2Store, workspace2StoreActions);\n}\n/**\n * Returns the react Context containing props passed into a workspace.\n * This hook MUST be called inside a child of <Workspace2>\n */ var useWorkspace2Context = function useWorkspace2Context() {\n return (0,react__rspack_import_0.useContext)(single_spa_react__rspack_import_1.SingleSpaContext);\n};\n/**\n * @returns a list of registered workspaces.\n */ var getRegisteredWorkspace2Names = function getRegisteredWorkspace2Names() {\n return Object.keys(_openmrs_esm_extensions__rspack_import_2.workspace2Store.getState().registeredWorkspacesByName);\n};\nfunction newOpenedWorkspace(workspaceName, workspaceProps) {\n return {\n workspaceName: workspaceName,\n props: workspaceProps !== null && workspaceProps !== void 0 ? workspaceProps : {},\n hasUnsavedChanges: false,\n uuid: (0,uuid__rspack_import_6[\"default\"])()\n };\n}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLXN0eWxlZ3VpZGUvZGlzdC93b3Jrc3BhY2VzMi93b3Jrc3BhY2UyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXN0eWxlZ3VpZGUvZGlzdC93b3Jrc3BhY2VzMi93b3Jrc3BhY2UyLmpzPzhjYjUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU2luZ2xlU3BhQ29udGV4dCB9IGZyb20gXCJzaW5nbGUtc3BhLXJlYWN0XCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkVjQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgZ2V0R3JvdXBCeVdpbmRvd05hbWUsIGdldE9wZW5lZFdpbmRvd0luZGV4QnlXb3Jrc3BhY2UsIGdldFdpbmRvd0J5V29ya3NwYWNlTmFtZSwgd29ya3NwYWNlMlN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1leHRlbnNpb25zXCI7XG5pbXBvcnQgeyB1c2VTdG9yZVdpdGhBY3Rpb25zIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1yZWFjdC11dGlsc1wiO1xuaW1wb3J0IHsgc2hhbGxvd0VxdWFsIH0gZnJvbSBcIkBvcGVubXJzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgc2hvd01vZGFsIH0gZnJvbSBcIi4uL21vZGFscy9pbmRleC5qc1wiO1xuLyoqXG4gKiBBdHRlbXB0cyB0byBsYXVuY2ggdGhlIHNwZWNpZmllZCB3b3Jrc3BhY2UgZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gZ3JvdXAgcHJvcHMuIE5vdGUgdGhhdCBvbmx5IG9uZSB3b3Jrc3BhY2UgZ3JvdXBcbiAqIG1heSBiZSBvcGVuZWQgYXQgYW55IGdpdmVuIHRpbWUuIElmIGEgd29ya3NwYWNlIGdyb3VwIGlzIGFscmVhZHkgb3BlbmVkLCBjYWxsaW5nIGBsYXVuY2hXb3Jrc3BhY2VHcm91cDJgIHdpdGhcbiAqIGVpdGhlciBhIGRpZmZlcmVudCBncm91cCBuYW1lLCBvciBzYW1lIGdyb3VwIG5hbWUgYnV0IGRpZmZlcmVudCBpbmNvbXBhdGlibGUgcHJvcHMqKiwgd2lsbCByZXN1bHQgaW4gcHJvbXB0aW5nIHRvXG4gKiBjb25maXJtIGNsb3Npbmcgd29ya3NwYWNlcy4gSWYgdGhlIHVzZXIgY29uZmlybXMsIHRoZSBvcGVuZWQgZ3JvdXAsIGFsb25nIHdpdGggaXRzIHdpbmRvd3MgKGFuZCB0aGVpciB3b3Jrc3BhY2VzKSwgaXMgY2xvc2VkLCBhbmRcbiAqIHRoZSByZXF1ZXN0ZWQgZ3JvdXAgaXMgaW1tZWRpYXRlbHkgb3BlbmVkLlxuICpcbiAqICoqIDIgc2V0cyBvZiBwcm9wcyBhcmUgY29tcGF0aWJsZSBpZiBlaXRoZXIgb25lIGlzIG51bGxpc2gsIG9yIGlmIHRoZXkgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKiBAcGFyYW0gZ3JvdXBOYW1lXG4gKiBAcGFyYW0gZ3JvdXBQcm9wc1xuICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHdvcmtzcGFjZSBncm91cCB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXAgcHJvcHNcbiAqICBpcyBzdWNjZXNzZnVsbHkgb3BlbmVkLCBvciB0aGF0IGl0IGFscmVhZHkgaXMgb3BlbmVkLlxuICovIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hXb3Jrc3BhY2VHcm91cDIoZ3JvdXBOYW1lLCBncm91cFByb3BzKSB7XG4gICAgY29uc3QgeyBvcGVuZWRHcm91cCB9ID0gd29ya3NwYWNlMlN0b3JlLmdldFN0YXRlKCk7XG4gICAgaWYgKG9wZW5lZEdyb3VwKSB7XG4gICAgICAgIGlmIChvcGVuZWRHcm91cC5ncm91cE5hbWUgIT09IGdyb3VwTmFtZSB8fCAhYXJlUHJvcHNDb21wYXRpYmxlKG9wZW5lZEdyb3VwLnByb3BzLCBncm91cFByb3BzKSkge1xuICAgICAgICAgICAgY29uc3Qgb2tUb0Nsb3NlV29ya3NwYWNlcyA9IGF3YWl0IHByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzKHtcbiAgICAgICAgICAgICAgICByZWFzb246ICdDTE9TRV9XT1JLU1BBQ0VfR1JPVVAnLFxuICAgICAgICAgICAgICAgIGV4cGxpY2l0OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIW9rVG9DbG9zZVdvcmtzcGFjZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UsIHByb2NlZWQgdG8gb3BlbiB0aGUgbmV3IGdyb3VwIHdpdGggbm8gb3BlbmVkV2luZG93c1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8tb3AsIGdyb3VwIHdpdGggZ3JvdXAgcHJvcHMgaXMgYWxyZWFkeSBvcGVuZWRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBvcGVuZWRHcm91cDoge1xuICAgICAgICAgICAgICAgIGdyb3VwTmFtZSxcbiAgICAgICAgICAgICAgICBwcm9wczogZ3JvdXBQcm9wc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wZW5lZFdpbmRvd3M6IFtdXG4gICAgICAgIH0pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogQ2xvc2VzIHRoZSB3b3Jrc3BhY2UgZ3JvdXAgdGhhdCBpcyBjdXJyZW50bHkgb3BlbmVkLiBOb3RlIHRoYXQgb25seSBvbmUgd29ya3NwYWNlIGdyb3VwXG4gKiBtYXkgYmUgb3BlbmVkIGF0IGFueSBnaXZlbiB0aW1lXG4gKiBAcGFyYW0gZGlzY2FyZFVuc2F2ZWRDaGFuZ2VzIElmIHRydWUsIHRoZW4gdGhlIHdvcmtzcGFjZSBncm91cCBpcyBmb3JjZWQgY2xvc2VkLCB3aXRoIG5vIHByb21wdFxuICogZm9yIGNvbmZpcm1hdGlvbiBmb3IgdW5zYXZlZCBjaGFuZ2VzIGluIGFueSBvcGVuZWQgd29ya3NwYWNlLiBUaGlzIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseVxuICogZm9yIGNsZWFuLXVwIHB1cnBvc2UsIGV4OiB3aGVuIGV4aXRpbmcgYW4gYXBwLlxuICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBubyBvcGVuZWQgZ3JvdXAgdG8gYmVnaW4gd2l0aCBvciB3ZSBzdWNjZXNzZnVsbHkgY2xvc2VkXG4gKiB0aGUgb3BlbmVkIGdyb3VwOyBmYWxzZSBvdGhlcndpc2UuXG4gKi8gZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlV29ya3NwYWNlR3JvdXAyKGRpc2NhcmRVbnNhdmVkQ2hhbmdlcykge1xuICAgIGNvbnN0IHN0YXRlID0gd29ya3NwYWNlMlN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgeyBvcGVuZWRHcm91cCwgb3BlbmVkV2luZG93cyB9ID0gc3RhdGU7XG4gICAgaWYgKG9wZW5lZEdyb3VwKSB7XG4gICAgICAgIGlmIChvcGVuZWRXaW5kb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG9rVG9DbG9zZVdvcmtzcGFjZXMgPSBkaXNjYXJkVW5zYXZlZENoYW5nZXMgfHwgYXdhaXQgcHJvbXB0Rm9yQ2xvc2luZ1dvcmtzcGFjZXMoe1xuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0NMT1NFX1dPUktTUEFDRV9HUk9VUCcsXG4gICAgICAgICAgICAgICAgZXhwbGljaXQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFva1RvQ2xvc2VXb3Jrc3BhY2VzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIG9wZW5lZEdyb3VwOiBudWxsLFxuICAgICAgICAgICAgICAgIG9wZW5lZFdpbmRvd3M6IFtdXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBubyBvcGVuZWRHcm91cCB3aXRoIGJlZ2luIHdpdGgsIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGxhdW5jaCB0aGUgc3BlY2lmaWVkIHdvcmtzcGFjZSB3aXRoIHRoZSBnaXZlbiB3b3Jrc3BhY2UgcHJvcHMuIFRoaXMgYWxzbyBpbXBsaWNpdGx5IG9wZW5zXG4gKiB0aGUgd29ya3NwYWNlIHdpbmRvdyB0byB3aGljaCB0aGUgd29ya3NwYWNlIGJlbG9uZ3MgKGlmIGl0J3Mgbm90IG9wZW5lZCBhbHJlYWR5KSxcbiAqIGFuZCB0aGUgd29ya3NwYWNlIGdyb3VwIHRvIHdoaWNoIHRoZSB3aW5kb3cgYmVsb25ncyAoaWYgaXQncyBub3Qgb3BlbmVkIGFscmVhZHkpLlxuICpcbiAqIFdoZW4gY2FsbGluZyBgbGF1bmNoV29ya3NwYWNlMmAsIHdlIG5lZWQgdG8gYWxzbyBwYXNzIGluIHRoZSB3b3Jrc3BhY2UgcHJvcHMuIFdoaWxlIG5vdCByZXF1aXJlZCxcbiAqIHdlIGNhbiBhbHNvIHBhc3MgaW4gdGhlIHdpbmRvdyBwcm9wcyAoc2hhcmVkIGJ5IG90aGVyIHdvcmtzcGFjZXMgaW4gdGhlIHdpbmRvdykgYW5kIHRoZSBncm91cCBwcm9wc1xuICogKHNoYXJlZCBieSBhbGwgd2luZG93cyBhbmQgdGhlaXIgd29ya3NwYWNlcykuIE9taXR0aW5nIHRoZSB3aW5kb3cgcHJvcHMgb3IgdGhlIGdyb3VwIHByb3BzW14xXSBtZWFucyB0aGUgY2FsbGVyXG4gKiBleHBsaWNpdGx5IGRvZXMgbm90IGNhcmUgd2hhdCB0aGUgY3VycmVudCB3aW5kb3cgcHJvcHMgYW5kIGdyb3VwIHByb3BzIGFyZSwgYW5kIHRoYXQgdGhleSBtYXkgYmUgc2V0XG4gKiBieSBvdGhlciBhY3Rpb25zIChsaWtlIGNhbGxpbmcgYGxhdW5jaFdvcmtzcGFjZTJgIG9uIGEgZGlmZmVyZW50IHdvcmtzcGFjZSB3aXRoIHRob3NlIHByb3BzIHBhc3NlZCBpbilcbiAqIGF0IGEgbGF0ZXIgdGltZS5cbiAqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIG9wZW5lZCB3b3Jrc3BhY2UgZ3JvdXAsIGFuZCBpdCdzIG5vdCB0aGUgZ3JvdXAgdGhlIHdvcmtzcGFjZSBiZWxvbmdzIHRvXG4gKiBvciBoYXMgaW5jb21wYXRpYmxlW14yXSBncm91cCBwcm9wcywgdGhlbiB3ZSBwcm9tcHQgdGhlIHVzZXIgdG8gY2xvc2UgdGhlIGdyb3VwIChhbmQgaXRzIHdpbmRvd3MgYW5kIHRoZWlyIHdvcmtzcGFjZXMpLlxuICogT24gdXNlciBjb25maXJtLCB0aGUgZXhpc3Rpbmcgb3BlbmVkIGdyb3VwIGlzIGNsb3NlZCBhbmQgdGhlIG5ldyB3b3Jrc3BhY2UsIGFsb25nIHdpdGggaXRzIHdpbmRvdyBhbmQgaXRzIGdyb3VwLFxuICogaXMgb3BlbmVkLlxuICpcbiAqIElmIHRoZSB3aW5kb3cgaXMgYWxyZWFkeSBvcGVuZWQsIGJ1dCB3aXRoIGluY29tcGF0aWJsZSB3aW5kb3cgcHJvcHMsIHdlIHByb21wdCB0aGUgdXNlciB0byBjbG9zZVxuICogdGhlIHdpbmRvdyAoYW5kIGFsbCBpdHMgb3BlbmVkIHdvcmtzcGFjZXMpLCBhbmQgcmVvcGVuIHRoZSB3aW5kb3cgd2l0aCAob25seSkgdGhlIG5ld2x5IHJlcXVlc3RlZCB3b3Jrc3BhY2UuXG4gKlxuICogSWYgdGhlIHdvcmtzcGFjZSBpcyBhbHJlYWR5IG9wZW5lZCwgYnV0IHdpdGggaW5jb21wYXRpYmxlIHdvcmtzcGFjZSBwcm9wcywgd2UgYWxzbyBwcm9tcHQgdGhlIHVzZXIgdG8gY2xvc2VcbiAqIHRoZSAqKndpbmRvdyoqIChhbmQgYWxsIGl0cyBvcGVuZWQgd29ya3NwYWNlcyksIGFuZCByZW9wZW4gdGhlIHdpbmRvdyB3aXRoIChvbmx5KSB0aGUgbmV3bHkgcmVxdWVzdGVkIHdvcmtzcGFjZS5cbiAqIFRoaXMgaXMgdHJ1ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFscmVhZHkgb3BlbmVkIHdvcmtzcGFjZSBoYXMgYW55IGNoaWxkIHdvcmtzcGFjZXMuXG4gKlxuICogTm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAqbmV2ZXIqIHJlc3VsdHMgaW4gY3JlYXRpbmcgYSBjaGlsZCB3b3Jrc3BhY2UgaW4gdGhlIGFmZmVjdGVkIHdpbmRvdy5cbiAqIFRvIGRvIHNvLCB3ZSBuZWVkIHRvIGNhbGwgYGxhdW5jaENoaWxkV29ya3NwYWNlYCBpbnN0ZWFkLlxuICpcbiAqIFteMV0gT21pdHRpbmcgd2luZG93IG9yIGdyb3VwIHByb3BzIGlzIHVzZWZ1bCBmb3Igd29ya3NwYWNlcyB0aGF0IGRvbid0IGhhdmUgdGllcyB0byB0aGUgd2luZG93IG9yIGdyb3VwIFwiY29udGV4dFwiIChwcm9wcykuXG4gKiBGb3IgZXhhbXBsZSwgaW4gdGhlIHBhdGllbnQgY2hhcnQsIHRoZSB2aXNpdCBub3RlcyAvIGNsaW5pY2FsIGZvcm1zIC8gb3JkZXIgYmFza2V0IGFjdGlvbiBtZW51IGJ1dHRvbiBhbGwgc2hhcmVcbiAqIGEgXCJncm91cCBjb250ZXh0XCIgb2YgdGhlIGN1cnJlbnQgdmlzaXQuIEhvd2V2ZXIsIHRoZSBcInBhdGllbnQgbGlzdFwiIGFjdGlvbiBtZW51IGJ1dHRvbiBkb2VzIG5vdCBuZWVkIHRvIHNoYXJlIHRoYXQgZ3JvdXBcbiAqIGNvbnRleHQsIHNvIG9wZW5pbmcgdGhhdCB3b3Jrc3BhY2Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNhdXNlIG90aGVyIHdvcmtzcGFjZXMgLyB3aW5kb3dzIC8gZ3JvdXBzIHRvIHBvdGVudGlhbGx5IGNsb3NlLlxuICogVGhlIFwicGF0aWVudCBzZWFyY2hcIiB3b3Jrc3BhY2UgaW4gdGhlIHF1ZXVlcyBhbmQgd2FyZCBhcHBzIGlzIGFub3RoZXIgZXhhbXBsZS5cbiAqXG4gKiBbXjJdIDIgc2V0cyBvZiBwcm9wcyBhcmUgY29tcGF0aWJsZSBpZiBlaXRoZXIgb25lIGlzIG51bGxpc2gsIG9yIGlmIHRoZXkgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKi8gZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFdvcmtzcGFjZTIod29ya3NwYWNlTmFtZSwgd29ya3NwYWNlUHJvcHMgPSBudWxsLCB3aW5kb3dQcm9wcyA9IG51bGwsIGdyb3VwUHJvcHMgPSBudWxsKSB7XG4gICAgY29uc3Qgc3RvcmVTdGF0ZSA9IHdvcmtzcGFjZTJTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGlmICghc3RvcmVTdGF0ZS5yZWdpc3RlcmVkV29ya3NwYWNlc0J5TmFtZVt3b3Jrc3BhY2VOYW1lXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsYXVuY2ggd29ya3NwYWNlICR7d29ya3NwYWNlTmFtZX0uIFdvcmtzcGFjZSBpcyBub3QgcmVnaXN0ZXJlZGApO1xuICAgIH1cbiAgICBjb25zdCB3aW5kb3dEZWYgPSBnZXRXaW5kb3dCeVdvcmtzcGFjZU5hbWUod29ya3NwYWNlTmFtZSk7XG4gICAgaWYgKCF3aW5kb3dEZWYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbGF1bmNoIHdvcmtzcGFjZSAke3dvcmtzcGFjZU5hbWV9LiBXb3Jrc3BhY2UgaXMgbm90IHJlZ2lzdGVyZWQgdG8gYSB3b3Jrc3BhY2Ugd2luZG93YCk7XG4gICAgfVxuICAgIGNvbnN0IHsgb3BlbmVkR3JvdXAgfSA9IHN0b3JlU3RhdGU7XG4gICAgY29uc3QgeyBuYW1lOiB3aW5kb3dOYW1lIH0gPSB3aW5kb3dEZWY7XG4gICAgY29uc3QgZ3JvdXBEZWYgPSBnZXRHcm91cEJ5V2luZG93TmFtZSh3aW5kb3dOYW1lKTtcbiAgICBpZiAoIWdyb3VwRGVmKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxhdW5jaCB3b3Jrc3BhY2UgJHt3b3Jrc3BhY2VOYW1lfS4gV29ya3NwYWNlIHdpbmRvdyAke3dpbmRvd0RlZi5uYW1lfSBpcyBub3QgcmVnaXN0ZXJlZCB0byBhIHdvcmtzcGFjZSBncm91cGApO1xuICAgIH1cbiAgICBjb25zdCBvcGVuZWRXaW5kb3dJbmRleCA9IGdldE9wZW5lZFdpbmRvd0luZGV4QnlXb3Jrc3BhY2Uod29ya3NwYWNlTmFtZSk7XG4gICAgY29uc3QgaXNXaW5kb3dBbHJlYWR5T3BlbmVkID0gb3BlbmVkV2luZG93SW5kZXggPj0gMDtcbiAgICAvLyBpZiBjdXJyZW50IG9wZW5lZCBncm91cCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBncm91cCwgb3IgaWYgdGhlIGdyb3VwIHByb3BzIGFyZSBkaWZmZXJlbnQsIHRoZW4gcHJvbXB0IGZvciB1bnNhdmVkIGNoYW5nZXNcbiAgICBpZiAob3BlbmVkR3JvdXAgJiYgKG9wZW5lZEdyb3VwLmdyb3VwTmFtZSAhPT0gZ3JvdXBEZWYubmFtZSB8fCAhYXJlUHJvcHNDb21wYXRpYmxlKG9wZW5lZEdyb3VwLnByb3BzLCBncm91cFByb3BzKSkpIHtcbiAgICAgICAgY29uc3Qgb2tUb0Nsb3NlV29ya3NwYWNlcyA9IGF3YWl0IHByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzKHtcbiAgICAgICAgICAgIHJlYXNvbjogJ0NMT1NFX1dPUktTUEFDRV9HUk9VUCcsXG4gICAgICAgICAgICBleHBsaWNpdDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9rVG9DbG9zZVdvcmtzcGFjZXMpIHtcbiAgICAgICAgICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4uc3RvcmVTdGF0ZSxcbiAgICAgICAgICAgICAgICBvcGVuZWRHcm91cDoge1xuICAgICAgICAgICAgICAgICAgICBncm91cE5hbWU6IGdyb3VwRGVmLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBncm91cFByb3BzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcGVuZWRXaW5kb3dzOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgYWxsIG9wZW5lZCB3aW5kb3dzLCBvcGVuIGEgbmV3IG9uZSB3aXRoIHRoZSByZXF1ZXN0ZWQgd29ya3NwYWNlXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50bHkgb3BlbmVkIGFjdGlvbiBhcHBlbmRlZCB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd05hbWU6IHdpbmRvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWRXb3Jrc3BhY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3BlbmVkV29ya3NwYWNlKHdvcmtzcGFjZU5hbWUsIHdvcmtzcGFjZVByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiB3aW5kb3dQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltaXplZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1dpbmRvd0FscmVhZHlPcGVuZWQpIHtcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93ID0gc3RvcmVTdGF0ZS5vcGVuZWRXaW5kb3dzW29wZW5lZFdpbmRvd0luZGV4XTtcbiAgICAgICAgY29uc3QgZ3JvdXBQcm9wcyA9IHN0b3JlU3RhdGUub3BlbmVkR3JvdXA/LnByb3BzID8/IHt9O1xuICAgICAgICBjb25zdCBpc01vc3RSZWNlbnRseU9wZW5lZFdpbmRvd0hpZGRlbiA9IHN0b3JlU3RhdGUuaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW47XG4gICAgICAgIGNvbnN0IHsgb3BlbmVkV29ya3NwYWNlcyB9ID0gb3BlbmVkV2luZG93O1xuICAgICAgICBpZiAoYXJlUHJvcHNDb21wYXRpYmxlKG9wZW5lZFdpbmRvdy5wcm9wcywgd2luZG93UHJvcHMpKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGNhc2UgaXMgdHJpY2t5LCB0aGlzIHJlc3VsdHMgaW4gcmVzdG9yaW5nIHRoZSB3aW5kb3cgaWY6XG4gICAgICAgICAgICAvLyAxLiB0aGUgd29ya3NwYWNlIGlzIG9wZW5lZCAoYnV0IG5vdCBuZWNlc3NhcmlseSBhcyBhIGxlYWYgd29ya3NwYWNlKVxuICAgICAgICAgICAgLy8gMi4gdGhlIHByb3BzIG9mIHRoZSBvcGVuZWQgd29ya3NwYWNlIGlzIHNhbWUgYXMgd29ya3NwYWNlIHByb3BzIChmcm9tIHRoZSBmdW5jdGlvbiBpbnB1dClcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNsb3NlIGFsbCB3b3Jrc3BhY2VzIGluIHRoaXMgd2luZG93LCBhbmQgb3BlbiB0aGlzIG5ld2x5IHJlcXVlc3RlZCBvbmVcbiAgICAgICAgICAgIGNvbnN0IG9wZW5lZFdvcmtzcGFjZSA9IG9wZW5lZFdvcmtzcGFjZXMuZmluZCgodyk9Pncud29ya3NwYWNlTmFtZSA9PT0gd29ya3NwYWNlTmFtZSk7XG4gICAgICAgICAgICBpZiAob3BlbmVkV29ya3NwYWNlICYmIGFyZVByb3BzQ29tcGF0aWJsZShvcGVuZWRXb3Jrc3BhY2UucHJvcHMsIHdvcmtzcGFjZVByb3BzKSkge1xuICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHdpbmRvdyBpZiBpdCBpcyBoaWRkZW4gb3Igbm90IHRoZSBtb3N0IHJlY2VudGx5IG9wZW5lZCBvbmVcbiAgICAgICAgICAgICAgICBpZiAoaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW4gfHwgb3BlbmVkV2luZG93SW5kZXggIT09IHN0b3JlU3RhdGUub3BlbmVkV2luZG93cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSh3b3Jrc3BhY2UyU3RvcmVBY3Rpb25zLnJlc3RvcmVXaW5kb3coc3RvcmVTdGF0ZSwgd2luZG93TmFtZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2tUb0Nsb3NlV29ya3NwYWNlcyA9IGF3YWl0IHByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzKHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAnQ0xPU0VfV09SS1NQQUNFJyxcbiAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICB3b3Jrc3BhY2VOYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9rVG9DbG9zZVdvcmtzcGFjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlMlN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0b3JlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWRHcm91cDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTmFtZTogZ3JvdXBEZWYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogc3RvcmVTdGF0ZT8ub3BlbmVkR3JvdXA/LnByb3BzID8/IGdyb3VwUHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWRXaW5kb3dzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uc3RvcmVTdGF0ZS5vcGVuZWRXaW5kb3dzLmZpbHRlcigoXywgaSk9PmkgIT09IG9wZW5lZFdpbmRvd0luZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudGx5IG9wZW5lZCB3b3Jrc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd05hbWU6IHdpbmRvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZFdvcmtzcGFjZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09wZW5lZFdvcmtzcGFjZSh3b3Jrc3BhY2VOYW1lLCB3b3Jrc3BhY2VQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IG9wZW5lZFdpbmRvdz8ucHJvcHMgPz8gd2luZG93UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltaXplZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb2tUb0Nsb3NlV29ya3NwYWNlcyA9IGF3YWl0IHByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzKHtcbiAgICAgICAgICAgICAgICByZWFzb246ICdDTE9TRV9XSU5ET1cnLFxuICAgICAgICAgICAgICAgIGV4cGxpY2l0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3aW5kb3dOYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChva1RvQ2xvc2VXb3Jrc3BhY2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gZGlzY2FyZCB0aGUgb3BlbmVkV2luZG93cyBlbGVtZW50IGF0IG9wZW5lZFdpbmRvd0luZGV4XG4gICAgICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZSBhIG5ldyBvbmUgd2l0aCB0aGUgcmVxdWVzdGVkIHdvcmtzcGFjZSBvcGVuZWRcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2UyU3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5zdG9yZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBvcGVuZWRHcm91cDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBOYW1lOiBncm91cERlZi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IGdyb3VwUHJvcHMgPz8gc3RvcmVTdGF0ZT8ub3BlbmVkR3JvdXA/LnByb3BzXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9wZW5lZFdpbmRvd3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0b3JlU3RhdGUub3BlbmVkV2luZG93cy5maWx0ZXIoKF8sIGkpPT5pICE9PSBvcGVuZWRXaW5kb3dJbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudGx5IG9wZW5lZCB3b3Jrc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dOYW1lOiB3aW5kb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZFdvcmtzcGFjZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3BlbmVkV29ya3NwYWNlKHdvcmtzcGFjZU5hbWUsIHdvcmtzcGFjZVByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHdpbmRvd1Byb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltaXplZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3JvdXBEZWYucGVyc2lzdGVuY2UgPT0gJ2Nsb3NhYmxlJykge1xuICAgICAgICBjb25zdCBva1RvQ2xvc2VXb3Jrc3BhY2VzID0gYXdhaXQgcHJvbXB0Rm9yQ2xvc2luZ1dvcmtzcGFjZXMoe1xuICAgICAgICAgICAgcmVhc29uOiAnQ0xPU0VfT1RIRVJfV0lORE9XUycsXG4gICAgICAgICAgICBleHBsaWNpdDogZmFsc2UsXG4gICAgICAgICAgICB3aW5kb3dOYW1lVG9TcGFyZTogd2luZG93RGVmLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChva1RvQ2xvc2VXb3Jrc3BhY2VzKSB7XG4gICAgICAgICAgICB3b3Jrc3BhY2UyU3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIC4uLnN0b3JlU3RhdGUsXG4gICAgICAgICAgICAgICAgb3BlbmVkR3JvdXA6IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBOYW1lOiBncm91cERlZi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogZ3JvdXBQcm9wcyA/PyBzdG9yZVN0YXRlPy5vcGVuZWRHcm91cD8ucHJvcHMgPz8gbnVsbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3BlbmVkV2luZG93czogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dOYW1lOiB3aW5kb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVkV29ya3NwYWNlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09wZW5lZFdvcmtzcGFjZSh3b3Jrc3BhY2VOYW1lLCB3b3Jrc3BhY2VQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogd2luZG93UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbWl6ZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGlzTW9zdFJlY2VudGx5T3BlbmVkV2luZG93SGlkZGVuOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi5zdG9yZVN0YXRlLFxuICAgICAgICAgICAgb3BlbmVkR3JvdXA6IHtcbiAgICAgICAgICAgICAgICBncm91cE5hbWU6IGdyb3VwRGVmLm5hbWUsXG4gICAgICAgICAgICAgICAgcHJvcHM6IGdyb3VwUHJvcHMgPz8gc3RvcmVTdGF0ZT8ub3BlbmVkR3JvdXA/LnByb3BzID8/IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVuZWRXaW5kb3dzOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RvcmVTdGF0ZS5vcGVuZWRXaW5kb3dzLFxuICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50bHkgb3BlbmVkIHdvcmtzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93TmFtZTogd2luZG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgb3BlbmVkV29ya3NwYWNlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3BlbmVkV29ya3NwYWNlKHdvcmtzcGFjZU5hbWUsIHdvcmtzcGFjZVByb3BzKVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogd2luZG93UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIG1heGltaXplZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4vKipcbiAqIFdoZW4gd2UgbGF1bmNoIGEgd29ya3NwYWNlLCB3ZSBtYXkgcGFzcyBpbiB3b3Jrc3BhY2UgLyB3aW5kb3dzIC8gZ3JvdXAgcHJvcHMuIElmIHRoZSB3b3Jrc3BhY2Ugb3JcbiAqIHdpbmRvdyBvciBncm91cCBpcyBjdXJyZW50bHkgb3BlbmVkLCB3ZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvcHMgYXJlIGNvbXBhdGlibGUgd2l0aFxuICogdGhlIHBhc3NlZCBpbiBwcm9wcy4gMiBwcm9wcyBBIGFuZCBCIGFyZSBjb21wYXRpYmxlIGlmOlxuICogICBlaXRoZXIgb25lIGlzIG51bGxpc2ggKGJlY2F1c2UgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90IGNhcmUgYWJvdXQgcHJvcCBpbmNvbXBhdGliaWxpdHkpXG4gKiAgIG5laXRoZXIgaXMgbnVsbGlzaCwgYW5kIEEgYW5kIEIgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKiBAcGFyYW0gYSBwcm9wc1xuICogQHBhcmFtIGIgcHJvcHNcbiAqIEByZXR1cm5zIHdoZXRoZXIgcHJvcHMgYSBhbmQgYiBhcmUgY29tcGF0aWJsZVxuICovIGZ1bmN0aW9uIGFyZVByb3BzQ29tcGF0aWJsZShhLCBiKSB7XG4gICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzaGFsbG93RXF1YWwoYSwgYik7XG59XG4vKipcbiAqIEEgdXNlciBjYW4gcGVyZm9ybSBhY3Rpb25zIHRoYXQgZXhwbGljaXRseSByZXN1bHQgaW4gY2xvc2luZyB3b3Jrc3BhY2VzXG4gKiAoc3VjaCB0aGF0IGNsaWNraW5nIHRoZSAnWCcgYnV0dG9uIGZvciB0aGUgd29ya3NwYWNlIG9yIHdvcmtzcGFjZSBncm91cCksIG9yXG4gKiBpbXBsaWNpdGx5IChieSBvcGVuaW5nIGEgd29ya3NwYWNlIHdpdGggZGlmZmVyZW50IHByb3BzIHRoYW4gdGhlIG9uZSB0aGF0IGlzIGFscmVhZHkgb3BlbmVkKS5cbiAqIENhbGxzIHRvIGNsb3NlV29ya3NwYWNlMigpIG9yIGNsb3NlV29ya3NwYWNlR3JvdXAyKCkgYXJlIGNvbnNpZGVyZWQgZXhwbGljaXQsIHdoaWxlIGNhbGxzXG4gKiB0byBsYXVuY2hXb3Jrc3BhY2UyKCkgb3IgbGF1bmNoV29ya3NwYWNlR3JvdXAyKCkgYXJlIGNvbnNpZGVyZWQgaW1wbGljaXQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm9tcHRzIHRoZSB1c2VyIGZvciBjb25maXJtYXRpb24gdG8gY2xvc2Ugd29ya3NwYWNlcyB3aXRoIGEgbW9kYWwgZGlhbG9nLlxuICogV2hlbiB0aGUgY2xvc2luZyBpcyBleHBsaWNpdCwgaXQgcHJvbXB0cyBmb3IgY29uZmlybWF0aW9uIGZvciBhZmZlY3RlZCB3b3Jrc3BhY2VzIHdpdGggdW5zYXZlZCBjaGFuZ2VzLlxuICogV2hlbiB0aGUgY2xvc2luZyBpcyBpbXBsaWNpdCwgaXQgcHJvbXB0cyBmb3IgY29uZmlybWF0aW9uIGZvciBhbGwgYWZmZWN0ZWQgd29ya3NwYWNlcywgcmVnYXJkbGVzcyBvZlxuICogd2hldGhlciB0aGV5IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLlxuICogQHBhcmFtIHByb21wdFJlYXNvblxuICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXNlciBjb25maXJtZWQgY2xvc2luZyB0aGUgd29ya3NwYWNlczsgZmFsc2Ugb3RoZXJ3aXNlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9tcHRGb3JDbG9zaW5nV29ya3NwYWNlcyhwcm9tcHRSZWFzb24pIHtcbiAgICAvLyBpZiBvbmx5VXBUb1RoaXNXb3Jrc3BhY2UgaXMgcHJvdmlkZWQsIHdlIHdpbGwgb25seSBsb29wIHRpbGwgd2UgaGl0IHRoYXQgd29ya3NwYWNlXG4gICAgZnVuY3Rpb24gZ2V0QWZmZWN0ZWRXb3Jrc3BhY2VzSW5XaW5kb3cob3BlbmVkV2luZG93LCBvbmx5VXBUb1RoaXNXb3Jrc3BhY2UpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IG9wZW5lZFdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5lZFdvcmtzcGFjZSA9IG9wZW5lZFdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzW2ldO1xuICAgICAgICAgICAgaWYgKG9wZW5lZFdvcmtzcGFjZS5oYXNVbnNhdmVkQ2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHJldC5wdXNoKG9wZW5lZFdvcmtzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob25seVVwVG9UaGlzV29ya3NwYWNlICYmIG9wZW5lZFdvcmtzcGFjZS53b3Jrc3BhY2VOYW1lID09PSBvbmx5VXBUb1RoaXNXb3Jrc3BhY2UpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBjb25zdCB7IG9wZW5lZFdpbmRvd3MsIHdvcmtzcGFjZVRpdGxlQnlXb3Jrc3BhY2VOYW1lIH0gPSB3b3Jrc3BhY2UyU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBsZXQgYWZmZWN0ZWRXb3Jrc3BhY2VzID0gW107XG4gICAgc3dpdGNoKHByb21wdFJlYXNvbi5yZWFzb24pe1xuICAgICAgICBjYXNlICdDTE9TRV9XT1JLU1BBQ0VfR1JPVVAnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkV29ya3NwYWNlcyA9IG9wZW5lZFdpbmRvd3MuZmxhdE1hcCgod2luZG93KT0+Z2V0QWZmZWN0ZWRXb3Jrc3BhY2VzSW5XaW5kb3cod2luZG93KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0NMT1NFX1dJTkRPVyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93ID0gb3BlbmVkV2luZG93cy5maW5kKCh3aW5kb3cpPT53aW5kb3cud2luZG93TmFtZSA9PT0gcHJvbXB0UmVhc29uLndpbmRvd05hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghb3BlbmVkV2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2luZG93ICR7cHJvbXB0UmVhc29uLndpbmRvd05hbWV9IG5vdCBmb3VuZCBpbiBvcGVuZWQgd2luZG93cy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRXb3Jrc3BhY2VzID0gZ2V0QWZmZWN0ZWRXb3Jrc3BhY2VzSW5XaW5kb3cob3BlbmVkV2luZG93KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ0xPU0VfV09SS1NQQUNFJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuZWRXaW5kb3cgPSBvcGVuZWRXaW5kb3dzLmZpbmQoKHdpbmRvdyk9PndpbmRvdy53aW5kb3dOYW1lID09PSBwcm9tcHRSZWFzb24ud2luZG93TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcGVuZWRXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaW5kb3cgJHtwcm9tcHRSZWFzb24ud2luZG93TmFtZX0gbm90IGZvdW5kIGluIG9wZW5lZCB3aW5kb3dzLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZmZlY3RlZFdvcmtzcGFjZXMgPSBnZXRBZmZlY3RlZFdvcmtzcGFjZXNJbldpbmRvdyhvcGVuZWRXaW5kb3csIHByb21wdFJlYXNvbi53b3Jrc3BhY2VOYW1lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ0xPU0VfT1RIRVJfV0lORE9XUyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93c1RvQ2xvc2UgPSBvcGVuZWRXaW5kb3dzLmZpbHRlcigod2luZG93KT0+d2luZG93LndpbmRvd05hbWUgIT09IHByb21wdFJlYXNvbi53aW5kb3dOYW1lVG9TcGFyZSk7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRXb3Jrc3BhY2VzID0gd2luZG93c1RvQ2xvc2UuZmxhdE1hcCgodyk9PmdldEFmZmVjdGVkV29ya3NwYWNlc0luV2luZG93KHcpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFmZmVjdGVkV29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTsgLy8gbm8gdW5zYXZlZCBjaGFuZ2VzLCBubyBuZWVkIHRvIHByb21wdFxuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgIGNvbnN0IGRpc3Bvc2UgPSBzaG93TW9kYWwoJ3dvcmtzcGFjZTItY2xvc2UtcHJvbXB0Jywge1xuICAgICAgICAgICAgb25Db25maXJtOiAoKT0+e1xuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQ2FuY2VsOiAoKT0+e1xuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZmZlY3RlZFdvcmtzcGFjZVRpdGxlczogYWZmZWN0ZWRXb3Jrc3BhY2VzLm1hcCgod29ya3NwYWNlKT0+d29ya3NwYWNlVGl0bGVCeVdvcmtzcGFjZU5hbWVbd29ya3NwYWNlLndvcmtzcGFjZU5hbWVdKVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydCBjb25zdCB3b3Jrc3BhY2UyU3RvcmVBY3Rpb25zID0ge1xuICAgIHNldFdpbmRvd01heGltaXplZCAoc3RhdGUsIHdpbmRvd05hbWUsIG1heGltaXplZCkge1xuICAgICAgICBjb25zdCBvcGVuZWRXaW5kb3dJbmRleCA9IHN0YXRlLm9wZW5lZFdpbmRvd3MuZmluZEluZGV4KChhKT0+YS53aW5kb3dOYW1lID09PSB3aW5kb3dOYW1lKTtcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93cyA9IFtcbiAgICAgICAgICAgIC4uLnN0YXRlLm9wZW5lZFdpbmRvd3NcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgY3VycmVudFdpbmRvdyA9IHtcbiAgICAgICAgICAgIC4uLm9wZW5lZFdpbmRvd3Nbb3BlbmVkV2luZG93SW5kZXhdLFxuICAgICAgICAgICAgbWF4aW1pemVkXG4gICAgICAgIH07XG4gICAgICAgIG9wZW5lZFdpbmRvd3Nbb3BlbmVkV2luZG93SW5kZXhdID0gY3VycmVudFdpbmRvdztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgb3BlbmVkV2luZG93c1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgLy8gaGlkZXMgdGhlIG1vc3QgcmVjZW50bHkgb3BlbmVkIHdpbmRvdyAoYWxsIG90aGVyIG9wZW5lZCB3aW5kb3dzIGFyZSBpbXBsaWNpdGx5IGhpZGRlbilcbiAgICBoaWRlV2luZG93IChzdGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBpc01vc3RSZWNlbnRseU9wZW5lZFdpbmRvd0hpZGRlbjogdHJ1ZVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgcmVzdG9yZVdpbmRvdyAoc3RhdGUsIHdpbmRvd05hbWUpIHtcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93SW5kZXggPSBzdGF0ZS5vcGVuZWRXaW5kb3dzLmZpbmRJbmRleCgoYSk9PmEud2luZG93TmFtZSA9PT0gd2luZG93TmFtZSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRXaW5kb3cgPSBzdGF0ZS5vcGVuZWRXaW5kb3dzW29wZW5lZFdpbmRvd0luZGV4XTtcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93cyA9IFtcbiAgICAgICAgICAgIC4uLnN0YXRlLm9wZW5lZFdpbmRvd3MuZmlsdGVyKChfLCBpKT0+aSAhPT0gb3BlbmVkV2luZG93SW5kZXgpLFxuICAgICAgICAgICAgY3VycmVudFdpbmRvd1xuICAgICAgICBdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBvcGVuZWRXaW5kb3dzLFxuICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBjbG9zZVdvcmtzcGFjZSAoc3RhdGUsIHdvcmtzcGFjZU5hbWUpIHtcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93SW5kZXggPSBnZXRPcGVuZWRXaW5kb3dJbmRleEJ5V29ya3NwYWNlKHdvcmtzcGFjZU5hbWUpO1xuICAgICAgICBpZiAob3BlbmVkV2luZG93SW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7IC8vIG5vLW9wIGlmIHRoZSB3aW5kb3cgZG9lcyBub3QgZXhpc3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3aW5kb3cgPSB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5vcGVuZWRXaW5kb3dzW29wZW5lZFdpbmRvd0luZGV4XVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB3b3Jrc3BhY2VJbmRleCA9IHdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzLmZpbmRJbmRleCgodyk9Pncud29ya3NwYWNlTmFtZSA9PT0gd29ya3NwYWNlTmFtZSk7XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvd3MgPSBbXG4gICAgICAgICAgICAuLi5zdGF0ZS5vcGVuZWRXaW5kb3dzXG4gICAgICAgIF07XG4gICAgICAgIC8vIGNsb3NlIGFsbCBjaGlsZHJlbiBvZiB0aGUgaW5wdXQgd29ya3NwYWNlIGFzIHdlbGxcbiAgICAgICAgd2luZG93Lm9wZW5lZFdvcmtzcGFjZXMgPSB3aW5kb3cub3BlbmVkV29ya3NwYWNlcy5zbGljZSgwLCB3b3Jrc3BhY2VJbmRleCk7XG4gICAgICAgIGxldCBoaWRkZW4gPSBzdGF0ZS5pc01vc3RSZWNlbnRseU9wZW5lZFdpbmRvd0hpZGRlbjtcbiAgICAgICAgaWYgKHdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzTW9zdFJlY2VudFdpbmRvdyA9IG9wZW5lZFdpbmRvd0luZGV4ID09PSBzdGF0ZS5vcGVuZWRXaW5kb3dzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAvLyBpZiBubyB3b3Jrc3BhY2VzIGxlZnQsIHJlbW92ZSB0aGUgd2luZG93XG4gICAgICAgICAgICBvcGVuZWRXaW5kb3dzLnNwbGljZShvcGVuZWRXaW5kb3dJbmRleCwgMSk7XG4gICAgICAgICAgICAvLyBJZiB3ZSByZW1vdmVkIHRoZSBtb3N0IHJlY2VudCB3aW5kb3cgYW5kIHRoZXJlIGFyZSBzdGlsbCB3aW5kb3dzIGxlZnQsXG4gICAgICAgICAgICAvLyB0aGUgbmV3IG1vc3QgcmVjZW50IHdpbmRvdyBzaG91bGQgYmUgc2hvd25cbiAgICAgICAgICAgIGlmICh3YXNNb3N0UmVjZW50V2luZG93ICYmIG9wZW5lZFdpbmRvd3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIHN0aWxsIHdvcmtzcGFjZXMgbGVmdCwganVzdCB1cGRhdGUgdGhlIHdpbmRvd1xuICAgICAgICAgICAgb3BlbmVkV2luZG93c1tvcGVuZWRXaW5kb3dJbmRleF0gPSB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgb3BlbmVkV2luZG93cyxcbiAgICAgICAgICAgIGlzTW9zdFJlY2VudGx5T3BlbmVkV2luZG93SGlkZGVuOiBoaWRkZW5cbiAgICAgICAgfTtcbiAgICB9LFxuICAgIG9wZW5DaGlsZFdvcmtzcGFjZSAoc3RhdGUsIHBhcmVudFdvcmtzcGFjZU5hbWUsIGNoaWxkV29ya3NwYWNlTmFtZSwgY2hpbGRXb3Jrc3BhY2VQcm9wcykge1xuICAgICAgICBjb25zdCBjaGlsZFdvcmtzcGFjZURlZiA9IHN0YXRlLnJlZ2lzdGVyZWRXb3Jrc3BhY2VzQnlOYW1lW2NoaWxkV29ya3NwYWNlTmFtZV07XG4gICAgICAgIGlmICghY2hpbGRXb3Jrc3BhY2VEZWYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gd29ya3NwYWNlIG5hbWVkIFwiJHtjaGlsZFdvcmtzcGFjZU5hbWV9XCIgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudFdvcmtzcGFjZURlZiA9IHN0YXRlLnJlZ2lzdGVyZWRXb3Jrc3BhY2VzQnlOYW1lW3BhcmVudFdvcmtzcGFjZU5hbWVdO1xuICAgICAgICBpZiAoIXBhcmVudFdvcmtzcGFjZURlZikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB3b3Jrc3BhY2UgbmFtZWQgXCIke3BhcmVudFdvcmtzcGFjZU5hbWV9XCIgcmVnaXN0ZXJlZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnRXb3Jrc3BhY2VEZWYud2luZG93ICE9PSBjaGlsZFdvcmtzcGFjZURlZi53aW5kb3cpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2hpbGQgd29ya3NwYWNlICR7Y2hpbGRXb3Jrc3BhY2VOYW1lfSBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIHNhbWUgd29ya3NwYWNlIHdpbmRvdyBhcyBwYXJlbnQgd29ya3NwYWNlICR7cGFyZW50V29ya3NwYWNlTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcyB0aGUgcmVxdWVzdCB3b3Jrc3BhY2Ugc2hvdWxkIGJlIGEgY2hpbGQgd29ya3NwYWNlLCB0aGUgY29ycmVzcG9uZGluZyB3aW5kb3dcbiAgICAgICAgLy8gdG8gY29udGFpbiB0aGUgd29ya3NwYWNlIHNob3VsZCBhbHJlYWR5IGJlIG9wZW5lZFxuICAgICAgICBjb25zdCBvcGVuZWRXaW5kb3dJbmRleCA9IHN0YXRlLm9wZW5lZFdpbmRvd3MuZmluZEluZGV4KCh3aW5kb3cpPT53aW5kb3cud2luZG93TmFtZSA9PT0gY2hpbGRXb3Jrc3BhY2VEZWYud2luZG93KTtcbiAgICAgICAgaWYgKG9wZW5lZFdpbmRvd0luZGV4ID09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvcGVuIGNoaWxkIHdvcmtzcGFjZSAke2NoaWxkV29ya3NwYWNlTmFtZX0gYXMgd2luZG93ICR7Y2hpbGRXb3Jrc3BhY2VEZWYud2luZG93fSBpcyBub3Qgb3BlbmVkYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93ID0gc3RhdGUub3BlbmVkV2luZG93c1tvcGVuZWRXaW5kb3dJbmRleF07XG4gICAgICAgIGNvbnN0IHsgb3BlbmVkV29ya3NwYWNlcyB9ID0gb3BlbmVkV2luZG93O1xuICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IG9wZW5lZFdvcmtzcGFjZXMuZmluZEluZGV4KCh3KT0+dy53b3Jrc3BhY2VOYW1lID09PSBwYXJlbnRXb3Jrc3BhY2VOYW1lKTtcbiAgICAgICAgaWYgKHBhcmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3BlbiBjaGlsZCB3b3Jrc3BhY2UgJHtjaGlsZFdvcmtzcGFjZU5hbWV9IGZyb20gcGFyZW50IHdvcmtzcGFjZSAke3BhcmVudFdvcmtzcGFjZU5hbWV9IGFzIHRoZSBwYXJlbnQgaXMgbm90IG9wZW5lZCB3aXRoaW4gdGhlIHdvcmtzcGFjZSB3aW5kb3dgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDbG9zZSBhbnkgd29ya3NwYWNlcyBhYm92ZSB0aGUgcGFyZW50IChhbmFsb2dvdXMgdG8gY2xvc2VXb3Jrc3BhY2UncyBzbGljZSBiZWhhdmlvcilcbiAgICAgICAgY29uc3QgdHJpbW1lZFdvcmtzcGFjZXMgPSBvcGVuZWRXb3Jrc3BhY2VzLnNsaWNlKDAsIHBhcmVudEluZGV4ICsgMSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVuZWRXaW5kb3dzOiBzdGF0ZS5vcGVuZWRXaW5kb3dzLm1hcCgodywgaSk9PntcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBvcGVuZWRXaW5kb3dJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZFdvcmtzcGFjZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50cmltbWVkV29ya3NwYWNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcGVuZWRXb3Jrc3BhY2UoY2hpbGRXb3Jrc3BhY2VOYW1lLCBjaGlsZFdvcmtzcGFjZVByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBzZXRIYXNVbnNhdmVkQ2hhbmdlcyAoc3RhdGUsIHdvcmtzcGFjZU5hbWUsIGhhc1Vuc2F2ZWRDaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvd0luZGV4ID0gZ2V0T3BlbmVkV2luZG93SW5kZXhCeVdvcmtzcGFjZSh3b3Jrc3BhY2VOYW1lKTtcbiAgICAgICAgaWYgKG9wZW5lZFdpbmRvd0luZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlOyAvLyBuby1vcCBpZiB0aGUgd2luZG93IGRvZXMgbm90IGV4aXN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93ID0ge1xuICAgICAgICAgICAgLi4uc3RhdGUub3BlbmVkV2luZG93c1tvcGVuZWRXaW5kb3dJbmRleF1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgd29ya3NwYWNlSW5kZXggPSBvcGVuZWRXaW5kb3cub3BlbmVkV29ya3NwYWNlcy5maW5kSW5kZXgoKHcpPT53LndvcmtzcGFjZU5hbWUgPT09IHdvcmtzcGFjZU5hbWUpO1xuICAgICAgICBpZiAod29ya3NwYWNlSW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7IC8vIG5vLW9wIGlmIHRoZSB3b3Jrc3BhY2UgaXMgbm90IGZvdW5kXG4gICAgICAgIH1cbiAgICAgICAgb3BlbmVkV2luZG93Lm9wZW5lZFdvcmtzcGFjZXNbd29ya3NwYWNlSW5kZXhdID0ge1xuICAgICAgICAgICAgLi4ub3BlbmVkV2luZG93Lm9wZW5lZFdvcmtzcGFjZXNbd29ya3NwYWNlSW5kZXhdLFxuICAgICAgICAgICAgaGFzVW5zYXZlZENoYW5nZXNcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93cyA9IFtcbiAgICAgICAgICAgIC4uLnN0YXRlLm9wZW5lZFdpbmRvd3NcbiAgICAgICAgXTtcbiAgICAgICAgb3BlbmVkV2luZG93c1tvcGVuZWRXaW5kb3dJbmRleF0gPSBvcGVuZWRXaW5kb3c7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG9wZW5lZFdpbmRvd3NcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIHNldFdvcmtzcGFjZVRpdGxlIChzdGF0ZSwgd29ya3NwYWNlTmFtZSwgdGl0bGUpIHtcbiAgICAgICAgY29uc3QgbmV3V29ya3NwYWNlVGl0bGVCeVdvcmtzcGFjZU5hbWUgPSB7XG4gICAgICAgICAgICAuLi5zdGF0ZS53b3Jrc3BhY2VUaXRsZUJ5V29ya3NwYWNlTmFtZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGl0bGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdXb3Jrc3BhY2VUaXRsZUJ5V29ya3NwYWNlTmFtZVt3b3Jrc3BhY2VOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1dvcmtzcGFjZVRpdGxlQnlXb3Jrc3BhY2VOYW1lW3dvcmtzcGFjZU5hbWVdID0gdGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgd29ya3NwYWNlVGl0bGVCeVdvcmtzcGFjZU5hbWU6IG5ld1dvcmtzcGFjZVRpdGxlQnlXb3Jrc3BhY2VOYW1lXG4gICAgICAgIH07XG4gICAgfVxufTtcbmV4cG9ydCBmdW5jdGlvbiB1c2VXb3Jrc3BhY2UyU3RvcmUoKSB7XG4gICAgcmV0dXJuIHVzZVN0b3JlV2l0aEFjdGlvbnMod29ya3NwYWNlMlN0b3JlLCB3b3Jrc3BhY2UyU3RvcmVBY3Rpb25zKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgcmVhY3QgQ29udGV4dCBjb250YWluaW5nIHByb3BzIHBhc3NlZCBpbnRvIGEgd29ya3NwYWNlLlxuICogVGhpcyBob29rIE1VU1QgYmUgY2FsbGVkIGluc2lkZSBhIGNoaWxkIG9mIDxXb3Jrc3BhY2UyPlxuICovIGV4cG9ydCBjb25zdCB1c2VXb3Jrc3BhY2UyQ29udGV4dCA9ICgpPT51c2VDb250ZXh0KFNpbmdsZVNwYUNvbnRleHQpO1xuLyoqXG4gKiBAcmV0dXJucyBhIGxpc3Qgb2YgcmVnaXN0ZXJlZCB3b3Jrc3BhY2VzLlxuICovIGV4cG9ydCBjb25zdCBnZXRSZWdpc3RlcmVkV29ya3NwYWNlMk5hbWVzID0gKCk9PntcbiAgICByZXR1cm4gT2JqZWN0LmtleXMod29ya3NwYWNlMlN0b3JlLmdldFN0YXRlKCkucmVnaXN0ZXJlZFdvcmtzcGFjZXNCeU5hbWUpO1xufTtcbmZ1bmN0aW9uIG5ld09wZW5lZFdvcmtzcGFjZSh3b3Jrc3BhY2VOYW1lLCB3b3Jrc3BhY2VQcm9wcykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHdvcmtzcGFjZU5hbWUsXG4gICAgICAgIHByb3BzOiB3b3Jrc3BhY2VQcm9wcyA/PyB7fSxcbiAgICAgICAgaGFzVW5zYXZlZENoYW5nZXM6IGZhbHNlLFxuICAgICAgICB1dWlkOiB1dWlkVjQoKVxuICAgIH07XG59XG4iXSwibmFtZXMiOlsidXNlQ29udGV4dCIsIlNpbmdsZVNwYUNvbnRleHQiLCJ2NCIsInV1aWRWNCIsImdldEdyb3VwQnlXaW5kb3dOYW1lIiwiZ2V0T3BlbmVkV2luZG93SW5kZXhCeVdvcmtzcGFjZSIsImdldFdpbmRvd0J5V29ya3NwYWNlTmFtZSIsIndvcmtzcGFjZTJTdG9yZSIsInVzZVN0b3JlV2l0aEFjdGlvbnMiLCJzaGFsbG93RXF1YWwiLCJzaG93TW9kYWwiLCJsYXVuY2hXb3Jrc3BhY2VHcm91cDIiLCJncm91cE5hbWUiLCJncm91cFByb3BzIiwib3BlbmVkR3JvdXAiLCJva1RvQ2xvc2VXb3Jrc3BhY2VzIiwiYXJlUHJvcHNDb21wYXRpYmxlIiwicHJvbXB0Rm9yQ2xvc2luZ1dvcmtzcGFjZXMiLCJzdGF0ZSIsImNsb3NlV29ya3NwYWNlR3JvdXAyIiwiZGlzY2FyZFVuc2F2ZWRDaGFuZ2VzIiwib3BlbmVkV2luZG93cyIsImxhdW5jaFdvcmtzcGFjZTIiLCJ3b3Jrc3BhY2VOYW1lIiwid29ya3NwYWNlUHJvcHMiLCJ3aW5kb3dQcm9wcyIsInN0b3JlU3RhdGUiLCJ3aW5kb3dEZWYiLCJ3aW5kb3dOYW1lIiwiZ3JvdXBEZWYiLCJvcGVuZWRXaW5kb3dJbmRleCIsImlzV2luZG93QWxyZWFkeU9wZW5lZCIsIl9zdG9yZVN0YXRlX29wZW5lZEdyb3VwIiwib3BlbmVkV2luZG93IiwiZ3JvdXBQcm9wczEiLCJpc01vc3RSZWNlbnRseU9wZW5lZFdpbmRvd0hpZGRlbiIsIm9wZW5lZFdvcmtzcGFjZXMiLCJvcGVuZWRXb3Jrc3BhY2UiLCJva1RvQ2xvc2VXb3Jrc3BhY2VzMSIsIl9zdG9yZVN0YXRlX29wZW5lZEdyb3VwMSIsIm9rVG9DbG9zZVdvcmtzcGFjZXMyIiwiX3N0b3JlU3RhdGVfb3BlbmVkR3JvdXAyIiwib2tUb0Nsb3NlV29ya3NwYWNlczMiLCJfcmVmMyIsIl9zdG9yZVN0YXRlX29wZW5lZEdyb3VwMyIsIl9yZWY0IiwiX3N0b3JlU3RhdGVfb3BlbmVkR3JvdXA0IiwiRXJyb3IiLCJuZXdPcGVuZWRXb3Jrc3BhY2UiLCJ3Iiwid29ya3NwYWNlMlN0b3JlQWN0aW9ucyIsIl8iLCJpIiwiYSIsImIiLCJwcm9tcHRSZWFzb24iLCJnZXRBZmZlY3RlZFdvcmtzcGFjZXNJbldpbmRvdyIsIm9ubHlVcFRvVGhpc1dvcmtzcGFjZSIsInJldCIsIl93b3Jrc3BhY2UyU3RvcmVfZ2V0U3RhdGUiLCJ3b3Jrc3BhY2VUaXRsZUJ5V29ya3NwYWNlTmFtZSIsImFmZmVjdGVkV29ya3NwYWNlcyIsIndpbmRvdyIsIm9wZW5lZFdpbmRvdzEiLCJ3aW5kb3dzVG9DbG9zZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiZGlzcG9zZSIsIm9uQ29uZmlybSIsIm9uQ2FuY2VsIiwid29ya3NwYWNlIiwic2V0V2luZG93TWF4aW1pemVkIiwibWF4aW1pemVkIiwiY3VycmVudFdpbmRvdyIsImhpZGVXaW5kb3ciLCJyZXN0b3JlV2luZG93IiwiY2xvc2VXb3Jrc3BhY2UiLCJ3b3Jrc3BhY2VJbmRleCIsImhpZGRlbiIsIndhc01vc3RSZWNlbnRXaW5kb3ciLCJvcGVuQ2hpbGRXb3Jrc3BhY2UiLCJwYXJlbnRXb3Jrc3BhY2VOYW1lIiwiY2hpbGRXb3Jrc3BhY2VOYW1lIiwiY2hpbGRXb3Jrc3BhY2VQcm9wcyIsImNoaWxkV29ya3NwYWNlRGVmIiwicGFyZW50V29ya3NwYWNlRGVmIiwicGFyZW50SW5kZXgiLCJ0cmltbWVkV29ya3NwYWNlcyIsInNldEhhc1Vuc2F2ZWRDaGFuZ2VzIiwiaGFzVW5zYXZlZENoYW5nZXMiLCJzZXRXb3Jrc3BhY2VUaXRsZSIsInRpdGxlIiwibmV3V29ya3NwYWNlVGl0bGVCeVdvcmtzcGFjZU5hbWUiLCJ1c2VXb3Jrc3BhY2UyU3RvcmUiLCJ1c2VXb3Jrc3BhY2UyQ29udGV4dCIsImdldFJlZ2lzdGVyZWRXb3Jrc3BhY2UyTmFtZXMiLCJPYmplY3QiXSwi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\n//# sourceURL=webpack-internal:///../../framework/esm-styleguide/dist/workspaces2/workspace2.js\n\n}");
1998
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n closeWorkspaceGroup2: () => (closeWorkspaceGroup2),\n getRegisteredWorkspace2Names: () => (getRegisteredWorkspace2Names),\n launchWorkspace2: () => (launchWorkspace2),\n launchWorkspaceGroup2: () => (launchWorkspaceGroup2),\n promptForClosingWorkspaces: () => (promptForClosingWorkspaces),\n useWorkspace2Context: () => (useWorkspace2Context),\n useWorkspace2Store: () => (useWorkspace2Store),\n workspace2StoreActions: () => (workspace2StoreActions)\n});\n/* import */ var react__rspack_import_0 = __webpack_require__(\"webpack/sharing/consume/default/react/react\");\n/* import */ var react__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(react__rspack_import_0);\n/* import */ var single_spa_react__rspack_import_1 = __webpack_require__(\"../../../node_modules/single-spa-react/lib/esm/single-spa-react.js\");\n/* import */ var uuid__rspack_import_6 = __webpack_require__(\"../../../node_modules/uuid/dist/esm-browser/v4.js\");\n/* import */ var _openmrs_esm_extensions__rspack_import_2 = __webpack_require__(\"../../framework/esm-extensions/dist/index.js\");\n/* import */ var _openmrs_esm_react_utils__rspack_import_3 = __webpack_require__(\"../../framework/esm-react-utils/dist/index.js\");\n/* import */ var _openmrs_esm_utils__rspack_import_5 = __webpack_require__(\"../../framework/esm-utils/dist/shallowEqual.js\");\n/* import */ var _modals_index_js__rspack_import_4 = __webpack_require__(\"../../framework/esm-styleguide/dist/modals/index.js\");\nfunction _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction _array_without_holes(arr) {\n if (Array.isArray(arr)) return _array_like_to_array(arr);\n}\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _iterable_to_array(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _non_iterable_spread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _to_consumable_array(arr) {\n return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();\n}\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nfunction _ts_generator(thisArg, body) {\n var f, y, t, _ = {\n label: 0,\n sent: function() {\n if (t[0] & 1) throw t[1];\n return t[1];\n },\n trys: [],\n ops: []\n }, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype), d = Object.defineProperty;\n return d(g, \"next\", {\n value: verb(0)\n }), d(g, \"throw\", {\n value: verb(1)\n }), d(g, \"return\", {\n value: verb(2)\n }), typeof Symbol === \"function\" && d(g, Symbol.iterator, {\n value: function() {\n return this;\n }\n }), g;\n function verb(n) {\n return function(v) {\n return step([\n n,\n v\n ]);\n };\n }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while(g && (g = 0, op[0] && (_ = 0)), _)try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [\n op[0] & 2,\n t.value\n ];\n switch(op[0]){\n case 0:\n case 1:\n t = op;\n break;\n case 4:\n _.label++;\n return {\n value: op[1],\n done: false\n };\n case 5:\n _.label++;\n y = op[1];\n op = [\n 0\n ];\n continue;\n case 7:\n op = _.ops.pop();\n _.trys.pop();\n continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n _ = 0;\n continue;\n }\n if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n _.label = op[1];\n break;\n }\n if (op[0] === 6 && _.label < t[1]) {\n _.label = t[1];\n t = op;\n break;\n }\n if (t && _.label < t[2]) {\n _.label = t[2];\n _.ops.push(op);\n break;\n }\n if (t[2]) _.ops.pop();\n _.trys.pop();\n continue;\n }\n op = body.call(thisArg, _);\n } catch (e) {\n op = [\n 6,\n e\n ];\n y = 0;\n } finally{\n f = t = 0;\n }\n if (op[0] & 5) throw op[1];\n return {\n value: op[0] ? op[1] : void 0,\n done: true\n };\n }\n}\n\n\n\n\n\n\n\n/**\n * Attempts to launch the specified workspace group with the given group props. Note that only one workspace group\n * may be opened at any given time. If a workspace group is already opened, calling `launchWorkspaceGroup2` with\n * either a different group name, or same group name but different incompatible props**, will result in prompting to\n * confirm closing workspaces. If the user confirms, the opened group, along with its windows (and their workspaces), is closed, and\n * the requested group is immediately opened.\n *\n * ** 2 sets of props are compatible if either one is nullish, or if they are shallow equal.\n * @param groupName\n * @param groupProps\n * @returns a Promise that resolves to true if the specified workspace group with the specified group props\n * is successfully opened, or that it already is opened.\n */ function launchWorkspaceGroup2(groupName, groupProps) {\n return _async_to_generator(function() {\n var openedGroup, okToCloseWorkspaces;\n return _ts_generator(this, function(_state) {\n switch(_state.label){\n case 0:\n openedGroup = _openmrs_esm_extensions__rspack_import_2.workspace2Store.getState().openedGroup;\n if (!openedGroup) return [\n 3,\n 3\n ];\n if (!(openedGroup.groupName !== groupName || !arePropsCompatible(openedGroup.props, groupProps))) return [\n 3,\n 2\n ];\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WORKSPACE_GROUP',\n explicit: false\n })\n ];\n case 1:\n okToCloseWorkspaces = _state.sent();\n if (!okToCloseWorkspaces) {\n return [\n 2,\n false\n ];\n }\n return [\n 3,\n 3\n ];\n case 2:\n // no-op, group with group props is already opened\n return [\n 2,\n true\n ];\n case 3:\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n openedGroup: {\n groupName: groupName,\n props: groupProps\n },\n openedWindows: []\n });\n });\n return [\n 2,\n true\n ];\n }\n });\n })();\n}\n/**\n * Closes the workspace group that is currently opened. Note that only one workspace group\n * may be opened at any given time\n * @param discardUnsavedChanges If true, then the workspace group is forced closed, with no prompt\n * for confirmation for unsaved changes in any opened workspace. This should be used sparingly\n * for clean-up purpose, ex: when exiting an app.\n * @returns a Promise that resolves to true if there is no opened group to begin with or we successfully closed\n * the opened group; false otherwise.\n */ function closeWorkspaceGroup2(discardUnsavedChanges) {\n return _async_to_generator(function() {\n var state, openedGroup, openedWindows, okToCloseWorkspaces, _tmp;\n return _ts_generator(this, function(_state) {\n switch(_state.label){\n case 0:\n state = _openmrs_esm_extensions__rspack_import_2.workspace2Store.getState();\n openedGroup = state.openedGroup, openedWindows = state.openedWindows;\n if (!openedGroup) return [\n 3,\n 4\n ];\n if (!(openedWindows.length > 0)) return [\n 3,\n 3\n ];\n _tmp = discardUnsavedChanges;\n if (_tmp) return [\n 3,\n 2\n ];\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WORKSPACE_GROUP',\n explicit: true\n })\n ];\n case 1:\n _tmp = _state.sent();\n _state.label = 2;\n case 2:\n okToCloseWorkspaces = _tmp;\n if (!okToCloseWorkspaces) {\n return [\n 2,\n false\n ];\n }\n _state.label = 3;\n case 3:\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n openedGroup: null,\n openedWindows: []\n });\n });\n return [\n 2,\n true\n ];\n case 4:\n // no openedGroup with begin with, return true\n return [\n 2,\n true\n ];\n }\n });\n })();\n}\n/**\n * Attempts to launch the specified workspace with the given workspace props. This also implicitly opens\n * the workspace window to which the workspace belongs (if it's not opened already),\n * and the workspace group to which the window belongs (if it's not opened already).\n *\n * When calling `launchWorkspace2`, we need to also pass in the workspace props. While not required,\n * we can also pass in the window props (shared by other workspaces in the window) and the group props\n * (shared by all windows and their workspaces). Omitting the window props or the group props[^1] means the caller\n * explicitly does not care what the current window props and group props are, and that they may be set\n * by other actions (like calling `launchWorkspace2` on a different workspace with those props passed in)\n * at a later time.\n *\n * If there is already an opened workspace group, and it's not the group the workspace belongs to\n * or has incompatible[^2] group props, then we prompt the user to close the group (and its windows and their workspaces).\n * On user confirm, the existing opened group is closed and the new workspace, along with its window and its group,\n * is opened.\n *\n * If the window is already opened, but with incompatible window props, we prompt the user to close\n * the window (and all its opened workspaces), and reopen the window with (only) the newly requested workspace.\n *\n * If the workspace is already opened, but with incompatible workspace props, we also prompt the user to close\n * the **window** (and all its opened workspaces), and reopen the window with (only) the newly requested workspace.\n * This is true regardless of whether the already opened workspace has any child workspaces.\n *\n * Note that calling this function *never* results in creating a child workspace in the affected window.\n * To do so, we need to call `launchChildWorkspace` instead.\n *\n * [^1] Omitting window or group props is useful for workspaces that don't have ties to the window or group \"context\" (props).\n * For example, in the patient chart, the visit notes / clinical forms / order basket action menu button all share\n * a \"group context\" of the current visit. However, the \"patient list\" action menu button does not need to share that group\n * context, so opening that workspace should not need to cause other workspaces / windows / groups to potentially close.\n * The \"patient search\" workspace in the queues and ward apps is another example.\n *\n * [^2] 2 sets of props are compatible if either one is nullish, or if they are shallow equal.\n */ function launchWorkspace2(workspaceName) {\n var workspaceProps = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null, windowProps = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : null, groupProps = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : null;\n return _async_to_generator(function() {\n var storeState, windowDef, openedGroup, windowName, groupDef, openedWindowIndex, isWindowAlreadyOpened, okToCloseWorkspaces, _ref, _storeState_openedGroup, openedWindow, groupProps1, isMostRecentlyOpenedWindowHidden, openedWorkspaces, openedWorkspace, okToCloseWorkspaces1, _ref1, _ref2, _storeState_openedGroup1, okToCloseWorkspaces2, _storeState_openedGroup2, okToCloseWorkspaces3, _ref3, _storeState_openedGroup3, _ref4, _storeState_openedGroup4;\n return _ts_generator(this, function(_state) {\n switch(_state.label){\n case 0:\n storeState = _openmrs_esm_extensions__rspack_import_2.workspace2Store.getState();\n if (!storeState.registeredWorkspacesByName[workspaceName]) {\n throw new Error(\"Unable to launch workspace \".concat(workspaceName, \". Workspace is not registered\"));\n }\n windowDef = (0,_openmrs_esm_extensions__rspack_import_2.getWindowByWorkspaceName)(workspaceName);\n if (!windowDef) {\n throw new Error(\"Unable to launch workspace \".concat(workspaceName, \". Workspace is not registered to a workspace window\"));\n }\n openedGroup = storeState.openedGroup;\n windowName = windowDef.name;\n groupDef = (0,_openmrs_esm_extensions__rspack_import_2.getGroupByWindowName)(windowName);\n if (!groupDef) {\n throw new Error(\"Unable to launch workspace \".concat(workspaceName, \". Workspace window \").concat(windowDef.name, \" is not registered to a workspace group\"));\n }\n openedWindowIndex = (0,_openmrs_esm_extensions__rspack_import_2.getOpenedWindowIndexByWorkspace)(workspaceName);\n isWindowAlreadyOpened = openedWindowIndex >= 0;\n if (!(openedGroup && (openedGroup.groupName !== groupDef.name || !arePropsCompatible(openedGroup.props, groupProps)))) return [\n 3,\n 2\n ];\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WORKSPACE_GROUP',\n explicit: true\n })\n ];\n case 1:\n okToCloseWorkspaces = _state.sent();\n if (okToCloseWorkspaces) {\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: groupProps\n },\n openedWindows: [\n // discard all opened windows, open a new one with the requested workspace\n // most recently opened action appended to the end\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: windowProps,\n maximized: false\n }\n ],\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n } else {\n return [\n 2,\n false\n ];\n }\n return [\n 3,\n 12\n ];\n case 2:\n if (!isWindowAlreadyOpened) return [\n 3,\n 9\n ];\n openedWindow = storeState.openedWindows[openedWindowIndex];\n groupProps1 = (_ref = (_storeState_openedGroup = storeState.openedGroup) === null || _storeState_openedGroup === void 0 ? void 0 : _storeState_openedGroup.props) !== null && _ref !== void 0 ? _ref : {};\n isMostRecentlyOpenedWindowHidden = storeState.isMostRecentlyOpenedWindowHidden;\n openedWorkspaces = openedWindow.openedWorkspaces;\n if (!arePropsCompatible(openedWindow.props, windowProps)) return [\n 3,\n 6\n ];\n // this case is tricky, this results in restoring the window if:\n // 1. the workspace is opened (but not necessarily as a leaf workspace)\n // 2. the props of the opened workspace is same as workspace props (from the function input)\n //\n // Otherwise, we close all workspaces in this window, and open this newly requested one\n openedWorkspace = openedWorkspaces.find(function(w) {\n return w.workspaceName === workspaceName;\n });\n if (!(openedWorkspace && arePropsCompatible(openedWorkspace.props, workspaceProps))) return [\n 3,\n 3\n ];\n // restore the window if it is hidden or not the most recently opened one\n if (isMostRecentlyOpenedWindowHidden || openedWindowIndex !== storeState.openedWindows.length - 1) {\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(workspace2StoreActions.restoreWindow(storeState, windowName));\n }\n return [\n 2,\n true\n ];\n case 3:\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WORKSPACE',\n explicit: false,\n windowName: windowName,\n workspaceName: workspaceName\n })\n ];\n case 4:\n okToCloseWorkspaces1 = _state.sent();\n if (okToCloseWorkspaces1) {\n ;\n ;\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: (_ref1 = storeState === null || storeState === void 0 ? void 0 : (_storeState_openedGroup1 = storeState.openedGroup) === null || _storeState_openedGroup1 === void 0 ? void 0 : _storeState_openedGroup1.props) !== null && _ref1 !== void 0 ? _ref1 : groupProps1\n },\n openedWindows: _to_consumable_array(storeState.openedWindows.filter(function(_, i) {\n return i !== openedWindowIndex;\n })).concat([\n // most recently opened workspace at the end of the array\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: (_ref2 = openedWindow === null || openedWindow === void 0 ? void 0 : openedWindow.props) !== null && _ref2 !== void 0 ? _ref2 : windowProps,\n maximized: false\n }\n ]),\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n } else {\n return [\n 2,\n false\n ];\n }\n _state.label = 5;\n case 5:\n return [\n 3,\n 8\n ];\n case 6:\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_WINDOW',\n explicit: false,\n windowName: windowName\n })\n ];\n case 7:\n okToCloseWorkspaces2 = _state.sent();\n if (okToCloseWorkspaces2) {\n ;\n // discard the openedWindows element at openedWindowIndex\n // and create a new one with the requested workspace opened\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: groupProps1 !== null && groupProps1 !== void 0 ? groupProps1 : storeState === null || storeState === void 0 ? void 0 : (_storeState_openedGroup2 = storeState.openedGroup) === null || _storeState_openedGroup2 === void 0 ? void 0 : _storeState_openedGroup2.props\n },\n openedWindows: _to_consumable_array(storeState.openedWindows.filter(function(_, i) {\n return i !== openedWindowIndex;\n })).concat([\n // most recently opened workspace at the end of the array\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: windowProps,\n maximized: false\n }\n ]),\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n } else {\n return [\n 2,\n false\n ];\n }\n _state.label = 8;\n case 8:\n return [\n 3,\n 12\n ];\n case 9:\n if (!(groupDef.persistence == 'closable')) return [\n 3,\n 11\n ];\n return [\n 4,\n promptForClosingWorkspaces({\n reason: 'CLOSE_OTHER_WINDOWS',\n explicit: false,\n windowNameToSpare: windowDef.name\n })\n ];\n case 10:\n okToCloseWorkspaces3 = _state.sent();\n if (okToCloseWorkspaces3) {\n ;\n ;\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: (_ref3 = groupProps !== null && groupProps !== void 0 ? groupProps : storeState === null || storeState === void 0 ? void 0 : (_storeState_openedGroup3 = storeState.openedGroup) === null || _storeState_openedGroup3 === void 0 ? void 0 : _storeState_openedGroup3.props) !== null && _ref3 !== void 0 ? _ref3 : null\n },\n openedWindows: [\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: windowProps,\n maximized: false\n }\n ],\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n } else {\n return [\n 2,\n false\n ];\n }\n return [\n 3,\n 12\n ];\n case 11:\n _openmrs_esm_extensions__rspack_import_2.workspace2Store.setState(_object_spread_props(_object_spread({}, storeState), {\n openedGroup: {\n groupName: groupDef.name,\n props: (_ref4 = groupProps !== null && groupProps !== void 0 ? groupProps : storeState === null || storeState === void 0 ? void 0 : (_storeState_openedGroup4 = storeState.openedGroup) === null || _storeState_openedGroup4 === void 0 ? void 0 : _storeState_openedGroup4.props) !== null && _ref4 !== void 0 ? _ref4 : null\n },\n openedWindows: _to_consumable_array(storeState.openedWindows).concat([\n // most recently opened workspace at the end of the array\n {\n windowName: windowName,\n openedWorkspaces: [\n newOpenedWorkspace(workspaceName, workspaceProps)\n ],\n props: windowProps,\n maximized: false\n }\n ]),\n isMostRecentlyOpenedWindowHidden: false\n }));\n return [\n 2,\n true\n ];\n case 12:\n return [\n 2\n ];\n }\n });\n })();\n}\n/**\n * When we launch a workspace, we may pass in workspace / windows / group props. If the workspace or\n * window or group is currently opened, we have to check whether the current props are compatible with\n * the passed in props. 2 props A and B are compatible if:\n * either one is nullish (because this indicates that the caller does not care about prop incompatibility)\n * neither is nullish, and A and B are shallow equal.\n * @param a props\n * @param b props\n * @returns whether props a and b are compatible\n */ function arePropsCompatible(a, b) {\n if (a == null || b == null) {\n return true;\n }\n return (0,_openmrs_esm_utils__rspack_import_5.shallowEqual)(a, b);\n}\n/**\n * A user can perform actions that explicitly result in closing workspaces\n * (such that clicking the 'X' button for the workspace or workspace group), or\n * implicitly (by opening a workspace with different props than the one that is already opened).\n * Calls to closeWorkspace2() or closeWorkspaceGroup2() are considered explicit, while calls\n * to launchWorkspace2() or launchWorkspaceGroup2() are considered implicit.\n *\n * This function prompts the user for confirmation to close workspaces with a modal dialog.\n * When the closing is explicit, it prompts for confirmation for affected workspaces with unsaved changes.\n * When the closing is implicit, it prompts for confirmation for all affected workspaces, regardless of\n * whether they have unsaved changes.\n * @param promptReason\n * @returns a Promise that resolves to true if the user confirmed closing the workspaces; false otherwise.\n */ function promptForClosingWorkspaces(promptReason) {\n // if onlyUpToThisWorkspace is provided, we will only loop till we hit that workspace\n function getAffectedWorkspacesInWindow(openedWindow, onlyUpToThisWorkspace) {\n var ret = [];\n for(var i = openedWindow.openedWorkspaces.length - 1; i >= 0; i--){\n var openedWorkspace = openedWindow.openedWorkspaces[i];\n if (openedWorkspace.hasUnsavedChanges) {\n ret.push(openedWorkspace);\n }\n if (onlyUpToThisWorkspace && openedWorkspace.workspaceName === onlyUpToThisWorkspace) {\n break;\n }\n }\n return ret;\n }\n var _workspace2Store_getState = _openmrs_esm_extensions__rspack_import_2.workspace2Store.getState(), openedWindows = _workspace2Store_getState.openedWindows, workspaceTitleByWorkspaceName = _workspace2Store_getState.workspaceTitleByWorkspaceName;\n var affectedWorkspaces = [];\n switch(promptReason.reason){\n case 'CLOSE_WORKSPACE_GROUP':\n {\n affectedWorkspaces = openedWindows.flatMap(function(window) {\n return getAffectedWorkspacesInWindow(window);\n });\n break;\n }\n case 'CLOSE_WINDOW':\n {\n var openedWindow = openedWindows.find(function(window) {\n return window.windowName === promptReason.windowName;\n });\n if (!openedWindow) {\n throw new Error(\"Window \".concat(promptReason.windowName, \" not found in opened windows.\"));\n }\n affectedWorkspaces = getAffectedWorkspacesInWindow(openedWindow);\n break;\n }\n case 'CLOSE_WORKSPACE':\n {\n var openedWindow1 = openedWindows.find(function(window) {\n return window.windowName === promptReason.windowName;\n });\n if (!openedWindow1) {\n throw new Error(\"Window \".concat(promptReason.windowName, \" not found in opened windows.\"));\n }\n affectedWorkspaces = getAffectedWorkspacesInWindow(openedWindow1, promptReason.workspaceName);\n break;\n }\n case 'CLOSE_OTHER_WINDOWS':\n {\n var windowsToClose = openedWindows.filter(function(window) {\n return window.windowName !== promptReason.windowNameToSpare;\n });\n affectedWorkspaces = windowsToClose.flatMap(function(w) {\n return getAffectedWorkspacesInWindow(w);\n });\n break;\n }\n }\n if (affectedWorkspaces.length === 0) {\n return Promise.resolve(true); // no unsaved changes, no need to prompt\n }\n return new Promise(function(resolve) {\n var dispose = (0,_modals_index_js__rspack_import_4.showModal)('workspace2-close-prompt', {\n size: 'sm',\n onConfirm: function onConfirm() {\n dispose();\n resolve(true);\n },\n onCancel: function onCancel() {\n dispose();\n resolve(false);\n },\n affectedWorkspaceTitles: affectedWorkspaces.map(function(workspace) {\n return workspaceTitleByWorkspaceName[workspace.workspaceName];\n })\n });\n });\n}\nvar workspace2StoreActions = {\n setWindowMaximized: function setWindowMaximized(state, windowName, maximized) {\n var openedWindowIndex = state.openedWindows.findIndex(function(a) {\n return a.windowName === windowName;\n });\n var openedWindows = _to_consumable_array(state.openedWindows);\n var currentWindow = _object_spread_props(_object_spread({}, openedWindows[openedWindowIndex]), {\n maximized: maximized\n });\n openedWindows[openedWindowIndex] = currentWindow;\n return _object_spread_props(_object_spread({}, state), {\n openedWindows: openedWindows\n });\n },\n // hides the most recently opened window (all other opened windows are implicitly hidden)\n hideWindow: function hideWindow(state) {\n return _object_spread_props(_object_spread({}, state), {\n isMostRecentlyOpenedWindowHidden: true\n });\n },\n restoreWindow: function restoreWindow(state, windowName) {\n var openedWindowIndex = state.openedWindows.findIndex(function(a) {\n return a.windowName === windowName;\n });\n var currentWindow = state.openedWindows[openedWindowIndex];\n var openedWindows = _to_consumable_array(state.openedWindows.filter(function(_, i) {\n return i !== openedWindowIndex;\n })).concat([\n currentWindow\n ]);\n return _object_spread_props(_object_spread({}, state), {\n openedWindows: openedWindows,\n isMostRecentlyOpenedWindowHidden: false\n });\n },\n closeWorkspace: function closeWorkspace(state, workspaceName) {\n var openedWindowIndex = (0,_openmrs_esm_extensions__rspack_import_2.getOpenedWindowIndexByWorkspace)(workspaceName);\n if (openedWindowIndex < 0) {\n return state; // no-op if the window does not exist\n }\n var window = _object_spread({}, state.openedWindows[openedWindowIndex]);\n var workspaceIndex = window.openedWorkspaces.findIndex(function(w) {\n return w.workspaceName === workspaceName;\n });\n var openedWindows = _to_consumable_array(state.openedWindows);\n // close all children of the input workspace as well\n window.openedWorkspaces = window.openedWorkspaces.slice(0, workspaceIndex);\n var hidden = state.isMostRecentlyOpenedWindowHidden;\n if (window.openedWorkspaces.length === 0) {\n var wasMostRecentWindow = openedWindowIndex === state.openedWindows.length - 1;\n // if no workspaces left, remove the window\n openedWindows.splice(openedWindowIndex, 1);\n // If we removed the most recent window and there are still windows left,\n // the new most recent window should be shown\n if (wasMostRecentWindow && openedWindows.length > 0) {\n hidden = false;\n }\n } else {\n // if there are still workspaces left, just update the window\n openedWindows[openedWindowIndex] = window;\n }\n return _object_spread_props(_object_spread({}, state), {\n openedWindows: openedWindows,\n isMostRecentlyOpenedWindowHidden: hidden\n });\n },\n openChildWorkspace: function openChildWorkspace(state, parentWorkspaceName, childWorkspaceName, childWorkspaceProps) {\n var childWorkspaceDef = state.registeredWorkspacesByName[childWorkspaceName];\n if (!childWorkspaceDef) {\n throw new Error('No workspace named \"'.concat(childWorkspaceName, '\" registered'));\n }\n var parentWorkspaceDef = state.registeredWorkspacesByName[parentWorkspaceName];\n if (!parentWorkspaceDef) {\n throw new Error('No workspace named \"'.concat(parentWorkspaceName, '\" registered'));\n }\n if (parentWorkspaceDef.window !== childWorkspaceDef.window) {\n throw new Error(\"Child workspace \".concat(childWorkspaceName, \" does not belong to the same workspace window as parent workspace \").concat(parentWorkspaceName));\n }\n // as the request workspace should be a child workspace, the corresponding window\n // to contain the workspace should already be opened\n var openedWindowIndex = state.openedWindows.findIndex(function(window) {\n return window.windowName === childWorkspaceDef.window;\n });\n if (openedWindowIndex == -1) {\n throw new Error(\"Cannot open child workspace \".concat(childWorkspaceName, \" as window \").concat(childWorkspaceDef.window, \" is not opened\"));\n }\n var openedWindow = state.openedWindows[openedWindowIndex];\n var openedWorkspaces = openedWindow.openedWorkspaces;\n var parentIndex = openedWorkspaces.findIndex(function(w) {\n return w.workspaceName === parentWorkspaceName;\n });\n if (parentIndex === -1) {\n throw new Error(\"Cannot open child workspace \".concat(childWorkspaceName, \" from parent workspace \").concat(parentWorkspaceName, \" as the parent is not opened within the workspace window\"));\n }\n // Close any workspaces above the parent (analogous to closeWorkspace's slice behavior)\n var trimmedWorkspaces = openedWorkspaces.slice(0, parentIndex + 1);\n return {\n openedWindows: state.openedWindows.map(function(w, i) {\n if (i == openedWindowIndex) {\n return _object_spread_props(_object_spread({}, w), {\n openedWorkspaces: _to_consumable_array(trimmedWorkspaces).concat([\n newOpenedWorkspace(childWorkspaceName, childWorkspaceProps)\n ])\n });\n } else {\n return w;\n }\n })\n };\n },\n setHasUnsavedChanges: function setHasUnsavedChanges(state, workspaceName, hasUnsavedChanges) {\n var openedWindowIndex = (0,_openmrs_esm_extensions__rspack_import_2.getOpenedWindowIndexByWorkspace)(workspaceName);\n if (openedWindowIndex < 0) {\n return state; // no-op if the window does not exist\n }\n var openedWindow = _object_spread({}, state.openedWindows[openedWindowIndex]);\n var workspaceIndex = openedWindow.openedWorkspaces.findIndex(function(w) {\n return w.workspaceName === workspaceName;\n });\n if (workspaceIndex < 0) {\n return state; // no-op if the workspace is not found\n }\n openedWindow.openedWorkspaces[workspaceIndex] = _object_spread_props(_object_spread({}, openedWindow.openedWorkspaces[workspaceIndex]), {\n hasUnsavedChanges: hasUnsavedChanges\n });\n var openedWindows = _to_consumable_array(state.openedWindows);\n openedWindows[openedWindowIndex] = openedWindow;\n return _object_spread_props(_object_spread({}, state), {\n openedWindows: openedWindows\n });\n },\n setWorkspaceTitle: function setWorkspaceTitle(state, workspaceName, title) {\n var newWorkspaceTitleByWorkspaceName = _object_spread({}, state.workspaceTitleByWorkspaceName);\n if (title === null) {\n delete newWorkspaceTitleByWorkspaceName[workspaceName];\n } else {\n newWorkspaceTitleByWorkspaceName[workspaceName] = title;\n }\n return _object_spread_props(_object_spread({}, state), {\n workspaceTitleByWorkspaceName: newWorkspaceTitleByWorkspaceName\n });\n }\n};\nfunction useWorkspace2Store() {\n return (0,_openmrs_esm_react_utils__rspack_import_3.useStoreWithActions)(_openmrs_esm_extensions__rspack_import_2.workspace2Store, workspace2StoreActions);\n}\n/**\n * Returns the react Context containing props passed into a workspace.\n * This hook MUST be called inside a child of <Workspace2>\n */ var useWorkspace2Context = function useWorkspace2Context() {\n return (0,react__rspack_import_0.useContext)(single_spa_react__rspack_import_1.SingleSpaContext);\n};\n/**\n * @returns a list of registered workspaces.\n */ var getRegisteredWorkspace2Names = function getRegisteredWorkspace2Names() {\n return Object.keys(_openmrs_esm_extensions__rspack_import_2.workspace2Store.getState().registeredWorkspacesByName);\n};\nfunction newOpenedWorkspace(workspaceName, workspaceProps) {\n return {\n workspaceName: workspaceName,\n props: workspaceProps !== null && workspaceProps !== void 0 ? workspaceProps : {},\n hasUnsavedChanges: false,\n uuid: (0,uuid__rspack_import_6[\"default\"])()\n };\n}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLXN0eWxlZ3VpZGUvZGlzdC93b3Jrc3BhY2VzMi93b3Jrc3BhY2UyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQG9wZW5tcnMvZXNtLWFwcC1zaGVsbC8uLi8uLi9mcmFtZXdvcmsvZXNtLXN0eWxlZ3VpZGUvZGlzdC93b3Jrc3BhY2VzMi93b3Jrc3BhY2UyLmpzPzhjYjUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU2luZ2xlU3BhQ29udGV4dCB9IGZyb20gXCJzaW5nbGUtc3BhLXJlYWN0XCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkVjQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgZ2V0R3JvdXBCeVdpbmRvd05hbWUsIGdldE9wZW5lZFdpbmRvd0luZGV4QnlXb3Jrc3BhY2UsIGdldFdpbmRvd0J5V29ya3NwYWNlTmFtZSwgd29ya3NwYWNlMlN0b3JlIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1leHRlbnNpb25zXCI7XG5pbXBvcnQgeyB1c2VTdG9yZVdpdGhBY3Rpb25zIH0gZnJvbSBcIkBvcGVubXJzL2VzbS1yZWFjdC11dGlsc1wiO1xuaW1wb3J0IHsgc2hhbGxvd0VxdWFsIH0gZnJvbSBcIkBvcGVubXJzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgc2hvd01vZGFsIH0gZnJvbSBcIi4uL21vZGFscy9pbmRleC5qc1wiO1xuLyoqXG4gKiBBdHRlbXB0cyB0byBsYXVuY2ggdGhlIHNwZWNpZmllZCB3b3Jrc3BhY2UgZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gZ3JvdXAgcHJvcHMuIE5vdGUgdGhhdCBvbmx5IG9uZSB3b3Jrc3BhY2UgZ3JvdXBcbiAqIG1heSBiZSBvcGVuZWQgYXQgYW55IGdpdmVuIHRpbWUuIElmIGEgd29ya3NwYWNlIGdyb3VwIGlzIGFscmVhZHkgb3BlbmVkLCBjYWxsaW5nIGBsYXVuY2hXb3Jrc3BhY2VHcm91cDJgIHdpdGhcbiAqIGVpdGhlciBhIGRpZmZlcmVudCBncm91cCBuYW1lLCBvciBzYW1lIGdyb3VwIG5hbWUgYnV0IGRpZmZlcmVudCBpbmNvbXBhdGlibGUgcHJvcHMqKiwgd2lsbCByZXN1bHQgaW4gcHJvbXB0aW5nIHRvXG4gKiBjb25maXJtIGNsb3Npbmcgd29ya3NwYWNlcy4gSWYgdGhlIHVzZXIgY29uZmlybXMsIHRoZSBvcGVuZWQgZ3JvdXAsIGFsb25nIHdpdGggaXRzIHdpbmRvd3MgKGFuZCB0aGVpciB3b3Jrc3BhY2VzKSwgaXMgY2xvc2VkLCBhbmRcbiAqIHRoZSByZXF1ZXN0ZWQgZ3JvdXAgaXMgaW1tZWRpYXRlbHkgb3BlbmVkLlxuICpcbiAqICoqIDIgc2V0cyBvZiBwcm9wcyBhcmUgY29tcGF0aWJsZSBpZiBlaXRoZXIgb25lIGlzIG51bGxpc2gsIG9yIGlmIHRoZXkgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKiBAcGFyYW0gZ3JvdXBOYW1lXG4gKiBAcGFyYW0gZ3JvdXBQcm9wc1xuICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHdvcmtzcGFjZSBncm91cCB3aXRoIHRoZSBzcGVjaWZpZWQgZ3JvdXAgcHJvcHNcbiAqICBpcyBzdWNjZXNzZnVsbHkgb3BlbmVkLCBvciB0aGF0IGl0IGFscmVhZHkgaXMgb3BlbmVkLlxuICovIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hXb3Jrc3BhY2VHcm91cDIoZ3JvdXBOYW1lLCBncm91cFByb3BzKSB7XG4gICAgY29uc3QgeyBvcGVuZWRHcm91cCB9ID0gd29ya3NwYWNlMlN0b3JlLmdldFN0YXRlKCk7XG4gICAgaWYgKG9wZW5lZEdyb3VwKSB7XG4gICAgICAgIGlmIChvcGVuZWRHcm91cC5ncm91cE5hbWUgIT09IGdyb3VwTmFtZSB8fCAhYXJlUHJvcHNDb21wYXRpYmxlKG9wZW5lZEdyb3VwLnByb3BzLCBncm91cFByb3BzKSkge1xuICAgICAgICAgICAgY29uc3Qgb2tUb0Nsb3NlV29ya3NwYWNlcyA9IGF3YWl0IHByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzKHtcbiAgICAgICAgICAgICAgICByZWFzb246ICdDTE9TRV9XT1JLU1BBQ0VfR1JPVVAnLFxuICAgICAgICAgICAgICAgIGV4cGxpY2l0OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIW9rVG9DbG9zZVdvcmtzcGFjZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UsIHByb2NlZWQgdG8gb3BlbiB0aGUgbmV3IGdyb3VwIHdpdGggbm8gb3BlbmVkV2luZG93c1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8tb3AsIGdyb3VwIHdpdGggZ3JvdXAgcHJvcHMgaXMgYWxyZWFkeSBvcGVuZWRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBvcGVuZWRHcm91cDoge1xuICAgICAgICAgICAgICAgIGdyb3VwTmFtZSxcbiAgICAgICAgICAgICAgICBwcm9wczogZ3JvdXBQcm9wc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wZW5lZFdpbmRvd3M6IFtdXG4gICAgICAgIH0pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogQ2xvc2VzIHRoZSB3b3Jrc3BhY2UgZ3JvdXAgdGhhdCBpcyBjdXJyZW50bHkgb3BlbmVkLiBOb3RlIHRoYXQgb25seSBvbmUgd29ya3NwYWNlIGdyb3VwXG4gKiBtYXkgYmUgb3BlbmVkIGF0IGFueSBnaXZlbiB0aW1lXG4gKiBAcGFyYW0gZGlzY2FyZFVuc2F2ZWRDaGFuZ2VzIElmIHRydWUsIHRoZW4gdGhlIHdvcmtzcGFjZSBncm91cCBpcyBmb3JjZWQgY2xvc2VkLCB3aXRoIG5vIHByb21wdFxuICogZm9yIGNvbmZpcm1hdGlvbiBmb3IgdW5zYXZlZCBjaGFuZ2VzIGluIGFueSBvcGVuZWQgd29ya3NwYWNlLiBUaGlzIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseVxuICogZm9yIGNsZWFuLXVwIHB1cnBvc2UsIGV4OiB3aGVuIGV4aXRpbmcgYW4gYXBwLlxuICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBubyBvcGVuZWQgZ3JvdXAgdG8gYmVnaW4gd2l0aCBvciB3ZSBzdWNjZXNzZnVsbHkgY2xvc2VkXG4gKiB0aGUgb3BlbmVkIGdyb3VwOyBmYWxzZSBvdGhlcndpc2UuXG4gKi8gZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlV29ya3NwYWNlR3JvdXAyKGRpc2NhcmRVbnNhdmVkQ2hhbmdlcykge1xuICAgIGNvbnN0IHN0YXRlID0gd29ya3NwYWNlMlN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgeyBvcGVuZWRHcm91cCwgb3BlbmVkV2luZG93cyB9ID0gc3RhdGU7XG4gICAgaWYgKG9wZW5lZEdyb3VwKSB7XG4gICAgICAgIGlmIChvcGVuZWRXaW5kb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG9rVG9DbG9zZVdvcmtzcGFjZXMgPSBkaXNjYXJkVW5zYXZlZENoYW5nZXMgfHwgYXdhaXQgcHJvbXB0Rm9yQ2xvc2luZ1dvcmtzcGFjZXMoe1xuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0NMT1NFX1dPUktTUEFDRV9HUk9VUCcsXG4gICAgICAgICAgICAgICAgZXhwbGljaXQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFva1RvQ2xvc2VXb3Jrc3BhY2VzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgIG9wZW5lZEdyb3VwOiBudWxsLFxuICAgICAgICAgICAgICAgIG9wZW5lZFdpbmRvd3M6IFtdXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBubyBvcGVuZWRHcm91cCB3aXRoIGJlZ2luIHdpdGgsIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGxhdW5jaCB0aGUgc3BlY2lmaWVkIHdvcmtzcGFjZSB3aXRoIHRoZSBnaXZlbiB3b3Jrc3BhY2UgcHJvcHMuIFRoaXMgYWxzbyBpbXBsaWNpdGx5IG9wZW5zXG4gKiB0aGUgd29ya3NwYWNlIHdpbmRvdyB0byB3aGljaCB0aGUgd29ya3NwYWNlIGJlbG9uZ3MgKGlmIGl0J3Mgbm90IG9wZW5lZCBhbHJlYWR5KSxcbiAqIGFuZCB0aGUgd29ya3NwYWNlIGdyb3VwIHRvIHdoaWNoIHRoZSB3aW5kb3cgYmVsb25ncyAoaWYgaXQncyBub3Qgb3BlbmVkIGFscmVhZHkpLlxuICpcbiAqIFdoZW4gY2FsbGluZyBgbGF1bmNoV29ya3NwYWNlMmAsIHdlIG5lZWQgdG8gYWxzbyBwYXNzIGluIHRoZSB3b3Jrc3BhY2UgcHJvcHMuIFdoaWxlIG5vdCByZXF1aXJlZCxcbiAqIHdlIGNhbiBhbHNvIHBhc3MgaW4gdGhlIHdpbmRvdyBwcm9wcyAoc2hhcmVkIGJ5IG90aGVyIHdvcmtzcGFjZXMgaW4gdGhlIHdpbmRvdykgYW5kIHRoZSBncm91cCBwcm9wc1xuICogKHNoYXJlZCBieSBhbGwgd2luZG93cyBhbmQgdGhlaXIgd29ya3NwYWNlcykuIE9taXR0aW5nIHRoZSB3aW5kb3cgcHJvcHMgb3IgdGhlIGdyb3VwIHByb3BzW14xXSBtZWFucyB0aGUgY2FsbGVyXG4gKiBleHBsaWNpdGx5IGRvZXMgbm90IGNhcmUgd2hhdCB0aGUgY3VycmVudCB3aW5kb3cgcHJvcHMgYW5kIGdyb3VwIHByb3BzIGFyZSwgYW5kIHRoYXQgdGhleSBtYXkgYmUgc2V0XG4gKiBieSBvdGhlciBhY3Rpb25zIChsaWtlIGNhbGxpbmcgYGxhdW5jaFdvcmtzcGFjZTJgIG9uIGEgZGlmZmVyZW50IHdvcmtzcGFjZSB3aXRoIHRob3NlIHByb3BzIHBhc3NlZCBpbilcbiAqIGF0IGEgbGF0ZXIgdGltZS5cbiAqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIG9wZW5lZCB3b3Jrc3BhY2UgZ3JvdXAsIGFuZCBpdCdzIG5vdCB0aGUgZ3JvdXAgdGhlIHdvcmtzcGFjZSBiZWxvbmdzIHRvXG4gKiBvciBoYXMgaW5jb21wYXRpYmxlW14yXSBncm91cCBwcm9wcywgdGhlbiB3ZSBwcm9tcHQgdGhlIHVzZXIgdG8gY2xvc2UgdGhlIGdyb3VwIChhbmQgaXRzIHdpbmRvd3MgYW5kIHRoZWlyIHdvcmtzcGFjZXMpLlxuICogT24gdXNlciBjb25maXJtLCB0aGUgZXhpc3Rpbmcgb3BlbmVkIGdyb3VwIGlzIGNsb3NlZCBhbmQgdGhlIG5ldyB3b3Jrc3BhY2UsIGFsb25nIHdpdGggaXRzIHdpbmRvdyBhbmQgaXRzIGdyb3VwLFxuICogaXMgb3BlbmVkLlxuICpcbiAqIElmIHRoZSB3aW5kb3cgaXMgYWxyZWFkeSBvcGVuZWQsIGJ1dCB3aXRoIGluY29tcGF0aWJsZSB3aW5kb3cgcHJvcHMsIHdlIHByb21wdCB0aGUgdXNlciB0byBjbG9zZVxuICogdGhlIHdpbmRvdyAoYW5kIGFsbCBpdHMgb3BlbmVkIHdvcmtzcGFjZXMpLCBhbmQgcmVvcGVuIHRoZSB3aW5kb3cgd2l0aCAob25seSkgdGhlIG5ld2x5IHJlcXVlc3RlZCB3b3Jrc3BhY2UuXG4gKlxuICogSWYgdGhlIHdvcmtzcGFjZSBpcyBhbHJlYWR5IG9wZW5lZCwgYnV0IHdpdGggaW5jb21wYXRpYmxlIHdvcmtzcGFjZSBwcm9wcywgd2UgYWxzbyBwcm9tcHQgdGhlIHVzZXIgdG8gY2xvc2VcbiAqIHRoZSAqKndpbmRvdyoqIChhbmQgYWxsIGl0cyBvcGVuZWQgd29ya3NwYWNlcyksIGFuZCByZW9wZW4gdGhlIHdpbmRvdyB3aXRoIChvbmx5KSB0aGUgbmV3bHkgcmVxdWVzdGVkIHdvcmtzcGFjZS5cbiAqIFRoaXMgaXMgdHJ1ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGFscmVhZHkgb3BlbmVkIHdvcmtzcGFjZSBoYXMgYW55IGNoaWxkIHdvcmtzcGFjZXMuXG4gKlxuICogTm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAqbmV2ZXIqIHJlc3VsdHMgaW4gY3JlYXRpbmcgYSBjaGlsZCB3b3Jrc3BhY2UgaW4gdGhlIGFmZmVjdGVkIHdpbmRvdy5cbiAqIFRvIGRvIHNvLCB3ZSBuZWVkIHRvIGNhbGwgYGxhdW5jaENoaWxkV29ya3NwYWNlYCBpbnN0ZWFkLlxuICpcbiAqIFteMV0gT21pdHRpbmcgd2luZG93IG9yIGdyb3VwIHByb3BzIGlzIHVzZWZ1bCBmb3Igd29ya3NwYWNlcyB0aGF0IGRvbid0IGhhdmUgdGllcyB0byB0aGUgd2luZG93IG9yIGdyb3VwIFwiY29udGV4dFwiIChwcm9wcykuXG4gKiBGb3IgZXhhbXBsZSwgaW4gdGhlIHBhdGllbnQgY2hhcnQsIHRoZSB2aXNpdCBub3RlcyAvIGNsaW5pY2FsIGZvcm1zIC8gb3JkZXIgYmFza2V0IGFjdGlvbiBtZW51IGJ1dHRvbiBhbGwgc2hhcmVcbiAqIGEgXCJncm91cCBjb250ZXh0XCIgb2YgdGhlIGN1cnJlbnQgdmlzaXQuIEhvd2V2ZXIsIHRoZSBcInBhdGllbnQgbGlzdFwiIGFjdGlvbiBtZW51IGJ1dHRvbiBkb2VzIG5vdCBuZWVkIHRvIHNoYXJlIHRoYXQgZ3JvdXBcbiAqIGNvbnRleHQsIHNvIG9wZW5pbmcgdGhhdCB3b3Jrc3BhY2Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNhdXNlIG90aGVyIHdvcmtzcGFjZXMgLyB3aW5kb3dzIC8gZ3JvdXBzIHRvIHBvdGVudGlhbGx5IGNsb3NlLlxuICogVGhlIFwicGF0aWVudCBzZWFyY2hcIiB3b3Jrc3BhY2UgaW4gdGhlIHF1ZXVlcyBhbmQgd2FyZCBhcHBzIGlzIGFub3RoZXIgZXhhbXBsZS5cbiAqXG4gKiBbXjJdIDIgc2V0cyBvZiBwcm9wcyBhcmUgY29tcGF0aWJsZSBpZiBlaXRoZXIgb25lIGlzIG51bGxpc2gsIG9yIGlmIHRoZXkgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKi8gZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaFdvcmtzcGFjZTIod29ya3NwYWNlTmFtZSwgd29ya3NwYWNlUHJvcHMgPSBudWxsLCB3aW5kb3dQcm9wcyA9IG51bGwsIGdyb3VwUHJvcHMgPSBudWxsKSB7XG4gICAgY29uc3Qgc3RvcmVTdGF0ZSA9IHdvcmtzcGFjZTJTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGlmICghc3RvcmVTdGF0ZS5yZWdpc3RlcmVkV29ya3NwYWNlc0J5TmFtZVt3b3Jrc3BhY2VOYW1lXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsYXVuY2ggd29ya3NwYWNlICR7d29ya3NwYWNlTmFtZX0uIFdvcmtzcGFjZSBpcyBub3QgcmVnaXN0ZXJlZGApO1xuICAgIH1cbiAgICBjb25zdCB3aW5kb3dEZWYgPSBnZXRXaW5kb3dCeVdvcmtzcGFjZU5hbWUod29ya3NwYWNlTmFtZSk7XG4gICAgaWYgKCF3aW5kb3dEZWYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbGF1bmNoIHdvcmtzcGFjZSAke3dvcmtzcGFjZU5hbWV9LiBXb3Jrc3BhY2UgaXMgbm90IHJlZ2lzdGVyZWQgdG8gYSB3b3Jrc3BhY2Ugd2luZG93YCk7XG4gICAgfVxuICAgIGNvbnN0IHsgb3BlbmVkR3JvdXAgfSA9IHN0b3JlU3RhdGU7XG4gICAgY29uc3QgeyBuYW1lOiB3aW5kb3dOYW1lIH0gPSB3aW5kb3dEZWY7XG4gICAgY29uc3QgZ3JvdXBEZWYgPSBnZXRHcm91cEJ5V2luZG93TmFtZSh3aW5kb3dOYW1lKTtcbiAgICBpZiAoIWdyb3VwRGVmKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxhdW5jaCB3b3Jrc3BhY2UgJHt3b3Jrc3BhY2VOYW1lfS4gV29ya3NwYWNlIHdpbmRvdyAke3dpbmRvd0RlZi5uYW1lfSBpcyBub3QgcmVnaXN0ZXJlZCB0byBhIHdvcmtzcGFjZSBncm91cGApO1xuICAgIH1cbiAgICBjb25zdCBvcGVuZWRXaW5kb3dJbmRleCA9IGdldE9wZW5lZFdpbmRvd0luZGV4QnlXb3Jrc3BhY2Uod29ya3NwYWNlTmFtZSk7XG4gICAgY29uc3QgaXNXaW5kb3dBbHJlYWR5T3BlbmVkID0gb3BlbmVkV2luZG93SW5kZXggPj0gMDtcbiAgICAvLyBpZiBjdXJyZW50IG9wZW5lZCBncm91cCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZCBncm91cCwgb3IgaWYgdGhlIGdyb3VwIHByb3BzIGFyZSBkaWZmZXJlbnQsIHRoZW4gcHJvbXB0IGZvciB1bnNhdmVkIGNoYW5nZXNcbiAgICBpZiAob3BlbmVkR3JvdXAgJiYgKG9wZW5lZEdyb3VwLmdyb3VwTmFtZSAhPT0gZ3JvdXBEZWYubmFtZSB8fCAhYXJlUHJvcHNDb21wYXRpYmxlKG9wZW5lZEdyb3VwLnByb3BzLCBncm91cFByb3BzKSkpIHtcbiAgICAgICAgY29uc3Qgb2tUb0Nsb3NlV29ya3NwYWNlcyA9IGF3YWl0IHByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzKHtcbiAgICAgICAgICAgIHJlYXNvbjogJ0NMT1NFX1dPUktTUEFDRV9HUk9VUCcsXG4gICAgICAgICAgICBleHBsaWNpdDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9rVG9DbG9zZVdvcmtzcGFjZXMpIHtcbiAgICAgICAgICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4uc3RvcmVTdGF0ZSxcbiAgICAgICAgICAgICAgICBvcGVuZWRHcm91cDoge1xuICAgICAgICAgICAgICAgICAgICBncm91cE5hbWU6IGdyb3VwRGVmLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBncm91cFByb3BzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcGVuZWRXaW5kb3dzOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpc2NhcmQgYWxsIG9wZW5lZCB3aW5kb3dzLCBvcGVuIGEgbmV3IG9uZSB3aXRoIHRoZSByZXF1ZXN0ZWQgd29ya3NwYWNlXG4gICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50bHkgb3BlbmVkIGFjdGlvbiBhcHBlbmRlZCB0byB0aGUgZW5kXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd05hbWU6IHdpbmRvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWRXb3Jrc3BhY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3BlbmVkV29ya3NwYWNlKHdvcmtzcGFjZU5hbWUsIHdvcmtzcGFjZVByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiB3aW5kb3dQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltaXplZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1dpbmRvd0FscmVhZHlPcGVuZWQpIHtcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93ID0gc3RvcmVTdGF0ZS5vcGVuZWRXaW5kb3dzW29wZW5lZFdpbmRvd0luZGV4XTtcbiAgICAgICAgY29uc3QgZ3JvdXBQcm9wcyA9IHN0b3JlU3RhdGUub3BlbmVkR3JvdXA/LnByb3BzID8/IHt9O1xuICAgICAgICBjb25zdCBpc01vc3RSZWNlbnRseU9wZW5lZFdpbmRvd0hpZGRlbiA9IHN0b3JlU3RhdGUuaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW47XG4gICAgICAgIGNvbnN0IHsgb3BlbmVkV29ya3NwYWNlcyB9ID0gb3BlbmVkV2luZG93O1xuICAgICAgICBpZiAoYXJlUHJvcHNDb21wYXRpYmxlKG9wZW5lZFdpbmRvdy5wcm9wcywgd2luZG93UHJvcHMpKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGNhc2UgaXMgdHJpY2t5LCB0aGlzIHJlc3VsdHMgaW4gcmVzdG9yaW5nIHRoZSB3aW5kb3cgaWY6XG4gICAgICAgICAgICAvLyAxLiB0aGUgd29ya3NwYWNlIGlzIG9wZW5lZCAoYnV0IG5vdCBuZWNlc3NhcmlseSBhcyBhIGxlYWYgd29ya3NwYWNlKVxuICAgICAgICAgICAgLy8gMi4gdGhlIHByb3BzIG9mIHRoZSBvcGVuZWQgd29ya3NwYWNlIGlzIHNhbWUgYXMgd29ya3NwYWNlIHByb3BzIChmcm9tIHRoZSBmdW5jdGlvbiBpbnB1dClcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGNsb3NlIGFsbCB3b3Jrc3BhY2VzIGluIHRoaXMgd2luZG93LCBhbmQgb3BlbiB0aGlzIG5ld2x5IHJlcXVlc3RlZCBvbmVcbiAgICAgICAgICAgIGNvbnN0IG9wZW5lZFdvcmtzcGFjZSA9IG9wZW5lZFdvcmtzcGFjZXMuZmluZCgodyk9Pncud29ya3NwYWNlTmFtZSA9PT0gd29ya3NwYWNlTmFtZSk7XG4gICAgICAgICAgICBpZiAob3BlbmVkV29ya3NwYWNlICYmIGFyZVByb3BzQ29tcGF0aWJsZShvcGVuZWRXb3Jrc3BhY2UucHJvcHMsIHdvcmtzcGFjZVByb3BzKSkge1xuICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHdpbmRvdyBpZiBpdCBpcyBoaWRkZW4gb3Igbm90IHRoZSBtb3N0IHJlY2VudGx5IG9wZW5lZCBvbmVcbiAgICAgICAgICAgICAgICBpZiAoaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW4gfHwgb3BlbmVkV2luZG93SW5kZXggIT09IHN0b3JlU3RhdGUub3BlbmVkV2luZG93cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSh3b3Jrc3BhY2UyU3RvcmVBY3Rpb25zLnJlc3RvcmVXaW5kb3coc3RvcmVTdGF0ZSwgd2luZG93TmFtZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2tUb0Nsb3NlV29ya3NwYWNlcyA9IGF3YWl0IHByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzKHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAnQ0xPU0VfV09SS1NQQUNFJyxcbiAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICB3b3Jrc3BhY2VOYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9rVG9DbG9zZVdvcmtzcGFjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlMlN0b3JlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0b3JlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWRHcm91cDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwTmFtZTogZ3JvdXBEZWYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogc3RvcmVTdGF0ZT8ub3BlbmVkR3JvdXA/LnByb3BzID8/IGdyb3VwUHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWRXaW5kb3dzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uc3RvcmVTdGF0ZS5vcGVuZWRXaW5kb3dzLmZpbHRlcigoXywgaSk9PmkgIT09IG9wZW5lZFdpbmRvd0luZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudGx5IG9wZW5lZCB3b3Jrc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd05hbWU6IHdpbmRvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZFdvcmtzcGFjZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09wZW5lZFdvcmtzcGFjZSh3b3Jrc3BhY2VOYW1lLCB3b3Jrc3BhY2VQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IG9wZW5lZFdpbmRvdz8ucHJvcHMgPz8gd2luZG93UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltaXplZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb2tUb0Nsb3NlV29ya3NwYWNlcyA9IGF3YWl0IHByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzKHtcbiAgICAgICAgICAgICAgICByZWFzb246ICdDTE9TRV9XSU5ET1cnLFxuICAgICAgICAgICAgICAgIGV4cGxpY2l0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3aW5kb3dOYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChva1RvQ2xvc2VXb3Jrc3BhY2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gZGlzY2FyZCB0aGUgb3BlbmVkV2luZG93cyBlbGVtZW50IGF0IG9wZW5lZFdpbmRvd0luZGV4XG4gICAgICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZSBhIG5ldyBvbmUgd2l0aCB0aGUgcmVxdWVzdGVkIHdvcmtzcGFjZSBvcGVuZWRcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2UyU3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5zdG9yZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBvcGVuZWRHcm91cDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBOYW1lOiBncm91cERlZi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IGdyb3VwUHJvcHMgPz8gc3RvcmVTdGF0ZT8ub3BlbmVkR3JvdXA/LnByb3BzXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9wZW5lZFdpbmRvd3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0b3JlU3RhdGUub3BlbmVkV2luZG93cy5maWx0ZXIoKF8sIGkpPT5pICE9PSBvcGVuZWRXaW5kb3dJbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudGx5IG9wZW5lZCB3b3Jrc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dOYW1lOiB3aW5kb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5lZFdvcmtzcGFjZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3BlbmVkV29ya3NwYWNlKHdvcmtzcGFjZU5hbWUsIHdvcmtzcGFjZVByb3BzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHdpbmRvd1Byb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltaXplZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3JvdXBEZWYucGVyc2lzdGVuY2UgPT0gJ2Nsb3NhYmxlJykge1xuICAgICAgICBjb25zdCBva1RvQ2xvc2VXb3Jrc3BhY2VzID0gYXdhaXQgcHJvbXB0Rm9yQ2xvc2luZ1dvcmtzcGFjZXMoe1xuICAgICAgICAgICAgcmVhc29uOiAnQ0xPU0VfT1RIRVJfV0lORE9XUycsXG4gICAgICAgICAgICBleHBsaWNpdDogZmFsc2UsXG4gICAgICAgICAgICB3aW5kb3dOYW1lVG9TcGFyZTogd2luZG93RGVmLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChva1RvQ2xvc2VXb3Jrc3BhY2VzKSB7XG4gICAgICAgICAgICB3b3Jrc3BhY2UyU3RvcmUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIC4uLnN0b3JlU3RhdGUsXG4gICAgICAgICAgICAgICAgb3BlbmVkR3JvdXA6IHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBOYW1lOiBncm91cERlZi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogZ3JvdXBQcm9wcyA/PyBzdG9yZVN0YXRlPy5vcGVuZWRHcm91cD8ucHJvcHMgPz8gbnVsbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3BlbmVkV2luZG93czogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dOYW1lOiB3aW5kb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVkV29ya3NwYWNlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09wZW5lZFdvcmtzcGFjZSh3b3Jrc3BhY2VOYW1lLCB3b3Jrc3BhY2VQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogd2luZG93UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbWl6ZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGlzTW9zdFJlY2VudGx5T3BlbmVkV2luZG93SGlkZGVuOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHdvcmtzcGFjZTJTdG9yZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi5zdG9yZVN0YXRlLFxuICAgICAgICAgICAgb3BlbmVkR3JvdXA6IHtcbiAgICAgICAgICAgICAgICBncm91cE5hbWU6IGdyb3VwRGVmLm5hbWUsXG4gICAgICAgICAgICAgICAgcHJvcHM6IGdyb3VwUHJvcHMgPz8gc3RvcmVTdGF0ZT8ub3BlbmVkR3JvdXA/LnByb3BzID8/IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVuZWRXaW5kb3dzOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RvcmVTdGF0ZS5vcGVuZWRXaW5kb3dzLFxuICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50bHkgb3BlbmVkIHdvcmtzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93TmFtZTogd2luZG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgb3BlbmVkV29ya3NwYWNlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3BlbmVkV29ya3NwYWNlKHdvcmtzcGFjZU5hbWUsIHdvcmtzcGFjZVByb3BzKVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogd2luZG93UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIG1heGltaXplZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4vKipcbiAqIFdoZW4gd2UgbGF1bmNoIGEgd29ya3NwYWNlLCB3ZSBtYXkgcGFzcyBpbiB3b3Jrc3BhY2UgLyB3aW5kb3dzIC8gZ3JvdXAgcHJvcHMuIElmIHRoZSB3b3Jrc3BhY2Ugb3JcbiAqIHdpbmRvdyBvciBncm91cCBpcyBjdXJyZW50bHkgb3BlbmVkLCB3ZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvcHMgYXJlIGNvbXBhdGlibGUgd2l0aFxuICogdGhlIHBhc3NlZCBpbiBwcm9wcy4gMiBwcm9wcyBBIGFuZCBCIGFyZSBjb21wYXRpYmxlIGlmOlxuICogICBlaXRoZXIgb25lIGlzIG51bGxpc2ggKGJlY2F1c2UgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90IGNhcmUgYWJvdXQgcHJvcCBpbmNvbXBhdGliaWxpdHkpXG4gKiAgIG5laXRoZXIgaXMgbnVsbGlzaCwgYW5kIEEgYW5kIEIgYXJlIHNoYWxsb3cgZXF1YWwuXG4gKiBAcGFyYW0gYSBwcm9wc1xuICogQHBhcmFtIGIgcHJvcHNcbiAqIEByZXR1cm5zIHdoZXRoZXIgcHJvcHMgYSBhbmQgYiBhcmUgY29tcGF0aWJsZVxuICovIGZ1bmN0aW9uIGFyZVByb3BzQ29tcGF0aWJsZShhLCBiKSB7XG4gICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzaGFsbG93RXF1YWwoYSwgYik7XG59XG4vKipcbiAqIEEgdXNlciBjYW4gcGVyZm9ybSBhY3Rpb25zIHRoYXQgZXhwbGljaXRseSByZXN1bHQgaW4gY2xvc2luZyB3b3Jrc3BhY2VzXG4gKiAoc3VjaCB0aGF0IGNsaWNraW5nIHRoZSAnWCcgYnV0dG9uIGZvciB0aGUgd29ya3NwYWNlIG9yIHdvcmtzcGFjZSBncm91cCksIG9yXG4gKiBpbXBsaWNpdGx5IChieSBvcGVuaW5nIGEgd29ya3NwYWNlIHdpdGggZGlmZmVyZW50IHByb3BzIHRoYW4gdGhlIG9uZSB0aGF0IGlzIGFscmVhZHkgb3BlbmVkKS5cbiAqIENhbGxzIHRvIGNsb3NlV29ya3NwYWNlMigpIG9yIGNsb3NlV29ya3NwYWNlR3JvdXAyKCkgYXJlIGNvbnNpZGVyZWQgZXhwbGljaXQsIHdoaWxlIGNhbGxzXG4gKiB0byBsYXVuY2hXb3Jrc3BhY2UyKCkgb3IgbGF1bmNoV29ya3NwYWNlR3JvdXAyKCkgYXJlIGNvbnNpZGVyZWQgaW1wbGljaXQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwcm9tcHRzIHRoZSB1c2VyIGZvciBjb25maXJtYXRpb24gdG8gY2xvc2Ugd29ya3NwYWNlcyB3aXRoIGEgbW9kYWwgZGlhbG9nLlxuICogV2hlbiB0aGUgY2xvc2luZyBpcyBleHBsaWNpdCwgaXQgcHJvbXB0cyBmb3IgY29uZmlybWF0aW9uIGZvciBhZmZlY3RlZCB3b3Jrc3BhY2VzIHdpdGggdW5zYXZlZCBjaGFuZ2VzLlxuICogV2hlbiB0aGUgY2xvc2luZyBpcyBpbXBsaWNpdCwgaXQgcHJvbXB0cyBmb3IgY29uZmlybWF0aW9uIGZvciBhbGwgYWZmZWN0ZWQgd29ya3NwYWNlcywgcmVnYXJkbGVzcyBvZlxuICogd2hldGhlciB0aGV5IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLlxuICogQHBhcmFtIHByb21wdFJlYXNvblxuICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXNlciBjb25maXJtZWQgY2xvc2luZyB0aGUgd29ya3NwYWNlczsgZmFsc2Ugb3RoZXJ3aXNlLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9tcHRGb3JDbG9zaW5nV29ya3NwYWNlcyhwcm9tcHRSZWFzb24pIHtcbiAgICAvLyBpZiBvbmx5VXBUb1RoaXNXb3Jrc3BhY2UgaXMgcHJvdmlkZWQsIHdlIHdpbGwgb25seSBsb29wIHRpbGwgd2UgaGl0IHRoYXQgd29ya3NwYWNlXG4gICAgZnVuY3Rpb24gZ2V0QWZmZWN0ZWRXb3Jrc3BhY2VzSW5XaW5kb3cob3BlbmVkV2luZG93LCBvbmx5VXBUb1RoaXNXb3Jrc3BhY2UpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IG9wZW5lZFdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5lZFdvcmtzcGFjZSA9IG9wZW5lZFdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzW2ldO1xuICAgICAgICAgICAgaWYgKG9wZW5lZFdvcmtzcGFjZS5oYXNVbnNhdmVkQ2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHJldC5wdXNoKG9wZW5lZFdvcmtzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob25seVVwVG9UaGlzV29ya3NwYWNlICYmIG9wZW5lZFdvcmtzcGFjZS53b3Jrc3BhY2VOYW1lID09PSBvbmx5VXBUb1RoaXNXb3Jrc3BhY2UpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBjb25zdCB7IG9wZW5lZFdpbmRvd3MsIHdvcmtzcGFjZVRpdGxlQnlXb3Jrc3BhY2VOYW1lIH0gPSB3b3Jrc3BhY2UyU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBsZXQgYWZmZWN0ZWRXb3Jrc3BhY2VzID0gW107XG4gICAgc3dpdGNoKHByb21wdFJlYXNvbi5yZWFzb24pe1xuICAgICAgICBjYXNlICdDTE9TRV9XT1JLU1BBQ0VfR1JPVVAnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkV29ya3NwYWNlcyA9IG9wZW5lZFdpbmRvd3MuZmxhdE1hcCgod2luZG93KT0+Z2V0QWZmZWN0ZWRXb3Jrc3BhY2VzSW5XaW5kb3cod2luZG93KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0NMT1NFX1dJTkRPVyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93ID0gb3BlbmVkV2luZG93cy5maW5kKCh3aW5kb3cpPT53aW5kb3cud2luZG93TmFtZSA9PT0gcHJvbXB0UmVhc29uLndpbmRvd05hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghb3BlbmVkV2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2luZG93ICR7cHJvbXB0UmVhc29uLndpbmRvd05hbWV9IG5vdCBmb3VuZCBpbiBvcGVuZWQgd2luZG93cy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRXb3Jrc3BhY2VzID0gZ2V0QWZmZWN0ZWRXb3Jrc3BhY2VzSW5XaW5kb3cob3BlbmVkV2luZG93KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ0xPU0VfV09SS1NQQUNFJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuZWRXaW5kb3cgPSBvcGVuZWRXaW5kb3dzLmZpbmQoKHdpbmRvdyk9PndpbmRvdy53aW5kb3dOYW1lID09PSBwcm9tcHRSZWFzb24ud2luZG93TmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcGVuZWRXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaW5kb3cgJHtwcm9tcHRSZWFzb24ud2luZG93TmFtZX0gbm90IGZvdW5kIGluIG9wZW5lZCB3aW5kb3dzLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZmZlY3RlZFdvcmtzcGFjZXMgPSBnZXRBZmZlY3RlZFdvcmtzcGFjZXNJbldpbmRvdyhvcGVuZWRXaW5kb3csIHByb21wdFJlYXNvbi53b3Jrc3BhY2VOYW1lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ0xPU0VfT1RIRVJfV0lORE9XUyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93c1RvQ2xvc2UgPSBvcGVuZWRXaW5kb3dzLmZpbHRlcigod2luZG93KT0+d2luZG93LndpbmRvd05hbWUgIT09IHByb21wdFJlYXNvbi53aW5kb3dOYW1lVG9TcGFyZSk7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRXb3Jrc3BhY2VzID0gd2luZG93c1RvQ2xvc2UuZmxhdE1hcCgodyk9PmdldEFmZmVjdGVkV29ya3NwYWNlc0luV2luZG93KHcpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFmZmVjdGVkV29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTsgLy8gbm8gdW5zYXZlZCBjaGFuZ2VzLCBubyBuZWVkIHRvIHByb21wdFxuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgIGNvbnN0IGRpc3Bvc2UgPSBzaG93TW9kYWwoJ3dvcmtzcGFjZTItY2xvc2UtcHJvbXB0Jywge1xuICAgICAgICAgICAgc2l6ZTogJ3NtJyxcbiAgICAgICAgICAgIG9uQ29uZmlybTogKCk9PntcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNhbmNlbDogKCk9PntcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZmZWN0ZWRXb3Jrc3BhY2VUaXRsZXM6IGFmZmVjdGVkV29ya3NwYWNlcy5tYXAoKHdvcmtzcGFjZSk9PndvcmtzcGFjZVRpdGxlQnlXb3Jrc3BhY2VOYW1lW3dvcmtzcGFjZS53b3Jrc3BhY2VOYW1lXSlcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgY29uc3Qgd29ya3NwYWNlMlN0b3JlQWN0aW9ucyA9IHtcbiAgICBzZXRXaW5kb3dNYXhpbWl6ZWQgKHN0YXRlLCB3aW5kb3dOYW1lLCBtYXhpbWl6ZWQpIHtcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93SW5kZXggPSBzdGF0ZS5vcGVuZWRXaW5kb3dzLmZpbmRJbmRleCgoYSk9PmEud2luZG93TmFtZSA9PT0gd2luZG93TmFtZSk7XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvd3MgPSBbXG4gICAgICAgICAgICAuLi5zdGF0ZS5vcGVuZWRXaW5kb3dzXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGN1cnJlbnRXaW5kb3cgPSB7XG4gICAgICAgICAgICAuLi5vcGVuZWRXaW5kb3dzW29wZW5lZFdpbmRvd0luZGV4XSxcbiAgICAgICAgICAgIG1heGltaXplZFxuICAgICAgICB9O1xuICAgICAgICBvcGVuZWRXaW5kb3dzW29wZW5lZFdpbmRvd0luZGV4XSA9IGN1cnJlbnRXaW5kb3c7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG9wZW5lZFdpbmRvd3NcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIC8vIGhpZGVzIHRoZSBtb3N0IHJlY2VudGx5IG9wZW5lZCB3aW5kb3cgKGFsbCBvdGhlciBvcGVuZWQgd2luZG93cyBhcmUgaW1wbGljaXRseSBoaWRkZW4pXG4gICAgaGlkZVdpbmRvdyAoc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW46IHRydWVcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIHJlc3RvcmVXaW5kb3cgKHN0YXRlLCB3aW5kb3dOYW1lKSB7XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvd0luZGV4ID0gc3RhdGUub3BlbmVkV2luZG93cy5maW5kSW5kZXgoKGEpPT5hLndpbmRvd05hbWUgPT09IHdpbmRvd05hbWUpO1xuICAgICAgICBjb25zdCBjdXJyZW50V2luZG93ID0gc3RhdGUub3BlbmVkV2luZG93c1tvcGVuZWRXaW5kb3dJbmRleF07XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvd3MgPSBbXG4gICAgICAgICAgICAuLi5zdGF0ZS5vcGVuZWRXaW5kb3dzLmZpbHRlcigoXywgaSk9PmkgIT09IG9wZW5lZFdpbmRvd0luZGV4KSxcbiAgICAgICAgICAgIGN1cnJlbnRXaW5kb3dcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgb3BlbmVkV2luZG93cyxcbiAgICAgICAgICAgIGlzTW9zdFJlY2VudGx5T3BlbmVkV2luZG93SGlkZGVuOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgY2xvc2VXb3Jrc3BhY2UgKHN0YXRlLCB3b3Jrc3BhY2VOYW1lKSB7XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvd0luZGV4ID0gZ2V0T3BlbmVkV2luZG93SW5kZXhCeVdvcmtzcGFjZSh3b3Jrc3BhY2VOYW1lKTtcbiAgICAgICAgaWYgKG9wZW5lZFdpbmRvd0luZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlOyAvLyBuby1vcCBpZiB0aGUgd2luZG93IGRvZXMgbm90IGV4aXN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2luZG93ID0ge1xuICAgICAgICAgICAgLi4uc3RhdGUub3BlbmVkV2luZG93c1tvcGVuZWRXaW5kb3dJbmRleF1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgd29ya3NwYWNlSW5kZXggPSB3aW5kb3cub3BlbmVkV29ya3NwYWNlcy5maW5kSW5kZXgoKHcpPT53LndvcmtzcGFjZU5hbWUgPT09IHdvcmtzcGFjZU5hbWUpO1xuICAgICAgICBjb25zdCBvcGVuZWRXaW5kb3dzID0gW1xuICAgICAgICAgICAgLi4uc3RhdGUub3BlbmVkV2luZG93c1xuICAgICAgICBdO1xuICAgICAgICAvLyBjbG9zZSBhbGwgY2hpbGRyZW4gb2YgdGhlIGlucHV0IHdvcmtzcGFjZSBhcyB3ZWxsXG4gICAgICAgIHdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzID0gd2luZG93Lm9wZW5lZFdvcmtzcGFjZXMuc2xpY2UoMCwgd29ya3NwYWNlSW5kZXgpO1xuICAgICAgICBsZXQgaGlkZGVuID0gc3RhdGUuaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW47XG4gICAgICAgIGlmICh3aW5kb3cub3BlbmVkV29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc01vc3RSZWNlbnRXaW5kb3cgPSBvcGVuZWRXaW5kb3dJbmRleCA9PT0gc3RhdGUub3BlbmVkV2luZG93cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgLy8gaWYgbm8gd29ya3NwYWNlcyBsZWZ0LCByZW1vdmUgdGhlIHdpbmRvd1xuICAgICAgICAgICAgb3BlbmVkV2luZG93cy5zcGxpY2Uob3BlbmVkV2luZG93SW5kZXgsIDEpO1xuICAgICAgICAgICAgLy8gSWYgd2UgcmVtb3ZlZCB0aGUgbW9zdCByZWNlbnQgd2luZG93IGFuZCB0aGVyZSBhcmUgc3RpbGwgd2luZG93cyBsZWZ0LFxuICAgICAgICAgICAgLy8gdGhlIG5ldyBtb3N0IHJlY2VudCB3aW5kb3cgc2hvdWxkIGJlIHNob3duXG4gICAgICAgICAgICBpZiAod2FzTW9zdFJlY2VudFdpbmRvdyAmJiBvcGVuZWRXaW5kb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBoaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSBzdGlsbCB3b3Jrc3BhY2VzIGxlZnQsIGp1c3QgdXBkYXRlIHRoZSB3aW5kb3dcbiAgICAgICAgICAgIG9wZW5lZFdpbmRvd3Nbb3BlbmVkV2luZG93SW5kZXhdID0gd2luZG93O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG9wZW5lZFdpbmRvd3MsXG4gICAgICAgICAgICBpc01vc3RSZWNlbnRseU9wZW5lZFdpbmRvd0hpZGRlbjogaGlkZGVuXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBvcGVuQ2hpbGRXb3Jrc3BhY2UgKHN0YXRlLCBwYXJlbnRXb3Jrc3BhY2VOYW1lLCBjaGlsZFdvcmtzcGFjZU5hbWUsIGNoaWxkV29ya3NwYWNlUHJvcHMpIHtcbiAgICAgICAgY29uc3QgY2hpbGRXb3Jrc3BhY2VEZWYgPSBzdGF0ZS5yZWdpc3RlcmVkV29ya3NwYWNlc0J5TmFtZVtjaGlsZFdvcmtzcGFjZU5hbWVdO1xuICAgICAgICBpZiAoIWNoaWxkV29ya3NwYWNlRGVmKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHdvcmtzcGFjZSBuYW1lZCBcIiR7Y2hpbGRXb3Jrc3BhY2VOYW1lfVwiIHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnRXb3Jrc3BhY2VEZWYgPSBzdGF0ZS5yZWdpc3RlcmVkV29ya3NwYWNlc0J5TmFtZVtwYXJlbnRXb3Jrc3BhY2VOYW1lXTtcbiAgICAgICAgaWYgKCFwYXJlbnRXb3Jrc3BhY2VEZWYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gd29ya3NwYWNlIG5hbWVkIFwiJHtwYXJlbnRXb3Jrc3BhY2VOYW1lfVwiIHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50V29ya3NwYWNlRGVmLndpbmRvdyAhPT0gY2hpbGRXb3Jrc3BhY2VEZWYud2luZG93KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENoaWxkIHdvcmtzcGFjZSAke2NoaWxkV29ya3NwYWNlTmFtZX0gZG9lcyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIHdvcmtzcGFjZSB3aW5kb3cgYXMgcGFyZW50IHdvcmtzcGFjZSAke3BhcmVudFdvcmtzcGFjZU5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXMgdGhlIHJlcXVlc3Qgd29ya3NwYWNlIHNob3VsZCBiZSBhIGNoaWxkIHdvcmtzcGFjZSwgdGhlIGNvcnJlc3BvbmRpbmcgd2luZG93XG4gICAgICAgIC8vIHRvIGNvbnRhaW4gdGhlIHdvcmtzcGFjZSBzaG91bGQgYWxyZWFkeSBiZSBvcGVuZWRcbiAgICAgICAgY29uc3Qgb3BlbmVkV2luZG93SW5kZXggPSBzdGF0ZS5vcGVuZWRXaW5kb3dzLmZpbmRJbmRleCgod2luZG93KT0+d2luZG93LndpbmRvd05hbWUgPT09IGNoaWxkV29ya3NwYWNlRGVmLndpbmRvdyk7XG4gICAgICAgIGlmIChvcGVuZWRXaW5kb3dJbmRleCA9PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3BlbiBjaGlsZCB3b3Jrc3BhY2UgJHtjaGlsZFdvcmtzcGFjZU5hbWV9IGFzIHdpbmRvdyAke2NoaWxkV29ya3NwYWNlRGVmLndpbmRvd30gaXMgbm90IG9wZW5lZGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvdyA9IHN0YXRlLm9wZW5lZFdpbmRvd3Nbb3BlbmVkV2luZG93SW5kZXhdO1xuICAgICAgICBjb25zdCB7IG9wZW5lZFdvcmtzcGFjZXMgfSA9IG9wZW5lZFdpbmRvdztcbiAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBvcGVuZWRXb3Jrc3BhY2VzLmZpbmRJbmRleCgodyk9Pncud29ya3NwYWNlTmFtZSA9PT0gcGFyZW50V29ya3NwYWNlTmFtZSk7XG4gICAgICAgIGlmIChwYXJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG9wZW4gY2hpbGQgd29ya3NwYWNlICR7Y2hpbGRXb3Jrc3BhY2VOYW1lfSBmcm9tIHBhcmVudCB3b3Jrc3BhY2UgJHtwYXJlbnRXb3Jrc3BhY2VOYW1lfSBhcyB0aGUgcGFyZW50IGlzIG5vdCBvcGVuZWQgd2l0aGluIHRoZSB3b3Jrc3BhY2Ugd2luZG93YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xvc2UgYW55IHdvcmtzcGFjZXMgYWJvdmUgdGhlIHBhcmVudCAoYW5hbG9nb3VzIHRvIGNsb3NlV29ya3NwYWNlJ3Mgc2xpY2UgYmVoYXZpb3IpXG4gICAgICAgIGNvbnN0IHRyaW1tZWRXb3Jrc3BhY2VzID0gb3BlbmVkV29ya3NwYWNlcy5zbGljZSgwLCBwYXJlbnRJbmRleCArIDEpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BlbmVkV2luZG93czogc3RhdGUub3BlbmVkV2luZG93cy5tYXAoKHcsIGkpPT57XG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gb3BlbmVkV2luZG93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLncsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWRXb3Jrc3BhY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udHJpbW1lZFdvcmtzcGFjZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3BlbmVkV29ya3NwYWNlKGNoaWxkV29ya3NwYWNlTmFtZSwgY2hpbGRXb3Jrc3BhY2VQcm9wcylcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgc2V0SGFzVW5zYXZlZENoYW5nZXMgKHN0YXRlLCB3b3Jrc3BhY2VOYW1lLCBoYXNVbnNhdmVkQ2hhbmdlcykge1xuICAgICAgICBjb25zdCBvcGVuZWRXaW5kb3dJbmRleCA9IGdldE9wZW5lZFdpbmRvd0luZGV4QnlXb3Jrc3BhY2Uod29ya3NwYWNlTmFtZSk7XG4gICAgICAgIGlmIChvcGVuZWRXaW5kb3dJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsgLy8gbm8tb3AgaWYgdGhlIHdpbmRvdyBkb2VzIG5vdCBleGlzdFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvdyA9IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLm9wZW5lZFdpbmRvd3Nbb3BlbmVkV2luZG93SW5kZXhdXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHdvcmtzcGFjZUluZGV4ID0gb3BlbmVkV2luZG93Lm9wZW5lZFdvcmtzcGFjZXMuZmluZEluZGV4KCh3KT0+dy53b3Jrc3BhY2VOYW1lID09PSB3b3Jrc3BhY2VOYW1lKTtcbiAgICAgICAgaWYgKHdvcmtzcGFjZUluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlOyAvLyBuby1vcCBpZiB0aGUgd29ya3NwYWNlIGlzIG5vdCBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIG9wZW5lZFdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzW3dvcmtzcGFjZUluZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLm9wZW5lZFdpbmRvdy5vcGVuZWRXb3Jrc3BhY2VzW3dvcmtzcGFjZUluZGV4XSxcbiAgICAgICAgICAgIGhhc1Vuc2F2ZWRDaGFuZ2VzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9wZW5lZFdpbmRvd3MgPSBbXG4gICAgICAgICAgICAuLi5zdGF0ZS5vcGVuZWRXaW5kb3dzXG4gICAgICAgIF07XG4gICAgICAgIG9wZW5lZFdpbmRvd3Nbb3BlbmVkV2luZG93SW5kZXhdID0gb3BlbmVkV2luZG93O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBvcGVuZWRXaW5kb3dzXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBzZXRXb3Jrc3BhY2VUaXRsZSAoc3RhdGUsIHdvcmtzcGFjZU5hbWUsIHRpdGxlKSB7XG4gICAgICAgIGNvbnN0IG5ld1dvcmtzcGFjZVRpdGxlQnlXb3Jrc3BhY2VOYW1lID0ge1xuICAgICAgICAgICAgLi4uc3RhdGUud29ya3NwYWNlVGl0bGVCeVdvcmtzcGFjZU5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRpdGxlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgbmV3V29ya3NwYWNlVGl0bGVCeVdvcmtzcGFjZU5hbWVbd29ya3NwYWNlTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdXb3Jrc3BhY2VUaXRsZUJ5V29ya3NwYWNlTmFtZVt3b3Jrc3BhY2VOYW1lXSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHdvcmtzcGFjZVRpdGxlQnlXb3Jrc3BhY2VOYW1lOiBuZXdXb3Jrc3BhY2VUaXRsZUJ5V29ya3NwYWNlTmFtZVxuICAgICAgICB9O1xuICAgIH1cbn07XG5leHBvcnQgZnVuY3Rpb24gdXNlV29ya3NwYWNlMlN0b3JlKCkge1xuICAgIHJldHVybiB1c2VTdG9yZVdpdGhBY3Rpb25zKHdvcmtzcGFjZTJTdG9yZSwgd29ya3NwYWNlMlN0b3JlQWN0aW9ucyk7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHJlYWN0IENvbnRleHQgY29udGFpbmluZyBwcm9wcyBwYXNzZWQgaW50byBhIHdvcmtzcGFjZS5cbiAqIFRoaXMgaG9vayBNVVNUIGJlIGNhbGxlZCBpbnNpZGUgYSBjaGlsZCBvZiA8V29ya3NwYWNlMj5cbiAqLyBleHBvcnQgY29uc3QgdXNlV29ya3NwYWNlMkNvbnRleHQgPSAoKT0+dXNlQ29udGV4dChTaW5nbGVTcGFDb250ZXh0KTtcbi8qKlxuICogQHJldHVybnMgYSBsaXN0IG9mIHJlZ2lzdGVyZWQgd29ya3NwYWNlcy5cbiAqLyBleHBvcnQgY29uc3QgZ2V0UmVnaXN0ZXJlZFdvcmtzcGFjZTJOYW1lcyA9ICgpPT57XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHdvcmtzcGFjZTJTdG9yZS5nZXRTdGF0ZSgpLnJlZ2lzdGVyZWRXb3Jrc3BhY2VzQnlOYW1lKTtcbn07XG5mdW5jdGlvbiBuZXdPcGVuZWRXb3Jrc3BhY2Uod29ya3NwYWNlTmFtZSwgd29ya3NwYWNlUHJvcHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB3b3Jrc3BhY2VOYW1lLFxuICAgICAgICBwcm9wczogd29ya3NwYWNlUHJvcHMgPz8ge30sXG4gICAgICAgIGhhc1Vuc2F2ZWRDaGFuZ2VzOiBmYWxzZSxcbiAgICAgICAgdXVpZDogdXVpZFY0KClcbiAgICB9O1xufVxuIl0sIm5hbWVzIjpbInVzZUNvbnRleHQiLCJTaW5nbGVTcGFDb250ZXh0IiwidjQiLCJ1dWlkVjQiLCJnZXRHcm91cEJ5V2luZG93TmFtZSIsImdldE9wZW5lZFdpbmRvd0luZGV4QnlXb3Jrc3BhY2UiLCJnZXRXaW5kb3dCeVdvcmtzcGFjZU5hbWUiLCJ3b3Jrc3BhY2UyU3RvcmUiLCJ1c2VTdG9yZVdpdGhBY3Rpb25zIiwic2hhbGxvd0VxdWFsIiwic2hvd01vZGFsIiwibGF1bmNoV29ya3NwYWNlR3JvdXAyIiwiZ3JvdXBOYW1lIiwiZ3JvdXBQcm9wcyIsIm9wZW5lZEdyb3VwIiwib2tUb0Nsb3NlV29ya3NwYWNlcyIsImFyZVByb3BzQ29tcGF0aWJsZSIsInByb21wdEZvckNsb3NpbmdXb3Jrc3BhY2VzIiwic3RhdGUiLCJjbG9zZVdvcmtzcGFjZUdyb3VwMiIsImRpc2NhcmRVbnNhdmVkQ2hhbmdlcyIsIm9wZW5lZFdpbmRvd3MiLCJsYXVuY2hXb3Jrc3BhY2UyIiwid29ya3NwYWNlTmFtZSIsIndvcmtzcGFjZVByb3BzIiwid2luZG93UHJvcHMiLCJzdG9yZVN0YXRlIiwid2luZG93RGVmIiwid2luZG93TmFtZSIsImdyb3VwRGVmIiwib3BlbmVkV2luZG93SW5kZXgiLCJpc1dpbmRvd0FscmVhZHlPcGVuZWQiLCJfc3RvcmVTdGF0ZV9vcGVuZWRHcm91cCIsIm9wZW5lZFdpbmRvdyIsImdyb3VwUHJvcHMxIiwiaXNNb3N0UmVjZW50bHlPcGVuZWRXaW5kb3dIaWRkZW4iLCJvcGVuZWRXb3Jrc3BhY2VzIiwib3BlbmVkV29ya3NwYWNlIiwib2tUb0Nsb3NlV29ya3NwYWNlczEiLCJfc3RvcmVTdGF0ZV9vcGVuZWRHcm91cDEiLCJva1RvQ2xvc2VXb3Jrc3BhY2VzMiIsIl9zdG9yZVN0YXRlX29wZW5lZEdyb3VwMiIsIm9rVG9DbG9zZVdvcmtzcGFjZXMzIiwiX3JlZjMiLCJfc3RvcmVTdGF0ZV9vcGVuZWRHcm91cDMiLCJfcmVmNCIsIl9zdG9yZVN0YXRlX29wZW5lZEdyb3VwNCIsIkVycm9yIiwibmV3T3BlbmVkV29ya3NwYWNlIiwidyIsIndvcmtzcGFjZTJTdG9yZUFjdGlvbnMiLCJfIiwiaSIsImEiLCJiIiwicHJvbXB0UmVhc29uIiwiZ2V0QWZmZWN0ZWRXb3Jrc3BhY2VzSW5XaW5kb3ciLCJvbmx5VXBUb1RoaXNXb3Jrc3BhY2UiLCJyZXQiLCJfd29ya3NwYWNlMlN0b3JlX2dldFN0YXRlIiwid29ya3NwYWNlVGl0bGVCeVdvcmtzcGFjZU5hbWUiLCJhZmZlY3RlZFdvcmtzcGFjZXMiLCJ3aW5kb3ciLCJvcGVuZWRXaW5kb3cxIiwid2luZG93c1RvQ2xvc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImRpc3Bvc2UiLCJvbkNvbmZpcm0iLCJvbkNhbmNlbCIsIndvcmtzcGFjZSIsInNldFdpbmRvd01heGltaXplZCIsIm1heGltaXplZCIsImN1cnJlbnRXaW5kb3ciLCJoaWRlV2luZG93IiwicmVzdG9yZVdpbmRvdyIsImNsb3NlV29ya3NwYWNlIiwid29ya3NwYWNlSW5kZXgiLCJoaWRkZW4iLCJ3YXNNb3N0UmVjZW50V2luZG93Iiwib3BlbkNoaWxkV29ya3NwYWNlIiwicGFyZW50V29ya3NwYWNlTmFtZSIsImNoaWxkV29ya3NwYWNlTmFtZSIsImNoaWxkV29ya3NwYWNlUHJvcHMiLCJjaGlsZFdvcmtzcGFjZURlZiIsInBhcmVudFdvcmtzcGFjZURlZiIsInBhcmVudEluZGV4IiwidHJpbW1lZFdvcmtzcGFjZXMiLCJzZXRIYXNVbnNhdmVkQ2hhbmdlcyIsImhhc1Vuc2F2ZWRDaGFuZ2VzIiwic2V0V29ya3NwYWNlVGl0bGUiLCJ0aXRsZSIsIm5ld1dvcmtzcGFjZVRpdGxlQnlXb3Jrc3BhY2VOYW1lIiwidXNlV29ya3NwYWNlMlN0b3JlIiwidXNlV29ya3NwYWNlMkNvbnRleHQiLCJnZXRSZWdpc3RlcmVkV29y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\n//# sourceURL=webpack-internal:///../../framework/esm-styleguide/dist/workspaces2/workspace2.js\n\n}");
1999
1999
 
2000
2000
  },
2001
2001
  "../../../node_modules/@internationalized/date/dist/BuddhistCalendar.mjs"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
@@ -5580,7 +5580,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
5580
5580
  },
5581
5581
  "../../framework/esm-config/dist/module-config/module-config.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
5582
5582
  "use strict";
5583
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n clearConfigErrors: () => (clearConfigErrors),\n defineConfigSchema: () => (defineConfigSchema),\n defineExtensionConfigSchema: () => (defineExtensionConfigSchema),\n getConfig: () => (getConfig),\n getTranslationOverrides: () => (getTranslationOverrides),\n processConfig: () => (processConfig),\n provide: () => (provide),\n registerModuleLoad: () => (registerModuleLoad),\n registerModuleWithConfigSystem: () => (registerModuleWithConfigSystem),\n registerTranslationNamespace: () => (registerTranslationNamespace),\n resetConfigSystem: () => (resetConfigSystem)\n});\n/* import */ var lodash_es__rspack_import_4 = __webpack_require__(\"../../../node_modules/lodash-es/mergeWith.js\");\n/* import */ var lodash_es__rspack_import_5 = __webpack_require__(\"../../../node_modules/lodash-es/isEqual.js\");\n/* import */ var lodash_es__rspack_import_6 = __webpack_require__(\"../../../node_modules/lodash-es/omit.js\");\n/* import */ var lodash_es__rspack_import_7 = __webpack_require__(\"../../../node_modules/lodash-es/cloneDeep.js\");\n/* import */ var _types_js__rspack_import_0 = __webpack_require__(\"../../framework/esm-config/dist/types.js\");\n/* import */ var _validators_type_validators_js__rspack_import_1 = __webpack_require__(\"../../framework/esm-config/dist/validators/type-validators.js\");\n/* import */ var _validators_validator_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-config/dist/validators/validator.js\");\n/* import */ var _state_js__rspack_import_3 = __webpack_require__(\"../../framework/esm-config/dist/module-config/state.js\");\nfunction _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction _array_with_holes(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _array_without_holes(arr) {\n if (Array.isArray(arr)) return _array_like_to_array(arr);\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _iterable_to_array(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _iterable_to_array_limit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally{\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally{\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _non_iterable_rest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _non_iterable_spread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _sliced_to_array(arr, i) {\n return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();\n}\nfunction _to_consumable_array(arr) {\n return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();\n}\nfunction _type_of(obj) {\n \"@swc/helpers - typeof\";\n return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n}\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\n/** @module @category Config */ \n\n\n\n\n/**\n * Deep merge two objects, with right-side values taking precedence.\n * Arrays are replaced entirely (not merged by index), matching the\n * behavior of ramda's mergeDeepRight.\n */ function mergeDeepReplace(left, right) {\n return (0,lodash_es__rspack_import_4[\"default\"])({}, left, right, function(_objValue, srcValue) {\n if (Array.isArray(srcValue)) {\n return srcValue;\n }\n });\n}\n/**\n * Store setup\n *\n *\n * Set up stores and subscriptions so that inputs get processed appropriately.\n *\n * There are *input* stores and *output* stores. The *input* stores\n * are configInternalStore, temporaryConfigStore, and configExtensionStore. The\n * output stores are set in the `compute...` functions. They are the module\n * config stores, the extension slot config stores (by module), the extension\n * config stores, and the implementer tools config store.\n *\n * This code sets up the subscriptions so that when an input store changes,\n * the correct set of output stores are updated.\n *\n * All `compute...` functions except `computeExtensionConfigs` are pure\n * (or are supposed to be), other than the fact that they all `setState`\n * store values at the end. `computeExtensionConfigs` calls `getGlobalStore`,\n * which creates stores.\n */ // Store unsubscribe functions to allow cleanup (e.g., in tests or hot module reloading)\nvar configSubscriptions = [];\n/**\n * Recomputes all configuration derived stores based on current state of input stores.\n * Called whenever any input store (configInternalStore, temporaryConfigStore, configExtensionStore) changes.\n */ function recomputeAllConfigs() {\n var configState = _state_js__rspack_import_3.configInternalStore.getState();\n var tempConfigState = _state_js__rspack_import_3.temporaryConfigStore.getState();\n var extensionState = _state_js__rspack_import_3.configExtensionStore.getState();\n computeModuleConfig(configState, tempConfigState);\n computeImplementerToolsConfig(configState, tempConfigState);\n computeExtensionSlotConfigs(configState, tempConfigState);\n computeExtensionConfigs(configState, extensionState, tempConfigState);\n}\nfunction setupConfigSubscriptions() {\n // Initial computation\n recomputeAllConfigs();\n // Subscribe to all input stores with a single handler\n // This ensures we only recompute once even if multiple stores change simultaneously\n configSubscriptions.push(_state_js__rspack_import_3.configInternalStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__rspack_import_3.temporaryConfigStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__rspack_import_3.configExtensionStore.subscribe(recomputeAllConfigs));\n}\n// Set up subscriptions at module load time\nsetupConfigSubscriptions();\nfunction computeModuleConfig(state, tempState) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(state.schemas)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var moduleName = _step.value;\n // At this point the schema could be either just the implicit schema or the actually\n // defined schema. We run with just the implicit schema because we want to populate\n // the config store with the translation overrides as soon as possible. In fact, the\n // translation system will throw for Suspense until the translation overrides are\n // available, which as of this writing blocks the schema definition from occurring\n // for modules loaded based on their extensions.\n var moduleStore = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n var newState = void 0;\n if (state.moduleLoaded[moduleName]) {\n var config = getConfigForModule(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: true,\n config: config\n };\n } else {\n var config1 = getConfigForModuleImplicitSchema(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: false,\n config: config1\n };\n }\n moduleStore.setState(newState);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction computeExtensionSlotConfigs(state, tempState) {\n var slotConfigs = getExtensionSlotConfigs(state, tempState);\n var newSlotStoreEntries = Object.fromEntries(Object.entries(slotConfigs).map(function(param) {\n var _param = _sliced_to_array(param, 2), slotName = _param[0], config = _param[1];\n return [\n slotName,\n {\n loaded: true,\n config: config\n }\n ];\n }));\n var slotStore = (0,_state_js__rspack_import_3.getExtensionSlotsConfigStore)();\n var oldState = slotStore.getState();\n var newState = {\n slots: _object_spread({}, oldState.slots, newSlotStoreEntries)\n };\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.slots, newState.slots)) {\n slotStore.setState(newState);\n }\n}\nfunction computeImplementerToolsConfig(state, tempConfigState) {\n var oldState = _state_js__rspack_import_3.implementerToolsConfigStore.getState();\n var config = getImplementerToolsConfig(state, tempConfigState);\n var newState = {\n config: config\n };\n // Use deep equality on the actual config content, not the wrapper object\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.config, newState.config)) {\n _state_js__rspack_import_3.implementerToolsConfigStore.setState(newState);\n }\n}\nfunction computeExtensionConfigs(configState, extensionState, tempConfigState) {\n var configs = {};\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n // We assume that the module schema has already been defined, since the extension\n // it contains is mounted.\n for(var _iterator = extensionState.mountedExtensions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var extension = _step.value;\n var config = computeExtensionConfig(extension.slotModuleName, extension.extensionModuleName, extension.slotName, extension.extensionId, configState, tempConfigState);\n if (!configs[extension.slotName]) {\n configs[extension.slotName] = {};\n }\n configs[extension.slotName][extension.extensionId] = {\n config: config,\n loaded: true\n };\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n var extensionsConfigStore = (0,_state_js__rspack_import_3.getExtensionsConfigStore)();\n var oldState = extensionsConfigStore.getState();\n var newState = {\n configs: configs\n };\n // Use deep equality to only update if configs actually changed\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.configs, newState.configs)) {\n extensionsConfigStore.setState(newState);\n }\n}\n/*\n * API\n *\n */ /**\n * This defines a configuration schema for a module. The schema tells the\n * configuration system how the module can be configured. It specifies\n * what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param moduleName Name of the module the schema is being defined for. Generally\n * should be the one in which the `defineConfigSchema` call takes place.\n * @param schema The config schema for the module\n */ function defineConfigSchema(moduleName, schema) {\n validateConfigSchema(moduleName, schema);\n var enhancedSchema = mergeDeepReplace(schema, implicitConfigSchema);\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, moduleName, enhancedSchema)),\n moduleLoaded: _object_spread_props(_object_spread({}, state.moduleLoaded), _define_property({}, moduleName, true))\n });\n });\n}\n/**\n * This alerts the configuration system that a module exists. This allows config to be\n * processed, while still allowing the extension system to know whether the module has\n * actually had its front bundle executed yet.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleWithConfigSystem(moduleName) {\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, moduleName, implicitConfigSchema))\n });\n });\n}\n/**\n * This alerts the configuration system that a module has been loaded.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleLoad(moduleName) {\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n moduleLoaded: _object_spread_props(_object_spread({}, state.moduleLoaded), _define_property({}, moduleName, true))\n });\n });\n}\n/**\n * This allows the config system to support translation overrides for namespaces that\n * do not correspond to modules.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param namespace\n */ function registerTranslationNamespace(namespace) {\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, namespace, translationOverridesSchema))\n });\n });\n}\n/**\n * This defines a configuration schema for an extension. When a schema is defined\n * for an extension, that extension will receive the configuration corresponding\n * to that schema, rather than the configuration corresponding to the module\n * in which it is defined.\n *\n * The schema tells the configuration system how the module can be configured.\n * It specifies what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param extensionName Name of the extension the schema is being defined for.\n * Should match the `name` of one of the `extensions` entries defined in\n * the app's `routes.json` file.\n * @param schema The config schema for the extension\n */ function defineExtensionConfigSchema(extensionName, schema) {\n validateConfigSchema(extensionName, schema);\n var enhancedSchema = mergeDeepReplace(schema, implicitConfigSchema);\n var state = _state_js__rspack_import_3.configInternalStore.getState();\n if (state.schemas[extensionName]) {\n console.error(\"Config schema for extension \".concat(extensionName, \" already exists. If there are multiple extensions with this same name, one will probably crash.\"));\n }\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, extensionName, enhancedSchema))\n });\n });\n}\n/**\n * Provides configuration values programmatically. This is an alternative to\n * providing configuration through the config-file. Configuration provided this\n * way will be merged with configuration from other sources.\n *\n * @param config A configuration object to merge into the existing configuration.\n * @param sourceName An optional name to identify the source of this configuration,\n * used for debugging purposes. Defaults to 'provided'.\n */ function provide(config) {\n var sourceName = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'provided';\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n providedConfigs: _to_consumable_array(state.providedConfigs).concat([\n {\n source: sourceName,\n config: config\n }\n ])\n });\n });\n}\n/**\n * A promise-based way to access the config as soon as it is fully loaded.\n * If it is already loaded, resolves the config in its present state.\n *\n * This is a useful function if you need to get the config in the course\n * of the execution of a function.\n *\n * @param moduleName The name of the module for which to look up the config\n */ function getConfig(moduleName) {\n return new Promise(function(resolve) {\n var update = function update(state) {\n if (state.loaded && state.config) {\n var config = (0,lodash_es__rspack_import_6[\"default\"])(state.config, [\n 'Display conditions',\n 'Translation overrides'\n ]);\n resolve(config);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var store = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n update(store.getState());\n var unsubscribe = store.subscribe(update);\n });\n}\n/**\n * Retrieves translation overrides for an extension, optionally scoped to a specific\n * extension slot. When called with only a module name, retrieves module-level overrides.\n * Translation overrides allow customizing translated strings without modifying the\n * original translation files.\n *\n * @param moduleName The name of the module providing the translation context.\n * @param slotName Optional extension slot name to include slot-specific overrides.\n * @param extensionId Optional extension ID to include extension-specific overrides.\n * @returns A Promise resolving to an array of translation override objects.\n *\n * @internal\n */ function getTranslationOverrides(moduleName, slotName, extensionId) {\n var promises = [\n new Promise(function(resolve) {\n var update = function update(state) {\n if (state.translationOverridesLoaded && state.config) {\n var _state_config_Translationoverrides;\n var translationOverrides = (_state_config_Translationoverrides = state.config['Translation overrides']) !== null && _state_config_Translationoverrides !== void 0 ? _state_config_Translationoverrides : {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var configStore = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n update(configStore.getState());\n var unsubscribe = configStore.subscribe(update);\n })\n ];\n if (slotName && extensionId) {\n promises.push(new Promise(function(resolve) {\n var update = function update(state) {\n if (state.loaded && state.config) {\n var _state_config_Translationoverrides;\n var translationOverrides = (_state_config_Translationoverrides = state.config['Translation overrides']) !== null && _state_config_Translationoverrides !== void 0 ? _state_config_Translationoverrides : {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var configStore = (0,_state_js__rspack_import_3.getExtensionConfig)(slotName, extensionId);\n update(configStore.getState());\n var unsubscribe = configStore.subscribe(update);\n }));\n }\n return Promise.all(promises);\n}\n/**\n * Validate and interpolate defaults for `providedConfig` according to `schema`\n *\n * @param schema a configuration schema\n * @param providedConfig an object of config values (without the top-level module name)\n * @param keyPathContext a dot-separated string which helps the user figure out where\n * the provided config came from\n * @returns The validated and processed configuration object with defaults applied.\n * @internal\n */ function processConfig(schema, providedConfig, keyPathContext) {\n validateStructure(schema, providedConfig, keyPathContext);\n var config = setDefaults(schema, providedConfig);\n runAllValidatorsInConfigTree(schema, config, keyPathContext);\n return config;\n}\n/*\n * Helper functions\n *\n */ /**\n * Returns the configuration for an extension. This configuration is specific\n * to the slot in which it is mounted, and its ID within that slot.\n *\n * The schema for that configuration is the extension schema. If no extension\n * schema has been provided, the schema used is the schema of the module in\n * which the extension is defined.\n *\n * @param slotModuleName The name of the module which defines the extension slot\n * @param extensionModuleName The name of the module which defines the extension (and therefore the config schema)\n * @param slotName The name of the extension slot where the extension is mounted\n * @param extensionId The ID of the extension in its slot\n */ function computeExtensionConfig(slotModuleName, extensionModuleName, slotName, extensionId, configState, tempConfigState) {\n var _ref;\n var _slotModuleConfig_extensionSlots_slotName_configure, _slotModuleConfig_extensionSlots_slotName, _slotModuleConfig_extensionSlots;\n var extensionName = getExtensionNameFromId(extensionId);\n var extensionConfigSchema = configState.schemas[extensionName];\n var nameOfSchemaSource = extensionConfigSchema ? extensionName : extensionModuleName;\n var providedConfigs = getProvidedConfigs(configState, tempConfigState);\n var slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n var configOverride = (_ref = slotModuleConfig === null || slotModuleConfig === void 0 ? void 0 : (_slotModuleConfig_extensionSlots = slotModuleConfig.extensionSlots) === null || _slotModuleConfig_extensionSlots === void 0 ? void 0 : (_slotModuleConfig_extensionSlots_slotName = _slotModuleConfig_extensionSlots[slotName]) === null || _slotModuleConfig_extensionSlots_slotName === void 0 ? void 0 : (_slotModuleConfig_extensionSlots_slotName_configure = _slotModuleConfig_extensionSlots_slotName.configure) === null || _slotModuleConfig_extensionSlots_slotName_configure === void 0 ? void 0 : _slotModuleConfig_extensionSlots_slotName_configure[extensionId]) !== null && _ref !== void 0 ? _ref : {};\n var extensionConfig = mergeConfigsFor(nameOfSchemaSource, providedConfigs);\n var combinedConfig = mergeConfigs([\n extensionConfig,\n configOverride\n ]);\n var schema = extensionConfigSchema !== null && extensionConfigSchema !== void 0 ? extensionConfigSchema : configState.schemas[extensionModuleName];\n validateStructure(schema, combinedConfig, nameOfSchemaSource);\n var config = setDefaults(schema, combinedConfig);\n runAllValidatorsInConfigTree(schema, config, nameOfSchemaSource);\n delete config.extensionSlots;\n return config;\n}\nfunction getImplementerToolsConfig(configState, tempConfigState) {\n var result = getSchemaWithValuesAndSources((0,lodash_es__rspack_import_7[\"default\"])(configState.schemas));\n var configsAndSources = _to_consumable_array(configState.providedConfigs.map(function(c) {\n return [\n c.config,\n c.source\n ];\n })).concat([\n [\n tempConfigState.config,\n 'temporary config'\n ]\n ]);\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = configsAndSources[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _step_value = _sliced_to_array(_step.value, 2), config = _step_value[0], source = _step_value[1];\n result = mergeConfigs([\n result,\n createValuesAndSourcesTree(config, source)\n ]);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return result;\n}\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty('_default')) {\n return _object_spread_props(_object_spread({}, schema), {\n _value: schema._default,\n _source: 'default'\n });\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce(function(obj, key) {\n obj[key] = getSchemaWithValuesAndSources(schema[key]);\n return obj;\n }, {});\n } else {\n // at this point, the schema is bad and an error will have been logged during schema validation\n return {};\n }\n}\nfunction createValuesAndSourcesTree(config, source) {\n if (isOrdinaryObject(config)) {\n return Object.keys(config).reduce(function(obj, key) {\n obj[key] = createValuesAndSourcesTree(config[key], source);\n return obj;\n }, {});\n } else {\n return {\n _value: config,\n _source: source\n };\n }\n}\nfunction getExtensionSlotConfigs(configState, tempConfigState) {\n var allConfigs = mergeConfigs(getProvidedConfigs(configState, tempConfigState));\n var slotConfigPerModule = Object.keys(allConfigs).reduce(function(obj, key) {\n var _allConfigs_key;\n if ((_allConfigs_key = allConfigs[key]) === null || _allConfigs_key === void 0 ? void 0 : _allConfigs_key.extensionSlots) {\n var _allConfigs_key1;\n obj[key] = (_allConfigs_key1 = allConfigs[key]) === null || _allConfigs_key1 === void 0 ? void 0 : _allConfigs_key1.extensionSlots;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n var slotConfigs = Object.keys(slotConfigPerModule).reduce(function(obj, key) {\n obj = _object_spread({}, obj, slotConfigPerModule[key]);\n return obj;\n }, {});\n return slotConfigs;\n}\nfunction validateAllExtensionSlotConfigs(slotConfigPerModule) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.entries(slotConfigPerModule)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _step_value = _sliced_to_array(_step.value, 2), moduleName = _step_value[0], configBySlotName = _step_value[1];\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;\n try {\n for(var _iterator1 = Object.entries(configBySlotName)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){\n var _step_value1 = _sliced_to_array(_step1.value, 2), slotName = _step_value1[0], config = _step_value1[1];\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally{\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction validateExtensionSlotConfig(config, moduleName, slotName) {\n var keyPath = \"\".concat(moduleName, \".extensionSlots.\").concat(slotName);\n var errorPrefix = \"Extension slot config '\".concat(keyPath, \"'\");\n var invalidKeys = Object.keys(config).filter(function(k) {\n return ![\n 'add',\n 'remove',\n 'order',\n 'configure'\n ].includes(k);\n });\n if (invalidKeys.length) {\n logError(keyPath, errorPrefix + \"' contains invalid keys '\".concat(invalidKeys.join(\"', '\"), \"'\"));\n }\n if (config.add) {\n if (!Array.isArray(config.add) || !config.add.every(function(n) {\n return typeof n === 'string';\n })) {\n logError(keyPath, errorPrefix + \".add' is invalid. Must be an array of strings (extension IDs)\");\n }\n }\n if (config.remove) {\n if (!Array.isArray(config.remove) || !config.remove.every(function(n) {\n return typeof n === 'string';\n })) {\n logError(keyPath, errorPrefix + \".remove' is invalid. Must be an array of strings (extension IDs)\");\n }\n }\n if (config.order) {\n if (!Array.isArray(config.order) || !config.order.every(function(n) {\n return typeof n === 'string';\n })) {\n logError(keyPath, errorPrefix + \".order' is invalid. Must be an array of strings (extension IDs)\");\n }\n }\n if (config.configure) {\n if (!isOrdinaryObject(config.configure)) {\n logError(keyPath, errorPrefix + \".configure' is invalid. Must be an object with extension IDs for keys\");\n }\n }\n}\nfunction getProvidedConfigs(configState, tempConfigState) {\n return _to_consumable_array(configState.providedConfigs.map(function(c) {\n return c.config;\n })).concat([\n tempConfigState.config\n ]);\n}\n/**\n * Validates the config schema for a module. Since problems identified here are programming errors\n * that hopefully will be caught during development, this function logs errors to the console directly;\n * it's fine if we spam the user with these errors.\n */ function validateConfigSchema(moduleName, schema) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n var updateMessage = \"Please verify that you are running the latest version and, if so, alert the maintainer.\";\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(schema).filter(function(k) {\n return !k.startsWith('_');\n })[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var thisKeyPath = keyPath + (keyPath && '.') + key;\n var schemaPart = schema[key];\n if (thisKeyPath === 'Display conditions') {\n console.error(\"\".concat(moduleName, ' declares a configuration option called \"Display conditions\"; the \"Display conditions\" option is a reserved name. ').concat(updateMessage));\n }\n if (thisKeyPath === 'Translation overrides') {\n console.error(\"\".concat(moduleName, ' declares a configuration option called \"Translation overrides\"; the \"Translation overrides\" option is a reserved name. ').concat(updateMessage));\n }\n if (!isOrdinaryObject(schemaPart)) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage));\n continue;\n }\n if (!schemaPart.hasOwnProperty('_default')) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n var elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + '._elements');\n }\n if (schemaPart._validators) {\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;\n try {\n for(var _iterator1 = schemaPart._validators[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){\n var _$validator = _step1.value;\n if (typeof _$validator !== 'function') {\n console.error(\"\".concat(moduleName, \" has invalid validator for key '\").concat(thisKeyPath, \"' \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: validators must be functions that return either \" + \"undefined or an error string. Received \".concat(_$validator, \".\"));\n }\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally{\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n var valueType = schemaPart._type;\n if (valueType && !Object.values(_types_js__rspack_import_0.Type).includes(valueType)) {\n console.error(\"\".concat(moduleName, \" has invalid type for key '\").concat(thisKeyPath, \"' \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: the allowed types are \".concat(Object.values(_types_js__rspack_import_0.Type).join(', '), \". \") + \"Received '\".concat(valueType, \"'\"));\n }\n if (Object.keys(schemaPart).every(function(k) {\n return [\n '_description',\n '_validators',\n '_elements',\n '_type'\n ].includes(k);\n }) && !keyPath.includes('._elements')) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: all config elements must have a default. \" + \"Received \".concat(JSON.stringify(schemaPart)));\n }\n if (elements && valueType && ![\n _types_js__rspack_import_0.Type.Array,\n _types_js__rspack_import_0.Type.Object\n ].includes(valueType)) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. \" + \"Received \".concat(JSON.stringify(valueType)));\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction getConfigForModule(moduleName, configState, tempConfigState) {\n var schema = configState.schemas[moduleName];\n var inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n validateStructure(schema, inputConfig, moduleName);\n var config = setDefaults(schema, inputConfig);\n runAllValidatorsInConfigTree(schema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction getConfigForModuleImplicitSchema(moduleName, configState, tempConfigState) {\n var inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n var config = setDefaults(implicitConfigSchema, inputConfig);\n runAllValidatorsInConfigTree(implicitConfigSchema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction mergeConfigsFor(moduleName, allConfigs) {\n var allConfigsForModule = allConfigs.map(function(param) {\n var c = param[moduleName];\n return c;\n }).filter(function(c) {\n return !!c;\n });\n return mergeConfigs(allConfigsForModule);\n}\nfunction mergeConfigs(configs) {\n return configs.reduce(function(acc, config) {\n return mergeDeepReplace(acc, config);\n }, {});\n}\n/**\n * Recursively check the provided config tree to make sure that all\n * of the provided properties exist in the schema, and that types are\n * correct. Does not run validators yet, since those will be run on\n * the config with the defaults filled in.\n */ function validateStructure(schema, config) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n // validate each constituent element\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n var thisKeyPath = keyPath + '.' + key;\n var schemaPart = schema[key];\n if (!schema.hasOwnProperty(key)) {\n if (!(key === 'extensionSlots' && keyPath !== '')) {\n logError(thisKeyPath, \"Unknown config key '\".concat(thisKeyPath, \"' provided. Ignoring.\"));\n }\n continue;\n }\n validateBranchStructure(schemaPart, value, thisKeyPath);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction validateBranchStructure(schemaPart, value, keyPath) {\n checkType(keyPath, schemaPart._type, value);\n if (isOrdinaryObject(value)) {\n if (schemaPart._type === _types_js__rspack_import_0.Type.Object) {\n // validate as freeform object\n validateFreeformObjectStructure(schemaPart, value, keyPath);\n } else if (!(schemaPart.hasOwnProperty('_default') || schemaPart.hasOwnProperty('_type'))) {\n // validate as normal nested config\n validateStructure(schemaPart, value, keyPath);\n }\n } else {\n if (schemaPart._type === _types_js__rspack_import_0.Type.Array) {\n validateArrayStructure(schemaPart, value, keyPath);\n }\n }\n}\nfunction validateFreeformObjectStructure(freeformObjectSchema, config, keyPath) {\n if (freeformObjectSchema._elements) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n validateBranchStructure(freeformObjectSchema._elements, value, \"\".concat(keyPath, \".\").concat(key));\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n}\nfunction validateArrayStructure(arraySchema, value, keyPath) {\n var validatedAsArray = checkType(keyPath, _types_js__rspack_import_0.Type.Array, value);\n if (!validatedAsArray) {\n return;\n }\n // if there is an array element object schema, verify that elements match it\n if (hasObjectSchema(arraySchema._elements)) {\n for(var i = 0; i < value.length; i++){\n validateBranchStructure(arraySchema._elements, value[i], \"\".concat(keyPath, \"[\").concat(i, \"]\"));\n }\n }\n for(var i1 = 0; i1 < value.length; i1++){\n var _arraySchema__elements;\n checkType(\"\".concat(keyPath, \"[\").concat(i1, \"]\"), (_arraySchema__elements = arraySchema._elements) === null || _arraySchema__elements === void 0 ? void 0 : _arraySchema__elements._type, value[i1]);\n }\n}\n/**\n * Run all the validators in the config tree. This should be run\n * on the config object after it has been filled in with all the defaults, since\n * higher-level validators may refer to default values.\n */ function runAllValidatorsInConfigTree(schema, config) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n // If `!schema`, there should have been a structural validation error printed already.\n if (schema) {\n if (config !== schema._default) {\n runValidators(keyPath, schema._validators, config);\n }\n if (isOrdinaryObject(config)) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n var thisKeyPath = keyPath + '.' + key;\n var schemaPart = schema[key];\n if (schema._type === _types_js__rspack_import_0.Type.Object && schema._elements) {\n runAllValidatorsInConfigTree(schema._elements, value, thisKeyPath);\n } else {\n runAllValidatorsInConfigTree(schemaPart, value, thisKeyPath);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n } else if (Array.isArray(config) && schema._elements) {\n for(var i = 0; i < config.length; i++){\n runAllValidatorsInConfigTree(schema._elements, config[i], \"\".concat(keyPath, \"[\").concat(i, \"]\"));\n }\n }\n }\n}\n/**\n * Run type validation for the value, logging any errors.\n * @returns true if validation passes, false otherwise\n */ function checkType(keyPath, _type, value) {\n if (_type) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n var _$validator = {\n Array: _validators_type_validators_js__rspack_import_1.isArray,\n Boolean: _validators_type_validators_js__rspack_import_1.isBoolean,\n ConceptUuid: _validators_type_validators_js__rspack_import_1.isUuid,\n Number: _validators_type_validators_js__rspack_import_1.isNumber,\n Object: _validators_type_validators_js__rspack_import_1.isObject,\n String: _validators_type_validators_js__rspack_import_1.isString,\n UUID: _validators_type_validators_js__rspack_import_1.isUuid,\n PersonAttributeTypeUuid: _validators_type_validators_js__rspack_import_1.isUuid,\n PatientIdentifierTypeUuid: _validators_type_validators_js__rspack_import_1.isUuid\n };\n return runValidators(keyPath, [\n _$validator[_type]\n ], value);\n }\n return true;\n}\n/**\n * Runs validators, logging errors.\n * @returns true if all pass, false otherwise.\n */ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction runValidators(keyPath, validators, value) {\n var returnValue = true;\n if (validators) {\n try {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = validators[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _$validator = _step.value;\n var validatorResult = _$validator(value);\n if (typeof validatorResult === 'string') {\n var message = (typeof value === \"undefined\" ? \"undefined\" : _type_of(value)) === 'object' ? \"Invalid configuration for \".concat(keyPath, \": \").concat(validatorResult) : \"Invalid configuration value \".concat(value, \" for \").concat(keyPath, \": \").concat(validatorResult);\n logError(keyPath, message);\n returnValue = false;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n } catch (e) {\n console.error('Skipping invalid validator at \"'.concat(keyPath, '\". Encountered error\\n\t').concat(e));\n }\n }\n return returnValue;\n}\n// Recursively fill in the config with values from the schema.\nvar setDefaults = function setDefaults1(schema, inputConfig) {\n var config = structuredClone(inputConfig);\n if (!schema) {\n return config;\n }\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n var _loop = function() {\n var key = _step.value;\n var configPart = config[key];\n var schemaPart = schema[key];\n // The `schemaPart &&` clause of this `if` statement will only fail\n // if the schema is very invalid. It is there to prevent the app from\n // crashing completely, though it will produce unexpected behavior.\n // If this happens, there should be legible errors in the console from\n // the schema validator.\n if (schemaPart && (schemaPart.hasOwnProperty('_type') || schemaPart.hasOwnProperty('_default'))) {\n // We assume that schemaPart defines a config value, since it has\n // a property `_type` or `_default`.\n if (!config.hasOwnProperty(key)) {\n config[key] = schemaPart['_default'];\n }\n // We also check if it is an object or array with object elements, in which case we recurse\n var elements = schemaPart._elements;\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === _types_js__rspack_import_0.Type.Array && Array.isArray(configPart)) {\n var configWithDefaults = configPart.map(function(conf) {\n return setDefaults(elements, conf);\n });\n config[key] = configWithDefaults;\n } else if (schemaPart._type === _types_js__rspack_import_0.Type.Object) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(configPart)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion = (_step1 = _iterator.next()).done); _iteratorNormalCompletion = true){\n var objectKey = _step1.value;\n configPart[objectKey] = setDefaults(elements, configPart[objectKey]);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n }\n } else if (isOrdinaryObject(schemaPart)) {\n // Since schemaPart has no property \"_type\", if it's an ordinary object\n // (unlike, importantly, the validators array), we assume it is a parent config property.\n // We recurse to config[key] and schema[key]. Default config[key] to {}.\n var selectedConfigPart = configPart !== null && configPart !== void 0 ? configPart : {};\n // There will have been a validation error already if configPart is not a plain object.\n if (isOrdinaryObject(selectedConfigPart)) {\n config[key] = setDefaults(schemaPart, selectedConfigPart);\n }\n }\n };\n for(var _iterator = Object.keys(schema)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return config;\n};\nfunction hasObjectSchema(elementsSchema) {\n return !!elementsSchema && Object.keys(elementsSchema).filter(function(e) {\n return ![\n '_default',\n '_validators'\n ].includes(e);\n }).length > 0;\n}\nfunction isOrdinaryObject(value) {\n return (typeof value === \"undefined\" ? \"undefined\" : _type_of(value)) === 'object' && !Array.isArray(value) && value !== null;\n}\n/** Keep track of which validation errors we have displayed. Each one should only be displayed once. */ var displayedValidationMessages = new Set();\nfunction logError(keyPath, message) {\n var key = \"\".concat(keyPath, \":::\").concat(message);\n // technically, this should not be possible, but because of how things wind-up transpiled, this isn't impossible\n if (!displayedValidationMessages) {\n displayedValidationMessages = new Set();\n }\n if (!displayedValidationMessages.has(key)) {\n console.error(message);\n displayedValidationMessages.add(key);\n }\n}\n/**\n * Normally, configuration errors are only displayed once. This function clears the list of\n * displayed errors, so that they will be displayed again.\n *\n * @internal\n */ function clearConfigErrors(keyPath) {\n if (keyPath) {\n displayedValidationMessages.forEach(function(key) {\n if (key.startsWith(keyPath)) {\n displayedValidationMessages.delete(key);\n }\n });\n } else {\n displayedValidationMessages.clear();\n }\n}\n/**\n * Cleans up all config store subscriptions and re-establishes them. This is primarily\n * useful for testing, where subscriptions set up at module load time need to be cleared\n * between tests to prevent infinite update loops. After clearing, subscriptions are\n * re-established so the config system continues to work normally.\n *\n * @internal\n */ function resetConfigSystem() {\n configSubscriptions.forEach(function(unsubscribe) {\n return unsubscribe();\n });\n configSubscriptions.length = 0;\n setupConfigSubscriptions();\n}\n/**\n * Copied over from esm-extensions. It rightly belongs to that module, but esm-config\n * cannot depend on esm-extensions.\n */ function getExtensionNameFromId(extensionId) {\n var _extensionId_split = _sliced_to_array(extensionId.split('#'), 1), extensionName = _extensionId_split[0];\n return extensionName;\n}\n/**\n * The translation overrides schema is used in the implicit schema given to every module;\n * plus any additional translation namespaces (at time of writing, this is just 'core').\n */ var translationOverridesSchema = {\n 'Translation overrides': {\n _description: 'Per-language overrides for frontend translations should be keyed by language code and each language dictionary contains the translation key and the display value',\n _type: _types_js__rspack_import_0.Type.Object,\n _default: {},\n _validators: [\n (0,_validators_validator_js__rspack_import_2.validator)(function(o) {\n return Object.keys(o).every(function(k) {\n return /^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k);\n });\n }, function(o) {\n var badKeys = Object.keys(o).filter(function(k) {\n return !/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k);\n });\n return \"The 'Translation overrides' object should have language codes for keys. Language codes must be in the form of a two-to-three letter language code optionally followed by a hyphen and a two-to-three letter country code. The following keys do not conform: \".concat(badKeys.join(', '), \".\");\n })\n ]\n }\n};\n/**\n * The implicitConfigSchema is implicitly included in every configuration schema\n */ var implicitConfigSchema = _object_spread({\n 'Display conditions': {\n privileges: {\n _description: 'The privilege(s) the user must have to use this extension',\n _type: _types_js__rspack_import_0.Type.Array,\n _default: []\n },\n expression: {\n _description: 'The expression that determines whether the extension is displayed',\n _type: _types_js__rspack_import_0.Type.String,\n _default: undefined\n }\n }\n}, translationOverridesSchema);\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvbW9kdWxlLWNvbmZpZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanM/YzNhNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQ29uZmlnICovIGltcG9ydCB7IGNsb25lRGVlcCwgaXNFcXVhbCwgbWVyZ2VXaXRoLCBvbWl0IGFzIGxvZGFzaE9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBpc0FycmF5LCBpc0Jvb2xlYW4sIGlzVXVpZCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gXCIuLi92YWxpZGF0b3JzL3R5cGUtdmFsaWRhdG9ycy5qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdmFsaWRhdG9yLmpzXCI7XG5pbXBvcnQgeyBjb25maWdFeHRlbnNpb25TdG9yZSwgY29uZmlnSW50ZXJuYWxTdG9yZSwgZ2V0Q29uZmlnU3RvcmUsIGdldEV4dGVuc2lvbkNvbmZpZywgZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSwgZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLCBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlIH0gZnJvbSBcIi4vc3RhdGUuanNcIjtcbi8qKlxuICogRGVlcCBtZXJnZSB0d28gb2JqZWN0cywgd2l0aCByaWdodC1zaWRlIHZhbHVlcyB0YWtpbmcgcHJlY2VkZW5jZS5cbiAqIEFycmF5cyBhcmUgcmVwbGFjZWQgZW50aXJlbHkgKG5vdCBtZXJnZWQgYnkgaW5kZXgpLCBtYXRjaGluZyB0aGVcbiAqIGJlaGF2aW9yIG9mIHJhbWRhJ3MgbWVyZ2VEZWVwUmlnaHQuXG4gKi8gZnVuY3Rpb24gbWVyZ2VEZWVwUmVwbGFjZShsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBtZXJnZVdpdGgoe30sIGxlZnQsIHJpZ2h0LCAoX29ialZhbHVlLCBzcmNWYWx1ZSk9PntcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogU3RvcmUgc2V0dXBcbiAqXG4gKlxuICogU2V0IHVwIHN0b3JlcyBhbmQgc3Vic2NyaXB0aW9ucyBzbyB0aGF0IGlucHV0cyBnZXQgcHJvY2Vzc2VkIGFwcHJvcHJpYXRlbHkuXG4gKlxuICogVGhlcmUgYXJlICppbnB1dCogc3RvcmVzIGFuZCAqb3V0cHV0KiBzdG9yZXMuIFRoZSAqaW5wdXQqIHN0b3Jlc1xuICogYXJlIGNvbmZpZ0ludGVybmFsU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlLCBhbmQgY29uZmlnRXh0ZW5zaW9uU3RvcmUuIFRoZVxuICogb3V0cHV0IHN0b3JlcyBhcmUgc2V0IGluIHRoZSBgY29tcHV0ZS4uLmAgZnVuY3Rpb25zLiBUaGV5IGFyZSB0aGUgbW9kdWxlXG4gKiBjb25maWcgc3RvcmVzLCB0aGUgZXh0ZW5zaW9uIHNsb3QgY29uZmlnIHN0b3JlcyAoYnkgbW9kdWxlKSwgdGhlIGV4dGVuc2lvblxuICogY29uZmlnIHN0b3JlcywgYW5kIHRoZSBpbXBsZW1lbnRlciB0b29scyBjb25maWcgc3RvcmUuXG4gKlxuICogVGhpcyBjb2RlIHNldHMgdXAgdGhlIHN1YnNjcmlwdGlvbnMgc28gdGhhdCB3aGVuIGFuIGlucHV0IHN0b3JlIGNoYW5nZXMsXG4gKiB0aGUgY29ycmVjdCBzZXQgb2Ygb3V0cHV0IHN0b3JlcyBhcmUgdXBkYXRlZC5cbiAqXG4gKiBBbGwgYGNvbXB1dGUuLi5gIGZ1bmN0aW9ucyBleGNlcHQgYGNvbXB1dGVFeHRlbnNpb25Db25maWdzYCBhcmUgcHVyZVxuICogKG9yIGFyZSBzdXBwb3NlZCB0byBiZSksIG90aGVyIHRoYW4gdGhlIGZhY3QgdGhhdCB0aGV5IGFsbCBgc2V0U3RhdGVgXG4gKiBzdG9yZSB2YWx1ZXMgYXQgdGhlIGVuZC4gYGNvbXB1dGVFeHRlbnNpb25Db25maWdzYCBjYWxscyBgZ2V0R2xvYmFsU3RvcmVgLFxuICogd2hpY2ggY3JlYXRlcyBzdG9yZXMuXG4gKi8gLy8gU3RvcmUgdW5zdWJzY3JpYmUgZnVuY3Rpb25zIHRvIGFsbG93IGNsZWFudXAgKGUuZy4sIGluIHRlc3RzIG9yIGhvdCBtb2R1bGUgcmVsb2FkaW5nKVxuY29uc3QgY29uZmlnU3Vic2NyaXB0aW9ucyA9IFtdO1xuLyoqXG4gKiBSZWNvbXB1dGVzIGFsbCBjb25maWd1cmF0aW9uIGRlcml2ZWQgc3RvcmVzIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgb2YgaW5wdXQgc3RvcmVzLlxuICogQ2FsbGVkIHdoZW5ldmVyIGFueSBpbnB1dCBzdG9yZSAoY29uZmlnSW50ZXJuYWxTdG9yZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUsIGNvbmZpZ0V4dGVuc2lvblN0b3JlKSBjaGFuZ2VzLlxuICovIGZ1bmN0aW9uIHJlY29tcHV0ZUFsbENvbmZpZ3MoKSB7XG4gICAgY29uc3QgY29uZmlnU3RhdGUgPSBjb25maWdJbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgdGVtcENvbmZpZ1N0YXRlID0gdGVtcG9yYXJ5Q29uZmlnU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBleHRlbnNpb25TdGF0ZSA9IGNvbmZpZ0V4dGVuc2lvblN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29tcHV0ZU1vZHVsZUNvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlSW1wbGVtZW50ZXJUb29sc0NvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MoY29uZmlnU3RhdGUsIGV4dGVuc2lvblN0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xufVxuZnVuY3Rpb24gc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCkge1xuICAgIC8vIEluaXRpYWwgY29tcHV0YXRpb25cbiAgICByZWNvbXB1dGVBbGxDb25maWdzKCk7XG4gICAgLy8gU3Vic2NyaWJlIHRvIGFsbCBpbnB1dCBzdG9yZXMgd2l0aCBhIHNpbmdsZSBoYW5kbGVyXG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIG9ubHkgcmVjb21wdXRlIG9uY2UgZXZlbiBpZiBtdWx0aXBsZSBzdG9yZXMgY2hhbmdlIHNpbXVsdGFuZW91c2x5XG4gICAgY29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKGNvbmZpZ0ludGVybmFsU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2godGVtcG9yYXJ5Q29uZmlnU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2goY29uZmlnRXh0ZW5zaW9uU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbn1cbi8vIFNldCB1cCBzdWJzY3JpcHRpb25zIGF0IG1vZHVsZSBsb2FkIHRpbWVcbnNldHVwQ29uZmlnU3Vic2NyaXB0aW9ucygpO1xuZnVuY3Rpb24gY29tcHV0ZU1vZHVsZUNvbmZpZyhzdGF0ZSwgdGVtcFN0YXRlKSB7XG4gICAgZm9yIChsZXQgbW9kdWxlTmFtZSBvZiBPYmplY3Qua2V5cyhzdGF0ZS5zY2hlbWFzKSl7XG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNjaGVtYSBjb3VsZCBiZSBlaXRoZXIganVzdCB0aGUgaW1wbGljaXQgc2NoZW1hIG9yIHRoZSBhY3R1YWxseVxuICAgICAgICAvLyBkZWZpbmVkIHNjaGVtYS4gV2UgcnVuIHdpdGgganVzdCB0aGUgaW1wbGljaXQgc2NoZW1hIGJlY2F1c2Ugd2Ugd2FudCB0byBwb3B1bGF0ZVxuICAgICAgICAvLyB0aGUgY29uZmlnIHN0b3JlIHdpdGggdGhlIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBhcyBzb29uIGFzIHBvc3NpYmxlLiBJbiBmYWN0LCB0aGVcbiAgICAgICAgLy8gdHJhbnNsYXRpb24gc3lzdGVtIHdpbGwgdGhyb3cgZm9yIFN1c3BlbnNlIHVudGlsIHRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgYXJlXG4gICAgICAgIC8vIGF2YWlsYWJsZSwgd2hpY2ggYXMgb2YgdGhpcyB3cml0aW5nIGJsb2NrcyB0aGUgc2NoZW1hIGRlZmluaXRpb24gZnJvbSBvY2N1cnJpbmdcbiAgICAgICAgLy8gZm9yIG1vZHVsZXMgbG9hZGVkIGJhc2VkIG9uIHRoZWlyIGV4dGVuc2lvbnMuXG4gICAgICAgIGNvbnN0IG1vZHVsZVN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGxldCBuZXdTdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlLm1vZHVsZUxvYWRlZFttb2R1bGVOYW1lXSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRm9yTW9kdWxlKG1vZHVsZU5hbWUsIHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zvck1vZHVsZUltcGxpY2l0U2NoZW1hKG1vZHVsZU5hbWUsIHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbW9kdWxlU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyhzdGF0ZSwgdGVtcFN0YXRlKSB7XG4gICAgY29uc3Qgc2xvdENvbmZpZ3MgPSBnZXRFeHRlbnNpb25TbG90Q29uZmlncyhzdGF0ZSwgdGVtcFN0YXRlKTtcbiAgICBjb25zdCBuZXdTbG90U3RvcmVFbnRyaWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNsb3RDb25maWdzKS5tYXAoKFtzbG90TmFtZSwgY29uZmlnXSk9PltcbiAgICAgICAgICAgIHNsb3ROYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSkpO1xuICAgIGNvbnN0IHNsb3RTdG9yZSA9IGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IHNsb3RTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgLi4ub2xkU3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAuLi5uZXdTbG90U3RvcmVFbnRyaWVzXG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmICghaXNFcXVhbChvbGRTdGF0ZS5zbG90cywgbmV3U3RhdGUuc2xvdHMpKSB7XG4gICAgICAgIHNsb3RTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0SW1wbGVtZW50ZXJUb29sc0NvbmZpZyhzdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgY29uZmlnXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSBvbiB0aGUgYWN0dWFsIGNvbmZpZyBjb250ZW50LCBub3QgdGhlIHdyYXBwZXIgb2JqZWN0XG4gICAgaWYgKCFpc0VxdWFsKG9sZFN0YXRlLmNvbmZpZywgbmV3U3RhdGUuY29uZmlnKSkge1xuICAgICAgICBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ1N0YXRlLCBleHRlbnNpb25TdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBtb2R1bGUgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgc2luY2UgdGhlIGV4dGVuc2lvblxuICAgIC8vIGl0IGNvbnRhaW5zIGlzIG1vdW50ZWQuXG4gICAgZm9yIChsZXQgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvblN0YXRlLm1vdW50ZWRFeHRlbnNpb25zKXtcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhleHRlbnNpb24uc2xvdE1vZHVsZU5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25Nb2R1bGVOYW1lLCBleHRlbnNpb24uc2xvdE5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25JZCwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgICAgIGlmICghY29uZmlnc1tleHRlbnNpb24uc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV1bZXh0ZW5zaW9uLmV4dGVuc2lvbklkXSA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zQ29uZmlnU3RvcmUgPSBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBjb25maWdzXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSB0byBvbmx5IHVwZGF0ZSBpZiBjb25maWdzIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAoIWlzRXF1YWwob2xkU3RhdGUuY29uZmlncywgbmV3U3RhdGUuY29uZmlncykpIHtcbiAgICAgICAgZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9XG59XG4vKlxuICogQVBJXG4gKlxuICovIC8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGEgbW9kdWxlLiBUaGUgc2NoZW1hIHRlbGxzIHRoZVxuICogY29uZmlndXJhdGlvbiBzeXN0ZW0gaG93IHRoZSBtb2R1bGUgY2FuIGJlIGNvbmZpZ3VyZWQuIEl0IHNwZWNpZmllc1xuICogd2hhdCBtYWtlcyBjb25maWd1cmF0aW9uIHZhbGlkIG9yIGludmFsaWQuXG4gKlxuICogU2VlIFtDb25maWd1cmF0aW9uIFN5c3RlbV0oaHR0cHM6Ly9vMy1kb2NzLm9wZW5tcnMub3JnL2RvY3MvY29uZmlndXJhdGlvbi1zeXN0ZW0pXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkZWZpbmluZyBhIGNvbmZpZyBzY2hlbWEuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgTmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBzY2hlbWEgaXMgYmVpbmcgZGVmaW5lZCBmb3IuIEdlbmVyYWxseVxuICogICBzaG91bGQgYmUgdGhlIG9uZSBpbiB3aGljaCB0aGUgYGRlZmluZUNvbmZpZ1NjaGVtYWAgY2FsbCB0YWtlcyBwbGFjZS5cbiAqIEBwYXJhbSBzY2hlbWEgVGhlIGNvbmZpZyBzY2hlbWEgZm9yIHRoZSBtb2R1bGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSkge1xuICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSk7XG4gICAgY29uc3QgZW5oYW5jZWRTY2hlbWEgPSBtZXJnZURlZXBSZXBsYWNlKHNjaGVtYSwgaW1wbGljaXRDb25maWdTY2hlbWEpO1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsZXJ0cyB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gdGhhdCBhIG1vZHVsZSBleGlzdHMuIFRoaXMgYWxsb3dzIGNvbmZpZyB0byBiZVxuICogcHJvY2Vzc2VkLCB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgZXh0ZW5zaW9uIHN5c3RlbSB0byBrbm93IHdoZXRoZXIgdGhlIG1vZHVsZSBoYXNcbiAqIGFjdHVhbGx5IGhhZCBpdHMgZnJvbnQgYnVuZGxlIGV4ZWN1dGVkIHlldC5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gZXNtLWFwcC1zaGVsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSBtb2R1bGVOYW1lXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlV2l0aENvbmZpZ1N5c3RlbShtb2R1bGVOYW1lKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2NoZW1hcyxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IGltcGxpY2l0Q29uZmlnU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBhbGVydHMgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIHRoYXQgYSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG1vZHVsZU5hbWVcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVMb2FkKG1vZHVsZU5hbWUpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsbG93cyB0aGUgY29uZmlnIHN5c3RlbSB0byBzdXBwb3J0IHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgbmFtZXNwYWNlcyB0aGF0XG4gKiBkbyBub3QgY29ycmVzcG9uZCB0byBtb2R1bGVzLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG5hbWVzcGFjZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlKG5hbWVzcGFjZSkge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW25hbWVzcGFjZV06IHRyYW5zbGF0aW9uT3ZlcnJpZGVzU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGFuIGV4dGVuc2lvbi4gV2hlbiBhIHNjaGVtYSBpcyBkZWZpbmVkXG4gKiBmb3IgYW4gZXh0ZW5zaW9uLCB0aGF0IGV4dGVuc2lvbiB3aWxsIHJlY2VpdmUgdGhlIGNvbmZpZ3VyYXRpb24gY29ycmVzcG9uZGluZ1xuICogdG8gdGhhdCBzY2hlbWEsIHJhdGhlciB0aGFuIHRoZSBjb25maWd1cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZVxuICogaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC5cbiAqXG4gKiBUaGUgc2NoZW1hIHRlbGxzIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBob3cgdGhlIG1vZHVsZSBjYW4gYmUgY29uZmlndXJlZC5cbiAqIEl0IHNwZWNpZmllcyB3aGF0IG1ha2VzIGNvbmZpZ3VyYXRpb24gdmFsaWQgb3IgaW52YWxpZC5cbiAqXG4gKiBTZWUgW0NvbmZpZ3VyYXRpb24gU3lzdGVtXShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZG9jcy9jb25maWd1cmF0aW9uLXN5c3RlbSlcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlZmluaW5nIGEgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBOYW1lIG9mIHRoZSBleHRlbnNpb24gdGhlIHNjaGVtYSBpcyBiZWluZyBkZWZpbmVkIGZvci5cbiAqICAgU2hvdWxkIG1hdGNoIHRoZSBgbmFtZWAgb2Ygb25lIG9mIHRoZSBgZXh0ZW5zaW9uc2AgZW50cmllcyBkZWZpbmVkIGluXG4gKiAgIHRoZSBhcHAncyBgcm91dGVzLmpzb25gIGZpbGUuXG4gKiBAcGFyYW0gc2NoZW1hIFRoZSBjb25maWcgc2NoZW1hIGZvciB0aGUgZXh0ZW5zaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbkNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpO1xuICAgIGNvbnN0IGVuaGFuY2VkU2NoZW1hID0gbWVyZ2VEZWVwUmVwbGFjZShzY2hlbWEsIGltcGxpY2l0Q29uZmlnU2NoZW1hKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBpZiAoc3RhdGUuc2NoZW1hc1tleHRlbnNpb25OYW1lXSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb25maWcgc2NoZW1hIGZvciBleHRlbnNpb24gJHtleHRlbnNpb25OYW1lfSBhbHJlYWR5IGV4aXN0cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGV4dGVuc2lvbnMgd2l0aCB0aGlzIHNhbWUgbmFtZSwgb25lIHdpbGwgcHJvYmFibHkgY3Jhc2guYCk7XG4gICAgfVxuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW2V4dGVuc2lvbk5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb2dyYW1tYXRpY2FsbHkuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG9cbiAqIHByb3ZpZGluZyBjb25maWd1cmF0aW9uIHRocm91Z2ggdGhlIGNvbmZpZy1maWxlLiBDb25maWd1cmF0aW9uIHByb3ZpZGVkIHRoaXNcbiAqIHdheSB3aWxsIGJlIG1lcmdlZCB3aXRoIGNvbmZpZ3VyYXRpb24gZnJvbSBvdGhlciBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgQSBjb25maWd1cmF0aW9uIG9iamVjdCB0byBtZXJnZSBpbnRvIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZU5hbWUgQW4gb3B0aW9uYWwgbmFtZSB0byBpZGVudGlmeSB0aGUgc291cmNlIG9mIHRoaXMgY29uZmlndXJhdGlvbixcbiAqICAgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBEZWZhdWx0cyB0byAncHJvdmlkZWQnLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm92aWRlKGNvbmZpZywgc291cmNlTmFtZSA9ICdwcm92aWRlZCcpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHByb3ZpZGVkQ29uZmlnczogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnByb3ZpZGVkQ29uZmlncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEEgcHJvbWlzZS1iYXNlZCB3YXkgdG8gYWNjZXNzIHRoZSBjb25maWcgYXMgc29vbiBhcyBpdCBpcyBmdWxseSBsb2FkZWQuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGxvYWRlZCwgcmVzb2x2ZXMgdGhlIGNvbmZpZyBpbiBpdHMgcHJlc2VudCBzdGF0ZS5cbiAqXG4gKiBUaGlzIGlzIGEgdXNlZnVsIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgY29uZmlnIGluIHRoZSBjb3Vyc2VcbiAqIG9mIHRoZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZvciB3aGljaCB0byBsb29rIHVwIHRoZSBjb25maWdcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKG1vZHVsZU5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgIGNvbnN0IHN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBsb2Rhc2hPbWl0KHN0YXRlLmNvbmZpZywgW1xuICAgICAgICAgICAgICAgICAgICAnRGlzcGxheSBjb25kaXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcydcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgYW4gZXh0ZW5zaW9uLCBvcHRpb25hbGx5IHNjb3BlZCB0byBhIHNwZWNpZmljXG4gKiBleHRlbnNpb24gc2xvdC4gV2hlbiBjYWxsZWQgd2l0aCBvbmx5IGEgbW9kdWxlIG5hbWUsIHJldHJpZXZlcyBtb2R1bGUtbGV2ZWwgb3ZlcnJpZGVzLlxuICogVHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFsbG93IGN1c3RvbWl6aW5nIHRyYW5zbGF0ZWQgc3RyaW5ncyB3aXRob3V0IG1vZGlmeWluZyB0aGVcbiAqIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgcHJvdmlkaW5nIHRoZSB0cmFuc2xhdGlvbiBjb250ZXh0LlxuICogQHBhcmFtIHNsb3ROYW1lIE9wdGlvbmFsIGV4dGVuc2lvbiBzbG90IG5hbWUgdG8gaW5jbHVkZSBzbG90LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSBleHRlbnNpb25JZCBPcHRpb25hbCBleHRlbnNpb24gSUQgdG8gaW5jbHVkZSBleHRlbnNpb24tc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbiBvdmVycmlkZSBvYmplY3RzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyhtb2R1bGVOYW1lLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkICYmIHN0YXRlLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbk92ZXJyaWRlcyA9IHN0YXRlLmNvbmZpZ1snVHJhbnNsYXRpb24gb3ZlcnJpZGVzJ10gPz8ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJhbnNsYXRpb25PdmVycmlkZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGUoY29uZmlnU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbmZpZ1N0b3JlLnN1YnNjcmliZSh1cGRhdGUpO1xuICAgICAgICB9KVxuICAgIF07XG4gICAgaWYgKHNsb3ROYW1lICYmIGV4dGVuc2lvbklkKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbkNvbmZpZyhzbG90TmFtZSwgZXh0ZW5zaW9uSWQpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXMgPSBzdGF0ZS5jb25maWdbJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyddID8/IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRyYW5zbGF0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlKGNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb25maWdTdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgaW50ZXJwb2xhdGUgZGVmYXVsdHMgZm9yIGBwcm92aWRlZENvbmZpZ2AgYWNjb3JkaW5nIHRvIGBzY2hlbWFgXG4gKlxuICogQHBhcmFtIHNjaGVtYSAgYSBjb25maWd1cmF0aW9uIHNjaGVtYVxuICogQHBhcmFtIHByb3ZpZGVkQ29uZmlnICBhbiBvYmplY3Qgb2YgY29uZmlnIHZhbHVlcyAod2l0aG91dCB0aGUgdG9wLWxldmVsIG1vZHVsZSBuYW1lKVxuICogQHBhcmFtIGtleVBhdGhDb250ZXh0ICBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHdoaWNoIGhlbHBzIHRoZSB1c2VyIGZpZ3VyZSBvdXQgd2hlcmVcbiAqICAgICB0aGUgcHJvdmlkZWQgY29uZmlnIGNhbWUgZnJvbVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBhbmQgcHJvY2Vzc2VkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggZGVmYXVsdHMgYXBwbGllZC5cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uZmlnKHNjaGVtYSwgcHJvdmlkZWRDb25maWcsIGtleVBhdGhDb250ZXh0KSB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBwcm92aWRlZENvbmZpZywga2V5UGF0aENvbnRleHQpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgcHJvdmlkZWRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIGtleVBhdGhDb250ZXh0KTtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqXG4gKi8gLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZvciBhbiBleHRlbnNpb24uIFRoaXMgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpY1xuICogdG8gdGhlIHNsb3QgaW4gd2hpY2ggaXQgaXMgbW91bnRlZCwgYW5kIGl0cyBJRCB3aXRoaW4gdGhhdCBzbG90LlxuICpcbiAqIFRoZSBzY2hlbWEgZm9yIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGUgZXh0ZW5zaW9uIHNjaGVtYS4gSWYgbm8gZXh0ZW5zaW9uXG4gKiBzY2hlbWEgaGFzIGJlZW4gcHJvdmlkZWQsIHRoZSBzY2hlbWEgdXNlZCBpcyB0aGUgc2NoZW1hIG9mIHRoZSBtb2R1bGUgaW5cbiAqIHdoaWNoIHRoZSBleHRlbnNpb24gaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gc2xvdE1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbk1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gKGFuZCB0aGVyZWZvcmUgdGhlIGNvbmZpZyBzY2hlbWEpXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBzbG90IHdoZXJlIHRoZSBleHRlbnNpb24gaXMgbW91bnRlZFxuICogQHBhcmFtIGV4dGVuc2lvbklkIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIGluIGl0cyBzbG90XG4gKi8gZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhzbG90TW9kdWxlTmFtZSwgZXh0ZW5zaW9uTW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZ1NjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV07XG4gICAgY29uc3QgbmFtZU9mU2NoZW1hU291cmNlID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8gZXh0ZW5zaW9uTmFtZSA6IGV4dGVuc2lvbk1vZHVsZU5hbWU7XG4gICAgY29uc3QgcHJvdmlkZWRDb25maWdzID0gZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbnN0IHNsb3RNb2R1bGVDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3Ioc2xvdE1vZHVsZU5hbWUsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29uZmlnT3ZlcnJpZGUgPSBzbG90TW9kdWxlQ29uZmlnPy5leHRlbnNpb25TbG90cz8uW3Nsb3ROYW1lXT8uY29uZmlndXJlPy5bZXh0ZW5zaW9uSWRdID8/IHt9O1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IG1lcmdlQ29uZmlnc0ZvcihuYW1lT2ZTY2hlbWFTb3VyY2UsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29tYmluZWRDb25maWcgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICBleHRlbnNpb25Db25maWcsXG4gICAgICAgIGNvbmZpZ092ZXJyaWRlXG4gICAgXSk7XG4gICAgY29uc3Qgc2NoZW1hID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8/IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTW9kdWxlTmFtZV07XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb21iaW5lZENvbmZpZywgbmFtZU9mU2NoZW1hU291cmNlKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGNvbWJpbmVkQ29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBuYW1lT2ZTY2hlbWFTb3VyY2UpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGxldCByZXN1bHQgPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhjbG9uZURlZXAoY29uZmlnU3RhdGUuc2NoZW1hcykpO1xuICAgIGNvbnN0IGNvbmZpZ3NBbmRTb3VyY2VzID0gW1xuICAgICAgICAuLi5jb25maWdTdGF0ZS5wcm92aWRlZENvbmZpZ3MubWFwKChjKT0+W1xuICAgICAgICAgICAgICAgIGMuY29uZmlnLFxuICAgICAgICAgICAgICAgIGMuc291cmNlXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgW1xuICAgICAgICAgICAgdGVtcENvbmZpZ1N0YXRlLmNvbmZpZyxcbiAgICAgICAgICAgICd0ZW1wb3JhcnkgY29uZmlnJ1xuICAgICAgICBdXG4gICAgXTtcbiAgICBmb3IgKGxldCBbY29uZmlnLCBzb3VyY2VdIG9mIGNvbmZpZ3NBbmRTb3VyY2VzKXtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VDb25maWdzKFtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlKGNvbmZpZywgc291cmNlKVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldFNjaGVtYVdpdGhWYWx1ZXNBbmRTb3VyY2VzKHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgIF92YWx1ZTogc2NoZW1hLl9kZWZhdWx0LFxuICAgICAgICAgICAgX3NvdXJjZTogJ2RlZmF1bHQnXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNjaGVtYSkucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgICAgIG9ialtrZXldID0gZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMoc2NoZW1hW2tleV0pO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHRoZSBzY2hlbWEgaXMgYmFkIGFuZCBhbiBlcnJvciB3aWxsIGhhdmUgYmVlbiBsb2dnZWQgZHVyaW5nIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZShjb25maWcsIHNvdXJjZSkge1xuICAgIGlmIChpc09yZGluYXJ5T2JqZWN0KGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgICAgIG9ialtrZXldID0gY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUoY29uZmlnW2tleV0sIHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF92YWx1ZTogY29uZmlnLFxuICAgICAgICAgICAgX3NvdXJjZTogc291cmNlXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGFsbENvbmZpZ3MgPSBtZXJnZUNvbmZpZ3MoZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICBjb25zdCBzbG90Q29uZmlnUGVyTW9kdWxlID0gT2JqZWN0LmtleXMoYWxsQ29uZmlncykucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgaWYgKGFsbENvbmZpZ3Nba2V5XT8uZXh0ZW5zaW9uU2xvdHMpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gYWxsQ29uZmlnc1trZXldPy5leHRlbnNpb25TbG90cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sIHt9KTtcbiAgICB2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzKHNsb3RDb25maWdQZXJNb2R1bGUpO1xuICAgIGNvbnN0IHNsb3RDb25maWdzID0gT2JqZWN0LmtleXMoc2xvdENvbmZpZ1Blck1vZHVsZSkucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgb2JqID0ge1xuICAgICAgICAgICAgLi4ub2JqLFxuICAgICAgICAgICAgLi4uc2xvdENvbmZpZ1Blck1vZHVsZVtrZXldXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30pO1xuICAgIHJldHVybiBzbG90Q29uZmlncztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc2xvdENvbmZpZ1Blck1vZHVsZSkge1xuICAgIGZvciAobGV0IFttb2R1bGVOYW1lLCBjb25maWdCeVNsb3ROYW1lXSBvZiBPYmplY3QuZW50cmllcyhzbG90Q29uZmlnUGVyTW9kdWxlKSl7XG4gICAgICAgIGZvciAobGV0IFtzbG90TmFtZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdCeVNsb3ROYW1lKSl7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWcoY29uZmlnLCBtb2R1bGVOYW1lLCBzbG90TmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWcoY29uZmlnLCBtb2R1bGVOYW1lLCBzbG90TmFtZSkge1xuICAgIGNvbnN0IGtleVBhdGggPSBgJHttb2R1bGVOYW1lfS5leHRlbnNpb25TbG90cy4ke3Nsb3ROYW1lfWA7XG4gICAgY29uc3QgZXJyb3JQcmVmaXggPSBgRXh0ZW5zaW9uIHNsb3QgY29uZmlnICcke2tleVBhdGh9J2A7XG4gICAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhjb25maWcpLmZpbHRlcigoayk9PiFbXG4gICAgICAgICAgICAnYWRkJyxcbiAgICAgICAgICAgICdyZW1vdmUnLFxuICAgICAgICAgICAgJ29yZGVyJyxcbiAgICAgICAgICAgICdjb25maWd1cmUnXG4gICAgICAgIF0uaW5jbHVkZXMoaykpO1xuICAgIGlmIChpbnZhbGlkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgJyBjb250YWlucyBpbnZhbGlkIGtleXMgJyR7aW52YWxpZEtleXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmFkZCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLmFkZCkgfHwgIWNvbmZpZy5hZGQuZXZlcnkoKG4pPT50eXBlb2YgbiA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAuYWRkJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZW1vdmUpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5yZW1vdmUpIHx8ICFjb25maWcucmVtb3ZlLmV2ZXJ5KChuKT0+dHlwZW9mIG4gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLnJlbW92ZScgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcub3JkZXIpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5vcmRlcikgfHwgIWNvbmZpZy5vcmRlci5ldmVyeSgobik9PnR5cGVvZiBuID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5vcmRlcicgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcuY29uZmlndXJlKSB7XG4gICAgICAgIGlmICghaXNPcmRpbmFyeU9iamVjdChjb25maWcuY29uZmlndXJlKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLmNvbmZpZ3VyZScgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBleHRlbnNpb24gSURzIGZvciBrZXlzYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIC4uLmNvbmZpZ1N0YXRlLnByb3ZpZGVkQ29uZmlncy5tYXAoKGMpPT5jLmNvbmZpZyksXG4gICAgICAgIHRlbXBDb25maWdTdGF0ZS5jb25maWdcbiAgICBdO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGNvbmZpZyBzY2hlbWEgZm9yIGEgbW9kdWxlLiBTaW5jZSBwcm9ibGVtcyBpZGVudGlmaWVkIGhlcmUgYXJlIHByb2dyYW1taW5nIGVycm9yc1xuICogdGhhdCBob3BlZnVsbHkgd2lsbCBiZSBjYXVnaHQgZHVyaW5nIGRldmVsb3BtZW50LCB0aGlzIGZ1bmN0aW9uIGxvZ3MgZXJyb3JzIHRvIHRoZSBjb25zb2xlIGRpcmVjdGx5O1xuICogaXQncyBmaW5lIGlmIHdlIHNwYW0gdGhlIHVzZXIgd2l0aCB0aGVzZSBlcnJvcnMuXG4gKi8gZnVuY3Rpb24gdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hLCBrZXlQYXRoID0gJycpIHtcbiAgICBjb25zdCB1cGRhdGVNZXNzYWdlID0gYFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCwgaWYgc28sIGFsZXJ0IHRoZSBtYWludGFpbmVyLmA7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoKGspPT4hay5zdGFydHNXaXRoKCdfJykpKXtcbiAgICAgICAgY29uc3QgdGhpc0tleVBhdGggPSBrZXlQYXRoICsgKGtleVBhdGggJiYgJy4nKSArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAodGhpc0tleVBhdGggPT09ICdEaXNwbGF5IGNvbmRpdGlvbnMnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGRlY2xhcmVzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gY2FsbGVkIFwiRGlzcGxheSBjb25kaXRpb25zXCI7IHRoZSBcIkRpc3BsYXkgY29uZGl0aW9uc1wiIG9wdGlvbiBpcyBhIHJlc2VydmVkIG5hbWUuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc0tleVBhdGggPT09ICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGRlY2xhcmVzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gY2FsbGVkIFwiVHJhbnNsYXRpb24gb3ZlcnJpZGVzXCI7IHRoZSBcIlRyYW5zbGF0aW9uIG92ZXJyaWRlc1wiIG9wdGlvbiBpcyBhIHJlc2VydmVkIG5hbWUuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzT3JkaW5hcnlPYmplY3Qoc2NoZW1hUGFydCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykpIHtcbiAgICAgICAgICAgIC8vIHJlY3Vyc2UgZm9yIG5lc3RlZCBjb25maWcga2V5c1xuICAgICAgICAgICAgdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hUGFydCwgdGhpc0tleVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2NoZW1hUGFydC5fZWxlbWVudHM7XG4gICAgICAgIGlmIChoYXNPYmplY3RTY2hlbWEoZWxlbWVudHMpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBlbGVtZW50cywgdGhpc0tleVBhdGggKyAnLl9lbGVtZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll92YWxpZGF0b3JzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2Ygc2NoZW1hUGFydC5fdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgaW52YWxpZCB2YWxpZGF0b3IgZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IHZhbGlkYXRvcnMgbXVzdCBiZSBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZWl0aGVyIGAgKyBgdW5kZWZpbmVkIG9yIGFuIGVycm9yIHN0cmluZy4gUmVjZWl2ZWQgJHt2YWxpZGF0b3J9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSBzY2hlbWFQYXJ0Ll90eXBlO1xuICAgICAgICBpZiAodmFsdWVUeXBlICYmICFPYmplY3QudmFsdWVzKFR5cGUpLmluY2x1ZGVzKHZhbHVlVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGludmFsaWQgdHlwZSBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScgJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdGhlIGFsbG93ZWQgdHlwZXMgYXJlICR7T2JqZWN0LnZhbHVlcyhUeXBlKS5qb2luKCcsICcpfS4gYCArIGBSZWNlaXZlZCAnJHt2YWx1ZVR5cGV9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzY2hlbWFQYXJ0KS5ldmVyeSgoayk9PltcbiAgICAgICAgICAgICAgICAnX2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICAgICAnX3ZhbGlkYXRvcnMnLFxuICAgICAgICAgICAgICAgICdfZWxlbWVudHMnLFxuICAgICAgICAgICAgICAgICdfdHlwZSdcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoaykpICYmICFrZXlQYXRoLmluY2x1ZGVzKCcuX2VsZW1lbnRzJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiBhbGwgY29uZmlnIGVsZW1lbnRzIG11c3QgaGF2ZSBhIGRlZmF1bHQuIGAgKyBgUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShzY2hlbWFQYXJ0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHMgJiYgdmFsdWVUeXBlICYmICFbXG4gICAgICAgICAgICBUeXBlLkFycmF5LFxuICAgICAgICAgICAgVHlwZS5PYmplY3RcbiAgICAgICAgXS5pbmNsdWRlcyh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBiYWQgY29uZmlnIHNjaGVtYSBkZWZpbml0aW9uIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9Jy4gJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdGhlICdlbGVtZW50cycga2V5IG9ubHkgd29ya3Mgd2l0aCAnX3R5cGUnIGVxdWFsIHRvICdBcnJheScgb3IgJ09iamVjdCcuIGAgKyBgUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZVR5cGUpfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0Q29uZmlnRm9yTW9kdWxlKG1vZHVsZU5hbWUsIGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBjb25maWdTdGF0ZS5zY2hlbWFzW21vZHVsZU5hbWVdO1xuICAgIGNvbnN0IGlucHV0Q29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBpbnB1dENvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoc2NoZW1hLCBpbnB1dENvbmZpZyk7XG4gICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEsIGNvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgZGVsZXRlIGNvbmZpZy5leHRlbnNpb25TbG90cztcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEobW9kdWxlTmFtZSwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGlucHV0Q29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoaW1wbGljaXRDb25maWdTY2hlbWEsIGlucHV0Q29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKGltcGxpY2l0Q29uZmlnU2NoZW1hLCBjb25maWcsIG1vZHVsZU5hbWUpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnc0Zvcihtb2R1bGVOYW1lLCBhbGxDb25maWdzKSB7XG4gICAgY29uc3QgYWxsQ29uZmlnc0Zvck1vZHVsZSA9IGFsbENvbmZpZ3MubWFwKCh7IFttb2R1bGVOYW1lXTogYyB9KT0+YykuZmlsdGVyKChjKT0+ISFjKTtcbiAgICByZXR1cm4gbWVyZ2VDb25maWdzKGFsbENvbmZpZ3NGb3JNb2R1bGUpO1xufVxuZnVuY3Rpb24gbWVyZ2VDb25maWdzKGNvbmZpZ3MpIHtcbiAgICByZXR1cm4gY29uZmlncy5yZWR1Y2UoKGFjYywgY29uZmlnKT0+bWVyZ2VEZWVwUmVwbGFjZShhY2MsIGNvbmZpZyksIHt9KTtcbn1cbi8qKlxuICogUmVjdXJzaXZlbHkgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZyB0cmVlIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbFxuICogb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZXhpc3QgaW4gdGhlIHNjaGVtYSwgYW5kIHRoYXQgdHlwZXMgYXJlXG4gKiBjb3JyZWN0LiBEb2VzIG5vdCBydW4gdmFsaWRhdG9ycyB5ZXQsIHNpbmNlIHRob3NlIHdpbGwgYmUgcnVuIG9uXG4gKiB0aGUgY29uZmlnIHdpdGggdGhlIGRlZmF1bHRzIGZpbGxlZCBpbi5cbiAqLyBmdW5jdGlvbiB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aCA9ICcnKSB7XG4gICAgLy8gdmFsaWRhdGUgZWFjaCBjb25zdGl0dWVudCBlbGVtZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAoIXNjaGVtYS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgPT09ICdleHRlbnNpb25TbG90cycgJiYga2V5UGF0aCAhPT0gJycpKSB7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3IodGhpc0tleVBhdGgsIGBVbmtub3duIGNvbmZpZyBrZXkgJyR7dGhpc0tleVBhdGh9JyBwcm92aWRlZC4gSWdub3JpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKSB7XG4gICAgY2hlY2tUeXBlKGtleVBhdGgsIHNjaGVtYVBhcnQuX3R5cGUsIHZhbHVlKTtcbiAgICBpZiAoaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSBhcyBmcmVlZm9ybSBvYmplY3RcbiAgICAgICAgICAgIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoc2NoZW1hUGFydCwgdmFsdWUsIGtleVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKCEoc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSB8fCBzY2hlbWFQYXJ0Lmhhc093blByb3BlcnR5KCdfdHlwZScpKSkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgYXMgbm9ybWFsIG5lc3RlZCBjb25maWdcbiAgICAgICAgICAgIHZhbGlkYXRlU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5KSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEsIGNvbmZpZywga2V5UGF0aCkge1xuICAgIGlmIChmcmVlZm9ybU9iamVjdFNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgdmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEuX2VsZW1lbnRzLCB2YWx1ZSwgYCR7a2V5UGF0aH0uJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKGFycmF5U2NoZW1hLCB2YWx1ZSwga2V5UGF0aCkge1xuICAgIGNvbnN0IHZhbGlkYXRlZEFzQXJyYXkgPSBjaGVja1R5cGUoa2V5UGF0aCwgVHlwZS5BcnJheSwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGVkQXNBcnJheSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFycmF5IGVsZW1lbnQgb2JqZWN0IHNjaGVtYSwgdmVyaWZ5IHRoYXQgZWxlbWVudHMgbWF0Y2ggaXRcbiAgICBpZiAoaGFzT2JqZWN0U2NoZW1hKGFycmF5U2NoZW1hLl9lbGVtZW50cykpIHtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKGFycmF5U2NoZW1hLl9lbGVtZW50cywgdmFsdWVbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY2hlY2tUeXBlKGAke2tleVBhdGh9WyR7aX1dYCwgYXJyYXlTY2hlbWEuX2VsZW1lbnRzPy5fdHlwZSwgdmFsdWVbaV0pO1xuICAgIH1cbn1cbi8qKlxuICogUnVuIGFsbCB0aGUgdmFsaWRhdG9ycyBpbiB0aGUgY29uZmlnIHRyZWUuIFRoaXMgc2hvdWxkIGJlIHJ1blxuICogb24gdGhlIGNvbmZpZyBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZmlsbGVkIGluIHdpdGggYWxsIHRoZSBkZWZhdWx0cywgc2luY2VcbiAqIGhpZ2hlci1sZXZlbCB2YWxpZGF0b3JzIG1heSByZWZlciB0byBkZWZhdWx0IHZhbHVlcy5cbiAqLyBmdW5jdGlvbiBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBrZXlQYXRoID0gJycpIHtcbiAgICAvLyBJZiBgIXNjaGVtYWAsIHRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYSBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZXJyb3IgcHJpbnRlZCBhbHJlYWR5LlxuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gc2NoZW1hLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICBydW5WYWxpZGF0b3JzKGtleVBhdGgsIHNjaGVtYS5fdmFsaWRhdG9ycywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChjb25maWcpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKXtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5fdHlwZSA9PT0gVHlwZS5PYmplY3QgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYS5fZWxlbWVudHMsIHZhbHVlLCB0aGlzS2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEuX2VsZW1lbnRzLCBjb25maWdbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFJ1biB0eXBlIHZhbGlkYXRpb24gZm9yIHRoZSB2YWx1ZSwgbG9nZ2luZyBhbnkgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3NlcywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi8gZnVuY3Rpb24gY2hlY2tUeXBlKGtleVBhdGgsIF90eXBlLCB2YWx1ZSkge1xuICAgIGlmIChfdHlwZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHtcbiAgICAgICAgICAgIEFycmF5OiBpc0FycmF5LFxuICAgICAgICAgICAgQm9vbGVhbjogaXNCb29sZWFuLFxuICAgICAgICAgICAgQ29uY2VwdFV1aWQ6IGlzVXVpZCxcbiAgICAgICAgICAgIE51bWJlcjogaXNOdW1iZXIsXG4gICAgICAgICAgICBPYmplY3Q6IGlzT2JqZWN0LFxuICAgICAgICAgICAgU3RyaW5nOiBpc1N0cmluZyxcbiAgICAgICAgICAgIFVVSUQ6IGlzVXVpZCxcbiAgICAgICAgICAgIFBlcnNvbkF0dHJpYnV0ZVR5cGVVdWlkOiBpc1V1aWQsXG4gICAgICAgICAgICBQYXRpZW50SWRlbnRpZmllclR5cGVVdWlkOiBpc1V1aWRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgW1xuICAgICAgICAgICAgdmFsaWRhdG9yW190eXBlXVxuICAgICAgICBdLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBSdW5zIHZhbGlkYXRvcnMsIGxvZ2dpbmcgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbmZ1bmN0aW9uIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgdmFsaWRhdG9ycywgdmFsdWUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgIGlmICh2YWxpZGF0b3JzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvclJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBgSW52YWxpZCBjb25maWd1cmF0aW9uIGZvciAke2tleVBhdGh9OiAke3ZhbGlkYXRvclJlc3VsdH1gIDogYEludmFsaWQgY29uZmlndXJhdGlvbiB2YWx1ZSAke3ZhbHVlfSBmb3IgJHtrZXlQYXRofTogJHt2YWxpZGF0b3JSZXN1bHR9YDtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTa2lwcGluZyBpbnZhbGlkIHZhbGlkYXRvciBhdCBcIiR7a2V5UGF0aH1cIi4gRW5jb3VudGVyZWQgZXJyb3JcXG5cXHQke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuLy8gUmVjdXJzaXZlbHkgZmlsbCBpbiB0aGUgY29uZmlnIHdpdGggdmFsdWVzIGZyb20gdGhlIHNjaGVtYS5cbmNvbnN0IHNldERlZmF1bHRzID0gKHNjaGVtYSwgaW5wdXRDb25maWcpPT57XG4gICAgY29uc3QgY29uZmlnID0gc3RydWN0dXJlZENsb25lKGlucHV0Q29uZmlnKTtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKXtcbiAgICAgICAgY29uc3QgY29uZmlnUGFydCA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIC8vIFRoZSBgc2NoZW1hUGFydCAmJmAgY2xhdXNlIG9mIHRoaXMgYGlmYCBzdGF0ZW1lbnQgd2lsbCBvbmx5IGZhaWxcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2ZXJ5IGludmFsaWQuIEl0IGlzIHRoZXJlIHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tXG4gICAgICAgIC8vIGNyYXNoaW5nIGNvbXBsZXRlbHksIHRob3VnaCBpdCB3aWxsIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB0aGVyZSBzaG91bGQgYmUgbGVnaWJsZSBlcnJvcnMgaW4gdGhlIGNvbnNvbGUgZnJvbVxuICAgICAgICAvLyB0aGUgc2NoZW1hIHZhbGlkYXRvci5cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQgJiYgKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ190eXBlJykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHNjaGVtYVBhcnQgZGVmaW5lcyBhIGNvbmZpZyB2YWx1ZSwgc2luY2UgaXQgaGFzXG4gICAgICAgICAgICAvLyBhIHByb3BlcnR5IGBfdHlwZWAgb3IgYF9kZWZhdWx0YC5cbiAgICAgICAgICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHNjaGVtYVBhcnRbJ19kZWZhdWx0J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIGl0IGlzIGFuIG9iamVjdCBvciBhcnJheSB3aXRoIG9iamVjdCBlbGVtZW50cywgaW4gd2hpY2ggY2FzZSB3ZSByZWN1cnNlXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNjaGVtYVBhcnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhcnQgJiYgaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5ICYmIEFycmF5LmlzQXJyYXkoY29uZmlnUGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnV2l0aERlZmF1bHRzID0gY29uZmlnUGFydC5tYXAoKGNvbmYpPT5zZXREZWZhdWx0cyhlbGVtZW50cywgY29uZikpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IGNvbmZpZ1dpdGhEZWZhdWx0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyhjb25maWdQYXJ0KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdQYXJ0W29iamVjdEtleV0gPSBzZXREZWZhdWx0cyhlbGVtZW50cywgY29uZmlnUGFydFtvYmplY3RLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYVBhcnQpKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBzY2hlbWFQYXJ0IGhhcyBubyBwcm9wZXJ0eSBcIl90eXBlXCIsIGlmIGl0J3MgYW4gb3JkaW5hcnkgb2JqZWN0XG4gICAgICAgICAgICAvLyAodW5saWtlLCBpbXBvcnRhbnRseSwgdGhlIHZhbGlkYXRvcnMgYXJyYXkpLCB3ZSBhc3N1bWUgaXQgaXMgYSBwYXJlbnQgY29uZmlnIHByb3BlcnR5LlxuICAgICAgICAgICAgLy8gV2UgcmVjdXJzZSB0byBjb25maWdba2V5XSBhbmQgc2NoZW1hW2tleV0uIERlZmF1bHQgY29uZmlnW2tleV0gdG8ge30uXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbmZpZ1BhcnQgPSBjb25maWdQYXJ0ID8/IHt9O1xuICAgICAgICAgICAgLy8gVGhlcmUgd2lsbCBoYXZlIGJlZW4gYSB2YWxpZGF0aW9uIGVycm9yIGFscmVhZHkgaWYgY29uZmlnUGFydCBpcyBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChzZWxlY3RlZENvbmZpZ1BhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSBzZXREZWZhdWx0cyhzY2hlbWFQYXJ0LCBzZWxlY3RlZENvbmZpZ1BhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuZnVuY3Rpb24gaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzU2NoZW1hKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudHNTY2hlbWEgJiYgT2JqZWN0LmtleXMoZWxlbWVudHNTY2hlbWEpLmZpbHRlcigoZSk9PiFbXG4gICAgICAgICAgICAnX2RlZmF1bHQnLFxuICAgICAgICAgICAgJ192YWxpZGF0b3JzJ1xuICAgICAgICBdLmluY2x1ZGVzKGUpKS5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbi8qKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHZhbGlkYXRpb24gZXJyb3JzIHdlIGhhdmUgZGlzcGxheWVkLiBFYWNoIG9uZSBzaG91bGQgb25seSBiZSBkaXNwbGF5ZWQgb25jZS4gKi8gbGV0IGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtrZXlQYXRofTo6OiR7bWVzc2FnZX1gO1xuICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUsIGJ1dCBiZWNhdXNlIG9mIGhvdyB0aGluZ3Mgd2luZC11cCB0cmFuc3BpbGVkLCB0aGlzIGlzbid0IGltcG9zc2libGVcbiAgICBpZiAoIWRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcykge1xuICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIGlmICghZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5hZGQoa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIE5vcm1hbGx5LCBjb25maWd1cmF0aW9uIGVycm9ycyBhcmUgb25seSBkaXNwbGF5ZWQgb25jZS4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGxpc3Qgb2ZcbiAqIGRpc3BsYXllZCBlcnJvcnMsIHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpc3BsYXllZCBhZ2Fpbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWdFcnJvcnMoa2V5UGF0aCkge1xuICAgIGlmIChrZXlQYXRoKSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQ2xlYW5zIHVwIGFsbCBjb25maWcgc3RvcmUgc3Vic2NyaXB0aW9ucyBhbmQgcmUtZXN0YWJsaXNoZXMgdGhlbS4gVGhpcyBpcyBwcmltYXJpbHlcbiAqIHVzZWZ1bCBmb3IgdGVzdGluZywgd2hlcmUgc3Vic2NyaXB0aW9ucyBzZXQgdXAgYXQgbW9kdWxlIGxvYWQgdGltZSBuZWVkIHRvIGJlIGNsZWFyZWRcbiAqIGJldHdlZW4gdGVzdHMgdG8gcHJldmVudCBpbmZpbml0ZSB1cGRhdGUgbG9vcHMuIEFmdGVyIGNsZWFyaW5nLCBzdWJzY3JpcHRpb25zIGFyZVxuICogcmUtZXN0YWJsaXNoZWQgc28gdGhlIGNvbmZpZyBzeXN0ZW0gY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkuXG4gKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q29uZmlnU3lzdGVtKCkge1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpPT51bnN1YnNjcmliZSgpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLmxlbmd0aCA9IDA7XG4gICAgc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCk7XG59XG4vKipcbiAqIENvcGllZCBvdmVyIGZyb20gZXNtLWV4dGVuc2lvbnMuIEl0IHJpZ2h0bHkgYmVsb25ncyB0byB0aGF0IG1vZHVsZSwgYnV0IGVzbS1jb25maWdcbiAqIGNhbm5vdCBkZXBlbmQgb24gZXNtLWV4dGVuc2lvbnMuXG4gKi8gZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG4vKipcbiAqIFRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgc2NoZW1hIGlzIHVzZWQgaW4gdGhlIGltcGxpY2l0IHNjaGVtYSBnaXZlbiB0byBldmVyeSBtb2R1bGU7XG4gKiBwbHVzIGFueSBhZGRpdGlvbmFsIHRyYW5zbGF0aW9uIG5hbWVzcGFjZXMgKGF0IHRpbWUgb2Ygd3JpdGluZywgdGhpcyBpcyBqdXN0ICdjb3JlJykuXG4gKi8gY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEgPSB7XG4gICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyc6IHtcbiAgICAgICAgX2Rlc2NyaXB0aW9uOiAnUGVyLWxhbmd1YWdlIG92ZXJyaWRlcyBmb3IgZnJvbnRlbmQgdHJhbnNsYXRpb25zIHNob3VsZCBiZSBrZXllZCBieSBsYW5ndWFnZSBjb2RlIGFuZCBlYWNoIGxhbmd1YWdlIGRpY3Rpb25hcnkgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGtleSBhbmQgdGhlIGRpc3BsYXkgdmFsdWUnLFxuICAgICAgICBfdHlwZTogVHlwZS5PYmplY3QsXG4gICAgICAgIF9kZWZhdWx0OiB7fSxcbiAgICAgICAgX3ZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgIHZhbGlkYXRvcigobyk9Pk9iamVjdC5rZXlzKG8pLmV2ZXJ5KChrKT0+L15bYS16XXsyLDN9KC1bQS1aXXsyLDN9KT8kLy50ZXN0KGspKSwgKG8pPT57XG4gICAgICAgICAgICAgICAgY29uc3QgYmFkS2V5cyA9IE9iamVjdC5rZXlzKG8pLmZpbHRlcigoayk9PiEvXlthLXpdezIsM30oLVtBLVpdezIsM30pPyQvLnRlc3QoaykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgVGhlICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnIG9iamVjdCBzaG91bGQgaGF2ZSBsYW5ndWFnZSBjb2RlcyBmb3Iga2V5cy4gTGFuZ3VhZ2UgY29kZXMgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhIHR3by10by10aHJlZSBsZXR0ZXIgbGFuZ3VhZ2UgY29kZSBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgaHlwaGVuIGFuZCBhIHR3by10by10aHJlZSBsZXR0ZXIgY291bnRyeSBjb2RlLiBUaGUgZm9sbG93aW5nIGtleXMgZG8gbm90IGNvbmZvcm06ICR7YmFkS2V5cy5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgIH1cbn07XG4vKipcbiAqIFRoZSBpbXBsaWNpdENvbmZpZ1NjaGVtYSBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluIGV2ZXJ5IGNvbmZpZ3VyYXRpb24gc2NoZW1hXG4gKi8gY29uc3QgaW1wbGljaXRDb25maWdTY2hlbWEgPSB7XG4gICAgJ0Rpc3BsYXkgY29uZGl0aW9ucyc6IHtcbiAgICAgICAgcHJpdmlsZWdlczoge1xuICAgICAgICAgICAgX2Rlc2NyaXB0aW9uOiAnVGhlIHByaXZpbGVnZShzKSB0aGUgdXNlciBtdXN0IGhhdmUgdG8gdXNlIHRoaXMgZXh0ZW5zaW9uJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLkFycmF5LFxuICAgICAgICAgICAgX2RlZmF1bHQ6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIF9kZXNjcmlwdGlvbjogJ1RoZSBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBleHRlbnNpb24gaXMgZGlzcGxheWVkJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIF9kZWZhdWx0OiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLi4udHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWFcbn07XG4iXSwibmFtZXMiOlsiY2xvbmVEZWVwIiwiaXNFcXVhbCIsIm1lcmdlV2l0aCIsIm9taXQiLCJsb2Rhc2hPbWl0IiwiVHlwZSIsImlzQXJyYXkiLCJpc0Jvb2xlYW4iLCJpc1V1aWQiLCJpc051bWJlciIsImlzT2JqZWN0IiwiaXNTdHJpbmciLCJ2YWxpZGF0b3IiLCJjb25maWdFeHRlbnNpb25TdG9yZSIsImNvbmZpZ0ludGVybmFsU3RvcmUiLCJnZXRDb25maWdTdG9yZSIsImdldEV4dGVuc2lvbkNvbmZpZyIsImdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUiLCJpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUiLCJ0ZW1wb3JhcnlDb25maWdTdG9yZSIsIm1lcmdlRGVlcFJlcGxhY2UiLCJsZWZ0IiwicmlnaHQiLCJfb2JqVmFsdWUiLCJzcmNWYWx1ZSIsIkFycmF5IiwiY29uZmlnU3Vic2NyaXB0aW9ucyIsInJlY29tcHV0ZUFsbENvbmZpZ3MiLCJjb25maWdTdGF0ZSIsInRlbXBDb25maWdTdGF0ZSIsImV4dGVuc2lvblN0YXRlIiwiY29tcHV0ZU1vZHVsZUNvbmZpZyIsImNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnIiwiY29tcHV0ZUV4dGVuc2lvblNsb3RDb25maWdzIiwiY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MiLCJzZXR1cENvbmZpZ1N1YnNjcmlwdGlvbnMiLCJzdGF0ZSIsInRlbXBTdGF0ZSIsIl9pdGVyYXRvckVycm9yIiwiT2JqZWN0IiwibW9kdWxlTmFtZSIsIm1vZHVsZVN0b3JlIiwibmV3U3RhdGUiLCJjb25maWciLCJnZXRDb25maWdGb3JNb2R1bGUiLCJjb25maWcxIiwiZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEiLCJzbG90Q29uZmlncyIsImdldEV4dGVuc2lvblNsb3RDb25maWdzIiwibmV3U2xvdFN0b3JlRW50cmllcyIsInNsb3ROYW1lIiwic2xvdFN0b3JlIiwib2xkU3RhdGUiLCJnZXRJbXBsZW1lbnRlclRvb2xzQ29uZmlnIiwiY29uZmlncyIsImV4dGVuc2lvbiIsImNvbXB1dGVFeHRlbnNpb25Db25maWciLCJleHRlbnNpb25zQ29uZmlnU3RvcmUiLCJkZWZpbmVDb25maWdTY2hlbWEiLCJzY2hlbWEiLCJ2YWxpZGF0ZUNvbmZpZ1NjaGVtYSIsImVuaGFuY2VkU2NoZW1hIiwiaW1wbGljaXRDb25maWdTY2hlbWEiLCJyZWdpc3Rlck1vZHVsZVdpdGhDb25maWdTeXN0ZW0iLCJyZWdpc3Rlck1vZHVsZUxvYWQiLCJyZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlIiwibmFtZXNwYWNlIiwidHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEiLCJkZWZpbmVFeHRlbnNpb25Db25maWdTY2hlbWEiLCJleHRlbnNpb25OYW1lIiwiY29uc29sZSIsInByb3ZpZGUiLCJzb3VyY2VOYW1lIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1cGRhdGUiLCJ1bnN1YnNjcmliZSIsInN0b3JlIiwiZ2V0VHJhbnNsYXRpb25PdmVycmlkZXMiLCJleHRlbnNpb25JZCIsInByb21pc2VzIiwiX3N0YXRlX2NvbmZpZ19UcmFuc2xhdGlvbm92ZXJyaWRlcyIsInRyYW5zbGF0aW9uT3ZlcnJpZGVzIiwiY29uZmlnU3RvcmUiLCJwcm9jZXNzQ29uZmlnIiwicHJvdmlkZWRDb25maWciLCJrZXlQYXRoQ29udGV4dCIsInZhbGlkYXRlU3RydWN0dXJlIiwic2V0RGVmYXVsdHMiLCJydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlIiwic2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25Nb2R1bGVOYW1lIiwiX3Nsb3RNb2R1bGVDb25maWdfZXh0ZW5zaW9uU2xvdHNfc2xvdE5hbWVfY29uZmlndXJlIiwiZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZCIsImV4dGVuc2lvbkNvbmZpZ1NjaGVtYSIsIm5hbWVPZlNjaGVtYVNvdXJjZSIsInByb3ZpZGVkQ29uZmlncyIsImdldFByb3ZpZGVkQ29uZmlncyIsInNsb3RNb2R1bGVDb25maWciLCJtZXJnZUNvbmZpZ3NGb3IiLCJjb25maWdPdmVycmlkZSIsImV4dGVuc2lvbkNvbmZpZyIsImNvbWJpbmVkQ29uZmlnIiwibWVyZ2VDb25maWdzIiwicmVzdWx0IiwiZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMiLCJjb25maWdzQW5kU291cmNlcyIsImMiLCJzb3VyY2UiLCJjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZSIsImlzT3JkaW5hcnlPYmplY3QiLCJvYmoiLCJrZXkiLCJhbGxDb25maWdzIiwic2xvdENvbmZpZ1Blck1vZHVsZSIsIl9hbGxDb25maWdzX2tleSIsIl9hbGxDb25maWdzX2tleTEiLCJ2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzIiwiY29uZmlnQnlTbG90TmFtZSIsIl9pdGVyYXRvckVycm9yMSIsInZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyIsImtleVBhdGgiLCJlcnJvclByZWZpeCIsImludmFsaWRLZXlzIiwiayIsImxvZ0Vycm9yIiwibiIsInVwZGF0ZU1lc3NhZ2UiLCJ0aGlzS2V5UGF0aCIsInNjaGVtYVBhcnQiLCJlbGVtZW50cyIsImhhc09iamVjdFNjaGVtYSIsIl8kdmFsaWRhdG9yIiwidmFsdWVUeXBlIiwiSlNPTiIsImlucHV0Q29uZmlnIiwiYWxsQ29uZmlnc0Zvck1vZHVsZSIsImFjYyIsInZhbHVlIiwidmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUiLCJjaGVja1R5cGUiLCJ2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlIiwidmFsaWRhdGVBcnJheVN0cnVjdHVyZSIsImZyZWVmb3JtT2JqZWN0U2NoZW1hIiwiYXJyYXlTY2hlbWEiLCJ2YWxpZGF0ZWRBc0FycmF5IiwiaSIsImkxIiwiX2FycmF5U2NoZW1hX19lbGVtZW50cyIsInJ1blZhbGlkYXRvcnMiLCJfdHlwZSIsInZhbGlkYXRvcnMiLCJyZXR1cm5WYWx1ZSIsInZhbGlkYXRvclJlc3VsdCIsIm1lc3NhZ2UiLCJfdHlwZV9vZiIsImUiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJjb25maWdQYXJ0IiwiY29uZmlnV2l0aERlZmF1bHRzIiwiY29uZiIsIm9iamVjdEtleSIsInNlbGVjdGVkQ29uZmlnUGFydCIsImVsZW1lbnRzU2NoZW1hIiwiZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzIiwiU2V0IiwiY2xlYXJDb25maWdFcnJvcnMiLCJyZXNldENvbmZpZ1N5c3RlbSIsIl9leHRlbnNpb25JZF9zcGxpdCIsIm8iLCJiYWRLZXlzIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkJBQTZCLEdBQWlGO0FBQzNFO0FBQ3lFO0FBQ3JEO0FBQytKO0FBQ3ROOzs7O0NBSUMsR0FBRyxTQUFTcUIsaUJBQWlCQyxJQUFJLEVBQUVDLEtBQUs7SUFDckMsT0FBT3JCLHlDQUFTQSxDQUFDLENBQUMsR0FB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\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/module-config.js\n\n}");
5583
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n clearConfigErrors: () => (clearConfigErrors),\n defineConfigSchema: () => (defineConfigSchema),\n defineExtensionConfigSchema: () => (defineExtensionConfigSchema),\n getConfig: () => (getConfig),\n getTranslationOverrides: () => (getTranslationOverrides),\n processConfig: () => (processConfig),\n provide: () => (provide),\n registerModuleLoad: () => (registerModuleLoad),\n registerModuleWithConfigSystem: () => (registerModuleWithConfigSystem),\n registerTranslationNamespace: () => (registerTranslationNamespace),\n resetConfigSystem: () => (resetConfigSystem)\n});\n/* import */ var lodash_es__rspack_import_4 = __webpack_require__(\"../../../node_modules/lodash-es/mergeWith.js\");\n/* import */ var lodash_es__rspack_import_5 = __webpack_require__(\"../../../node_modules/lodash-es/isEqual.js\");\n/* import */ var lodash_es__rspack_import_6 = __webpack_require__(\"../../../node_modules/lodash-es/omit.js\");\n/* import */ var lodash_es__rspack_import_7 = __webpack_require__(\"../../../node_modules/lodash-es/cloneDeep.js\");\n/* import */ var _types_js__rspack_import_0 = __webpack_require__(\"../../framework/esm-config/dist/types.js\");\n/* import */ var _validators_type_validators_js__rspack_import_1 = __webpack_require__(\"../../framework/esm-config/dist/validators/type-validators.js\");\n/* import */ var _validators_validator_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-config/dist/validators/validator.js\");\n/* import */ var _state_js__rspack_import_3 = __webpack_require__(\"../../framework/esm-config/dist/module-config/state.js\");\nfunction _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n return arr2;\n}\nfunction _array_with_holes(arr) {\n if (Array.isArray(arr)) return arr;\n}\nfunction _array_without_holes(arr) {\n if (Array.isArray(arr)) return _array_like_to_array(arr);\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _iterable_to_array(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _iterable_to_array_limit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _s, _e;\n try {\n for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally{\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally{\n if (_d) throw _e;\n }\n }\n return _arr;\n}\nfunction _non_iterable_rest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _non_iterable_spread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _sliced_to_array(arr, i) {\n return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();\n}\nfunction _to_consumable_array(arr) {\n return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();\n}\nfunction _type_of(obj) {\n \"@swc/helpers - typeof\";\n return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n}\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\n/** @module @category Config */ \n\n\n\n\n/**\n * Deep merge two objects, with right-side values taking precedence.\n * Arrays are replaced entirely (not merged by index), matching the\n * behavior of ramda's mergeDeepRight.\n */ function mergeDeepReplace(left, right) {\n return (0,lodash_es__rspack_import_4[\"default\"])({}, left, right, function(_objValue, srcValue) {\n if (Array.isArray(srcValue)) {\n return srcValue;\n }\n });\n}\n/**\n * Store setup\n *\n *\n * Set up stores and subscriptions so that inputs get processed appropriately.\n *\n * There are *input* stores and *output* stores. The *input* stores\n * are configInternalStore, temporaryConfigStore, and configExtensionStore. The\n * output stores are set in the `compute...` functions. They are the module\n * config stores, the extension slot config stores (by module), the extension\n * config stores, and the implementer tools config store.\n *\n * This code sets up the subscriptions so that when an input store changes,\n * the correct set of output stores are updated.\n *\n * All `compute...` functions except `computeExtensionConfigs` are pure\n * (or are supposed to be), other than the fact that they all `setState`\n * store values at the end. `computeExtensionConfigs` calls `getGlobalStore`,\n * which creates stores.\n */ // Store unsubscribe functions to allow cleanup (e.g., in tests or hot module reloading)\nvar configSubscriptions = [];\n/**\n * Recomputes all configuration derived stores based on current state of input stores.\n * Called whenever any input store (configInternalStore, temporaryConfigStore, configExtensionStore) changes.\n */ function recomputeAllConfigs() {\n var configState = _state_js__rspack_import_3.configInternalStore.getState();\n var tempConfigState = _state_js__rspack_import_3.temporaryConfigStore.getState();\n var extensionState = _state_js__rspack_import_3.configExtensionStore.getState();\n computeModuleConfig(configState, tempConfigState);\n computeImplementerToolsConfig(configState, tempConfigState);\n computeExtensionSlotConfigs(configState, tempConfigState);\n computeExtensionConfigs(configState, extensionState, tempConfigState);\n}\nfunction setupConfigSubscriptions() {\n // Initial computation\n recomputeAllConfigs();\n // Subscribe to all input stores with a single handler\n // This ensures we only recompute once even if multiple stores change simultaneously\n configSubscriptions.push(_state_js__rspack_import_3.configInternalStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__rspack_import_3.temporaryConfigStore.subscribe(recomputeAllConfigs));\n configSubscriptions.push(_state_js__rspack_import_3.configExtensionStore.subscribe(recomputeAllConfigs));\n}\n// Set up subscriptions at module load time\nsetupConfigSubscriptions();\nfunction computeModuleConfig(state, tempState) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(state.schemas)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var moduleName = _step.value;\n // At this point the schema could be either just the implicit schema or the actually\n // defined schema. We run with just the implicit schema because we want to populate\n // the config store with the translation overrides as soon as possible. In fact, the\n // translation system will throw for Suspense until the translation overrides are\n // available, which as of this writing blocks the schema definition from occurring\n // for modules loaded based on their extensions.\n var moduleStore = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n var newState = void 0;\n if (state.moduleLoaded[moduleName]) {\n var config = getConfigForModule(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: true,\n config: config\n };\n } else {\n var config1 = getConfigForModuleImplicitSchema(moduleName, state, tempState);\n newState = {\n translationOverridesLoaded: true,\n loaded: false,\n config: config1\n };\n }\n moduleStore.setState(newState);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction computeExtensionSlotConfigs(state, tempState) {\n var slotConfigs = getExtensionSlotConfigs(state, tempState);\n var newSlotStoreEntries = Object.fromEntries(Object.entries(slotConfigs).map(function(param) {\n var _param = _sliced_to_array(param, 2), slotName = _param[0], config = _param[1];\n return [\n slotName,\n {\n loaded: true,\n config: config\n }\n ];\n }));\n var slotStore = (0,_state_js__rspack_import_3.getExtensionSlotsConfigStore)();\n var oldState = slotStore.getState();\n var newState = {\n slots: _object_spread({}, oldState.slots, newSlotStoreEntries)\n };\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.slots, newState.slots)) {\n slotStore.setState(newState);\n }\n}\nfunction computeImplementerToolsConfig(state, tempConfigState) {\n var oldState = _state_js__rspack_import_3.implementerToolsConfigStore.getState();\n var config = getImplementerToolsConfig(state, tempConfigState);\n var newState = {\n config: config\n };\n // Use deep equality on the actual config content, not the wrapper object\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.config, newState.config)) {\n _state_js__rspack_import_3.implementerToolsConfigStore.setState(newState);\n }\n}\nfunction computeExtensionConfigs(configState, extensionState, tempConfigState) {\n var configs = {};\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n // We assume that the module schema has already been defined, since the extension\n // it contains is mounted.\n for(var _iterator = extensionState.mountedExtensions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var extension = _step.value;\n var config = computeExtensionConfig(extension.slotModuleName, extension.extensionModuleName, extension.slotName, extension.extensionId, configState, tempConfigState);\n if (!configs[extension.slotName]) {\n configs[extension.slotName] = {};\n }\n configs[extension.slotName][extension.extensionId] = {\n config: config,\n loaded: true\n };\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n var extensionsConfigStore = (0,_state_js__rspack_import_3.getExtensionsConfigStore)();\n var oldState = extensionsConfigStore.getState();\n var newState = {\n configs: configs\n };\n // Use deep equality to only update if configs actually changed\n if (!(0,lodash_es__rspack_import_5[\"default\"])(oldState.configs, newState.configs)) {\n extensionsConfigStore.setState(newState);\n }\n}\n/*\n * API\n *\n */ /**\n * This defines a configuration schema for a module. The schema tells the\n * configuration system how the module can be configured. It specifies\n * what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/en-US/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param moduleName Name of the module the schema is being defined for. Generally\n * should be the one in which the `defineConfigSchema` call takes place.\n * @param schema The config schema for the module\n */ function defineConfigSchema(moduleName, schema) {\n validateConfigSchema(moduleName, schema);\n var enhancedSchema = mergeDeepReplace(schema, implicitConfigSchema);\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, moduleName, enhancedSchema)),\n moduleLoaded: _object_spread_props(_object_spread({}, state.moduleLoaded), _define_property({}, moduleName, true))\n });\n });\n}\n/**\n * This alerts the configuration system that a module exists. This allows config to be\n * processed, while still allowing the extension system to know whether the module has\n * actually had its front bundle executed yet.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleWithConfigSystem(moduleName) {\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, moduleName, implicitConfigSchema))\n });\n });\n}\n/**\n * This alerts the configuration system that a module has been loaded.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param moduleName\n */ function registerModuleLoad(moduleName) {\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n moduleLoaded: _object_spread_props(_object_spread({}, state.moduleLoaded), _define_property({}, moduleName, true))\n });\n });\n}\n/**\n * This allows the config system to support translation overrides for namespaces that\n * do not correspond to modules.\n *\n * This should only be used in esm-app-shell.\n *\n * @internal\n * @param namespace\n */ function registerTranslationNamespace(namespace) {\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, namespace, translationOverridesSchema))\n });\n });\n}\n/**\n * This defines a configuration schema for an extension. When a schema is defined\n * for an extension, that extension will receive the configuration corresponding\n * to that schema, rather than the configuration corresponding to the module\n * in which it is defined.\n *\n * The schema tells the configuration system how the module can be configured.\n * It specifies what makes configuration valid or invalid.\n *\n * See [Configuration System](https://o3-docs.openmrs.org/en-US/docs/configuration-system)\n * for more information about defining a config schema.\n *\n * @param extensionName Name of the extension the schema is being defined for.\n * Should match the `name` of one of the `extensions` entries defined in\n * the app's `routes.json` file.\n * @param schema The config schema for the extension\n */ function defineExtensionConfigSchema(extensionName, schema) {\n validateConfigSchema(extensionName, schema);\n var enhancedSchema = mergeDeepReplace(schema, implicitConfigSchema);\n var state = _state_js__rspack_import_3.configInternalStore.getState();\n if (state.schemas[extensionName]) {\n console.error(\"Config schema for extension \".concat(extensionName, \" already exists. If there are multiple extensions with this same name, one will probably crash.\"));\n }\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n schemas: _object_spread_props(_object_spread({}, state.schemas), _define_property({}, extensionName, enhancedSchema))\n });\n });\n}\n/**\n * Provides configuration values programmatically. This is an alternative to\n * providing configuration through the config-file. Configuration provided this\n * way will be merged with configuration from other sources.\n *\n * @param config A configuration object to merge into the existing configuration.\n * @param sourceName An optional name to identify the source of this configuration,\n * used for debugging purposes. Defaults to 'provided'.\n */ function provide(config) {\n var sourceName = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 'provided';\n _state_js__rspack_import_3.configInternalStore.setState(function(state) {\n return _object_spread_props(_object_spread({}, state), {\n providedConfigs: _to_consumable_array(state.providedConfigs).concat([\n {\n source: sourceName,\n config: config\n }\n ])\n });\n });\n}\n/**\n * A promise-based way to access the config as soon as it is fully loaded.\n * If it is already loaded, resolves the config in its present state.\n *\n * This is a useful function if you need to get the config in the course\n * of the execution of a function.\n *\n * @param moduleName The name of the module for which to look up the config\n */ function getConfig(moduleName) {\n return new Promise(function(resolve) {\n var update = function update(state) {\n if (state.loaded && state.config) {\n var config = (0,lodash_es__rspack_import_6[\"default\"])(state.config, [\n 'Display conditions',\n 'Translation overrides'\n ]);\n resolve(config);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var store = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n update(store.getState());\n var unsubscribe = store.subscribe(update);\n });\n}\n/**\n * Retrieves translation overrides for an extension, optionally scoped to a specific\n * extension slot. When called with only a module name, retrieves module-level overrides.\n * Translation overrides allow customizing translated strings without modifying the\n * original translation files.\n *\n * @param moduleName The name of the module providing the translation context.\n * @param slotName Optional extension slot name to include slot-specific overrides.\n * @param extensionId Optional extension ID to include extension-specific overrides.\n * @returns A Promise resolving to an array of translation override objects.\n *\n * @internal\n */ function getTranslationOverrides(moduleName, slotName, extensionId) {\n var promises = [\n new Promise(function(resolve) {\n var update = function update(state) {\n if (state.translationOverridesLoaded && state.config) {\n var _state_config_Translationoverrides;\n var translationOverrides = (_state_config_Translationoverrides = state.config['Translation overrides']) !== null && _state_config_Translationoverrides !== void 0 ? _state_config_Translationoverrides : {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var configStore = (0,_state_js__rspack_import_3.getConfigStore)(moduleName);\n update(configStore.getState());\n var unsubscribe = configStore.subscribe(update);\n })\n ];\n if (slotName && extensionId) {\n promises.push(new Promise(function(resolve) {\n var update = function update(state) {\n if (state.loaded && state.config) {\n var _state_config_Translationoverrides;\n var translationOverrides = (_state_config_Translationoverrides = state.config['Translation overrides']) !== null && _state_config_Translationoverrides !== void 0 ? _state_config_Translationoverrides : {};\n resolve(translationOverrides);\n if (unsubscribe) {\n unsubscribe();\n }\n }\n };\n var configStore = (0,_state_js__rspack_import_3.getExtensionConfig)(slotName, extensionId);\n update(configStore.getState());\n var unsubscribe = configStore.subscribe(update);\n }));\n }\n return Promise.all(promises);\n}\n/**\n * Validate and interpolate defaults for `providedConfig` according to `schema`\n *\n * @param schema a configuration schema\n * @param providedConfig an object of config values (without the top-level module name)\n * @param keyPathContext a dot-separated string which helps the user figure out where\n * the provided config came from\n * @returns The validated and processed configuration object with defaults applied.\n * @internal\n */ function processConfig(schema, providedConfig, keyPathContext) {\n validateStructure(schema, providedConfig, keyPathContext);\n var config = setDefaults(schema, providedConfig);\n runAllValidatorsInConfigTree(schema, config, keyPathContext);\n return config;\n}\n/*\n * Helper functions\n *\n */ /**\n * Returns the configuration for an extension. This configuration is specific\n * to the slot in which it is mounted, and its ID within that slot.\n *\n * The schema for that configuration is the extension schema. If no extension\n * schema has been provided, the schema used is the schema of the module in\n * which the extension is defined.\n *\n * @param slotModuleName The name of the module which defines the extension slot\n * @param extensionModuleName The name of the module which defines the extension (and therefore the config schema)\n * @param slotName The name of the extension slot where the extension is mounted\n * @param extensionId The ID of the extension in its slot\n */ function computeExtensionConfig(slotModuleName, extensionModuleName, slotName, extensionId, configState, tempConfigState) {\n var _ref;\n var _slotModuleConfig_extensionSlots_slotName_configure, _slotModuleConfig_extensionSlots_slotName, _slotModuleConfig_extensionSlots;\n var extensionName = getExtensionNameFromId(extensionId);\n var extensionConfigSchema = configState.schemas[extensionName];\n var nameOfSchemaSource = extensionConfigSchema ? extensionName : extensionModuleName;\n var providedConfigs = getProvidedConfigs(configState, tempConfigState);\n var slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n var configOverride = (_ref = slotModuleConfig === null || slotModuleConfig === void 0 ? void 0 : (_slotModuleConfig_extensionSlots = slotModuleConfig.extensionSlots) === null || _slotModuleConfig_extensionSlots === void 0 ? void 0 : (_slotModuleConfig_extensionSlots_slotName = _slotModuleConfig_extensionSlots[slotName]) === null || _slotModuleConfig_extensionSlots_slotName === void 0 ? void 0 : (_slotModuleConfig_extensionSlots_slotName_configure = _slotModuleConfig_extensionSlots_slotName.configure) === null || _slotModuleConfig_extensionSlots_slotName_configure === void 0 ? void 0 : _slotModuleConfig_extensionSlots_slotName_configure[extensionId]) !== null && _ref !== void 0 ? _ref : {};\n var extensionConfig = mergeConfigsFor(nameOfSchemaSource, providedConfigs);\n var combinedConfig = mergeConfigs([\n extensionConfig,\n configOverride\n ]);\n var schema = extensionConfigSchema !== null && extensionConfigSchema !== void 0 ? extensionConfigSchema : configState.schemas[extensionModuleName];\n validateStructure(schema, combinedConfig, nameOfSchemaSource);\n var config = setDefaults(schema, combinedConfig);\n runAllValidatorsInConfigTree(schema, config, nameOfSchemaSource);\n delete config.extensionSlots;\n return config;\n}\nfunction getImplementerToolsConfig(configState, tempConfigState) {\n var result = getSchemaWithValuesAndSources((0,lodash_es__rspack_import_7[\"default\"])(configState.schemas));\n var configsAndSources = _to_consumable_array(configState.providedConfigs.map(function(c) {\n return [\n c.config,\n c.source\n ];\n })).concat([\n [\n tempConfigState.config,\n 'temporary config'\n ]\n ]);\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = configsAndSources[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _step_value = _sliced_to_array(_step.value, 2), config = _step_value[0], source = _step_value[1];\n result = mergeConfigs([\n result,\n createValuesAndSourcesTree(config, source)\n ]);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return result;\n}\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty('_default')) {\n return _object_spread_props(_object_spread({}, schema), {\n _value: schema._default,\n _source: 'default'\n });\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce(function(obj, key) {\n obj[key] = getSchemaWithValuesAndSources(schema[key]);\n return obj;\n }, {});\n } else {\n // at this point, the schema is bad and an error will have been logged during schema validation\n return {};\n }\n}\nfunction createValuesAndSourcesTree(config, source) {\n if (isOrdinaryObject(config)) {\n return Object.keys(config).reduce(function(obj, key) {\n obj[key] = createValuesAndSourcesTree(config[key], source);\n return obj;\n }, {});\n } else {\n return {\n _value: config,\n _source: source\n };\n }\n}\nfunction getExtensionSlotConfigs(configState, tempConfigState) {\n var allConfigs = mergeConfigs(getProvidedConfigs(configState, tempConfigState));\n var slotConfigPerModule = Object.keys(allConfigs).reduce(function(obj, key) {\n var _allConfigs_key;\n if ((_allConfigs_key = allConfigs[key]) === null || _allConfigs_key === void 0 ? void 0 : _allConfigs_key.extensionSlots) {\n var _allConfigs_key1;\n obj[key] = (_allConfigs_key1 = allConfigs[key]) === null || _allConfigs_key1 === void 0 ? void 0 : _allConfigs_key1.extensionSlots;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n var slotConfigs = Object.keys(slotConfigPerModule).reduce(function(obj, key) {\n obj = _object_spread({}, obj, slotConfigPerModule[key]);\n return obj;\n }, {});\n return slotConfigs;\n}\nfunction validateAllExtensionSlotConfigs(slotConfigPerModule) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.entries(slotConfigPerModule)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _step_value = _sliced_to_array(_step.value, 2), moduleName = _step_value[0], configBySlotName = _step_value[1];\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;\n try {\n for(var _iterator1 = Object.entries(configBySlotName)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){\n var _step_value1 = _sliced_to_array(_step1.value, 2), slotName = _step_value1[0], config = _step_value1[1];\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally{\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction validateExtensionSlotConfig(config, moduleName, slotName) {\n var keyPath = \"\".concat(moduleName, \".extensionSlots.\").concat(slotName);\n var errorPrefix = \"Extension slot config '\".concat(keyPath, \"'\");\n var invalidKeys = Object.keys(config).filter(function(k) {\n return ![\n 'add',\n 'remove',\n 'order',\n 'configure'\n ].includes(k);\n });\n if (invalidKeys.length) {\n logError(keyPath, errorPrefix + \"' contains invalid keys '\".concat(invalidKeys.join(\"', '\"), \"'\"));\n }\n if (config.add) {\n if (!Array.isArray(config.add) || !config.add.every(function(n) {\n return typeof n === 'string';\n })) {\n logError(keyPath, errorPrefix + \".add' is invalid. Must be an array of strings (extension IDs)\");\n }\n }\n if (config.remove) {\n if (!Array.isArray(config.remove) || !config.remove.every(function(n) {\n return typeof n === 'string';\n })) {\n logError(keyPath, errorPrefix + \".remove' is invalid. Must be an array of strings (extension IDs)\");\n }\n }\n if (config.order) {\n if (!Array.isArray(config.order) || !config.order.every(function(n) {\n return typeof n === 'string';\n })) {\n logError(keyPath, errorPrefix + \".order' is invalid. Must be an array of strings (extension IDs)\");\n }\n }\n if (config.configure) {\n if (!isOrdinaryObject(config.configure)) {\n logError(keyPath, errorPrefix + \".configure' is invalid. Must be an object with extension IDs for keys\");\n }\n }\n}\nfunction getProvidedConfigs(configState, tempConfigState) {\n return _to_consumable_array(configState.providedConfigs.map(function(c) {\n return c.config;\n })).concat([\n tempConfigState.config\n ]);\n}\n/**\n * Validates the config schema for a module. Since problems identified here are programming errors\n * that hopefully will be caught during development, this function logs errors to the console directly;\n * it's fine if we spam the user with these errors.\n */ function validateConfigSchema(moduleName, schema) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n var updateMessage = \"Please verify that you are running the latest version and, if so, alert the maintainer.\";\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(schema).filter(function(k) {\n return !k.startsWith('_');\n })[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var thisKeyPath = keyPath + (keyPath && '.') + key;\n var schemaPart = schema[key];\n if (thisKeyPath === 'Display conditions') {\n console.error(\"\".concat(moduleName, ' declares a configuration option called \"Display conditions\"; the \"Display conditions\" option is a reserved name. ').concat(updateMessage));\n }\n if (thisKeyPath === 'Translation overrides') {\n console.error(\"\".concat(moduleName, ' declares a configuration option called \"Translation overrides\"; the \"Translation overrides\" option is a reserved name. ').concat(updateMessage));\n }\n if (!isOrdinaryObject(schemaPart)) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage));\n continue;\n }\n if (!schemaPart.hasOwnProperty('_default')) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n var elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + '._elements');\n }\n if (schemaPart._validators) {\n var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;\n try {\n for(var _iterator1 = schemaPart._validators[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){\n var _$validator = _step1.value;\n if (typeof _$validator !== 'function') {\n console.error(\"\".concat(moduleName, \" has invalid validator for key '\").concat(thisKeyPath, \"' \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: validators must be functions that return either \" + \"undefined or an error string. Received \".concat(_$validator, \".\"));\n }\n }\n } catch (err) {\n _didIteratorError1 = true;\n _iteratorError1 = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion1 && _iterator1.return != null) {\n _iterator1.return();\n }\n } finally{\n if (_didIteratorError1) {\n throw _iteratorError1;\n }\n }\n }\n }\n var valueType = schemaPart._type;\n if (valueType && !Object.values(_types_js__rspack_import_0.Type).includes(valueType)) {\n console.error(\"\".concat(moduleName, \" has invalid type for key '\").concat(thisKeyPath, \"' \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: the allowed types are \".concat(Object.values(_types_js__rspack_import_0.Type).join(', '), \". \") + \"Received '\".concat(valueType, \"'\"));\n }\n if (Object.keys(schemaPart).every(function(k) {\n return [\n '_description',\n '_validators',\n '_elements',\n '_type'\n ].includes(k);\n }) && !keyPath.includes('._elements')) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: all config elements must have a default. \" + \"Received \".concat(JSON.stringify(schemaPart)));\n }\n if (elements && valueType && ![\n _types_js__rspack_import_0.Type.Array,\n _types_js__rspack_import_0.Type.Object\n ].includes(valueType)) {\n console.error(\"\".concat(moduleName, \" has bad config schema definition for key '\").concat(thisKeyPath, \"'. \").concat(updateMessage, \".\") + \"\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. \" + \"Received \".concat(JSON.stringify(valueType)));\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction getConfigForModule(moduleName, configState, tempConfigState) {\n var schema = configState.schemas[moduleName];\n var inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n validateStructure(schema, inputConfig, moduleName);\n var config = setDefaults(schema, inputConfig);\n runAllValidatorsInConfigTree(schema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction getConfigForModuleImplicitSchema(moduleName, configState, tempConfigState) {\n var inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs(configState, tempConfigState));\n var config = setDefaults(implicitConfigSchema, inputConfig);\n runAllValidatorsInConfigTree(implicitConfigSchema, config, moduleName);\n delete config.extensionSlots;\n return config;\n}\nfunction mergeConfigsFor(moduleName, allConfigs) {\n var allConfigsForModule = allConfigs.map(function(param) {\n var c = param[moduleName];\n return c;\n }).filter(function(c) {\n return !!c;\n });\n return mergeConfigs(allConfigsForModule);\n}\nfunction mergeConfigs(configs) {\n return configs.reduce(function(acc, config) {\n return mergeDeepReplace(acc, config);\n }, {});\n}\n/**\n * Recursively check the provided config tree to make sure that all\n * of the provided properties exist in the schema, and that types are\n * correct. Does not run validators yet, since those will be run on\n * the config with the defaults filled in.\n */ function validateStructure(schema, config) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n // validate each constituent element\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n var thisKeyPath = keyPath + '.' + key;\n var schemaPart = schema[key];\n if (!schema.hasOwnProperty(key)) {\n if (!(key === 'extensionSlots' && keyPath !== '')) {\n logError(thisKeyPath, \"Unknown config key '\".concat(thisKeyPath, \"' provided. Ignoring.\"));\n }\n continue;\n }\n validateBranchStructure(schemaPart, value, thisKeyPath);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n}\nfunction validateBranchStructure(schemaPart, value, keyPath) {\n checkType(keyPath, schemaPart._type, value);\n if (isOrdinaryObject(value)) {\n if (schemaPart._type === _types_js__rspack_import_0.Type.Object) {\n // validate as freeform object\n validateFreeformObjectStructure(schemaPart, value, keyPath);\n } else if (!(schemaPart.hasOwnProperty('_default') || schemaPart.hasOwnProperty('_type'))) {\n // validate as normal nested config\n validateStructure(schemaPart, value, keyPath);\n }\n } else {\n if (schemaPart._type === _types_js__rspack_import_0.Type.Array) {\n validateArrayStructure(schemaPart, value, keyPath);\n }\n }\n}\nfunction validateFreeformObjectStructure(freeformObjectSchema, config, keyPath) {\n if (freeformObjectSchema._elements) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n validateBranchStructure(freeformObjectSchema._elements, value, \"\".concat(keyPath, \".\").concat(key));\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n}\nfunction validateArrayStructure(arraySchema, value, keyPath) {\n var validatedAsArray = checkType(keyPath, _types_js__rspack_import_0.Type.Array, value);\n if (!validatedAsArray) {\n return;\n }\n // if there is an array element object schema, verify that elements match it\n if (hasObjectSchema(arraySchema._elements)) {\n for(var i = 0; i < value.length; i++){\n validateBranchStructure(arraySchema._elements, value[i], \"\".concat(keyPath, \"[\").concat(i, \"]\"));\n }\n }\n for(var i1 = 0; i1 < value.length; i1++){\n var _arraySchema__elements;\n checkType(\"\".concat(keyPath, \"[\").concat(i1, \"]\"), (_arraySchema__elements = arraySchema._elements) === null || _arraySchema__elements === void 0 ? void 0 : _arraySchema__elements._type, value[i1]);\n }\n}\n/**\n * Run all the validators in the config tree. This should be run\n * on the config object after it has been filled in with all the defaults, since\n * higher-level validators may refer to default values.\n */ function runAllValidatorsInConfigTree(schema, config) {\n var keyPath = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : '';\n // If `!schema`, there should have been a structural validation error printed already.\n if (schema) {\n if (config !== schema._default) {\n runValidators(keyPath, schema._validators, config);\n }\n if (isOrdinaryObject(config)) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(config)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var key = _step.value;\n var value = config[key];\n var thisKeyPath = keyPath + '.' + key;\n var schemaPart = schema[key];\n if (schema._type === _types_js__rspack_import_0.Type.Object && schema._elements) {\n runAllValidatorsInConfigTree(schema._elements, value, thisKeyPath);\n } else {\n runAllValidatorsInConfigTree(schemaPart, value, thisKeyPath);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n } else if (Array.isArray(config) && schema._elements) {\n for(var i = 0; i < config.length; i++){\n runAllValidatorsInConfigTree(schema._elements, config[i], \"\".concat(keyPath, \"[\").concat(i, \"]\"));\n }\n }\n }\n}\n/**\n * Run type validation for the value, logging any errors.\n * @returns true if validation passes, false otherwise\n */ function checkType(keyPath, _type, value) {\n if (_type) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n var _$validator = {\n Array: _validators_type_validators_js__rspack_import_1.isArray,\n Boolean: _validators_type_validators_js__rspack_import_1.isBoolean,\n ConceptUuid: _validators_type_validators_js__rspack_import_1.isUuid,\n Number: _validators_type_validators_js__rspack_import_1.isNumber,\n Object: _validators_type_validators_js__rspack_import_1.isObject,\n String: _validators_type_validators_js__rspack_import_1.isString,\n UUID: _validators_type_validators_js__rspack_import_1.isUuid,\n PersonAttributeTypeUuid: _validators_type_validators_js__rspack_import_1.isUuid,\n PatientIdentifierTypeUuid: _validators_type_validators_js__rspack_import_1.isUuid\n };\n return runValidators(keyPath, [\n _$validator[_type]\n ], value);\n }\n return true;\n}\n/**\n * Runs validators, logging errors.\n * @returns true if all pass, false otherwise.\n */ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nfunction runValidators(keyPath, validators, value) {\n var returnValue = true;\n if (validators) {\n try {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = validators[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n var _$validator = _step.value;\n var validatorResult = _$validator(value);\n if (typeof validatorResult === 'string') {\n var message = (typeof value === \"undefined\" ? \"undefined\" : _type_of(value)) === 'object' ? \"Invalid configuration for \".concat(keyPath, \": \").concat(validatorResult) : \"Invalid configuration value \".concat(value, \" for \").concat(keyPath, \": \").concat(validatorResult);\n logError(keyPath, message);\n returnValue = false;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n } catch (e) {\n console.error('Skipping invalid validator at \"'.concat(keyPath, '\". Encountered error\\n\t').concat(e));\n }\n }\n return returnValue;\n}\n// Recursively fill in the config with values from the schema.\nvar setDefaults = function setDefaults1(schema, inputConfig) {\n var config = structuredClone(inputConfig);\n if (!schema) {\n return config;\n }\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n var _loop = function() {\n var key = _step.value;\n var configPart = config[key];\n var schemaPart = schema[key];\n // The `schemaPart &&` clause of this `if` statement will only fail\n // if the schema is very invalid. It is there to prevent the app from\n // crashing completely, though it will produce unexpected behavior.\n // If this happens, there should be legible errors in the console from\n // the schema validator.\n if (schemaPart && (schemaPart.hasOwnProperty('_type') || schemaPart.hasOwnProperty('_default'))) {\n // We assume that schemaPart defines a config value, since it has\n // a property `_type` or `_default`.\n if (!config.hasOwnProperty(key)) {\n config[key] = schemaPart['_default'];\n }\n // We also check if it is an object or array with object elements, in which case we recurse\n var elements = schemaPart._elements;\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === _types_js__rspack_import_0.Type.Array && Array.isArray(configPart)) {\n var configWithDefaults = configPart.map(function(conf) {\n return setDefaults(elements, conf);\n });\n config[key] = configWithDefaults;\n } else if (schemaPart._type === _types_js__rspack_import_0.Type.Object) {\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;\n try {\n for(var _iterator = Object.keys(configPart)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion = (_step1 = _iterator.next()).done); _iteratorNormalCompletion = true){\n var objectKey = _step1.value;\n configPart[objectKey] = setDefaults(elements, configPart[objectKey]);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n }\n }\n } else if (isOrdinaryObject(schemaPart)) {\n // Since schemaPart has no property \"_type\", if it's an ordinary object\n // (unlike, importantly, the validators array), we assume it is a parent config property.\n // We recurse to config[key] and schema[key]. Default config[key] to {}.\n var selectedConfigPart = configPart !== null && configPart !== void 0 ? configPart : {};\n // There will have been a validation error already if configPart is not a plain object.\n if (isOrdinaryObject(selectedConfigPart)) {\n config[key] = setDefaults(schemaPart, selectedConfigPart);\n }\n }\n };\n for(var _iterator = Object.keys(schema)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally{\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally{\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return config;\n};\nfunction hasObjectSchema(elementsSchema) {\n return !!elementsSchema && Object.keys(elementsSchema).filter(function(e) {\n return ![\n '_default',\n '_validators'\n ].includes(e);\n }).length > 0;\n}\nfunction isOrdinaryObject(value) {\n return (typeof value === \"undefined\" ? \"undefined\" : _type_of(value)) === 'object' && !Array.isArray(value) && value !== null;\n}\n/** Keep track of which validation errors we have displayed. Each one should only be displayed once. */ var displayedValidationMessages = new Set();\nfunction logError(keyPath, message) {\n var key = \"\".concat(keyPath, \":::\").concat(message);\n // technically, this should not be possible, but because of how things wind-up transpiled, this isn't impossible\n if (!displayedValidationMessages) {\n displayedValidationMessages = new Set();\n }\n if (!displayedValidationMessages.has(key)) {\n console.error(message);\n displayedValidationMessages.add(key);\n }\n}\n/**\n * Normally, configuration errors are only displayed once. This function clears the list of\n * displayed errors, so that they will be displayed again.\n *\n * @internal\n */ function clearConfigErrors(keyPath) {\n if (keyPath) {\n displayedValidationMessages.forEach(function(key) {\n if (key.startsWith(keyPath)) {\n displayedValidationMessages.delete(key);\n }\n });\n } else {\n displayedValidationMessages.clear();\n }\n}\n/**\n * Cleans up all config store subscriptions and re-establishes them. This is primarily\n * useful for testing, where subscriptions set up at module load time need to be cleared\n * between tests to prevent infinite update loops. After clearing, subscriptions are\n * re-established so the config system continues to work normally.\n *\n * @internal\n */ function resetConfigSystem() {\n configSubscriptions.forEach(function(unsubscribe) {\n return unsubscribe();\n });\n configSubscriptions.length = 0;\n setupConfigSubscriptions();\n}\n/**\n * Copied over from esm-extensions. It rightly belongs to that module, but esm-config\n * cannot depend on esm-extensions.\n */ function getExtensionNameFromId(extensionId) {\n var _extensionId_split = _sliced_to_array(extensionId.split('#'), 1), extensionName = _extensionId_split[0];\n return extensionName;\n}\n/**\n * The translation overrides schema is used in the implicit schema given to every module;\n * plus any additional translation namespaces (at time of writing, this is just 'core').\n */ var translationOverridesSchema = {\n 'Translation overrides': {\n _description: 'Per-language overrides for frontend translations should be keyed by language code and each language dictionary contains the translation key and the display value',\n _type: _types_js__rspack_import_0.Type.Object,\n _default: {},\n _validators: [\n (0,_validators_validator_js__rspack_import_2.validator)(function(o) {\n return Object.keys(o).every(function(k) {\n return /^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k);\n });\n }, function(o) {\n var badKeys = Object.keys(o).filter(function(k) {\n return !/^[a-z]{2,3}(-[A-Z]{2,3})?$/.test(k);\n });\n return \"The 'Translation overrides' object should have language codes for keys. Language codes must be in the form of a two-to-three letter language code optionally followed by a hyphen and a two-to-three letter country code. The following keys do not conform: \".concat(badKeys.join(', '), \".\");\n })\n ]\n }\n};\n/**\n * The implicitConfigSchema is implicitly included in every configuration schema\n */ var implicitConfigSchema = _object_spread({\n 'Display conditions': {\n privileges: {\n _description: 'The privilege(s) the user must have to use this extension',\n _type: _types_js__rspack_import_0.Type.Array,\n _default: []\n },\n expression: {\n _description: 'The expression that determines whether the extension is displayed',\n _type: _types_js__rspack_import_0.Type.String,\n _default: undefined\n }\n }\n}, translationOverridesSchema);\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLWNvbmZpZy9kaXN0L21vZHVsZS1jb25maWcvbW9kdWxlLWNvbmZpZy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1jb25maWcvZGlzdC9tb2R1bGUtY29uZmlnL21vZHVsZS1jb25maWcuanM/YzNhNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgQ29uZmlnICovIGltcG9ydCB7IGNsb25lRGVlcCwgaXNFcXVhbCwgbWVyZ2VXaXRoLCBvbWl0IGFzIGxvZGFzaE9taXQgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBpc0FycmF5LCBpc0Jvb2xlYW4sIGlzVXVpZCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gXCIuLi92YWxpZGF0b3JzL3R5cGUtdmFsaWRhdG9ycy5qc1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4uL3ZhbGlkYXRvcnMvdmFsaWRhdG9yLmpzXCI7XG5pbXBvcnQgeyBjb25maWdFeHRlbnNpb25TdG9yZSwgY29uZmlnSW50ZXJuYWxTdG9yZSwgZ2V0Q29uZmlnU3RvcmUsIGdldEV4dGVuc2lvbkNvbmZpZywgZ2V0RXh0ZW5zaW9uU2xvdHNDb25maWdTdG9yZSwgZ2V0RXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLCBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlIH0gZnJvbSBcIi4vc3RhdGUuanNcIjtcbi8qKlxuICogRGVlcCBtZXJnZSB0d28gb2JqZWN0cywgd2l0aCByaWdodC1zaWRlIHZhbHVlcyB0YWtpbmcgcHJlY2VkZW5jZS5cbiAqIEFycmF5cyBhcmUgcmVwbGFjZWQgZW50aXJlbHkgKG5vdCBtZXJnZWQgYnkgaW5kZXgpLCBtYXRjaGluZyB0aGVcbiAqIGJlaGF2aW9yIG9mIHJhbWRhJ3MgbWVyZ2VEZWVwUmlnaHQuXG4gKi8gZnVuY3Rpb24gbWVyZ2VEZWVwUmVwbGFjZShsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiBtZXJnZVdpdGgoe30sIGxlZnQsIHJpZ2h0LCAoX29ialZhbHVlLCBzcmNWYWx1ZSk9PntcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogU3RvcmUgc2V0dXBcbiAqXG4gKlxuICogU2V0IHVwIHN0b3JlcyBhbmQgc3Vic2NyaXB0aW9ucyBzbyB0aGF0IGlucHV0cyBnZXQgcHJvY2Vzc2VkIGFwcHJvcHJpYXRlbHkuXG4gKlxuICogVGhlcmUgYXJlICppbnB1dCogc3RvcmVzIGFuZCAqb3V0cHV0KiBzdG9yZXMuIFRoZSAqaW5wdXQqIHN0b3Jlc1xuICogYXJlIGNvbmZpZ0ludGVybmFsU3RvcmUsIHRlbXBvcmFyeUNvbmZpZ1N0b3JlLCBhbmQgY29uZmlnRXh0ZW5zaW9uU3RvcmUuIFRoZVxuICogb3V0cHV0IHN0b3JlcyBhcmUgc2V0IGluIHRoZSBgY29tcHV0ZS4uLmAgZnVuY3Rpb25zLiBUaGV5IGFyZSB0aGUgbW9kdWxlXG4gKiBjb25maWcgc3RvcmVzLCB0aGUgZXh0ZW5zaW9uIHNsb3QgY29uZmlnIHN0b3JlcyAoYnkgbW9kdWxlKSwgdGhlIGV4dGVuc2lvblxuICogY29uZmlnIHN0b3JlcywgYW5kIHRoZSBpbXBsZW1lbnRlciB0b29scyBjb25maWcgc3RvcmUuXG4gKlxuICogVGhpcyBjb2RlIHNldHMgdXAgdGhlIHN1YnNjcmlwdGlvbnMgc28gdGhhdCB3aGVuIGFuIGlucHV0IHN0b3JlIGNoYW5nZXMsXG4gKiB0aGUgY29ycmVjdCBzZXQgb2Ygb3V0cHV0IHN0b3JlcyBhcmUgdXBkYXRlZC5cbiAqXG4gKiBBbGwgYGNvbXB1dGUuLi5gIGZ1bmN0aW9ucyBleGNlcHQgYGNvbXB1dGVFeHRlbnNpb25Db25maWdzYCBhcmUgcHVyZVxuICogKG9yIGFyZSBzdXBwb3NlZCB0byBiZSksIG90aGVyIHRoYW4gdGhlIGZhY3QgdGhhdCB0aGV5IGFsbCBgc2V0U3RhdGVgXG4gKiBzdG9yZSB2YWx1ZXMgYXQgdGhlIGVuZC4gYGNvbXB1dGVFeHRlbnNpb25Db25maWdzYCBjYWxscyBgZ2V0R2xvYmFsU3RvcmVgLFxuICogd2hpY2ggY3JlYXRlcyBzdG9yZXMuXG4gKi8gLy8gU3RvcmUgdW5zdWJzY3JpYmUgZnVuY3Rpb25zIHRvIGFsbG93IGNsZWFudXAgKGUuZy4sIGluIHRlc3RzIG9yIGhvdCBtb2R1bGUgcmVsb2FkaW5nKVxuY29uc3QgY29uZmlnU3Vic2NyaXB0aW9ucyA9IFtdO1xuLyoqXG4gKiBSZWNvbXB1dGVzIGFsbCBjb25maWd1cmF0aW9uIGRlcml2ZWQgc3RvcmVzIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgb2YgaW5wdXQgc3RvcmVzLlxuICogQ2FsbGVkIHdoZW5ldmVyIGFueSBpbnB1dCBzdG9yZSAoY29uZmlnSW50ZXJuYWxTdG9yZSwgdGVtcG9yYXJ5Q29uZmlnU3RvcmUsIGNvbmZpZ0V4dGVuc2lvblN0b3JlKSBjaGFuZ2VzLlxuICovIGZ1bmN0aW9uIHJlY29tcHV0ZUFsbENvbmZpZ3MoKSB7XG4gICAgY29uc3QgY29uZmlnU3RhdGUgPSBjb25maWdJbnRlcm5hbFN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgdGVtcENvbmZpZ1N0YXRlID0gdGVtcG9yYXJ5Q29uZmlnU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBleHRlbnNpb25TdGF0ZSA9IGNvbmZpZ0V4dGVuc2lvblN0b3JlLmdldFN0YXRlKCk7XG4gICAgY29tcHV0ZU1vZHVsZUNvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlSW1wbGVtZW50ZXJUb29sc0NvbmZpZyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb21wdXRlRXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MoY29uZmlnU3RhdGUsIGV4dGVuc2lvblN0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xufVxuZnVuY3Rpb24gc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCkge1xuICAgIC8vIEluaXRpYWwgY29tcHV0YXRpb25cbiAgICByZWNvbXB1dGVBbGxDb25maWdzKCk7XG4gICAgLy8gU3Vic2NyaWJlIHRvIGFsbCBpbnB1dCBzdG9yZXMgd2l0aCBhIHNpbmdsZSBoYW5kbGVyXG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIG9ubHkgcmVjb21wdXRlIG9uY2UgZXZlbiBpZiBtdWx0aXBsZSBzdG9yZXMgY2hhbmdlIHNpbXVsdGFuZW91c2x5XG4gICAgY29uZmlnU3Vic2NyaXB0aW9ucy5wdXNoKGNvbmZpZ0ludGVybmFsU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2godGVtcG9yYXJ5Q29uZmlnU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLnB1c2goY29uZmlnRXh0ZW5zaW9uU3RvcmUuc3Vic2NyaWJlKHJlY29tcHV0ZUFsbENvbmZpZ3MpKTtcbn1cbi8vIFNldCB1cCBzdWJzY3JpcHRpb25zIGF0IG1vZHVsZSBsb2FkIHRpbWVcbnNldHVwQ29uZmlnU3Vic2NyaXB0aW9ucygpO1xuZnVuY3Rpb24gY29tcHV0ZU1vZHVsZUNvbmZpZyhzdGF0ZSwgdGVtcFN0YXRlKSB7XG4gICAgZm9yIChsZXQgbW9kdWxlTmFtZSBvZiBPYmplY3Qua2V5cyhzdGF0ZS5zY2hlbWFzKSl7XG4gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNjaGVtYSBjb3VsZCBiZSBlaXRoZXIganVzdCB0aGUgaW1wbGljaXQgc2NoZW1hIG9yIHRoZSBhY3R1YWxseVxuICAgICAgICAvLyBkZWZpbmVkIHNjaGVtYS4gV2UgcnVuIHdpdGgganVzdCB0aGUgaW1wbGljaXQgc2NoZW1hIGJlY2F1c2Ugd2Ugd2FudCB0byBwb3B1bGF0ZVxuICAgICAgICAvLyB0aGUgY29uZmlnIHN0b3JlIHdpdGggdGhlIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBhcyBzb29uIGFzIHBvc3NpYmxlLiBJbiBmYWN0LCB0aGVcbiAgICAgICAgLy8gdHJhbnNsYXRpb24gc3lzdGVtIHdpbGwgdGhyb3cgZm9yIFN1c3BlbnNlIHVudGlsIHRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgYXJlXG4gICAgICAgIC8vIGF2YWlsYWJsZSwgd2hpY2ggYXMgb2YgdGhpcyB3cml0aW5nIGJsb2NrcyB0aGUgc2NoZW1hIGRlZmluaXRpb24gZnJvbSBvY2N1cnJpbmdcbiAgICAgICAgLy8gZm9yIG1vZHVsZXMgbG9hZGVkIGJhc2VkIG9uIHRoZWlyIGV4dGVuc2lvbnMuXG4gICAgICAgIGNvbnN0IG1vZHVsZVN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGxldCBuZXdTdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlLm1vZHVsZUxvYWRlZFttb2R1bGVOYW1lXSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRm9yTW9kdWxlKG1vZHVsZU5hbWUsIHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zvck1vZHVsZUltcGxpY2l0U2NoZW1hKG1vZHVsZU5hbWUsIHN0YXRlLCB0ZW1wU3RhdGUpO1xuICAgICAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25PdmVycmlkZXNMb2FkZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbW9kdWxlU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25TbG90Q29uZmlncyhzdGF0ZSwgdGVtcFN0YXRlKSB7XG4gICAgY29uc3Qgc2xvdENvbmZpZ3MgPSBnZXRFeHRlbnNpb25TbG90Q29uZmlncyhzdGF0ZSwgdGVtcFN0YXRlKTtcbiAgICBjb25zdCBuZXdTbG90U3RvcmVFbnRyaWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNsb3RDb25maWdzKS5tYXAoKFtzbG90TmFtZSwgY29uZmlnXSk9PltcbiAgICAgICAgICAgIHNsb3ROYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSkpO1xuICAgIGNvbnN0IHNsb3RTdG9yZSA9IGdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IHNsb3RTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBzbG90czoge1xuICAgICAgICAgICAgLi4ub2xkU3RhdGUuc2xvdHMsXG4gICAgICAgICAgICAuLi5uZXdTbG90U3RvcmVFbnRyaWVzXG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmICghaXNFcXVhbChvbGRTdGF0ZS5zbG90cywgbmV3U3RhdGUuc2xvdHMpKSB7XG4gICAgICAgIHNsb3RTdG9yZS5zZXRTdGF0ZShuZXdTdGF0ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcHV0ZUltcGxlbWVudGVyVG9vbHNDb25maWcoc3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gaW1wbGVtZW50ZXJUb29sc0NvbmZpZ1N0b3JlLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29uZmlnID0gZ2V0SW1wbGVtZW50ZXJUb29sc0NvbmZpZyhzdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgY29uZmlnXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSBvbiB0aGUgYWN0dWFsIGNvbmZpZyBjb250ZW50LCBub3QgdGhlIHdyYXBwZXIgb2JqZWN0XG4gICAgaWYgKCFpc0VxdWFsKG9sZFN0YXRlLmNvbmZpZywgbmV3U3RhdGUuY29uZmlnKSkge1xuICAgICAgICBpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVFeHRlbnNpb25Db25maWdzKGNvbmZpZ1N0YXRlLCBleHRlbnNpb25TdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBtb2R1bGUgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgc2luY2UgdGhlIGV4dGVuc2lvblxuICAgIC8vIGl0IGNvbnRhaW5zIGlzIG1vdW50ZWQuXG4gICAgZm9yIChsZXQgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvblN0YXRlLm1vdW50ZWRFeHRlbnNpb25zKXtcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhleHRlbnNpb24uc2xvdE1vZHVsZU5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25Nb2R1bGVOYW1lLCBleHRlbnNpb24uc2xvdE5hbWUsIGV4dGVuc2lvbi5leHRlbnNpb25JZCwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSk7XG4gICAgICAgIGlmICghY29uZmlnc1tleHRlbnNpb24uc2xvdE5hbWVdKSB7XG4gICAgICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25maWdzW2V4dGVuc2lvbi5zbG90TmFtZV1bZXh0ZW5zaW9uLmV4dGVuc2lvbklkXSA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIGxvYWRlZDogdHJ1ZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zQ29uZmlnU3RvcmUgPSBnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IGV4dGVuc2lvbnNDb25maWdTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgICAgICBjb25maWdzXG4gICAgfTtcbiAgICAvLyBVc2UgZGVlcCBlcXVhbGl0eSB0byBvbmx5IHVwZGF0ZSBpZiBjb25maWdzIGFjdHVhbGx5IGNoYW5nZWRcbiAgICBpZiAoIWlzRXF1YWwob2xkU3RhdGUuY29uZmlncywgbmV3U3RhdGUuY29uZmlncykpIHtcbiAgICAgICAgZXh0ZW5zaW9uc0NvbmZpZ1N0b3JlLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICB9XG59XG4vKlxuICogQVBJXG4gKlxuICovIC8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGEgbW9kdWxlLiBUaGUgc2NoZW1hIHRlbGxzIHRoZVxuICogY29uZmlndXJhdGlvbiBzeXN0ZW0gaG93IHRoZSBtb2R1bGUgY2FuIGJlIGNvbmZpZ3VyZWQuIEl0IHNwZWNpZmllc1xuICogd2hhdCBtYWtlcyBjb25maWd1cmF0aW9uIHZhbGlkIG9yIGludmFsaWQuXG4gKlxuICogU2VlIFtDb25maWd1cmF0aW9uIFN5c3RlbV0oaHR0cHM6Ly9vMy1kb2NzLm9wZW5tcnMub3JnL2VuLVVTL2RvY3MvY29uZmlndXJhdGlvbi1zeXN0ZW0pXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkZWZpbmluZyBhIGNvbmZpZyBzY2hlbWEuXG4gKlxuICogQHBhcmFtIG1vZHVsZU5hbWUgTmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBzY2hlbWEgaXMgYmVpbmcgZGVmaW5lZCBmb3IuIEdlbmVyYWxseVxuICogICBzaG91bGQgYmUgdGhlIG9uZSBpbiB3aGljaCB0aGUgYGRlZmluZUNvbmZpZ1NjaGVtYWAgY2FsbCB0YWtlcyBwbGFjZS5cbiAqIEBwYXJhbSBzY2hlbWEgVGhlIGNvbmZpZyBzY2hlbWEgZm9yIHRoZSBtb2R1bGVcbiAqLyBleHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSkge1xuICAgIHZhbGlkYXRlQ29uZmlnU2NoZW1hKG1vZHVsZU5hbWUsIHNjaGVtYSk7XG4gICAgY29uc3QgZW5oYW5jZWRTY2hlbWEgPSBtZXJnZURlZXBSZXBsYWNlKHNjaGVtYSwgaW1wbGljaXRDb25maWdTY2hlbWEpO1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsZXJ0cyB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gdGhhdCBhIG1vZHVsZSBleGlzdHMuIFRoaXMgYWxsb3dzIGNvbmZpZyB0byBiZVxuICogcHJvY2Vzc2VkLCB3aGlsZSBzdGlsbCBhbGxvd2luZyB0aGUgZXh0ZW5zaW9uIHN5c3RlbSB0byBrbm93IHdoZXRoZXIgdGhlIG1vZHVsZSBoYXNcbiAqIGFjdHVhbGx5IGhhZCBpdHMgZnJvbnQgYnVuZGxlIGV4ZWN1dGVkIHlldC5cbiAqXG4gKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gZXNtLWFwcC1zaGVsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSBtb2R1bGVOYW1lXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlV2l0aENvbmZpZ1N5c3RlbShtb2R1bGVOYW1lKSB7XG4gICAgY29uZmlnSW50ZXJuYWxTdG9yZS5zZXRTdGF0ZSgoc3RhdGUpPT4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBzY2hlbWFzOiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuc2NoZW1hcyxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IGltcGxpY2l0Q29uZmlnU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBhbGVydHMgdGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIHRoYXQgYSBtb2R1bGUgaGFzIGJlZW4gbG9hZGVkLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG1vZHVsZU5hbWVcbiAqLyBleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVMb2FkKG1vZHVsZU5hbWUpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIG1vZHVsZUxvYWRlZDoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1vZHVsZUxvYWRlZCxcbiAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xufVxuLyoqXG4gKiBUaGlzIGFsbG93cyB0aGUgY29uZmlnIHN5c3RlbSB0byBzdXBwb3J0IHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgbmFtZXNwYWNlcyB0aGF0XG4gKiBkbyBub3QgY29ycmVzcG9uZCB0byBtb2R1bGVzLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBlc20tYXBwLXNoZWxsLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIG5hbWVzcGFjZVxuICovIGV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlKG5hbWVzcGFjZSkge1xuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW25hbWVzcGFjZV06IHRyYW5zbGF0aW9uT3ZlcnJpZGVzU2NoZW1hXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbn1cbi8qKlxuICogVGhpcyBkZWZpbmVzIGEgY29uZmlndXJhdGlvbiBzY2hlbWEgZm9yIGFuIGV4dGVuc2lvbi4gV2hlbiBhIHNjaGVtYSBpcyBkZWZpbmVkXG4gKiBmb3IgYW4gZXh0ZW5zaW9uLCB0aGF0IGV4dGVuc2lvbiB3aWxsIHJlY2VpdmUgdGhlIGNvbmZpZ3VyYXRpb24gY29ycmVzcG9uZGluZ1xuICogdG8gdGhhdCBzY2hlbWEsIHJhdGhlciB0aGFuIHRoZSBjb25maWd1cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vZHVsZVxuICogaW4gd2hpY2ggaXQgaXMgZGVmaW5lZC5cbiAqXG4gKiBUaGUgc2NoZW1hIHRlbGxzIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBob3cgdGhlIG1vZHVsZSBjYW4gYmUgY29uZmlndXJlZC5cbiAqIEl0IHNwZWNpZmllcyB3aGF0IG1ha2VzIGNvbmZpZ3VyYXRpb24gdmFsaWQgb3IgaW52YWxpZC5cbiAqXG4gKiBTZWUgW0NvbmZpZ3VyYXRpb24gU3lzdGVtXShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZW4tVVMvZG9jcy9jb25maWd1cmF0aW9uLXN5c3RlbSlcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRlZmluaW5nIGEgY29uZmlnIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBOYW1lIG9mIHRoZSBleHRlbnNpb24gdGhlIHNjaGVtYSBpcyBiZWluZyBkZWZpbmVkIGZvci5cbiAqICAgU2hvdWxkIG1hdGNoIHRoZSBgbmFtZWAgb2Ygb25lIG9mIHRoZSBgZXh0ZW5zaW9uc2AgZW50cmllcyBkZWZpbmVkIGluXG4gKiAgIHRoZSBhcHAncyBgcm91dGVzLmpzb25gIGZpbGUuXG4gKiBAcGFyYW0gc2NoZW1hIFRoZSBjb25maWcgc2NoZW1hIGZvciB0aGUgZXh0ZW5zaW9uXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbkNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShleHRlbnNpb25OYW1lLCBzY2hlbWEpO1xuICAgIGNvbnN0IGVuaGFuY2VkU2NoZW1hID0gbWVyZ2VEZWVwUmVwbGFjZShzY2hlbWEsIGltcGxpY2l0Q29uZmlnU2NoZW1hKTtcbiAgICBjb25zdCBzdGF0ZSA9IGNvbmZpZ0ludGVybmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICBpZiAoc3RhdGUuc2NoZW1hc1tleHRlbnNpb25OYW1lXSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb25maWcgc2NoZW1hIGZvciBleHRlbnNpb24gJHtleHRlbnNpb25OYW1lfSBhbHJlYWR5IGV4aXN0cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGV4dGVuc2lvbnMgd2l0aCB0aGlzIHNhbWUgbmFtZSwgb25lIHdpbGwgcHJvYmFibHkgY3Jhc2guYCk7XG4gICAgfVxuICAgIGNvbmZpZ0ludGVybmFsU3RvcmUuc2V0U3RhdGUoKHN0YXRlKT0+KHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgc2NoZW1hczoge1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnNjaGVtYXMsXG4gICAgICAgICAgICAgICAgW2V4dGVuc2lvbk5hbWVdOiBlbmhhbmNlZFNjaGVtYVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIFByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHByb2dyYW1tYXRpY2FsbHkuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG9cbiAqIHByb3ZpZGluZyBjb25maWd1cmF0aW9uIHRocm91Z2ggdGhlIGNvbmZpZy1maWxlLiBDb25maWd1cmF0aW9uIHByb3ZpZGVkIHRoaXNcbiAqIHdheSB3aWxsIGJlIG1lcmdlZCB3aXRoIGNvbmZpZ3VyYXRpb24gZnJvbSBvdGhlciBzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgQSBjb25maWd1cmF0aW9uIG9iamVjdCB0byBtZXJnZSBpbnRvIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHNvdXJjZU5hbWUgQW4gb3B0aW9uYWwgbmFtZSB0byBpZGVudGlmeSB0aGUgc291cmNlIG9mIHRoaXMgY29uZmlndXJhdGlvbixcbiAqICAgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBEZWZhdWx0cyB0byAncHJvdmlkZWQnLlxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm92aWRlKGNvbmZpZywgc291cmNlTmFtZSA9ICdwcm92aWRlZCcpIHtcbiAgICBjb25maWdJbnRlcm5hbFN0b3JlLnNldFN0YXRlKChzdGF0ZSk9Pih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHByb3ZpZGVkQ29uZmlnczogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnByb3ZpZGVkQ29uZmlncyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEEgcHJvbWlzZS1iYXNlZCB3YXkgdG8gYWNjZXNzIHRoZSBjb25maWcgYXMgc29vbiBhcyBpdCBpcyBmdWxseSBsb2FkZWQuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGxvYWRlZCwgcmVzb2x2ZXMgdGhlIGNvbmZpZyBpbiBpdHMgcHJlc2VudCBzdGF0ZS5cbiAqXG4gKiBUaGlzIGlzIGEgdXNlZnVsIGZ1bmN0aW9uIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgY29uZmlnIGluIHRoZSBjb3Vyc2VcbiAqIG9mIHRoZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGZvciB3aGljaCB0byBsb29rIHVwIHRoZSBjb25maWdcbiAqLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnKG1vZHVsZU5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgIGNvbnN0IHN0b3JlID0gZ2V0Q29uZmlnU3RvcmUobW9kdWxlTmFtZSk7XG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBsb2Rhc2hPbWl0KHN0YXRlLmNvbmZpZywgW1xuICAgICAgICAgICAgICAgICAgICAnRGlzcGxheSBjb25kaXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcydcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZShzdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRyYW5zbGF0aW9uIG92ZXJyaWRlcyBmb3IgYW4gZXh0ZW5zaW9uLCBvcHRpb25hbGx5IHNjb3BlZCB0byBhIHNwZWNpZmljXG4gKiBleHRlbnNpb24gc2xvdC4gV2hlbiBjYWxsZWQgd2l0aCBvbmx5IGEgbW9kdWxlIG5hbWUsIHJldHJpZXZlcyBtb2R1bGUtbGV2ZWwgb3ZlcnJpZGVzLlxuICogVHJhbnNsYXRpb24gb3ZlcnJpZGVzIGFsbG93IGN1c3RvbWl6aW5nIHRyYW5zbGF0ZWQgc3RyaW5ncyB3aXRob3V0IG1vZGlmeWluZyB0aGVcbiAqIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgcHJvdmlkaW5nIHRoZSB0cmFuc2xhdGlvbiBjb250ZXh0LlxuICogQHBhcmFtIHNsb3ROYW1lIE9wdGlvbmFsIGV4dGVuc2lvbiBzbG90IG5hbWUgdG8gaW5jbHVkZSBzbG90LXNwZWNpZmljIG92ZXJyaWRlcy5cbiAqIEBwYXJhbSBleHRlbnNpb25JZCBPcHRpb25hbCBleHRlbnNpb24gSUQgdG8gaW5jbHVkZSBleHRlbnNpb24tc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbiBvdmVycmlkZSBvYmplY3RzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbk92ZXJyaWRlcyhtb2R1bGVOYW1lLCBzbG90TmFtZSwgZXh0ZW5zaW9uSWQpIHtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldENvbmZpZ1N0b3JlKG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnRyYW5zbGF0aW9uT3ZlcnJpZGVzTG9hZGVkICYmIHN0YXRlLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbk92ZXJyaWRlcyA9IHN0YXRlLmNvbmZpZ1snVHJhbnNsYXRpb24gb3ZlcnJpZGVzJ10gPz8ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJhbnNsYXRpb25PdmVycmlkZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGUoY29uZmlnU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbmZpZ1N0b3JlLnN1YnNjcmliZSh1cGRhdGUpO1xuICAgICAgICB9KVxuICAgIF07XG4gICAgaWYgKHNsb3ROYW1lICYmIGV4dGVuc2lvbklkKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUpPT57XG4gICAgICAgICAgICBjb25zdCBjb25maWdTdG9yZSA9IGdldEV4dGVuc2lvbkNvbmZpZyhzbG90TmFtZSwgZXh0ZW5zaW9uSWQpO1xuICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxvYWRlZCAmJiBzdGF0ZS5jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXMgPSBzdGF0ZS5jb25maWdbJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyddID8/IHt9O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRyYW5zbGF0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlKGNvbmZpZ1N0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBjb25maWdTdG9yZS5zdWJzY3JpYmUodXBkYXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgaW50ZXJwb2xhdGUgZGVmYXVsdHMgZm9yIGBwcm92aWRlZENvbmZpZ2AgYWNjb3JkaW5nIHRvIGBzY2hlbWFgXG4gKlxuICogQHBhcmFtIHNjaGVtYSAgYSBjb25maWd1cmF0aW9uIHNjaGVtYVxuICogQHBhcmFtIHByb3ZpZGVkQ29uZmlnICBhbiBvYmplY3Qgb2YgY29uZmlnIHZhbHVlcyAod2l0aG91dCB0aGUgdG9wLWxldmVsIG1vZHVsZSBuYW1lKVxuICogQHBhcmFtIGtleVBhdGhDb250ZXh0ICBhIGRvdC1zZXBhcmF0ZWQgc3RyaW5nIHdoaWNoIGhlbHBzIHRoZSB1c2VyIGZpZ3VyZSBvdXQgd2hlcmVcbiAqICAgICB0aGUgcHJvdmlkZWQgY29uZmlnIGNhbWUgZnJvbVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBhbmQgcHJvY2Vzc2VkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggZGVmYXVsdHMgYXBwbGllZC5cbiAqIEBpbnRlcm5hbFxuICovIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uZmlnKHNjaGVtYSwgcHJvdmlkZWRDb25maWcsIGtleVBhdGhDb250ZXh0KSB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBwcm92aWRlZENvbmZpZywga2V5UGF0aENvbnRleHQpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHNldERlZmF1bHRzKHNjaGVtYSwgcHJvdmlkZWRDb25maWcpO1xuICAgIHJ1bkFsbFZhbGlkYXRvcnNJbkNvbmZpZ1RyZWUoc2NoZW1hLCBjb25maWcsIGtleVBhdGhDb250ZXh0KTtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnNcbiAqXG4gKi8gLyoqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGZvciBhbiBleHRlbnNpb24uIFRoaXMgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpY1xuICogdG8gdGhlIHNsb3QgaW4gd2hpY2ggaXQgaXMgbW91bnRlZCwgYW5kIGl0cyBJRCB3aXRoaW4gdGhhdCBzbG90LlxuICpcbiAqIFRoZSBzY2hlbWEgZm9yIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGUgZXh0ZW5zaW9uIHNjaGVtYS4gSWYgbm8gZXh0ZW5zaW9uXG4gKiBzY2hlbWEgaGFzIGJlZW4gcHJvdmlkZWQsIHRoZSBzY2hlbWEgdXNlZCBpcyB0aGUgc2NoZW1hIG9mIHRoZSBtb2R1bGUgaW5cbiAqIHdoaWNoIHRoZSBleHRlbnNpb24gaXMgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gc2xvdE1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gc2xvdFxuICogQHBhcmFtIGV4dGVuc2lvbk1vZHVsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aGljaCBkZWZpbmVzIHRoZSBleHRlbnNpb24gKGFuZCB0aGVyZWZvcmUgdGhlIGNvbmZpZyBzY2hlbWEpXG4gKiBAcGFyYW0gc2xvdE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBzbG90IHdoZXJlIHRoZSBleHRlbnNpb24gaXMgbW91bnRlZFxuICogQHBhcmFtIGV4dGVuc2lvbklkIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIGluIGl0cyBzbG90XG4gKi8gZnVuY3Rpb24gY29tcHV0ZUV4dGVuc2lvbkNvbmZpZyhzbG90TW9kdWxlTmFtZSwgZXh0ZW5zaW9uTW9kdWxlTmFtZSwgc2xvdE5hbWUsIGV4dGVuc2lvbklkLCBjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uTmFtZSA9IGdldEV4dGVuc2lvbk5hbWVGcm9tSWQoZXh0ZW5zaW9uSWQpO1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZ1NjaGVtYSA9IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTmFtZV07XG4gICAgY29uc3QgbmFtZU9mU2NoZW1hU291cmNlID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8gZXh0ZW5zaW9uTmFtZSA6IGV4dGVuc2lvbk1vZHVsZU5hbWU7XG4gICAgY29uc3QgcHJvdmlkZWRDb25maWdzID0gZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpO1xuICAgIGNvbnN0IHNsb3RNb2R1bGVDb25maWcgPSBtZXJnZUNvbmZpZ3NGb3Ioc2xvdE1vZHVsZU5hbWUsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29uZmlnT3ZlcnJpZGUgPSBzbG90TW9kdWxlQ29uZmlnPy5leHRlbnNpb25TbG90cz8uW3Nsb3ROYW1lXT8uY29uZmlndXJlPy5bZXh0ZW5zaW9uSWRdID8/IHt9O1xuICAgIGNvbnN0IGV4dGVuc2lvbkNvbmZpZyA9IG1lcmdlQ29uZmlnc0ZvcihuYW1lT2ZTY2hlbWFTb3VyY2UsIHByb3ZpZGVkQ29uZmlncyk7XG4gICAgY29uc3QgY29tYmluZWRDb25maWcgPSBtZXJnZUNvbmZpZ3MoW1xuICAgICAgICBleHRlbnNpb25Db25maWcsXG4gICAgICAgIGNvbmZpZ092ZXJyaWRlXG4gICAgXSk7XG4gICAgY29uc3Qgc2NoZW1hID0gZXh0ZW5zaW9uQ29uZmlnU2NoZW1hID8/IGNvbmZpZ1N0YXRlLnNjaGVtYXNbZXh0ZW5zaW9uTW9kdWxlTmFtZV07XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBjb21iaW5lZENvbmZpZywgbmFtZU9mU2NoZW1hU291cmNlKTtcbiAgICBjb25zdCBjb25maWcgPSBzZXREZWZhdWx0cyhzY2hlbWEsIGNvbWJpbmVkQ29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBuYW1lT2ZTY2hlbWFTb3VyY2UpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEltcGxlbWVudGVyVG9vbHNDb25maWcoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGxldCByZXN1bHQgPSBnZXRTY2hlbWFXaXRoVmFsdWVzQW5kU291cmNlcyhjbG9uZURlZXAoY29uZmlnU3RhdGUuc2NoZW1hcykpO1xuICAgIGNvbnN0IGNvbmZpZ3NBbmRTb3VyY2VzID0gW1xuICAgICAgICAuLi5jb25maWdTdGF0ZS5wcm92aWRlZENvbmZpZ3MubWFwKChjKT0+W1xuICAgICAgICAgICAgICAgIGMuY29uZmlnLFxuICAgICAgICAgICAgICAgIGMuc291cmNlXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgW1xuICAgICAgICAgICAgdGVtcENvbmZpZ1N0YXRlLmNvbmZpZyxcbiAgICAgICAgICAgICd0ZW1wb3JhcnkgY29uZmlnJ1xuICAgICAgICBdXG4gICAgXTtcbiAgICBmb3IgKGxldCBbY29uZmlnLCBzb3VyY2VdIG9mIGNvbmZpZ3NBbmRTb3VyY2VzKXtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VDb25maWdzKFtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGNyZWF0ZVZhbHVlc0FuZFNvdXJjZXNUcmVlKGNvbmZpZywgc291cmNlKVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldFNjaGVtYVdpdGhWYWx1ZXNBbmRTb3VyY2VzKHNjaGVtYSkge1xuICAgIGlmIChzY2hlbWEuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgICAgIF92YWx1ZTogc2NoZW1hLl9kZWZhdWx0LFxuICAgICAgICAgICAgX3NvdXJjZTogJ2RlZmF1bHQnXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNjaGVtYSkucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgICAgIG9ialtrZXldID0gZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMoc2NoZW1hW2tleV0pO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHRoZSBzY2hlbWEgaXMgYmFkIGFuZCBhbiBlcnJvciB3aWxsIGhhdmUgYmVlbiBsb2dnZWQgZHVyaW5nIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZShjb25maWcsIHNvdXJjZSkge1xuICAgIGlmIChpc09yZGluYXJ5T2JqZWN0KGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgICAgIG9ialtrZXldID0gY3JlYXRlVmFsdWVzQW5kU291cmNlc1RyZWUoY29uZmlnW2tleV0sIHNvdXJjZSk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF92YWx1ZTogY29uZmlnLFxuICAgICAgICAgICAgX3NvdXJjZTogc291cmNlXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uU2xvdENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGFsbENvbmZpZ3MgPSBtZXJnZUNvbmZpZ3MoZ2V0UHJvdmlkZWRDb25maWdzKGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpKTtcbiAgICBjb25zdCBzbG90Q29uZmlnUGVyTW9kdWxlID0gT2JqZWN0LmtleXMoYWxsQ29uZmlncykucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgaWYgKGFsbENvbmZpZ3Nba2V5XT8uZXh0ZW5zaW9uU2xvdHMpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gYWxsQ29uZmlnc1trZXldPy5leHRlbnNpb25TbG90cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH0sIHt9KTtcbiAgICB2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzKHNsb3RDb25maWdQZXJNb2R1bGUpO1xuICAgIGNvbnN0IHNsb3RDb25maWdzID0gT2JqZWN0LmtleXMoc2xvdENvbmZpZ1Blck1vZHVsZSkucmVkdWNlKChvYmosIGtleSk9PntcbiAgICAgICAgb2JqID0ge1xuICAgICAgICAgICAgLi4ub2JqLFxuICAgICAgICAgICAgLi4uc2xvdENvbmZpZ1Blck1vZHVsZVtrZXldXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30pO1xuICAgIHJldHVybiBzbG90Q29uZmlncztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQWxsRXh0ZW5zaW9uU2xvdENvbmZpZ3Moc2xvdENvbmZpZ1Blck1vZHVsZSkge1xuICAgIGZvciAobGV0IFttb2R1bGVOYW1lLCBjb25maWdCeVNsb3ROYW1lXSBvZiBPYmplY3QuZW50cmllcyhzbG90Q29uZmlnUGVyTW9kdWxlKSl7XG4gICAgICAgIGZvciAobGV0IFtzbG90TmFtZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdCeVNsb3ROYW1lKSl7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWcoY29uZmlnLCBtb2R1bGVOYW1lLCBzbG90TmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvblNsb3RDb25maWcoY29uZmlnLCBtb2R1bGVOYW1lLCBzbG90TmFtZSkge1xuICAgIGNvbnN0IGtleVBhdGggPSBgJHttb2R1bGVOYW1lfS5leHRlbnNpb25TbG90cy4ke3Nsb3ROYW1lfWA7XG4gICAgY29uc3QgZXJyb3JQcmVmaXggPSBgRXh0ZW5zaW9uIHNsb3QgY29uZmlnICcke2tleVBhdGh9J2A7XG4gICAgY29uc3QgaW52YWxpZEtleXMgPSBPYmplY3Qua2V5cyhjb25maWcpLmZpbHRlcigoayk9PiFbXG4gICAgICAgICAgICAnYWRkJyxcbiAgICAgICAgICAgICdyZW1vdmUnLFxuICAgICAgICAgICAgJ29yZGVyJyxcbiAgICAgICAgICAgICdjb25maWd1cmUnXG4gICAgICAgIF0uaW5jbHVkZXMoaykpO1xuICAgIGlmIChpbnZhbGlkS2V5cy5sZW5ndGgpIHtcbiAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgJyBjb250YWlucyBpbnZhbGlkIGtleXMgJyR7aW52YWxpZEtleXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmFkZCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLmFkZCkgfHwgIWNvbmZpZy5hZGQuZXZlcnkoKG4pPT50eXBlb2YgbiA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihrZXlQYXRoLCBlcnJvclByZWZpeCArIGAuYWRkJyBpcyBpbnZhbGlkLiBNdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgKGV4dGVuc2lvbiBJRHMpYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZW1vdmUpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5yZW1vdmUpIHx8ICFjb25maWcucmVtb3ZlLmV2ZXJ5KChuKT0+dHlwZW9mIG4gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLnJlbW92ZScgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcub3JkZXIpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5vcmRlcikgfHwgIWNvbmZpZy5vcmRlci5ldmVyeSgobik9PnR5cGVvZiBuID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGtleVBhdGgsIGVycm9yUHJlZml4ICsgYC5vcmRlcicgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIChleHRlbnNpb24gSURzKWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWcuY29uZmlndXJlKSB7XG4gICAgICAgIGlmICghaXNPcmRpbmFyeU9iamVjdChjb25maWcuY29uZmlndXJlKSkge1xuICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgZXJyb3JQcmVmaXggKyBgLmNvbmZpZ3VyZScgaXMgaW52YWxpZC4gTXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBleHRlbnNpb24gSURzIGZvciBrZXlzYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQcm92aWRlZENvbmZpZ3MoY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIC4uLmNvbmZpZ1N0YXRlLnByb3ZpZGVkQ29uZmlncy5tYXAoKGMpPT5jLmNvbmZpZyksXG4gICAgICAgIHRlbXBDb25maWdTdGF0ZS5jb25maWdcbiAgICBdO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGNvbmZpZyBzY2hlbWEgZm9yIGEgbW9kdWxlLiBTaW5jZSBwcm9ibGVtcyBpZGVudGlmaWVkIGhlcmUgYXJlIHByb2dyYW1taW5nIGVycm9yc1xuICogdGhhdCBob3BlZnVsbHkgd2lsbCBiZSBjYXVnaHQgZHVyaW5nIGRldmVsb3BtZW50LCB0aGlzIGZ1bmN0aW9uIGxvZ3MgZXJyb3JzIHRvIHRoZSBjb25zb2xlIGRpcmVjdGx5O1xuICogaXQncyBmaW5lIGlmIHdlIHNwYW0gdGhlIHVzZXIgd2l0aCB0aGVzZSBlcnJvcnMuXG4gKi8gZnVuY3Rpb24gdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hLCBrZXlQYXRoID0gJycpIHtcbiAgICBjb25zdCB1cGRhdGVNZXNzYWdlID0gYFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCwgaWYgc28sIGFsZXJ0IHRoZSBtYWludGFpbmVyLmA7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoKGspPT4hay5zdGFydHNXaXRoKCdfJykpKXtcbiAgICAgICAgY29uc3QgdGhpc0tleVBhdGggPSBrZXlQYXRoICsgKGtleVBhdGggJiYgJy4nKSArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAodGhpc0tleVBhdGggPT09ICdEaXNwbGF5IGNvbmRpdGlvbnMnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGRlY2xhcmVzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gY2FsbGVkIFwiRGlzcGxheSBjb25kaXRpb25zXCI7IHRoZSBcIkRpc3BsYXkgY29uZGl0aW9uc1wiIG9wdGlvbiBpcyBhIHJlc2VydmVkIG5hbWUuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc0tleVBhdGggPT09ICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGRlY2xhcmVzIGEgY29uZmlndXJhdGlvbiBvcHRpb24gY2FsbGVkIFwiVHJhbnNsYXRpb24gb3ZlcnJpZGVzXCI7IHRoZSBcIlRyYW5zbGF0aW9uIG92ZXJyaWRlc1wiIG9wdGlvbiBpcyBhIHJlc2VydmVkIG5hbWUuICR7dXBkYXRlTWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzT3JkaW5hcnlPYmplY3Qoc2NoZW1hUGFydCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ19kZWZhdWx0JykpIHtcbiAgICAgICAgICAgIC8vIHJlY3Vyc2UgZm9yIG5lc3RlZCBjb25maWcga2V5c1xuICAgICAgICAgICAgdmFsaWRhdGVDb25maWdTY2hlbWEobW9kdWxlTmFtZSwgc2NoZW1hUGFydCwgdGhpc0tleVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gc2NoZW1hUGFydC5fZWxlbWVudHM7XG4gICAgICAgIGlmIChoYXNPYmplY3RTY2hlbWEoZWxlbWVudHMpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUNvbmZpZ1NjaGVtYShtb2R1bGVOYW1lLCBlbGVtZW50cywgdGhpc0tleVBhdGggKyAnLl9lbGVtZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll92YWxpZGF0b3JzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2Ygc2NoZW1hUGFydC5fdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHttb2R1bGVOYW1lfSBoYXMgaW52YWxpZCB2YWxpZGF0b3IgZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nICR7dXBkYXRlTWVzc2FnZX0uYCArIGBcXG5cXG5JZiB5b3UncmUgdGhlIG1haW50YWluZXI6IHZhbGlkYXRvcnMgbXVzdCBiZSBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZWl0aGVyIGAgKyBgdW5kZWZpbmVkIG9yIGFuIGVycm9yIHN0cmluZy4gUmVjZWl2ZWQgJHt2YWxpZGF0b3J9LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSBzY2hlbWFQYXJ0Ll90eXBlO1xuICAgICAgICBpZiAodmFsdWVUeXBlICYmICFPYmplY3QudmFsdWVzKFR5cGUpLmluY2x1ZGVzKHZhbHVlVHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGludmFsaWQgdHlwZSBmb3Iga2V5ICcke3RoaXNLZXlQYXRofScgJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdGhlIGFsbG93ZWQgdHlwZXMgYXJlICR7T2JqZWN0LnZhbHVlcyhUeXBlKS5qb2luKCcsICcpfS4gYCArIGBSZWNlaXZlZCAnJHt2YWx1ZVR5cGV9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzY2hlbWFQYXJ0KS5ldmVyeSgoayk9PltcbiAgICAgICAgICAgICAgICAnX2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICAgICAnX3ZhbGlkYXRvcnMnLFxuICAgICAgICAgICAgICAgICdfZWxlbWVudHMnLFxuICAgICAgICAgICAgICAgICdfdHlwZSdcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoaykpICYmICFrZXlQYXRoLmluY2x1ZGVzKCcuX2VsZW1lbnRzJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7bW9kdWxlTmFtZX0gaGFzIGJhZCBjb25maWcgc2NoZW1hIGRlZmluaXRpb24gZm9yIGtleSAnJHt0aGlzS2V5UGF0aH0nLiAke3VwZGF0ZU1lc3NhZ2V9LmAgKyBgXFxuXFxuSWYgeW91J3JlIHRoZSBtYWludGFpbmVyOiBhbGwgY29uZmlnIGVsZW1lbnRzIG11c3QgaGF2ZSBhIGRlZmF1bHQuIGAgKyBgUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShzY2hlbWFQYXJ0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHMgJiYgdmFsdWVUeXBlICYmICFbXG4gICAgICAgICAgICBUeXBlLkFycmF5LFxuICAgICAgICAgICAgVHlwZS5PYmplY3RcbiAgICAgICAgXS5pbmNsdWRlcyh2YWx1ZVR5cGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke21vZHVsZU5hbWV9IGhhcyBiYWQgY29uZmlnIHNjaGVtYSBkZWZpbml0aW9uIGZvciBrZXkgJyR7dGhpc0tleVBhdGh9Jy4gJHt1cGRhdGVNZXNzYWdlfS5gICsgYFxcblxcbklmIHlvdSdyZSB0aGUgbWFpbnRhaW5lcjogdGhlICdlbGVtZW50cycga2V5IG9ubHkgd29ya3Mgd2l0aCAnX3R5cGUnIGVxdWFsIHRvICdBcnJheScgb3IgJ09iamVjdCcuIGAgKyBgUmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZVR5cGUpfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0Q29uZmlnRm9yTW9kdWxlKG1vZHVsZU5hbWUsIGNvbmZpZ1N0YXRlLCB0ZW1wQ29uZmlnU3RhdGUpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBjb25maWdTdGF0ZS5zY2hlbWFzW21vZHVsZU5hbWVdO1xuICAgIGNvbnN0IGlucHV0Q29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUoc2NoZW1hLCBpbnB1dENvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoc2NoZW1hLCBpbnB1dENvbmZpZyk7XG4gICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEsIGNvbmZpZywgbW9kdWxlTmFtZSk7XG4gICAgZGVsZXRlIGNvbmZpZy5leHRlbnNpb25TbG90cztcbiAgICByZXR1cm4gY29uZmlnO1xufVxuZnVuY3Rpb24gZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEobW9kdWxlTmFtZSwgY29uZmlnU3RhdGUsIHRlbXBDb25maWdTdGF0ZSkge1xuICAgIGNvbnN0IGlucHV0Q29uZmlnID0gbWVyZ2VDb25maWdzRm9yKG1vZHVsZU5hbWUsIGdldFByb3ZpZGVkQ29uZmlncyhjb25maWdTdGF0ZSwgdGVtcENvbmZpZ1N0YXRlKSk7XG4gICAgY29uc3QgY29uZmlnID0gc2V0RGVmYXVsdHMoaW1wbGljaXRDb25maWdTY2hlbWEsIGlucHV0Q29uZmlnKTtcbiAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKGltcGxpY2l0Q29uZmlnU2NoZW1hLCBjb25maWcsIG1vZHVsZU5hbWUpO1xuICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5zaW9uU2xvdHM7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnc0Zvcihtb2R1bGVOYW1lLCBhbGxDb25maWdzKSB7XG4gICAgY29uc3QgYWxsQ29uZmlnc0Zvck1vZHVsZSA9IGFsbENvbmZpZ3MubWFwKCh7IFttb2R1bGVOYW1lXTogYyB9KT0+YykuZmlsdGVyKChjKT0+ISFjKTtcbiAgICByZXR1cm4gbWVyZ2VDb25maWdzKGFsbENvbmZpZ3NGb3JNb2R1bGUpO1xufVxuZnVuY3Rpb24gbWVyZ2VDb25maWdzKGNvbmZpZ3MpIHtcbiAgICByZXR1cm4gY29uZmlncy5yZWR1Y2UoKGFjYywgY29uZmlnKT0+bWVyZ2VEZWVwUmVwbGFjZShhY2MsIGNvbmZpZyksIHt9KTtcbn1cbi8qKlxuICogUmVjdXJzaXZlbHkgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZyB0cmVlIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbFxuICogb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZXhpc3QgaW4gdGhlIHNjaGVtYSwgYW5kIHRoYXQgdHlwZXMgYXJlXG4gKiBjb3JyZWN0LiBEb2VzIG5vdCBydW4gdmFsaWRhdG9ycyB5ZXQsIHNpbmNlIHRob3NlIHdpbGwgYmUgcnVuIG9uXG4gKiB0aGUgY29uZmlnIHdpdGggdGhlIGRlZmF1bHRzIGZpbGxlZCBpbi5cbiAqLyBmdW5jdGlvbiB2YWxpZGF0ZVN0cnVjdHVyZShzY2hlbWEsIGNvbmZpZywga2V5UGF0aCA9ICcnKSB7XG4gICAgLy8gdmFsaWRhdGUgZWFjaCBjb25zdGl0dWVudCBlbGVtZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGFydCA9IHNjaGVtYVtrZXldO1xuICAgICAgICBpZiAoIXNjaGVtYS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgPT09ICdleHRlbnNpb25TbG90cycgJiYga2V5UGF0aCAhPT0gJycpKSB7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3IodGhpc0tleVBhdGgsIGBVbmtub3duIGNvbmZpZyBrZXkgJyR7dGhpc0tleVBhdGh9JyBwcm92aWRlZC4gSWdub3JpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZUJyYW5jaFN0cnVjdHVyZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKSB7XG4gICAgY2hlY2tUeXBlKGtleVBhdGgsIHNjaGVtYVBhcnQuX3R5cGUsIHZhbHVlKTtcbiAgICBpZiAoaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSBhcyBmcmVlZm9ybSBvYmplY3RcbiAgICAgICAgICAgIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoc2NoZW1hUGFydCwgdmFsdWUsIGtleVBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKCEoc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSB8fCBzY2hlbWFQYXJ0Lmhhc093blByb3BlcnR5KCdfdHlwZScpKSkge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGUgYXMgbm9ybWFsIG5lc3RlZCBjb25maWdcbiAgICAgICAgICAgIHZhbGlkYXRlU3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5KSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKHNjaGVtYVBhcnQsIHZhbHVlLCBrZXlQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlRnJlZWZvcm1PYmplY3RTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEsIGNvbmZpZywga2V5UGF0aCkge1xuICAgIGlmIChmcmVlZm9ybU9iamVjdFNjaGVtYS5fZWxlbWVudHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSl7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgdmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUoZnJlZWZvcm1PYmplY3RTY2hlbWEuX2VsZW1lbnRzLCB2YWx1ZSwgYCR7a2V5UGF0aH0uJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5U3RydWN0dXJlKGFycmF5U2NoZW1hLCB2YWx1ZSwga2V5UGF0aCkge1xuICAgIGNvbnN0IHZhbGlkYXRlZEFzQXJyYXkgPSBjaGVja1R5cGUoa2V5UGF0aCwgVHlwZS5BcnJheSwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGVkQXNBcnJheSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFycmF5IGVsZW1lbnQgb2JqZWN0IHNjaGVtYSwgdmVyaWZ5IHRoYXQgZWxlbWVudHMgbWF0Y2ggaXRcbiAgICBpZiAoaGFzT2JqZWN0U2NoZW1hKGFycmF5U2NoZW1hLl9lbGVtZW50cykpIHtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZhbGlkYXRlQnJhbmNoU3RydWN0dXJlKGFycmF5U2NoZW1hLl9lbGVtZW50cywgdmFsdWVbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY2hlY2tUeXBlKGAke2tleVBhdGh9WyR7aX1dYCwgYXJyYXlTY2hlbWEuX2VsZW1lbnRzPy5fdHlwZSwgdmFsdWVbaV0pO1xuICAgIH1cbn1cbi8qKlxuICogUnVuIGFsbCB0aGUgdmFsaWRhdG9ycyBpbiB0aGUgY29uZmlnIHRyZWUuIFRoaXMgc2hvdWxkIGJlIHJ1blxuICogb24gdGhlIGNvbmZpZyBvYmplY3QgYWZ0ZXIgaXQgaGFzIGJlZW4gZmlsbGVkIGluIHdpdGggYWxsIHRoZSBkZWZhdWx0cywgc2luY2VcbiAqIGhpZ2hlci1sZXZlbCB2YWxpZGF0b3JzIG1heSByZWZlciB0byBkZWZhdWx0IHZhbHVlcy5cbiAqLyBmdW5jdGlvbiBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYSwgY29uZmlnLCBrZXlQYXRoID0gJycpIHtcbiAgICAvLyBJZiBgIXNjaGVtYWAsIHRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYSBzdHJ1Y3R1cmFsIHZhbGlkYXRpb24gZXJyb3IgcHJpbnRlZCBhbHJlYWR5LlxuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gc2NoZW1hLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICBydW5WYWxpZGF0b3JzKGtleVBhdGgsIHNjaGVtYS5fdmFsaWRhdG9ycywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChjb25maWcpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKXtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1trZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNLZXlQYXRoID0ga2V5UGF0aCArICcuJyArIGtleTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5fdHlwZSA9PT0gVHlwZS5PYmplY3QgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICBydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlKHNjaGVtYS5fZWxlbWVudHMsIHZhbHVlLCB0aGlzS2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWFQYXJ0LCB2YWx1ZSwgdGhpc0tleVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykgJiYgc2NoZW1hLl9lbGVtZW50cykge1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgcnVuQWxsVmFsaWRhdG9yc0luQ29uZmlnVHJlZShzY2hlbWEuX2VsZW1lbnRzLCBjb25maWdbaV0sIGAke2tleVBhdGh9WyR7aX1dYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFJ1biB0eXBlIHZhbGlkYXRpb24gZm9yIHRoZSB2YWx1ZSwgbG9nZ2luZyBhbnkgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0aW9uIHBhc3NlcywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi8gZnVuY3Rpb24gY2hlY2tUeXBlKGtleVBhdGgsIF90eXBlLCB2YWx1ZSkge1xuICAgIGlmIChfdHlwZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHtcbiAgICAgICAgICAgIEFycmF5OiBpc0FycmF5LFxuICAgICAgICAgICAgQm9vbGVhbjogaXNCb29sZWFuLFxuICAgICAgICAgICAgQ29uY2VwdFV1aWQ6IGlzVXVpZCxcbiAgICAgICAgICAgIE51bWJlcjogaXNOdW1iZXIsXG4gICAgICAgICAgICBPYmplY3Q6IGlzT2JqZWN0LFxuICAgICAgICAgICAgU3RyaW5nOiBpc1N0cmluZyxcbiAgICAgICAgICAgIFVVSUQ6IGlzVXVpZCxcbiAgICAgICAgICAgIFBlcnNvbkF0dHJpYnV0ZVR5cGVVdWlkOiBpc1V1aWQsXG4gICAgICAgICAgICBQYXRpZW50SWRlbnRpZmllclR5cGVVdWlkOiBpc1V1aWRcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgW1xuICAgICAgICAgICAgdmFsaWRhdG9yW190eXBlXVxuICAgICAgICBdLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBSdW5zIHZhbGlkYXRvcnMsIGxvZ2dpbmcgZXJyb3JzLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgcGFzcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICovIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbmZ1bmN0aW9uIHJ1blZhbGlkYXRvcnMoa2V5UGF0aCwgdmFsaWRhdG9ycywgdmFsdWUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgIGlmICh2YWxpZGF0b3JzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycyl7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRvclJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBgSW52YWxpZCBjb25maWd1cmF0aW9uIGZvciAke2tleVBhdGh9OiAke3ZhbGlkYXRvclJlc3VsdH1gIDogYEludmFsaWQgY29uZmlndXJhdGlvbiB2YWx1ZSAke3ZhbHVlfSBmb3IgJHtrZXlQYXRofTogJHt2YWxpZGF0b3JSZXN1bHR9YDtcbiAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3Ioa2V5UGF0aCwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBTa2lwcGluZyBpbnZhbGlkIHZhbGlkYXRvciBhdCBcIiR7a2V5UGF0aH1cIi4gRW5jb3VudGVyZWQgZXJyb3JcXG5cXHQke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuLy8gUmVjdXJzaXZlbHkgZmlsbCBpbiB0aGUgY29uZmlnIHdpdGggdmFsdWVzIGZyb20gdGhlIHNjaGVtYS5cbmNvbnN0IHNldERlZmF1bHRzID0gKHNjaGVtYSwgaW5wdXRDb25maWcpPT57XG4gICAgY29uc3QgY29uZmlnID0gc3RydWN0dXJlZENsb25lKGlucHV0Q29uZmlnKTtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKXtcbiAgICAgICAgY29uc3QgY29uZmlnUGFydCA9IGNvbmZpZ1trZXldO1xuICAgICAgICBjb25zdCBzY2hlbWFQYXJ0ID0gc2NoZW1hW2tleV07XG4gICAgICAgIC8vIFRoZSBgc2NoZW1hUGFydCAmJmAgY2xhdXNlIG9mIHRoaXMgYGlmYCBzdGF0ZW1lbnQgd2lsbCBvbmx5IGZhaWxcbiAgICAgICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2ZXJ5IGludmFsaWQuIEl0IGlzIHRoZXJlIHRvIHByZXZlbnQgdGhlIGFwcCBmcm9tXG4gICAgICAgIC8vIGNyYXNoaW5nIGNvbXBsZXRlbHksIHRob3VnaCBpdCB3aWxsIHByb2R1Y2UgdW5leHBlY3RlZCBiZWhhdmlvci5cbiAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB0aGVyZSBzaG91bGQgYmUgbGVnaWJsZSBlcnJvcnMgaW4gdGhlIGNvbnNvbGUgZnJvbVxuICAgICAgICAvLyB0aGUgc2NoZW1hIHZhbGlkYXRvci5cbiAgICAgICAgaWYgKHNjaGVtYVBhcnQgJiYgKHNjaGVtYVBhcnQuaGFzT3duUHJvcGVydHkoJ190eXBlJykgfHwgc2NoZW1hUGFydC5oYXNPd25Qcm9wZXJ0eSgnX2RlZmF1bHQnKSkpIHtcbiAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHNjaGVtYVBhcnQgZGVmaW5lcyBhIGNvbmZpZyB2YWx1ZSwgc2luY2UgaXQgaGFzXG4gICAgICAgICAgICAvLyBhIHByb3BlcnR5IGBfdHlwZWAgb3IgYF9kZWZhdWx0YC5cbiAgICAgICAgICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IHNjaGVtYVBhcnRbJ19kZWZhdWx0J107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBhbHNvIGNoZWNrIGlmIGl0IGlzIGFuIG9iamVjdCBvciBhcnJheSB3aXRoIG9iamVjdCBlbGVtZW50cywgaW4gd2hpY2ggY2FzZSB3ZSByZWN1cnNlXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNjaGVtYVBhcnQuX2VsZW1lbnRzO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ1BhcnQgJiYgaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWFQYXJ0Ll90eXBlID09PSBUeXBlLkFycmF5ICYmIEFycmF5LmlzQXJyYXkoY29uZmlnUGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnV2l0aERlZmF1bHRzID0gY29uZmlnUGFydC5tYXAoKGNvbmYpPT5zZXREZWZhdWx0cyhlbGVtZW50cywgY29uZikpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWdba2V5XSA9IGNvbmZpZ1dpdGhEZWZhdWx0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnQuX3R5cGUgPT09IFR5cGUuT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyhjb25maWdQYXJ0KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdQYXJ0W29iamVjdEtleV0gPSBzZXREZWZhdWx0cyhlbGVtZW50cywgY29uZmlnUGFydFtvYmplY3RLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc09yZGluYXJ5T2JqZWN0KHNjaGVtYVBhcnQpKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSBzY2hlbWFQYXJ0IGhhcyBubyBwcm9wZXJ0eSBcIl90eXBlXCIsIGlmIGl0J3MgYW4gb3JkaW5hcnkgb2JqZWN0XG4gICAgICAgICAgICAvLyAodW5saWtlLCBpbXBvcnRhbnRseSwgdGhlIHZhbGlkYXRvcnMgYXJyYXkpLCB3ZSBhc3N1bWUgaXQgaXMgYSBwYXJlbnQgY29uZmlnIHByb3BlcnR5LlxuICAgICAgICAgICAgLy8gV2UgcmVjdXJzZSB0byBjb25maWdba2V5XSBhbmQgc2NoZW1hW2tleV0uIERlZmF1bHQgY29uZmlnW2tleV0gdG8ge30uXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbmZpZ1BhcnQgPSBjb25maWdQYXJ0ID8/IHt9O1xuICAgICAgICAgICAgLy8gVGhlcmUgd2lsbCBoYXZlIGJlZW4gYSB2YWxpZGF0aW9uIGVycm9yIGFscmVhZHkgaWYgY29uZmlnUGFydCBpcyBub3QgYSBwbGFpbiBvYmplY3QuXG4gICAgICAgICAgICBpZiAoaXNPcmRpbmFyeU9iamVjdChzZWxlY3RlZENvbmZpZ1BhcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSBzZXREZWZhdWx0cyhzY2hlbWFQYXJ0LCBzZWxlY3RlZENvbmZpZ1BhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG59O1xuZnVuY3Rpb24gaGFzT2JqZWN0U2NoZW1hKGVsZW1lbnRzU2NoZW1hKSB7XG4gICAgcmV0dXJuICEhZWxlbWVudHNTY2hlbWEgJiYgT2JqZWN0LmtleXMoZWxlbWVudHNTY2hlbWEpLmZpbHRlcigoZSk9PiFbXG4gICAgICAgICAgICAnX2RlZmF1bHQnLFxuICAgICAgICAgICAgJ192YWxpZGF0b3JzJ1xuICAgICAgICBdLmluY2x1ZGVzKGUpKS5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gaXNPcmRpbmFyeU9iamVjdCh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbi8qKiBLZWVwIHRyYWNrIG9mIHdoaWNoIHZhbGlkYXRpb24gZXJyb3JzIHdlIGhhdmUgZGlzcGxheWVkLiBFYWNoIG9uZSBzaG91bGQgb25seSBiZSBkaXNwbGF5ZWQgb25jZS4gKi8gbGV0IGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIGxvZ0Vycm9yKGtleVBhdGgsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtrZXlQYXRofTo6OiR7bWVzc2FnZX1gO1xuICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUsIGJ1dCBiZWNhdXNlIG9mIGhvdyB0aGluZ3Mgd2luZC11cCB0cmFuc3BpbGVkLCB0aGlzIGlzbid0IGltcG9zc2libGVcbiAgICBpZiAoIWRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcykge1xuICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIGlmICghZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5hZGQoa2V5KTtcbiAgICB9XG59XG4vKipcbiAqIE5vcm1hbGx5LCBjb25maWd1cmF0aW9uIGVycm9ycyBhcmUgb25seSBkaXNwbGF5ZWQgb25jZS4gVGhpcyBmdW5jdGlvbiBjbGVhcnMgdGhlIGxpc3Qgb2ZcbiAqIGRpc3BsYXllZCBlcnJvcnMsIHNvIHRoYXQgdGhleSB3aWxsIGJlIGRpc3BsYXllZCBhZ2Fpbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqLyBleHBvcnQgZnVuY3Rpb24gY2xlYXJDb25maWdFcnJvcnMoa2V5UGF0aCkge1xuICAgIGlmIChrZXlQYXRoKSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoa2V5UGF0aCkpIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRWYWxpZGF0aW9uTWVzc2FnZXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXllZFZhbGlkYXRpb25NZXNzYWdlcy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQ2xlYW5zIHVwIGFsbCBjb25maWcgc3RvcmUgc3Vic2NyaXB0aW9ucyBhbmQgcmUtZXN0YWJsaXNoZXMgdGhlbS4gVGhpcyBpcyBwcmltYXJpbHlcbiAqIHVzZWZ1bCBmb3IgdGVzdGluZywgd2hlcmUgc3Vic2NyaXB0aW9ucyBzZXQgdXAgYXQgbW9kdWxlIGxvYWQgdGltZSBuZWVkIHRvIGJlIGNsZWFyZWRcbiAqIGJldHdlZW4gdGVzdHMgdG8gcHJldmVudCBpbmZpbml0ZSB1cGRhdGUgbG9vcHMuIEFmdGVyIGNsZWFyaW5nLCBzdWJzY3JpcHRpb25zIGFyZVxuICogcmUtZXN0YWJsaXNoZWQgc28gdGhlIGNvbmZpZyBzeXN0ZW0gY29udGludWVzIHRvIHdvcmsgbm9ybWFsbHkuXG4gKlxuICogQGludGVybmFsXG4gKi8gZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q29uZmlnU3lzdGVtKCkge1xuICAgIGNvbmZpZ1N1YnNjcmlwdGlvbnMuZm9yRWFjaCgodW5zdWJzY3JpYmUpPT51bnN1YnNjcmliZSgpKTtcbiAgICBjb25maWdTdWJzY3JpcHRpb25zLmxlbmd0aCA9IDA7XG4gICAgc2V0dXBDb25maWdTdWJzY3JpcHRpb25zKCk7XG59XG4vKipcbiAqIENvcGllZCBvdmVyIGZyb20gZXNtLWV4dGVuc2lvbnMuIEl0IHJpZ2h0bHkgYmVsb25ncyB0byB0aGF0IG1vZHVsZSwgYnV0IGVzbS1jb25maWdcbiAqIGNhbm5vdCBkZXBlbmQgb24gZXNtLWV4dGVuc2lvbnMuXG4gKi8gZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZChleHRlbnNpb25JZCkge1xuICAgIGNvbnN0IFtleHRlbnNpb25OYW1lXSA9IGV4dGVuc2lvbklkLnNwbGl0KCcjJyk7XG4gICAgcmV0dXJuIGV4dGVuc2lvbk5hbWU7XG59XG4vKipcbiAqIFRoZSB0cmFuc2xhdGlvbiBvdmVycmlkZXMgc2NoZW1hIGlzIHVzZWQgaW4gdGhlIGltcGxpY2l0IHNjaGVtYSBnaXZlbiB0byBldmVyeSBtb2R1bGU7XG4gKiBwbHVzIGFueSBhZGRpdGlvbmFsIHRyYW5zbGF0aW9uIG5hbWVzcGFjZXMgKGF0IHRpbWUgb2Ygd3JpdGluZywgdGhpcyBpcyBqdXN0ICdjb3JlJykuXG4gKi8gY29uc3QgdHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEgPSB7XG4gICAgJ1RyYW5zbGF0aW9uIG92ZXJyaWRlcyc6IHtcbiAgICAgICAgX2Rlc2NyaXB0aW9uOiAnUGVyLWxhbmd1YWdlIG92ZXJyaWRlcyBmb3IgZnJvbnRlbmQgdHJhbnNsYXRpb25zIHNob3VsZCBiZSBrZXllZCBieSBsYW5ndWFnZSBjb2RlIGFuZCBlYWNoIGxhbmd1YWdlIGRpY3Rpb25hcnkgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIGtleSBhbmQgdGhlIGRpc3BsYXkgdmFsdWUnLFxuICAgICAgICBfdHlwZTogVHlwZS5PYmplY3QsXG4gICAgICAgIF9kZWZhdWx0OiB7fSxcbiAgICAgICAgX3ZhbGlkYXRvcnM6IFtcbiAgICAgICAgICAgIHZhbGlkYXRvcigobyk9Pk9iamVjdC5rZXlzKG8pLmV2ZXJ5KChrKT0+L15bYS16XXsyLDN9KC1bQS1aXXsyLDN9KT8kLy50ZXN0KGspKSwgKG8pPT57XG4gICAgICAgICAgICAgICAgY29uc3QgYmFkS2V5cyA9IE9iamVjdC5rZXlzKG8pLmZpbHRlcigoayk9PiEvXlthLXpdezIsM30oLVtBLVpdezIsM30pPyQvLnRlc3QoaykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgVGhlICdUcmFuc2xhdGlvbiBvdmVycmlkZXMnIG9iamVjdCBzaG91bGQgaGF2ZSBsYW5ndWFnZSBjb2RlcyBmb3Iga2V5cy4gTGFuZ3VhZ2UgY29kZXMgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhIHR3by10by10aHJlZSBsZXR0ZXIgbGFuZ3VhZ2UgY29kZSBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgaHlwaGVuIGFuZCBhIHR3by10by10aHJlZSBsZXR0ZXIgY291bnRyeSBjb2RlLiBUaGUgZm9sbG93aW5nIGtleXMgZG8gbm90IGNvbmZvcm06ICR7YmFkS2V5cy5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXVxuICAgIH1cbn07XG4vKipcbiAqIFRoZSBpbXBsaWNpdENvbmZpZ1NjaGVtYSBpcyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluIGV2ZXJ5IGNvbmZpZ3VyYXRpb24gc2NoZW1hXG4gKi8gY29uc3QgaW1wbGljaXRDb25maWdTY2hlbWEgPSB7XG4gICAgJ0Rpc3BsYXkgY29uZGl0aW9ucyc6IHtcbiAgICAgICAgcHJpdmlsZWdlczoge1xuICAgICAgICAgICAgX2Rlc2NyaXB0aW9uOiAnVGhlIHByaXZpbGVnZShzKSB0aGUgdXNlciBtdXN0IGhhdmUgdG8gdXNlIHRoaXMgZXh0ZW5zaW9uJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLkFycmF5LFxuICAgICAgICAgICAgX2RlZmF1bHQ6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIGV4cHJlc3Npb246IHtcbiAgICAgICAgICAgIF9kZXNjcmlwdGlvbjogJ1RoZSBleHByZXNzaW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBleHRlbnNpb24gaXMgZGlzcGxheWVkJyxcbiAgICAgICAgICAgIF90eXBlOiBUeXBlLlN0cmluZyxcbiAgICAgICAgICAgIF9kZWZhdWx0OiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLi4udHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWFcbn07XG4iXSwibmFtZXMiOlsiY2xvbmVEZWVwIiwiaXNFcXVhbCIsIm1lcmdlV2l0aCIsIm9taXQiLCJsb2Rhc2hPbWl0IiwiVHlwZSIsImlzQXJyYXkiLCJpc0Jvb2xlYW4iLCJpc1V1aWQiLCJpc051bWJlciIsImlzT2JqZWN0IiwiaXNTdHJpbmciLCJ2YWxpZGF0b3IiLCJjb25maWdFeHRlbnNpb25TdG9yZSIsImNvbmZpZ0ludGVybmFsU3RvcmUiLCJnZXRDb25maWdTdG9yZSIsImdldEV4dGVuc2lvbkNvbmZpZyIsImdldEV4dGVuc2lvblNsb3RzQ29uZmlnU3RvcmUiLCJnZXRFeHRlbnNpb25zQ29uZmlnU3RvcmUiLCJpbXBsZW1lbnRlclRvb2xzQ29uZmlnU3RvcmUiLCJ0ZW1wb3JhcnlDb25maWdTdG9yZSIsIm1lcmdlRGVlcFJlcGxhY2UiLCJsZWZ0IiwicmlnaHQiLCJfb2JqVmFsdWUiLCJzcmNWYWx1ZSIsIkFycmF5IiwiY29uZmlnU3Vic2NyaXB0aW9ucyIsInJlY29tcHV0ZUFsbENvbmZpZ3MiLCJjb25maWdTdGF0ZSIsInRlbXBDb25maWdTdGF0ZSIsImV4dGVuc2lvblN0YXRlIiwiY29tcHV0ZU1vZHVsZUNvbmZpZyIsImNvbXB1dGVJbXBsZW1lbnRlclRvb2xzQ29uZmlnIiwiY29tcHV0ZUV4dGVuc2lvblNsb3RDb25maWdzIiwiY29tcHV0ZUV4dGVuc2lvbkNvbmZpZ3MiLCJzZXR1cENvbmZpZ1N1YnNjcmlwdGlvbnMiLCJzdGF0ZSIsInRlbXBTdGF0ZSIsIl9pdGVyYXRvckVycm9yIiwiT2JqZWN0IiwibW9kdWxlTmFtZSIsIm1vZHVsZVN0b3JlIiwibmV3U3RhdGUiLCJjb25maWciLCJnZXRDb25maWdGb3JNb2R1bGUiLCJjb25maWcxIiwiZ2V0Q29uZmlnRm9yTW9kdWxlSW1wbGljaXRTY2hlbWEiLCJzbG90Q29uZmlncyIsImdldEV4dGVuc2lvblNsb3RDb25maWdzIiwibmV3U2xvdFN0b3JlRW50cmllcyIsInNsb3ROYW1lIiwic2xvdFN0b3JlIiwib2xkU3RhdGUiLCJnZXRJbXBsZW1lbnRlclRvb2xzQ29uZmlnIiwiY29uZmlncyIsImV4dGVuc2lvbiIsImNvbXB1dGVFeHRlbnNpb25Db25maWciLCJleHRlbnNpb25zQ29uZmlnU3RvcmUiLCJkZWZpbmVDb25maWdTY2hlbWEiLCJzY2hlbWEiLCJ2YWxpZGF0ZUNvbmZpZ1NjaGVtYSIsImVuaGFuY2VkU2NoZW1hIiwiaW1wbGljaXRDb25maWdTY2hlbWEiLCJyZWdpc3Rlck1vZHVsZVdpdGhDb25maWdTeXN0ZW0iLCJyZWdpc3Rlck1vZHVsZUxvYWQiLCJyZWdpc3RlclRyYW5zbGF0aW9uTmFtZXNwYWNlIiwibmFtZXNwYWNlIiwidHJhbnNsYXRpb25PdmVycmlkZXNTY2hlbWEiLCJkZWZpbmVFeHRlbnNpb25Db25maWdTY2hlbWEiLCJleHRlbnNpb25OYW1lIiwiY29uc29sZSIsInByb3ZpZGUiLCJzb3VyY2VOYW1lIiwiZ2V0Q29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ1cGRhdGUiLCJ1bnN1YnNjcmliZSIsInN0b3JlIiwiZ2V0VHJhbnNsYXRpb25PdmVycmlkZXMiLCJleHRlbnNpb25JZCIsInByb21pc2VzIiwiX3N0YXRlX2NvbmZpZ19UcmFuc2xhdGlvbm92ZXJyaWRlcyIsInRyYW5zbGF0aW9uT3ZlcnJpZGVzIiwiY29uZmlnU3RvcmUiLCJwcm9jZXNzQ29uZmlnIiwicHJvdmlkZWRDb25maWciLCJrZXlQYXRoQ29udGV4dCIsInZhbGlkYXRlU3RydWN0dXJlIiwic2V0RGVmYXVsdHMiLCJydW5BbGxWYWxpZGF0b3JzSW5Db25maWdUcmVlIiwic2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25Nb2R1bGVOYW1lIiwiX3Nsb3RNb2R1bGVDb25maWdfZXh0ZW5zaW9uU2xvdHNfc2xvdE5hbWVfY29uZmlndXJlIiwiZ2V0RXh0ZW5zaW9uTmFtZUZyb21JZCIsImV4dGVuc2lvbkNvbmZpZ1NjaGVtYSIsIm5hbWVPZlNjaGVtYVNvdXJjZSIsInByb3ZpZGVkQ29uZmlncyIsImdldFByb3ZpZGVkQ29uZmlncyIsInNsb3RNb2R1bGVDb25maWciLCJtZXJnZUNvbmZpZ3NGb3IiLCJjb25maWdPdmVycmlkZSIsImV4dGVuc2lvbkNvbmZpZyIsImNvbWJpbmVkQ29uZmlnIiwibWVyZ2VDb25maWdzIiwicmVzdWx0IiwiZ2V0U2NoZW1hV2l0aFZhbHVlc0FuZFNvdXJjZXMiLCJjb25maWdzQW5kU291cmNlcyIsImMiLCJzb3VyY2UiLCJjcmVhdGVWYWx1ZXNBbmRTb3VyY2VzVHJlZSIsImlzT3JkaW5hcnlPYmplY3QiLCJvYmoiLCJrZXkiLCJhbGxDb25maWdzIiwic2xvdENvbmZpZ1Blck1vZHVsZSIsIl9hbGxDb25maWdzX2tleSIsIl9hbGxDb25maWdzX2tleTEiLCJ2YWxpZGF0ZUFsbEV4dGVuc2lvblNsb3RDb25maWdzIiwiY29uZmlnQnlTbG90TmFtZSIsIl9pdGVyYXRvckVycm9yMSIsInZhbGlkYXRlRXh0ZW5zaW9uU2xvdENvbmZpZyIsImtleVBhdGgiLCJlcnJvclByZWZpeCIsImludmFsaWRLZXlzIiwiayIsImxvZ0Vycm9yIiwibiIsInVwZGF0ZU1lc3NhZ2UiLCJ0aGlzS2V5UGF0aCIsInNjaGVtYVBhcnQiLCJlbGVtZW50cyIsImhhc09iamVjdFNjaGVtYSIsIl8kdmFsaWRhdG9yIiwidmFsdWVUeXBlIiwiSlNPTiIsImlucHV0Q29uZmlnIiwiYWxsQ29uZmlnc0Zvck1vZHVsZSIsImFjYyIsInZhbHVlIiwidmFsaWRhdGVCcmFuY2hTdHJ1Y3R1cmUiLCJjaGVja1R5cGUiLCJ2YWxpZGF0ZUZyZWVmb3JtT2JqZWN0U3RydWN0dXJlIiwidmFsaWRhdGVBcnJheVN0cnVjdHVyZSIsImZyZWVmb3JtT2JqZWN0U2NoZW1hIiwiYXJyYXlTY2hlbWEiLCJ2YWxpZGF0ZWRBc0FycmF5IiwiaSIsImkxIiwiX2FycmF5U2NoZW1hX19lbGVtZW50cyIsInJ1blZhbGlkYXRvcnMiLCJfdHlwZSIsInZhbGlkYXRvcnMiLCJyZXR1cm5WYWx1ZSIsInZhbGlkYXRvclJlc3VsdCIsIm1lc3NhZ2UiLCJfdHlwZV9vZiIsImUiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJjb25maWdQYXJ0IiwiY29uZmlnV2l0aERlZmF1bHRzIiwiY29uZiIsIm9iamVjdEtleSIsInNlbGVjdGVkQ29uZmlnUGFydCIsImVsZW1lbnRzU2NoZW1hIiwiZGlzcGxheWVkVmFsaWRhdGlvbk1lc3NhZ2VzIiwiU2V0IiwiY2xlYXJDb25maWdFcnJvcnMiLCJyZXNldENvbmZpZ1N5c3RlbSIsIl9leHRlbnNpb25JZF9zcGxpdCIsIm8iLCJiYWRLZXlzIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkJBQTZCLEdBQWlGO0FBQzNFO0FBQ3lFO0FBQ3JEO0FBQytKO0FBQ3ROOzs7O0NBSUMsR0FBRyxTQUFTcUIsaUJBQWlCQyxJQUFJLEVBQUVDLEtBQUs7SUFDckMsT0FBT3JCLHlDQUFTQSxD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\n//# sourceURL=webpack-internal:///../../framework/esm-config/dist/module-config/module-config.js\n\n}");
5584
5584
 
5585
5585
  },
5586
5586
  "../../framework/esm-config/dist/module-config/state.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
@@ -5930,7 +5930,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
5930
5930
  },
5931
5931
  "../../framework/esm-react-utils/dist/ExtensionSlot.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
5932
5932
  "use strict";
5933
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n ExtensionSlot: () => (ExtensionSlot)\n});\n/* import */ var react__rspack_import_0 = __webpack_require__(\"webpack/sharing/consume/default/react/react\");\n/* import */ var react__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(react__rspack_import_0);\n/* import */ var _ComponentContext_js__rspack_import_1 = __webpack_require__(\"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/* import */ var _Extension_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-react-utils/dist/Extension.js\");\n/* import */ var _useExtensionSlot_js__rspack_import_3 = __webpack_require__(\"../../framework/esm-react-utils/dist/useExtensionSlot.js\");\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _object_without_properties(source, excluded) {\n if (source == null) return {};\n var target = {}, sourceKeys, key, i;\n if (typeof Reflect !== \"undefined\" && Reflect.ownKeys) {\n sourceKeys = Reflect.ownKeys(Object(source));\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n return target;\n }\n target = _object_without_properties_loose(source, excluded);\n if (Object.getOwnPropertySymbols) {\n sourceKeys = Object.getOwnPropertySymbols(source);\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _object_without_properties_loose(source, excluded) {\n if (source == null) return {};\n var target = {}, sourceKeys = Object.getOwnPropertyNames(source), key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n return target;\n}\n/** @module @category Extension */ \n\n\n\nfunction defaultSelect(extensions) {\n return extensions;\n}\n/**\n * An [extension slot](https://o3-docs.openmrs.org/docs/extension-system).\n * A place with a name. Extensions that get connected to that name\n * will be rendered into this.\n *\n * @example\n * Passing a react node as children\n *\n * ```tsx\n * <ExtensionSlot name=\"Foo\">\n * <div style={{ width: 10rem }}>\n * <Extension />\n * </div>\n * </ExtensionSlot>\n * ```\n *\n * @example\n * Passing a function as children\n *\n * ```tsx\n * <ExtensionSlot name=\"Bar\">\n * {(extension) => (\n * <h1>{extension.name}</h1>\n * <div style={{ color: extension.meta.color }}>\n * <Extension />\n * </div>\n * )}\n * </ExtensionSlot>\n * ```\n *\n */ function ExtensionSlot(_0) {\n var extensionSlotName = _0.name, legacyExtensionSlotName = _0.extensionSlotName, _0_select = _0.select, select = _0_select === void 0 ? defaultSelect : _0_select, children = _0.children, state = _0.state, style = _0.style, divProps = _object_without_properties(_0, [\n \"name\",\n \"extensionSlotName\",\n \"select\",\n \"children\",\n \"state\",\n \"style\"\n ]);\n if (children && state) {\n throw new Error('Both children and state have been provided. If children are provided, the state must be passed as a prop to the `Extension` component.');\n }\n var name = extensionSlotName !== null && extensionSlotName !== void 0 ? extensionSlotName : legacyExtensionSlotName;\n var slotRef = (0,react__rspack_import_0.useRef)(null);\n var _useExtensionSlot = (0,_useExtensionSlot_js__rspack_import_3.useExtensionSlot)(name, state), extensions = _useExtensionSlot.extensions, extensionSlotModuleName = _useExtensionSlot.extensionSlotModuleName;\n var extensionsToRender = (0,react__rspack_import_0.useMemo)(function() {\n return select(extensions);\n }, [\n select,\n extensions\n ]);\n var extensionsFromChildrenFunction = (0,react__rspack_import_0.useMemo)(function() {\n if (typeof children == 'function' && !/*#__PURE__*/ react__rspack_import_0_default().isValidElement(children)) {\n return extensionsToRender.map(function(extension) {\n return children(extension, state);\n });\n }\n }, [\n children,\n extensionsToRender\n ]);\n return /*#__PURE__*/ react__rspack_import_0_default().createElement(\"div\", _object_spread({\n ref: slotRef,\n \"data-extension-slot-name\": name,\n \"data-extension-slot-module-name\": extensionSlotModuleName,\n style: _object_spread_props(_object_spread({}, style), {\n position: 'relative'\n })\n }, divProps), name && (extensionsToRender === null || extensionsToRender === void 0 ? void 0 : extensionsToRender.map(function(extension, i) {\n var _ref, _ref1;\n return /*#__PURE__*/ react__rspack_import_0_default().createElement(_ComponentContext_js__rspack_import_1.ComponentContext.Provider, {\n key: extension.id,\n value: {\n moduleName: extensionSlotModuleName,\n featureName: '',\n extension: {\n extensionId: extension.id,\n extensionSlotName: name,\n extensionSlotModuleName: extensionSlotModuleName\n }\n }\n }, (_ref = (_ref1 = extensionsFromChildrenFunction === null || extensionsFromChildrenFunction === void 0 ? void 0 : extensionsFromChildrenFunction[i]) !== null && _ref1 !== void 0 ? _ref1 : typeof children !== 'function' ? children : null) !== null && _ref !== void 0 ? _ref : /*#__PURE__*/ react__rspack_import_0_default().createElement(_Extension_js__rspack_import_2.Extension, {\n state: state\n }));\n })));\n}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvRXh0ZW5zaW9uU2xvdC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L0V4dGVuc2lvblNsb3QuanM/ZjBmNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgRXh0ZW5zaW9uICovIGltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiLi9Db21wb25lbnRDb250ZXh0LmpzXCI7XG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tIFwiLi9FeHRlbnNpb24uanNcIjtcbmltcG9ydCB7IHVzZUV4dGVuc2lvblNsb3QgfSBmcm9tIFwiLi91c2VFeHRlbnNpb25TbG90LmpzXCI7XG5mdW5jdGlvbiBkZWZhdWx0U2VsZWN0KGV4dGVuc2lvbnMpIHtcbiAgICByZXR1cm4gZXh0ZW5zaW9ucztcbn1cbi8qKlxuICogQW4gW2V4dGVuc2lvbiBzbG90XShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZG9jcy9leHRlbnNpb24tc3lzdGVtKS5cbiAqIEEgcGxhY2Ugd2l0aCBhIG5hbWUuIEV4dGVuc2lvbnMgdGhhdCBnZXQgY29ubmVjdGVkIHRvIHRoYXQgbmFtZVxuICogd2lsbCBiZSByZW5kZXJlZCBpbnRvIHRoaXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFBhc3NpbmcgYSByZWFjdCBub2RlIGFzIGNoaWxkcmVuXG4gKlxuICogYGBgdHN4XG4gKiA8RXh0ZW5zaW9uU2xvdCBuYW1lPVwiRm9vXCI+XG4gKiAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6IDEwcmVtIH19PlxuICogICAgIDxFeHRlbnNpb24gLz5cbiAqICAgPC9kaXY+XG4gKiA8L0V4dGVuc2lvblNsb3Q+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogUGFzc2luZyBhIGZ1bmN0aW9uIGFzIGNoaWxkcmVuXG4gKlxuICogYGBgdHN4XG4gKiA8RXh0ZW5zaW9uU2xvdCBuYW1lPVwiQmFyXCI+XG4gKiAgIHsoZXh0ZW5zaW9uKSA9PiAoXG4gKiAgICAgPGgxPntleHRlbnNpb24ubmFtZX08L2gxPlxuICogICAgIDxkaXYgc3R5bGU9e3sgY29sb3I6IGV4dGVuc2lvbi5tZXRhLmNvbG9yIH19PlxuICogICAgICAgPEV4dGVuc2lvbiAvPlxuICogICAgIDwvZGl2PlxuICogICApfVxuICogPC9FeHRlbnNpb25TbG90PlxuICogYGBgXG4gKlxuICovIGV4cG9ydCBmdW5jdGlvbiBFeHRlbnNpb25TbG90KHsgbmFtZTogZXh0ZW5zaW9uU2xvdE5hbWUsIGV4dGVuc2lvblNsb3ROYW1lOiBsZWdhY3lFeHRlbnNpb25TbG90TmFtZSwgc2VsZWN0ID0gZGVmYXVsdFNlbGVjdCwgY2hpbGRyZW4sIHN0YXRlLCBzdHlsZSwgLi4uZGl2UHJvcHMgfSkge1xuICAgIGlmIChjaGlsZHJlbiAmJiBzdGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggY2hpbGRyZW4gYW5kIHN0YXRlIGhhdmUgYmVlbiBwcm92aWRlZC4gSWYgY2hpbGRyZW4gYXJlIHByb3ZpZGVkLCB0aGUgc3RhdGUgbXVzdCBiZSBwYXNzZWQgYXMgYSBwcm9wIHRvIHRoZSBgRXh0ZW5zaW9uYCBjb21wb25lbnQuJyk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBleHRlbnNpb25TbG90TmFtZSA/PyBsZWdhY3lFeHRlbnNpb25TbG90TmFtZTtcbiAgICBjb25zdCBzbG90UmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHsgZXh0ZW5zaW9ucywgZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUgfSA9IHVzZUV4dGVuc2lvblNsb3QobmFtZSwgc3RhdGUpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnNUb1JlbmRlciA9IHVzZU1lbW8oKCk9PnNlbGVjdChleHRlbnNpb25zKSwgW1xuICAgICAgICBzZWxlY3QsXG4gICAgICAgIGV4dGVuc2lvbnNcbiAgICBdKTtcbiAgICBjb25zdCBleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24gPSB1c2VNZW1vKCgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT0gJ2Z1bmN0aW9uJyAmJiAhLyojX19QVVJFX18qLyBSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZW5kZXIubWFwKChleHRlbnNpb24pPT5jaGlsZHJlbihleHRlbnNpb24sIHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBleHRlbnNpb25zVG9SZW5kZXJcbiAgICBdKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBzbG90UmVmLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbmFtZVwiOiBuYW1lLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbW9kdWxlLW5hbWVcIjogZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRpdlByb3BzXG4gICAgfSwgbmFtZSAmJiBleHRlbnNpb25zVG9SZW5kZXI/Lm1hcCgoZXh0ZW5zaW9uLCBpKT0+LyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgICAgIGtleTogZXh0ZW5zaW9uLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBleHRlbnNpb25TbG90TW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZTogJycsXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkOiBleHRlbnNpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNsb3ROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25TbG90TW9kdWxlTmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZXh0ZW5zaW9uc0Zyb21DaGlsZHJlbkZ1bmN0aW9uPy5baV0gPz8gKHR5cGVvZiBjaGlsZHJlbiAhPT0gJ2Z1bmN0aW9uJyA/IGNoaWxkcmVuIDogbnVsbCkgPz8gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KEV4dGVuc2lvbiwge1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICAgIH0pKSkpO1xufVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwidXNlUmVmIiwidXNlTWVtbyIsIkNvbXBvbmVudENvbnRleHQiLCJFeHRlbnNpb24iLCJ1c2VFeHRlbnNpb25TbG90IiwiZGVmYXVsdFNlbGVjdCIsImV4dGVuc2lvbnMiLCJFeHRlbnNpb25TbG90IiwiZXh0ZW5zaW9uU2xvdE5hbWUiLCJsZWdhY3lFeHRlbnNpb25TbG90TmFtZSIsInNlbGVjdCIsImNoaWxkcmVuIiwic3RhdGUiLCJzdHlsZSIsImRpdlByb3BzIiwiRXJyb3IiLCJuYW1lIiwic2xvdFJlZiIsIl91c2VFeHRlbnNpb25TbG90IiwiZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25zVG9SZW5kZXIiLCJleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24iLCJleHRlbnNpb24iLCJpIiwiX3JlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdDQUFnQyxHQUFrRDtBQUN6QjtBQUNkO0FBQ2M7QUFDekQsU0FBU00sY0FBY0MsVUFBVTtJQUM3QixPQUFPQTtBQUNYO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThCQyxHQUFVLFNBQVNDLGNBQWMsRUFBb0k7UUFBNUhDLHVCQUFOLE1BQTRDQyw2QkFBbkIsa0NBQTRDQyxRQUFBQSxnQ0FBU0wsMkJBQWVNLGNBQUFBLFVBQVVDLFdBQUFBLE9BQU9DLFdBQUFBLE9BQVVDOzs7Ozs7OztJQUN4SixJQUFJSCxZQUFZQyxPQUFPO1FBQ25CLE1BQU0sSUFBSUcsTUFBTTtJQUNwQjtJQUNBLElBQU1DLE9BQU9SLDhCQUFBQSwrQkFBQUEsb0JBQXFCQztJQUNsQyxJQUFNUSxVQUFVakIsaUNBQU1BLENBQUM7SUFDdkIsSUFBZ0RrQixvQkFBQUEsMERBQWdCQSxDQUFDRixNQUFNSixRQUEvRE4sYUFBd0NZLGtCQUF4Q1osWUFBWWEsMEJBQTRCRCxrQkFBNUJDO0lBQ3BCLElBQU1DLHFCQUFxQm5CLGtDQUFPQSxDQUFDO2VBQUlTLE9BQU9KO09BQWE7UUFDdkRJO1FBQ0FKO0tBQ0g7SUFDRCxJQUFNZSxpQ0FBaUNwQixrQ0FBT0EsQ0FBQztRQUMzQyxJQUFJLE9BQU9VLFlBQVksY0FBYyxDQUFDLFdBQVcsR0FBR1osK0NBQW9CLENBQUNZLFdBQVc7WUFDaEYsT0FBT1MsbUJBQW1CLEdBQUcsQ0FBQyxTQUFDRTt1QkFBWVgsU0FBU1csV0FBV1Y7O1FBQ25FO0lBQ0osR0FBRztRQUNDRDtRQUNBUztLQUNIO0lBQ0QsT0FBTyxXQUFXLEdBQUdyQiw4Q0FBbUIsQ0FBQyxPQUFPO1FBQzVDLEtBQUtrQjtRQUNMLDRCQUE0QkQ7UUFDNUIsbUNBQW1DRztRQUNuQyxPQUFPLHdDQUNBTjtZQUNILFVBQVU7O09BRVhDLFdBQ0pFLFNBQVFJLCtCQUFBQSx5Q0FBQUEsbUJBQW9CLEdBQUcsQ0FBQyxTQUFDRSxXQUFXQztZQVd4Q0M7ZUFYNEMsV0FBVyxHQUFHekIsOENBQW1CLENBQUNHLCtEQUF5QixFQUFFO1lBQ3hHLEtBQUtvQixVQUFVLEVBQUU7WUFDakIsT0FBTztnQkFDSCxZQUFZSDtnQkFDWixhQUFhO2dCQUNiLFdBQVc7b0JBQ1AsYUFBYUcsVUFBVSxFQUFFO29CQUN6QixtQkFBbUJOO29CQUNuQkcseUJBQUFBO2dCQUNKO1lBQ0o7UUFDSixJQUFHSyxnQkFBQUEsMkNBQUFBLHFEQUFBQSw4QkFBZ0MsQ0FBQ0QsRUFBRSx5Q0FBSyxPQUFPWixhQUFhLGFBQWFBLFdBQVcsa0JBQXBGYSxrQkFBQUEsT0FBNkYsV0FBVyxHQUFHekIsOENBQW1CLENBQUNJLHdDQUFTQSxFQUFFO1lBQ3pJLE9BQU9TO1FBQ1g7O0FBQ1IifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/ExtensionSlot.js\n\n}");
5933
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n ExtensionSlot: () => (ExtensionSlot)\n});\n/* import */ var react__rspack_import_0 = __webpack_require__(\"webpack/sharing/consume/default/react/react\");\n/* import */ var react__rspack_import_0_default = /*#__PURE__*/__webpack_require__.n(react__rspack_import_0);\n/* import */ var _ComponentContext_js__rspack_import_1 = __webpack_require__(\"../../framework/esm-react-utils/dist/ComponentContext.js\");\n/* import */ var _Extension_js__rspack_import_2 = __webpack_require__(\"../../framework/esm-react-utils/dist/Extension.js\");\n/* import */ var _useExtensionSlot_js__rspack_import_3 = __webpack_require__(\"../../framework/esm-react-utils/dist/useExtensionSlot.js\");\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\nfunction _object_without_properties(source, excluded) {\n if (source == null) return {};\n var target = {}, sourceKeys, key, i;\n if (typeof Reflect !== \"undefined\" && Reflect.ownKeys) {\n sourceKeys = Reflect.ownKeys(Object(source));\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n return target;\n }\n target = _object_without_properties_loose(source, excluded);\n if (Object.getOwnPropertySymbols) {\n sourceKeys = Object.getOwnPropertySymbols(source);\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\nfunction _object_without_properties_loose(source, excluded) {\n if (source == null) return {};\n var target = {}, sourceKeys = Object.getOwnPropertyNames(source), key, i;\n for(i = 0; i < sourceKeys.length; i++){\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n return target;\n}\n/** @module @category Extension */ \n\n\n\nfunction defaultSelect(extensions) {\n return extensions;\n}\n/**\n * An [extension slot](https://o3-docs.openmrs.org/en-US/docs/extension-system).\n * A place with a name. Extensions that get connected to that name\n * will be rendered into this.\n *\n * @example\n * Passing a react node as children\n *\n * ```tsx\n * <ExtensionSlot name=\"Foo\">\n * <div style={{ width: 10rem }}>\n * <Extension />\n * </div>\n * </ExtensionSlot>\n * ```\n *\n * @example\n * Passing a function as children\n *\n * ```tsx\n * <ExtensionSlot name=\"Bar\">\n * {(extension) => (\n * <h1>{extension.name}</h1>\n * <div style={{ color: extension.meta.color }}>\n * <Extension />\n * </div>\n * )}\n * </ExtensionSlot>\n * ```\n *\n */ function ExtensionSlot(_0) {\n var extensionSlotName = _0.name, legacyExtensionSlotName = _0.extensionSlotName, _0_select = _0.select, select = _0_select === void 0 ? defaultSelect : _0_select, children = _0.children, state = _0.state, style = _0.style, divProps = _object_without_properties(_0, [\n \"name\",\n \"extensionSlotName\",\n \"select\",\n \"children\",\n \"state\",\n \"style\"\n ]);\n if (children && state) {\n throw new Error('Both children and state have been provided. If children are provided, the state must be passed as a prop to the `Extension` component.');\n }\n var name = extensionSlotName !== null && extensionSlotName !== void 0 ? extensionSlotName : legacyExtensionSlotName;\n var slotRef = (0,react__rspack_import_0.useRef)(null);\n var _useExtensionSlot = (0,_useExtensionSlot_js__rspack_import_3.useExtensionSlot)(name, state), extensions = _useExtensionSlot.extensions, extensionSlotModuleName = _useExtensionSlot.extensionSlotModuleName;\n var extensionsToRender = (0,react__rspack_import_0.useMemo)(function() {\n return select(extensions);\n }, [\n select,\n extensions\n ]);\n var extensionsFromChildrenFunction = (0,react__rspack_import_0.useMemo)(function() {\n if (typeof children == 'function' && !/*#__PURE__*/ react__rspack_import_0_default().isValidElement(children)) {\n return extensionsToRender.map(function(extension) {\n return children(extension, state);\n });\n }\n }, [\n children,\n extensionsToRender\n ]);\n return /*#__PURE__*/ react__rspack_import_0_default().createElement(\"div\", _object_spread({\n ref: slotRef,\n \"data-extension-slot-name\": name,\n \"data-extension-slot-module-name\": extensionSlotModuleName,\n style: _object_spread_props(_object_spread({}, style), {\n position: 'relative'\n })\n }, divProps), name && (extensionsToRender === null || extensionsToRender === void 0 ? void 0 : extensionsToRender.map(function(extension, i) {\n var _ref, _ref1;\n return /*#__PURE__*/ react__rspack_import_0_default().createElement(_ComponentContext_js__rspack_import_1.ComponentContext.Provider, {\n key: extension.id,\n value: {\n moduleName: extensionSlotModuleName,\n featureName: '',\n extension: {\n extensionId: extension.id,\n extensionSlotName: name,\n extensionSlotModuleName: extensionSlotModuleName\n }\n }\n }, (_ref = (_ref1 = extensionsFromChildrenFunction === null || extensionsFromChildrenFunction === void 0 ? void 0 : extensionsFromChildrenFunction[i]) !== null && _ref1 !== void 0 ? _ref1 : typeof children !== 'function' ? children : null) !== null && _ref !== void 0 ? _ref : /*#__PURE__*/ react__rspack_import_0_default().createElement(_Extension_js__rspack_import_2.Extension, {\n state: state\n }));\n })));\n}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLXJlYWN0LXV0aWxzL2Rpc3QvRXh0ZW5zaW9uU2xvdC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS1yZWFjdC11dGlscy9kaXN0L0V4dGVuc2lvblNsb3QuanM/ZjBmNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQG1vZHVsZSBAY2F0ZWdvcnkgRXh0ZW5zaW9uICovIGltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENvbXBvbmVudENvbnRleHQgfSBmcm9tIFwiLi9Db21wb25lbnRDb250ZXh0LmpzXCI7XG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tIFwiLi9FeHRlbnNpb24uanNcIjtcbmltcG9ydCB7IHVzZUV4dGVuc2lvblNsb3QgfSBmcm9tIFwiLi91c2VFeHRlbnNpb25TbG90LmpzXCI7XG5mdW5jdGlvbiBkZWZhdWx0U2VsZWN0KGV4dGVuc2lvbnMpIHtcbiAgICByZXR1cm4gZXh0ZW5zaW9ucztcbn1cbi8qKlxuICogQW4gW2V4dGVuc2lvbiBzbG90XShodHRwczovL28zLWRvY3Mub3Blbm1ycy5vcmcvZW4tVVMvZG9jcy9leHRlbnNpb24tc3lzdGVtKS5cbiAqIEEgcGxhY2Ugd2l0aCBhIG5hbWUuIEV4dGVuc2lvbnMgdGhhdCBnZXQgY29ubmVjdGVkIHRvIHRoYXQgbmFtZVxuICogd2lsbCBiZSByZW5kZXJlZCBpbnRvIHRoaXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIFBhc3NpbmcgYSByZWFjdCBub2RlIGFzIGNoaWxkcmVuXG4gKlxuICogYGBgdHN4XG4gKiA8RXh0ZW5zaW9uU2xvdCBuYW1lPVwiRm9vXCI+XG4gKiAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6IDEwcmVtIH19PlxuICogICAgIDxFeHRlbnNpb24gLz5cbiAqICAgPC9kaXY+XG4gKiA8L0V4dGVuc2lvblNsb3Q+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogUGFzc2luZyBhIGZ1bmN0aW9uIGFzIGNoaWxkcmVuXG4gKlxuICogYGBgdHN4XG4gKiA8RXh0ZW5zaW9uU2xvdCBuYW1lPVwiQmFyXCI+XG4gKiAgIHsoZXh0ZW5zaW9uKSA9PiAoXG4gKiAgICAgPGgxPntleHRlbnNpb24ubmFtZX08L2gxPlxuICogICAgIDxkaXYgc3R5bGU9e3sgY29sb3I6IGV4dGVuc2lvbi5tZXRhLmNvbG9yIH19PlxuICogICAgICAgPEV4dGVuc2lvbiAvPlxuICogICAgIDwvZGl2PlxuICogICApfVxuICogPC9FeHRlbnNpb25TbG90PlxuICogYGBgXG4gKlxuICovIGV4cG9ydCBmdW5jdGlvbiBFeHRlbnNpb25TbG90KHsgbmFtZTogZXh0ZW5zaW9uU2xvdE5hbWUsIGV4dGVuc2lvblNsb3ROYW1lOiBsZWdhY3lFeHRlbnNpb25TbG90TmFtZSwgc2VsZWN0ID0gZGVmYXVsdFNlbGVjdCwgY2hpbGRyZW4sIHN0YXRlLCBzdHlsZSwgLi4uZGl2UHJvcHMgfSkge1xuICAgIGlmIChjaGlsZHJlbiAmJiBzdGF0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggY2hpbGRyZW4gYW5kIHN0YXRlIGhhdmUgYmVlbiBwcm92aWRlZC4gSWYgY2hpbGRyZW4gYXJlIHByb3ZpZGVkLCB0aGUgc3RhdGUgbXVzdCBiZSBwYXNzZWQgYXMgYSBwcm9wIHRvIHRoZSBgRXh0ZW5zaW9uYCBjb21wb25lbnQuJyk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBleHRlbnNpb25TbG90TmFtZSA/PyBsZWdhY3lFeHRlbnNpb25TbG90TmFtZTtcbiAgICBjb25zdCBzbG90UmVmID0gdXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHsgZXh0ZW5zaW9ucywgZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUgfSA9IHVzZUV4dGVuc2lvblNsb3QobmFtZSwgc3RhdGUpO1xuICAgIGNvbnN0IGV4dGVuc2lvbnNUb1JlbmRlciA9IHVzZU1lbW8oKCk9PnNlbGVjdChleHRlbnNpb25zKSwgW1xuICAgICAgICBzZWxlY3QsXG4gICAgICAgIGV4dGVuc2lvbnNcbiAgICBdKTtcbiAgICBjb25zdCBleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24gPSB1c2VNZW1vKCgpPT57XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT0gJ2Z1bmN0aW9uJyAmJiAhLyojX19QVVJFX18qLyBSZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZW5kZXIubWFwKChleHRlbnNpb24pPT5jaGlsZHJlbihleHRlbnNpb24sIHN0YXRlKSk7XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBleHRlbnNpb25zVG9SZW5kZXJcbiAgICBdKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgcmVmOiBzbG90UmVmLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbmFtZVwiOiBuYW1lLFxuICAgICAgICBcImRhdGEtZXh0ZW5zaW9uLXNsb3QtbW9kdWxlLW5hbWVcIjogZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRpdlByb3BzXG4gICAgfSwgbmFtZSAmJiBleHRlbnNpb25zVG9SZW5kZXI/Lm1hcCgoZXh0ZW5zaW9uLCBpKT0+LyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgICAgIGtleTogZXh0ZW5zaW9uLmlkLFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBtb2R1bGVOYW1lOiBleHRlbnNpb25TbG90TW9kdWxlTmFtZSxcbiAgICAgICAgICAgICAgICBmZWF0dXJlTmFtZTogJycsXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkOiBleHRlbnNpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNsb3ROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25TbG90TW9kdWxlTmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZXh0ZW5zaW9uc0Zyb21DaGlsZHJlbkZ1bmN0aW9uPy5baV0gPz8gKHR5cGVvZiBjaGlsZHJlbiAhPT0gJ2Z1bmN0aW9uJyA/IGNoaWxkcmVuIDogbnVsbCkgPz8gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KEV4dGVuc2lvbiwge1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlXG4gICAgICAgIH0pKSkpO1xufVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwidXNlUmVmIiwidXNlTWVtbyIsIkNvbXBvbmVudENvbnRleHQiLCJFeHRlbnNpb24iLCJ1c2VFeHRlbnNpb25TbG90IiwiZGVmYXVsdFNlbGVjdCIsImV4dGVuc2lvbnMiLCJFeHRlbnNpb25TbG90IiwiZXh0ZW5zaW9uU2xvdE5hbWUiLCJsZWdhY3lFeHRlbnNpb25TbG90TmFtZSIsInNlbGVjdCIsImNoaWxkcmVuIiwic3RhdGUiLCJzdHlsZSIsImRpdlByb3BzIiwiRXJyb3IiLCJuYW1lIiwic2xvdFJlZiIsIl91c2VFeHRlbnNpb25TbG90IiwiZXh0ZW5zaW9uU2xvdE1vZHVsZU5hbWUiLCJleHRlbnNpb25zVG9SZW5kZXIiLCJleHRlbnNpb25zRnJvbUNoaWxkcmVuRnVuY3Rpb24iLCJleHRlbnNpb24iLCJpIiwiX3JlZiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdDQUFnQyxHQUFrRDtBQUN6QjtBQUNkO0FBQ2M7QUFDekQsU0FBU00sY0FBY0MsVUFBVTtJQUM3QixPQUFPQTtBQUNYO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThCQyxHQUFVLFNBQVNDLGNBQWMsRUFBb0k7UUFBNUhDLHVCQUFOLE1BQTRDQyw2QkFBbkIsa0NBQTRDQyxRQUFBQSxnQ0FBU0wsMkJBQWVNLGNBQUFBLFVBQVVDLFdBQUFBLE9BQU9DLFdBQUFBLE9BQVVDOzs7Ozs7OztJQUN4SixJQUFJSCxZQUFZQyxPQUFPO1FBQ25CLE1BQU0sSUFBSUcsTUFBTTtJQUNwQjtJQUNBLElBQU1DLE9BQU9SLDhCQUFBQSwrQkFBQUEsb0JBQXFCQztJQUNsQyxJQUFNUSxVQUFVakIsaUNBQU1BLENBQUM7SUFDdkIsSUFBZ0RrQixvQkFBQUEsMERBQWdCQSxDQUFDRixNQUFNSixRQUEvRE4sYUFBd0NZLGtCQUF4Q1osWUFBWWEsMEJBQTRCRCxrQkFBNUJDO0lBQ3BCLElBQU1DLHFCQUFxQm5CLGtDQUFPQSxDQUFDO2VBQUlTLE9BQU9KO09BQWE7UUFDdkRJO1FBQ0FKO0tBQ0g7SUFDRCxJQUFNZSxpQ0FBaUNwQixrQ0FBT0EsQ0FBQztRQUMzQyxJQUFJLE9BQU9VLFlBQVksY0FBYyxDQUFDLFdBQVcsR0FBR1osK0NBQW9CLENBQUNZLFdBQVc7WUFDaEYsT0FBT1MsbUJBQW1CLEdBQUcsQ0FBQyxTQUFDRTt1QkFBWVgsU0FBU1csV0FBV1Y7O1FBQ25FO0lBQ0osR0FBRztRQUNDRDtRQUNBUztLQUNIO0lBQ0QsT0FBTyxXQUFXLEdBQUdyQiw4Q0FBbUIsQ0FBQyxPQUFPO1FBQzVDLEtBQUtrQjtRQUNMLDRCQUE0QkQ7UUFDNUIsbUNBQW1DRztRQUNuQyxPQUFPLHdDQUNBTjtZQUNILFVBQVU7O09BRVhDLFdBQ0pFLFNBQVFJLCtCQUFBQSx5Q0FBQUEsbUJBQW9CLEdBQUcsQ0FBQyxTQUFDRSxXQUFXQztZQVd4Q0M7ZUFYNEMsV0FBVyxHQUFHekIsOENBQW1CLENBQUNHLCtEQUF5QixFQUFFO1lBQ3hHLEtBQUtvQixVQUFVLEVBQUU7WUFDakIsT0FBTztnQkFDSCxZQUFZSDtnQkFDWixhQUFhO2dCQUNiLFdBQVc7b0JBQ1AsYUFBYUcsVUFBVSxFQUFFO29CQUN6QixtQkFBbUJOO29CQUNuQkcseUJBQUFBO2dCQUNKO1lBQ0o7UUFDSixJQUFHSyxnQkFBQUEsMkNBQUFBLHFEQUFBQSw4QkFBZ0MsQ0FBQ0QsRUFBRSx5Q0FBSyxPQUFPWixhQUFhLGFBQWFBLFdBQVcsa0JBQXBGYSxrQkFBQUEsT0FBNkYsV0FBVyxHQUFHekIsOENBQW1CLENBQUNJLHdDQUFTQSxFQUFFO1lBQ3pJLE9BQU9TO1FBQ1g7O0FBQ1IifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-react-utils/dist/ExtensionSlot.js\n\n}");
5934
5934
 
5935
5935
  },
5936
5936
  "../../framework/esm-react-utils/dist/OpenmrsContext.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
@@ -6225,7 +6225,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webp
6225
6225
  },
6226
6226
  "../../framework/esm-translations/dist/translations.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {
6227
6227
  "use strict";
6228
- eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n coreTranslations: () => (coreTranslations)\n});\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\n/** Please keep these alphabetized */ var addressFields = {\n address1: 'Address line 1',\n address2: 'Address line 2',\n address3: 'Address line 3',\n address4: 'Address line 4',\n address5: 'Address line 5',\n address6: 'Address line 6',\n city: 'City',\n cityVillage: 'City',\n country: 'Country',\n countyDistrict: 'District',\n district: 'District',\n postalCode: 'Postal code',\n state: 'State',\n stateProvince: 'State'\n};\nvar workspaceTranslations = {\n closeAllOpenedWorkspaces: 'Discard changes in {{count}} workspaces',\n closingAllWorkspacesPromptBody: 'There may be unsaved changes in the following workspaces. Do you want to discard changes in the following workspaces? {{workspaceNames}}',\n closingAllWorkspacesPromptTitle: 'You have unsaved changes',\n discard: 'Discard',\n hide: 'Hide',\n maximize: 'Maximize',\n minimize: 'Minimize',\n openAnyway: 'Open anyway',\n unsavedChangesInOpenedWorkspace: 'You may have unsaved changes in the opened workspace. Do you want to discard these changes?',\n unsavedChangesInWorkspace: 'There may be unsaved changes in \"{{workspaceName}}\". Please save them before opening another workspace.',\n unsavedChangesTitleText: 'Unsaved changes',\n workspaceHeader: 'Workspace header'\n};\nvar workspace2Translations = {\n closeWorkspaces2PromptTitle: 'Close workspace(s)',\n closeWorkspaces2PromptBody: 'You are about to close the following workspace(s), which might have unsaved changes:'\n};\nvar coreTranslations = _object_spread_props(_object_spread({}, addressFields, workspaceTranslations, workspace2Translations), {\n abnormalValue: 'Abnormal value',\n actions: 'Actions',\n actionableNotification: 'Actionable notification',\n address: 'Address',\n age: 'Age',\n batchActionItemSelected: '{{totalSelected}} item selected',\n batchActionsItemsSelected: '{{totalSelected}} items selected',\n cancel: 'Cancel',\n change: 'Change',\n // Default value for the implementationName config property\n Clinic: 'Clinic',\n close: 'Close',\n closesActionableNotification: 'Close actionable notification',\n closeSnackbar: 'Close snackbar',\n confirm: 'Confirm',\n contactAdministratorIfIssuePersists: 'Contact your system administrator if the problem persists.',\n contactDetails: 'Contact details',\n delete: 'Delete',\n discardChanges: 'Discard changes',\n edit: 'Edit',\n emptyStateText: 'There are no {{displayText}} to display',\n error: 'Error',\n errorCopy: 'Sorry, there was a problem displaying this information. You can try to reload this page, or contact the site administrator and quote the error code above.',\n errorLoadingLoginLocations: 'Unable to load login locations. Please try again or contact support if the problem persists.',\n female: 'Female',\n leftNavigation: 'Left navigation',\n loading: 'Loading',\n male: 'Male',\n noResultsToDisplay: 'No results to display',\n notAvailable: 'Not available',\n other: 'Other',\n paginationItemsCount: '{{pageItemsCount}} / {{totalItems}} items',\n paginationOfPages: 'of {{count}} pages',\n patientAvatarAlt: 'Avatar for {{patientName}}',\n patientIdentifierSticker: 'Patient identifier sticker',\n patientLists: 'Patient lists',\n patientPhotoAlt: 'Profile photo of {{patientName}}',\n patientPhotoPlaceholder: 'Photo placeholder for {{patientName}}',\n print: 'Print',\n printError: 'Print error',\n printErrorExplainer: 'An error occurred in {{errorLocation}}',\n printIdentifierSticker: 'Print identifier sticker',\n printing: 'Printing',\n recordNewEntry: 'Record {{displayText}}',\n relationships: 'Relationships',\n resetOverrides: 'Reset overrides',\n save: 'Save',\n scriptLoadingFailed: 'Error: Script failed to load',\n scriptLoadingError: 'Failed to load overridden script from {{url}}. Please check that the bundled script is available at the expected URL. Click the button below to reset all import map overrides.',\n searchForLocation: 'Search for a location',\n seeAll: 'See all',\n seeMoreLists: 'See {{count}} more lists',\n selectAll: 'Select all',\n sex: 'Sex',\n showLess: 'Show less',\n showMore: 'Show more',\n snackbarNotification: 'Snackbar notification',\n toggleDevTools: 'Toggle dev tools',\n unknown: 'Unknown',\n yearAbbreviation: 'yr',\n yearsAbbreviation: 'yrs'\n});\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLXRyYW5zbGF0aW9ucy9kaXN0L3RyYW5zbGF0aW9ucy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS10cmFuc2xhdGlvbnMvZGlzdC90cmFuc2xhdGlvbnMuanM/OTBkZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUGxlYXNlIGtlZXAgdGhlc2UgYWxwaGFiZXRpemVkICovIGNvbnN0IGFkZHJlc3NGaWVsZHMgPSB7XG4gICAgYWRkcmVzczE6ICdBZGRyZXNzIGxpbmUgMScsXG4gICAgYWRkcmVzczI6ICdBZGRyZXNzIGxpbmUgMicsXG4gICAgYWRkcmVzczM6ICdBZGRyZXNzIGxpbmUgMycsXG4gICAgYWRkcmVzczQ6ICdBZGRyZXNzIGxpbmUgNCcsXG4gICAgYWRkcmVzczU6ICdBZGRyZXNzIGxpbmUgNScsXG4gICAgYWRkcmVzczY6ICdBZGRyZXNzIGxpbmUgNicsXG4gICAgY2l0eTogJ0NpdHknLFxuICAgIGNpdHlWaWxsYWdlOiAnQ2l0eScsXG4gICAgY291bnRyeTogJ0NvdW50cnknLFxuICAgIGNvdW50eURpc3RyaWN0OiAnRGlzdHJpY3QnLFxuICAgIGRpc3RyaWN0OiAnRGlzdHJpY3QnLFxuICAgIHBvc3RhbENvZGU6ICdQb3N0YWwgY29kZScsXG4gICAgc3RhdGU6ICdTdGF0ZScsXG4gICAgc3RhdGVQcm92aW5jZTogJ1N0YXRlJ1xufTtcbmNvbnN0IHdvcmtzcGFjZVRyYW5zbGF0aW9ucyA9IHtcbiAgICBjbG9zZUFsbE9wZW5lZFdvcmtzcGFjZXM6ICdEaXNjYXJkIGNoYW5nZXMgaW4ge3tjb3VudH19IHdvcmtzcGFjZXMnLFxuICAgIGNsb3NpbmdBbGxXb3Jrc3BhY2VzUHJvbXB0Qm9keTogJ1RoZXJlIG1heSBiZSB1bnNhdmVkIGNoYW5nZXMgaW4gdGhlIGZvbGxvd2luZyB3b3Jrc3BhY2VzLiBEbyB5b3Ugd2FudCB0byBkaXNjYXJkIGNoYW5nZXMgaW4gdGhlIGZvbGxvd2luZyB3b3Jrc3BhY2VzPyB7e3dvcmtzcGFjZU5hbWVzfX0nLFxuICAgIGNsb3NpbmdBbGxXb3Jrc3BhY2VzUHJvbXB0VGl0bGU6ICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMnLFxuICAgIGRpc2NhcmQ6ICdEaXNjYXJkJyxcbiAgICBoaWRlOiAnSGlkZScsXG4gICAgbWF4aW1pemU6ICdNYXhpbWl6ZScsXG4gICAgbWluaW1pemU6ICdNaW5pbWl6ZScsXG4gICAgb3BlbkFueXdheTogJ09wZW4gYW55d2F5JyxcbiAgICB1bnNhdmVkQ2hhbmdlc0luT3BlbmVkV29ya3NwYWNlOiAnWW91IG1heSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyBpbiB0aGUgb3BlbmVkIHdvcmtzcGFjZS4gRG8geW91IHdhbnQgdG8gZGlzY2FyZCB0aGVzZSBjaGFuZ2VzPycsXG4gICAgdW5zYXZlZENoYW5nZXNJbldvcmtzcGFjZTogJ1RoZXJlIG1heSBiZSB1bnNhdmVkIGNoYW5nZXMgaW4gXCJ7e3dvcmtzcGFjZU5hbWV9fVwiLiBQbGVhc2Ugc2F2ZSB0aGVtIGJlZm9yZSBvcGVuaW5nIGFub3RoZXIgd29ya3NwYWNlLicsXG4gICAgdW5zYXZlZENoYW5nZXNUaXRsZVRleHQ6ICdVbnNhdmVkIGNoYW5nZXMnLFxuICAgIHdvcmtzcGFjZUhlYWRlcjogJ1dvcmtzcGFjZSBoZWFkZXInXG59O1xuY29uc3Qgd29ya3NwYWNlMlRyYW5zbGF0aW9ucyA9IHtcbiAgICBjbG9zZVdvcmtzcGFjZXMyUHJvbXB0VGl0bGU6ICdDbG9zZSB3b3Jrc3BhY2UocyknLFxuICAgIGNsb3NlV29ya3NwYWNlczJQcm9tcHRCb2R5OiAnWW91IGFyZSBhYm91dCB0byBjbG9zZSB0aGUgZm9sbG93aW5nIHdvcmtzcGFjZShzKSwgd2hpY2ggbWlnaHQgaGF2ZSB1bnNhdmVkIGNoYW5nZXM6J1xufTtcbmV4cG9ydCBjb25zdCBjb3JlVHJhbnNsYXRpb25zID0ge1xuICAgIC4uLmFkZHJlc3NGaWVsZHMsXG4gICAgLi4ud29ya3NwYWNlVHJhbnNsYXRpb25zLFxuICAgIC4uLndvcmtzcGFjZTJUcmFuc2xhdGlvbnMsXG4gICAgYWJub3JtYWxWYWx1ZTogJ0Fibm9ybWFsIHZhbHVlJyxcbiAgICBhY3Rpb25zOiAnQWN0aW9ucycsXG4gICAgYWN0aW9uYWJsZU5vdGlmaWNhdGlvbjogJ0FjdGlvbmFibGUgbm90aWZpY2F0aW9uJyxcbiAgICBhZGRyZXNzOiAnQWRkcmVzcycsXG4gICAgYWdlOiAnQWdlJyxcbiAgICBiYXRjaEFjdGlvbkl0ZW1TZWxlY3RlZDogJ3t7dG90YWxTZWxlY3RlZH19IGl0ZW0gc2VsZWN0ZWQnLFxuICAgIGJhdGNoQWN0aW9uc0l0ZW1zU2VsZWN0ZWQ6ICd7e3RvdGFsU2VsZWN0ZWR9fSBpdGVtcyBzZWxlY3RlZCcsXG4gICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICBjaGFuZ2U6ICdDaGFuZ2UnLFxuICAgIC8vIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbk5hbWUgY29uZmlnIHByb3BlcnR5XG4gICAgQ2xpbmljOiAnQ2xpbmljJyxcbiAgICBjbG9zZTogJ0Nsb3NlJyxcbiAgICBjbG9zZXNBY3Rpb25hYmxlTm90aWZpY2F0aW9uOiAnQ2xvc2UgYWN0aW9uYWJsZSBub3RpZmljYXRpb24nLFxuICAgIGNsb3NlU25hY2tiYXI6ICdDbG9zZSBzbmFja2JhcicsXG4gICAgY29uZmlybTogJ0NvbmZpcm0nLFxuICAgIGNvbnRhY3RBZG1pbmlzdHJhdG9ySWZJc3N1ZVBlcnNpc3RzOiAnQ29udGFjdCB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLicsXG4gICAgY29udGFjdERldGFpbHM6ICdDb250YWN0IGRldGFpbHMnLFxuICAgIGRlbGV0ZTogJ0RlbGV0ZScsXG4gICAgZGlzY2FyZENoYW5nZXM6ICdEaXNjYXJkIGNoYW5nZXMnLFxuICAgIGVkaXQ6ICdFZGl0JyxcbiAgICBlbXB0eVN0YXRlVGV4dDogJ1RoZXJlIGFyZSBubyB7e2Rpc3BsYXlUZXh0fX0gdG8gZGlzcGxheScsXG4gICAgZXJyb3I6ICdFcnJvcicsXG4gICAgZXJyb3JDb3B5OiAnU29ycnksIHRoZXJlIHdhcyBhIHByb2JsZW0gZGlzcGxheWluZyB0aGlzIGluZm9ybWF0aW9uLiBZb3UgY2FuIHRyeSB0byByZWxvYWQgdGhpcyBwYWdlLCBvciBjb250YWN0IHRoZSBzaXRlIGFkbWluaXN0cmF0b3IgYW5kIHF1b3RlIHRoZSBlcnJvciBjb2RlIGFib3ZlLicsXG4gICAgZXJyb3JMb2FkaW5nTG9naW5Mb2NhdGlvbnM6ICdVbmFibGUgdG8gbG9hZCBsb2dpbiBsb2NhdGlvbnMuIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdXBwb3J0IGlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLicsXG4gICAgZmVtYWxlOiAnRmVtYWxlJyxcbiAgICBsZWZ0TmF2aWdhdGlvbjogJ0xlZnQgbmF2aWdhdGlvbicsXG4gICAgbG9hZGluZzogJ0xvYWRpbmcnLFxuICAgIG1hbGU6ICdNYWxlJyxcbiAgICBub1Jlc3VsdHNUb0Rpc3BsYXk6ICdObyByZXN1bHRzIHRvIGRpc3BsYXknLFxuICAgIG5vdEF2YWlsYWJsZTogJ05vdCBhdmFpbGFibGUnLFxuICAgIG90aGVyOiAnT3RoZXInLFxuICAgIHBhZ2luYXRpb25JdGVtc0NvdW50OiAne3twYWdlSXRlbXNDb3VudH19IC8ge3t0b3RhbEl0ZW1zfX0gaXRlbXMnLFxuICAgIHBhZ2luYXRpb25PZlBhZ2VzOiAnb2Yge3tjb3VudH19IHBhZ2VzJyxcbiAgICBwYXRpZW50QXZhdGFyQWx0OiAnQXZhdGFyIGZvciB7e3BhdGllbnROYW1lfX0nLFxuICAgIHBhdGllbnRJZGVudGlmaWVyU3RpY2tlcjogJ1BhdGllbnQgaWRlbnRpZmllciBzdGlja2VyJyxcbiAgICBwYXRpZW50TGlzdHM6ICdQYXRpZW50IGxpc3RzJyxcbiAgICBwYXRpZW50UGhvdG9BbHQ6ICdQcm9maWxlIHBob3RvIG9mIHt7cGF0aWVudE5hbWV9fScsXG4gICAgcGF0aWVudFBob3RvUGxhY2Vob2xkZXI6ICdQaG90byBwbGFjZWhvbGRlciBmb3Ige3twYXRpZW50TmFtZX19JyxcbiAgICBwcmludDogJ1ByaW50JyxcbiAgICBwcmludEVycm9yOiAnUHJpbnQgZXJyb3InLFxuICAgIHByaW50RXJyb3JFeHBsYWluZXI6ICdBbiBlcnJvciBvY2N1cnJlZCBpbiB7e2Vycm9yTG9jYXRpb259fScsXG4gICAgcHJpbnRJZGVudGlmaWVyU3RpY2tlcjogJ1ByaW50IGlkZW50aWZpZXIgc3RpY2tlcicsXG4gICAgcHJpbnRpbmc6ICdQcmludGluZycsXG4gICAgcmVjb3JkTmV3RW50cnk6ICdSZWNvcmQge3tkaXNwbGF5VGV4dH19JyxcbiAgICByZWxhdGlvbnNoaXBzOiAnUmVsYXRpb25zaGlwcycsXG4gICAgcmVzZXRPdmVycmlkZXM6ICdSZXNldCBvdmVycmlkZXMnLFxuICAgIHNhdmU6ICdTYXZlJyxcbiAgICBzY3JpcHRMb2FkaW5nRmFpbGVkOiAnRXJyb3I6IFNjcmlwdCBmYWlsZWQgdG8gbG9hZCcsXG4gICAgc2NyaXB0TG9hZGluZ0Vycm9yOiAnRmFpbGVkIHRvIGxvYWQgb3ZlcnJpZGRlbiBzY3JpcHQgZnJvbSB7e3VybH19LiBQbGVhc2UgY2hlY2sgdGhhdCB0aGUgYnVuZGxlZCBzY3JpcHQgaXMgYXZhaWxhYmxlIGF0IHRoZSBleHBlY3RlZCBVUkwuIENsaWNrIHRoZSBidXR0b24gYmVsb3cgdG8gcmVzZXQgYWxsIGltcG9ydCBtYXAgb3ZlcnJpZGVzLicsXG4gICAgc2VhcmNoRm9yTG9jYXRpb246ICdTZWFyY2ggZm9yIGEgbG9jYXRpb24nLFxuICAgIHNlZUFsbDogJ1NlZSBhbGwnLFxuICAgIHNlZU1vcmVMaXN0czogJ1NlZSB7e2NvdW50fX0gbW9yZSBsaXN0cycsXG4gICAgc2VsZWN0QWxsOiAnU2VsZWN0IGFsbCcsXG4gICAgc2V4OiAnU2V4JyxcbiAgICBzaG93TGVzczogJ1Nob3cgbGVzcycsXG4gICAgc2hvd01vcmU6ICdTaG93IG1vcmUnLFxuICAgIHNuYWNrYmFyTm90aWZpY2F0aW9uOiAnU25hY2tiYXIgbm90aWZpY2F0aW9uJyxcbiAgICB0b2dnbGVEZXZUb29sczogJ1RvZ2dsZSBkZXYgdG9vbHMnLFxuICAgIHVua25vd246ICdVbmtub3duJyxcbiAgICB5ZWFyQWJicmV2aWF0aW9uOiAneXInLFxuICAgIHllYXJzQWJicmV2aWF0aW9uOiAneXJzJ1xufTtcbiJdLCJuYW1lcyI6WyJhZGRyZXNzRmllbGRzIiwid29ya3NwYWNlVHJhbnNsYXRpb25zIiwid29ya3NwYWNlMlRyYW5zbGF0aW9ucyIsImNvcmVUcmFuc2xhdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW1DLEdBQUcsSUFBTUEsZ0JBQWdCO0lBQ3hELFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDTixhQUFhO0lBQ2IsU0FBUztJQUNULGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsWUFBWTtJQUNaLE9BQU87SUFDUCxlQUFlO0FBQ25CO0FBQ0EsSUFBTUMsd0JBQXdCO0lBQzFCLDBCQUEwQjtJQUMxQixnQ0FBZ0M7SUFDaEMsaUNBQWlDO0lBQ2pDLFNBQVM7SUFDVCxNQUFNO0lBQ04sVUFBVTtJQUNWLFVBQVU7SUFDVixZQUFZO0lBQ1osaUNBQWlDO0lBQ2pDLDJCQUEyQjtJQUMzQix5QkFBeUI7SUFDekIsaUJBQWlCO0FBQ3JCO0FBQ0EsSUFBTUMseUJBQXlCO0lBQzNCLDZCQUE2QjtJQUM3Qiw0QkFBNEI7QUFDaEM7QUFDTyxJQUFNQyxtQkFBbUIsd0NBQ3pCSCxlQUNBQyx1QkFDQUM7SUFDSCxlQUFlO0lBQ2YsU0FBUztJQUNULHdCQUF3QjtJQUN4QixTQUFTO0lBQ1QsS0FBSztJQUNMLHlCQUF5QjtJQUN6QiwyQkFBMkI7SUFDM0IsUUFBUTtJQUNSLFFBQVE7SUFDUiwyREFBMkQ7SUFDM0QsUUFBUTtJQUNSLE9BQU87SUFDUCw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLFNBQVM7SUFDVCxxQ0FBcUM7SUFDckMsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsV0FBVztJQUNYLDRCQUE0QjtJQUM1QixRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxNQUFNO0lBQ04sb0JBQW9CO0lBQ3BCLGNBQWM7SUFDZCxPQUFPO0lBQ1Asc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsMEJBQTBCO0lBQzFCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIseUJBQXlCO0lBQ3pCLE9BQU87SUFDUCxZQUFZO0lBQ1oscUJBQXFCO0lBQ3JCLHdCQUF3QjtJQUN4QixVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixjQUFjO0lBQ2QsV0FBVztJQUNYLEtBQUs7SUFDTCxVQUFVO0lBQ1YsVUFBVTtJQUNWLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsU0FBUztJQUNULGtCQUFrQjtJQUNsQixtQkFBbUI7R0FDckIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-translations/dist/translations.js\n\n}");
6228
+ eval("{__webpack_require__.r(__webpack_exports__);\n__webpack_require__.d(__webpack_exports__, {\n coreTranslations: () => (coreTranslations)\n});\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _object_spread(target) {\n for(var i = 1; i < arguments.length; i++){\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n if (typeof Object.getOwnPropertySymbols === \"function\") {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n ownKeys.forEach(function(key) {\n _define_property(target, key, source[key]);\n });\n }\n return target;\n}\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) {\n symbols = symbols.filter(function(sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n }\n keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _object_spread_props(target, source) {\n source = source != null ? source : {};\n if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function(key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\n/** Please keep these alphabetized */ var addressFields = {\n address1: 'Address line 1',\n address2: 'Address line 2',\n address3: 'Address line 3',\n address4: 'Address line 4',\n address5: 'Address line 5',\n address6: 'Address line 6',\n city: 'City',\n cityVillage: 'City',\n country: 'Country',\n countyDistrict: 'District',\n district: 'District',\n postalCode: 'Postal code',\n state: 'State',\n stateProvince: 'State'\n};\nvar workspaceTranslations = {\n closeAllOpenedWorkspaces: 'Discard changes in {{count}} workspaces',\n closingAllWorkspacesPromptBody: 'There may be unsaved changes in the following workspaces. Do you want to discard changes in the following workspaces? {{workspaceNames}}',\n closingAllWorkspacesPromptTitle: 'You have unsaved changes',\n discard: 'Discard',\n hide: 'Hide',\n maximize: 'Maximize',\n minimize: 'Minimize',\n openAnyway: 'Open anyway',\n unsavedChangesInOpenedWorkspace: 'You may have unsaved changes in the opened workspace. Do you want to discard these changes?',\n unsavedChangesInWorkspace: 'There may be unsaved changes in \"{{workspaceName}}\". Please save them before opening another workspace.',\n unsavedChangesTitleText: 'Unsaved changes',\n workspaceHeader: 'Workspace header'\n};\nvar workspace2Translations = {\n discardUnsavedChangesPromptBodyMultiple: '{{count}} workspaces have unsaved changes. Closing them will discard the changes:',\n discardUnsavedChangesPromptBodySingle: '<strong>{{workspaceTitle}}</strong> has unsaved changes. Closing it will discard them.',\n discardUnsavedChangesPromptTitle: 'Discard unsaved changes?',\n keepEditing: 'Keep editing'\n};\nvar coreTranslations = _object_spread_props(_object_spread({}, addressFields, workspaceTranslations, workspace2Translations), {\n abnormalValue: 'Abnormal value',\n actions: 'Actions',\n actionableNotification: 'Actionable notification',\n address: 'Address',\n age: 'Age',\n batchActionItemSelected: '{{totalSelected}} item selected',\n batchActionsItemsSelected: '{{totalSelected}} items selected',\n cancel: 'Cancel',\n change: 'Change',\n // Default value for the implementationName config property\n Clinic: 'Clinic',\n close: 'Close',\n closesActionableNotification: 'Close actionable notification',\n closeSnackbar: 'Close snackbar',\n confirm: 'Confirm',\n contactAdministratorIfIssuePersists: 'Contact your system administrator if the problem persists.',\n contactDetails: 'Contact details',\n delete: 'Delete',\n discardChanges: 'Discard changes',\n edit: 'Edit',\n emptyStateText: 'There are no {{displayText}} to display',\n error: 'Error',\n errorCopy: 'Sorry, there was a problem displaying this information. You can try to reload this page, or contact the site administrator and quote the error code above.',\n errorLoadingLoginLocations: 'Unable to load login locations. Please try again or contact support if the problem persists.',\n female: 'Female',\n leftNavigation: 'Left navigation',\n loading: 'Loading',\n male: 'Male',\n noResultsToDisplay: 'No results to display',\n notAvailable: 'Not available',\n other: 'Other',\n paginationItemsCount: '{{pageItemsCount}} / {{totalItems}} items',\n paginationOfPages: 'of {{count}} pages',\n patientAvatarAlt: 'Avatar for {{patientName}}',\n patientIdentifierSticker: 'Patient identifier sticker',\n patientLists: 'Patient lists',\n patientPhotoAlt: 'Profile photo of {{patientName}}',\n patientPhotoPlaceholder: 'Photo placeholder for {{patientName}}',\n print: 'Print',\n printError: 'Print error',\n printErrorExplainer: 'An error occurred in {{errorLocation}}',\n printIdentifierSticker: 'Print identifier sticker',\n printing: 'Printing',\n recordNewEntry: 'Record {{displayText}}',\n relationships: 'Relationships',\n resetOverrides: 'Reset overrides',\n save: 'Save',\n scriptLoadingFailed: 'Error: Script failed to load',\n scriptLoadingError: 'Failed to load overridden script from {{url}}. Please check that the bundled script is available at the expected URL. Click the button below to reset all import map overrides.',\n searchForLocation: 'Search for a location',\n seeAll: 'See all',\n seeMoreLists: 'See {{count}} more lists',\n selectAll: 'Select all',\n sex: 'Sex',\n showLess: 'Show less',\n showMore: 'Show more',\n snackbarNotification: 'Snackbar notification',\n toggleDevTools: 'Toggle dev tools',\n unknown: 'Unknown',\n yearAbbreviation: 'yr',\n yearsAbbreviation: 'yrs'\n});\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC9lc218YnVpbHRpbjpzd2MtbG9hZGVyIS9ob21lL3J1bm5lci93b3JrL29wZW5tcnMtZXNtLWNvcmUvb3Blbm1ycy1lc20tY29yZS9wYWNrYWdlcy9mcmFtZXdvcmsvZXNtLXRyYW5zbGF0aW9ucy9kaXN0L3RyYW5zbGF0aW9ucy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0BvcGVubXJzL2VzbS1hcHAtc2hlbGwvLi4vLi4vZnJhbWV3b3JrL2VzbS10cmFuc2xhdGlvbnMvZGlzdC90cmFuc2xhdGlvbnMuanM/OTBkZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogUGxlYXNlIGtlZXAgdGhlc2UgYWxwaGFiZXRpemVkICovIGNvbnN0IGFkZHJlc3NGaWVsZHMgPSB7XG4gICAgYWRkcmVzczE6ICdBZGRyZXNzIGxpbmUgMScsXG4gICAgYWRkcmVzczI6ICdBZGRyZXNzIGxpbmUgMicsXG4gICAgYWRkcmVzczM6ICdBZGRyZXNzIGxpbmUgMycsXG4gICAgYWRkcmVzczQ6ICdBZGRyZXNzIGxpbmUgNCcsXG4gICAgYWRkcmVzczU6ICdBZGRyZXNzIGxpbmUgNScsXG4gICAgYWRkcmVzczY6ICdBZGRyZXNzIGxpbmUgNicsXG4gICAgY2l0eTogJ0NpdHknLFxuICAgIGNpdHlWaWxsYWdlOiAnQ2l0eScsXG4gICAgY291bnRyeTogJ0NvdW50cnknLFxuICAgIGNvdW50eURpc3RyaWN0OiAnRGlzdHJpY3QnLFxuICAgIGRpc3RyaWN0OiAnRGlzdHJpY3QnLFxuICAgIHBvc3RhbENvZGU6ICdQb3N0YWwgY29kZScsXG4gICAgc3RhdGU6ICdTdGF0ZScsXG4gICAgc3RhdGVQcm92aW5jZTogJ1N0YXRlJ1xufTtcbmNvbnN0IHdvcmtzcGFjZVRyYW5zbGF0aW9ucyA9IHtcbiAgICBjbG9zZUFsbE9wZW5lZFdvcmtzcGFjZXM6ICdEaXNjYXJkIGNoYW5nZXMgaW4ge3tjb3VudH19IHdvcmtzcGFjZXMnLFxuICAgIGNsb3NpbmdBbGxXb3Jrc3BhY2VzUHJvbXB0Qm9keTogJ1RoZXJlIG1heSBiZSB1bnNhdmVkIGNoYW5nZXMgaW4gdGhlIGZvbGxvd2luZyB3b3Jrc3BhY2VzLiBEbyB5b3Ugd2FudCB0byBkaXNjYXJkIGNoYW5nZXMgaW4gdGhlIGZvbGxvd2luZyB3b3Jrc3BhY2VzPyB7e3dvcmtzcGFjZU5hbWVzfX0nLFxuICAgIGNsb3NpbmdBbGxXb3Jrc3BhY2VzUHJvbXB0VGl0bGU6ICdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMnLFxuICAgIGRpc2NhcmQ6ICdEaXNjYXJkJyxcbiAgICBoaWRlOiAnSGlkZScsXG4gICAgbWF4aW1pemU6ICdNYXhpbWl6ZScsXG4gICAgbWluaW1pemU6ICdNaW5pbWl6ZScsXG4gICAgb3BlbkFueXdheTogJ09wZW4gYW55d2F5JyxcbiAgICB1bnNhdmVkQ2hhbmdlc0luT3BlbmVkV29ya3NwYWNlOiAnWW91IG1heSBoYXZlIHVuc2F2ZWQgY2hhbmdlcyBpbiB0aGUgb3BlbmVkIHdvcmtzcGFjZS4gRG8geW91IHdhbnQgdG8gZGlzY2FyZCB0aGVzZSBjaGFuZ2VzPycsXG4gICAgdW5zYXZlZENoYW5nZXNJbldvcmtzcGFjZTogJ1RoZXJlIG1heSBiZSB1bnNhdmVkIGNoYW5nZXMgaW4gXCJ7e3dvcmtzcGFjZU5hbWV9fVwiLiBQbGVhc2Ugc2F2ZSB0aGVtIGJlZm9yZSBvcGVuaW5nIGFub3RoZXIgd29ya3NwYWNlLicsXG4gICAgdW5zYXZlZENoYW5nZXNUaXRsZVRleHQ6ICdVbnNhdmVkIGNoYW5nZXMnLFxuICAgIHdvcmtzcGFjZUhlYWRlcjogJ1dvcmtzcGFjZSBoZWFkZXInXG59O1xuY29uc3Qgd29ya3NwYWNlMlRyYW5zbGF0aW9ucyA9IHtcbiAgICBkaXNjYXJkVW5zYXZlZENoYW5nZXNQcm9tcHRCb2R5TXVsdGlwbGU6ICd7e2NvdW50fX0gd29ya3NwYWNlcyBoYXZlIHVuc2F2ZWQgY2hhbmdlcy4gQ2xvc2luZyB0aGVtIHdpbGwgZGlzY2FyZCB0aGUgY2hhbmdlczonLFxuICAgIGRpc2NhcmRVbnNhdmVkQ2hhbmdlc1Byb21wdEJvZHlTaW5nbGU6ICc8c3Ryb25nPnt7d29ya3NwYWNlVGl0bGV9fTwvc3Ryb25nPiBoYXMgdW5zYXZlZCBjaGFuZ2VzLiBDbG9zaW5nIGl0IHdpbGwgZGlzY2FyZCB0aGVtLicsXG4gICAgZGlzY2FyZFVuc2F2ZWRDaGFuZ2VzUHJvbXB0VGl0bGU6ICdEaXNjYXJkIHVuc2F2ZWQgY2hhbmdlcz8nLFxuICAgIGtlZXBFZGl0aW5nOiAnS2VlcCBlZGl0aW5nJ1xufTtcbmV4cG9ydCBjb25zdCBjb3JlVHJhbnNsYXRpb25zID0ge1xuICAgIC4uLmFkZHJlc3NGaWVsZHMsXG4gICAgLi4ud29ya3NwYWNlVHJhbnNsYXRpb25zLFxuICAgIC4uLndvcmtzcGFjZTJUcmFuc2xhdGlvbnMsXG4gICAgYWJub3JtYWxWYWx1ZTogJ0Fibm9ybWFsIHZhbHVlJyxcbiAgICBhY3Rpb25zOiAnQWN0aW9ucycsXG4gICAgYWN0aW9uYWJsZU5vdGlmaWNhdGlvbjogJ0FjdGlvbmFibGUgbm90aWZpY2F0aW9uJyxcbiAgICBhZGRyZXNzOiAnQWRkcmVzcycsXG4gICAgYWdlOiAnQWdlJyxcbiAgICBiYXRjaEFjdGlvbkl0ZW1TZWxlY3RlZDogJ3t7dG90YWxTZWxlY3RlZH19IGl0ZW0gc2VsZWN0ZWQnLFxuICAgIGJhdGNoQWN0aW9uc0l0ZW1zU2VsZWN0ZWQ6ICd7e3RvdGFsU2VsZWN0ZWR9fSBpdGVtcyBzZWxlY3RlZCcsXG4gICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICBjaGFuZ2U6ICdDaGFuZ2UnLFxuICAgIC8vIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbk5hbWUgY29uZmlnIHByb3BlcnR5XG4gICAgQ2xpbmljOiAnQ2xpbmljJyxcbiAgICBjbG9zZTogJ0Nsb3NlJyxcbiAgICBjbG9zZXNBY3Rpb25hYmxlTm90aWZpY2F0aW9uOiAnQ2xvc2UgYWN0aW9uYWJsZSBub3RpZmljYXRpb24nLFxuICAgIGNsb3NlU25hY2tiYXI6ICdDbG9zZSBzbmFja2JhcicsXG4gICAgY29uZmlybTogJ0NvbmZpcm0nLFxuICAgIGNvbnRhY3RBZG1pbmlzdHJhdG9ySWZJc3N1ZVBlcnNpc3RzOiAnQ29udGFjdCB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLicsXG4gICAgY29udGFjdERldGFpbHM6ICdDb250YWN0IGRldGFpbHMnLFxuICAgIGRlbGV0ZTogJ0RlbGV0ZScsXG4gICAgZGlzY2FyZENoYW5nZXM6ICdEaXNjYXJkIGNoYW5nZXMnLFxuICAgIGVkaXQ6ICdFZGl0JyxcbiAgICBlbXB0eVN0YXRlVGV4dDogJ1RoZXJlIGFyZSBubyB7e2Rpc3BsYXlUZXh0fX0gdG8gZGlzcGxheScsXG4gICAgZXJyb3I6ICdFcnJvcicsXG4gICAgZXJyb3JDb3B5OiAnU29ycnksIHRoZXJlIHdhcyBhIHByb2JsZW0gZGlzcGxheWluZyB0aGlzIGluZm9ybWF0aW9uLiBZb3UgY2FuIHRyeSB0byByZWxvYWQgdGhpcyBwYWdlLCBvciBjb250YWN0IHRoZSBzaXRlIGFkbWluaXN0cmF0b3IgYW5kIHF1b3RlIHRoZSBlcnJvciBjb2RlIGFib3ZlLicsXG4gICAgZXJyb3JMb2FkaW5nTG9naW5Mb2NhdGlvbnM6ICdVbmFibGUgdG8gbG9hZCBsb2dpbiBsb2NhdGlvbnMuIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdXBwb3J0IGlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLicsXG4gICAgZmVtYWxlOiAnRmVtYWxlJyxcbiAgICBsZWZ0TmF2aWdhdGlvbjogJ0xlZnQgbmF2aWdhdGlvbicsXG4gICAgbG9hZGluZzogJ0xvYWRpbmcnLFxuICAgIG1hbGU6ICdNYWxlJyxcbiAgICBub1Jlc3VsdHNUb0Rpc3BsYXk6ICdObyByZXN1bHRzIHRvIGRpc3BsYXknLFxuICAgIG5vdEF2YWlsYWJsZTogJ05vdCBhdmFpbGFibGUnLFxuICAgIG90aGVyOiAnT3RoZXInLFxuICAgIHBhZ2luYXRpb25JdGVtc0NvdW50OiAne3twYWdlSXRlbXNDb3VudH19IC8ge3t0b3RhbEl0ZW1zfX0gaXRlbXMnLFxuICAgIHBhZ2luYXRpb25PZlBhZ2VzOiAnb2Yge3tjb3VudH19IHBhZ2VzJyxcbiAgICBwYXRpZW50QXZhdGFyQWx0OiAnQXZhdGFyIGZvciB7e3BhdGllbnROYW1lfX0nLFxuICAgIHBhdGllbnRJZGVudGlmaWVyU3RpY2tlcjogJ1BhdGllbnQgaWRlbnRpZmllciBzdGlja2VyJyxcbiAgICBwYXRpZW50TGlzdHM6ICdQYXRpZW50IGxpc3RzJyxcbiAgICBwYXRpZW50UGhvdG9BbHQ6ICdQcm9maWxlIHBob3RvIG9mIHt7cGF0aWVudE5hbWV9fScsXG4gICAgcGF0aWVudFBob3RvUGxhY2Vob2xkZXI6ICdQaG90byBwbGFjZWhvbGRlciBmb3Ige3twYXRpZW50TmFtZX19JyxcbiAgICBwcmludDogJ1ByaW50JyxcbiAgICBwcmludEVycm9yOiAnUHJpbnQgZXJyb3InLFxuICAgIHByaW50RXJyb3JFeHBsYWluZXI6ICdBbiBlcnJvciBvY2N1cnJlZCBpbiB7e2Vycm9yTG9jYXRpb259fScsXG4gICAgcHJpbnRJZGVudGlmaWVyU3RpY2tlcjogJ1ByaW50IGlkZW50aWZpZXIgc3RpY2tlcicsXG4gICAgcHJpbnRpbmc6ICdQcmludGluZycsXG4gICAgcmVjb3JkTmV3RW50cnk6ICdSZWNvcmQge3tkaXNwbGF5VGV4dH19JyxcbiAgICByZWxhdGlvbnNoaXBzOiAnUmVsYXRpb25zaGlwcycsXG4gICAgcmVzZXRPdmVycmlkZXM6ICdSZXNldCBvdmVycmlkZXMnLFxuICAgIHNhdmU6ICdTYXZlJyxcbiAgICBzY3JpcHRMb2FkaW5nRmFpbGVkOiAnRXJyb3I6IFNjcmlwdCBmYWlsZWQgdG8gbG9hZCcsXG4gICAgc2NyaXB0TG9hZGluZ0Vycm9yOiAnRmFpbGVkIHRvIGxvYWQgb3ZlcnJpZGRlbiBzY3JpcHQgZnJvbSB7e3VybH19LiBQbGVhc2UgY2hlY2sgdGhhdCB0aGUgYnVuZGxlZCBzY3JpcHQgaXMgYXZhaWxhYmxlIGF0IHRoZSBleHBlY3RlZCBVUkwuIENsaWNrIHRoZSBidXR0b24gYmVsb3cgdG8gcmVzZXQgYWxsIGltcG9ydCBtYXAgb3ZlcnJpZGVzLicsXG4gICAgc2VhcmNoRm9yTG9jYXRpb246ICdTZWFyY2ggZm9yIGEgbG9jYXRpb24nLFxuICAgIHNlZUFsbDogJ1NlZSBhbGwnLFxuICAgIHNlZU1vcmVMaXN0czogJ1NlZSB7e2NvdW50fX0gbW9yZSBsaXN0cycsXG4gICAgc2VsZWN0QWxsOiAnU2VsZWN0IGFsbCcsXG4gICAgc2V4OiAnU2V4JyxcbiAgICBzaG93TGVzczogJ1Nob3cgbGVzcycsXG4gICAgc2hvd01vcmU6ICdTaG93IG1vcmUnLFxuICAgIHNuYWNrYmFyTm90aWZpY2F0aW9uOiAnU25hY2tiYXIgbm90aWZpY2F0aW9uJyxcbiAgICB0b2dnbGVEZXZUb29sczogJ1RvZ2dsZSBkZXYgdG9vbHMnLFxuICAgIHVua25vd246ICdVbmtub3duJyxcbiAgICB5ZWFyQWJicmV2aWF0aW9uOiAneXInLFxuICAgIHllYXJzQWJicmV2aWF0aW9uOiAneXJzJ1xufTtcbiJdLCJuYW1lcyI6WyJhZGRyZXNzRmllbGRzIiwid29ya3NwYWNlVHJhbnNsYXRpb25zIiwid29ya3NwYWNlMlRyYW5zbGF0aW9ucyIsImNvcmVUcmFuc2xhdGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW1DLEdBQUcsSUFBTUEsZ0JBQWdCO0lBQ3hELFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLE1BQU07SUFDTixhQUFhO0lBQ2IsU0FBUztJQUNULGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsWUFBWTtJQUNaLE9BQU87SUFDUCxlQUFlO0FBQ25CO0FBQ0EsSUFBTUMsd0JBQXdCO0lBQzFCLDBCQUEwQjtJQUMxQixnQ0FBZ0M7SUFDaEMsaUNBQWlDO0lBQ2pDLFNBQVM7SUFDVCxNQUFNO0lBQ04sVUFBVTtJQUNWLFVBQVU7SUFDVixZQUFZO0lBQ1osaUNBQWlDO0lBQ2pDLDJCQUEyQjtJQUMzQix5QkFBeUI7SUFDekIsaUJBQWlCO0FBQ3JCO0FBQ0EsSUFBTUMseUJBQXlCO0lBQzNCLHlDQUF5QztJQUN6Qyx1Q0FBdUM7SUFDdkMsa0NBQWtDO0lBQ2xDLGFBQWE7QUFDakI7QUFDTyxJQUFNQyxtQkFBbUIsd0NBQ3pCSCxlQUNBQyx1QkFDQUM7SUFDSCxlQUFlO0lBQ2YsU0FBUztJQUNULHdCQUF3QjtJQUN4QixTQUFTO0lBQ1QsS0FBSztJQUNMLHlCQUF5QjtJQUN6QiwyQkFBMkI7SUFDM0IsUUFBUTtJQUNSLFFBQVE7SUFDUiwyREFBMkQ7SUFDM0QsUUFBUTtJQUNSLE9BQU87SUFDUCw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLFNBQVM7SUFDVCxxQ0FBcUM7SUFDckMsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsV0FBVztJQUNYLDRCQUE0QjtJQUM1QixRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxNQUFNO0lBQ04sb0JBQW9CO0lBQ3BCLGNBQWM7SUFDZCxPQUFPO0lBQ1Asc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsMEJBQTBCO0lBQzFCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIseUJBQXlCO0lBQ3pCLE9BQU87SUFDUCxZQUFZO0lBQ1oscUJBQXFCO0lBQ3JCLHdCQUF3QjtJQUN4QixVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixjQUFjO0lBQ2QsV0FBVztJQUNYLEtBQUs7SUFDTCxVQUFVO0lBQ1YsVUFBVTtJQUNWLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsU0FBUztJQUNULGtCQUFrQjtJQUNsQixtQkFBbUI7R0FDckIifQ==\n//# sourceURL=webpack-internal:///../../framework/esm-translations/dist/translations.js\n\n}");
6229
6229
 
6230
6230
  },
6231
6231
  "../../framework/esm-utils/dist/age-helpers.js"(__unused_rspack___webpack_module__, __webpack_exports__, __webpack_require__) {