sdc_client 0.160.2 → 0.160.3
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.
package/dist/index.js
CHANGED
|
@@ -44,7 +44,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
44
44
|
\************************************************/
|
|
45
45
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
46
46
|
|
|
47
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Global: () => (/* binding */ Global),\n/* harmony export */ controllerFactory: () => (/* binding */ controllerFactory),\n/* harmony export */ controllerList: () => (/* binding */ controllerList),\n/* harmony export */ prepareRefreshProcess: () => (/* binding */ prepareRefreshProcess),\n/* harmony export */ resetChildren: () => (/* binding */ resetChildren),\n/* harmony export */ runControlFlowFunctions: () => (/* binding */ runControlFlowFunctions),\n/* harmony export */ runRefresh: () => (/* binding */ runRefresh),\n/* harmony export */ tagList: () => (/* binding */ tagList),\n/* harmony export */ updateEventAndTriggerOnRefresh: () => (/* binding */ updateEventAndTriggerOnRefresh)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n\n\n\n\n\n\n\nlet Global = [];\nlet controllerList = {};\n\nfunction tagList() {\n return Object.keys(controllerList);\n}\n\nfunction prepareMixins(superTagNameList, tagName) {\n superTagNameList = superTagNameList.concat(controllerList[tagName][1]);\n superTagNameList = superTagNameList.filter((value, index, self) => {\n return self.indexOf(value) === index;\n });\n let hasAdded = true;\n while (hasAdded) {\n hasAdded = false;\n for (let tag of superTagNameList) {\n for (let newTag of controllerList[tag][1]) {\n if (!superTagNameList.includes(newTag)) {\n superTagNameList.push(newTag);\n hasAdded = true;\n }\n }\n }\n }\n return superTagNameList;\n}\n\n/**\n * setParentController sets the parent controller as property: 'parentController'\n * to the child controller. Also, it adds the child controller to the property list:\n * 'parentController' to the parent controller\n *\n * @param {AbstractSDC} parentController - js controller instance, controller of the parent DOM of the controllers DOM\n * @param {AbstractSDC} controller - js controller instance\n * @return {AbstractSDC} - parentController\n */\nfunction setParentController(parentController, controller) {\n if (parentController) {\n let controllerName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(controller._tagName);\n if (!parentController._childController[controllerName]) {\n parentController._childController[controllerName] = [];\n }\n\n parentController._childController[controllerName].push(controller);\n }\n\n return (controller._parentController = parentController);\n}\n\n/**\n * resetChildren resets all children of a controller.\n *\n * @param {AbstractSDC} parentController\n */\nfunction resetChildren(parentController) {\n parentController._childController = {};\n parentController.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const $this = $(this);\n const cController = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this);\n // Direct children only: the closest controller around the child element is the parent.\n if (cController && (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this.parent()) === parentController) {\n setParentController(parentController, cController);\n }\n });\n}\n\n/**\n * controllerFactoryInstance it generates a controller instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * It handles the init parameter by the data values of the DOM.\n *\n * It handles the super extensions.\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n let mixinControllerClass = [];\n superTagNameList = prepareMixins(superTagNameList, tagName);\n for (let superTagName of superTagNameList) {\n mixinControllerClass.push(controllerList[superTagName][0]);\n }\n\n let controllerClass = controllerList[tagName][0];\n let controller = new ((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.agileAggregation)(\n controllerClass,\n ...mixinControllerClass,\n ))();\n controller._tagName = tagName;\n\n setParentController(parentController, controller);\n controller.$container = $element;\n (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_2__.runOnInitWithParameter)($element, controller);\n\n return controller;\n}\n\n/**\n * controllerFactory it either generates a controller or takes a globe instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * Remember Global controller can not have a super controller!\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactory(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n if (Global.includes(tagName)) {\n let gTagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(tagName);\n if (!window[gTagName]) {\n window[gTagName] = controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n }\n\n window[gTagName].$container = $element;\n return window[gTagName];\n }\n\n return controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n}\n\n/**\n * runControllerShow first runs onLoad and fill content for all sub\n * controller. Only if all the sub controller are loaded the willShow\n * control flow function gets called.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerShow(controller, $html) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html).then(function (args) {\n args = args || true;\n if (controller.willShow) {\n let loadPromiseOrContent = controller.willShow();\n if (loadPromiseOrContent instanceof Promise) {\n return loadPromiseOrContent.then(function () {\n return args;\n });\n }\n }\n\n return args;\n });\n}\n\n/**\n * runControllerLoad Calls the onLoad function of the controller.\n * This function is called before the HTML is set to the page.\n * The parameter is a list of children of the tag and the registered tag.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerLoad(controller) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.loadFilesFromController)(controller).then((html) => {\n if (!controller.onLoad || controller._onLoadDone) {\n return html;\n }\n\n controller._onLoadDone = true;\n let loadPromise = controller.onLoad(html);\n return (loadPromise || (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)()).then(() => {\n return html;\n });\n });\n}\n\n/**\n * runControlFlowFunctions runs the control flow functions:\n * 1. onLoad()\n * 2. fill content\n * 3. willShow(dom parameter)\n * 4. refresh()\n *\n * @param controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runControlFlowFunctions(controller, process) {\n const prom_controller = runControllerLoad(controller)\n .then(function ($html) {\n return runControllerShow(controller, $html);\n })\n .then(() => {\n return runRefresh(controller, process);\n })\n .catch(function ($html) {\n if (typeof $html === 'string' || $html instanceof $) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html);\n }\n throw $html;\n });\n\n if (controller.load_async) {\n return Promise.resolve();\n }\n\n return prom_controller;\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runRefresh(controller, process) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)(null, controller, process);\n}\n\nfunction getParentList(controller) {\n let controllerList = [];\n while (controller) {\n controllerList.unshift(controller);\n controller = controller._parentController;\n }\n return controllerList;\n}\n\n/**\n *\n * @param {Object} process - Process object containing the refresh process\n */\nfunction updateEventAndTriggerOnRefresh(process) {\n const parentList = getParentList(process.controller[0]);\n const controllerList = parentList.concat(process.controller.slice(1));\n\n for (let con of controllerList) {\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__.setControllerEvents)(con);\n con.onRefresh(process.controller[0]);\n }\n}\n\nfunction prepareRefreshProcess(refreshProcess, controller) {\n let isRunningProcess = Boolean(refreshProcess);\n\n if (!isRunningProcess) {\n refreshProcess = {\n uuids: new Set([controller._uuid]),\n controller: [controller],\n };\n } else if (!refreshProcess.uuids.has(controller._uuid)) {\n refreshProcess.uuids.add(controller._uuid);\n refreshProcess.controller.push(controller);\n }\n\n return { isRunningProcess, refreshProcess };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUl3QjtBQU9EOztBQUVrQztBQUNDO0FBQ25DOztBQUVoQjtBQUNBOztBQUVBO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUVBQWtCO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ087QUFDUDtBQUNBLDRCQUE0QiwwREFBZ0IsQ0FBQztBQUM3QztBQUNBLHdCQUF3QiwyREFBYTtBQUNyQztBQUNBLHVCQUF1QiwyREFBYTtBQUNwQztBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsZUFBZTtBQUMxQixZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLCtEQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSxzRUFBc0I7O0FBRXhCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLGVBQWU7QUFDMUIsWUFBWSxhQUFhO0FBQ3pCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUVBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0EsU0FBUyxzRUFBd0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBLFNBQVMscUVBQXVCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkJBQTJCLGtFQUFtQjtBQUM5QztBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGVBQWUsc0VBQXdCO0FBQ3ZDO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CO0FBQ087QUFDUCxTQUFTLHFEQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLElBQUksdUVBQW1CO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWCIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcz80MzgxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHByb21pc2VEdW1teUZhY3RvcnksXG4gIHRhZ05hbWVUb0NhbWVsQ2FzZSxcbiAgYWdpbGVBZ2dyZWdhdGlvbixcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBDT05UUk9MTEVSX0NMQVNTLFxuICBnZXRDb250cm9sbGVyLFxuICBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcixcbiAgcmVmcmVzaCxcbiAgcnVuQ29udHJvbGxlckZpbGxDb250ZW50LFxufSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuXG5pbXBvcnQgeyBydW5PbkluaXRXaXRoUGFyYW1ldGVyIH0gZnJvbSBcIi4vc2RjX3BhcmFtcy5qc1wiO1xuaW1wb3J0IHsgc2V0Q29udHJvbGxlckV2ZW50cyB9IGZyb20gXCIuL3NkY19kb21fZXZlbnRzLmpzXCI7XG5pbXBvcnQgXCIuL3NkY19tYWluLmpzXCI7XG5cbmV4cG9ydCBsZXQgR2xvYmFsID0gW107XG5leHBvcnQgbGV0IGNvbnRyb2xsZXJMaXN0ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdMaXN0KCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29udHJvbGxlckxpc3QpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTWl4aW5zKHN1cGVyVGFnTmFtZUxpc3QsIHRhZ05hbWUpIHtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHN1cGVyVGFnTmFtZUxpc3QuY29uY2F0KGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdWzFdKTtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHN1cGVyVGFnTmFtZUxpc3QuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHtcbiAgICByZXR1cm4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXg7XG4gIH0pO1xuICBsZXQgaGFzQWRkZWQgPSB0cnVlO1xuICB3aGlsZSAoaGFzQWRkZWQpIHtcbiAgICBoYXNBZGRlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHRhZyBvZiBzdXBlclRhZ05hbWVMaXN0KSB7XG4gICAgICBmb3IgKGxldCBuZXdUYWcgb2YgY29udHJvbGxlckxpc3RbdGFnXVsxXSkge1xuICAgICAgICBpZiAoIXN1cGVyVGFnTmFtZUxpc3QuaW5jbHVkZXMobmV3VGFnKSkge1xuICAgICAgICAgIHN1cGVyVGFnTmFtZUxpc3QucHVzaChuZXdUYWcpO1xuICAgICAgICAgIGhhc0FkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3VwZXJUYWdOYW1lTGlzdDtcbn1cblxuLyoqXG4gKiBzZXRQYXJlbnRDb250cm9sbGVyIHNldHMgdGhlIHBhcmVudCBjb250cm9sbGVyIGFzIHByb3BlcnR5OiAncGFyZW50Q29udHJvbGxlcidcbiAqIHRvIHRoZSBjaGlsZCBjb250cm9sbGVyLiBBbHNvLCBpdCBhZGRzIHRoZSBjaGlsZCBjb250cm9sbGVyIHRvIHRoZSBwcm9wZXJ0eSBsaXN0OlxuICogJ3BhcmVudENvbnRyb2xsZXInIHRvIHRoZSBwYXJlbnQgY29udHJvbGxlclxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlLCBjb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgRE9NIG9mIHRoZSBjb250cm9sbGVycyBET01cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSBwYXJlbnRDb250cm9sbGVyXG4gKi9cbmZ1bmN0aW9uIHNldFBhcmVudENvbnRyb2xsZXIocGFyZW50Q29udHJvbGxlciwgY29udHJvbGxlcikge1xuICBpZiAocGFyZW50Q29udHJvbGxlcikge1xuICAgIGxldCBjb250cm9sbGVyTmFtZSA9IHRhZ05hbWVUb0NhbWVsQ2FzZShjb250cm9sbGVyLl90YWdOYW1lKTtcbiAgICBpZiAoIXBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0pIHtcbiAgICAgIHBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXJbY29udHJvbGxlck5hbWVdLnB1c2goY29udHJvbGxlcik7XG4gIH1cblxuICByZXR1cm4gKGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXIgPSBwYXJlbnRDb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKiByZXNldENoaWxkcmVuIHJlc2V0cyBhbGwgY2hpbGRyZW4gb2YgYSBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q2hpbGRyZW4ocGFyZW50Q29udHJvbGxlcikge1xuICBwYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXIgPSB7fTtcbiAgcGFyZW50Q29udHJvbGxlci5maW5kKGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0ICR0aGlzID0gJCh0aGlzKTtcbiAgICBjb25zdCBjQ29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJHRoaXMpO1xuICAgIC8vIERpcmVjdCBjaGlsZHJlbiBvbmx5OiB0aGUgY2xvc2VzdCBjb250cm9sbGVyIGFyb3VuZCB0aGUgY2hpbGQgZWxlbWVudCBpcyB0aGUgcGFyZW50LlxuICAgIGlmIChjQ29udHJvbGxlciAmJiBnZXRDb250cm9sbGVyKCR0aGlzLnBhcmVudCgpKSA9PT0gcGFyZW50Q29udHJvbGxlcikge1xuICAgICAgc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjQ29udHJvbGxlcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlIGl0IGdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIGRlcGVuZGluZyBpZiB0aGUgY29udHJvbGxlciBpcyByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIGNvbnRyb2xsZXIuIEl0IHNldHMgdGhlXG4gKiAkY29udGFpbmVyIG9iamVjdCB0byB0aGUgalF1ZXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWcuXG4gKlxuICogSXQgaGFuZGxlcyB0aGUgaW5pdCBwYXJhbWV0ZXIgYnkgdGhlIGRhdGEgdmFsdWVzIG9mIHRoZSBET00uXG4gKlxuICogSXQgaGFuZGxlcyB0aGUgc3VwZXIgZXh0ZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gQ29udHJvbGxlciBvZiB0aGUgcGFyZW50IERPTVxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50IC0gVGhlIGN1cnJlbnQgRE9NIGpRdWVyeVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0aGUgcmVnaXN0ZXJlZCB0YWcgbmFtZSBvZiB0aGUgY3VycmVudCBET01cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdCAtIHRhZyBuYW1lcyBvZiBzdXBlciBjb250cm9sbGVyXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSAgbmV3IENvbnRyb2xsZXJcbiAqL1xuZnVuY3Rpb24gY29udHJvbGxlckZhY3RvcnlJbnN0YW5jZShcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgJGVsZW1lbnQsXG4gIHRhZ05hbWUsXG4gIHN1cGVyVGFnTmFtZUxpc3QsXG4pIHtcbiAgbGV0IG1peGluQ29udHJvbGxlckNsYXNzID0gW107XG4gIHN1cGVyVGFnTmFtZUxpc3QgPSBwcmVwYXJlTWl4aW5zKHN1cGVyVGFnTmFtZUxpc3QsIHRhZ05hbWUpO1xuICBmb3IgKGxldCBzdXBlclRhZ05hbWUgb2Ygc3VwZXJUYWdOYW1lTGlzdCkge1xuICAgIG1peGluQ29udHJvbGxlckNsYXNzLnB1c2goY29udHJvbGxlckxpc3Rbc3VwZXJUYWdOYW1lXVswXSk7XG4gIH1cblxuICBsZXQgY29udHJvbGxlckNsYXNzID0gY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMF07XG4gIGxldCBjb250cm9sbGVyID0gbmV3IChhZ2lsZUFnZ3JlZ2F0aW9uKFxuICAgIGNvbnRyb2xsZXJDbGFzcyxcbiAgICAuLi5taXhpbkNvbnRyb2xsZXJDbGFzcyxcbiAgKSkoKTtcbiAgY29udHJvbGxlci5fdGFnTmFtZSA9IHRhZ05hbWU7XG5cbiAgc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjb250cm9sbGVyKTtcbiAgY29udHJvbGxlci4kY29udGFpbmVyID0gJGVsZW1lbnQ7XG4gIHJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIoJGVsZW1lbnQsIGNvbnRyb2xsZXIpO1xuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIGNvbnRyb2xsZXJGYWN0b3J5IGl0IGVpdGhlciBnZW5lcmF0ZXMgYSBjb250cm9sbGVyIG9yIHRha2VzIGEgZ2xvYmUgaW5zdGFuY2VcbiAqIGRlcGVuZGluZyBpZiB0aGUgY29udHJvbGxlciBpcyByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIGNvbnRyb2xsZXIuIEl0IHNldHMgdGhlXG4gKiAkY29udGFpbmVyIG9iamVjdCB0byB0aGUgalF1ZXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWcuXG4gKlxuICogUmVtZW1iZXIgR2xvYmFsIGNvbnRyb2xsZXIgY2FuIG5vdCBoYXZlIGEgc3VwZXIgY29udHJvbGxlciFcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gQ29udHJvbGxlciBvZiB0aGUgcGFyZW50IERPTVxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50IC0gVGhlIGN1cnJlbnQgRE9NIGpRdWVyeVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0aGUgcmVnaXN0ZXJlZCB0YWcgbmFtZSBvZiB0aGUgY3VycmVudCBET01cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdCAtIHRhZyBuYW1lcyBvZiBzdXBlciBjb250cm9sbGVyXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSAgbmV3IENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJGYWN0b3J5KFxuICBwYXJlbnRDb250cm9sbGVyLFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbikge1xuICBpZiAoR2xvYmFsLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgbGV0IGdUYWdOYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKHRhZ05hbWUpO1xuICAgIGlmICghd2luZG93W2dUYWdOYW1lXSkge1xuICAgICAgd2luZG93W2dUYWdOYW1lXSA9IGNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UoXG4gICAgICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgICAgICRlbGVtZW50LFxuICAgICAgICB0YWdOYW1lLFxuICAgICAgICBzdXBlclRhZ05hbWVMaXN0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB3aW5kb3dbZ1RhZ05hbWVdLiRjb250YWluZXIgPSAkZWxlbWVudDtcbiAgICByZXR1cm4gd2luZG93W2dUYWdOYW1lXTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlKFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgJGVsZW1lbnQsXG4gICAgdGFnTmFtZSxcbiAgICBzdXBlclRhZ05hbWVMaXN0LFxuICApO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJTaG93IGZpcnN0IHJ1bnMgb25Mb2FkIGFuZCBmaWxsIGNvbnRlbnQgZm9yIGFsbCBzdWJcbiAqIGNvbnRyb2xsZXIuIE9ubHkgaWYgYWxsIHRoZSBzdWIgY29udHJvbGxlciBhcmUgbG9hZGVkIHRoZSB3aWxsU2hvd1xuICogY29udHJvbCBmbG93IGZ1bmN0aW9uIGdldHMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Kj59IC0gcmV0dXJuIG9mIHRoZSBvbkxvYWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcnVuQ29udHJvbGxlclNob3coY29udHJvbGxlciwgJGh0bWwpIHtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCkudGhlbihmdW5jdGlvbiAoYXJncykge1xuICAgIGFyZ3MgPSBhcmdzIHx8IHRydWU7XG4gICAgaWYgKGNvbnRyb2xsZXIud2lsbFNob3cpIHtcbiAgICAgIGxldCBsb2FkUHJvbWlzZU9yQ29udGVudCA9IGNvbnRyb2xsZXIud2lsbFNob3coKTtcbiAgICAgIGlmIChsb2FkUHJvbWlzZU9yQ29udGVudCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQcm9taXNlT3JDb250ZW50LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbiAgfSk7XG59XG5cbi8qKlxuICogcnVuQ29udHJvbGxlckxvYWQgQ2FsbHMgdGhlIG9uTG9hZCBmdW5jdGlvbiBvZiB0aGUgY29udHJvbGxlci5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgSFRNTCBpcyBzZXQgdG8gdGhlIHBhZ2UuXG4gKiBUaGUgcGFyYW1ldGVyIGlzIGEgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgdGFnIGFuZCB0aGUgcmVnaXN0ZXJlZCB0YWcuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8Kj59IC0gcmV0dXJuIG9mIHRoZSBvbkxvYWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcnVuQ29udHJvbGxlckxvYWQoY29udHJvbGxlcikge1xuICByZXR1cm4gbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlcikudGhlbigoaHRtbCkgPT4ge1xuICAgIGlmICghY29udHJvbGxlci5vbkxvYWQgfHwgY29udHJvbGxlci5fb25Mb2FkRG9uZSkge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgY29udHJvbGxlci5fb25Mb2FkRG9uZSA9IHRydWU7XG4gICAgbGV0IGxvYWRQcm9taXNlID0gY29udHJvbGxlci5vbkxvYWQoaHRtbCk7XG4gICAgcmV0dXJuIChsb2FkUHJvbWlzZSB8fCBwcm9taXNlRHVtbXlGYWN0b3J5KCkpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zIHJ1bnMgdGhlIGNvbnRyb2wgZmxvdyBmdW5jdGlvbnM6XG4gKiAxLiBvbkxvYWQoKVxuICogMi4gZmlsbCBjb250ZW50XG4gKiAzLiB3aWxsU2hvdyhkb20gcGFyYW1ldGVyKVxuICogNC4gcmVmcmVzaCgpXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHByb21fY29udHJvbGxlciA9IHJ1bkNvbnRyb2xsZXJMb2FkKGNvbnRyb2xsZXIpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICByZXR1cm4gcnVuQ29udHJvbGxlclNob3coY29udHJvbGxlciwgJGh0bWwpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHJ1blJlZnJlc2goY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICBpZiAodHlwZW9mICRodG1sID09PSAnc3RyaW5nJyB8fCAkaHRtbCBpbnN0YW5jZW9mICQpIHtcbiAgICAgICAgcmV0dXJuIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCk7XG4gICAgICB9XG4gICAgICB0aHJvdyAkaHRtbDtcbiAgICB9KTtcblxuICBpZiAoY29udHJvbGxlci5sb2FkX2FzeW5jKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgcmV0dXJuIHByb21fY29udHJvbGxlcjtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blJlZnJlc2goY29udHJvbGxlciwgcHJvY2Vzcykge1xuICByZXR1cm4gcmVmcmVzaChudWxsLCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50TGlzdChjb250cm9sbGVyKSB7XG4gIGxldCBjb250cm9sbGVyTGlzdCA9IFtdO1xuICB3aGlsZSAoY29udHJvbGxlcikge1xuICAgIGNvbnRyb2xsZXJMaXN0LnVuc2hpZnQoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlciA9IGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXI7XG4gIH1cbiAgcmV0dXJuIGNvbnRyb2xsZXJMaXN0O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHByb2Nlc3MpIHtcbiAgY29uc3QgcGFyZW50TGlzdCA9IGdldFBhcmVudExpc3QocHJvY2Vzcy5jb250cm9sbGVyWzBdKTtcbiAgY29uc3QgY29udHJvbGxlckxpc3QgPSBwYXJlbnRMaXN0LmNvbmNhdChwcm9jZXNzLmNvbnRyb2xsZXIuc2xpY2UoMSkpO1xuXG4gIGZvciAobGV0IGNvbiBvZiBjb250cm9sbGVyTGlzdCkge1xuICAgIHNldENvbnRyb2xsZXJFdmVudHMoY29uKTtcbiAgICBjb24ub25SZWZyZXNoKHByb2Nlc3MuY29udHJvbGxlclswXSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVSZWZyZXNoUHJvY2VzcyhyZWZyZXNoUHJvY2VzcywgY29udHJvbGxlcikge1xuICBsZXQgaXNSdW5uaW5nUHJvY2VzcyA9IEJvb2xlYW4ocmVmcmVzaFByb2Nlc3MpO1xuXG4gIGlmICghaXNSdW5uaW5nUHJvY2Vzcykge1xuICAgIHJlZnJlc2hQcm9jZXNzID0ge1xuICAgICAgdXVpZHM6IG5ldyBTZXQoW2NvbnRyb2xsZXIuX3V1aWRdKSxcbiAgICAgIGNvbnRyb2xsZXI6IFtjb250cm9sbGVyXSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKCFyZWZyZXNoUHJvY2Vzcy51dWlkcy5oYXMoY29udHJvbGxlci5fdXVpZCkpIHtcbiAgICByZWZyZXNoUHJvY2Vzcy51dWlkcy5hZGQoY29udHJvbGxlci5fdXVpZCk7XG4gICAgcmVmcmVzaFByb2Nlc3MuY29udHJvbGxlci5wdXNoKGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgcmV0dXJuIHsgaXNSdW5uaW5nUHJvY2VzcywgcmVmcmVzaFByb2Nlc3MgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_controller.js\n\n}");
|
|
47
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Global: () => (/* binding */ Global),\n/* harmony export */ controllerFactory: () => (/* binding */ controllerFactory),\n/* harmony export */ controllerList: () => (/* binding */ controllerList),\n/* harmony export */ prepareRefreshProcess: () => (/* binding */ prepareRefreshProcess),\n/* harmony export */ resetChildren: () => (/* binding */ resetChildren),\n/* harmony export */ runControlFlowFunctions: () => (/* binding */ runControlFlowFunctions),\n/* harmony export */ runRefresh: () => (/* binding */ runRefresh),\n/* harmony export */ tagList: () => (/* binding */ tagList),\n/* harmony export */ updateEventAndTriggerOnRefresh: () => (/* binding */ updateEventAndTriggerOnRefresh)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n\n\n\n\n\n\n\n\nlet Global = [];\nlet controllerList = {};\n\nfunction tagList() {\n return Object.keys(controllerList);\n}\n\nfunction prepareMixins(superTagNameList, tagName) {\n superTagNameList = superTagNameList.concat(controllerList[tagName][1]);\n superTagNameList = superTagNameList.filter((value, index, self) => {\n return self.indexOf(value) === index;\n });\n let hasAdded = true;\n while (hasAdded) {\n hasAdded = false;\n for (let tag of superTagNameList) {\n for (let newTag of controllerList[tag][1]) {\n if (!superTagNameList.includes(newTag)) {\n superTagNameList.push(newTag);\n hasAdded = true;\n }\n }\n }\n }\n return superTagNameList;\n}\n\n/**\n * setParentController sets the parent controller as property: 'parentController'\n * to the child controller. Also, it adds the child controller to the property list:\n * 'parentController' to the parent controller\n *\n * @param {AbstractSDC} parentController - js controller instance, controller of the parent DOM of the controllers DOM\n * @param {AbstractSDC} controller - js controller instance\n * @return {AbstractSDC} - parentController\n */\nfunction setParentController(parentController, controller) {\n if (parentController) {\n let controllerName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(controller._tagName);\n if (!parentController._childController[controllerName]) {\n parentController._childController[controllerName] = [];\n }\n\n parentController._childController[controllerName].push(controller);\n }\n\n return (controller._parentController = parentController);\n}\n\n/**\n * resetChildren resets all children of a controller.\n *\n * @param {AbstractSDC} parentController\n */\nfunction resetChildren(parentController) {\n parentController._childController = {};\n parentController.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const $this = $(this);\n const cController = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this);\n // Direct children only: the closest controller around the child element is the parent.\n if (cController && (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this.parent()) === parentController) {\n setParentController(parentController, cController);\n }\n });\n}\n\n/**\n * controllerFactoryInstance it generates a controller instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * It handles the init parameter by the data values of the DOM.\n *\n * It handles the super extensions.\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n let mixinControllerClass = [];\n superTagNameList = prepareMixins(superTagNameList, tagName);\n for (let superTagName of superTagNameList) {\n mixinControllerClass.push(controllerList[superTagName][0]);\n }\n\n let controllerClass = controllerList[tagName][0];\n let controller = new ((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.agileAggregation)(\n controllerClass,\n ...mixinControllerClass,\n ))();\n controller._tagName = tagName;\n\n setParentController(parentController, controller);\n controller.$container = $element;\n (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_3__.runOnInitWithParameter)($element, controller);\n\n return controller;\n}\n\n/**\n * controllerFactory it either generates a controller or takes a globe instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * Remember Global controller can not have a super controller!\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactory(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n if (Global.includes(tagName)) {\n let gTagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(tagName);\n if (!window[gTagName]) {\n window[gTagName] = controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n }\n\n window[gTagName].$container = $element;\n return window[gTagName];\n }\n\n return controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n}\n\n/**\n * runControllerShow first runs onLoad and fill content for all sub\n * controller. Only if all the sub controller are loaded the willShow\n * control flow function gets called.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerShow(controller, $html) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html).then(function (args) {\n args = args || true;\n if (controller.willShow) {\n let loadPromiseOrContent = controller.willShow();\n if (loadPromiseOrContent instanceof Promise) {\n return loadPromiseOrContent.then(function () {\n return args;\n });\n }\n }\n\n return args;\n });\n}\n\n/**\n * runControllerLoad Calls the onLoad function of the controller.\n * This function is called before the HTML is set to the page.\n * The parameter is a list of children of the tag and the registered tag.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerLoad(controller) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.loadFilesFromController)(controller).then((html) => {\n if (html === _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.VIEW_REDIRECT) return html;\n if (!controller.onLoad || controller._onLoadDone) {\n return html;\n }\n\n controller._onLoadDone = true;\n let loadPromise = controller.onLoad(html);\n return (loadPromise || (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)()).then(() => {\n return html;\n });\n });\n}\n\n/**\n * runControlFlowFunctions runs the control flow functions:\n * 1. onLoad()\n * 2. fill content\n * 3. willShow(dom parameter)\n * 4. refresh()\n *\n * @param controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runControlFlowFunctions(controller, process) {\n const prom_controller = runControllerLoad(controller)\n .then(function ($html) {\n if ($html === _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.VIEW_REDIRECT) {\n if (typeof controller.confirmPageLoaded === \"function\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_2__.trigger)(\"navLoaded\", controller);\n }\n return _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.VIEW_REDIRECT;\n }\n return runControllerShow(controller, $html);\n })\n .then((result) => {\n if (result === _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.VIEW_REDIRECT) return;\n return runRefresh(controller, process);\n })\n .catch(function ($html) {\n if (typeof $html === 'string' || $html instanceof $) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html);\n }\n throw $html;\n });\n\n if (controller.load_async) {\n return Promise.resolve();\n }\n\n return prom_controller;\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runRefresh(controller, process) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)(null, controller, process);\n}\n\nfunction getParentList(controller) {\n let controllerList = [];\n while (controller) {\n controllerList.unshift(controller);\n controller = controller._parentController;\n }\n return controllerList;\n}\n\n/**\n *\n * @param {Object} process - Process object containing the refresh process\n */\nfunction updateEventAndTriggerOnRefresh(process) {\n const parentList = getParentList(process.controller[0]);\n const controllerList = parentList.concat(process.controller.slice(1));\n\n for (let con of controllerList) {\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.setControllerEvents)(con);\n con.onRefresh(process.controller[0]);\n }\n}\n\nfunction prepareRefreshProcess(refreshProcess, controller) {\n let isRunningProcess = Boolean(refreshProcess);\n\n if (!isRunningProcess) {\n refreshProcess = {\n uuids: new Set([controller._uuid]),\n controller: [controller],\n };\n } else if (!refreshProcess.uuids.has(controller._uuid)) {\n refreshProcess.uuids.add(controller._uuid);\n refreshProcess.controller.push(controller);\n }\n\n return { isRunningProcess, refreshProcess };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJd0I7QUFRRDtBQUNtQjs7QUFFZTtBQUNDO0FBQ25DOztBQUVoQjtBQUNBOztBQUVBO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUVBQWtCO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ087QUFDUDtBQUNBLDRCQUE0QiwwREFBZ0IsQ0FBQztBQUM3QztBQUNBLHdCQUF3QiwyREFBYTtBQUNyQztBQUNBLHVCQUF1QiwyREFBYTtBQUNwQztBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsZUFBZTtBQUMxQixZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLCtEQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSxzRUFBc0I7O0FBRXhCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLGVBQWU7QUFDMUIsWUFBWSxhQUFhO0FBQ3pCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUVBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0EsU0FBUyxzRUFBd0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBLFNBQVMscUVBQXVCO0FBQ2hDLGlCQUFpQix1REFBYTtBQUM5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQixrRUFBbUI7QUFDOUM7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDTztBQUNQO0FBQ0E7QUFDQSxvQkFBb0IsdURBQWE7QUFDakM7QUFDQSxVQUFVLHVEQUFPO0FBQ2pCO0FBQ0EsZUFBZSx1REFBYTtBQUM1QjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EscUJBQXFCLHVEQUFhO0FBQ2xDO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxlQUFlLHNFQUF3QjtBQUN2QztBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1AsU0FBUyxxREFBTztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxJQUFJLHVFQUFtQjtBQUN2QjtBQUNBO0FBQ0E7O0FBRU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX2NvbnRyb2xsZXIuanM/NDM4MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBwcm9taXNlRHVtbXlGYWN0b3J5LFxuICB0YWdOYW1lVG9DYW1lbENhc2UsXG4gIGFnaWxlQWdncmVnYXRpb24sXG59IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHtcbiAgQ09OVFJPTExFUl9DTEFTUyxcbiAgZ2V0Q29udHJvbGxlcixcbiAgbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIsXG4gIHJlZnJlc2gsXG4gIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCxcbiAgVklFV19SRURJUkVDVCxcbn0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcbmltcG9ydCB7IHRyaWdnZXIgfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5cbmltcG9ydCB7IHJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIgfSBmcm9tIFwiLi9zZGNfcGFyYW1zLmpzXCI7XG5pbXBvcnQgeyBzZXRDb250cm9sbGVyRXZlbnRzIH0gZnJvbSBcIi4vc2RjX2RvbV9ldmVudHMuanNcIjtcbmltcG9ydCBcIi4vc2RjX21haW4uanNcIjtcblxuZXhwb3J0IGxldCBHbG9iYWwgPSBbXTtcbmV4cG9ydCBsZXQgY29udHJvbGxlckxpc3QgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhZ0xpc3QoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cm9sbGVyTGlzdCk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVNaXhpbnMoc3VwZXJUYWdOYW1lTGlzdCwgdGFnTmFtZSkge1xuICBzdXBlclRhZ05hbWVMaXN0ID0gc3VwZXJUYWdOYW1lTGlzdC5jb25jYXQoY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMV0pO1xuICBzdXBlclRhZ05hbWVMaXN0ID0gc3VwZXJUYWdOYW1lTGlzdC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4ge1xuICAgIHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDtcbiAgfSk7XG4gIGxldCBoYXNBZGRlZCA9IHRydWU7XG4gIHdoaWxlIChoYXNBZGRlZCkge1xuICAgIGhhc0FkZGVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgdGFnIG9mIHN1cGVyVGFnTmFtZUxpc3QpIHtcbiAgICAgIGZvciAobGV0IG5ld1RhZyBvZiBjb250cm9sbGVyTGlzdFt0YWddWzFdKSB7XG4gICAgICAgIGlmICghc3VwZXJUYWdOYW1lTGlzdC5pbmNsdWRlcyhuZXdUYWcpKSB7XG4gICAgICAgICAgc3VwZXJUYWdOYW1lTGlzdC5wdXNoKG5ld1RhZyk7XG4gICAgICAgICAgaGFzQWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdXBlclRhZ05hbWVMaXN0O1xufVxuXG4vKipcbiAqIHNldFBhcmVudENvbnRyb2xsZXIgc2V0cyB0aGUgcGFyZW50IGNvbnRyb2xsZXIgYXMgcHJvcGVydHk6ICdwYXJlbnRDb250cm9sbGVyJ1xuICogdG8gdGhlIGNoaWxkIGNvbnRyb2xsZXIuIEFsc28sIGl0IGFkZHMgdGhlIGNoaWxkIGNvbnRyb2xsZXIgdG8gdGhlIHByb3BlcnR5IGxpc3Q6XG4gKiAncGFyZW50Q29udHJvbGxlcicgdG8gdGhlIHBhcmVudCBjb250cm9sbGVyXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2UsIGNvbnRyb2xsZXIgb2YgdGhlIHBhcmVudCBET00gb2YgdGhlIGNvbnRyb2xsZXJzIERPTVxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfSAtIHBhcmVudENvbnRyb2xsZXJcbiAqL1xuZnVuY3Rpb24gc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjb250cm9sbGVyKSB7XG4gIGlmIChwYXJlbnRDb250cm9sbGVyKSB7XG4gICAgbGV0IGNvbnRyb2xsZXJOYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKGNvbnRyb2xsZXIuX3RhZ05hbWUpO1xuICAgIGlmICghcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NvbnRyb2xsZXJOYW1lXSkge1xuICAgICAgcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NvbnRyb2xsZXJOYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIHBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0ucHVzaChjb250cm9sbGVyKTtcbiAgfVxuXG4gIHJldHVybiAoY29udHJvbGxlci5fcGFyZW50Q29udHJvbGxlciA9IHBhcmVudENvbnRyb2xsZXIpO1xufVxuXG4vKipcbiAqIHJlc2V0Q2hpbGRyZW4gcmVzZXRzIGFsbCBjaGlsZHJlbiBvZiBhIGNvbnRyb2xsZXIuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDaGlsZHJlbihwYXJlbnRDb250cm9sbGVyKSB7XG4gIHBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlciA9IHt9O1xuICBwYXJlbnRDb250cm9sbGVyLmZpbmQoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgIGNvbnN0IGNDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkdGhpcyk7XG4gICAgLy8gRGlyZWN0IGNoaWxkcmVuIG9ubHk6IHRoZSBjbG9zZXN0IGNvbnRyb2xsZXIgYXJvdW5kIHRoZSBjaGlsZCBlbGVtZW50IGlzIHRoZSBwYXJlbnQuXG4gICAgaWYgKGNDb250cm9sbGVyICYmIGdldENvbnRyb2xsZXIoJHRoaXMucGFyZW50KCkpID09PSBwYXJlbnRDb250cm9sbGVyKSB7XG4gICAgICBzZXRQYXJlbnRDb250cm9sbGVyKHBhcmVudENvbnRyb2xsZXIsIGNDb250cm9sbGVyKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIGNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UgaXQgZ2VuZXJhdGVzIGEgY29udHJvbGxlciBpbnN0YW5jZVxuICogZGVwZW5kaW5nIGlmIHRoZSBjb250cm9sbGVyIGlzIHJlZ2lzdGVyZWQgYXMgYSBnbG9iYWwgY29udHJvbGxlci4gSXQgc2V0cyB0aGVcbiAqICRjb250YWluZXIgb2JqZWN0IHRvIHRoZSBqUXVlcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhZy5cbiAqXG4gKiBJdCBoYW5kbGVzIHRoZSBpbml0IHBhcmFtZXRlciBieSB0aGUgZGF0YSB2YWx1ZXMgb2YgdGhlIERPTS5cbiAqXG4gKiBJdCBoYW5kbGVzIHRoZSBzdXBlciBleHRlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBDb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgRE9NXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1lbnQgLSBUaGUgY3VycmVudCBET00galF1ZXJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSAtIHRoZSByZWdpc3RlcmVkIHRhZyBuYW1lIG9mIHRoZSBjdXJyZW50IERPTVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0IC0gdGFnIG5hbWVzIG9mIHN1cGVyIGNvbnRyb2xsZXJcbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfSAtICBuZXcgQ29udHJvbGxlclxuICovXG5mdW5jdGlvbiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlKFxuICBwYXJlbnRDb250cm9sbGVyLFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbikge1xuICBsZXQgbWl4aW5Db250cm9sbGVyQ2xhc3MgPSBbXTtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHByZXBhcmVNaXhpbnMoc3VwZXJUYWdOYW1lTGlzdCwgdGFnTmFtZSk7XG4gIGZvciAobGV0IHN1cGVyVGFnTmFtZSBvZiBzdXBlclRhZ05hbWVMaXN0KSB7XG4gICAgbWl4aW5Db250cm9sbGVyQ2xhc3MucHVzaChjb250cm9sbGVyTGlzdFtzdXBlclRhZ05hbWVdWzBdKTtcbiAgfVxuXG4gIGxldCBjb250cm9sbGVyQ2xhc3MgPSBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVswXTtcbiAgbGV0IGNvbnRyb2xsZXIgPSBuZXcgKGFnaWxlQWdncmVnYXRpb24oXG4gICAgY29udHJvbGxlckNsYXNzLFxuICAgIC4uLm1peGluQ29udHJvbGxlckNsYXNzLFxuICApKSgpO1xuICBjb250cm9sbGVyLl90YWdOYW1lID0gdGFnTmFtZTtcblxuICBzZXRQYXJlbnRDb250cm9sbGVyKHBhcmVudENvbnRyb2xsZXIsIGNvbnRyb2xsZXIpO1xuICBjb250cm9sbGVyLiRjb250YWluZXIgPSAkZWxlbWVudDtcbiAgcnVuT25Jbml0V2l0aFBhcmFtZXRlcigkZWxlbWVudCwgY29udHJvbGxlcik7XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogY29udHJvbGxlckZhY3RvcnkgaXQgZWl0aGVyIGdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgb3IgdGFrZXMgYSBnbG9iZSBpbnN0YW5jZVxuICogZGVwZW5kaW5nIGlmIHRoZSBjb250cm9sbGVyIGlzIHJlZ2lzdGVyZWQgYXMgYSBnbG9iYWwgY29udHJvbGxlci4gSXQgc2V0cyB0aGVcbiAqICRjb250YWluZXIgb2JqZWN0IHRvIHRoZSBqUXVlcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhZy5cbiAqXG4gKiBSZW1lbWJlciBHbG9iYWwgY29udHJvbGxlciBjYW4gbm90IGhhdmUgYSBzdXBlciBjb250cm9sbGVyIVxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBDb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgRE9NXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1lbnQgLSBUaGUgY3VycmVudCBET00galF1ZXJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSAtIHRoZSByZWdpc3RlcmVkIHRhZyBuYW1lIG9mIHRoZSBjdXJyZW50IERPTVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0IC0gdGFnIG5hbWVzIG9mIHN1cGVyIGNvbnRyb2xsZXJcbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfSAtICBuZXcgQ29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckZhY3RvcnkoXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gICRlbGVtZW50LFxuICB0YWdOYW1lLFxuICBzdXBlclRhZ05hbWVMaXN0LFxuKSB7XG4gIGlmIChHbG9iYWwuaW5jbHVkZXModGFnTmFtZSkpIHtcbiAgICBsZXQgZ1RhZ05hbWUgPSB0YWdOYW1lVG9DYW1lbENhc2UodGFnTmFtZSk7XG4gICAgaWYgKCF3aW5kb3dbZ1RhZ05hbWVdKSB7XG4gICAgICB3aW5kb3dbZ1RhZ05hbWVdID0gY29udHJvbGxlckZhY3RvcnlJbnN0YW5jZShcbiAgICAgICAgcGFyZW50Q29udHJvbGxlcixcbiAgICAgICAgJGVsZW1lbnQsXG4gICAgICAgIHRhZ05hbWUsXG4gICAgICAgIHN1cGVyVGFnTmFtZUxpc3QsXG4gICAgICApO1xuICAgIH1cblxuICAgIHdpbmRvd1tnVGFnTmFtZV0uJGNvbnRhaW5lciA9ICRlbGVtZW50O1xuICAgIHJldHVybiB3aW5kb3dbZ1RhZ05hbWVdO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UoXG4gICAgcGFyZW50Q29udHJvbGxlcixcbiAgICAkZWxlbWVudCxcbiAgICB0YWdOYW1lLFxuICAgIHN1cGVyVGFnTmFtZUxpc3QsXG4gICk7XG59XG5cbi8qKlxuICogcnVuQ29udHJvbGxlclNob3cgZmlyc3QgcnVucyBvbkxvYWQgYW5kIGZpbGwgY29udGVudCBmb3IgYWxsIHN1YlxuICogY29udHJvbGxlci4gT25seSBpZiBhbGwgdGhlIHN1YiBjb250cm9sbGVyIGFyZSBsb2FkZWQgdGhlIHdpbGxTaG93XG4gKiBjb250cm9sIGZsb3cgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkaHRtbCAtIGpRdWVyeSBsb2FkZWQgY29udGVudFxuICogQHJldHVybiB7UHJvbWlzZTwqPn0gLSByZXR1cm4gb2YgdGhlIG9uTG9hZCBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBydW5Db250cm9sbGVyU2hvdyhjb250cm9sbGVyLCAkaHRtbCkge1xuICByZXR1cm4gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sKS50aGVuKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgYXJncyA9IGFyZ3MgfHwgdHJ1ZTtcbiAgICBpZiAoY29udHJvbGxlci53aWxsU2hvdykge1xuICAgICAgbGV0IGxvYWRQcm9taXNlT3JDb250ZW50ID0gY29udHJvbGxlci53aWxsU2hvdygpO1xuICAgICAgaWYgKGxvYWRQcm9taXNlT3JDb250ZW50IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gbG9hZFByb21pc2VPckNvbnRlbnQudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xuICB9KTtcbn1cblxuLyoqXG4gKiBydW5Db250cm9sbGVyTG9hZCBDYWxscyB0aGUgb25Mb2FkIGZ1bmN0aW9uIG9mIHRoZSBjb250cm9sbGVyLlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBIVE1MIGlzIHNldCB0byB0aGUgcGFnZS5cbiAqIFRoZSBwYXJhbWV0ZXIgaXMgYSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoZSB0YWcgYW5kIHRoZSByZWdpc3RlcmVkIHRhZy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0ganMgY29udHJvbGxlciBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTwqPn0gLSByZXR1cm4gb2YgdGhlIG9uTG9hZCBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBydW5Db250cm9sbGVyTG9hZChjb250cm9sbGVyKSB7XG4gIHJldHVybiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcihjb250cm9sbGVyKS50aGVuKChodG1sKSA9PiB7XG4gICAgaWYgKGh0bWwgPT09IFZJRVdfUkVESVJFQ1QpIHJldHVybiBodG1sO1xuICAgIGlmICghY29udHJvbGxlci5vbkxvYWQgfHwgY29udHJvbGxlci5fb25Mb2FkRG9uZSkge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgY29udHJvbGxlci5fb25Mb2FkRG9uZSA9IHRydWU7XG4gICAgbGV0IGxvYWRQcm9taXNlID0gY29udHJvbGxlci5vbkxvYWQoaHRtbCk7XG4gICAgcmV0dXJuIChsb2FkUHJvbWlzZSB8fCBwcm9taXNlRHVtbXlGYWN0b3J5KCkpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zIHJ1bnMgdGhlIGNvbnRyb2wgZmxvdyBmdW5jdGlvbnM6XG4gKiAxLiBvbkxvYWQoKVxuICogMi4gZmlsbCBjb250ZW50XG4gKiAzLiB3aWxsU2hvdyhkb20gcGFyYW1ldGVyKVxuICogNC4gcmVmcmVzaCgpXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHByb21fY29udHJvbGxlciA9IHJ1bkNvbnRyb2xsZXJMb2FkKGNvbnRyb2xsZXIpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICBpZiAoJGh0bWwgPT09IFZJRVdfUkVESVJFQ1QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250cm9sbGVyLmNvbmZpcm1QYWdlTG9hZGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0cmlnZ2VyKFwibmF2TG9hZGVkXCIsIGNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBWSUVXX1JFRElSRUNUO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJ1bkNvbnRyb2xsZXJTaG93KGNvbnRyb2xsZXIsICRodG1sKTtcbiAgICB9KVxuICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09IFZJRVdfUkVESVJFQ1QpIHJldHVybjtcbiAgICAgIHJldHVybiBydW5SZWZyZXNoKGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xuICAgIH0pXG4gICAgLmNhdGNoKGZ1bmN0aW9uICgkaHRtbCkge1xuICAgICAgaWYgKHR5cGVvZiAkaHRtbCA9PT0gJ3N0cmluZycgfHwgJGh0bWwgaW5zdGFuY2VvZiAkKSB7XG4gICAgICAgIHJldHVybiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQoY29udHJvbGxlciwgJGh0bWwpO1xuICAgICAgfVxuICAgICAgdGhyb3cgJGh0bWw7XG4gICAgfSk7XG5cbiAgaWYgKGNvbnRyb2xsZXIubG9hZF9hc3luYykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHJldHVybiBwcm9tX2NvbnRyb2xsZXI7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5SZWZyZXNoKGNvbnRyb2xsZXIsIHByb2Nlc3MpIHtcbiAgcmV0dXJuIHJlZnJlc2gobnVsbCwgY29udHJvbGxlciwgcHJvY2Vzcyk7XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudExpc3QoY29udHJvbGxlcikge1xuICBsZXQgY29udHJvbGxlckxpc3QgPSBbXTtcbiAgd2hpbGUgKGNvbnRyb2xsZXIpIHtcbiAgICBjb250cm9sbGVyTGlzdC51bnNoaWZ0KGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyLl9wYXJlbnRDb250cm9sbGVyO1xuICB9XG4gIHJldHVybiBjb250cm9sbGVyTGlzdDtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChwcm9jZXNzKSB7XG4gIGNvbnN0IHBhcmVudExpc3QgPSBnZXRQYXJlbnRMaXN0KHByb2Nlc3MuY29udHJvbGxlclswXSk7XG4gIGNvbnN0IGNvbnRyb2xsZXJMaXN0ID0gcGFyZW50TGlzdC5jb25jYXQocHJvY2Vzcy5jb250cm9sbGVyLnNsaWNlKDEpKTtcblxuICBmb3IgKGxldCBjb24gb2YgY29udHJvbGxlckxpc3QpIHtcbiAgICBzZXRDb250cm9sbGVyRXZlbnRzKGNvbik7XG4gICAgY29uLm9uUmVmcmVzaChwcm9jZXNzLmNvbnRyb2xsZXJbMF0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUmVmcmVzaFByb2Nlc3MocmVmcmVzaFByb2Nlc3MsIGNvbnRyb2xsZXIpIHtcbiAgbGV0IGlzUnVubmluZ1Byb2Nlc3MgPSBCb29sZWFuKHJlZnJlc2hQcm9jZXNzKTtcblxuICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICByZWZyZXNoUHJvY2VzcyA9IHtcbiAgICAgIHV1aWRzOiBuZXcgU2V0KFtjb250cm9sbGVyLl91dWlkXSksXG4gICAgICBjb250cm9sbGVyOiBbY29udHJvbGxlcl0sXG4gICAgfTtcbiAgfSBlbHNlIGlmICghcmVmcmVzaFByb2Nlc3MudXVpZHMuaGFzKGNvbnRyb2xsZXIuX3V1aWQpKSB7XG4gICAgcmVmcmVzaFByb2Nlc3MudXVpZHMuYWRkKGNvbnRyb2xsZXIuX3V1aWQpO1xuICAgIHJlZnJlc2hQcm9jZXNzLmNvbnRyb2xsZXIucHVzaChjb250cm9sbGVyKTtcbiAgfVxuXG4gIHJldHVybiB7IGlzUnVubmluZ1Byb2Nlc3MsIHJlZnJlc2hQcm9jZXNzIH07XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_controller.js\n\n}");
|
|
48
48
|
|
|
49
49
|
/***/ },
|
|
50
50
|
|
|
@@ -74,7 +74,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
74
74
|
\******************************************/
|
|
75
75
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
76
76
|
|
|
77
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ app: () => (/* binding */ app)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n\n\n\n\n\n\n\n\n\nconst PROPERTIES_UPDATE = { classname: \"class\" };\n\nlet sdcDomFragment = function (element, props) {\n let $new_elem,\n is_self = false;\n if (typeof element === \"string\") {\n $new_elem = $(document.createElement(element));\n } else {\n const tagName = `this.${element.name}`;\n $new_elem = $(document.createElement(tagName));\n $new_elem.data(\"handler\", element);\n is_self = true;\n }\n\n if (props) {\n Object.entries(props).forEach(([k, v]) => {\n if (k.startsWith(\"on\")) {\n const type = k.substring(2).toLowerCase();\n $new_elem[0].addEventListener(type, v);\n // Remembered so reconcile() can move the listeners to a node it keeps.\n ($new_elem[0]._sdcListeners ??= []).push([type, v]);\n } else {\n if (PROPERTIES_UPDATE[k.toLowerCase()]) {\n k = PROPERTIES_UPDATE[k.toLowerCase()];\n }\n $new_elem[0].setAttribute(k, v);\n }\n });\n }\n\n if (is_self) {\n $new_elem.addClass(\"_bind_to_update_handler _with_handler\");\n }\n\n return $new_elem;\n};\n\nwindow.sdcDom = function (tagName, props, ...children) {\n if (!tagName) {\n return \"\";\n }\n const $new_elem = sdcDomFragment(tagName, props);\n for (const c of children) {\n $new_elem.append(c);\n }\n return $new_elem;\n};\n\nconst redirector = (a) => {\n if (a[\"url-link\"]) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)(\"onNavLink\", a[\"url-link\"]);\n } else {\n window.location.href = a[\"url\"];\n }\n};\n\nlet app = {\n CSRF_TOKEN: window.CSRF_TOKEN || \"\",\n LANGUAGE_CODE: window.LANGUAGE_CODE || \"en\",\n DEBUG: window.DEBUG || false,\n VERSION: window.VERSION || \"0.0\",\n tagNames: [],\n Global: _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global,\n rootController: null,\n globalRootController: null,\n _isInit: false,\n _origin_trigger: null,\n _globalControllerClasses: [],\n _createdGlobals: [],\n\n init_sdc: () => {\n if (!app._isInit) {\n app._isInit = true;\n if (!app._origin_trigger) {\n app._origin_trigger = $.fn.trigger;\n $.fn.trigger = function (event) {\n const ev_type = {}.hasOwnProperty.call(event, \"type\")\n ? event.type\n : event;\n if (!_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.includes(ev_type)) {\n _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.push(ev_type);\n $(window).on(ev_type, _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.windowEventHandler);\n }\n return app._origin_trigger.call(this, event);\n };\n\n app.updateJquery();\n } else {\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.close)();\n }\n\n ;(0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.isConnected)();\n\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.initEvents)();\n\n app.rootController = app.rootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n app.globalRootController = app.globalRootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n }\n\n app.tagNames = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.tagList)();\n\n // Global controllers are created only once, even if init_sdc() is called again.\n const newGlobals = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.filter((tagName) => !app._createdGlobals.includes(tagName));\n app._createdGlobals.push(...newGlobals);\n\n const $globalDiv = $(\"<div></div>\");\n newGlobals.forEach((tagName) => {\n const ControllerClass = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][0];\n $globalDiv.append(\n `<${ControllerClass.prototype._tagName}></${ControllerClass.prototype._tagName}>`,\n );\n });\n\n const { refreshProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(null, app.rootController);\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n $globalDiv,\n app.globalRootController,\n refreshProcess,\n ).then(() => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBody)(),\n app.rootController,\n refreshProcess,\n ).then((res) => {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n return res;\n });\n });\n },\n\n updateJquery: () => {\n $.fn.safeReplace = function ($elem) {\n return app.safeReplace($(this), $elem);\n };\n $.fn.safeEmpty = function () {\n return app.safeEmpty($(this));\n };\n $.fn.safeRemove = function () {\n return app.safeRemove($(this));\n };\n },\n\n controllerToTag: (Controller) => {\n let tagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(Controller.name);\n return tagName.replace(/-controller$/, \"\");\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n */\n registerGlobal: (Controller) => {\n const registration = app.register(Controller);\n let tagName = Controller.prototype._tagName;\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.includes(tagName)) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.push(tagName);\n }\n return registration;\n },\n\n cleanCache: () => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.cleanCache)();\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n * @param overwrite\n */\n register: (Controller, overwrite = false) => {\n let tagName = app.controllerToTag(Controller);\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] || overwrite) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] = [Controller, []];\n Controller.prototype._tagName = tagName;\n\n return {\n /**\n *\n * @param {Array<string>} mixins Controller tag names\n */\n addMixin: (...mixins) => {\n for (let mixin of mixins) {\n let mixinName;\n if (typeof mixin === \"string\") {\n mixinName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(mixin);\n } else if (mixin) {\n mixinName = app.controllerToTag(mixin);\n }\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][1].push(mixinName);\n }\n },\n };\n }\n return {\n addMixin: (...mixins) => {},\n };\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n post: (controller, url, args) => {\n if (!args) {\n args = {};\n }\n\n args.CSRF_TOKEN = app.CSRF_TOKEN;\n return app.ajax(controller, url, args, $.post);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n get: (controller, url, args) => {\n return app.ajax(controller, url, args, $.get);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @param {function} method $.get or $.post\n * @return {Promise}\n */\n ajax: (controller, url, args, method) => {\n if (!args) {\n args = {};\n }\n\n args.VERSION = app.VERSION;\n args._method = args._method || \"api\";\n\n const p = new Promise((resolve, reject) => {\n return method(url, args)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container);\n });\n }\n })\n .catch((a, b, c) => {\n // send_redirect() answers with HTTP 301 and the redirect in the JSON body.\n if (a.status === 301 && a.responseJSON) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitFormAndUpdateView: (controller, form, url, method) => {\n let formData = new FormData(form);\n\n const p = new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container, controller);\n });\n }\n })\n .catch((a, b, c) => {\n if (a.status === 301) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitForm: (form, url, method) => {\n let formData = new FormData(form);\n return new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then(resolve)\n .catch(reject);\n });\n },\n\n /**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\n getController: ($elem) => (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($elem),\n\n /**\n * safeEmpty removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM container to be emptyed\n */\n safeEmpty: ($elem) => {\n let $children = $elem.children();\n $children.each(function (_, element) {\n let $element = $(element);\n app.safeRemove($element);\n });\n\n return $elem;\n },\n\n /**\n * safeReplace removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM to be repleaced\n * @param $new - jQuery new DOM container\n */\n safeReplace: ($elem, $new) => {\n $new.insertBefore($elem);\n return app.safeRemove($elem);\n },\n\n /**\n * safeRemove removes a dom and deletes all child controller safely.\n *\n * @param $elem - jQuery Dom\n */\n safeRemove: ($elem) => {\n $elem.each(function () {\n let $this = $(this);\n if ($this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`)) {\n $this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`).remove();\n }\n });\n\n $elem.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const controller = $(this).data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`);\n controller && controller.remove();\n });\n\n return $elem.remove();\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @return {Promise<jQuery>}\n */\n reloadController: (controller) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reloadHTMLController)(controller).then((html) => {\n let $html = $(html);\n return app.reconcile(controller, $html);\n });\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $virtualNode\n * @param {jquery} $realNode\n * @param {Object} process - Process object containing the refresh process\n */\n reconcile: (controller, $virtualNode, $realNode = null, process = null) => {\n const isContainer = !$realNode;\n if (isContainer) {\n let $temp = controller.$container.clone().empty();\n $temp.data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, null);\n $temp.removeClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS);\n $temp.append($virtualNode);\n $virtualNode = $temp;\n }\n\n $realNode = $realNode ?? controller.$container;\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(\n process,\n controller,\n );\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($virtualNode, controller, refreshProcess).then(() => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reconcile)($virtualNode, $realNode);\n if (isContainer) {\n // $virtualNode is a stripped clone of the container: syncing its\n // attributes and data onto the container removed the controller\n // class and the back-link to the controller. Restore both.\n controller.$container\n .addClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS)\n .data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, controller);\n }\n ;(0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.resetChildren)(controller);\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n return controller;\n });\n },\n\n /**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @return {Promise<void>}\n */\n refresh: ($dom, leafController = null) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($dom, leafController);\n },\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YSxhQUFhO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxrRUFBb0I7QUFDL0I7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiw2REFBbUI7QUFDcEMsd0JBQXdCLDBEQUFnQjtBQUN4QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsWUFBWSxtQ0FBbUMsRUFBRSx5RUFBcUI7QUFDdEU7QUFDQTtBQUNBOztBQUVBLFdBQVcscURBQU87QUFDbEIsTUFBTSx1REFBUztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsMERBQWdCO0FBQ3BDLGdCQUFnQiw2REFBbUI7QUFDbkM7QUFDQSxNQUFNLGtFQUFhO0FBQ25CO0FBQ0EsUUFBUSxrRkFBOEI7QUFDdEM7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxhQUFhO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxxREFBTztBQUNsQixHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX21haW4uanM/MTc4MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjYW1lbENhc2VUb1RhZ05hbWUsXG4gIGdldEJvZHksXG4gIHVwbG9hZEZpbGVGb3JtRGF0YSxcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcixcbiAgcmVsb2FkSFRNTENvbnRyb2xsZXIsXG4gIERBVEFfQ09OVFJPTExFUl9LRVksXG4gIENPTlRST0xMRVJfQ0xBU1MsXG4gIGdldENvbnRyb2xsZXIsXG4gIGNsZWFuQ2FjaGUsXG4gIHJlZnJlc2gsXG59IGZyb20gXCIuL3NkY192aWV3LmpzXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNEQyB9IGZyb20gXCIuL0Fic3RyYWN0U0RDLmpzXCI7XG5pbXBvcnQge1xuICBHbG9iYWwsXG4gIGNvbnRyb2xsZXJMaXN0LFxuICB0YWdMaXN0LFxuICByZXNldENoaWxkcmVuLFxuICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gsXG4gIHByZXBhcmVSZWZyZXNoUHJvY2Vzcyxcbn0gZnJvbSBcIi4vc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7XG4gIGluaXRFdmVudHMsXG4gIFNURF9FVkVOVF9MSVNULFxuICB3aW5kb3dFdmVudEhhbmRsZXIsXG59IGZyb20gXCIuL3NkY19kb21fZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyByZWNvbmNpbGUgfSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcbmltcG9ydCB7IGlzQ29ubmVjdGVkLCBjbG9zZSB9IGZyb20gXCIuL3NkY19zZXJ2ZXJfY2FsbC5qc1wiO1xuXG5jb25zdCBQUk9QRVJUSUVTX1VQREFURSA9IHsgY2xhc3NuYW1lOiBcImNsYXNzXCIgfTtcblxubGV0IHNkY0RvbUZyYWdtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzKSB7XG4gIGxldCAkbmV3X2VsZW0sXG4gICAgaXNfc2VsZiA9IGZhbHNlO1xuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAkbmV3X2VsZW0gPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlbWVudCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHRhZ05hbWUgPSBgdGhpcy4ke2VsZW1lbnQubmFtZX1gO1xuICAgICRuZXdfZWxlbSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7XG4gICAgJG5ld19lbGVtLmRhdGEoXCJoYW5kbGVyXCIsIGVsZW1lbnQpO1xuICAgIGlzX3NlbGYgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHByb3BzKSB7XG4gICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgaWYgKGsuc3RhcnRzV2l0aChcIm9uXCIpKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBrLnN1YnN0cmluZygyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAkbmV3X2VsZW1bMF0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB2KTtcbiAgICAgICAgLy8gUmVtZW1iZXJlZCBzbyByZWNvbmNpbGUoKSBjYW4gbW92ZSB0aGUgbGlzdGVuZXJzIHRvIGEgbm9kZSBpdCBrZWVwcy5cbiAgICAgICAgKCRuZXdfZWxlbVswXS5fc2RjTGlzdGVuZXJzID8/PSBbXSkucHVzaChbdHlwZSwgdl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFBST1BFUlRJRVNfVVBEQVRFW2sudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICBrID0gUFJPUEVSVElFU19VUERBVEVbay50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuICAgICAgICAkbmV3X2VsZW1bMF0uc2V0QXR0cmlidXRlKGssIHYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzX3NlbGYpIHtcbiAgICAkbmV3X2VsZW0uYWRkQ2xhc3MoXCJfYmluZF90b191cGRhdGVfaGFuZGxlciBfd2l0aF9oYW5kbGVyXCIpO1xuICB9XG5cbiAgcmV0dXJuICRuZXdfZWxlbTtcbn07XG5cbndpbmRvdy5zZGNEb20gPSBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcHMsIC4uLmNoaWxkcmVuKSB7XG4gIGlmICghdGFnTmFtZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIGNvbnN0ICRuZXdfZWxlbSA9IHNkY0RvbUZyYWdtZW50KHRhZ05hbWUsIHByb3BzKTtcbiAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgJG5ld19lbGVtLmFwcGVuZChjKTtcbiAgfVxuICByZXR1cm4gJG5ld19lbGVtO1xufTtcblxuY29uc3QgcmVkaXJlY3RvciA9IChhKSA9PiB7XG4gIGlmIChhW1widXJsLWxpbmtcIl0pIHtcbiAgICB0cmlnZ2VyKFwib25OYXZMaW5rXCIsIGFbXCJ1cmwtbGlua1wiXSk7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBhW1widXJsXCJdO1xuICB9XG59O1xuXG5leHBvcnQgbGV0IGFwcCA9IHtcbiAgQ1NSRl9UT0tFTjogd2luZG93LkNTUkZfVE9LRU4gfHwgXCJcIixcbiAgTEFOR1VBR0VfQ09ERTogd2luZG93LkxBTkdVQUdFX0NPREUgfHwgXCJlblwiLFxuICBERUJVRzogd2luZG93LkRFQlVHIHx8IGZhbHNlLFxuICBWRVJTSU9OOiB3aW5kb3cuVkVSU0lPTiB8fCBcIjAuMFwiLFxuICB0YWdOYW1lczogW10sXG4gIEdsb2JhbDogR2xvYmFsLFxuICByb290Q29udHJvbGxlcjogbnVsbCxcbiAgZ2xvYmFsUm9vdENvbnRyb2xsZXI6IG51bGwsXG4gIF9pc0luaXQ6IGZhbHNlLFxuICBfb3JpZ2luX3RyaWdnZXI6IG51bGwsXG4gIF9nbG9iYWxDb250cm9sbGVyQ2xhc3NlczogW10sXG4gIF9jcmVhdGVkR2xvYmFsczogW10sXG5cbiAgaW5pdF9zZGM6ICgpID0+IHtcbiAgICBpZiAoIWFwcC5faXNJbml0KSB7XG4gICAgICBhcHAuX2lzSW5pdCA9IHRydWU7XG4gICAgICBpZiAoIWFwcC5fb3JpZ2luX3RyaWdnZXIpIHtcbiAgICAgICAgYXBwLl9vcmlnaW5fdHJpZ2dlciA9ICQuZm4udHJpZ2dlcjtcbiAgICAgICAgJC5mbi50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc3QgZXZfdHlwZSA9IHt9Lmhhc093blByb3BlcnR5LmNhbGwoZXZlbnQsIFwidHlwZVwiKVxuICAgICAgICAgICAgPyBldmVudC50eXBlXG4gICAgICAgICAgICA6IGV2ZW50O1xuICAgICAgICAgIGlmICghU1REX0VWRU5UX0xJU1QuaW5jbHVkZXMoZXZfdHlwZSkpIHtcbiAgICAgICAgICAgIFNURF9FVkVOVF9MSVNULnB1c2goZXZfdHlwZSk7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oZXZfdHlwZSwgd2luZG93RXZlbnRIYW5kbGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFwcC5fb3JpZ2luX3RyaWdnZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBwLnVwZGF0ZUpxdWVyeSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgaXNDb25uZWN0ZWQoKTtcblxuICAgICAgaW5pdEV2ZW50cygpO1xuXG4gICAgICBhcHAucm9vdENvbnRyb2xsZXIgPSBhcHAucm9vdENvbnRyb2xsZXIgfHwgbmV3IEFic3RyYWN0U0RDKCk7XG4gICAgICBhcHAuZ2xvYmFsUm9vdENvbnRyb2xsZXIgPSBhcHAuZ2xvYmFsUm9vdENvbnRyb2xsZXIgfHwgbmV3IEFic3RyYWN0U0RDKCk7XG4gICAgfVxuXG4gICAgYXBwLnRhZ05hbWVzID0gdGFnTGlzdCgpO1xuXG4gICAgLy8gR2xvYmFsIGNvbnRyb2xsZXJzIGFyZSBjcmVhdGVkIG9ubHkgb25jZSwgZXZlbiBpZiBpbml0X3NkYygpIGlzIGNhbGxlZCBhZ2Fpbi5cbiAgICBjb25zdCBuZXdHbG9iYWxzID0gR2xvYmFsLmZpbHRlcigodGFnTmFtZSkgPT4gIWFwcC5fY3JlYXRlZEdsb2JhbHMuaW5jbHVkZXModGFnTmFtZSkpO1xuICAgIGFwcC5fY3JlYXRlZEdsb2JhbHMucHVzaCguLi5uZXdHbG9iYWxzKTtcblxuICAgIGNvbnN0ICRnbG9iYWxEaXYgPSAkKFwiPGRpdj48L2Rpdj5cIik7XG4gICAgbmV3R2xvYmFscy5mb3JFYWNoKCh0YWdOYW1lKSA9PiB7XG4gICAgICBjb25zdCBDb250cm9sbGVyQ2xhc3MgPSBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVswXTtcbiAgICAgICRnbG9iYWxEaXYuYXBwZW5kKFxuICAgICAgICBgPCR7Q29udHJvbGxlckNsYXNzLnByb3RvdHlwZS5fdGFnTmFtZX0+PC8ke0NvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUuX3RhZ05hbWV9PmAsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWZyZXNoUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKG51bGwsIGFwcC5yb290Q29udHJvbGxlcik7XG5cbiAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICBhcHAudGFnTmFtZXMsXG4gICAgICAkZ2xvYmFsRGl2LFxuICAgICAgYXBwLmdsb2JhbFJvb3RDb250cm9sbGVyLFxuICAgICAgcmVmcmVzaFByb2Nlc3MsXG4gICAgKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICAgICAgYXBwLnRhZ05hbWVzLFxuICAgICAgICBnZXRCb2R5KCksXG4gICAgICAgIGFwcC5yb290Q29udHJvbGxlcixcbiAgICAgICAgcmVmcmVzaFByb2Nlc3MsXG4gICAgICApLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gocmVmcmVzaFByb2Nlc3MpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdXBkYXRlSnF1ZXJ5OiAoKSA9PiB7XG4gICAgJC5mbi5zYWZlUmVwbGFjZSA9IGZ1bmN0aW9uICgkZWxlbSkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVwbGFjZSgkKHRoaXMpLCAkZWxlbSk7XG4gICAgfTtcbiAgICAkLmZuLnNhZmVFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZUVtcHR5KCQodGhpcykpO1xuICAgIH07XG4gICAgJC5mbi5zYWZlUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVtb3ZlKCQodGhpcykpO1xuICAgIH07XG4gIH0sXG5cbiAgY29udHJvbGxlclRvVGFnOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGxldCB0YWdOYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKENvbnRyb2xsZXIubmFtZSk7XG4gICAgcmV0dXJuIHRhZ05hbWUucmVwbGFjZSgvLWNvbnRyb2xsZXIkLywgXCJcIik7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IENvbnRyb2xsZXJcbiAgICovXG4gIHJlZ2lzdGVyR2xvYmFsOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGFwcC5yZWdpc3RlcihDb250cm9sbGVyKTtcbiAgICBsZXQgdGFnTmFtZSA9IENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lO1xuICAgIGlmICghR2xvYmFsLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgICBHbG9iYWwucHVzaCh0YWdOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfSxcblxuICBjbGVhbkNhY2hlOiAoKSA9PiB7XG4gICAgY2xlYW5DYWNoZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqIEBwYXJhbSBvdmVyd3JpdGVcbiAgICovXG4gIHJlZ2lzdGVyOiAoQ29udHJvbGxlciwgb3ZlcndyaXRlID0gZmFsc2UpID0+IHtcbiAgICBsZXQgdGFnTmFtZSA9IGFwcC5jb250cm9sbGVyVG9UYWcoQ29udHJvbGxlcik7XG4gICAgaWYgKCFjb250cm9sbGVyTGlzdFt0YWdOYW1lXSB8fCBvdmVyd3JpdGUpIHtcbiAgICAgIGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdID0gW0NvbnRyb2xsZXIsIFtdXTtcbiAgICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lID0gdGFnTmFtZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbWl4aW5zIENvbnRyb2xsZXIgdGFnIG5hbWVzXG4gICAgICAgICAqL1xuICAgICAgICBhZGRNaXhpbjogKC4uLm1peGlucykgPT4ge1xuICAgICAgICAgIGZvciAobGV0IG1peGluIG9mIG1peGlucykge1xuICAgICAgICAgICAgbGV0IG1peGluTmFtZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWl4aW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKG1peGluKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWl4aW4pIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gYXBwLmNvbnRyb2xsZXJUb1RhZyhtaXhpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVsxXS5wdXNoKG1peGluTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZE1peGluOiAoLi4ubWl4aW5zKSA9PiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIHBvc3Q6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MpID0+IHtcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICBhcmdzLkNTUkZfVE9LRU4gPSBhcHAuQ1NSRl9UT0tFTjtcbiAgICByZXR1cm4gYXBwLmFqYXgoY29udHJvbGxlciwgdXJsLCBhcmdzLCAkLnBvc3QpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGdldDogKGNvbnRyb2xsZXIsIHVybCwgYXJncykgPT4ge1xuICAgIHJldHVybiBhcHAuYWpheChjb250cm9sbGVyLCB1cmwsIGFyZ3MsICQuZ2V0KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCAkLmdldCBvciAkLnBvc3RcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGFqYXg6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MsIG1ldGhvZCkgPT4ge1xuICAgIGlmICghYXJncykge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICAgIGFyZ3MuX21ldGhvZCA9IGFyZ3MuX21ldGhvZCB8fCBcImFwaVwiO1xuXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHVybiBtZXRob2QodXJsLCBhcmdzKVxuICAgICAgICAudGhlbigoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIHJlc29sdmUoYSwgYiwgYyk7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGFwcC5yZWZyZXNoKGNvbnRyb2xsZXIuJGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIC8vIHNlbmRfcmVkaXJlY3QoKSBhbnN3ZXJzIHdpdGggSFRUUCAzMDEgYW5kIHRoZSByZWRpcmVjdCBpbiB0aGUgSlNPTiBib2R5LlxuICAgICAgICAgIGlmIChhLnN0YXR1cyA9PT0gMzAxICYmIGEucmVzcG9uc2VKU09OKSB7XG4gICAgICAgICAgICBhID0gYS5yZXNwb25zZUpTT047XG4gICAgICAgICAgICByZWRpcmVjdG9yKGEpO1xuICAgICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGEsIGIsIGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcDtcbiAgfSxcblxuICBzdWJtaXRGb3JtQW5kVXBkYXRlVmlldzogKGNvbnRyb2xsZXIsIGZvcm0sIHVybCwgbWV0aG9kKSA9PiB7XG4gICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0pO1xuXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwbG9hZEZpbGVGb3JtRGF0YShmb3JtRGF0YSwgdXJsIHx8IGZvcm0uYWN0aW9uLCBtZXRob2QgfHwgZm9ybS5tZXRob2QpXG4gICAgICAgIC50aGVuKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICBpZiAoYS5zdGF0dXMgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgcmVkaXJlY3RvcihhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYXBwLnJlZnJlc2goY29udHJvbGxlci4kY29udGFpbmVyLCBjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgICAgICAgIGEgPSBhLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgICByZXNvbHZlKGEsIGIsIGMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoYSwgYiwgYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwO1xuICB9LFxuXG4gIHN1Ym1pdEZvcm06IChmb3JtLCB1cmwsIG1ldGhvZCkgPT4ge1xuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwgfHwgZm9ybS5hY3Rpb24sIG1ldGhvZCB8fCBmb3JtLm1ldGhvZClcbiAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICAgKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAgICovXG4gIGdldENvbnRyb2xsZXI6ICgkZWxlbSkgPT4gZ2V0Q29udHJvbGxlcigkZWxlbSksXG5cbiAgLyoqXG4gICAqIHNhZmVFbXB0eSByZW1vdmVzIGFsbCBjb250ZW50IG9mIGEgZG9tXG4gICAqIGFuZCBkZWxldGVzIGFsbCBjaGlsZCBjb250cm9sbGVyIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtICRlbGVtIC0galF1ZXJ5IERPTSBjb250YWluZXIgdG8gYmUgZW1wdHllZFxuICAgKi9cbiAgc2FmZUVtcHR5OiAoJGVsZW0pID0+IHtcbiAgICBsZXQgJGNoaWxkcmVuID0gJGVsZW0uY2hpbGRyZW4oKTtcbiAgICAkY2hpbGRyZW4uZWFjaChmdW5jdGlvbiAoXywgZWxlbWVudCkge1xuICAgICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgIGFwcC5zYWZlUmVtb3ZlKCRlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbTtcbiAgfSxcblxuICAvKipcbiAgICogc2FmZVJlcGxhY2UgcmVtb3ZlcyBhbGwgY29udGVudCBvZiBhIGRvbVxuICAgKiBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBET00gdG8gYmUgcmVwbGVhY2VkXG4gICAqIEBwYXJhbSAkbmV3IC0galF1ZXJ5IG5ldyBET00gY29udGFpbmVyXG4gICAqL1xuICBzYWZlUmVwbGFjZTogKCRlbGVtLCAkbmV3KSA9PiB7XG4gICAgJG5ldy5pbnNlcnRCZWZvcmUoJGVsZW0pO1xuICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkZWxlbSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNhZmVSZW1vdmUgcmVtb3ZlcyBhIGRvbSBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBEb21cbiAgICovXG4gIHNhZmVSZW1vdmU6ICgkZWxlbSkgPT4ge1xuICAgICRlbGVtLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbGV0ICR0aGlzID0gJCh0aGlzKTtcbiAgICAgIGlmICgkdGhpcy5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCkpIHtcbiAgICAgICAgJHRoaXMuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJGVsZW0uZmluZChgLiR7Q09OVFJPTExFUl9DTEFTU31gKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSAkKHRoaXMpLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgICAgIGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5yZW1vdmUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbS5yZW1vdmUoKTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGpRdWVyeT59XG4gICAqL1xuICByZWxvYWRDb250cm9sbGVyOiAoY29udHJvbGxlcikgPT4ge1xuICAgIHJldHVybiByZWxvYWRIVE1MQ29udHJvbGxlcihjb250cm9sbGVyKS50aGVuKChodG1sKSA9PiB7XG4gICAgICBsZXQgJGh0bWwgPSAkKGh0bWwpO1xuICAgICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUoY29udHJvbGxlciwgJGh0bWwpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkdmlydHVhbE5vZGVcbiAgICogQHBhcmFtIHtqcXVlcnl9ICRyZWFsTm9kZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICAgKi9cbiAgcmVjb25jaWxlOiAoY29udHJvbGxlciwgJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUgPSBudWxsLCBwcm9jZXNzID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IGlzQ29udGFpbmVyID0gISRyZWFsTm9kZTtcbiAgICBpZiAoaXNDb250YWluZXIpIHtcbiAgICAgIGxldCAkdGVtcCA9IGNvbnRyb2xsZXIuJGNvbnRhaW5lci5jbG9uZSgpLmVtcHR5KCk7XG4gICAgICAkdGVtcC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIG51bGwpO1xuICAgICAgJHRlbXAucmVtb3ZlQ2xhc3MoQ09OVFJPTExFUl9DTEFTUyk7XG4gICAgICAkdGVtcC5hcHBlbmQoJHZpcnR1YWxOb2RlKTtcbiAgICAgICR2aXJ0dWFsTm9kZSA9ICR0ZW1wO1xuICAgIH1cblxuICAgICRyZWFsTm9kZSA9ICRyZWFsTm9kZSA/PyBjb250cm9sbGVyLiRjb250YWluZXI7XG5cbiAgICBjb25zdCB7IHJlZnJlc2hQcm9jZXNzLCBpc1J1bm5pbmdQcm9jZXNzIH0gPSBwcmVwYXJlUmVmcmVzaFByb2Nlc3MoXG4gICAgICBwcm9jZXNzLFxuICAgICAgY29udHJvbGxlcixcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlZnJlc2goJHZpcnR1YWxOb2RlLCBjb250cm9sbGVyLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICByZWNvbmNpbGUoJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUpO1xuICAgICAgaWYgKGlzQ29udGFpbmVyKSB7XG4gICAgICAgIC8vICR2aXJ0dWFsTm9kZSBpcyBhIHN0cmlwcGVkIGNsb25lIG9mIHRoZSBjb250YWluZXI6IHN5bmNpbmcgaXRzXG4gICAgICAgIC8vIGF0dHJpYnV0ZXMgYW5kIGRhdGEgb250byB0aGUgY29udGFpbmVyIHJlbW92ZWQgdGhlIGNvbnRyb2xsZXJcbiAgICAgICAgLy8gY2xhc3MgYW5kIHRoZSBiYWNrLWxpbmsgdG8gdGhlIGNvbnRyb2xsZXIuIFJlc3RvcmUgYm90aC5cbiAgICAgICAgY29udHJvbGxlci4kY29udGFpbmVyXG4gICAgICAgICAgLmFkZENsYXNzKENPTlRST0xMRVJfQ0xBU1MpXG4gICAgICAgICAgLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgY29udHJvbGxlcik7XG4gICAgICB9XG4gICAgICByZXNldENoaWxkcmVuKGNvbnRyb2xsZXIpO1xuICAgICAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgICAgIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChyZWZyZXNoUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gbGVhZkNvbnRyb2xsZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHJlZnJlc2g6ICgkZG9tLCBsZWFmQ29udHJvbGxlciA9IG51bGwpID0+IHtcbiAgICByZXR1cm4gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlcik7XG4gIH0sXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_main.js\n\n}");
|
|
77
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ app: () => (/* binding */ app)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n\n\n\n\n\n\n\n\n\nconst PROPERTIES_UPDATE = { classname: \"class\" };\n\nlet sdcDomFragment = function (element, props) {\n let $new_elem,\n is_self = false;\n if (typeof element === \"string\") {\n $new_elem = $(document.createElement(element));\n } else {\n const tagName = `this.${element.name}`;\n $new_elem = $(document.createElement(tagName));\n $new_elem.data(\"handler\", element);\n is_self = true;\n }\n\n if (props) {\n Object.entries(props).forEach(([k, v]) => {\n if (k.startsWith(\"on\")) {\n const type = k.substring(2).toLowerCase();\n $new_elem[0].addEventListener(type, v);\n // Remembered so reconcile() can move the listeners to a node it keeps.\n ($new_elem[0]._sdcListeners ??= []).push([type, v]);\n } else {\n if (PROPERTIES_UPDATE[k.toLowerCase()]) {\n k = PROPERTIES_UPDATE[k.toLowerCase()];\n }\n $new_elem[0].setAttribute(k, v);\n }\n });\n }\n\n if (is_self) {\n $new_elem.addClass(\"_bind_to_update_handler _with_handler\");\n }\n\n return $new_elem;\n};\n\nwindow.sdcDom = function (tagName, props, ...children) {\n if (!tagName) {\n return \"\";\n }\n const $new_elem = sdcDomFragment(tagName, props);\n for (const c of children) {\n $new_elem.append(c);\n }\n return $new_elem;\n};\n\nconst redirector = (a) => {\n if (a[\"url-link\"]) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)(\"onNavLink\", a[\"url-link\"]);\n } else {\n window.location.href = a[\"url\"];\n }\n};\n\nlet app = {\n CSRF_TOKEN: window.CSRF_TOKEN || \"\",\n LANGUAGE_CODE: window.LANGUAGE_CODE || \"en\",\n DEBUG: window.DEBUG || false,\n VERSION: window.VERSION || \"0.0\",\n tagNames: [],\n Global: _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global,\n rootController: null,\n globalRootController: null,\n _isInit: false,\n _origin_trigger: null,\n _globalControllerClasses: [],\n _createdGlobals: [],\n\n init_sdc: () => {\n if (!app._isInit) {\n app._isInit = true;\n if (!app._origin_trigger) {\n app._origin_trigger = $.fn.trigger;\n $.fn.trigger = function (event) {\n const ev_type = {}.hasOwnProperty.call(event, \"type\")\n ? event.type\n : event;\n if (!_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.includes(ev_type)) {\n _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.push(ev_type);\n $(window).on(ev_type, _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.windowEventHandler);\n }\n return app._origin_trigger.call(this, event);\n };\n\n app.updateJquery();\n } else {\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.close)();\n }\n\n ;(0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.isConnected)();\n\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.initEvents)();\n\n app.rootController = app.rootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n app.globalRootController = app.globalRootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n }\n\n app.tagNames = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.tagList)();\n\n // Global controllers are created only once, even if init_sdc() is called again.\n const newGlobals = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.filter((tagName) => !app._createdGlobals.includes(tagName));\n app._createdGlobals.push(...newGlobals);\n\n const $globalDiv = $(\"<div></div>\");\n newGlobals.forEach((tagName) => {\n const ControllerClass = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][0];\n $globalDiv.append(\n `<${ControllerClass.prototype._tagName}></${ControllerClass.prototype._tagName}>`,\n );\n });\n\n const { refreshProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(null, app.rootController);\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n $globalDiv,\n app.globalRootController,\n refreshProcess,\n ).then(() => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBody)(),\n app.rootController,\n refreshProcess,\n ).then((res) => {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n return res;\n });\n });\n },\n\n updateJquery: () => {\n $.fn.safeReplace = function ($elem) {\n return app.safeReplace($(this), $elem);\n };\n $.fn.safeEmpty = function () {\n return app.safeEmpty($(this));\n };\n $.fn.safeRemove = function () {\n return app.safeRemove($(this));\n };\n },\n\n controllerToTag: (Controller) => {\n let tagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(Controller.name);\n return tagName.replace(/-controller$/, \"\");\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n */\n registerGlobal: (Controller) => {\n const registration = app.register(Controller);\n let tagName = Controller.prototype._tagName;\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.includes(tagName)) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.push(tagName);\n }\n return registration;\n },\n\n cleanCache: () => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.cleanCache)();\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n * @param overwrite\n */\n register: (Controller, overwrite = false) => {\n let tagName = app.controllerToTag(Controller);\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] || overwrite) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] = [Controller, []];\n Controller.prototype._tagName = tagName;\n\n return {\n /**\n *\n * @param {Array<string>} mixins Controller tag names\n */\n addMixin: (...mixins) => {\n for (let mixin of mixins) {\n let mixinName;\n if (typeof mixin === \"string\") {\n mixinName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(mixin);\n } else if (mixin) {\n mixinName = app.controllerToTag(mixin);\n }\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][1].push(mixinName);\n }\n },\n };\n }\n return {\n addMixin: (...mixins) => {},\n };\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n post: (controller, url, args) => {\n if (!args) {\n args = {};\n }\n\n args.CSRF_TOKEN = app.CSRF_TOKEN;\n return app.ajax(controller, url, args, $.post);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n get: (controller, url, args) => {\n return app.ajax(controller, url, args, $.get);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @param {function} method $.get or $.post\n * @return {Promise}\n */\n ajax: (controller, url, args, method) => {\n if (!args) {\n args = {};\n }\n\n args.VERSION = app.VERSION;\n args._method = args._method || \"api\";\n\n const p = new Promise((resolve, reject) => {\n return method(url, args)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container);\n });\n }\n })\n .catch((a, b, c) => {\n // send_redirect() answers with HTTP 301 and the redirect in the JSON body.\n if (a.status === 301 && a.responseJSON) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitFormAndUpdateView: (controller, form, url, method) => {\n let formData = new FormData(form);\n\n const p = new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container, controller);\n });\n }\n })\n .catch((a, b, c) => {\n if (a.status === 301) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitForm: (form, url, method) => {\n let formData = new FormData(form);\n return new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then(resolve)\n .catch(reject);\n });\n },\n\n /**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\n getController: ($elem) => (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($elem),\n\n /**\n * safeEmpty removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM container to be emptyed\n */\n safeEmpty: ($elem) => {\n let $children = $elem.children();\n $children.each(function (_, element) {\n let $element = $(element);\n app.safeRemove($element);\n });\n\n return $elem;\n },\n\n /**\n * safeReplace removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM to be repleaced\n * @param $new - jQuery new DOM container\n */\n safeReplace: ($elem, $new) => {\n $new.insertBefore($elem);\n return app.safeRemove($elem);\n },\n\n /**\n * safeRemove removes a dom and deletes all child controller safely.\n *\n * @param $elem - jQuery Dom\n */\n safeRemove: ($elem) => {\n $elem.each(function () {\n let $this = $(this);\n if ($this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`)) {\n $this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`).remove();\n }\n });\n\n $elem.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const controller = $(this).data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`);\n controller && controller.remove();\n });\n\n return $elem.remove();\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @return {Promise<jQuery>}\n */\n reloadController: (controller) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reloadHTMLController)(controller).then((html) => {\n if (html === _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.VIEW_REDIRECT) return;\n let $html = $(html);\n return app.reconcile(controller, $html);\n });\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $virtualNode\n * @param {jquery} $realNode\n * @param {Object} process - Process object containing the refresh process\n */\n reconcile: (controller, $virtualNode, $realNode = null, process = null) => {\n const isContainer = !$realNode;\n if (isContainer) {\n let $temp = controller.$container.clone().empty();\n $temp.data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, null);\n $temp.removeClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS);\n $temp.append($virtualNode);\n $virtualNode = $temp;\n }\n\n $realNode = $realNode ?? controller.$container;\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(\n process,\n controller,\n );\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($virtualNode, controller, refreshProcess).then(() => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reconcile)($virtualNode, $realNode);\n if (isContainer) {\n // $virtualNode is a stripped clone of the container: syncing its\n // attributes and data onto the container removed the controller\n // class and the back-link to the controller. Restore both.\n controller.$container\n .addClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS)\n .data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, controller);\n }\n ;(0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.resetChildren)(controller);\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n return controller;\n });\n },\n\n /**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @return {Promise<void>}\n */\n refresh: ($dom, leafController = null) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($dom, leafController);\n },\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YSxhQUFhO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxrRUFBb0I7QUFDL0IsbUJBQW1CLHVEQUFhO0FBQ2hDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsYUFBYSxhQUFhO0FBQzFCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsNkRBQW1CO0FBQ3BDLHdCQUF3QiwwREFBZ0I7QUFDeEM7QUFDQTtBQUNBOztBQUVBOztBQUVBLFlBQVksbUNBQW1DLEVBQUUseUVBQXFCO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLHFEQUFPO0FBQ2xCLE1BQU0sdURBQVM7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDBEQUFnQjtBQUNwQyxnQkFBZ0IsNkRBQW1CO0FBQ25DO0FBQ0EsTUFBTSxrRUFBYTtBQUNuQjtBQUNBLFFBQVEsa0ZBQThCO0FBQ3RDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsYUFBYTtBQUMxQixjQUFjO0FBQ2Q7QUFDQTtBQUNBLFdBQVcscURBQU87QUFDbEIsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19tYWluLmpzPzE3ODMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY2FtZWxDYXNlVG9UYWdOYW1lLFxuICBnZXRCb2R5LFxuICB1cGxvYWRGaWxlRm9ybURhdGEsXG59IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHtcbiAgcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIsXG4gIHJlbG9hZEhUTUxDb250cm9sbGVyLFxuICBWSUVXX1JFRElSRUNULFxuICBEQVRBX0NPTlRST0xMRVJfS0VZLFxuICBDT05UUk9MTEVSX0NMQVNTLFxuICBnZXRDb250cm9sbGVyLFxuICBjbGVhbkNhY2hlLFxuICByZWZyZXNoLFxufSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuaW1wb3J0IHsgQWJzdHJhY3RTREMgfSBmcm9tIFwiLi9BYnN0cmFjdFNEQy5qc1wiO1xuaW1wb3J0IHtcbiAgR2xvYmFsLFxuICBjb250cm9sbGVyTGlzdCxcbiAgdGFnTGlzdCxcbiAgcmVzZXRDaGlsZHJlbixcbiAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoLFxuICBwcmVwYXJlUmVmcmVzaFByb2Nlc3MsXG59IGZyb20gXCIuL3NkY19jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQge1xuICBpbml0RXZlbnRzLFxuICBTVERfRVZFTlRfTElTVCxcbiAgd2luZG93RXZlbnRIYW5kbGVyLFxufSBmcm9tIFwiLi9zZGNfZG9tX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgcmVjb25jaWxlIH0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcbmltcG9ydCB7IHRyaWdnZXIgfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyBpc0Nvbm5lY3RlZCwgY2xvc2UgfSBmcm9tIFwiLi9zZGNfc2VydmVyX2NhbGwuanNcIjtcblxuY29uc3QgUFJPUEVSVElFU19VUERBVEUgPSB7IGNsYXNzbmFtZTogXCJjbGFzc1wiIH07XG5cbmxldCBzZGNEb21GcmFnbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBwcm9wcykge1xuICBsZXQgJG5ld19lbGVtLFxuICAgIGlzX3NlbGYgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgJG5ld19lbGVtID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW1lbnQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0YWdOYW1lID0gYHRoaXMuJHtlbGVtZW50Lm5hbWV9YDtcbiAgICAkbmV3X2VsZW0gPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpO1xuICAgICRuZXdfZWxlbS5kYXRhKFwiaGFuZGxlclwiLCBlbGVtZW50KTtcbiAgICBpc19zZWxmID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcm9wcykge1xuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIGlmIChrLnN0YXJ0c1dpdGgoXCJvblwiKSkge1xuICAgICAgICBjb25zdCB0eXBlID0gay5zdWJzdHJpbmcoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgJG5ld19lbGVtWzBdLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdik7XG4gICAgICAgIC8vIFJlbWVtYmVyZWQgc28gcmVjb25jaWxlKCkgY2FuIG1vdmUgdGhlIGxpc3RlbmVycyB0byBhIG5vZGUgaXQga2VlcHMuXG4gICAgICAgICgkbmV3X2VsZW1bMF0uX3NkY0xpc3RlbmVycyA/Pz0gW10pLnB1c2goW3R5cGUsIHZdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChQUk9QRVJUSUVTX1VQREFURVtrLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgayA9IFBST1BFUlRJRVNfVVBEQVRFW2sudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIH1cbiAgICAgICAgJG5ld19lbGVtWzBdLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChpc19zZWxmKSB7XG4gICAgJG5ld19lbGVtLmFkZENsYXNzKFwiX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgX3dpdGhfaGFuZGxlclwiKTtcbiAgfVxuXG4gIHJldHVybiAkbmV3X2VsZW07XG59O1xuXG53aW5kb3cuc2RjRG9tID0gZnVuY3Rpb24gKHRhZ05hbWUsIHByb3BzLCAuLi5jaGlsZHJlbikge1xuICBpZiAoIXRhZ05hbWUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBjb25zdCAkbmV3X2VsZW0gPSBzZGNEb21GcmFnbWVudCh0YWdOYW1lLCBwcm9wcyk7XG4gIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICRuZXdfZWxlbS5hcHBlbmQoYyk7XG4gIH1cbiAgcmV0dXJuICRuZXdfZWxlbTtcbn07XG5cbmNvbnN0IHJlZGlyZWN0b3IgPSAoYSkgPT4ge1xuICBpZiAoYVtcInVybC1saW5rXCJdKSB7XG4gICAgdHJpZ2dlcihcIm9uTmF2TGlua1wiLCBhW1widXJsLWxpbmtcIl0pO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYVtcInVybFwiXTtcbiAgfVxufTtcblxuZXhwb3J0IGxldCBhcHAgPSB7XG4gIENTUkZfVE9LRU46IHdpbmRvdy5DU1JGX1RPS0VOIHx8IFwiXCIsXG4gIExBTkdVQUdFX0NPREU6IHdpbmRvdy5MQU5HVUFHRV9DT0RFIHx8IFwiZW5cIixcbiAgREVCVUc6IHdpbmRvdy5ERUJVRyB8fCBmYWxzZSxcbiAgVkVSU0lPTjogd2luZG93LlZFUlNJT04gfHwgXCIwLjBcIixcbiAgdGFnTmFtZXM6IFtdLFxuICBHbG9iYWw6IEdsb2JhbCxcbiAgcm9vdENvbnRyb2xsZXI6IG51bGwsXG4gIGdsb2JhbFJvb3RDb250cm9sbGVyOiBudWxsLFxuICBfaXNJbml0OiBmYWxzZSxcbiAgX29yaWdpbl90cmlnZ2VyOiBudWxsLFxuICBfZ2xvYmFsQ29udHJvbGxlckNsYXNzZXM6IFtdLFxuICBfY3JlYXRlZEdsb2JhbHM6IFtdLFxuXG4gIGluaXRfc2RjOiAoKSA9PiB7XG4gICAgaWYgKCFhcHAuX2lzSW5pdCkge1xuICAgICAgYXBwLl9pc0luaXQgPSB0cnVlO1xuICAgICAgaWYgKCFhcHAuX29yaWdpbl90cmlnZ2VyKSB7XG4gICAgICAgIGFwcC5fb3JpZ2luX3RyaWdnZXIgPSAkLmZuLnRyaWdnZXI7XG4gICAgICAgICQuZm4udHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGNvbnN0IGV2X3R5cGUgPSB7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV2ZW50LCBcInR5cGVcIilcbiAgICAgICAgICAgID8gZXZlbnQudHlwZVxuICAgICAgICAgICAgOiBldmVudDtcbiAgICAgICAgICBpZiAoIVNURF9FVkVOVF9MSVNULmluY2x1ZGVzKGV2X3R5cGUpKSB7XG4gICAgICAgICAgICBTVERfRVZFTlRfTElTVC5wdXNoKGV2X3R5cGUpO1xuICAgICAgICAgICAgJCh3aW5kb3cpLm9uKGV2X3R5cGUsIHdpbmRvd0V2ZW50SGFuZGxlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhcHAuX29yaWdpbl90cmlnZ2VyLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGFwcC51cGRhdGVKcXVlcnkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIGlzQ29ubmVjdGVkKCk7XG5cbiAgICAgIGluaXRFdmVudHMoKTtcblxuICAgICAgYXBwLnJvb3RDb250cm9sbGVyID0gYXBwLnJvb3RDb250cm9sbGVyIHx8IG5ldyBBYnN0cmFjdFNEQygpO1xuICAgICAgYXBwLmdsb2JhbFJvb3RDb250cm9sbGVyID0gYXBwLmdsb2JhbFJvb3RDb250cm9sbGVyIHx8IG5ldyBBYnN0cmFjdFNEQygpO1xuICAgIH1cblxuICAgIGFwcC50YWdOYW1lcyA9IHRhZ0xpc3QoKTtcblxuICAgIC8vIEdsb2JhbCBjb250cm9sbGVycyBhcmUgY3JlYXRlZCBvbmx5IG9uY2UsIGV2ZW4gaWYgaW5pdF9zZGMoKSBpcyBjYWxsZWQgYWdhaW4uXG4gICAgY29uc3QgbmV3R2xvYmFscyA9IEdsb2JhbC5maWx0ZXIoKHRhZ05hbWUpID0+ICFhcHAuX2NyZWF0ZWRHbG9iYWxzLmluY2x1ZGVzKHRhZ05hbWUpKTtcbiAgICBhcHAuX2NyZWF0ZWRHbG9iYWxzLnB1c2goLi4ubmV3R2xvYmFscyk7XG5cbiAgICBjb25zdCAkZ2xvYmFsRGl2ID0gJChcIjxkaXY+PC9kaXY+XCIpO1xuICAgIG5ld0dsb2JhbHMuZm9yRWFjaCgodGFnTmFtZSkgPT4ge1xuICAgICAgY29uc3QgQ29udHJvbGxlckNsYXNzID0gY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMF07XG4gICAgICAkZ2xvYmFsRGl2LmFwcGVuZChcbiAgICAgICAgYDwke0NvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUuX3RhZ05hbWV9PjwvJHtDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlLl90YWdOYW1lfT5gLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVmcmVzaFByb2Nlc3MgfSA9IHByZXBhcmVSZWZyZXNoUHJvY2VzcyhudWxsLCBhcHAucm9vdENvbnRyb2xsZXIpO1xuXG4gICAgcmV0dXJuIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgICAgYXBwLnRhZ05hbWVzLFxuICAgICAgJGdsb2JhbERpdixcbiAgICAgIGFwcC5nbG9iYWxSb290Q29udHJvbGxlcixcbiAgICAgIHJlZnJlc2hQcm9jZXNzLFxuICAgICkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICAgIGFwcC50YWdOYW1lcyxcbiAgICAgICAgZ2V0Qm9keSgpLFxuICAgICAgICBhcHAucm9vdENvbnRyb2xsZXIsXG4gICAgICAgIHJlZnJlc2hQcm9jZXNzLFxuICAgICAgKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuXG4gIHVwZGF0ZUpxdWVyeTogKCkgPT4ge1xuICAgICQuZm4uc2FmZVJlcGxhY2UgPSBmdW5jdGlvbiAoJGVsZW0pIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZVJlcGxhY2UoJCh0aGlzKSwgJGVsZW0pO1xuICAgIH07XG4gICAgJC5mbi5zYWZlRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXBwLnNhZmVFbXB0eSgkKHRoaXMpKTtcbiAgICB9O1xuICAgICQuZm4uc2FmZVJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkKHRoaXMpKTtcbiAgICB9O1xuICB9LFxuXG4gIGNvbnRyb2xsZXJUb1RhZzogKENvbnRyb2xsZXIpID0+IHtcbiAgICBsZXQgdGFnTmFtZSA9IGNhbWVsQ2FzZVRvVGFnTmFtZShDb250cm9sbGVyLm5hbWUpO1xuICAgIHJldHVybiB0YWdOYW1lLnJlcGxhY2UoLy1jb250cm9sbGVyJC8sIFwiXCIpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqL1xuICByZWdpc3Rlckdsb2JhbDogKENvbnRyb2xsZXIpID0+IHtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhcHAucmVnaXN0ZXIoQ29udHJvbGxlcik7XG4gICAgbGV0IHRhZ05hbWUgPSBDb250cm9sbGVyLnByb3RvdHlwZS5fdGFnTmFtZTtcbiAgICBpZiAoIUdsb2JhbC5pbmNsdWRlcyh0YWdOYW1lKSkge1xuICAgICAgR2xvYmFsLnB1c2godGFnTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyYXRpb247XG4gIH0sXG5cbiAgY2xlYW5DYWNoZTogKCkgPT4ge1xuICAgIGNsZWFuQ2FjaGUoKTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gQ29udHJvbGxlclxuICAgKiBAcGFyYW0gb3ZlcndyaXRlXG4gICAqL1xuICByZWdpc3RlcjogKENvbnRyb2xsZXIsIG92ZXJ3cml0ZSA9IGZhbHNlKSA9PiB7XG4gICAgbGV0IHRhZ05hbWUgPSBhcHAuY29udHJvbGxlclRvVGFnKENvbnRyb2xsZXIpO1xuICAgIGlmICghY29udHJvbGxlckxpc3RbdGFnTmFtZV0gfHwgb3ZlcndyaXRlKSB7XG4gICAgICBjb250cm9sbGVyTGlzdFt0YWdOYW1lXSA9IFtDb250cm9sbGVyLCBbXV07XG4gICAgICBDb250cm9sbGVyLnByb3RvdHlwZS5fdGFnTmFtZSA9IHRhZ05hbWU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IG1peGlucyBDb250cm9sbGVyIHRhZyBuYW1lc1xuICAgICAgICAgKi9cbiAgICAgICAgYWRkTWl4aW46ICguLi5taXhpbnMpID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBtaXhpbiBvZiBtaXhpbnMpIHtcbiAgICAgICAgICAgIGxldCBtaXhpbk5hbWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1peGluID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgIG1peGluTmFtZSA9IGNhbWVsQ2FzZVRvVGFnTmFtZShtaXhpbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1peGluKSB7XG4gICAgICAgICAgICAgIG1peGluTmFtZSA9IGFwcC5jb250cm9sbGVyVG9UYWcobWl4aW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMV0ucHVzaChtaXhpbk5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhZGRNaXhpbjogKC4uLm1peGlucykgPT4ge30sXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBwb3N0OiAoY29udHJvbGxlciwgdXJsLCBhcmdzKSA9PiB7XG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgYXJncy5DU1JGX1RPS0VOID0gYXBwLkNTUkZfVE9LRU47XG4gICAgcmV0dXJuIGFwcC5hamF4KGNvbnRyb2xsZXIsIHVybCwgYXJncywgJC5wb3N0KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBnZXQ6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MpID0+IHtcbiAgICByZXR1cm4gYXBwLmFqYXgoY29udHJvbGxlciwgdXJsLCBhcmdzLCAkLmdldCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgJC5nZXQgb3IgJC5wb3N0XG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBhamF4OiAoY29udHJvbGxlciwgdXJsLCBhcmdzLCBtZXRob2QpID0+IHtcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICBhcmdzLlZFUlNJT04gPSBhcHAuVkVSU0lPTjtcbiAgICBhcmdzLl9tZXRob2QgPSBhcmdzLl9tZXRob2QgfHwgXCJhcGlcIjtcblxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXR1cm4gbWV0aG9kKHVybCwgYXJncylcbiAgICAgICAgLnRoZW4oKGEsIGIsIGMpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGEsIGIsIGMpO1xuICAgICAgICAgIGlmIChhLnN0YXR1cyA9PT0gXCJyZWRpcmVjdFwiKSB7XG4gICAgICAgICAgICByZWRpcmVjdG9yKGEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBhcHAucmVmcmVzaChjb250cm9sbGVyLiRjb250YWluZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGEsIGIsIGMpID0+IHtcbiAgICAgICAgICAvLyBzZW5kX3JlZGlyZWN0KCkgYW5zd2VycyB3aXRoIEhUVFAgMzAxIGFuZCB0aGUgcmVkaXJlY3QgaW4gdGhlIEpTT04gYm9keS5cbiAgICAgICAgICBpZiAoYS5zdGF0dXMgPT09IDMwMSAmJiBhLnJlc3BvbnNlSlNPTikge1xuICAgICAgICAgICAgYSA9IGEucmVzcG9uc2VKU09OO1xuICAgICAgICAgICAgcmVkaXJlY3RvcihhKTtcbiAgICAgICAgICAgIHJlc29sdmUoYSwgYiwgYyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChhLCBiLCBjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHA7XG4gIH0sXG5cbiAgc3VibWl0Rm9ybUFuZFVwZGF0ZVZpZXc6IChjb250cm9sbGVyLCBmb3JtLCB1cmwsIG1ldGhvZCkgPT4ge1xuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcblxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB1cGxvYWRGaWxlRm9ybURhdGEoZm9ybURhdGEsIHVybCB8fCBmb3JtLmFjdGlvbiwgbWV0aG9kIHx8IGZvcm0ubWV0aG9kKVxuICAgICAgICAudGhlbigoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIHJlc29sdmUoYSwgYiwgYyk7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGFwcC5yZWZyZXNoKGNvbnRyb2xsZXIuJGNvbnRhaW5lciwgY29udHJvbGxlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIGlmIChhLnN0YXR1cyA9PT0gMzAxKSB7XG4gICAgICAgICAgICBhID0gYS5yZXNwb25zZUpTT047XG4gICAgICAgICAgICByZWRpcmVjdG9yKGEpO1xuICAgICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGEsIGIsIGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcDtcbiAgfSxcblxuICBzdWJtaXRGb3JtOiAoZm9ybSwgdXJsLCBtZXRob2QpID0+IHtcbiAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwbG9hZEZpbGVGb3JtRGF0YShmb3JtRGF0YSwgdXJsIHx8IGZvcm0uYWN0aW9uLCBtZXRob2QgfHwgZm9ybS5tZXRob2QpXG4gICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1cbiAgICogQHJldHVybiB7QWJzdHJhY3RTREN9XG4gICAqL1xuICBnZXRDb250cm9sbGVyOiAoJGVsZW0pID0+IGdldENvbnRyb2xsZXIoJGVsZW0pLFxuXG4gIC8qKlxuICAgKiBzYWZlRW1wdHkgcmVtb3ZlcyBhbGwgY29udGVudCBvZiBhIGRvbVxuICAgKiBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBET00gY29udGFpbmVyIHRvIGJlIGVtcHR5ZWRcbiAgICovXG4gIHNhZmVFbXB0eTogKCRlbGVtKSA9PiB7XG4gICAgbGV0ICRjaGlsZHJlbiA9ICRlbGVtLmNoaWxkcmVuKCk7XG4gICAgJGNoaWxkcmVuLmVhY2goZnVuY3Rpb24gKF8sIGVsZW1lbnQpIHtcbiAgICAgIGxldCAkZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICBhcHAuc2FmZVJlbW92ZSgkZWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGVsZW07XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNhZmVSZXBsYWNlIHJlbW92ZXMgYWxsIGNvbnRlbnQgb2YgYSBkb21cbiAgICogYW5kIGRlbGV0ZXMgYWxsIGNoaWxkIGNvbnRyb2xsZXIgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gJGVsZW0gLSBqUXVlcnkgRE9NIHRvIGJlIHJlcGxlYWNlZFxuICAgKiBAcGFyYW0gJG5ldyAtIGpRdWVyeSBuZXcgRE9NIGNvbnRhaW5lclxuICAgKi9cbiAgc2FmZVJlcGxhY2U6ICgkZWxlbSwgJG5ldykgPT4ge1xuICAgICRuZXcuaW5zZXJ0QmVmb3JlKCRlbGVtKTtcbiAgICByZXR1cm4gYXBwLnNhZmVSZW1vdmUoJGVsZW0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzYWZlUmVtb3ZlIHJlbW92ZXMgYSBkb20gYW5kIGRlbGV0ZXMgYWxsIGNoaWxkIGNvbnRyb2xsZXIgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gJGVsZW0gLSBqUXVlcnkgRG9tXG4gICAqL1xuICBzYWZlUmVtb3ZlOiAoJGVsZW0pID0+IHtcbiAgICAkZWxlbS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCAkdGhpcyA9ICQodGhpcyk7XG4gICAgICBpZiAoJHRoaXMuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApKSB7XG4gICAgICAgICR0aGlzLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICRlbGVtLmZpbmQoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gJCh0aGlzKS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG4gICAgICBjb250cm9sbGVyICYmIGNvbnRyb2xsZXIucmVtb3ZlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGVsZW0ucmVtb3ZlKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxqUXVlcnk+fVxuICAgKi9cbiAgcmVsb2FkQ29udHJvbGxlcjogKGNvbnRyb2xsZXIpID0+IHtcbiAgICByZXR1cm4gcmVsb2FkSFRNTENvbnRyb2xsZXIoY29udHJvbGxlcikudGhlbigoaHRtbCkgPT4ge1xuICAgICAgaWYgKGh0bWwgPT09IFZJRVdfUkVESVJFQ1QpIHJldHVybjtcbiAgICAgIGxldCAkaHRtbCA9ICQoaHRtbCk7XG4gICAgICByZXR1cm4gYXBwLnJlY29uY2lsZShjb250cm9sbGVyLCAkaHRtbCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAgICogQHBhcmFtIHtqcXVlcnl9ICR2aXJ0dWFsTm9kZVxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJHJlYWxOb2RlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gICAqL1xuICByZWNvbmNpbGU6IChjb250cm9sbGVyLCAkdmlydHVhbE5vZGUsICRyZWFsTm9kZSA9IG51bGwsIHByb2Nlc3MgPSBudWxsKSA9PiB7XG4gICAgY29uc3QgaXNDb250YWluZXIgPSAhJHJlYWxOb2RlO1xuICAgIGlmIChpc0NvbnRhaW5lcikge1xuICAgICAgbGV0ICR0ZW1wID0gY29udHJvbGxlci4kY29udGFpbmVyLmNsb25lKCkuZW1wdHkoKTtcbiAgICAgICR0ZW1wLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgbnVsbCk7XG4gICAgICAkdGVtcC5yZW1vdmVDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgICAgICR0ZW1wLmFwcGVuZCgkdmlydHVhbE5vZGUpO1xuICAgICAgJHZpcnR1YWxOb2RlID0gJHRlbXA7XG4gICAgfVxuXG4gICAgJHJlYWxOb2RlID0gJHJlYWxOb2RlID8/IGNvbnRyb2xsZXIuJGNvbnRhaW5lcjtcblxuICAgIGNvbnN0IHsgcmVmcmVzaFByb2Nlc3MsIGlzUnVubmluZ1Byb2Nlc3MgfSA9IHByZXBhcmVSZWZyZXNoUHJvY2VzcyhcbiAgICAgIHByb2Nlc3MsXG4gICAgICBjb250cm9sbGVyLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVmcmVzaCgkdmlydHVhbE5vZGUsIGNvbnRyb2xsZXIsIHJlZnJlc2hQcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICAgIHJlY29uY2lsZSgkdmlydHVhbE5vZGUsICRyZWFsTm9kZSk7XG4gICAgICBpZiAoaXNDb250YWluZXIpIHtcbiAgICAgICAgLy8gJHZpcnR1YWxOb2RlIGlzIGEgc3RyaXBwZWQgY2xvbmUgb2YgdGhlIGNvbnRhaW5lcjogc3luY2luZyBpdHNcbiAgICAgICAgLy8gYXR0cmlidXRlcyBhbmQgZGF0YSBvbnRvIHRoZSBjb250YWluZXIgcmVtb3ZlZCB0aGUgY29udHJvbGxlclxuICAgICAgICAvLyBjbGFzcyBhbmQgdGhlIGJhY2stbGluayB0byB0aGUgY29udHJvbGxlci4gUmVzdG9yZSBib3RoLlxuICAgICAgICBjb250cm9sbGVyLiRjb250YWluZXJcbiAgICAgICAgICAuYWRkQ2xhc3MoQ09OVFJPTExFUl9DTEFTUylcbiAgICAgICAgICAuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBjb250cm9sbGVyKTtcbiAgICAgIH1cbiAgICAgIHJlc2V0Q2hpbGRyZW4oY29udHJvbGxlcik7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250cm9sbGVyO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJGRvbVxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcmVmcmVzaDogKCRkb20sIGxlYWZDb250cm9sbGVyID0gbnVsbCkgPT4ge1xuICAgIHJldHVybiByZWZyZXNoKCRkb20sIGxlYWZDb250cm9sbGVyKTtcbiAgfSxcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_main.js\n\n}");
|
|
78
78
|
|
|
79
79
|
/***/ },
|
|
80
80
|
|
|
@@ -144,7 +144,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
144
144
|
\******************************************/
|
|
145
145
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
146
146
|
|
|
147
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CONTROLLER_CLASS: () => (/* binding */ CONTROLLER_CLASS),\n/* harmony export */ DATA_CONTROLLER_KEY: () => (/* binding */ DATA_CONTROLLER_KEY),\n/* harmony export */ cleanCache: () => (/* binding */ cleanCache),\n/* harmony export */ getController: () => (/* binding */ getController),\n/* harmony export */ loadFilesFromController: () => (/* binding */ loadFilesFromController),\n/* harmony export */ reconcile: () => (/* binding */ reconcile),\n/* harmony export */ refresh: () => (/* binding */ refresh),\n/* harmony export */ reloadHTMLController: () => (/* binding */ reloadHTMLController),\n/* harmony export */ reloadMethodHTML: () => (/* binding */ reloadMethodHTML),\n/* harmony export */ replaceTagElementsInContainer: () => (/* binding */ replaceTagElementsInContainer),\n/* harmony export */ runControllerFillContent: () => (/* binding */ runControllerFillContent)\n/* harmony export */ });\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\n/**\n * List of HTML files.\n * @type {{}}\n */\nlet htmlFiles = {};\n\nconst DATA_CONTROLLER_KEY = \"_controller_\";\nconst CONTROLLER_CLASS = \"_sdc_controller_\";\n\nfunction cleanCache() {\n htmlFiles = {};\n}\n\n/**\n * findSdcTgs Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. It collects all those\n * doms and returns a list of objects containing also the tag name the dom and the tag\n * names of the super controller\n *\n * @param {jquery} $container - jQuery container\n * @param {Array<string>} tagNameList - a string list with tag names.\n * @param {AbstractSDC} parentController - controller in surrounding\n * @return {Array} - a array of objects with all register tags found\n */\nfunction findSdcTgs($container, tagNameList, parentController) {\n if (!$container) {\n return [];\n }\n let $children = $container.children();\n let emptyList = [];\n $children.each(function (_, element) {\n let $element = $(element);\n let tagName = $element.prop(\"tagName\").toLowerCase().split(\"_\");\n if ($.inArray(tagName[0], tagNameList) >= 0) {\n emptyList.push({\n tag: tagName[0],\n super: tagName.splice(1) || [],\n dom: $element,\n });\n } else if (tagName[0].startsWith(\"this.\")) {\n $element.addClass(\n `_bind_to_update_handler sdc_uuid_${parentController._uuid}`,\n );\n } else {\n emptyList = emptyList.concat(\n findSdcTgs($element, tagNameList, parentController),\n );\n }\n });\n\n return emptyList;\n}\n\n/**\n * replacePlaceholderController fills the parameter of the content\n * url this function uses the tag parameter\n *\n * @param controller - controller object\n * @param url - the origin content URL\n * @param urlValues - values for the url placeholder. In same order!!\n * @returns {string} - the correct URL with prefix.\n */\nfunction replacePlaceholderController(controller, url, urlValues) {\n for (let key_idx in controller._urlParams) {\n if (Object.hasOwn(controller._urlParams, key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n const val = urlValues[key];\n if(!val) {\n console.warn(`${key} is not set for controller ${ controller._tagName }`);\n }\n url = url.replace(re, val);\n }\n }\n\n return url;\n}\n\n/**\n * loadHTMLFile loads the HTML content file from the server via ajax request.\n *\n * If the HTML file is loaded already the function takes no action.\n *\n * @param {AbstractSDC} controller - a content URL from the controller.\n * @param {object} args - get args.\n * @returns {Promise<jQuery|Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(controller, args) {\n const { contentUrl, _tagName, contentReload } = controller;\n if (!contentUrl) {\n return Promise.resolve(false);\n } else if (htmlFiles[_tagName]) {\n return Promise.resolve(htmlFiles[_tagName]);\n }\n\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = \"content\";\n\n return $.get(contentUrl, args)\n .then(function (data) {\n if (!contentReload) {\n htmlFiles[_tagName] = data;\n }\n\n return data;\n })\n .catch(function (err) {\n if (err.status === 301) {\n const data = err.responseJSON;\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"_RedirectOnView\", data[\"url-link\"]);\n if (!contentReload) {\n controller.autoRedirect = data[\"url-link\"];\n }\n return '<p>Redirected</p>';\n }\n controller.autoRedirect = null;\n if (typeof controller.confirmPageLoaded === \"function\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"navLoaded\", { controller_name: () => err.status });\n }\n\n throw `<sdc-error data-code=\"${err.status}\">${err.responseText}</sdc-error>`;\n });\n}\n\n/**\n * replaceAllTagElementsInContainer replaces all registered tags by the controller.\n * In this step the life-cycle starts.\n *\n * @param {jquery} $container - given container\n * @param {AbstractSDC} parentController - parent contoller surrounded the container\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceAllTagElementsInContainer(\n $container,\n parentController,\n process = null,\n) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $container,\n parentController,\n process,\n );\n}\n\n/**\n * parseContentUrl uses the content URL prefix to marge the\n * correct URL. Also parses the url parameter\n *\n * @param {AbstractSDC} controller - controller object\n * @returns {{url: String, args: Array}} - the correct URL with prefix.\n */\nfunction parseContentUrl(controller) {\n let url = controller.contentUrl;\n if (controller && controller._urlParams.length === 0) {\n let re = /%\\(([^)]+)\\)\\w/gm;\n let matches;\n controller._urlParams = [];\n while ((matches = re.exec(url))) {\n controller._urlParams.push(matches[1]);\n controller.contentReload = true;\n }\n }\n\n let { args, params } = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.getUrlParam)(controller, controller.$container);\n if (controller._urlParams.length) {\n url = replacePlaceholderController(controller, url, params);\n }\n\n controller.parsedContentUrl = url;\n\n return { url: url, args };\n}\n\n/**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\nfunction getController($elem) {\n if ($elem.hasClass(CONTROLLER_CLASS)) {\n return $elem.data(`${DATA_CONTROLLER_KEY}`);\n }\n return $elem.closest(`.${CONTROLLER_CLASS}`).data(`${DATA_CONTROLLER_KEY}`);\n}\n\n/**\n * loadFilesFromController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n * The content is saved as jQuery object to the controller.$content property of\n * the controller.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction loadFilesFromController(controller) {\n let getElements = { args: {} };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n\n return Promise.all([loadHTMLFile(controller, getElements.args)]).then(\n function (results) {\n let htmlFile = results[0];\n if (htmlFile) {\n try {\n return $(htmlFile);\n } catch {\n return $(\"<div></div>\").append(htmlFile);\n }\n }\n\n return null;\n },\n );\n}\n\n/**\n * reloadHTMLController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n *\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction reloadHTMLController(controller) {\n if (controller.contentUrl) {\n let getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller, getElements.args);\n }\n\n return new Promise((resolve) => {\n resolve($());\n });\n}\n\n/**\n *\n * @param {jquery} $element\n * @param {string} tagName\n * @param {Array<string>} superTagNameList\n * @param {AbstractSDC} parentController\n * @param {Object} process - Process object containing the refresh process\n * @returns {Promise}\n */\nfunction runReplaceTagElementsInContainer(\n $element,\n tagName,\n superTagNameList,\n parentController,\n process,\n) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n\n\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, process);\n}\n\n/**\n * runControllerFillContent empties the registered tag and replaces it by the controller\n * content. It sets the CSS tags for the relation with the CSS files.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html, process = null) {\n if ($html && $html.length > 0) {\n controller.$container.empty();\n controller.$container.attr(controller._tagName, \"\");\n for (let mixinKey in controller._mixins) {\n controller.$container.attr(controller._mixins[mixinKey]._tagName, \"\");\n }\n controller.$container.append($html);\n }\n\n return replaceAllTagElementsInContainer(\n controller.$container,\n controller,\n process,\n );\n}\n\n/**\n * replaceTagElementsInContainer Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. For each registered tag it loads the content.\n * Afterwards it starts the life cycle of the controller. I the next step it starts the\n * procedure for the child elements of the controller tag.\n *\n * @param {Array<string>} tagList - list of all registered tags\n * @param {jquery} $container - jQuery container to find the tags\n * @param {AbstractSDC} parentController - controller in surrounding\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceTagElementsInContainer(\n tagList,\n $container,\n parentController,\n process,\n) {\n return new Promise((resolve) => {\n let tagDescriptionElements = findSdcTgs(\n $container,\n tagList,\n parentController,\n );\n let tagCount = tagDescriptionElements.length;\n\n if (tagCount === 0) {\n return resolve();\n }\n\n for (\n let elementIndex = 0;\n elementIndex < tagDescriptionElements.length;\n elementIndex++\n ) {\n runReplaceTagElementsInContainer(\n tagDescriptionElements[elementIndex].dom,\n tagDescriptionElements[elementIndex].tag,\n tagDescriptionElements[elementIndex].super,\n parentController,\n process,\n ).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\n\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(\n controller,\n $container ?? controller.$container,\n process,\n );\n}\n\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n\n $dom\n .find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`)\n .each(function () {\n const $this = $(this);\n let result = undefined;\n if ($this.hasClass(`_with_handler`)) {\n result = $this.data(\"handler\");\n } else {\n let controller_handler = this.tagName\n .toLowerCase()\n .replace(/^this./, \"\");\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n\n if (typeof result === \"function\") {\n const newData = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.prepareData)($this.data(), controller);\n result = result.bind(controller)(newData);\n }\n if (result) {\n plist.push(\n Promise.resolve(result).then((x) => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n\n if ($this.html() === \"\") {\n $this.append(\"<div></div>\");\n }\n\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(\n controller,\n $newContent,\n $this.children(),\n process,\n );\n }),\n );\n }\n });\n\n return Promise.all(plist);\n}\n\nfunction getNodeKey(node) {\n if (node[0].nodeType === 3) {\n return `TEXT__${node[0].nodeValue}`;\n }\n const res = [node[0].tagName];\n if (node[0].nodeName === \"INPUT\") {\n [\n [\"name\", \"\"],\n [\"type\", \"text\"],\n [\"id\", \"\"],\n ].forEach(([key, defaultValue]) => {\n const attr = node.attr(key) ?? defaultValue;\n if (attr) {\n res.push(attr);\n }\n });\n }\n return res.join(\"__\");\n}\n\nfunction reconcileTree({ $element, id = [], parent = null }) {\n id.push(getNodeKey($element));\n const obj = {\n $element,\n id: id.join(\"::\"),\n depth: id.length,\n idx: 0,\n getRealParent: () => parent,\n getIdx: function () {\n this.idx = Math.max(\n 0,\n (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1,\n );\n return this.idx;\n },\n op: null,\n parent,\n };\n obj.getIdx.bind(obj);\n return [obj].concat(\n $element\n .contents()\n .toArray()\n .map((x) =>\n reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj,\n }),\n )\n .flat(),\n );\n}\n\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({ $element: $realNode });\n const $new = reconcileTree({ $element: $virtualNode });\n $old.map((x, i) => (x.idx = i));\n $new.map((x, i) => (x.idx = i));\n const depth = Math.max(...$new.concat($old).map((x) => x.depth));\n const op_steps = lcbDiff($old, $new, depth);\n let toRemove = [];\n // Controllers of kept real nodes that get a new controller instance from\n // their virtual counterpart (syncAttributes overwrites the data link).\n const replacedControllers = [];\n window.MAIN = $realNode;\n window.OPS = op_steps;\n\n op_steps.forEach((op_step, i) => {\n const { op, $element, idx } = op_step;\n\n if (op.type === \"keep_counterpart\") {\n // The root of the real tree is the reconcile target and never moves;\n // its index among its own (real) siblings is irrelevant.\n let cIdx = op_step.parent ? op.counterpart.getIdx() : idx;\n if (cIdx !== idx) {\n const elemBefore = op_step.getBefore();\n if (!elemBefore) {\n op_step.getRealParent().$element.prepend(op.counterpart.$element);\n } else {\n op.counterpart.$element.insertAfter(elemBefore.$element);\n }\n }\n\n if (op_step.parent) {\n const oldController = op.counterpart.$element.data(DATA_CONTROLLER_KEY);\n if (\n oldController &&\n oldController !== $element.data(DATA_CONTROLLER_KEY)\n ) {\n replacedControllers.push(oldController);\n }\n }\n\n syncAttributes(op.counterpart.$element, $element);\n if ($element.hasClass(CONTROLLER_CLASS)) {\n $element.data(DATA_CONTROLLER_KEY).$container = op.counterpart.$element;\n $element.data(DATA_CONTROLLER_KEY, null);\n }\n\n toRemove.push($element);\n } else if (op.type === \"delete\") {\n $element.safeRemove();\n } else if (op.type === \"insert\") {\n const { after, target } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n\n toRemove.forEach(($element) => $element.safeRemove());\n removeReplacedControllers(replacedControllers);\n}\n\n/**\n * Removes controllers whose DOM node was kept by reconcile but now belongs to\n * a new controller instance. remove() also removes the controller's\n * $container, so the old controllers are detached from the kept nodes first.\n * They are removed innermost first (reverse document order): each child takes\n * itself out of its parent's child list, so a parent never removes a child a\n * second time.\n *\n * @param {Array<AbstractSDC>} controllers - in document order\n */\nfunction removeReplacedControllers(controllers) {\n controllers.forEach((controller) => {\n controller.$container = $();\n });\n controllers.reverse().forEach((controller) => controller.remove());\n}\n\n/**\n * Replace the event listeners added by sdcDom (JSX on* props) on a kept node\n * with the listeners of its new virtual counterpart.\n */\nfunction syncListeners(real, virtual) {\n if (!real || !virtual || (!real._sdcListeners && !virtual._sdcListeners)) {\n return;\n }\n (real._sdcListeners ?? []).forEach(([type, fn]) => real.removeEventListener(type, fn));\n const listeners = virtual._sdcListeners ?? [];\n listeners.forEach(([type, fn]) => real.addEventListener(type, fn));\n real._sdcListeners = listeners;\n}\n\nfunction syncAttributes($real, $virtual) {\n syncListeners($real[0], $virtual[0]);\n const realAttrs = $real[0].attributes ?? [];\n const virtualAttrs = $virtual[0].attributes ?? [];\n // Remove missing attrs\n [...realAttrs].forEach((attr) => {\n if (!$virtual.is(`[${attr.name}]`)) {\n $real.removeAttr(attr.name);\n }\n });\n\n // Add or update (data-* too: libraries such as Bootstrap read\n // data-bs-target etc. from the attribute, not from jQuery's data cache)\n [...virtualAttrs].forEach((attr) => {\n if ($real.attr(attr.name) !== attr.value) {\n $real.attr(attr.name, attr.value);\n }\n });\n\n $real.removeData();\n Object.entries($virtual.data()).forEach(([key, value]) => {\n $real.data(key, value);\n });\n}\n\n/**\n * LCB (Longest Common Branch) finds matching branches and reserves them!\n *\n * @param oldNodes\n * @param newNodes\n * @param depth\n * @returns {*|*[]}\n */\nfunction lcbDiff(oldNodes, newNodes, depth) {\n newNodes\n .filter((x) => x.depth === depth && !x.op)\n .forEach((newNode) => {\n const oldNode = oldNodes.find((tempOldNode) => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = { type: \"keep\", idx: newNode.idx };\n newNode.op = { type: \"keep_counterpart\", counterpart: oldNode };\n oldNode = oldNode.parent;\n newNode = newNode.parent;\n if (!oldNode || oldNode.op || newNode?.op) {\n return;\n }\n keepTreeBranch(oldNode, newNode);\n };\n keepTreeBranch(oldNode, newNode);\n }\n });\n if (depth > 1) {\n return lcbDiff(oldNodes, newNodes, depth - 1);\n }\n\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = { type: \"delete\", idx };\n }\n });\n\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === \"keep_counterpart\"\n ? element.parent.op.counterpart\n : element.parent;\n }\n\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 1 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === \"keep_counterpart\"\n ? element.op.counterpart\n : element;\n }\n }\n\n return null;\n }\n\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === \"insert\" ? \"insert_ignore\" : \"insert\";\n x.op = { type, target, after: x.getBefore() };\n }\n });\n\n const tagged = [...oldNodes, ...newNodes];\n\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n\n return aVal - bVal;\n });\n}\n\n/**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise<void>}\n */\n\nfunction refresh($dom, leafController, process = null) {\n if (!leafController) {\n leafController = getController($dom);\n }\n\n if (!leafController) {\n return Promise.resolve();\n }\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(\n process,\n leafController,\n );\n\n $dom ??= leafController.$container;\n\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $dom,\n leafController,\n process,\n ).then(() => {\n return reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdmlldy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFLNkI7QUFDOEI7QUFDdkI7QUFDTTs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNBOztBQUVBO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxlQUFlO0FBQzFCLFdBQVcsYUFBYTtBQUN4QixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBLDRDQUE0Qyx1QkFBdUI7QUFDbkU7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixLQUFLLDZCQUE2QixxQkFBcUI7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQixhQUFhLHlCQUF5QjtBQUN0QztBQUNBO0FBQ0EsVUFBVSxzQ0FBc0M7QUFDaEQ7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLGlCQUFpQiw2Q0FBRztBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQU8sZ0JBQWdCLG1DQUFtQztBQUNsRTs7QUFFQSxxQ0FBcUMsV0FBVyxJQUFJLGlCQUFpQjtBQUNyRSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSw2Q0FBRztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsY0FBYywyQkFBMkI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsZUFBZSxFQUFFLDJEQUFXO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTztBQUNQO0FBQ0EseUJBQXlCLG9CQUFvQjtBQUM3QztBQUNBLDJCQUEyQixpQkFBaUIsV0FBVyxvQkFBb0I7QUFDM0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixhQUFhLGlCQUFpQjtBQUM5QjtBQUNPO0FBQ1Asc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsZUFBZTtBQUMxQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLGVBQWUscUVBQWlCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUywyRUFBdUI7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZUFBZTtBQUMxQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7QUFDSDs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDLGlCQUFpQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLDJEQUFXO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsNkNBQUc7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCLGtDQUFrQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQLCtCQUErQixxQkFBcUI7QUFDcEQsK0JBQStCLHdCQUF3QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksb0JBQW9COztBQUVoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTixjQUFjLGdCQUFnQjtBQUM5QjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9CQUFvQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixVQUFVO0FBQ25DO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLG1DQUFtQyxFQUFFLHlFQUFxQjtBQUNwRTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxJQUFJLDZDQUFHO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrRkFBOEI7QUFDdEM7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY192aWV3LmpzP2NhMDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY29udHJvbGxlckZhY3RvcnksXG4gIHByZXBhcmVSZWZyZXNoUHJvY2VzcyxcbiAgcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMsXG4gIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCxcbn0gZnJvbSBcIi4vc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7IGdldFVybFBhcmFtLCBwcmVwYXJlRGF0YSB9IGZyb20gXCIuL3NkY19wYXJhbXMuanNcIjtcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG4vKipcbiAqIExpc3Qgb2YgSFRNTCBmaWxlcy5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGh0bWxGaWxlcyA9IHt9O1xuXG5leHBvcnQgY29uc3QgREFUQV9DT05UUk9MTEVSX0tFWSA9IFwiX2NvbnRyb2xsZXJfXCI7XG5leHBvcnQgY29uc3QgQ09OVFJPTExFUl9DTEFTUyA9IFwiX3NkY19jb250cm9sbGVyX1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5DYWNoZSgpIHtcbiAgaHRtbEZpbGVzID0ge307XG59XG5cbi8qKlxuICogZmluZFNkY1RncyBGaW5kcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGluIGEgY29udGFpbmVyLiBCdXQgaXQgaWdub3Jlc1xuICogcmVnaXN0ZXJlZCB0YWdzIGluIHJlZ2lzdGVyZWQgdGFncy4gSXQgY29sbGVjdHMgYWxsIHRob3NlXG4gKiBkb21zIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYWxzbyB0aGUgdGFnIG5hbWUgdGhlIGRvbSBhbmQgdGhlIHRhZ1xuICogbmFtZXMgb2YgdGhlIHN1cGVyIGNvbnRyb2xsZXJcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXJcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTmFtZUxpc3QgLSBhIHN0cmluZyBsaXN0IHdpdGggdGFnIG5hbWVzLlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEByZXR1cm4ge0FycmF5fSAtIGEgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGFsbCByZWdpc3RlciB0YWdzIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGZpbmRTZGNUZ3MoJGNvbnRhaW5lciwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpIHtcbiAgaWYgKCEkY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGxldCAkY2hpbGRyZW4gPSAkY29udGFpbmVyLmNoaWxkcmVuKCk7XG4gIGxldCBlbXB0eUxpc3QgPSBbXTtcbiAgJGNoaWxkcmVuLmVhY2goZnVuY3Rpb24gKF8sIGVsZW1lbnQpIHtcbiAgICBsZXQgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIGxldCB0YWdOYW1lID0gJGVsZW1lbnQucHJvcChcInRhZ05hbWVcIikudG9Mb3dlckNhc2UoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKCQuaW5BcnJheSh0YWdOYW1lWzBdLCB0YWdOYW1lTGlzdCkgPj0gMCkge1xuICAgICAgZW1wdHlMaXN0LnB1c2goe1xuICAgICAgICB0YWc6IHRhZ05hbWVbMF0sXG4gICAgICAgIHN1cGVyOiB0YWdOYW1lLnNwbGljZSgxKSB8fCBbXSxcbiAgICAgICAgZG9tOiAkZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFnTmFtZVswXS5zdGFydHNXaXRoKFwidGhpcy5cIikpIHtcbiAgICAgICRlbGVtZW50LmFkZENsYXNzKFxuICAgICAgICBgX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgc2RjX3V1aWRfJHtwYXJlbnRDb250cm9sbGVyLl91dWlkfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbXB0eUxpc3QgPSBlbXB0eUxpc3QuY29uY2F0KFxuICAgICAgICBmaW5kU2RjVGdzKCRlbGVtZW50LCB0YWdOYW1lTGlzdCwgcGFyZW50Q29udHJvbGxlciksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVtcHR5TGlzdDtcbn1cblxuLyoqXG4gKiByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyIGZpbGxzIHRoZSBwYXJhbWV0ZXIgb2YgdGhlIGNvbnRlbnRcbiAqIHVybCB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIHRhZyBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcGFyYW0gdXJsIC0gdGhlIG9yaWdpbiBjb250ZW50IFVSTFxuICogQHBhcmFtIHVybFZhbHVlcyAtIHZhbHVlcyBmb3IgdGhlIHVybCBwbGFjZWhvbGRlci4gSW4gc2FtZSBvcmRlciEhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHVybFZhbHVlcykge1xuICBmb3IgKGxldCBrZXlfaWR4IGluIGNvbnRyb2xsZXIuX3VybFBhcmFtcykge1xuICAgIGlmIChPYmplY3QuaGFzT3duKGNvbnRyb2xsZXIuX3VybFBhcmFtcywga2V5X2lkeCkpIHtcbiAgICAgIGxldCBrZXkgPSBjb250cm9sbGVyLl91cmxQYXJhbXNba2V5X2lkeF07XG4gICAgICBsZXQgcmUgPSBSZWdFeHAoXCIlXFxcXChcIiArIGtleSArIFwiXFxcXClcXFxcd1wiLCBcImdtXCIpO1xuICAgICAgY29uc3QgdmFsID0gdXJsVmFsdWVzW2tleV07XG4gICAgICBpZighdmFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtrZXl9IGlzIG5vdCBzZXQgZm9yIGNvbnRyb2xsZXIgJHsgY29udHJvbGxlci5fdGFnTmFtZSB9YCk7XG4gICAgICB9XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZShyZSwgdmFsKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuXG4vKipcbiAqIGxvYWRIVE1MRmlsZSBsb2FkcyB0aGUgSFRNTCBjb250ZW50IGZpbGUgZnJvbSB0aGUgc2VydmVyIHZpYSBhamF4IHJlcXVlc3QuXG4gKlxuICogSWYgdGhlIEhUTUwgZmlsZSBpcyBsb2FkZWQgYWxyZWFkeSB0aGUgZnVuY3Rpb24gdGFrZXMgbm8gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGNvbnRlbnQgVVJMIGZyb20gdGhlIGNvbnRyb2xsZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGdldCBhcmdzLlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5fEJvb2xlYW4+fSAtIHdhaXRzIGZvciB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLCBhcmdzKSB7XG4gIGNvbnN0IHsgY29udGVudFVybCwgX3RhZ05hbWUsIGNvbnRlbnRSZWxvYWQgfSA9IGNvbnRyb2xsZXI7XG4gIGlmICghY29udGVudFVybCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9IGVsc2UgaWYgKGh0bWxGaWxlc1tfdGFnTmFtZV0pIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGh0bWxGaWxlc1tfdGFnTmFtZV0pO1xuICB9XG5cbiAgYXJncy5WRVJTSU9OID0gYXBwLlZFUlNJT047XG4gIGFyZ3MuX21ldGhvZCA9IFwiY29udGVudFwiO1xuXG4gIHJldHVybiAkLmdldChjb250ZW50VXJsLCBhcmdzKVxuICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBpZiAoIWNvbnRlbnRSZWxvYWQpIHtcbiAgICAgICAgaHRtbEZpbGVzW190YWdOYW1lXSA9IGRhdGE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVyci5yZXNwb25zZUpTT047XG4gICAgICAgIHRyaWdnZXIoXCJfUmVkaXJlY3RPblZpZXdcIiwgZGF0YVtcInVybC1saW5rXCJdKTtcbiAgICAgICAgaWYgKCFjb250ZW50UmVsb2FkKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hdXRvUmVkaXJlY3QgPSBkYXRhW1widXJsLWxpbmtcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICc8cD5SZWRpcmVjdGVkPC9wPic7XG4gICAgICB9XG4gICAgICBjb250cm9sbGVyLmF1dG9SZWRpcmVjdCA9IG51bGw7XG4gICAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXIuY29uZmlybVBhZ2VMb2FkZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cmlnZ2VyKFwibmF2TG9hZGVkXCIsIHsgY29udHJvbGxlcl9uYW1lOiAoKSA9PiBlcnIuc3RhdHVzIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBgPHNkYy1lcnJvciBkYXRhLWNvZGU9XCIke2Vyci5zdGF0dXN9XCI+JHtlcnIucmVzcG9uc2VUZXh0fTwvc2RjLWVycm9yPmA7XG4gICAgfSk7XG59XG5cbi8qKlxuICogcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIgcmVwbGFjZXMgYWxsIHJlZ2lzdGVyZWQgdGFncyBieSB0aGUgY29udHJvbGxlci5cbiAqIEluIHRoaXMgc3RlcCB0aGUgbGlmZS1jeWNsZSBzdGFydHMuXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBnaXZlbiBjb250YWluZXJcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBwYXJlbnQgY29udG9sbGVyIHN1cnJvdW5kZWQgdGhlIGNvbnRhaW5lclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICRjb250YWluZXIsXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gIHByb2Nlc3MgPSBudWxsLFxuKSB7XG4gIHBhcmVudENvbnRyb2xsZXIgPSBwYXJlbnRDb250cm9sbGVyIHx8ICRjb250YWluZXIuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKTtcbiAgcmV0dXJuIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgIGFwcC50YWdOYW1lcyxcbiAgICAkY29udGFpbmVyLFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgcHJvY2VzcyxcbiAgKTtcbn1cblxuLyoqXG4gKiBwYXJzZUNvbnRlbnRVcmwgdXNlcyB0aGUgY29udGVudCBVUkwgcHJlZml4IHRvIG1hcmdlIHRoZVxuICogY29ycmVjdCBVUkwuIEFsc28gcGFyc2VzIHRoZSB1cmwgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcmV0dXJucyB7e3VybDogU3RyaW5nLCBhcmdzOiBBcnJheX19IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcikge1xuICBsZXQgdXJsID0gY29udHJvbGxlci5jb250ZW50VXJsO1xuICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgbGV0IHJlID0gLyVcXCgoW14pXSspXFwpXFx3L2dtO1xuICAgIGxldCBtYXRjaGVzO1xuICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcyA9IFtdO1xuICAgIHdoaWxlICgobWF0Y2hlcyA9IHJlLmV4ZWModXJsKSkpIHtcbiAgICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5wdXNoKG1hdGNoZXNbMV0pO1xuICAgICAgY29udHJvbGxlci5jb250ZW50UmVsb2FkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBsZXQgeyBhcmdzLCBwYXJhbXMgfSA9IGdldFVybFBhcmFtKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuJGNvbnRhaW5lcik7XG4gIGlmIChjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoKSB7XG4gICAgdXJsID0gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHBhcmFtcyk7XG4gIH1cblxuICBjb250cm9sbGVyLnBhcnNlZENvbnRlbnRVcmwgPSB1cmw7XG5cbiAgcmV0dXJuIHsgdXJsOiB1cmwsIGFyZ3MgfTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2xsZXIoJGVsZW0pIHtcbiAgaWYgKCRlbGVtLmhhc0NsYXNzKENPTlRST0xMRVJfQ0xBU1MpKSB7XG4gICAgcmV0dXJuICRlbGVtLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgfVxuICByZXR1cm4gJGVsZW0uY2xvc2VzdChgLiR7Q09OVFJPTExFUl9DTEFTU31gKS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG59XG5cbi8qKlxuICogbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIgbG9hZHMgdGhlIGNvbnRlbnQgKEhUTUwpIG9mIGFcbiAqIENvbnRyb2xsZXIuIElmIHlvdSBoYXZlIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgVVJMIGlzIHJlZ2lzdGVyZWQsIGZvciB0aGlzXG4gKiBjb250cm9sbGVyIHRoZSBvcmlnaW4gY29udGVudCBVUkwgaXMgaWdub3JlZC5cbiAqXG4gKiBUaGUgY29udGVudCBpcyBzYXZlZCBhcyBqUXVlcnkgb2JqZWN0IHRvIHRoZSBjb250cm9sbGVyLiRjb250ZW50IHByb3BlcnR5IG9mXG4gKiB0aGUgY29udHJvbGxlci5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICBsZXQgZ2V0RWxlbWVudHMgPSB7IGFyZ3M6IHt9IH07XG4gIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW2xvYWRIVE1MRmlsZShjb250cm9sbGVyLCBnZXRFbGVtZW50cy5hcmdzKV0pLnRoZW4oXG4gICAgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGxldCBodG1sRmlsZSA9IHJlc3VsdHNbMF07XG4gICAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gJChodG1sRmlsZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiAkKFwiPGRpdj48L2Rpdj5cIikuYXBwZW5kKGh0bWxGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICApO1xufVxuXG4vKipcbiAqIHJlbG9hZEhUTUxDb250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkSFRNTENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICBpZiAoY29udHJvbGxlci5jb250ZW50VXJsKSB7XG4gICAgbGV0IGdldEVsZW1lbnRzID0gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgICByZXR1cm4gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIsIGdldEVsZW1lbnRzLmFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmVzb2x2ZSgkKCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0XG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgcHJvY2Vzcyxcbikge1xuICBsZXQgY29udHJvbGxlciA9ICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIGlmIChjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKCRlbGVtZW50LCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbiAgfVxuXG5cbiAgY29udHJvbGxlciA9IGNvbnRyb2xsZXJGYWN0b3J5KFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgJGVsZW1lbnQsXG4gICAgdGFnTmFtZSxcbiAgICBzdXBlclRhZ05hbWVMaXN0LFxuICApO1xuICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIGNvbnRyb2xsZXIpO1xuICAkZWxlbWVudC5hZGRDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zKGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCBlbXB0aWVzIHRoZSByZWdpc3RlcmVkIHRhZyBhbmQgcmVwbGFjZXMgaXQgYnkgdGhlIGNvbnRyb2xsZXJcbiAqIGNvbnRlbnQuIEl0IHNldHMgdGhlIENTUyB0YWdzIGZvciB0aGUgcmVsYXRpb24gd2l0aCB0aGUgQ1NTIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sLCBwcm9jZXNzID0gbnVsbCkge1xuICBpZiAoJGh0bWwgJiYgJGh0bWwubGVuZ3RoID4gMCkge1xuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5lbXB0eSgpO1xuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX3RhZ05hbWUsIFwiXCIpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIGNvbnRyb2xsZXIuX21peGlucykge1xuICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fbWl4aW5zW21peGluS2V5XS5fdGFnTmFtZSwgXCJcIik7XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hcHBlbmQoJGh0bWwpO1xuICB9XG5cbiAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lcixcbiAgICBjb250cm9sbGVyLFxuICAgIHByb2Nlc3MsXG4gICk7XG59XG5cbi8qKlxuICogcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEZvciBlYWNoIHJlZ2lzdGVyZWQgdGFnIGl0IGxvYWRzIHRoZSBjb250ZW50LlxuICogQWZ0ZXJ3YXJkcyBpdCBzdGFydHMgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIGNvbnRyb2xsZXIuIEkgdGhlIG5leHQgc3RlcCBpdCBzdGFydHMgdGhlXG4gKiBwcm9jZWR1cmUgZm9yIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29udHJvbGxlciB0YWcuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB0YWdMaXN0IC0gbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCB0YWdzXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXIgdG8gZmluZCB0aGUgdGFnc1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgdGFnTGlzdCxcbiAgJGNvbnRhaW5lcixcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgcHJvY2Vzcyxcbikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBsZXQgdGFnRGVzY3JpcHRpb25FbGVtZW50cyA9IGZpbmRTZGNUZ3MoXG4gICAgICAkY29udGFpbmVyLFxuICAgICAgdGFnTGlzdCxcbiAgICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgKTtcbiAgICBsZXQgdGFnQ291bnQgPSB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDtcblxuICAgIGlmICh0YWdDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBmb3IgKFxuICAgICAgbGV0IGVsZW1lbnRJbmRleCA9IDA7XG4gICAgICBlbGVtZW50SW5kZXggPCB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDtcbiAgICAgIGVsZW1lbnRJbmRleCsrXG4gICAgKSB7XG4gICAgICBydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLmRvbSxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnRhZyxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnN1cGVyLFxuICAgICAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICAgICBwcm9jZXNzLFxuICAgICAgKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGFnQ291bnQtLTtcbiAgICAgICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciwgcHJvY2Vzcykge1xuICByZXR1cm4gX3JlbG9hZE1ldGhvZEhUTUwoXG4gICAgY29udHJvbGxlcixcbiAgICAkY29udGFpbmVyID8/IGNvbnRyb2xsZXIuJGNvbnRhaW5lcixcbiAgICBwcm9jZXNzLFxuICApO1xufVxuXG5mdW5jdGlvbiBfcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyLCAkZG9tLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHBsaXN0ID0gW107XG5cbiAgJGRvbVxuICAgIC5maW5kKGAuX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIuc2RjX3V1aWRfJHtjb250cm9sbGVyLl91dWlkfWApXG4gICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgbGV0IHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICgkdGhpcy5oYXNDbGFzcyhgX3dpdGhfaGFuZGxlcmApKSB7XG4gICAgICAgIHJlc3VsdCA9ICR0aGlzLmRhdGEoXCJoYW5kbGVyXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGNvbnRyb2xsZXJfaGFuZGxlciA9IHRoaXMudGFnTmFtZVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLnJlcGxhY2UoL150aGlzLi8sIFwiXCIpO1xuICAgICAgICBpZiAoY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdKSB7XG4gICAgICAgICAgcmVzdWx0ID0gY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IHByZXBhcmVEYXRhKCR0aGlzLmRhdGEoKSwgY29udHJvbGxlcik7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5iaW5kKGNvbnRyb2xsZXIpKG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBwbGlzdC5wdXNoKFxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oKHgpID0+IHtcbiAgICAgICAgICAgIGxldCAkbmV3Q29udGVudCA9ICQoYDxkaXY+PC9kaXY+YCk7XG4gICAgICAgICAgICAkbmV3Q29udGVudC5hcHBlbmQoeCk7XG5cbiAgICAgICAgICAgIGlmICgkdGhpcy5odG1sKCkgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgJHRoaXMuYXBwZW5kKFwiPGRpdj48L2Rpdj5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhcHAucmVjb25jaWxlKFxuICAgICAgICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAkbmV3Q29udGVudCxcbiAgICAgICAgICAgICAgJHRoaXMuY2hpbGRyZW4oKSxcbiAgICAgICAgICAgICAgcHJvY2VzcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHBsaXN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlWzBdLm5vZGVUeXBlID09PSAzKSB7XG4gICAgcmV0dXJuIGBURVhUX18ke25vZGVbMF0ubm9kZVZhbHVlfWA7XG4gIH1cbiAgY29uc3QgcmVzID0gW25vZGVbMF0udGFnTmFtZV07XG4gIGlmIChub2RlWzBdLm5vZGVOYW1lID09PSBcIklOUFVUXCIpIHtcbiAgICBbXG4gICAgICBbXCJuYW1lXCIsIFwiXCJdLFxuICAgICAgW1widHlwZVwiLCBcInRleHRcIl0sXG4gICAgICBbXCJpZFwiLCBcIlwiXSxcbiAgICBdLmZvckVhY2goKFtrZXksIGRlZmF1bHRWYWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGF0dHIgPSBub2RlLmF0dHIoa2V5KSA/PyBkZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoYXR0cikge1xuICAgICAgICByZXMucHVzaChhdHRyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzLmpvaW4oXCJfX1wiKTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlVHJlZSh7ICRlbGVtZW50LCBpZCA9IFtdLCBwYXJlbnQgPSBudWxsIH0pIHtcbiAgaWQucHVzaChnZXROb2RlS2V5KCRlbGVtZW50KSk7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICAkZWxlbWVudCxcbiAgICBpZDogaWQuam9pbihcIjo6XCIpLFxuICAgIGRlcHRoOiBpZC5sZW5ndGgsXG4gICAgaWR4OiAwLFxuICAgIGdldFJlYWxQYXJlbnQ6ICgpID0+IHBhcmVudCxcbiAgICBnZXRJZHg6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuaWR4ID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgICh0aGlzLmdldFJlYWxQYXJlbnQoKT8uZ2V0SWR4KCkgPz8gLTEpICsgJGVsZW1lbnQuaW5kZXgoKSArIDEsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuaWR4O1xuICAgIH0sXG4gICAgb3A6IG51bGwsXG4gICAgcGFyZW50LFxuICB9O1xuICBvYmouZ2V0SWR4LmJpbmQob2JqKTtcbiAgcmV0dXJuIFtvYmpdLmNvbmNhdChcbiAgICAkZWxlbWVudFxuICAgICAgLmNvbnRlbnRzKClcbiAgICAgIC50b0FycmF5KClcbiAgICAgIC5tYXAoKHgpID0+XG4gICAgICAgIHJlY29uY2lsZVRyZWUoe1xuICAgICAgICAgICRlbGVtZW50OiAkKHgpLFxuICAgICAgICAgIGlkOiBpZC5zbGljZSgpLFxuICAgICAgICAgIHBhcmVudDogb2JqLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5mbGF0KCksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbmNpbGUoJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUpIHtcbiAgY29uc3QgJG9sZCA9IHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudDogJHJlYWxOb2RlIH0pO1xuICBjb25zdCAkbmV3ID0gcmVjb25jaWxlVHJlZSh7ICRlbGVtZW50OiAkdmlydHVhbE5vZGUgfSk7XG4gICRvbGQubWFwKCh4LCBpKSA9PiAoeC5pZHggPSBpKSk7XG4gICRuZXcubWFwKCh4LCBpKSA9PiAoeC5pZHggPSBpKSk7XG4gIGNvbnN0IGRlcHRoID0gTWF0aC5tYXgoLi4uJG5ldy5jb25jYXQoJG9sZCkubWFwKCh4KSA9PiB4LmRlcHRoKSk7XG4gIGNvbnN0IG9wX3N0ZXBzID0gbGNiRGlmZigkb2xkLCAkbmV3LCBkZXB0aCk7XG4gIGxldCB0b1JlbW92ZSA9IFtdO1xuICAvLyBDb250cm9sbGVycyBvZiBrZXB0IHJlYWwgbm9kZXMgdGhhdCBnZXQgYSBuZXcgY29udHJvbGxlciBpbnN0YW5jZSBmcm9tXG4gIC8vIHRoZWlyIHZpcnR1YWwgY291bnRlcnBhcnQgKHN5bmNBdHRyaWJ1dGVzIG92ZXJ3cml0ZXMgdGhlIGRhdGEgbGluaykuXG4gIGNvbnN0IHJlcGxhY2VkQ29udHJvbGxlcnMgPSBbXTtcbiAgd2luZG93Lk1BSU4gPSAkcmVhbE5vZGU7XG4gIHdpbmRvdy5PUFMgPSBvcF9zdGVwcztcblxuICBvcF9zdGVwcy5mb3JFYWNoKChvcF9zdGVwLCBpKSA9PiB7XG4gICAgY29uc3QgeyBvcCwgJGVsZW1lbnQsIGlkeCB9ID0gb3Bfc3RlcDtcblxuICAgIGlmIChvcC50eXBlID09PSBcImtlZXBfY291bnRlcnBhcnRcIikge1xuICAgICAgLy8gVGhlIHJvb3Qgb2YgdGhlIHJlYWwgdHJlZSBpcyB0aGUgcmVjb25jaWxlIHRhcmdldCBhbmQgbmV2ZXIgbW92ZXM7XG4gICAgICAvLyBpdHMgaW5kZXggYW1vbmcgaXRzIG93biAocmVhbCkgc2libGluZ3MgaXMgaXJyZWxldmFudC5cbiAgICAgIGxldCBjSWR4ID0gb3Bfc3RlcC5wYXJlbnQgPyBvcC5jb3VudGVycGFydC5nZXRJZHgoKSA6IGlkeDtcbiAgICAgIGlmIChjSWR4ICE9PSBpZHgpIHtcbiAgICAgICAgY29uc3QgZWxlbUJlZm9yZSA9IG9wX3N0ZXAuZ2V0QmVmb3JlKCk7XG4gICAgICAgIGlmICghZWxlbUJlZm9yZSkge1xuICAgICAgICAgIG9wX3N0ZXAuZ2V0UmVhbFBhcmVudCgpLiRlbGVtZW50LnByZXBlbmQob3AuY291bnRlcnBhcnQuJGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50Lmluc2VydEFmdGVyKGVsZW1CZWZvcmUuJGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcF9zdGVwLnBhcmVudCkge1xuICAgICAgICBjb25zdCBvbGRDb250cm9sbGVyID0gb3AuY291bnRlcnBhcnQuJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9sZENvbnRyb2xsZXIgJiZcbiAgICAgICAgICBvbGRDb250cm9sbGVyICE9PSAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcGxhY2VkQ29udHJvbGxlcnMucHVzaChvbGRDb250cm9sbGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzeW5jQXR0cmlidXRlcyhvcC5jb3VudGVycGFydC4kZWxlbWVudCwgJGVsZW1lbnQpO1xuICAgICAgaWYgKCRlbGVtZW50Lmhhc0NsYXNzKENPTlRST0xMRVJfQ0xBU1MpKSB7XG4gICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSkuJGNvbnRhaW5lciA9IG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50O1xuICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0b1JlbW92ZS5wdXNoKCRlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09IFwiZGVsZXRlXCIpIHtcbiAgICAgICRlbGVtZW50LnNhZmVSZW1vdmUoKTtcbiAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT09IFwiaW5zZXJ0XCIpIHtcbiAgICAgIGNvbnN0IHsgYWZ0ZXIsIHRhcmdldCB9ID0gb3Bfc3RlcC5vcDtcbiAgICAgIGlmIChhZnRlcikge1xuICAgICAgICAkZWxlbWVudC5pbnNlcnRBZnRlcihhZnRlci4kZWxlbWVudCk7XG4gICAgICB9IGVsc2UgaWYgKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuJGVsZW1lbnQucHJlcGVuZCgkZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICB0b1JlbW92ZS5mb3JFYWNoKCgkZWxlbWVudCkgPT4gJGVsZW1lbnQuc2FmZVJlbW92ZSgpKTtcbiAgcmVtb3ZlUmVwbGFjZWRDb250cm9sbGVycyhyZXBsYWNlZENvbnRyb2xsZXJzKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGNvbnRyb2xsZXJzIHdob3NlIERPTSBub2RlIHdhcyBrZXB0IGJ5IHJlY29uY2lsZSBidXQgbm93IGJlbG9uZ3MgdG9cbiAqIGEgbmV3IGNvbnRyb2xsZXIgaW5zdGFuY2UuIHJlbW92ZSgpIGFsc28gcmVtb3ZlcyB0aGUgY29udHJvbGxlcidzXG4gKiAkY29udGFpbmVyLCBzbyB0aGUgb2xkIGNvbnRyb2xsZXJzIGFyZSBkZXRhY2hlZCBmcm9tIHRoZSBrZXB0IG5vZGVzIGZpcnN0LlxuICogVGhleSBhcmUgcmVtb3ZlZCBpbm5lcm1vc3QgZmlyc3QgKHJldmVyc2UgZG9jdW1lbnQgb3JkZXIpOiBlYWNoIGNoaWxkIHRha2VzXG4gKiBpdHNlbGYgb3V0IG9mIGl0cyBwYXJlbnQncyBjaGlsZCBsaXN0LCBzbyBhIHBhcmVudCBuZXZlciByZW1vdmVzIGEgY2hpbGQgYVxuICogc2Vjb25kIHRpbWUuXG4gKlxuICogQHBhcmFtIHtBcnJheTxBYnN0cmFjdFNEQz59IGNvbnRyb2xsZXJzIC0gaW4gZG9jdW1lbnQgb3JkZXJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlUmVwbGFjZWRDb250cm9sbGVycyhjb250cm9sbGVycykge1xuICBjb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyID0gJCgpO1xuICB9KTtcbiAgY29udHJvbGxlcnMucmV2ZXJzZSgpLmZvckVhY2goKGNvbnRyb2xsZXIpID0+IGNvbnRyb2xsZXIucmVtb3ZlKCkpO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIGV2ZW50IGxpc3RlbmVycyBhZGRlZCBieSBzZGNEb20gKEpTWCBvbiogcHJvcHMpIG9uIGEga2VwdCBub2RlXG4gKiB3aXRoIHRoZSBsaXN0ZW5lcnMgb2YgaXRzIG5ldyB2aXJ0dWFsIGNvdW50ZXJwYXJ0LlxuICovXG5mdW5jdGlvbiBzeW5jTGlzdGVuZXJzKHJlYWwsIHZpcnR1YWwpIHtcbiAgaWYgKCFyZWFsIHx8ICF2aXJ0dWFsIHx8ICghcmVhbC5fc2RjTGlzdGVuZXJzICYmICF2aXJ0dWFsLl9zZGNMaXN0ZW5lcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIChyZWFsLl9zZGNMaXN0ZW5lcnMgPz8gW10pLmZvckVhY2goKFt0eXBlLCBmbl0pID0+IHJlYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbikpO1xuICBjb25zdCBsaXN0ZW5lcnMgPSB2aXJ0dWFsLl9zZGNMaXN0ZW5lcnMgPz8gW107XG4gIGxpc3RlbmVycy5mb3JFYWNoKChbdHlwZSwgZm5dKSA9PiByZWFsLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZm4pKTtcbiAgcmVhbC5fc2RjTGlzdGVuZXJzID0gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBzeW5jQXR0cmlidXRlcygkcmVhbCwgJHZpcnR1YWwpIHtcbiAgc3luY0xpc3RlbmVycygkcmVhbFswXSwgJHZpcnR1YWxbMF0pO1xuICBjb25zdCByZWFsQXR0cnMgPSAkcmVhbFswXS5hdHRyaWJ1dGVzID8/IFtdO1xuICBjb25zdCB2aXJ0dWFsQXR0cnMgPSAkdmlydHVhbFswXS5hdHRyaWJ1dGVzID8/IFtdO1xuICAvLyBSZW1vdmUgbWlzc2luZyBhdHRyc1xuICBbLi4ucmVhbEF0dHJzXS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgaWYgKCEkdmlydHVhbC5pcyhgWyR7YXR0ci5uYW1lfV1gKSkge1xuICAgICAgJHJlYWwucmVtb3ZlQXR0cihhdHRyLm5hbWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkIG9yIHVwZGF0ZSAoZGF0YS0qIHRvbzogbGlicmFyaWVzIHN1Y2ggYXMgQm9vdHN0cmFwIHJlYWRcbiAgLy8gZGF0YS1icy10YXJnZXQgZXRjLiBmcm9tIHRoZSBhdHRyaWJ1dGUsIG5vdCBmcm9tIGpRdWVyeSdzIGRhdGEgY2FjaGUpXG4gIFsuLi52aXJ0dWFsQXR0cnNdLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICBpZiAoJHJlYWwuYXR0cihhdHRyLm5hbWUpICE9PSBhdHRyLnZhbHVlKSB7XG4gICAgICAkcmVhbC5hdHRyKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICAkcmVhbC5yZW1vdmVEYXRhKCk7XG4gIE9iamVjdC5lbnRyaWVzKCR2aXJ0dWFsLmRhdGEoKSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgJHJlYWwuZGF0YShrZXksIHZhbHVlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTENCIChMb25nZXN0IENvbW1vbiBCcmFuY2gpIGZpbmRzIG1hdGNoaW5nIGJyYW5jaGVzIGFuZCByZXNlcnZlcyB0aGVtIVxuICpcbiAqIEBwYXJhbSBvbGROb2Rlc1xuICogQHBhcmFtIG5ld05vZGVzXG4gKiBAcGFyYW0gZGVwdGhcbiAqIEByZXR1cm5zIHsqfCpbXX1cbiAqL1xuZnVuY3Rpb24gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoKSB7XG4gIG5ld05vZGVzXG4gICAgLmZpbHRlcigoeCkgPT4geC5kZXB0aCA9PT0gZGVwdGggJiYgIXgub3ApXG4gICAgLmZvckVhY2goKG5ld05vZGUpID0+IHtcbiAgICAgIGNvbnN0IG9sZE5vZGUgPSBvbGROb2Rlcy5maW5kKCh0ZW1wT2xkTm9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gIXRlbXBPbGROb2RlLm9wICYmIHRlbXBPbGROb2RlLmlkID09PSBuZXdOb2RlLmlkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbGROb2RlKSB7XG4gICAgICAgIGNvbnN0IGtlZXBUcmVlQnJhbmNoID0gKG9sZE5vZGUsIG5ld05vZGUpID0+IHtcbiAgICAgICAgICBvbGROb2RlLm9wID0geyB0eXBlOiBcImtlZXBcIiwgaWR4OiBuZXdOb2RlLmlkeCB9O1xuICAgICAgICAgIG5ld05vZGUub3AgPSB7IHR5cGU6IFwia2VlcF9jb3VudGVycGFydFwiLCBjb3VudGVycGFydDogb2xkTm9kZSB9O1xuICAgICAgICAgIG9sZE5vZGUgPSBvbGROb2RlLnBhcmVudDtcbiAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnQ7XG4gICAgICAgICAgaWYgKCFvbGROb2RlIHx8IG9sZE5vZGUub3AgfHwgbmV3Tm9kZT8ub3ApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgICAgIH07XG4gICAgICAgIGtlZXBUcmVlQnJhbmNoKG9sZE5vZGUsIG5ld05vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICBpZiAoZGVwdGggPiAxKSB7XG4gICAgcmV0dXJuIGxjYkRpZmYob2xkTm9kZXMsIG5ld05vZGVzLCBkZXB0aCAtIDEpO1xuICB9XG5cbiAgb2xkTm9kZXMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgaWR4ID0gKG9sZE5vZGVzW2kgLSAxXT8ub3AuaWR4ID8/IC0xKSArIDE7XG4gICAgICB4Lm9wID0geyB0eXBlOiBcImRlbGV0ZVwiLCBpZHggfTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFJlYWxQYXJlbnQoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudC5wYXJlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wYXJlbnQub3AudHlwZSA9PT0gXCJrZWVwX2NvdW50ZXJwYXJ0XCJcbiAgICAgID8gZWxlbWVudC5wYXJlbnQub3AuY291bnRlcnBhcnRcbiAgICAgIDogZWxlbWVudC5wYXJlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCZWZvcmUoZWxlbWVudCwgaWR4KSB7XG4gICAgY29uc3Qgc3RhcnREZXB0aCA9IGVsZW1lbnQuZGVwdGg7XG4gICAgd2hpbGUgKGlkeCA+PSAxICYmIGVsZW1lbnQuZGVwdGggPj0gc3RhcnREZXB0aCkge1xuICAgICAgaWR4IC09IDE7XG4gICAgICBlbGVtZW50ID0gbmV3Tm9kZXNbaWR4XTtcbiAgICAgIGlmIChlbGVtZW50LmRlcHRoID09PSBzdGFydERlcHRoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9wLnR5cGUgPT09IFwia2VlcF9jb3VudGVycGFydFwiXG4gICAgICAgICAgPyBlbGVtZW50Lm9wLmNvdW50ZXJwYXJ0XG4gICAgICAgICAgOiBlbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbmV3Tm9kZXMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgIHguZ2V0QmVmb3JlID0gKCkgPT4gZ2V0QmVmb3JlKHgsIGkpO1xuICAgIHguZ2V0UmVhbFBhcmVudCA9ICgpID0+IGdldFJlYWxQYXJlbnQoeCk7XG5cbiAgICBpZiAoIXgub3ApIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHguZ2V0UmVhbFBhcmVudCgpO1xuICAgICAgY29uc3QgdHlwZSA9IHRhcmdldD8ub3AudHlwZSA9PT0gXCJpbnNlcnRcIiA/IFwiaW5zZXJ0X2lnbm9yZVwiIDogXCJpbnNlcnRcIjtcbiAgICAgIHgub3AgPSB7IHR5cGUsIHRhcmdldCwgYWZ0ZXI6IHguZ2V0QmVmb3JlKCkgfTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHRhZ2dlZCA9IFsuLi5vbGROb2RlcywgLi4ubmV3Tm9kZXNdO1xuXG4gIHJldHVybiB0YWdnZWQuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFWYWwgPSBhLm9wPy5pZHggPz8gYS5pZHg7XG4gICAgY29uc3QgYlZhbCA9IGIub3A/LmlkeCA/PyBiLmlkeDtcblxuICAgIHJldHVybiBhVmFsIC0gYlZhbDtcbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZG9tXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2goJGRvbSwgbGVhZkNvbnRyb2xsZXIsIHByb2Nlc3MgPSBudWxsKSB7XG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICBsZWFmQ29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJGRvbSk7XG4gIH1cblxuICBpZiAoIWxlYWZDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QgeyByZWZyZXNoUHJvY2VzcywgaXNSdW5uaW5nUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKFxuICAgIHByb2Nlc3MsXG4gICAgbGVhZkNvbnRyb2xsZXIsXG4gICk7XG5cbiAgJGRvbSA/Pz0gbGVhZkNvbnRyb2xsZXIuJGNvbnRhaW5lcjtcblxuICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgYXBwLnRhZ05hbWVzLFxuICAgICRkb20sXG4gICAgbGVhZkNvbnRyb2xsZXIsXG4gICAgcHJvY2VzcyxcbiAgKS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gcmVsb2FkTWV0aG9kSFRNTChsZWFmQ29udHJvbGxlciwgJGRvbSwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgICAgIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChyZWZyZXNoUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
|
|
147
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CONTROLLER_CLASS: () => (/* binding */ CONTROLLER_CLASS),\n/* harmony export */ DATA_CONTROLLER_KEY: () => (/* binding */ DATA_CONTROLLER_KEY),\n/* harmony export */ VIEW_REDIRECT: () => (/* binding */ VIEW_REDIRECT),\n/* harmony export */ cleanCache: () => (/* binding */ cleanCache),\n/* harmony export */ getController: () => (/* binding */ getController),\n/* harmony export */ loadFilesFromController: () => (/* binding */ loadFilesFromController),\n/* harmony export */ reconcile: () => (/* binding */ reconcile),\n/* harmony export */ refresh: () => (/* binding */ refresh),\n/* harmony export */ reloadHTMLController: () => (/* binding */ reloadHTMLController),\n/* harmony export */ reloadMethodHTML: () => (/* binding */ reloadMethodHTML),\n/* harmony export */ replaceTagElementsInContainer: () => (/* binding */ replaceTagElementsInContainer),\n/* harmony export */ runControllerFillContent: () => (/* binding */ runControllerFillContent)\n/* harmony export */ });\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\n/**\n * List of HTML files.\n * @type {{}}\n */\nlet htmlFiles = {};\n\n// A redirect is a navigation result, not HTML to render or cache.\nconst VIEW_REDIRECT = Symbol(\"view redirect\");\n\nconst DATA_CONTROLLER_KEY = \"_controller_\";\nconst CONTROLLER_CLASS = \"_sdc_controller_\";\n\nfunction cleanCache() {\n htmlFiles = {};\n}\n\n/**\n * findSdcTgs Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. It collects all those\n * doms and returns a list of objects containing also the tag name the dom and the tag\n * names of the super controller\n *\n * @param {jquery} $container - jQuery container\n * @param {Array<string>} tagNameList - a string list with tag names.\n * @param {AbstractSDC} parentController - controller in surrounding\n * @return {Array} - a array of objects with all register tags found\n */\nfunction findSdcTgs($container, tagNameList, parentController) {\n if (!$container) {\n return [];\n }\n let $children = $container.children();\n let emptyList = [];\n $children.each(function (_, element) {\n let $element = $(element);\n let tagName = $element.prop(\"tagName\").toLowerCase().split(\"_\");\n if ($.inArray(tagName[0], tagNameList) >= 0) {\n emptyList.push({\n tag: tagName[0],\n super: tagName.splice(1) || [],\n dom: $element,\n });\n } else if (tagName[0].startsWith(\"this.\")) {\n $element.addClass(\n `_bind_to_update_handler sdc_uuid_${parentController._uuid}`,\n );\n } else {\n emptyList = emptyList.concat(\n findSdcTgs($element, tagNameList, parentController),\n );\n }\n });\n\n return emptyList;\n}\n\n/**\n * replacePlaceholderController fills the parameter of the content\n * url this function uses the tag parameter\n *\n * @param controller - controller object\n * @param url - the origin content URL\n * @param urlValues - values for the url placeholder. In same order!!\n * @returns {string} - the correct URL with prefix.\n */\nfunction replacePlaceholderController(controller, url, urlValues) {\n for (let key_idx in controller._urlParams) {\n if (Object.hasOwn(controller._urlParams, key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n const val = urlValues[key];\n if(!val) {\n console.warn(`${key} is not set for controller ${ controller._tagName }`);\n }\n url = url.replace(re, val);\n }\n }\n\n return url;\n}\n\n/**\n * loadHTMLFile loads the HTML content file from the server via ajax request.\n *\n * If the HTML file is loaded already the function takes no action.\n *\n * @param {AbstractSDC} controller - a content URL from the controller.\n * @param {object} args - get args.\n * @returns {Promise<jQuery|Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(controller, args) {\n const { contentUrl, _tagName, contentReload } = controller;\n if (!contentUrl) {\n return Promise.resolve(false);\n } else if (htmlFiles[_tagName]) {\n controller.autoRedirect = null;\n return Promise.resolve(htmlFiles[_tagName]);\n }\n\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = \"content\";\n\n return $.get(contentUrl, args)\n .then(function (data) {\n controller.autoRedirect = null;\n if (!contentReload) {\n htmlFiles[_tagName] = data;\n }\n\n return data;\n })\n .catch(function (err) {\n if (err.status === 301) {\n const data = err.responseJSON;\n controller.autoRedirect = data[\"url-link\"];\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"_RedirectOnView\", controller.autoRedirect);\n return VIEW_REDIRECT;\n }\n controller.autoRedirect = null;\n if (typeof controller.confirmPageLoaded === \"function\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"navLoaded\", { controller_name: () => err.status });\n }\n\n throw `<sdc-error data-code=\"${err.status}\">${err.responseText}</sdc-error>`;\n });\n}\n\n/**\n * replaceAllTagElementsInContainer replaces all registered tags by the controller.\n * In this step the life-cycle starts.\n *\n * @param {jquery} $container - given container\n * @param {AbstractSDC} parentController - parent contoller surrounded the container\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceAllTagElementsInContainer(\n $container,\n parentController,\n process = null,\n) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $container,\n parentController,\n process,\n );\n}\n\n/**\n * parseContentUrl uses the content URL prefix to marge the\n * correct URL. Also parses the url parameter\n *\n * @param {AbstractSDC} controller - controller object\n * @returns {{url: String, args: Array}} - the correct URL with prefix.\n */\nfunction parseContentUrl(controller) {\n let url = controller.contentUrl;\n if (controller && controller._urlParams.length === 0) {\n let re = /%\\(([^)]+)\\)\\w/gm;\n let matches;\n controller._urlParams = [];\n while ((matches = re.exec(url))) {\n controller._urlParams.push(matches[1]);\n controller.contentReload = true;\n }\n }\n\n let { args, params } = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.getUrlParam)(controller, controller.$container);\n if (controller._urlParams.length) {\n url = replacePlaceholderController(controller, url, params);\n }\n\n controller.parsedContentUrl = url;\n\n return { url: url, args };\n}\n\n/**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\nfunction getController($elem) {\n if ($elem.hasClass(CONTROLLER_CLASS)) {\n return $elem.data(`${DATA_CONTROLLER_KEY}`);\n }\n return $elem.closest(`.${CONTROLLER_CLASS}`).data(`${DATA_CONTROLLER_KEY}`);\n}\n\n/**\n * loadFilesFromController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n * The content is saved as jQuery object to the controller.$content property of\n * the controller.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction loadFilesFromController(controller) {\n let getElements = { args: {} };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n\n return Promise.all([loadHTMLFile(controller, getElements.args)]).then(\n function (results) {\n let htmlFile = results[0];\n if (htmlFile === VIEW_REDIRECT) return VIEW_REDIRECT;\n if (htmlFile) {\n try {\n return $(htmlFile);\n } catch {\n return $(\"<div></div>\").append(htmlFile);\n }\n }\n\n return null;\n },\n );\n}\n\n/**\n * reloadHTMLController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n *\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction reloadHTMLController(controller) {\n if (controller.contentUrl) {\n let getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller, getElements.args);\n }\n\n return new Promise((resolve) => {\n resolve($());\n });\n}\n\n/**\n *\n * @param {jquery} $element\n * @param {string} tagName\n * @param {Array<string>} superTagNameList\n * @param {AbstractSDC} parentController\n * @param {Object} process - Process object containing the refresh process\n * @returns {Promise}\n */\nfunction runReplaceTagElementsInContainer(\n $element,\n tagName,\n superTagNameList,\n parentController,\n process,\n) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n\n\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, process);\n}\n\n/**\n * runControllerFillContent empties the registered tag and replaces it by the controller\n * content. It sets the CSS tags for the relation with the CSS files.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html, process = null) {\n if ($html && $html.length > 0) {\n controller.$container.empty();\n controller.$container.attr(controller._tagName, \"\");\n for (let mixinKey in controller._mixins) {\n controller.$container.attr(controller._mixins[mixinKey]._tagName, \"\");\n }\n controller.$container.append($html);\n }\n\n return replaceAllTagElementsInContainer(\n controller.$container,\n controller,\n process,\n );\n}\n\n/**\n * replaceTagElementsInContainer Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. For each registered tag it loads the content.\n * Afterwards it starts the life cycle of the controller. I the next step it starts the\n * procedure for the child elements of the controller tag.\n *\n * @param {Array<string>} tagList - list of all registered tags\n * @param {jquery} $container - jQuery container to find the tags\n * @param {AbstractSDC} parentController - controller in surrounding\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceTagElementsInContainer(\n tagList,\n $container,\n parentController,\n process,\n) {\n return new Promise((resolve) => {\n let tagDescriptionElements = findSdcTgs(\n $container,\n tagList,\n parentController,\n );\n let tagCount = tagDescriptionElements.length;\n\n if (tagCount === 0) {\n return resolve();\n }\n\n for (\n let elementIndex = 0;\n elementIndex < tagDescriptionElements.length;\n elementIndex++\n ) {\n runReplaceTagElementsInContainer(\n tagDescriptionElements[elementIndex].dom,\n tagDescriptionElements[elementIndex].tag,\n tagDescriptionElements[elementIndex].super,\n parentController,\n process,\n ).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\n\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(\n controller,\n $container ?? controller.$container,\n process,\n );\n}\n\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n\n $dom\n .find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`)\n .each(function () {\n const $this = $(this);\n let result = undefined;\n if ($this.hasClass(`_with_handler`)) {\n result = $this.data(\"handler\");\n } else {\n let controller_handler = this.tagName\n .toLowerCase()\n .replace(/^this./, \"\");\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n\n if (typeof result === \"function\") {\n const newData = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.prepareData)($this.data(), controller);\n result = result.bind(controller)(newData);\n }\n if (result) {\n plist.push(\n Promise.resolve(result).then((x) => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n\n if ($this.html() === \"\") {\n $this.append(\"<div></div>\");\n }\n\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(\n controller,\n $newContent,\n $this.children(),\n process,\n );\n }),\n );\n }\n });\n\n return Promise.all(plist);\n}\n\nfunction getNodeKey(node) {\n if (node[0].nodeType === 3) {\n return `TEXT__${node[0].nodeValue}`;\n }\n const res = [node[0].tagName];\n if (node[0].nodeName === \"INPUT\") {\n [\n [\"name\", \"\"],\n [\"type\", \"text\"],\n [\"id\", \"\"],\n ].forEach(([key, defaultValue]) => {\n const attr = node.attr(key) ?? defaultValue;\n if (attr) {\n res.push(attr);\n }\n });\n }\n return res.join(\"__\");\n}\n\nfunction reconcileTree({ $element, id = [], parent = null }) {\n id.push(getNodeKey($element));\n const obj = {\n $element,\n id: id.join(\"::\"),\n depth: id.length,\n idx: 0,\n getRealParent: () => parent,\n getIdx: function () {\n this.idx = Math.max(\n 0,\n (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1,\n );\n return this.idx;\n },\n op: null,\n parent,\n };\n obj.getIdx.bind(obj);\n return [obj].concat(\n $element\n .contents()\n .toArray()\n .map((x) =>\n reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj,\n }),\n )\n .flat(),\n );\n}\n\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({ $element: $realNode });\n const $new = reconcileTree({ $element: $virtualNode });\n $old.map((x, i) => (x.idx = i));\n $new.map((x, i) => (x.idx = i));\n const depth = Math.max(...$new.concat($old).map((x) => x.depth));\n const op_steps = lcbDiff($old, $new, depth);\n let toRemove = [];\n // Controllers of kept real nodes that get a new controller instance from\n // their virtual counterpart (syncAttributes overwrites the data link).\n const replacedControllers = [];\n window.MAIN = $realNode;\n window.OPS = op_steps;\n\n op_steps.forEach((op_step, i) => {\n const { op, $element, idx } = op_step;\n\n if (op.type === \"keep_counterpart\") {\n // The root of the real tree is the reconcile target and never moves;\n // its index among its own (real) siblings is irrelevant.\n let cIdx = op_step.parent ? op.counterpart.getIdx() : idx;\n if (cIdx !== idx) {\n const elemBefore = op_step.getBefore();\n if (!elemBefore) {\n op_step.getRealParent().$element.prepend(op.counterpart.$element);\n } else {\n op.counterpart.$element.insertAfter(elemBefore.$element);\n }\n }\n\n if (op_step.parent) {\n const oldController = op.counterpart.$element.data(DATA_CONTROLLER_KEY);\n if (\n oldController &&\n oldController !== $element.data(DATA_CONTROLLER_KEY)\n ) {\n replacedControllers.push(oldController);\n }\n }\n\n syncAttributes(op.counterpart.$element, $element);\n if ($element.hasClass(CONTROLLER_CLASS)) {\n $element.data(DATA_CONTROLLER_KEY).$container = op.counterpart.$element;\n $element.data(DATA_CONTROLLER_KEY, null);\n }\n\n toRemove.push($element);\n } else if (op.type === \"delete\") {\n $element.safeRemove();\n } else if (op.type === \"insert\") {\n const { after, target } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n\n toRemove.forEach(($element) => $element.safeRemove());\n removeReplacedControllers(replacedControllers);\n}\n\n/**\n * Removes controllers whose DOM node was kept by reconcile but now belongs to\n * a new controller instance. remove() also removes the controller's\n * $container, so the old controllers are detached from the kept nodes first.\n * They are removed innermost first (reverse document order): each child takes\n * itself out of its parent's child list, so a parent never removes a child a\n * second time.\n *\n * @param {Array<AbstractSDC>} controllers - in document order\n */\nfunction removeReplacedControllers(controllers) {\n controllers.forEach((controller) => {\n controller.$container = $();\n });\n controllers.reverse().forEach((controller) => controller.remove());\n}\n\n/**\n * Replace the event listeners added by sdcDom (JSX on* props) on a kept node\n * with the listeners of its new virtual counterpart.\n */\nfunction syncListeners(real, virtual) {\n if (!real || !virtual || (!real._sdcListeners && !virtual._sdcListeners)) {\n return;\n }\n (real._sdcListeners ?? []).forEach(([type, fn]) => real.removeEventListener(type, fn));\n const listeners = virtual._sdcListeners ?? [];\n listeners.forEach(([type, fn]) => real.addEventListener(type, fn));\n real._sdcListeners = listeners;\n}\n\nfunction syncAttributes($real, $virtual) {\n syncListeners($real[0], $virtual[0]);\n const realAttrs = $real[0].attributes ?? [];\n const virtualAttrs = $virtual[0].attributes ?? [];\n // Remove missing attrs\n [...realAttrs].forEach((attr) => {\n if (!$virtual.is(`[${attr.name}]`)) {\n $real.removeAttr(attr.name);\n }\n });\n\n // Add or update (data-* too: libraries such as Bootstrap read\n // data-bs-target etc. from the attribute, not from jQuery's data cache)\n [...virtualAttrs].forEach((attr) => {\n if ($real.attr(attr.name) !== attr.value) {\n $real.attr(attr.name, attr.value);\n }\n });\n\n $real.removeData();\n Object.entries($virtual.data()).forEach(([key, value]) => {\n $real.data(key, value);\n });\n}\n\n/**\n * LCB (Longest Common Branch) finds matching branches and reserves them!\n *\n * @param oldNodes\n * @param newNodes\n * @param depth\n * @returns {*|*[]}\n */\nfunction lcbDiff(oldNodes, newNodes, depth) {\n newNodes\n .filter((x) => x.depth === depth && !x.op)\n .forEach((newNode) => {\n const oldNode = oldNodes.find((tempOldNode) => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = { type: \"keep\", idx: newNode.idx };\n newNode.op = { type: \"keep_counterpart\", counterpart: oldNode };\n oldNode = oldNode.parent;\n newNode = newNode.parent;\n if (!oldNode || oldNode.op || newNode?.op) {\n return;\n }\n keepTreeBranch(oldNode, newNode);\n };\n keepTreeBranch(oldNode, newNode);\n }\n });\n if (depth > 1) {\n return lcbDiff(oldNodes, newNodes, depth - 1);\n }\n\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = { type: \"delete\", idx };\n }\n });\n\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === \"keep_counterpart\"\n ? element.parent.op.counterpart\n : element.parent;\n }\n\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 1 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === \"keep_counterpart\"\n ? element.op.counterpart\n : element;\n }\n }\n\n return null;\n }\n\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === \"insert\" ? \"insert_ignore\" : \"insert\";\n x.op = { type, target, after: x.getBefore() };\n }\n });\n\n const tagged = [...oldNodes, ...newNodes];\n\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n\n return aVal - bVal;\n });\n}\n\n/**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise<void>}\n */\n\nfunction refresh($dom, leafController, process = null) {\n if (!leafController) {\n leafController = getController($dom);\n }\n\n if (!leafController) {\n return Promise.resolve();\n }\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(\n process,\n leafController,\n );\n\n $dom ??= leafController.$container;\n\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $dom,\n leafController,\n process,\n ).then(() => {\n return reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0EseUJBQXlCLFVBQVU7QUFDbkM7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLFVBQVUsbUNBQW1DLEVBQUUseUVBQXFCO0FBQ3BFO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLElBQUksNkNBQUc7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtGQUE4QjtBQUN0QztBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX3ZpZXcuanM/Y2EwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb250cm9sbGVyRmFjdG9yeSxcbiAgcHJlcGFyZVJlZnJlc2hQcm9jZXNzLFxuICBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyxcbiAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoLFxufSBmcm9tIFwiLi9zZGNfY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW0sIHByZXBhcmVEYXRhIH0gZnJvbSBcIi4vc2RjX3BhcmFtcy5qc1wiO1xuaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcbmltcG9ydCB7IHRyaWdnZXIgfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5cbi8qKlxuICogTGlzdCBvZiBIVE1MIGZpbGVzLlxuICogQHR5cGUge3t9fVxuICovXG5sZXQgaHRtbEZpbGVzID0ge307XG5cbi8vIEEgcmVkaXJlY3QgaXMgYSBuYXZpZ2F0aW9uIHJlc3VsdCwgbm90IEhUTUwgdG8gcmVuZGVyIG9yIGNhY2hlLlxuZXhwb3J0IGNvbnN0IFZJRVdfUkVESVJFQ1QgPSBTeW1ib2woXCJ2aWV3IHJlZGlyZWN0XCIpO1xuXG5leHBvcnQgY29uc3QgREFUQV9DT05UUk9MTEVSX0tFWSA9IFwiX2NvbnRyb2xsZXJfXCI7XG5leHBvcnQgY29uc3QgQ09OVFJPTExFUl9DTEFTUyA9IFwiX3NkY19jb250cm9sbGVyX1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5DYWNoZSgpIHtcbiAgaHRtbEZpbGVzID0ge307XG59XG5cbi8qKlxuICogZmluZFNkY1RncyBGaW5kcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGluIGEgY29udGFpbmVyLiBCdXQgaXQgaWdub3Jlc1xuICogcmVnaXN0ZXJlZCB0YWdzIGluIHJlZ2lzdGVyZWQgdGFncy4gSXQgY29sbGVjdHMgYWxsIHRob3NlXG4gKiBkb21zIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYWxzbyB0aGUgdGFnIG5hbWUgdGhlIGRvbSBhbmQgdGhlIHRhZ1xuICogbmFtZXMgb2YgdGhlIHN1cGVyIGNvbnRyb2xsZXJcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXJcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTmFtZUxpc3QgLSBhIHN0cmluZyBsaXN0IHdpdGggdGFnIG5hbWVzLlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEByZXR1cm4ge0FycmF5fSAtIGEgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGFsbCByZWdpc3RlciB0YWdzIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGZpbmRTZGNUZ3MoJGNvbnRhaW5lciwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpIHtcbiAgaWYgKCEkY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGxldCAkY2hpbGRyZW4gPSAkY29udGFpbmVyLmNoaWxkcmVuKCk7XG4gIGxldCBlbXB0eUxpc3QgPSBbXTtcbiAgJGNoaWxkcmVuLmVhY2goZnVuY3Rpb24gKF8sIGVsZW1lbnQpIHtcbiAgICBsZXQgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIGxldCB0YWdOYW1lID0gJGVsZW1lbnQucHJvcChcInRhZ05hbWVcIikudG9Mb3dlckNhc2UoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKCQuaW5BcnJheSh0YWdOYW1lWzBdLCB0YWdOYW1lTGlzdCkgPj0gMCkge1xuICAgICAgZW1wdHlMaXN0LnB1c2goe1xuICAgICAgICB0YWc6IHRhZ05hbWVbMF0sXG4gICAgICAgIHN1cGVyOiB0YWdOYW1lLnNwbGljZSgxKSB8fCBbXSxcbiAgICAgICAgZG9tOiAkZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFnTmFtZVswXS5zdGFydHNXaXRoKFwidGhpcy5cIikpIHtcbiAgICAgICRlbGVtZW50LmFkZENsYXNzKFxuICAgICAgICBgX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgc2RjX3V1aWRfJHtwYXJlbnRDb250cm9sbGVyLl91dWlkfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbXB0eUxpc3QgPSBlbXB0eUxpc3QuY29uY2F0KFxuICAgICAgICBmaW5kU2RjVGdzKCRlbGVtZW50LCB0YWdOYW1lTGlzdCwgcGFyZW50Q29udHJvbGxlciksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVtcHR5TGlzdDtcbn1cblxuLyoqXG4gKiByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyIGZpbGxzIHRoZSBwYXJhbWV0ZXIgb2YgdGhlIGNvbnRlbnRcbiAqIHVybCB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIHRhZyBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcGFyYW0gdXJsIC0gdGhlIG9yaWdpbiBjb250ZW50IFVSTFxuICogQHBhcmFtIHVybFZhbHVlcyAtIHZhbHVlcyBmb3IgdGhlIHVybCBwbGFjZWhvbGRlci4gSW4gc2FtZSBvcmRlciEhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHVybFZhbHVlcykge1xuICBmb3IgKGxldCBrZXlfaWR4IGluIGNvbnRyb2xsZXIuX3VybFBhcmFtcykge1xuICAgIGlmIChPYmplY3QuaGFzT3duKGNvbnRyb2xsZXIuX3VybFBhcmFtcywga2V5X2lkeCkpIHtcbiAgICAgIGxldCBrZXkgPSBjb250cm9sbGVyLl91cmxQYXJhbXNba2V5X2lkeF07XG4gICAgICBsZXQgcmUgPSBSZWdFeHAoXCIlXFxcXChcIiArIGtleSArIFwiXFxcXClcXFxcd1wiLCBcImdtXCIpO1xuICAgICAgY29uc3QgdmFsID0gdXJsVmFsdWVzW2tleV07XG4gICAgICBpZighdmFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtrZXl9IGlzIG5vdCBzZXQgZm9yIGNvbnRyb2xsZXIgJHsgY29udHJvbGxlci5fdGFnTmFtZSB9YCk7XG4gICAgICB9XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZShyZSwgdmFsKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuXG4vKipcbiAqIGxvYWRIVE1MRmlsZSBsb2FkcyB0aGUgSFRNTCBjb250ZW50IGZpbGUgZnJvbSB0aGUgc2VydmVyIHZpYSBhamF4IHJlcXVlc3QuXG4gKlxuICogSWYgdGhlIEhUTUwgZmlsZSBpcyBsb2FkZWQgYWxyZWFkeSB0aGUgZnVuY3Rpb24gdGFrZXMgbm8gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGNvbnRlbnQgVVJMIGZyb20gdGhlIGNvbnRyb2xsZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGdldCBhcmdzLlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5fEJvb2xlYW4+fSAtIHdhaXRzIGZvciB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLCBhcmdzKSB7XG4gIGNvbnN0IHsgY29udGVudFVybCwgX3RhZ05hbWUsIGNvbnRlbnRSZWxvYWQgfSA9IGNvbnRyb2xsZXI7XG4gIGlmICghY29udGVudFVybCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9IGVsc2UgaWYgKGh0bWxGaWxlc1tfdGFnTmFtZV0pIHtcbiAgICBjb250cm9sbGVyLmF1dG9SZWRpcmVjdCA9IG51bGw7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShodG1sRmlsZXNbX3RhZ05hbWVdKTtcbiAgfVxuXG4gIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICBhcmdzLl9tZXRob2QgPSBcImNvbnRlbnRcIjtcblxuICByZXR1cm4gJC5nZXQoY29udGVudFVybCwgYXJncylcbiAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgY29udHJvbGxlci5hdXRvUmVkaXJlY3QgPSBudWxsO1xuICAgICAgaWYgKCFjb250ZW50UmVsb2FkKSB7XG4gICAgICAgIGh0bWxGaWxlc1tfdGFnTmFtZV0gPSBkYXRhO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gMzAxKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlcnIucmVzcG9uc2VKU09OO1xuICAgICAgICBjb250cm9sbGVyLmF1dG9SZWRpcmVjdCA9IGRhdGFbXCJ1cmwtbGlua1wiXTtcbiAgICAgICAgdHJpZ2dlcihcIl9SZWRpcmVjdE9uVmlld1wiLCBjb250cm9sbGVyLmF1dG9SZWRpcmVjdCk7XG4gICAgICAgIHJldHVybiBWSUVXX1JFRElSRUNUO1xuICAgICAgfVxuICAgICAgY29udHJvbGxlci5hdXRvUmVkaXJlY3QgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBjb250cm9sbGVyLmNvbmZpcm1QYWdlTG9hZGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJpZ2dlcihcIm5hdkxvYWRlZFwiLCB7IGNvbnRyb2xsZXJfbmFtZTogKCkgPT4gZXJyLnN0YXR1cyB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgYDxzZGMtZXJyb3IgZGF0YS1jb2RlPVwiJHtlcnIuc3RhdHVzfVwiPiR7ZXJyLnJlc3BvbnNlVGV4dH08L3NkYy1lcnJvcj5gO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyIHJlcGxhY2VzIGFsbCByZWdpc3RlcmVkIHRhZ3MgYnkgdGhlIGNvbnRyb2xsZXIuXG4gKiBJbiB0aGlzIHN0ZXAgdGhlIGxpZmUtY3ljbGUgc3RhcnRzLlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0gZ2l2ZW4gY29udGFpbmVyXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gcGFyZW50IGNvbnRvbGxlciBzdXJyb3VuZGVkIHRoZSBjb250YWluZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAkY29udGFpbmVyLFxuICBwYXJlbnRDb250cm9sbGVyLFxuICBwcm9jZXNzID0gbnVsbCxcbikge1xuICBwYXJlbnRDb250cm9sbGVyID0gcGFyZW50Q29udHJvbGxlciB8fCAkY29udGFpbmVyLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBhcHAudGFnTmFtZXMsXG4gICAgJGNvbnRhaW5lcixcbiAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgIHByb2Nlc3MsXG4gICk7XG59XG5cbi8qKlxuICogcGFyc2VDb250ZW50VXJsIHVzZXMgdGhlIGNvbnRlbnQgVVJMIHByZWZpeCB0byBtYXJnZSB0aGVcbiAqIGNvcnJlY3QgVVJMLiBBbHNvIHBhcnNlcyB0aGUgdXJsIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHJldHVybnMge3t1cmw6IFN0cmluZywgYXJnczogQXJyYXl9fSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpIHtcbiAgbGV0IHVybCA9IGNvbnRyb2xsZXIuY29udGVudFVybDtcbiAgaWYgKGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGxldCByZSA9IC8lXFwoKFteKV0rKVxcKVxcdy9nbTtcbiAgICBsZXQgbWF0Y2hlcztcbiAgICBjb250cm9sbGVyLl91cmxQYXJhbXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoZXMgPSByZS5leGVjKHVybCkpKSB7XG4gICAgICBjb250cm9sbGVyLl91cmxQYXJhbXMucHVzaChtYXRjaGVzWzFdKTtcbiAgICAgIGNvbnRyb2xsZXIuY29udGVudFJlbG9hZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbGV0IHsgYXJncywgcGFyYW1zIH0gPSBnZXRVcmxQYXJhbShjb250cm9sbGVyLCBjb250cm9sbGVyLiRjb250YWluZXIpO1xuICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCkge1xuICAgIHVybCA9IHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCBwYXJhbXMpO1xuICB9XG5cbiAgY29udHJvbGxlci5wYXJzZWRDb250ZW50VXJsID0gdXJsO1xuXG4gIHJldHVybiB7IHVybDogdXJsLCBhcmdzIH07XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICogQHJldHVybiB7QWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sbGVyKCRlbGVtKSB7XG4gIGlmICgkZWxlbS5oYXNDbGFzcyhDT05UUk9MTEVSX0NMQVNTKSkge1xuICAgIHJldHVybiAkZWxlbS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG4gIH1cbiAgcmV0dXJuICRlbGVtLmNsb3Nlc3QoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xufVxuXG4vKipcbiAqIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICogVGhlIGNvbnRlbnQgaXMgc2F2ZWQgYXMgalF1ZXJ5IG9iamVjdCB0byB0aGUgY29udHJvbGxlci4kY29udGVudCBwcm9wZXJ0eSBvZlxuICogdGhlIGNvbnRyb2xsZXIuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgbGV0IGdldEVsZW1lbnRzID0geyBhcmdzOiB7fSB9O1xuICBpZiAoY29udHJvbGxlci5jb250ZW50VXJsKSB7XG4gICAgZ2V0RWxlbWVudHMgPSBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5jb250ZW50VXJsID0gZ2V0RWxlbWVudHMudXJsO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFtsb2FkSFRNTEZpbGUoY29udHJvbGxlciwgZ2V0RWxlbWVudHMuYXJncyldKS50aGVuKFxuICAgIGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICBsZXQgaHRtbEZpbGUgPSByZXN1bHRzWzBdO1xuICAgICAgaWYgKGh0bWxGaWxlID09PSBWSUVXX1JFRElSRUNUKSByZXR1cm4gVklFV19SRURJUkVDVDtcbiAgICAgIGlmIChodG1sRmlsZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAkKGh0bWxGaWxlKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuICQoXCI8ZGl2PjwvZGl2PlwiKS5hcHBlbmQoaHRtbEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICogcmVsb2FkSFRNTENvbnRyb2xsZXIgbG9hZHMgdGhlIGNvbnRlbnQgKEhUTUwpIG9mIGFcbiAqIENvbnRyb2xsZXIuIElmIHlvdSBoYXZlIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgVVJMIGlzIHJlZ2lzdGVyZWQsIGZvciB0aGlzXG4gKiBjb250cm9sbGVyIHRoZSBvcmlnaW4gY29udGVudCBVUkwgaXMgaWdub3JlZC5cbiAqXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPGpRdWVyeT59IC0gdGhlIHByb21pc2Ugd2FpdHMgdG8gdGhlIGZpbGVzIGFyZSBsb2FkZWQuIGl0IHJldHVybnMgdGhlIGpRdWVyeSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRIVE1MQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICBsZXQgZ2V0RWxlbWVudHMgPSBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5jb250ZW50VXJsID0gZ2V0RWxlbWVudHMudXJsO1xuICAgIHJldHVybiBsb2FkSFRNTEZpbGUoY29udHJvbGxlciwgZ2V0RWxlbWVudHMuYXJncyk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICByZXNvbHZlKCQoKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHN1cGVyVGFnTmFtZUxpc3RcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZnVuY3Rpb24gcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICRlbGVtZW50LFxuICB0YWdOYW1lLFxuICBzdXBlclRhZ05hbWVMaXN0LFxuICBwYXJlbnRDb250cm9sbGVyLFxuICBwcm9jZXNzLFxuKSB7XG4gIGxldCBjb250cm9sbGVyID0gJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKTtcbiAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoJGVsZW1lbnQsIGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xuICB9XG5cblxuICBjb250cm9sbGVyID0gY29udHJvbGxlckZhY3RvcnkoXG4gICAgcGFyZW50Q29udHJvbGxlcixcbiAgICAkZWxlbWVudCxcbiAgICB0YWdOYW1lLFxuICAgIHN1cGVyVGFnTmFtZUxpc3QsXG4gICk7XG4gICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgY29udHJvbGxlcik7XG4gICRlbGVtZW50LmFkZENsYXNzKENPTlRST0xMRVJfQ0xBU1MpO1xuICByZXR1cm4gcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMoY29udHJvbGxlciwgcHJvY2Vzcyk7XG59XG5cbi8qKlxuICogcnVuQ29udHJvbGxlckZpbGxDb250ZW50IGVtcHRpZXMgdGhlIHJlZ2lzdGVyZWQgdGFnIGFuZCByZXBsYWNlcyBpdCBieSB0aGUgY29udHJvbGxlclxuICogY29udGVudC4gSXQgc2V0cyB0aGUgQ1NTIHRhZ3MgZm9yIHRoZSByZWxhdGlvbiB3aXRoIHRoZSBDU1MgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkaHRtbCAtIGpRdWVyeSBsb2FkZWQgY29udGVudFxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQoY29udHJvbGxlciwgJGh0bWwsIHByb2Nlc3MgPSBudWxsKSB7XG4gIGlmICgkaHRtbCAmJiAkaHRtbC5sZW5ndGggPiAwKSB7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmVtcHR5KCk7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fdGFnTmFtZSwgXCJcIik7XG4gICAgZm9yIChsZXQgbWl4aW5LZXkgaW4gY29udHJvbGxlci5fbWl4aW5zKSB7XG4gICAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXR0cihjb250cm9sbGVyLl9taXhpbnNbbWl4aW5LZXldLl90YWdOYW1lLCBcIlwiKTtcbiAgICB9XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmFwcGVuZCgkaHRtbCk7XG4gIH1cblxuICByZXR1cm4gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLFxuICAgIGNvbnRyb2xsZXIsXG4gICAgcHJvY2VzcyxcbiAgKTtcbn1cblxuLyoqXG4gKiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lciBGaW5kcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGluIGEgY29udGFpbmVyLiBCdXQgaXQgaWdub3Jlc1xuICogcmVnaXN0ZXJlZCB0YWdzIGluIHJlZ2lzdGVyZWQgdGFncy4gRm9yIGVhY2ggcmVnaXN0ZXJlZCB0YWcgaXQgbG9hZHMgdGhlIGNvbnRlbnQuXG4gKiBBZnRlcndhcmRzIGl0IHN0YXJ0cyB0aGUgbGlmZSBjeWNsZSBvZiB0aGUgY29udHJvbGxlci4gSSB0aGUgbmV4dCBzdGVwIGl0IHN0YXJ0cyB0aGVcbiAqIHByb2NlZHVyZSBmb3IgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBjb250cm9sbGVyIHRhZy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHRhZ0xpc3QgLSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIHRhZ3NcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0galF1ZXJ5IGNvbnRhaW5lciB0byBmaW5kIHRoZSB0YWdzXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gY29udHJvbGxlciBpbiBzdXJyb3VuZGluZ1xuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICB0YWdMaXN0LFxuICAkY29udGFpbmVyLFxuICBwYXJlbnRDb250cm9sbGVyLFxuICBwcm9jZXNzLFxuKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGxldCB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzID0gZmluZFNkY1RncyhcbiAgICAgICRjb250YWluZXIsXG4gICAgICB0YWdMaXN0LFxuICAgICAgcGFyZW50Q29udHJvbGxlcixcbiAgICApO1xuICAgIGxldCB0YWdDb3VudCA9IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMubGVuZ3RoO1xuXG4gICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGZvciAoXG4gICAgICBsZXQgZWxlbWVudEluZGV4ID0gMDtcbiAgICAgIGVsZW1lbnRJbmRleCA8IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMubGVuZ3RoO1xuICAgICAgZWxlbWVudEluZGV4KytcbiAgICApIHtcbiAgICAgIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgICAgICB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzW2VsZW1lbnRJbmRleF0uZG9tLFxuICAgICAgICB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzW2VsZW1lbnRJbmRleF0udGFnLFxuICAgICAgICB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzW2VsZW1lbnRJbmRleF0uc3VwZXIsXG4gICAgICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgICAgIHByb2Nlc3MsXG4gICAgICApLnRoZW4oKCkgPT4ge1xuICAgICAgICB0YWdDb3VudC0tO1xuICAgICAgICBpZiAodGFnQ291bnQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyLCAkY29udGFpbmVyLCBwcm9jZXNzKSB7XG4gIHJldHVybiBfcmVsb2FkTWV0aG9kSFRNTChcbiAgICBjb250cm9sbGVyLFxuICAgICRjb250YWluZXIgPz8gY29udHJvbGxlci4kY29udGFpbmVyLFxuICAgIHByb2Nlc3MsXG4gICk7XG59XG5cbmZ1bmN0aW9uIF9yZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRkb20sIHByb2Nlc3MpIHtcbiAgY29uc3QgcGxpc3QgPSBbXTtcblxuICAkZG9tXG4gICAgLmZpbmQoYC5fYmluZF90b191cGRhdGVfaGFuZGxlci5zZGNfdXVpZF8ke2NvbnRyb2xsZXIuX3V1aWR9YClcbiAgICAuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCAkdGhpcyA9ICQodGhpcyk7XG4gICAgICBsZXQgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKGBfd2l0aF9oYW5kbGVyYCkpIHtcbiAgICAgICAgcmVzdWx0ID0gJHRoaXMuZGF0YShcImhhbmRsZXJcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY29udHJvbGxlcl9oYW5kbGVyID0gdGhpcy50YWdOYW1lXG4gICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZSgvXnRoaXMuLywgXCJcIik7XG4gICAgICAgIGlmIChjb250cm9sbGVyW2NvbnRyb2xsZXJfaGFuZGxlcl0pIHtcbiAgICAgICAgICByZXN1bHQgPSBjb250cm9sbGVyW2NvbnRyb2xsZXJfaGFuZGxlcl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBuZXdEYXRhID0gcHJlcGFyZURhdGEoJHRoaXMuZGF0YSgpLCBjb250cm9sbGVyKTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmJpbmQoY29udHJvbGxlcikobmV3RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHBsaXN0LnB1c2goXG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbigoeCkgPT4ge1xuICAgICAgICAgICAgbGV0ICRuZXdDb250ZW50ID0gJChgPGRpdj48L2Rpdj5gKTtcbiAgICAgICAgICAgICRuZXdDb250ZW50LmFwcGVuZCh4KTtcblxuICAgICAgICAgICAgaWYgKCR0aGlzLmh0bWwoKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAkdGhpcy5hcHBlbmQoXCI8ZGl2PjwvZGl2PlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUoXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICRuZXdDb250ZW50LFxuICAgICAgICAgICAgICAkdGhpcy5jaGlsZHJlbigpLFxuICAgICAgICAgICAgICBwcm9jZXNzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICByZXR1cm4gUHJvbWlzZS5hbGwocGxpc3QpO1xufVxuXG5mdW5jdGlvbiBnZXROb2RlS2V5KG5vZGUpIHtcbiAgaWYgKG5vZGVbMF0ubm9kZVR5cGUgPT09IDMpIHtcbiAgICByZXR1cm4gYFRFWFRfXyR7bm9kZVswXS5ub2RlVmFsdWV9YDtcbiAgfVxuICBjb25zdCByZXMgPSBbbm9kZVswXS50YWdOYW1lXTtcbiAgaWYgKG5vZGVbMF0ubm9kZU5hbWUgPT09IFwiSU5QVVRcIikge1xuICAgIFtcbiAgICAgIFtcIm5hbWVcIiwgXCJcIl0sXG4gICAgICBbXCJ0eXBlXCIsIFwidGV4dFwiXSxcbiAgICAgIFtcImlkXCIsIFwiXCJdLFxuICAgIF0uZm9yRWFjaCgoW2tleSwgZGVmYXVsdFZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgYXR0ciA9IG5vZGUuYXR0cihrZXkpID8/IGRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChhdHRyKSB7XG4gICAgICAgIHJlcy5wdXNoKGF0dHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiByZXMuam9pbihcIl9fXCIpO1xufVxuXG5mdW5jdGlvbiByZWNvbmNpbGVUcmVlKHsgJGVsZW1lbnQsIGlkID0gW10sIHBhcmVudCA9IG51bGwgfSkge1xuICBpZC5wdXNoKGdldE5vZGVLZXkoJGVsZW1lbnQpKTtcbiAgY29uc3Qgb2JqID0ge1xuICAgICRlbGVtZW50LFxuICAgIGlkOiBpZC5qb2luKFwiOjpcIiksXG4gICAgZGVwdGg6IGlkLmxlbmd0aCxcbiAgICBpZHg6IDAsXG4gICAgZ2V0UmVhbFBhcmVudDogKCkgPT4gcGFyZW50LFxuICAgIGdldElkeDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5pZHggPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgKHRoaXMuZ2V0UmVhbFBhcmVudCgpPy5nZXRJZHgoKSA/PyAtMSkgKyAkZWxlbWVudC5pbmRleCgpICsgMSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5pZHg7XG4gICAgfSxcbiAgICBvcDogbnVsbCxcbiAgICBwYXJlbnQsXG4gIH07XG4gIG9iai5nZXRJZHguYmluZChvYmopO1xuICByZXR1cm4gW29ial0uY29uY2F0KFxuICAgICRlbGVtZW50XG4gICAgICAuY29udGVudHMoKVxuICAgICAgLnRvQXJyYXkoKVxuICAgICAgLm1hcCgoeCkgPT5cbiAgICAgICAgcmVjb25jaWxlVHJlZSh7XG4gICAgICAgICAgJGVsZW1lbnQ6ICQoeCksXG4gICAgICAgICAgaWQ6IGlkLnNsaWNlKCksXG4gICAgICAgICAgcGFyZW50OiBvYmosXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLmZsYXQoKSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29uY2lsZSgkdmlydHVhbE5vZGUsICRyZWFsTm9kZSkge1xuICBjb25zdCAkb2xkID0gcmVjb25jaWxlVHJlZSh7ICRlbGVtZW50OiAkcmVhbE5vZGUgfSk7XG4gIGNvbnN0ICRuZXcgPSByZWNvbmNpbGVUcmVlKHsgJGVsZW1lbnQ6ICR2aXJ0dWFsTm9kZSB9KTtcbiAgJG9sZC5tYXAoKHgsIGkpID0+ICh4LmlkeCA9IGkpKTtcbiAgJG5ldy5tYXAoKHgsIGkpID0+ICh4LmlkeCA9IGkpKTtcbiAgY29uc3QgZGVwdGggPSBNYXRoLm1heCguLi4kbmV3LmNvbmNhdCgkb2xkKS5tYXAoKHgpID0+IHguZGVwdGgpKTtcbiAgY29uc3Qgb3Bfc3RlcHMgPSBsY2JEaWZmKCRvbGQsICRuZXcsIGRlcHRoKTtcbiAgbGV0IHRvUmVtb3ZlID0gW107XG4gIC8vIENvbnRyb2xsZXJzIG9mIGtlcHQgcmVhbCBub2RlcyB0aGF0IGdldCBhIG5ldyBjb250cm9sbGVyIGluc3RhbmNlIGZyb21cbiAgLy8gdGhlaXIgdmlydHVhbCBjb3VudGVycGFydCAoc3luY0F0dHJpYnV0ZXMgb3ZlcndyaXRlcyB0aGUgZGF0YSBsaW5rKS5cbiAgY29uc3QgcmVwbGFjZWRDb250cm9sbGVycyA9IFtdO1xuICB3aW5kb3cuTUFJTiA9ICRyZWFsTm9kZTtcbiAgd2luZG93Lk9QUyA9IG9wX3N0ZXBzO1xuXG4gIG9wX3N0ZXBzLmZvckVhY2goKG9wX3N0ZXAsIGkpID0+IHtcbiAgICBjb25zdCB7IG9wLCAkZWxlbWVudCwgaWR4IH0gPSBvcF9zdGVwO1xuXG4gICAgaWYgKG9wLnR5cGUgPT09IFwia2VlcF9jb3VudGVycGFydFwiKSB7XG4gICAgICAvLyBUaGUgcm9vdCBvZiB0aGUgcmVhbCB0cmVlIGlzIHRoZSByZWNvbmNpbGUgdGFyZ2V0IGFuZCBuZXZlciBtb3ZlcztcbiAgICAgIC8vIGl0cyBpbmRleCBhbW9uZyBpdHMgb3duIChyZWFsKSBzaWJsaW5ncyBpcyBpcnJlbGV2YW50LlxuICAgICAgbGV0IGNJZHggPSBvcF9zdGVwLnBhcmVudCA/IG9wLmNvdW50ZXJwYXJ0LmdldElkeCgpIDogaWR4O1xuICAgICAgaWYgKGNJZHggIT09IGlkeCkge1xuICAgICAgICBjb25zdCBlbGVtQmVmb3JlID0gb3Bfc3RlcC5nZXRCZWZvcmUoKTtcbiAgICAgICAgaWYgKCFlbGVtQmVmb3JlKSB7XG4gICAgICAgICAgb3Bfc3RlcC5nZXRSZWFsUGFyZW50KCkuJGVsZW1lbnQucHJlcGVuZChvcC5jb3VudGVycGFydC4kZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3AuY291bnRlcnBhcnQuJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoZWxlbUJlZm9yZS4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9wX3N0ZXAucGFyZW50KSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRyb2xsZXIgPSBvcC5jb3VudGVycGFydC4kZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgb2xkQ29udHJvbGxlciAmJlxuICAgICAgICAgIG9sZENvbnRyb2xsZXIgIT09ICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVwbGFjZWRDb250cm9sbGVycy5wdXNoKG9sZENvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN5bmNBdHRyaWJ1dGVzKG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50LCAkZWxlbWVudCk7XG4gICAgICBpZiAoJGVsZW1lbnQuaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKS4kY29udGFpbmVyID0gb3AuY291bnRlcnBhcnQuJGVsZW1lbnQ7XG4gICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRvUmVtb3ZlLnB1c2goJGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gXCJkZWxldGVcIikge1xuICAgICAgJGVsZW1lbnQuc2FmZVJlbW92ZSgpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gXCJpbnNlcnRcIikge1xuICAgICAgY29uc3QgeyBhZnRlciwgdGFyZ2V0IH0gPSBvcF9zdGVwLm9wO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgICRlbGVtZW50Lmluc2VydEFmdGVyKGFmdGVyLiRlbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC4kZWxlbWVudC5wcmVwZW5kKCRlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHRvUmVtb3ZlLmZvckVhY2goKCRlbGVtZW50KSA9PiAkZWxlbWVudC5zYWZlUmVtb3ZlKCkpO1xuICByZW1vdmVSZXBsYWNlZENvbnRyb2xsZXJzKHJlcGxhY2VkQ29udHJvbGxlcnMpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgY29udHJvbGxlcnMgd2hvc2UgRE9NIG5vZGUgd2FzIGtlcHQgYnkgcmVjb25jaWxlIGJ1dCBub3cgYmVsb25ncyB0b1xuICogYSBuZXcgY29udHJvbGxlciBpbnN0YW5jZS4gcmVtb3ZlKCkgYWxzbyByZW1vdmVzIHRoZSBjb250cm9sbGVyJ3NcbiAqICRjb250YWluZXIsIHNvIHRoZSBvbGQgY29udHJvbGxlcnMgYXJlIGRldGFjaGVkIGZyb20gdGhlIGtlcHQgbm9kZXMgZmlyc3QuXG4gKiBUaGV5IGFyZSByZW1vdmVkIGlubmVybW9zdCBmaXJzdCAocmV2ZXJzZSBkb2N1bWVudCBvcmRlcik6IGVhY2ggY2hpbGQgdGFrZXNcbiAqIGl0c2VsZiBvdXQgb2YgaXRzIHBhcmVudCdzIGNoaWxkIGxpc3QsIHNvIGEgcGFyZW50IG5ldmVyIHJlbW92ZXMgYSBjaGlsZCBhXG4gKiBzZWNvbmQgdGltZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PEFic3RyYWN0U0RDPn0gY29udHJvbGxlcnMgLSBpbiBkb2N1bWVudCBvcmRlclxuICovXG5mdW5jdGlvbiByZW1vdmVSZXBsYWNlZENvbnRyb2xsZXJzKGNvbnRyb2xsZXJzKSB7XG4gIGNvbnRyb2xsZXJzLmZvckVhY2goKGNvbnRyb2xsZXIpID0+IHtcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIgPSAkKCk7XG4gIH0pO1xuICBjb250cm9sbGVycy5yZXZlcnNlKCkuZm9yRWFjaCgoY29udHJvbGxlcikgPT4gY29udHJvbGxlci5yZW1vdmUoKSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSB0aGUgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIGJ5IHNkY0RvbSAoSlNYIG9uKiBwcm9wcykgb24gYSBrZXB0IG5vZGVcbiAqIHdpdGggdGhlIGxpc3RlbmVycyBvZiBpdHMgbmV3IHZpcnR1YWwgY291bnRlcnBhcnQuXG4gKi9cbmZ1bmN0aW9uIHN5bmNMaXN0ZW5lcnMocmVhbCwgdmlydHVhbCkge1xuICBpZiAoIXJlYWwgfHwgIXZpcnR1YWwgfHwgKCFyZWFsLl9zZGNMaXN0ZW5lcnMgJiYgIXZpcnR1YWwuX3NkY0xpc3RlbmVycykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgKHJlYWwuX3NkY0xpc3RlbmVycyA/PyBbXSkuZm9yRWFjaCgoW3R5cGUsIGZuXSkgPT4gcmVhbC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZuKSk7XG4gIGNvbnN0IGxpc3RlbmVycyA9IHZpcnR1YWwuX3NkY0xpc3RlbmVycyA/PyBbXTtcbiAgbGlzdGVuZXJzLmZvckVhY2goKFt0eXBlLCBmbl0pID0+IHJlYWwuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbikpO1xuICByZWFsLl9zZGNMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIHN5bmNBdHRyaWJ1dGVzKCRyZWFsLCAkdmlydHVhbCkge1xuICBzeW5jTGlzdGVuZXJzKCRyZWFsWzBdLCAkdmlydHVhbFswXSk7XG4gIGNvbnN0IHJlYWxBdHRycyA9ICRyZWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIGNvbnN0IHZpcnR1YWxBdHRycyA9ICR2aXJ0dWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIC8vIFJlbW92ZSBtaXNzaW5nIGF0dHJzXG4gIFsuLi5yZWFsQXR0cnNdLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICBpZiAoISR2aXJ0dWFsLmlzKGBbJHthdHRyLm5hbWV9XWApKSB7XG4gICAgICAkcmVhbC5yZW1vdmVBdHRyKGF0dHIubmFtZSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGQgb3IgdXBkYXRlIChkYXRhLSogdG9vOiBsaWJyYXJpZXMgc3VjaCBhcyBCb290c3RyYXAgcmVhZFxuICAvLyBkYXRhLWJzLXRhcmdldCBldGMuIGZyb20gdGhlIGF0dHJpYnV0ZSwgbm90IGZyb20galF1ZXJ5J3MgZGF0YSBjYWNoZSlcbiAgWy4uLnZpcnR1YWxBdHRyc10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgIGlmICgkcmVhbC5hdHRyKGF0dHIubmFtZSkgIT09IGF0dHIudmFsdWUpIHtcbiAgICAgICRyZWFsLmF0dHIoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gICRyZWFsLnJlbW92ZURhdGEoKTtcbiAgT2JqZWN0LmVudHJpZXMoJHZpcnR1YWwuZGF0YSgpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAkcmVhbC5kYXRhKGtleSwgdmFsdWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBMQ0IgKExvbmdlc3QgQ29tbW9uIEJyYW5jaCkgZmluZHMgbWF0Y2hpbmcgYnJhbmNoZXMgYW5kIHJlc2VydmVzIHRoZW0hXG4gKlxuICogQHBhcmFtIG9sZE5vZGVzXG4gKiBAcGFyYW0gbmV3Tm9kZXNcbiAqIEBwYXJhbSBkZXB0aFxuICogQHJldHVybnMgeyp8KltdfVxuICovXG5mdW5jdGlvbiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGgpIHtcbiAgbmV3Tm9kZXNcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmRlcHRoID09PSBkZXB0aCAmJiAheC5vcClcbiAgICAuZm9yRWFjaCgobmV3Tm9kZSkgPT4ge1xuICAgICAgY29uc3Qgb2xkTm9kZSA9IG9sZE5vZGVzLmZpbmQoKHRlbXBPbGROb2RlKSA9PiB7XG4gICAgICAgIHJldHVybiAhdGVtcE9sZE5vZGUub3AgJiYgdGVtcE9sZE5vZGUuaWQgPT09IG5ld05vZGUuaWQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9sZE5vZGUpIHtcbiAgICAgICAgY29uc3Qga2VlcFRyZWVCcmFuY2ggPSAob2xkTm9kZSwgbmV3Tm9kZSkgPT4ge1xuICAgICAgICAgIG9sZE5vZGUub3AgPSB7IHR5cGU6IFwia2VlcFwiLCBpZHg6IG5ld05vZGUuaWR4IH07XG4gICAgICAgICAgbmV3Tm9kZS5vcCA9IHsgdHlwZTogXCJrZWVwX2NvdW50ZXJwYXJ0XCIsIGNvdW50ZXJwYXJ0OiBvbGROb2RlIH07XG4gICAgICAgICAgb2xkTm9kZSA9IG9sZE5vZGUucGFyZW50O1xuICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudDtcbiAgICAgICAgICBpZiAoIW9sZE5vZGUgfHwgb2xkTm9kZS5vcCB8fCBuZXdOb2RlPy5vcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZWVwVHJlZUJyYW5jaChvbGROb2RlLCBuZXdOb2RlKTtcbiAgICAgICAgfTtcbiAgICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIGlmIChkZXB0aCA+IDEpIHtcbiAgICByZXR1cm4gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoIC0gMSk7XG4gIH1cblxuICBvbGROb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgaWYgKCF4Lm9wKSB7XG4gICAgICBjb25zdCBpZHggPSAob2xkTm9kZXNbaSAtIDFdPy5vcC5pZHggPz8gLTEpICsgMTtcbiAgICAgIHgub3AgPSB7IHR5cGU6IFwiZGVsZXRlXCIsIGlkeCB9O1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0UmVhbFBhcmVudChlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LnBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBhcmVudC5vcC50eXBlID09PSBcImtlZXBfY291bnRlcnBhcnRcIlxuICAgICAgPyBlbGVtZW50LnBhcmVudC5vcC5jb3VudGVycGFydFxuICAgICAgOiBlbGVtZW50LnBhcmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJlZm9yZShlbGVtZW50LCBpZHgpIHtcbiAgICBjb25zdCBzdGFydERlcHRoID0gZWxlbWVudC5kZXB0aDtcbiAgICB3aGlsZSAoaWR4ID49IDEgJiYgZWxlbWVudC5kZXB0aCA+PSBzdGFydERlcHRoKSB7XG4gICAgICBpZHggLT0gMTtcbiAgICAgIGVsZW1lbnQgPSBuZXdOb2Rlc1tpZHhdO1xuICAgICAgaWYgKGVsZW1lbnQuZGVwdGggPT09IHN0YXJ0RGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub3AudHlwZSA9PT0gXCJrZWVwX2NvdW50ZXJwYXJ0XCJcbiAgICAgICAgICA/IGVsZW1lbnQub3AuY291bnRlcnBhcnRcbiAgICAgICAgICA6IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuZXdOb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgeC5nZXRCZWZvcmUgPSAoKSA9PiBnZXRCZWZvcmUoeCwgaSk7XG4gICAgeC5nZXRSZWFsUGFyZW50ID0gKCkgPT4gZ2V0UmVhbFBhcmVudCh4KTtcblxuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0geC5nZXRSZWFsUGFyZW50KCk7XG4gICAgICBjb25zdCB0eXBlID0gdGFyZ2V0Py5vcC50eXBlID09PSBcImluc2VydFwiID8gXCJpbnNlcnRfaWdub3JlXCIgOiBcImluc2VydFwiO1xuICAgICAgeC5vcCA9IHsgdHlwZSwgdGFyZ2V0LCBhZnRlcjogeC5nZXRCZWZvcmUoKSB9O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdGFnZ2VkID0gWy4uLm9sZE5vZGVzLCAuLi5uZXdOb2Rlc107XG5cbiAgcmV0dXJuIHRhZ2dlZC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVZhbCA9IGEub3A/LmlkeCA/PyBhLmlkeDtcbiAgICBjb25zdCBiVmFsID0gYi5vcD8uaWR4ID8/IGIuaWR4O1xuXG4gICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGxlYWZDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlciwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCFsZWFmQ29udHJvbGxlcikge1xuICAgIGxlYWZDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkZG9tKTtcbiAgfVxuXG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IHJlZnJlc2hQcm9jZXNzLCBpc1J1bm5pbmdQcm9jZXNzIH0gPSBwcmVwYXJlUmVmcmVzaFByb2Nlc3MoXG4gICAgcHJvY2VzcyxcbiAgICBsZWFmQ29udHJvbGxlcixcbiAgKTtcblxuICAkZG9tID8/PSBsZWFmQ29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBhcHAudGFnTmFtZXMsXG4gICAgJGRvbSxcbiAgICBsZWFmQ29udHJvbGxlcixcbiAgICBwcm9jZXNzLFxuICApLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiByZWxvYWRNZXRob2RIVE1MKGxlYWZDb250cm9sbGVyLCAkZG9tLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
|
|
148
148
|
|
|
149
149
|
/***/ }
|
|
150
150
|
|
package/dist/ugly.index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see ugly.index.js.LICENSE.txt */
|
|
2
|
-
let e;function t(){return new Promise(function(e){e()})}function n(e){return(e=(e=e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)).replace(/[0-9]+/g,e=>`-${e}`)).replace(/^[-]/g,"")}function r(e){return e.replace(/-./g,e=>`${e[1].toUpperCase()}`)}const s=(e,t)=>{let n=t,r=Object.getOwnPropertyNames(e.prototype).concat(Object.getOwnPropertySymbols(e.prototype));for(;""!==n.name;)Object.getOwnPropertyNames(n.prototype).concat(Object.getOwnPropertySymbols(n.prototype)).forEach(t=>{t.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)||r.includes(t)||(r.push(t),Object.defineProperty(e.prototype,t,Object.getOwnPropertyDescriptor(n.prototype,t)))}),n=Object.getPrototypeOf(n)};function o(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",i,!1),e},data:e,cache:!1,contentType:!1,processData:!1,beforeSend:function(e,t){(function(e){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(e)})(t.type)||this.crossDomain||e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}})}function i(e){if(e.lengthComputable){var t=Math.round(e.loaded/e.total*100),n=$(".progress-container");100===t?n.hide():n.show(),t+="%",n.find(".progress-bar").css({width:t}).text(t)}}function l(e,t=null){return"string"!=typeof e?e:t&&void 0!==t[e]?"function"==typeof t[e]?t[e].bind(t):t[e]:e.match(/^(true|false)$/)?"true"===e:"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substr(1,e.length-2):e:void 0}function a(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16))}function c(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function u(e,t){t=$("<div>").append(t),e.find(".has-error").removeClass("has-error").find(".alert-danger").safeRemove(),e.find(".non-field-errors").safeRemove();let n=t.find("input[type=file]").parent();e.find("input[type=file]").parent().each(function(e){$(this).replaceWith(n[e])});let r=0===t.find(".non-field-errors").insertAfter(e.find(".hidden-form-fields")).length;return t.find(".has-error").each(function(){r=!1;let t=$(this),n=t.data("auto-id"),s=e.find(".form-group."+n);s.addClass("has-error"),s.find(".form-input-container").append(t.find(".alert-danger"))}),r}function d(e){let{type:t,name:n}=e;return n&&""!==n?"hidden"===t?(r=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===r.toLowerCase():"undefined"!==r?"none"===r.toLowerCase()?null:r.match(/^-?\d+$/)?parseInt(r,10):r.match(/^-?\d+\.?\d+$/)?parseFloat(r):r.match(/^(['][^']*['])|(["][^"]*["])$/)?r.substring(1,r.length-1):r:void 0:"checkbox"===t?e.checked:"file"===t?e.files[0]:$(e).val():null;var r}const h=e=>String(e).padStart(2,"0");function f(e){if(null==e||""===e)return null;let t;if(e instanceof Date)t=e;else if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}$/.test(e)){const[n,r,s]=e.split("-").map(Number);t=new Date(n,r-1,s)}else t=new Date(e);return isNaN(t.getTime())?null:t}function m(e){const t=f(e);return t?`${t.getFullYear()}-${h(t.getMonth()+1)}-${h(t.getDate())}`:""}function p(e,t){let{type:n,name:r}=e;if(r&&""!==r)if("datetime-local"===n)e.value=function(e){const t=f(e);return t?`${m(t)}T${h(t.getHours())}:${h(t.getMinutes())}`:""}(t);else if("date"===n)e.value=m(t);else if("checkbox"===n)e.checked=!!t;else if("file"===n){if(t instanceof File&&"undefined"!=typeof DataTransfer){let n=new DataTransfer;n.items.add(t),e.files=n}}else t instanceof ue?$(e).val(t.id):t instanceof ce?$(e).val(`[${t.getIds().join(",")}]`):(null===t&&(t=""),$(e).val(t));return null}function g(e,t=null){return Object.fromEntries(Object.entries(e).filter(([e,t])=>e!==U).map(([e,n])=>{if("string"==typeof n&&n.startsWith("SDC_JSON_MODEL=["))try{const{pk:t,fields:r}=JSON.parse(n.slice(16,-1));return[e,{...r,id:t}]}catch{}return[e,l(n,t)]}))}function y(e,t=null){return g(e.data(),t)}const v=["onbeforeunload","onunload"],w=Object.keys(window).filter(e=>/^on/.test(e)&&!v.includes(e)).map(e=>e.slice(2));function b(e,t,n){let r;switch(e){case"mouseleave":case"mouseout":case"mouseenter":return r=document.elementFromPoint(t.clientX,t.clientY),n!==r&&!n.contains(r);default:return!0}}function R(e){let t=e.type;Object.hasOwn(e,"namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,s=!1,o=!1;for(e.stopImmediatePropagation=()=>o=!0,e.stopPropagation=()=>o=s=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i&&b(t,e,n[0])){if(!r&&(r=W(n),!r))return;for(;r;){if(i.split(" ").forEach(o=>{if(s)return;let i=null;if("function"==typeof o)i=o;else if("function"==typeof r[o])i=r[o];else if("string"==typeof o&&o.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[o.slice(11)],!i)return}i&&i.call(r,n,e)}),o)return;r=r._parentController}}if(s)return;n=n.parent()}return{res:!0}}function C(e){const t=e.getEvents();for(let n in t)if(Object.hasOwn(t,n)){let r=t[n];for(let t in r)Object.hasOwn(r,t)&&e.find(t).each(function(){let e=$(this),r=e.attr(`sdc_${n}`)||null;r=r?r.split(" "):[];const s=`this.event_${t}`;-1===r.indexOf(s)&&(r.push(s),e.attr(`sdc_${n}`,r.join(" ")))})}}let N=[],O={};function S(e,t){if(e){let n=r(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function F(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(O[t][1])).filter((e,t,n)=>n.indexOf(e)===t);let n=!0;for(;n;){n=!1;for(let t of e)for(let r of O[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(O[e][0]);let i=new(function(e,...t){let n={[e.name]:class{constructor(...n){let r={};t.forEach(e=>{let t;Object.assign(this,t=new e),t._tagName=e.prototype._tagName,t._isMixin=!0,r[e.name]=t}),Object.assign(this,new e),this._mixins=r}static get name(){return e.name}static className(){return this.name}get mixins(){return this._mixins}}}[e.name];return s(n,e),t.forEach(e=>{s(n,e)}),n}(O[n][0],...o));return i._tagName=n,S(e,i),i.$container=t,function(e,t){!function(e,t,n){if(!e)return!1;e.params=y(t,n._parentController)}(t,e,t)}(t,i),i}function E(e,t,n,s){if(N.includes(n)){let o=r(n);return window[o]||(window[o]=F(e,t,n,s)),window[o].$container=t,window[o]}return F(e,t,n,s)}function k(e,n){const r=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=B(e),e.contentUrl=t.url),Promise.all([V(e,t.args)]).then(function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null})}(e).then(n=>!e.onLoad||e._onLoadDone?n:(e._onLoadDone=!0,(e.onLoad(n)||t()).then(()=>n)))}(e).then(function(t){return function(e,t){return z(e,t).then(function(t){if(t=t||!0,e.willShow){let n=e.willShow();if(n instanceof Promise)return n.then(function(){return t})}return t})}(e,t)}).then(()=>function(e,t){return Z(null,e,t)}(e,n)).catch(function(t){if("string"==typeof t||t instanceof $)return z(e,t);throw t});return e.load_async?Promise.resolve():r}function x(e){const t=function(e){let t=[];for(;e;)t.unshift(e),e=e._parentController;return t}(e.controller[0]),n=t.concat(e.controller.slice(1));for(let t of n)C(t),t.onRefresh(e.controller[0])}function I(e,t){let n=Boolean(e);return n?e.uuids.has(t._uuid)||(e.uuids.add(t._uuid),e.controller.push(t)):e={uuids:new Set([t._uuid]),controller:[t]},{isRunningProcess:n,refreshProcess:e}}let j={},P={};function L(e,t){return q(e),Object.hasOwn(P,e)?t[P[e]]?void j[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function q(e,t){t||(t=e),P[e]||(P[e]=t,j[e]=[])}function A(e){for(let t in j)if(Object.hasOwn(j,t))for(let n=j[t].length-1;n>=0;n--)e===j[t][n]&&j[t].splice(n,1)}function T(e){let n=Array.apply(null,arguments);if(e=n.shift(),!Object.hasOwn(j,e)||!Object.hasOwn(P,e))return t();let r=j[e],s=P[e],o=[];for(let e=0;e<r.length;e++){let t=r[e][s].apply(r[e],n);void 0!==t&&o.push(t)}return Promise.all(o)}let D={};const U="_controller_",M="_sdc_controller_";function J(e,t,n){if(!e)return[];let r=e.children(),s=[];return r.each(function(e,r){let o=$(r),i=o.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?s.push({tag:i[0],super:i.splice(1)||[],dom:o}):i[0].startsWith("this.")?o.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):s=s.concat(J(o,t,n))}),s}function V(e,t){const{contentUrl:n,_tagName:r,contentReload:s}=e;return n?D[r]?Promise.resolve(D[r]):(t.VERSION=$e.VERSION,t._method="content",$.get(n,t).then(function(e){return s||(D[r]=e),e}).catch(function(t){if(301===t.status){const n=t.responseJSON;return T("_RedirectOnView",n["url-link"]),s||(e.autoRedirect=n["url-link"]),"<p>Redirected</p>"}throw e.autoRedirect=null,"function"==typeof e.confirmPageLoaded&&T("navLoaded",{controller_name:()=>t.status}),`<sdc-error data-code="${t.status}">${t.responseText}</sdc-error>`})):Promise.resolve(!1)}function Q(e,t,n=null){return t=t||e.data(U),K($e.tagNames,e,t,n)}function B(e){let t=e.contentUrl;if(e&&0===e._urlParams.length){let n,r=/%\(([^)]+)\)\w/gm;for(e._urlParams=[];n=r.exec(t);)e._urlParams.push(n[1]),e.contentReload=!0}let{args:n,params:r}=function(e,t){const n=y(t,e),[r,s]=Object.entries(n).reduce(([t,n],[r,s])=>(e._urlParams.includes(r)?t[r]=s:n[r]=s,[t,n]),[{},{}]);return{params:r,args:s}}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(Object.hasOwn(e._urlParams,r)){let s=e._urlParams[r],o=RegExp("%\\("+s+"\\)\\w","gm");const i=n[s];i||console.warn(`${s} is not set for controller ${e._tagName}`),t=t.replace(o,i)}return t}(e,t,r)),e.parsedContentUrl=t,{url:t,args:n}}function W(e){return e.hasClass(M)?e.data(`${U}`):e.closest(`.${M}`).data(`${U}`)}function G(e,t,n,r,s){let o=e.data(U);return o?Q(e,o,s):(o=E(r,e,t,n),e.data(U,o),e.addClass(M),k(o,s))}function z(e,t,n=null){if(t&&t.length>0){e.$container.empty(),e.$container.attr(e._tagName,"");for(let t in e._mixins)e.$container.attr(e._mixins[t]._tagName,"");e.$container.append(t)}return Q(e.$container,e,n)}function K(e,t,n,r){return new Promise(s=>{let o=J(t,e,n),i=o.length;if(0===i)return s();for(let e=0;e<o.length;e++)G(o[e].dom,o[e].tag,o[e].super,n,r).then(()=>{if(i--,0===i)return s()})})}function H({$element:e,id:t=[],parent:n=null}){t.push(function(e){if(3===e[0].nodeType)return`TEXT__${e[0].nodeValue}`;const t=[e[0].tagName];return"INPUT"===e[0].nodeName&&[["name",""],["type","text"],["id",""]].forEach(([n,r])=>{const s=e.attr(n)??r;s&&t.push(s)}),t.join("__")}(e));const r={$element:e,id:t.join("::"),depth:t.length,idx:0,getRealParent:()=>n,getIdx:function(){return this.idx=Math.max(0,(this.getRealParent()?.getIdx()??-1)+e.index()+1),this.idx},op:null,parent:n};return r.getIdx.bind(r),[r].concat(e.contents().toArray().map(e=>H({$element:$(e),id:t.slice(),parent:r})).flat())}function X(e,t){const n=H({$element:t}),r=H({$element:e});n.map((e,t)=>e.idx=t),r.map((e,t)=>e.idx=t);const s=Math.max(...r.concat(n).map(e=>e.depth)),o=Y(n,r,s);let i=[];const l=[];var a;window.MAIN=t,window.OPS=o,o.forEach((e,t)=>{const{op:n,$element:r,idx:s}=e;if("keep_counterpart"===n.type){if((e.parent?n.counterpart.getIdx():s)!==s){const t=e.getBefore();t?n.counterpart.$element.insertAfter(t.$element):e.getRealParent().$element.prepend(n.counterpart.$element)}if(e.parent){const e=n.counterpart.$element.data(U);e&&e!==r.data(U)&&l.push(e)}!function(e,t){!function(e,t){if(!e||!t||!e._sdcListeners&&!t._sdcListeners)return;(e._sdcListeners??[]).forEach(([t,n])=>e.removeEventListener(t,n));const n=t._sdcListeners??[];n.forEach(([t,n])=>e.addEventListener(t,n)),e._sdcListeners=n}(e[0],t[0]);const n=e[0].attributes??[],r=t[0].attributes??[];[...n].forEach(n=>{t.is(`[${n.name}]`)||e.removeAttr(n.name)}),[...r].forEach(t=>{e.attr(t.name)!==t.value&&e.attr(t.name,t.value)}),e.removeData(),Object.entries(t.data()).forEach(([t,n])=>{e.data(t,n)})}(n.counterpart.$element,r),r.hasClass(M)&&(r.data(U).$container=n.counterpart.$element,r.data(U,null)),i.push(r)}else if("delete"===n.type)r.safeRemove();else if("insert"===n.type){const{after:t,target:n}=e.op;t?r.insertAfter(t.$element):n&&n.$element.prepend(r)}}),i.forEach(e=>e.safeRemove()),(a=l).forEach(e=>{e.$container=$()}),a.reverse().forEach(e=>e.remove())}function Y(e,t,n){return t.filter(e=>e.depth===n&&!e.op).forEach(t=>{const n=e.find(e=>!e.op&&e.id===t.id);if(n){const e=(t,n)=>{t.op={type:"keep",idx:n.idx},n.op={type:"keep_counterpart",counterpart:t},t=t.parent,n=n.parent,!t||t.op||n?.op||e(t,n)};e(n,t)}}),n>1?Y(e,t,n-1):(e.forEach((t,n)=>{if(!t.op){const r=(e[n-1]?.op.idx??-1)+1;t.op={type:"delete",idx:r}}}),t.forEach((e,n)=>{if(e.getBefore=()=>function(e,n){const r=e.depth;for(;n>=1&&e.depth>=r;)if((e=t[n-=1]).depth===r)return"keep_counterpart"===e.op.type?e.op.counterpart:e;return null}(e,n),e.getRealParent=()=>{return(t=e).parent?"keep_counterpart"===t.parent.op.type?t.parent.op.counterpart:t.parent:null;var t},!e.op){const t=e.getRealParent(),n="insert"===t?.op.type?"insert_ignore":"insert";e.op={type:n,target:t,after:e.getBefore()}}}),[...e,...t].sort((e,t)=>(e.op?.idx??e.idx)-(t.op?.idx??t.idx)))}function Z(e,t,n=null){if(t||(t=W(e)),!t)return Promise.resolve();const{refreshProcess:r,isRunningProcess:s}=I(n,t);return e??=t.$container,K($e.tagNames,e,t,n).then(()=>function(e,t,n){return function(e,t,n){const r=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each(function(){const t=$(this);let s;if(t.hasClass("_with_handler"))s=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(s=e[t])}if("function"==typeof s){const n=g(t.data(),e);s=s.bind(e)(n)}s&&r.push(Promise.resolve(s).then(r=>{let s=$("<div></div>");return s.append(r),""===t.html()&&t.append("<div></div>"),$e.reconcile(e,s,t.children(),n)}))}),Promise.all(r)}(e,t??e.$container,n)}(t,e,r).then(()=>{s||x(r)}))}const ee={};function te(e,t){ee[e]=t}function ne(e){return ee[e]}const re=25e3,se="_connecting_process";class oe extends Error{constructor(e){"string"==typeof e&&(e={msg:e,is_error:!0,header:"Error"}),super(e.msg),this.msg=e.msg,this.header=e.header,this.is_error=e.is_error,this.html=e.html}}class ie{constructor({name:e,url:t}){this.name=e,this.url=t,this.content=null}async load(e=!1){return!e&&this.content||(this.content=await new Promise((e,t)=>{$.get(this.url).then(e).catch(()=>{e("")})})),this.content}async text(){return this.load()}static isValid(e){return!(null===e||"object"!=typeof e||Array.isArray(e)||e instanceof File||"string"!=typeof e.url||"string"!=typeof e.name)}}function le(e){const t=parseInt(e??-1,10);return Number.isNaN(t)?-1:t}function ae(e){if(!e||"object"!=typeof e||e instanceof ue)return!1;const t=Object.keys(e);return!(0===t.length||!t.every(e=>"elem"===e||"data"===e)||"elem"in e&&null!==e.elem&&!(e.elem instanceof ue)||"data"in e&&null!==e.data&&"object"!=typeof e.data)}class ce{constructor(e,t={}){return this.valuesList=[],this.loaded=!1,this.modelName=e,this.modelQuery=t??{},this._onNoOpenRequests=[],this._isConnected=!1,this._isConnectingProcess=!1,this._autoReconnect=!0,this.socket=null,this.openRequest={},this.modelId=0,this.onUpdate=()=>{},this.onCreate=()=>{},this.onDelete=null,new Proxy(this,{get:(e,t)=>"symbol"==typeof t||isNaN(t)?e[t]:e.valuesList[t],set:(e,t,n)=>isNaN(t)?(e[t]=n,!0):(e.valuesList[t]=n,!0)})}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.valuesList.length?{value:this.valuesList[e],done:!1}:{value:null,done:!0})}}set on_create(e){this.onCreate=e}set on_update(e){this.onUpdate=e}set on_delete(e){this.onDelete=e}_removeIds(e){const t=this.valuesList.filter(t=>e.includes(t.id));return this.valuesList=this.valuesList.filter(t=>!e.includes(t.id)),t}setIds(e){const t=this._setIds(e),n={id__in:t.map(e=>e.id)};return this.setFilter(n),t}_setIds(e){if(null===e||""===e||Array.isArray(e)&&0===e.length)return this.valuesList=[],this.valuesList;if(e instanceof ce||e instanceof ue){const t=e instanceof ue?[e]:e.valuesList;return this.valuesList=t.map(e=>{const t=null!==e.id?this.byId(e.id):null;if(t)return t;const n=(e=>{const t=new e.constructor({});return t.setValues(e.serialize()),t})(e);return n._setQuerySet(this,!0),n}),this.valuesList}let t,n=Number.NaN;if(Number.isInteger(e))n=e;else if(e instanceof Array){const n=e.map(e=>parseInt(e));n.some(Number.isNaN)||(t=n)}else if("string"==typeof e){const r=e.split(",").map(e=>parseInt(e));r.some(Number.isNaN)?n=parseInt(e):t=r}if(Number.isNaN(n)){if(t){this.valuesList=this.valuesList.filter(e=>t.includes(e.id));const e=this.getIds();t.filter(t=>!e.includes(t)).forEach(e=>{this.valuesList.push(new(ne(this.modelName))({id:e}))})}}else this.valuesList=this.valuesList.filter(e=>n===e.id),0===this.valuesList.length&&(this.new().id=n);return this.valuesList}getIds(){return this.valuesList.map(e=>e.id)}get length(){return this.valuesList.length}byId(e){if(null!==e){const t=le(e);return this.valuesList.find(e=>e.id===t)??null}return null}setFilter(e){return this.modelQuery=e,this}addFilter(e){return this.modelQuery=Object.assign({},this.modelQuery,e),this}new(e={}){const t=new(ne(this.modelName))(e);return t._setQuerySet(this,!1),this.valuesList.push(t),t}load(e=null,{limit:t=null}={}){return this.valuesList=[],this.modelQuery=e??this.modelQuery,this._sendLoad(null,t)}update({modelQuery:e=null,item:t=null}){this.modelQuery=e??this.modelQuery;let n=t?{id:t.id}:this.modelQuery;return this._sendLoad(n)}delete({pk:e=null,id:t=null,elem:n=null}){if(e??=t,null===(e=n?n.id:e))throw new Error("pk or elem must be set");const r=a();return this.isConnected().then(()=>new Promise((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:r,args:{model_name:this.modelName,model_query:this.modelQuery,id:e,pk:e}})),this.openRequest[r]=[n=>{this._removeIds([le(e)]),t(n)},n]}))}_sendLoad(e=null,t=null){return this.isConnected().then(()=>{const n=a(),r={model_name:this.modelName,model_query:e??this.modelQuery};return null!==t&&(r.limit=t),new Promise((e,t)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:n,args:r})),this.openRequest[n]=[t=>{this.loaded=!0,e(t)},t]})})}_sendListView({modelQuery:e={},cbResolve:t=null,cbReject:n=null,templateContext:r={}}){return this.view({modelQuery:e,cbResolve:t,cbReject:n,templateContext:r,eventType:"list_view"})}view({viewName:e="html_list_template",modelQuery:t={},cbResolve:n=null,cbReject:r=null,templateContext:s={},eventType:o="named_view"}){let i=$('<div class="container-fluid">');return this.isConnected().then(()=>{const l=a();this.socket.send(JSON.stringify({event:"model",event_type:o,event_id:l,args:{view_name:e,model_name:this.modelName,model_query:t,template_context:s}})),this.openRequest[l]=[e=>{i.append(e.html),$e.refresh(i),n&&n(e)},e=>{r&&r(e)}]}),i}_sendDetailView({pk:e=null,id:t=null,cbResolve:n=null,cbReject:r=null,templateContext:s={}}){e??=t,e=le(e);let o=$('<div class="container-fluid">');return this.isConnected().then(()=>{const t=a();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:t,args:{model_name:this.modelName,model_query:this.modelQuery,id:e,pk:e,template_context:s}})),this.openRequest[t]=[e=>{o.append(e.html),$e.refresh(o),n&&n(e)},e=>{r&&r(e)}]}),o}getForm({modelObj:e,eventType:t,formName:n,$divForm:r,cbResolve:s,cbReject:o,formId:i}){const l=a(),c=e.id??-1;this.isConnected().then(()=>{this.socket.send(JSON.stringify({event:"model",event_type:t,event_id:l,args:{model_name:this.modelName,id:c,pk:c,form_name:n}}))});const u=null===c||-1===c?"create":"edit";this.openRequest[l]=[t=>{r.append(t.html);let o=r.closest("form").addClass(`sdc-model-${u}-form sdc-model-form ${i}`).data("model",e).data("model_pk",c).data("form_name",n).attr("SdcModelName",this.modelName).attr("SdcModelPK",c);e.addForm(o),o.length>0&&!o[0].hasAttribute("sdc_submit")&&o.attr("sdc_submit","submitModelFormDistributor"),$e.refresh(r).then(()=>null),s&&s(t)},e=>{o&&o(e)}]}async get(e=null,t=!1){if(t){const t=e?.id??this.modelQuery?.id;return e&&this.setFilter(e),this.byId(t)??this.new(e||this.modelQuery)}if(await this.load(e),1!==this.length)throw new Error(`model query returns ${this.length} but only 1 expected.`);return this.addFilter({id:this.valuesList[0].id}),this.valuesList[0]}detailView({pk:e,cbResolve:t=null,cbReject:n=null,templateContext:r={}}){return this._sendDetailView({id:e,cbResolve:t,cbReject:n,templateContext:r})}listView({modelQuery:e={},searchValues:t={},cbResolve:n=null,cbReject:r=null,templateContext:s={}}){return this._sendListView({modelQuery:Object.assign({},this.modelQuery,e,{__search_values:t}),cbResolve:n,cbReject:r,templateContext:s})}save({pk:e=null,id:t=null,formName:n="edit_form",data:r=null}={}){e??=t;const s=le(e);return this.isConnected().then(()=>{let e;if(s>-1){const t=this.byId(s);if(!t)return Promise.reject(new oe(`Element not found with ID: ${s}`));e=[t]}else e=this.valuesList;let t=[];return e.forEach(e=>{const s=a();t.push(new Promise((t,o)=>{this._readFiles(e).then(i=>{const l=r?{...r}:e.serialize();l.id=e.id,this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:s,args:{form_name:n,model_name:this.modelName,model_query:this.modelQuery,data:l,id:l.id,pk:l.id,files:i}})),this.openRequest[s]=[e=>{let n="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(n),t(e)},o]})}))}),Promise.all(t)})}create(e=null){let{elem:t=null,data:n=null}=ae(e)?e:{data:e};n&&"object"==typeof n&&0===Object.keys(n).length&&(n=null);const r=a();return t||(t=this.new(n)),this.isConnected().then(()=>new Promise((e,s)=>{this._readFiles(t).then(o=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:r,args:{model_name:this.modelName,model_query:this.modelQuery,data:n??t?.serialize()??{},files:o}})),this.openRequest[r]=[n=>{let r="string"==typeof n.data.instance?JSON.parse(n.data.instance):n.data.instance;t&&(t.id=r[0]?.id||r[0]?.pk),n.data.instance=this._parseServerRes(r)[0],e(n)},s]})}))}isConnected(){return new Promise((e,t)=>{if(this._isConnected)e();else if(this._isConnectingProcess&&this.openRequest[se]){const[n,r]=this.openRequest[se];this.openRequest[se]=[()=>{n(),e()},()=>{r(),t()}]}else this._isConnectingProcess=!0,this.openRequest[se]=[()=>{},()=>{}],this._connectToServer().then(()=>{e(this._checkConnection())})})}close(){this.socket&&(this._autoReconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket),this.valuesList.forEach(e=>{e._onClose()})}_readFiles(e){let t=[],n={};return e?(Object.keys(e.constructor.fields).forEach(r=>{const s=e[r];s instanceof File&&t.push(new Promise((e,t)=>{const o=a();this.openRequest[o]=[e,t],s.arrayBuffer().then(e=>{let t=new Uint8Array(e),i=Math.ceil(t.length/re);n[r]={id:o,file_name:s.name,field_name:r,content_length:s.size};for(let e=0;e<i;++e){const n=Array.from(t.slice(re*e,re*(e+1)));this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:o,args:{chunk:n,idx:e,number_of_chunks:i,file_name:s.name,field_name:r,content_length:s.size,content_type:s.type,model_name:this.modelName,model_query:this.modelQuery}}))}}).catch(e=>{this._closeOpenRequest(o),t(e)})}))}),Promise.all(t).then(()=>n)):Promise.resolve(n)}async _onMessage(e){let t=JSON.parse(e.data);if(t.is_error)Object.hasOwn(this.openRequest,t.event_id)&&(this.openRequest[t.event_id][1](new oe(t)),this._closeOpenRequest(t.event_id)),(t.msg||t.header)&&T("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.openRequest[se][1](new oe(t)),this._closeOpenRequest(se),this._autoReconnect=!1,this.socket.close());else{if((t.msg||t.header)&&T("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._isConnected=!0,this._isConnectingProcess=!1,this.openRequest[se][0](t),this._closeOpenRequest(se);else if(["load","list_view","named_view","detail_view"].includes(t.type)){const e=JSON.parse(t.args.data);t.args.data=await this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=await this._parseServerRes(e);n="on_create"===t.type?this.onCreate:this.onUpdate,n(r),t.args.data=r}else if("on_delete"===t.type){const e=JSON.parse(t.args.data).map(e=>le(e.id??e.pk)),n=this._removeIds(e);(this.onDelete??this.onUpdate)(n),t.args.data=n}let e=t.data?.instance;e&&(t.data.instance=JSON.parse(t.data.instance)),Object.hasOwn(this.openRequest,t.event_id)&&(this.openRequest[t.event_id][0](t),this._closeOpenRequest(t.event_id))}}noOpenRequests(){return new Promise(e=>{if(0===Object.keys(this.openRequest).length)return e();this._onNoOpenRequests.push(e)})}_closeOpenRequest(e){delete this.openRequest[e],0===Object.keys(this.openRequest).length&&(this._onNoOpenRequests.forEach(e=>e()),this._onNoOpenRequests=[])}_connectToServer(){return new Promise(e=>{const t=`${this.modelName}`+(this.modelId>0?`/${this.modelId}`:"");"https:"===window.location.protocol?this.socket=new WebSocket(`wss://${window.location.host}/sdc_ws/model/${t}`):this.socket=new WebSocket(`ws://${window.location.host}/sdc_ws/model/${t}`),this.socket.onmessage=this._onMessage.bind(this),this.socket.onclose=e=>{console.error(`SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`),this._isConnected=!1;for(const t of Object.values(this.openRequest))t[1](e);this.openRequest={},this._isConnectingProcess=!1,setTimeout(()=>{this._autoReconnect&&!this._isConnected&&this.isConnected().catch(()=>{})},1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._isConnected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}})}_checkConnection(){const e=a();return new Promise((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.modelName,model_query:this.modelQuery}})),this.openRequest[e]=[t,n]})}_parseServerRes(e){const t=[];for(const n of e){const e=ne(this.modelName);if(!e)throw new Error(`${this.modelName} is no SdcModel. mybe the models ar not importad.`);const r=new e({id:n.id??n.pk,...n.fields}),s=this.byId(r.id);s?(s.setValues(r),t.push(s)):(this.valuesList.push(r),r._setQuerySet(this,!0),t.push(r))}return this.valuesList.sort((e,t)=>e._id-t._id),t}}class ue{static fields={};constructor(e){this._id=null,this._forms=[],this.loaded=!1,this.formId=a(),this.modelName=e}static querySet(e=null,t=null){const{modelName:n}=new this({});return t?t.querySet(n,e):new ce(n,e)}addForm(e){const t=this._onChange.bind(this);this._forms.push(e),e&&e.on("input.formWatcher change.formWatcher","input, select, textarea",t)}_onChange(e){const{name:t}=e.target;if(this.constructor.fields[t]){try{this[`set${t}`](d(e.target))}catch{return}this._updateForm(t,e.target)}}_updateForm(e,t=null){const n=this;this._forms.forEach(r=>{r.find(`[name="${e}"]`).each(function(){this!==t&&p(this,n[e])})})}setValues(e={}){throw new Error("setValues() must be implemented by subclass")}_setQuerySet(e,t){this._querySet=new WeakRef(e),this.loaded=t}get querySet(){return this._querySet.deref()}save({formName:e="edit_form",data:t=null}={}){return this._querySet.deref().save({pk:this.id,formName:e,data:t})}create(e=null){const t=ae(e)?e.data??null:e;return this._querySet.deref().create({elem:this,data:t})}delete(){return this._querySet.deref().delete({elem:this})}load(){return this._querySet.deref().update({item:this})}update(){return this.load()}get id(){return this._id}set id(e){this._id=e}set pk(e){this.id=e}get pk(){return this._id}close(){return this._querySet.deref().close()}_onClose(){Object.keys(this.constructor.fields).filter(e=>this[`_${e}`]instanceof ce).forEach(e=>this[`_${e}`].close())}detailView({cbResolve:e=null,cbReject:t=null,templateContext:n={}}){return this._querySet.deref().detailView({pk:this.id,cbResolve:e,cbReject:t,templateContext:n})}serialize(){return Object.entries(this.constructor.fields).reduce((e,[t,n])=>{const r=this[t];if(r instanceof ce)if(n.many_to_many||n.one_to_many)e[t]=r.getIds();else{const n=r.getIds();n.length>0?e[t]=n[0]:e[t]=null}else n.is_relation&&r instanceof ue?e[t]=r.id??null:r instanceof Date?e[t]="DateField"===n.type?m(r):r.toISOString():e[t]=r;return e},{})}toJson(){const e={};for(let t in this.constructor.fields){const n=this[t];n instanceof File?e[t]=n.name:e[t]=n instanceof ue?n.id:n instanceof ce?n.getIds():n}return e}syncFormToModel(e){return this.syncForm(e)}_resolveForms(e){return e&&e.hasClass(this.formId)?e:$(`.${this.formId}`)}syncModelToForm(e){e=this._resolveForms(e);const t=this,{fields:n}=this.constructor;e.each(function(){const e=le($(this).data("model_pk"));if(le(t.id)===e)for(let e of this.elements){let{name:r}=e;r&&""!==r&&n[r]&&p(e,t[r])}})}syncForm(e){e=this._resolveForms(e);const t=this,{fields:n}=this.constructor,r={};function s(e,s){if(n[e])try{t[e]=s}catch{}r[e]=s}return e.each(function(){const e=le($(this).data("model_pk"));if(t.id===e||null===t.id&&-1===e){for(let e of this.elements)s(e.name,d(e));return t}}),r}form({cbResolve:e=null,cbReject:t=null}={}){return null===this.id||-1===this.id?this._createForm({cbReject:t,cbResolve:e}):this._editForm({cbReject:t,cbResolve:e})}_createForm({cbResolve:e=null,cbReject:t=null}){let n=$("<div>");return this._querySet.deref().getForm({modelObj:this,eventType:"create_form",formName:null,$divForm:n,cbResolve:e,cbReject:t,formId:this.formId}),n}_editForm({cbResolve:e=null,cbReject:t=null}){let n=$("<div>");return this._querySet.deref().getForm({modelObj:this,eventType:"edit_form",formName:null,$divForm:n,cbResolve:e,cbReject:t,formId:this.formId}),n}namedForm({formName:e,cbResolve:t=null,cbReject:n=null}){let r=$('<div class="container-fluid">');return this._querySet.deref().getForm({modelObj:this,eventType:"named_form",formName:e,$divForm:r,cbResolve:t,cbReject:n,formId:this.formId}),r}validate(e,t){const n=function(e,t){const{type:n,required:r,max_length:s,is_relation:o,many_to_many:i,one_to_many:l,many_to_one:a,one_to_one:c,related_model:u}=t;if(r&&(null==e||""===e))return"This field is required";if(null==e||""===e)return null;if((i||l||a||c)&&(!(e instanceof ce)||e.modelName!==u))return"string"==typeof e&&(e=JSON.parse(e)),(i||a)&&Array.isArray(e)&&e.some(e=>!Number.isNaN(parseInt(e)))?null:"object"!=typeof e&&Number.isNaN(parseInt(e))?"Must be object or ID":null;switch(n){case"CharField":case"TextField":if("string"!=typeof e)return"Must be a string";if(s&&e.length>s)return`Max length is ${s}`;break;case"IntegerField":case"SmallIntegerField":case"BigIntegerField":case"PositiveIntegerField":case"PositiveSmallIntegerField":case"PositiveBigIntegerField":case"AutoField":case"SmallAutoField":case"BigAutoField":if(!isFinite(parseInt(e)))return"Must be an integer";break;case"FloatField":case"DecimalField":if(!isFinite(parseFloat(e)))return"Must be a number";break;case"BooleanField":if("boolean"!=typeof e)return"Must be a boolean";break;case"DateField":case"DateTimeField":if(isNaN(Date.parse(e)))return"Must be a valid date";break;case"EmailField":if("string"!=typeof e||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e))return"Invalid email";break;case"URLField":try{new URL(e)}catch{return"Invalid URL"}break;case"UUIDField":if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(e))return"Invalid UUID";break;case"JSONField":if("string"==typeof e)try{JSON.parse(e)}catch{return"Must be valid JSON"}break;case"FileField":if(!(ie.isValid(e)||e instanceof File||e instanceof ie))return"Must be a valid file";if("undefined"!=typeof File&&e instanceof File){if(t.max_size&&e.size>t.max_size)return`File too large (max ${t.max_size} bytes)`;if(t.allowed_types&&!t.allowed_types.includes(e.type))return`Invalid file type (${e.type})`}}return null}(e,t);if(n)throw new Error(n)}parseValue(e,t){const{type:n,many_to_many:r,one_to_many:s,many_to_one:o,one_to_one:i}=t;if(null===e)return null;if((r||s||o||i)&&e&&"string"==typeof e)return JSON.parse(e);switch(n){case"CharField":case"TextField":case"SlugField":case"UUIDField":case"EmailField":return`${e}`;case"IntegerField":case"SmallIntegerField":case"BigIntegerField":case"PositiveIntegerField":case"PositiveSmallIntegerField":case"PositiveBigIntegerField":case"AutoField":case"SmallAutoField":case"BigAutoField":return parseInt(e,10);case"FloatField":case"DecimalField":return parseFloat(e);case"BooleanField":return!!e;case"DateField":case"DateTimeField":return f(e);case"URLField":return new URL(e);case"FileField":if(null==e)return null;if("string"==typeof e)return null;if(ie.isValid(e))return new ie(e);if(e instanceof ie)return new ie(e);if("undefined"!=typeof File&&e instanceof File)return e;break;case"JSONField":if("object"==typeof e)return e;if("string"==typeof e)return JSON.parse(e)}return e}}let de=!1,he=!1,fe=null,me={};function pe(){return window.SERVER_CALL_VIA_WEB_SOCKET?new Promise(e=>de?e():he?void setTimeout(()=>{pe().then(()=>{e()})},200):e(ge())):Promise.resolve(!0)}function _e(){window.SERVER_CALL_VIA_WEB_SOCKET&&function(){if(de){de=!1;try{fe.close()}catch(e){}}}()}function ge(){return he=!0,new Promise(e=>{fe="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),fe.onmessage=function(e){ye(JSON.parse(e.data))},fe.onclose=function(){de&&console.error("SDC Socket closed unexpectedly"),de=!1;for(const[e,t]of Object.entries(me))t[1]({}),delete me[e];setTimeout(()=>{ge()},1e3)},fe.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),de)try{fe.close()}catch(e){}},fe.onopen=function(){de=!0,he=!1,e()}})}function ye(e){if(e||(e={}),e.is_error)(e.msg||e.header)&&T("pushErrorMsg",e.header||"",e.msg||""),e.id&&me[e.id]&&(me[e.id][1](e.data||null),delete me[e.id]);else if((e.msg||e.header)&&T("pushMsg",e.header||"",e.msg||""),e.type&&"sdc_recall"===e.type){const{data:t}=e;t&&"object"==typeof t&&(t.msg||t.header)&&T("pushMsg",t.header||"",t.msg||""),e.id&&me[e.id]&&(me[e.id][0](e.data),delete me[e.id])}else if(e.type&&"sdc_event"===e.type){let{event:t}=e;t&&T(t,e.payload)}else e.type&&"sdc_redirect"===e.type&&T("onNavLink",e.link)}class ve{constructor(){this._uuid=a(),this.contentUrl="",this.contentReload=!1,this.parsedContentUrl=null,this.events=[],this.load_async=!1,this._allEvents=null,this._autoRedirect=null,this._params={},this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName=Object.getPrototypeOf(this)._tagName??"",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}get params(){return this._params}set params(e){this._params=e}_runLifecycle(e,t){$e.DEBUG&&!this._isMixin&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let s=this._mixins[r];"function"==typeof s[e]&&n.push(s[e].apply(this,t))}return Promise.all(n).then(()=>{this._isMixin=!1})}}onInit(){$e.DEBUG&&!this._isMixin&&console.debug(Array.apply(null,arguments),this._tagName)}set autoRedirect(e){this._autoRedirect=e}get autoRedirect(){return this._autoRedirect}get parentController(){return this._parentController}get childController(){return this._childController}onLoad(){return this._runLifecycle("onLoad",arguments)}willShow(){return this._runLifecycle("willShow",arguments)}onRefresh(){return this._runLifecycle("onRefresh",arguments)}onRemove(){return this._runLifecycle("onRemove",arguments),!0}noOpenModelRequests(){return Promise.all(this._models.map(e=>e.noOpenRequests()))}remove(){for(const e of this._models)e.close();const{_childController:e}=this;for(let t in e)if(Object.hasOwn(e,t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){A(this);const e=r(this._tagName);if(this._parentController._childController[e]){let t=this._parentController._childController[e];for(let e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)}return this.$container.remove(),!0}return!1}controller_name(){return this._tagName.replace(/-./g,e=>` ${e[1].toUpperCase()}`).replace(/^./g,e=>`${e.toUpperCase()}`)}addEvent(e,t,n){this.getEvents(),this._allEvents[e]=this._allEvents[e]||{},this._allEvents[e][t]=n}getEvents(){if(this._allEvents)return this._allEvents;let e=[];e=e.concat(this.events);for(let t in this._mixins){let n=this._mixins[t];Array.isArray(n.events)&&(e=e.concat(n.events))}return this._allEvents=_.merge({},...e)}post(e,t){return $e.post(this,e,t)}get(e,t){return $e.get(this,e,t)}submitForm(e,t,n){return $e.submitFormAndUpdateView(this,e,t,n)}serverCall(e,t){let n=this.contentUrl.match(/sdc_view\/([^/]+)/i);if(n&&!(n.length<2))return function(e,t,n,r,s){return s=function(e){return null==e?{}:"object"!=typeof e||Array.isArray(e)?{arg0:e}:e}(s),window.SERVER_CALL_VIA_WEB_SOCKET?function(e,t,n,r){let s=a();return pe().then(()=>{fe.send(JSON.stringify({event:"sdc_call",id:s,controller:t,app:e,function:n,args:r}))}),new Promise((e,t)=>{me[s]=[e,t]})}(e,t,r,s):function(e,t,n){return n={data:JSON.stringify(n),_sdc_func_name:t,_method:"sdc_server_call"},$.post({url:e,data:n,beforeSend:function(e,t){e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}}).then(e=>{const t=e._return_data;return ye(t),t}).catch(e=>{const t=e.responseJSON||{};throw t.is_error=!0,ye(t),e})}(n,r,s)}(n[1],this._tagName,this.parsedContentUrl??this.contentUrl,e,t);console.error("To use the serverCall function the contentUrl must contain sdc_view/<app>: "+this._tagName)}querySet(e,t={}){const n=new ce(e,t);return this._models.push(n),n}newModel(e,t={}){return console.warn("newModel is deprecated and will soon be removed. Please use this.querySet(modelName, modelQuery)"),this.querySet(e,t)}find(e){return this.$container.find(e)}refresh(){return $e.refresh(this.$container,this)}reload(){return $e.reloadController(this)}reconcile(e,t=null){return $e.reconcile(this,e,t)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}iterateAllChildren(){const{_childController:e}=this;let t=[];for(let n in e)if(Object.hasOwn(e,n))for(let r of e[n])t.push(r),t.push(...r.iterateAllChildren());return t}defaultSubmitModelForm(e,t){if(!this._isMixin){t.stopPropagation(),t.preventDefault();let{model:n,form_name:r}=e.data(),s=n.syncForm(e);return new Promise((t,o)=>{let i;i=null!==n.id&&n.id>=0?n.save({formName:r,data:s}):n.create({data:s}),i.then(n=>{c(e);const r=Array.isArray(n)?n[0]:n;this.submit_model_form_success&&this.submit_model_form_success(r);for(const e of this.iterateAllChildren())e.submit_model_form_success&&e.submit_model_form_success(r);t(n)}).catch(t=>{this.reconcile($(`<div class="container-fluid">${t.html}</div>`),e.find(".container-fluid").first()),this.submit_model_form_error&&this.submit_model_form_error(t);for(const e of this.iterateAllChildren())e.submit_model_form_error&&e.submit_model_form_error(t);o(t)})})}return Promise.resolve()}}const we={classname:"class"};window.sdcDom=function(e,t,...n){if(!e)return"";const r=function(e,t){let n,r=!1;if("string"==typeof e)n=$(document.createElement(e));else{const t=`this.${e.name}`;n=$(document.createElement(t)),n.data("handler",e),r=!0}return t&&Object.entries(t).forEach(([e,t])=>{if(e.startsWith("on")){const r=e.substring(2).toLowerCase();n[0].addEventListener(r,t),(n[0]._sdcListeners??=[]).push([r,t])}else we[e.toLowerCase()]&&(e=we[e.toLowerCase()]),n[0].setAttribute(e,t)}),r&&n.addClass("_bind_to_update_handler _with_handler"),n}(e,t);for(const e of n)r.append(e);return r};const be=e=>{e["url-link"]?T("onNavLink",e["url-link"]):window.location.href=e.url};let $e={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:N,rootController:null,globalRootController:null,_isInit:!1,_origin_trigger:null,_globalControllerClasses:[],_createdGlobals:[],init_sdc:()=>{$e._isInit||($e._isInit=!0,$e._origin_trigger?_e():($e._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return w.includes(t)||(w.push(t),$(window).on(t,R)),$e._origin_trigger.call(this,e)},$e.updateJquery()),pe(),function(){const e=$(window);w.forEach(t=>{e.off(t).on(t,R)})}(),$e.rootController=$e.rootController||new ve,$e.globalRootController=$e.globalRootController||new ve),$e.tagNames=Object.keys(O);const t=N.filter(e=>!$e._createdGlobals.includes(e));$e._createdGlobals.push(...t);const n=$("<div></div>");t.forEach(e=>{const t=O[e][0];n.append(`<${t.prototype._tagName}></${t.prototype._tagName}>`)});const{refreshProcess:r}=I(null,$e.rootController);return K($e.tagNames,n,$e.globalRootController,r).then(()=>K($e.tagNames,(e||(e=$("body")),e),$e.rootController,r).then(e=>(x(r),e)))},updateJquery:()=>{$.fn.safeReplace=function(e){return $e.safeReplace($(this),e)},$.fn.safeEmpty=function(){return $e.safeEmpty($(this))},$.fn.safeRemove=function(){return $e.safeRemove($(this))}},controllerToTag:e=>n(e.name).replace(/-controller$/,""),registerGlobal:e=>{const t=$e.register(e);let n=e.prototype._tagName;return N.includes(n)||N.push(n),t},cleanCache:()=>{D={}},register:(e,t=!1)=>{let r=$e.controllerToTag(e);return!O[r]||t?(O[r]=[e,[]],e.prototype._tagName=r,{addMixin:(...e)=>{for(let t of e){let e;"string"==typeof t?e=n(t):t&&(e=$e.controllerToTag(t)),O[r][1].push(e)}}}):{addMixin:(...e)=>{}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=$e.CSRF_TOKEN,$e.ajax(e,t,n,$.post)),get:(e,t,n)=>$e.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=$e.VERSION,n._method=n._method||"api";const s=new Promise((o,i)=>r(t,n).then((t,n,r)=>{o(t,n,r),"redirect"===t.status?be(t):s.then(()=>{$e.refresh(e.$container)})}).catch((e,t,n)=>{301===e.status&&e.responseJSON?(e=e.responseJSON,be(e),o(e,t,n)):i(e,t,n)}));return s},submitFormAndUpdateView:(e,t,n,r)=>{let s=new FormData(t);const i=new Promise((l,a)=>{o(s,n||t.action,r||t.method).then((t,n,r)=>{l(t,n,r),"redirect"===t.status?be(t):i.then(()=>{$e.refresh(e.$container,e)})}).catch((e,t,n)=>{301===e.status?(e=e.responseJSON,be(e),l(e,t,n)):a(e,t,n)})});return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise((s,i)=>{o(r,t||e.action,n||e.method).then(s).catch(i)})},getController:e=>W(e),safeEmpty:e=>(e.children().each(function(e,t){let n=$(t);$e.safeRemove(n)}),e),safeReplace:(e,t)=>(t.insertBefore(e),$e.safeRemove(e)),safeRemove:e=>(e.each(function(){let e=$(this);e.data(`${U}`)&&e.data(`${U}`).remove()}),e.find(`.${M}`).each(function(){const e=$(this).data(`${U}`);e&&e.remove()}),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=B(e);return e.contentUrl=t.url,V(e,t.args)}return new Promise(e=>{e($())})}(e).then(t=>{let n=$(t);return $e.reconcile(e,n)}),reconcile:(e,t,n=null,r=null)=>{const s=!n;if(s){let n=e.$container.clone().empty();n.data(U,null),n.removeClass(M),n.append(t),t=n}n=n??e.$container;const{refreshProcess:o,isRunningProcess:i}=I(r,e);return Z(t,e,o).then(()=>{var r;return X(t,n),s&&e.$container.addClass(M).data(U,e),(r=e)._childController={},r.find(`.${M}`).each(function(){const e=$(this),t=W(e);t&&W(e.parent())===r&&S(r,t)}),i||x(o),e})},refresh:(e,t=null)=>Z(e,t)};function Re(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)"__proto__"!==r&&(e[r]=n[r])}return e}var Ce=function e(t,n){function r(e,r,s){if("undefined"!=typeof document){"number"==typeof(s=Re({},n,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var o="";for(var i in s)s[i]&&(o+="; "+i,!0!==s[i]&&(o+="="+s[i].split(";")[0]));return document.cookie=e+"="+t.write(r,e)+o}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var n=document.cookie?document.cookie.split("; "):[],r={},s=0;s<n.length;s++){var o=n[s].split("="),i=o.slice(1).join("=");try{var l=decodeURIComponent(o[0]);if(l in r||(r[l]=t.read(i,l)),e===l)break}catch(e){}}return e?r[e]:r}},remove:function(e,t){r(e,"",Re({},t,{expires:-1}))},withAttributes:function(t){return e(this.converter,Re({},this.attributes,t))},withConverter:function(t){return e(Re({},this.converter,t),this.attributes)}},{attributes:{value:Object.freeze(n)},converter:{value:Object.freeze(t)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"});let Ne,Oe=[];function Se(){if(!jest)throw new Error("JEST is not defined");0===Oe.length&&(Ne=$.ajax.bind($),Oe.push(jest.spyOn($,"ajax")),Oe[0].mockImplementation(function(e){return Ne(e).then(e=>e).catch(e=>e)}))}const Fe=_e,Ee={get_controller:async function(e,t={},n=""){Se();const r=$("body");$e.updateJquery(),r.safeEmpty();const s=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))s.data(e,n);const o=$("<div></div>").append(s);r.append(o),$e._isInit=!1,$e.cleanCache(),await $e.init_sdc();const i=$e.getController(s);return i.navControllerPath=[e],i},getCsrfToken:function(){return function(e){if(document.cookie&&""!==document.cookie){const t=document.cookie.split(";");for(let n=0;n<t.length;n++){const r=t[n].trim();if(r.substring(0,10)===e+"=")return decodeURIComponent(r.substring(10))}}return""}("csrftoken")},controllerFromTestHtml:async function(e,t=null){Se();const n=$("body");$e.updateJquery(),n.safeEmpty().append(e),$e._isInit=!1,$e.cleanCache(),await $e.init_sdc();let r=$e.rootController.iterateAllChildren();if(!t)return r;const s=r[0].onRefresh,o=jest.spyOn(r[0],"onRefresh");return new Promise(e=>{o.mockImplementation(function(){o.mockRestore();const t=s.apply(r[0],arguments);return e(r),t})})},logout:()=>{Ce.remove("sessionid"),console.log("Logged out")},login:e=>{const t=globalThis.SDC_TEST_USER?.[e];return t?(Ce.set("sessionid",t),console.log(`Logged in as ${e}`),!0):(Ce.remove("sessionid"),console.warn(`Unknown test user: ${e}`),!1)}};window&&(window.sdcApp=$e);export{ve as AbstractSDC,ue as SdcModel,ce as SdcQuerySet,A as allOff,$e as app,l as checkIfParamNumberBoolOrString,c as clearErrorsInForm,E as controllerFactory,L as on,te as registerModel,k as runControlFlowFunctions,u as setErrorsInForm,q as setEvent,Fe as socketReconnect,Ee as test_utils,T as trigger};
|
|
2
|
+
let e;function t(){return new Promise(function(e){e()})}function n(e){return(e=(e=e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)).replace(/[0-9]+/g,e=>`-${e}`)).replace(/^[-]/g,"")}function r(e){return e.replace(/-./g,e=>`${e[1].toUpperCase()}`)}const s=(e,t)=>{let n=t,r=Object.getOwnPropertyNames(e.prototype).concat(Object.getOwnPropertySymbols(e.prototype));for(;""!==n.name;)Object.getOwnPropertyNames(n.prototype).concat(Object.getOwnPropertySymbols(n.prototype)).forEach(t=>{t.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)||r.includes(t)||(r.push(t),Object.defineProperty(e.prototype,t,Object.getOwnPropertyDescriptor(n.prototype,t)))}),n=Object.getPrototypeOf(n)};function o(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",i,!1),e},data:e,cache:!1,contentType:!1,processData:!1,beforeSend:function(e,t){(function(e){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(e)})(t.type)||this.crossDomain||e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}})}function i(e){if(e.lengthComputable){var t=Math.round(e.loaded/e.total*100),n=$(".progress-container");100===t?n.hide():n.show(),t+="%",n.find(".progress-bar").css({width:t}).text(t)}}function l(e,t=null){return"string"!=typeof e?e:t&&void 0!==t[e]?"function"==typeof t[e]?t[e].bind(t):t[e]:e.match(/^(true|false)$/)?"true"===e:"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substr(1,e.length-2):e:void 0}function a(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16))}function c(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function u(e,t){t=$("<div>").append(t),e.find(".has-error").removeClass("has-error").find(".alert-danger").safeRemove(),e.find(".non-field-errors").safeRemove();let n=t.find("input[type=file]").parent();e.find("input[type=file]").parent().each(function(e){$(this).replaceWith(n[e])});let r=0===t.find(".non-field-errors").insertAfter(e.find(".hidden-form-fields")).length;return t.find(".has-error").each(function(){r=!1;let t=$(this),n=t.data("auto-id"),s=e.find(".form-group."+n);s.addClass("has-error"),s.find(".form-input-container").append(t.find(".alert-danger"))}),r}function d(e){let{type:t,name:n}=e;return n&&""!==n?"hidden"===t?(r=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===r.toLowerCase():"undefined"!==r?"none"===r.toLowerCase()?null:r.match(/^-?\d+$/)?parseInt(r,10):r.match(/^-?\d+\.?\d+$/)?parseFloat(r):r.match(/^(['][^']*['])|(["][^"]*["])$/)?r.substring(1,r.length-1):r:void 0:"checkbox"===t?e.checked:"file"===t?e.files[0]:$(e).val():null;var r}const h=e=>String(e).padStart(2,"0");function f(e){if(null==e||""===e)return null;let t;if(e instanceof Date)t=e;else if("string"==typeof e&&/^\d{4}-\d{2}-\d{2}$/.test(e)){const[n,r,s]=e.split("-").map(Number);t=new Date(n,r-1,s)}else t=new Date(e);return isNaN(t.getTime())?null:t}function m(e){const t=f(e);return t?`${t.getFullYear()}-${h(t.getMonth()+1)}-${h(t.getDate())}`:""}function p(e,t){let{type:n,name:r}=e;if(r&&""!==r)if("datetime-local"===n)e.value=function(e){const t=f(e);return t?`${m(t)}T${h(t.getHours())}:${h(t.getMinutes())}`:""}(t);else if("date"===n)e.value=m(t);else if("checkbox"===n)e.checked=!!t;else if("file"===n){if(t instanceof File&&"undefined"!=typeof DataTransfer){let n=new DataTransfer;n.items.add(t),e.files=n}}else t instanceof de?$(e).val(t.id):t instanceof ue?$(e).val(`[${t.getIds().join(",")}]`):(null===t&&(t=""),$(e).val(t));return null}let g={},y={};function v(e,t){return w(e),Object.hasOwn(y,e)?t[y[e]]?void g[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function w(e,t){t||(t=e),y[e]||(y[e]=t,g[e]=[])}function b(e){for(let t in g)if(Object.hasOwn(g,t))for(let n=g[t].length-1;n>=0;n--)e===g[t][n]&&g[t].splice(n,1)}function R(e){let n=Array.apply(null,arguments);if(e=n.shift(),!Object.hasOwn(g,e)||!Object.hasOwn(y,e))return t();let r=g[e],s=y[e],o=[];for(let e=0;e<r.length;e++){let t=r[e][s].apply(r[e],n);void 0!==t&&o.push(t)}return Promise.all(o)}function C(e,t=null){return Object.fromEntries(Object.entries(e).filter(([e,t])=>e!==M).map(([e,n])=>{if("string"==typeof n&&n.startsWith("SDC_JSON_MODEL=["))try{const{pk:t,fields:r}=JSON.parse(n.slice(16,-1));return[e,{...r,id:t}]}catch{}return[e,l(n,t)]}))}function N(e,t=null){return C(e.data(),t)}const O=["onbeforeunload","onunload"],S=Object.keys(window).filter(e=>/^on/.test(e)&&!O.includes(e)).map(e=>e.slice(2));function F(e,t,n){let r;switch(e){case"mouseleave":case"mouseout":case"mouseenter":return r=document.elementFromPoint(t.clientX,t.clientY),n!==r&&!n.contains(r);default:return!0}}function E(e){let t=e.type;Object.hasOwn(e,"namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,s=!1,o=!1;for(e.stopImmediatePropagation=()=>o=!0,e.stopPropagation=()=>o=s=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i&&F(t,e,n[0])){if(!r&&(r=G(n),!r))return;for(;r;){if(i.split(" ").forEach(o=>{if(s)return;let i=null;if("function"==typeof o)i=o;else if("function"==typeof r[o])i=r[o];else if("string"==typeof o&&o.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[o.slice(11)],!i)return}i&&i.call(r,n,e)}),o)return;r=r._parentController}}if(s)return;n=n.parent()}return{res:!0}}function k(e){const t=e.getEvents();for(let n in t)if(Object.hasOwn(t,n)){let r=t[n];for(let t in r)Object.hasOwn(r,t)&&e.find(t).each(function(){let e=$(this),r=e.attr(`sdc_${n}`)||null;r=r?r.split(" "):[];const s=`this.event_${t}`;-1===r.indexOf(s)&&(r.push(s),e.attr(`sdc_${n}`,r.join(" ")))})}}let x=[],I={};function j(e,t){if(e){let n=r(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function P(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(I[t][1])).filter((e,t,n)=>n.indexOf(e)===t);let n=!0;for(;n;){n=!1;for(let t of e)for(let r of I[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(I[e][0]);let i=new(function(e,...t){let n={[e.name]:class{constructor(...n){let r={};t.forEach(e=>{let t;Object.assign(this,t=new e),t._tagName=e.prototype._tagName,t._isMixin=!0,r[e.name]=t}),Object.assign(this,new e),this._mixins=r}static get name(){return e.name}static className(){return this.name}get mixins(){return this._mixins}}}[e.name];return s(n,e),t.forEach(e=>{s(n,e)}),n}(I[n][0],...o));return i._tagName=n,j(e,i),i.$container=t,function(e,t){!function(e,t,n){if(!e)return!1;e.params=N(t,n._parentController)}(t,e,t)}(t,i),i}function L(e,t,n,s){if(x.includes(n)){let o=r(n);return window[o]||(window[o]=P(e,t,n,s)),window[o].$container=t,window[o]}return P(e,t,n,s)}function q(e,n){const r=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=W(e),e.contentUrl=t.url),Promise.all([Q(e,t.args)]).then(function(e){let t=e[0];if(t===U)return U;if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null})}(e).then(n=>n===U||!e.onLoad||e._onLoadDone?n:(e._onLoadDone=!0,(e.onLoad(n)||t()).then(()=>n)))}(e).then(function(t){return t===U?("function"==typeof e.confirmPageLoaded&&R("navLoaded",e),U):function(e,t){return K(e,t).then(function(t){if(t=t||!0,e.willShow){let n=e.willShow();if(n instanceof Promise)return n.then(function(){return t})}return t})}(e,t)}).then(t=>{if(t!==U)return function(e,t){return ee(null,e,t)}(e,n)}).catch(function(t){if("string"==typeof t||t instanceof $)return K(e,t);throw t});return e.load_async?Promise.resolve():r}function A(e){const t=function(e){let t=[];for(;e;)t.unshift(e),e=e._parentController;return t}(e.controller[0]),n=t.concat(e.controller.slice(1));for(let t of n)k(t),t.onRefresh(e.controller[0])}function T(e,t){let n=Boolean(e);return n?e.uuids.has(t._uuid)||(e.uuids.add(t._uuid),e.controller.push(t)):e={uuids:new Set([t._uuid]),controller:[t]},{isRunningProcess:n,refreshProcess:e}}let D={};const U=Symbol("view redirect"),M="_controller_",J="_sdc_controller_";function V(e,t,n){if(!e)return[];let r=e.children(),s=[];return r.each(function(e,r){let o=$(r),i=o.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?s.push({tag:i[0],super:i.splice(1)||[],dom:o}):i[0].startsWith("this.")?o.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):s=s.concat(V(o,t,n))}),s}function Q(e,t){const{contentUrl:n,_tagName:r,contentReload:s}=e;return n?D[r]?(e.autoRedirect=null,Promise.resolve(D[r])):(t.VERSION=Re.VERSION,t._method="content",$.get(n,t).then(function(t){return e.autoRedirect=null,s||(D[r]=t),t}).catch(function(t){if(301===t.status){const n=t.responseJSON;return e.autoRedirect=n["url-link"],R("_RedirectOnView",e.autoRedirect),U}throw e.autoRedirect=null,"function"==typeof e.confirmPageLoaded&&R("navLoaded",{controller_name:()=>t.status}),`<sdc-error data-code="${t.status}">${t.responseText}</sdc-error>`})):Promise.resolve(!1)}function B(e,t,n=null){return t=t||e.data(M),H(Re.tagNames,e,t,n)}function W(e){let t=e.contentUrl;if(e&&0===e._urlParams.length){let n,r=/%\(([^)]+)\)\w/gm;for(e._urlParams=[];n=r.exec(t);)e._urlParams.push(n[1]),e.contentReload=!0}let{args:n,params:r}=function(e,t){const n=N(t,e),[r,s]=Object.entries(n).reduce(([t,n],[r,s])=>(e._urlParams.includes(r)?t[r]=s:n[r]=s,[t,n]),[{},{}]);return{params:r,args:s}}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(Object.hasOwn(e._urlParams,r)){let s=e._urlParams[r],o=RegExp("%\\("+s+"\\)\\w","gm");const i=n[s];i||console.warn(`${s} is not set for controller ${e._tagName}`),t=t.replace(o,i)}return t}(e,t,r)),e.parsedContentUrl=t,{url:t,args:n}}function G(e){return e.hasClass(J)?e.data(`${M}`):e.closest(`.${J}`).data(`${M}`)}function z(e,t,n,r,s){let o=e.data(M);return o?B(e,o,s):(o=L(r,e,t,n),e.data(M,o),e.addClass(J),q(o,s))}function K(e,t,n=null){if(t&&t.length>0){e.$container.empty(),e.$container.attr(e._tagName,"");for(let t in e._mixins)e.$container.attr(e._mixins[t]._tagName,"");e.$container.append(t)}return B(e.$container,e,n)}function H(e,t,n,r){return new Promise(s=>{let o=V(t,e,n),i=o.length;if(0===i)return s();for(let e=0;e<o.length;e++)z(o[e].dom,o[e].tag,o[e].super,n,r).then(()=>{if(i--,0===i)return s()})})}function X({$element:e,id:t=[],parent:n=null}){t.push(function(e){if(3===e[0].nodeType)return`TEXT__${e[0].nodeValue}`;const t=[e[0].tagName];return"INPUT"===e[0].nodeName&&[["name",""],["type","text"],["id",""]].forEach(([n,r])=>{const s=e.attr(n)??r;s&&t.push(s)}),t.join("__")}(e));const r={$element:e,id:t.join("::"),depth:t.length,idx:0,getRealParent:()=>n,getIdx:function(){return this.idx=Math.max(0,(this.getRealParent()?.getIdx()??-1)+e.index()+1),this.idx},op:null,parent:n};return r.getIdx.bind(r),[r].concat(e.contents().toArray().map(e=>X({$element:$(e),id:t.slice(),parent:r})).flat())}function Y(e,t){const n=X({$element:t}),r=X({$element:e});n.map((e,t)=>e.idx=t),r.map((e,t)=>e.idx=t);const s=Math.max(...r.concat(n).map(e=>e.depth)),o=Z(n,r,s);let i=[];const l=[];var a;window.MAIN=t,window.OPS=o,o.forEach((e,t)=>{const{op:n,$element:r,idx:s}=e;if("keep_counterpart"===n.type){if((e.parent?n.counterpart.getIdx():s)!==s){const t=e.getBefore();t?n.counterpart.$element.insertAfter(t.$element):e.getRealParent().$element.prepend(n.counterpart.$element)}if(e.parent){const e=n.counterpart.$element.data(M);e&&e!==r.data(M)&&l.push(e)}!function(e,t){!function(e,t){if(!e||!t||!e._sdcListeners&&!t._sdcListeners)return;(e._sdcListeners??[]).forEach(([t,n])=>e.removeEventListener(t,n));const n=t._sdcListeners??[];n.forEach(([t,n])=>e.addEventListener(t,n)),e._sdcListeners=n}(e[0],t[0]);const n=e[0].attributes??[],r=t[0].attributes??[];[...n].forEach(n=>{t.is(`[${n.name}]`)||e.removeAttr(n.name)}),[...r].forEach(t=>{e.attr(t.name)!==t.value&&e.attr(t.name,t.value)}),e.removeData(),Object.entries(t.data()).forEach(([t,n])=>{e.data(t,n)})}(n.counterpart.$element,r),r.hasClass(J)&&(r.data(M).$container=n.counterpart.$element,r.data(M,null)),i.push(r)}else if("delete"===n.type)r.safeRemove();else if("insert"===n.type){const{after:t,target:n}=e.op;t?r.insertAfter(t.$element):n&&n.$element.prepend(r)}}),i.forEach(e=>e.safeRemove()),(a=l).forEach(e=>{e.$container=$()}),a.reverse().forEach(e=>e.remove())}function Z(e,t,n){return t.filter(e=>e.depth===n&&!e.op).forEach(t=>{const n=e.find(e=>!e.op&&e.id===t.id);if(n){const e=(t,n)=>{t.op={type:"keep",idx:n.idx},n.op={type:"keep_counterpart",counterpart:t},t=t.parent,n=n.parent,!t||t.op||n?.op||e(t,n)};e(n,t)}}),n>1?Z(e,t,n-1):(e.forEach((t,n)=>{if(!t.op){const r=(e[n-1]?.op.idx??-1)+1;t.op={type:"delete",idx:r}}}),t.forEach((e,n)=>{if(e.getBefore=()=>function(e,n){const r=e.depth;for(;n>=1&&e.depth>=r;)if((e=t[n-=1]).depth===r)return"keep_counterpart"===e.op.type?e.op.counterpart:e;return null}(e,n),e.getRealParent=()=>{return(t=e).parent?"keep_counterpart"===t.parent.op.type?t.parent.op.counterpart:t.parent:null;var t},!e.op){const t=e.getRealParent(),n="insert"===t?.op.type?"insert_ignore":"insert";e.op={type:n,target:t,after:e.getBefore()}}}),[...e,...t].sort((e,t)=>(e.op?.idx??e.idx)-(t.op?.idx??t.idx)))}function ee(e,t,n=null){if(t||(t=G(e)),!t)return Promise.resolve();const{refreshProcess:r,isRunningProcess:s}=T(n,t);return e??=t.$container,H(Re.tagNames,e,t,n).then(()=>function(e,t,n){return function(e,t,n){const r=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each(function(){const t=$(this);let s;if(t.hasClass("_with_handler"))s=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(s=e[t])}if("function"==typeof s){const n=C(t.data(),e);s=s.bind(e)(n)}s&&r.push(Promise.resolve(s).then(r=>{let s=$("<div></div>");return s.append(r),""===t.html()&&t.append("<div></div>"),Re.reconcile(e,s,t.children(),n)}))}),Promise.all(r)}(e,t??e.$container,n)}(t,e,r).then(()=>{s||A(r)}))}const te={};function ne(e,t){te[e]=t}function re(e){return te[e]}const se=25e3,oe="_connecting_process";class ie extends Error{constructor(e){"string"==typeof e&&(e={msg:e,is_error:!0,header:"Error"}),super(e.msg),this.msg=e.msg,this.header=e.header,this.is_error=e.is_error,this.html=e.html}}class le{constructor({name:e,url:t}){this.name=e,this.url=t,this.content=null}async load(e=!1){return!e&&this.content||(this.content=await new Promise((e,t)=>{$.get(this.url).then(e).catch(()=>{e("")})})),this.content}async text(){return this.load()}static isValid(e){return!(null===e||"object"!=typeof e||Array.isArray(e)||e instanceof File||"string"!=typeof e.url||"string"!=typeof e.name)}}function ae(e){const t=parseInt(e??-1,10);return Number.isNaN(t)?-1:t}function ce(e){if(!e||"object"!=typeof e||e instanceof de)return!1;const t=Object.keys(e);return!(0===t.length||!t.every(e=>"elem"===e||"data"===e)||"elem"in e&&null!==e.elem&&!(e.elem instanceof de)||"data"in e&&null!==e.data&&"object"!=typeof e.data)}class ue{constructor(e,t={}){return this.valuesList=[],this.loaded=!1,this.modelName=e,this.modelQuery=t??{},this._onNoOpenRequests=[],this._isConnected=!1,this._isConnectingProcess=!1,this._autoReconnect=!0,this.socket=null,this.openRequest={},this.modelId=0,this.onUpdate=()=>{},this.onCreate=()=>{},this.onDelete=null,new Proxy(this,{get:(e,t)=>"symbol"==typeof t||isNaN(t)?e[t]:e.valuesList[t],set:(e,t,n)=>isNaN(t)?(e[t]=n,!0):(e.valuesList[t]=n,!0)})}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.valuesList.length?{value:this.valuesList[e],done:!1}:{value:null,done:!0})}}set on_create(e){this.onCreate=e}set on_update(e){this.onUpdate=e}set on_delete(e){this.onDelete=e}_removeIds(e){const t=this.valuesList.filter(t=>e.includes(t.id));return this.valuesList=this.valuesList.filter(t=>!e.includes(t.id)),t}setIds(e){const t=this._setIds(e),n={id__in:t.map(e=>e.id)};return this.setFilter(n),t}_setIds(e){if(null===e||""===e||Array.isArray(e)&&0===e.length)return this.valuesList=[],this.valuesList;if(e instanceof ue||e instanceof de){const t=e instanceof de?[e]:e.valuesList;return this.valuesList=t.map(e=>{const t=null!==e.id?this.byId(e.id):null;if(t)return t;const n=(e=>{const t=new e.constructor({});return t.setValues(e.serialize()),t})(e);return n._setQuerySet(this,!0),n}),this.valuesList}let t,n=Number.NaN;if(Number.isInteger(e))n=e;else if(e instanceof Array){const n=e.map(e=>parseInt(e));n.some(Number.isNaN)||(t=n)}else if("string"==typeof e){const r=e.split(",").map(e=>parseInt(e));r.some(Number.isNaN)?n=parseInt(e):t=r}if(Number.isNaN(n)){if(t){this.valuesList=this.valuesList.filter(e=>t.includes(e.id));const e=this.getIds();t.filter(t=>!e.includes(t)).forEach(e=>{this.valuesList.push(new(re(this.modelName))({id:e}))})}}else this.valuesList=this.valuesList.filter(e=>n===e.id),0===this.valuesList.length&&(this.new().id=n);return this.valuesList}getIds(){return this.valuesList.map(e=>e.id)}get length(){return this.valuesList.length}byId(e){if(null!==e){const t=ae(e);return this.valuesList.find(e=>e.id===t)??null}return null}setFilter(e){return this.modelQuery=e,this}addFilter(e){return this.modelQuery=Object.assign({},this.modelQuery,e),this}new(e={}){const t=new(re(this.modelName))(e);return t._setQuerySet(this,!1),this.valuesList.push(t),t}load(e=null,{limit:t=null}={}){return this.valuesList=[],this.modelQuery=e??this.modelQuery,this._sendLoad(null,t)}update({modelQuery:e=null,item:t=null}){this.modelQuery=e??this.modelQuery;let n=t?{id:t.id}:this.modelQuery;return this._sendLoad(n)}delete({pk:e=null,id:t=null,elem:n=null}){if(e??=t,null===(e=n?n.id:e))throw new Error("pk or elem must be set");const r=a();return this.isConnected().then(()=>new Promise((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:r,args:{model_name:this.modelName,model_query:this.modelQuery,id:e,pk:e}})),this.openRequest[r]=[n=>{this._removeIds([ae(e)]),t(n)},n]}))}_sendLoad(e=null,t=null){return this.isConnected().then(()=>{const n=a(),r={model_name:this.modelName,model_query:e??this.modelQuery};return null!==t&&(r.limit=t),new Promise((e,t)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:n,args:r})),this.openRequest[n]=[t=>{this.loaded=!0,e(t)},t]})})}_sendListView({modelQuery:e={},cbResolve:t=null,cbReject:n=null,templateContext:r={}}){return this.view({modelQuery:e,cbResolve:t,cbReject:n,templateContext:r,eventType:"list_view"})}view({viewName:e="html_list_template",modelQuery:t={},cbResolve:n=null,cbReject:r=null,templateContext:s={},eventType:o="named_view"}){let i=$('<div class="container-fluid">');return this.isConnected().then(()=>{const l=a();this.socket.send(JSON.stringify({event:"model",event_type:o,event_id:l,args:{view_name:e,model_name:this.modelName,model_query:t,template_context:s}})),this.openRequest[l]=[e=>{i.append(e.html),Re.refresh(i),n&&n(e)},e=>{r&&r(e)}]}),i}_sendDetailView({pk:e=null,id:t=null,cbResolve:n=null,cbReject:r=null,templateContext:s={}}){e??=t,e=ae(e);let o=$('<div class="container-fluid">');return this.isConnected().then(()=>{const t=a();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:t,args:{model_name:this.modelName,model_query:this.modelQuery,id:e,pk:e,template_context:s}})),this.openRequest[t]=[e=>{o.append(e.html),Re.refresh(o),n&&n(e)},e=>{r&&r(e)}]}),o}getForm({modelObj:e,eventType:t,formName:n,$divForm:r,cbResolve:s,cbReject:o,formId:i}){const l=a(),c=e.id??-1;this.isConnected().then(()=>{this.socket.send(JSON.stringify({event:"model",event_type:t,event_id:l,args:{model_name:this.modelName,id:c,pk:c,form_name:n}}))});const u=null===c||-1===c?"create":"edit";this.openRequest[l]=[t=>{r.append(t.html);let o=r.closest("form").addClass(`sdc-model-${u}-form sdc-model-form ${i}`).data("model",e).data("model_pk",c).data("form_name",n).attr("SdcModelName",this.modelName).attr("SdcModelPK",c);e.addForm(o),o.length>0&&!o[0].hasAttribute("sdc_submit")&&o.attr("sdc_submit","submitModelFormDistributor"),Re.refresh(r).then(()=>null),s&&s(t)},e=>{o&&o(e)}]}async get(e=null,t=!1){if(t){const t=e?.id??this.modelQuery?.id;return e&&this.setFilter(e),this.byId(t)??this.new(e||this.modelQuery)}if(await this.load(e),1!==this.length)throw new Error(`model query returns ${this.length} but only 1 expected.`);return this.addFilter({id:this.valuesList[0].id}),this.valuesList[0]}detailView({pk:e,cbResolve:t=null,cbReject:n=null,templateContext:r={}}){return this._sendDetailView({id:e,cbResolve:t,cbReject:n,templateContext:r})}listView({modelQuery:e={},searchValues:t={},cbResolve:n=null,cbReject:r=null,templateContext:s={}}){return this._sendListView({modelQuery:Object.assign({},this.modelQuery,e,{__search_values:t}),cbResolve:n,cbReject:r,templateContext:s})}save({pk:e=null,id:t=null,formName:n="edit_form",data:r=null}={}){e??=t;const s=ae(e);return this.isConnected().then(()=>{let e;if(s>-1){const t=this.byId(s);if(!t)return Promise.reject(new ie(`Element not found with ID: ${s}`));e=[t]}else e=this.valuesList;let t=[];return e.forEach(e=>{const s=a();t.push(new Promise((t,o)=>{this._readFiles(e).then(i=>{const l=r?{...r}:e.serialize();l.id=e.id,this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:s,args:{form_name:n,model_name:this.modelName,model_query:this.modelQuery,data:l,id:l.id,pk:l.id,files:i}})),this.openRequest[s]=[e=>{let n="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(n),t(e)},o]})}))}),Promise.all(t)})}create(e=null){let{elem:t=null,data:n=null}=ce(e)?e:{data:e};n&&"object"==typeof n&&0===Object.keys(n).length&&(n=null);const r=a();return t||(t=this.new(n)),this.isConnected().then(()=>new Promise((e,s)=>{this._readFiles(t).then(o=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:r,args:{model_name:this.modelName,model_query:this.modelQuery,data:n??t?.serialize()??{},files:o}})),this.openRequest[r]=[n=>{let r="string"==typeof n.data.instance?JSON.parse(n.data.instance):n.data.instance;t&&(t.id=r[0]?.id||r[0]?.pk),n.data.instance=this._parseServerRes(r)[0],e(n)},s]})}))}isConnected(){return new Promise((e,t)=>{if(this._isConnected)e();else if(this._isConnectingProcess&&this.openRequest[oe]){const[n,r]=this.openRequest[oe];this.openRequest[oe]=[()=>{n(),e()},()=>{r(),t()}]}else this._isConnectingProcess=!0,this.openRequest[oe]=[()=>{},()=>{}],this._connectToServer().then(()=>{e(this._checkConnection())})})}close(){this.socket&&(this._autoReconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket),this.valuesList.forEach(e=>{e._onClose()})}_readFiles(e){let t=[],n={};return e?(Object.keys(e.constructor.fields).forEach(r=>{const s=e[r];s instanceof File&&t.push(new Promise((e,t)=>{const o=a();this.openRequest[o]=[e,t],s.arrayBuffer().then(e=>{let t=new Uint8Array(e),i=Math.ceil(t.length/se);n[r]={id:o,file_name:s.name,field_name:r,content_length:s.size};for(let e=0;e<i;++e){const n=Array.from(t.slice(se*e,se*(e+1)));this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:o,args:{chunk:n,idx:e,number_of_chunks:i,file_name:s.name,field_name:r,content_length:s.size,content_type:s.type,model_name:this.modelName,model_query:this.modelQuery}}))}}).catch(e=>{this._closeOpenRequest(o),t(e)})}))}),Promise.all(t).then(()=>n)):Promise.resolve(n)}async _onMessage(e){let t=JSON.parse(e.data);if(t.is_error)Object.hasOwn(this.openRequest,t.event_id)&&(this.openRequest[t.event_id][1](new ie(t)),this._closeOpenRequest(t.event_id)),(t.msg||t.header)&&R("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.openRequest[oe][1](new ie(t)),this._closeOpenRequest(oe),this._autoReconnect=!1,this.socket.close());else{if((t.msg||t.header)&&R("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._isConnected=!0,this._isConnectingProcess=!1,this.openRequest[oe][0](t),this._closeOpenRequest(oe);else if(["load","list_view","named_view","detail_view"].includes(t.type)){const e=JSON.parse(t.args.data);t.args.data=await this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=await this._parseServerRes(e);n="on_create"===t.type?this.onCreate:this.onUpdate,n(r),t.args.data=r}else if("on_delete"===t.type){const e=JSON.parse(t.args.data).map(e=>ae(e.id??e.pk)),n=this._removeIds(e);(this.onDelete??this.onUpdate)(n),t.args.data=n}let e=t.data?.instance;e&&(t.data.instance=JSON.parse(t.data.instance)),Object.hasOwn(this.openRequest,t.event_id)&&(this.openRequest[t.event_id][0](t),this._closeOpenRequest(t.event_id))}}noOpenRequests(){return new Promise(e=>{if(0===Object.keys(this.openRequest).length)return e();this._onNoOpenRequests.push(e)})}_closeOpenRequest(e){delete this.openRequest[e],0===Object.keys(this.openRequest).length&&(this._onNoOpenRequests.forEach(e=>e()),this._onNoOpenRequests=[])}_connectToServer(){return new Promise(e=>{const t=`${this.modelName}`+(this.modelId>0?`/${this.modelId}`:"");"https:"===window.location.protocol?this.socket=new WebSocket(`wss://${window.location.host}/sdc_ws/model/${t}`):this.socket=new WebSocket(`ws://${window.location.host}/sdc_ws/model/${t}`),this.socket.onmessage=this._onMessage.bind(this),this.socket.onclose=e=>{console.error(`SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`),this._isConnected=!1;for(const t of Object.values(this.openRequest))t[1](e);this.openRequest={},this._isConnectingProcess=!1,setTimeout(()=>{this._autoReconnect&&!this._isConnected&&this.isConnected().catch(()=>{})},1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._isConnected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}})}_checkConnection(){const e=a();return new Promise((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.modelName,model_query:this.modelQuery}})),this.openRequest[e]=[t,n]})}_parseServerRes(e){const t=[];for(const n of e){const e=re(this.modelName);if(!e)throw new Error(`${this.modelName} is no SdcModel. mybe the models ar not importad.`);const r=new e({id:n.id??n.pk,...n.fields}),s=this.byId(r.id);s?(s.setValues(r),t.push(s)):(this.valuesList.push(r),r._setQuerySet(this,!0),t.push(r))}return this.valuesList.sort((e,t)=>e._id-t._id),t}}class de{static fields={};constructor(e){this._id=null,this._forms=[],this.loaded=!1,this.formId=a(),this.modelName=e}static querySet(e=null,t=null){const{modelName:n}=new this({});return t?t.querySet(n,e):new ue(n,e)}addForm(e){const t=this._onChange.bind(this);this._forms.push(e),e&&e.on("input.formWatcher change.formWatcher","input, select, textarea",t)}_onChange(e){const{name:t}=e.target;if(this.constructor.fields[t]){try{this[`set${t}`](d(e.target))}catch{return}this._updateForm(t,e.target)}}_updateForm(e,t=null){const n=this;this._forms.forEach(r=>{r.find(`[name="${e}"]`).each(function(){this!==t&&p(this,n[e])})})}setValues(e={}){throw new Error("setValues() must be implemented by subclass")}_setQuerySet(e,t){this._querySet=new WeakRef(e),this.loaded=t}get querySet(){return this._querySet.deref()}save({formName:e="edit_form",data:t=null}={}){return this._querySet.deref().save({pk:this.id,formName:e,data:t})}create(e=null){const t=ce(e)?e.data??null:e;return this._querySet.deref().create({elem:this,data:t})}delete(){return this._querySet.deref().delete({elem:this})}load(){return this._querySet.deref().update({item:this})}update(){return this.load()}get id(){return this._id}set id(e){this._id=e}set pk(e){this.id=e}get pk(){return this._id}close(){return this._querySet.deref().close()}_onClose(){Object.keys(this.constructor.fields).filter(e=>this[`_${e}`]instanceof ue).forEach(e=>this[`_${e}`].close())}detailView({cbResolve:e=null,cbReject:t=null,templateContext:n={}}){return this._querySet.deref().detailView({pk:this.id,cbResolve:e,cbReject:t,templateContext:n})}serialize(){return Object.entries(this.constructor.fields).reduce((e,[t,n])=>{const r=this[t];if(r instanceof ue)if(n.many_to_many||n.one_to_many)e[t]=r.getIds();else{const n=r.getIds();n.length>0?e[t]=n[0]:e[t]=null}else n.is_relation&&r instanceof de?e[t]=r.id??null:r instanceof Date?e[t]="DateField"===n.type?m(r):r.toISOString():e[t]=r;return e},{})}toJson(){const e={};for(let t in this.constructor.fields){const n=this[t];n instanceof File?e[t]=n.name:e[t]=n instanceof de?n.id:n instanceof ue?n.getIds():n}return e}syncFormToModel(e){return this.syncForm(e)}_resolveForms(e){return e&&e.hasClass(this.formId)?e:$(`.${this.formId}`)}syncModelToForm(e){e=this._resolveForms(e);const t=this,{fields:n}=this.constructor;e.each(function(){const e=ae($(this).data("model_pk"));if(ae(t.id)===e)for(let e of this.elements){let{name:r}=e;r&&""!==r&&n[r]&&p(e,t[r])}})}syncForm(e){e=this._resolveForms(e);const t=this,{fields:n}=this.constructor,r={};function s(e,s){if(n[e])try{t[e]=s}catch{}r[e]=s}return e.each(function(){const e=ae($(this).data("model_pk"));if(t.id===e||null===t.id&&-1===e){for(let e of this.elements)s(e.name,d(e));return t}}),r}form({cbResolve:e=null,cbReject:t=null}={}){return null===this.id||-1===this.id?this._createForm({cbReject:t,cbResolve:e}):this._editForm({cbReject:t,cbResolve:e})}_createForm({cbResolve:e=null,cbReject:t=null}){let n=$("<div>");return this._querySet.deref().getForm({modelObj:this,eventType:"create_form",formName:null,$divForm:n,cbResolve:e,cbReject:t,formId:this.formId}),n}_editForm({cbResolve:e=null,cbReject:t=null}){let n=$("<div>");return this._querySet.deref().getForm({modelObj:this,eventType:"edit_form",formName:null,$divForm:n,cbResolve:e,cbReject:t,formId:this.formId}),n}namedForm({formName:e,cbResolve:t=null,cbReject:n=null}){let r=$('<div class="container-fluid">');return this._querySet.deref().getForm({modelObj:this,eventType:"named_form",formName:e,$divForm:r,cbResolve:t,cbReject:n,formId:this.formId}),r}validate(e,t){const n=function(e,t){const{type:n,required:r,max_length:s,is_relation:o,many_to_many:i,one_to_many:l,many_to_one:a,one_to_one:c,related_model:u}=t;if(r&&(null==e||""===e))return"This field is required";if(null==e||""===e)return null;if((i||l||a||c)&&(!(e instanceof ue)||e.modelName!==u))return"string"==typeof e&&(e=JSON.parse(e)),(i||a)&&Array.isArray(e)&&e.some(e=>!Number.isNaN(parseInt(e)))?null:"object"!=typeof e&&Number.isNaN(parseInt(e))?"Must be object or ID":null;switch(n){case"CharField":case"TextField":if("string"!=typeof e)return"Must be a string";if(s&&e.length>s)return`Max length is ${s}`;break;case"IntegerField":case"SmallIntegerField":case"BigIntegerField":case"PositiveIntegerField":case"PositiveSmallIntegerField":case"PositiveBigIntegerField":case"AutoField":case"SmallAutoField":case"BigAutoField":if(!isFinite(parseInt(e)))return"Must be an integer";break;case"FloatField":case"DecimalField":if(!isFinite(parseFloat(e)))return"Must be a number";break;case"BooleanField":if("boolean"!=typeof e)return"Must be a boolean";break;case"DateField":case"DateTimeField":if(isNaN(Date.parse(e)))return"Must be a valid date";break;case"EmailField":if("string"!=typeof e||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e))return"Invalid email";break;case"URLField":try{new URL(e)}catch{return"Invalid URL"}break;case"UUIDField":if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(e))return"Invalid UUID";break;case"JSONField":if("string"==typeof e)try{JSON.parse(e)}catch{return"Must be valid JSON"}break;case"FileField":if(!(le.isValid(e)||e instanceof File||e instanceof le))return"Must be a valid file";if("undefined"!=typeof File&&e instanceof File){if(t.max_size&&e.size>t.max_size)return`File too large (max ${t.max_size} bytes)`;if(t.allowed_types&&!t.allowed_types.includes(e.type))return`Invalid file type (${e.type})`}}return null}(e,t);if(n)throw new Error(n)}parseValue(e,t){const{type:n,many_to_many:r,one_to_many:s,many_to_one:o,one_to_one:i}=t;if(null===e)return null;if((r||s||o||i)&&e&&"string"==typeof e)return JSON.parse(e);switch(n){case"CharField":case"TextField":case"SlugField":case"UUIDField":case"EmailField":return`${e}`;case"IntegerField":case"SmallIntegerField":case"BigIntegerField":case"PositiveIntegerField":case"PositiveSmallIntegerField":case"PositiveBigIntegerField":case"AutoField":case"SmallAutoField":case"BigAutoField":return parseInt(e,10);case"FloatField":case"DecimalField":return parseFloat(e);case"BooleanField":return!!e;case"DateField":case"DateTimeField":return f(e);case"URLField":return new URL(e);case"FileField":if(null==e)return null;if("string"==typeof e)return null;if(le.isValid(e))return new le(e);if(e instanceof le)return new le(e);if("undefined"!=typeof File&&e instanceof File)return e;break;case"JSONField":if("object"==typeof e)return e;if("string"==typeof e)return JSON.parse(e)}return e}}let he=!1,fe=!1,me=null,pe={};function _e(){return window.SERVER_CALL_VIA_WEB_SOCKET?new Promise(e=>he?e():fe?void setTimeout(()=>{_e().then(()=>{e()})},200):e(ye())):Promise.resolve(!0)}function ge(){window.SERVER_CALL_VIA_WEB_SOCKET&&function(){if(he){he=!1;try{me.close()}catch(e){}}}()}function ye(){return fe=!0,new Promise(e=>{me="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),me.onmessage=function(e){ve(JSON.parse(e.data))},me.onclose=function(){he&&console.error("SDC Socket closed unexpectedly"),he=!1;for(const[e,t]of Object.entries(pe))t[1]({}),delete pe[e];setTimeout(()=>{ye()},1e3)},me.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),he)try{me.close()}catch(e){}},me.onopen=function(){he=!0,fe=!1,e()}})}function ve(e){if(e||(e={}),e.is_error)(e.msg||e.header)&&R("pushErrorMsg",e.header||"",e.msg||""),e.id&&pe[e.id]&&(pe[e.id][1](e.data||null),delete pe[e.id]);else if((e.msg||e.header)&&R("pushMsg",e.header||"",e.msg||""),e.type&&"sdc_recall"===e.type){const{data:t}=e;t&&"object"==typeof t&&(t.msg||t.header)&&R("pushMsg",t.header||"",t.msg||""),e.id&&pe[e.id]&&(pe[e.id][0](e.data),delete pe[e.id])}else if(e.type&&"sdc_event"===e.type){let{event:t}=e;t&&R(t,e.payload)}else e.type&&"sdc_redirect"===e.type&&R("onNavLink",e.link)}class we{constructor(){this._uuid=a(),this.contentUrl="",this.contentReload=!1,this.parsedContentUrl=null,this.events=[],this.load_async=!1,this._allEvents=null,this._autoRedirect=null,this._params={},this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName=Object.getPrototypeOf(this)._tagName??"",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}get params(){return this._params}set params(e){this._params=e}_runLifecycle(e,t){Re.DEBUG&&!this._isMixin&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let s=this._mixins[r];"function"==typeof s[e]&&n.push(s[e].apply(this,t))}return Promise.all(n).then(()=>{this._isMixin=!1})}}onInit(){Re.DEBUG&&!this._isMixin&&console.debug(Array.apply(null,arguments),this._tagName)}set autoRedirect(e){this._autoRedirect=e}get autoRedirect(){return this._autoRedirect}get parentController(){return this._parentController}get childController(){return this._childController}onLoad(){return this._runLifecycle("onLoad",arguments)}willShow(){return this._runLifecycle("willShow",arguments)}onRefresh(){return this._runLifecycle("onRefresh",arguments)}onRemove(){return this._runLifecycle("onRemove",arguments),!0}noOpenModelRequests(){return Promise.all(this._models.map(e=>e.noOpenRequests()))}remove(){for(const e of this._models)e.close();const{_childController:e}=this;for(let t in e)if(Object.hasOwn(e,t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){b(this);const e=r(this._tagName);if(this._parentController._childController[e]){let t=this._parentController._childController[e];for(let e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)}return this.$container.remove(),!0}return!1}controller_name(){return this._tagName.replace(/-./g,e=>` ${e[1].toUpperCase()}`).replace(/^./g,e=>`${e.toUpperCase()}`)}addEvent(e,t,n){this.getEvents(),this._allEvents[e]=this._allEvents[e]||{},this._allEvents[e][t]=n}getEvents(){if(this._allEvents)return this._allEvents;let e=[];e=e.concat(this.events);for(let t in this._mixins){let n=this._mixins[t];Array.isArray(n.events)&&(e=e.concat(n.events))}return this._allEvents=_.merge({},...e)}post(e,t){return Re.post(this,e,t)}get(e,t){return Re.get(this,e,t)}submitForm(e,t,n){return Re.submitFormAndUpdateView(this,e,t,n)}serverCall(e,t){let n=this.contentUrl.match(/sdc_view\/([^/]+)/i);if(n&&!(n.length<2))return function(e,t,n,r,s){return s=function(e){return null==e?{}:"object"!=typeof e||Array.isArray(e)?{arg0:e}:e}(s),window.SERVER_CALL_VIA_WEB_SOCKET?function(e,t,n,r){let s=a();return _e().then(()=>{me.send(JSON.stringify({event:"sdc_call",id:s,controller:t,app:e,function:n,args:r}))}),new Promise((e,t)=>{pe[s]=[e,t]})}(e,t,r,s):function(e,t,n){return n={data:JSON.stringify(n),_sdc_func_name:t,_method:"sdc_server_call"},$.post({url:e,data:n,beforeSend:function(e,t){e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}}).then(e=>{const t=e._return_data;return ve(t),t}).catch(e=>{const t=e.responseJSON||{};throw t.is_error=!0,ve(t),e})}(n,r,s)}(n[1],this._tagName,this.parsedContentUrl??this.contentUrl,e,t);console.error("To use the serverCall function the contentUrl must contain sdc_view/<app>: "+this._tagName)}querySet(e,t={}){const n=new ue(e,t);return this._models.push(n),n}newModel(e,t={}){return console.warn("newModel is deprecated and will soon be removed. Please use this.querySet(modelName, modelQuery)"),this.querySet(e,t)}find(e){return this.$container.find(e)}refresh(){return Re.refresh(this.$container,this)}reload(){return Re.reloadController(this)}reconcile(e,t=null){return Re.reconcile(this,e,t)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}iterateAllChildren(){const{_childController:e}=this;let t=[];for(let n in e)if(Object.hasOwn(e,n))for(let r of e[n])t.push(r),t.push(...r.iterateAllChildren());return t}defaultSubmitModelForm(e,t){if(!this._isMixin){t.stopPropagation(),t.preventDefault();let{model:n,form_name:r}=e.data(),s=n.syncForm(e);return new Promise((t,o)=>{let i;i=null!==n.id&&n.id>=0?n.save({formName:r,data:s}):n.create({data:s}),i.then(n=>{c(e);const r=Array.isArray(n)?n[0]:n;this.submit_model_form_success&&this.submit_model_form_success(r);for(const e of this.iterateAllChildren())e.submit_model_form_success&&e.submit_model_form_success(r);t(n)}).catch(t=>{this.reconcile($(`<div class="container-fluid">${t.html}</div>`),e.find(".container-fluid").first()),this.submit_model_form_error&&this.submit_model_form_error(t);for(const e of this.iterateAllChildren())e.submit_model_form_error&&e.submit_model_form_error(t);o(t)})})}return Promise.resolve()}}const be={classname:"class"};window.sdcDom=function(e,t,...n){if(!e)return"";const r=function(e,t){let n,r=!1;if("string"==typeof e)n=$(document.createElement(e));else{const t=`this.${e.name}`;n=$(document.createElement(t)),n.data("handler",e),r=!0}return t&&Object.entries(t).forEach(([e,t])=>{if(e.startsWith("on")){const r=e.substring(2).toLowerCase();n[0].addEventListener(r,t),(n[0]._sdcListeners??=[]).push([r,t])}else be[e.toLowerCase()]&&(e=be[e.toLowerCase()]),n[0].setAttribute(e,t)}),r&&n.addClass("_bind_to_update_handler _with_handler"),n}(e,t);for(const e of n)r.append(e);return r};const $e=e=>{e["url-link"]?R("onNavLink",e["url-link"]):window.location.href=e.url};let Re={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:x,rootController:null,globalRootController:null,_isInit:!1,_origin_trigger:null,_globalControllerClasses:[],_createdGlobals:[],init_sdc:()=>{Re._isInit||(Re._isInit=!0,Re._origin_trigger?ge():(Re._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return S.includes(t)||(S.push(t),$(window).on(t,E)),Re._origin_trigger.call(this,e)},Re.updateJquery()),_e(),function(){const e=$(window);S.forEach(t=>{e.off(t).on(t,E)})}(),Re.rootController=Re.rootController||new we,Re.globalRootController=Re.globalRootController||new we),Re.tagNames=Object.keys(I);const t=x.filter(e=>!Re._createdGlobals.includes(e));Re._createdGlobals.push(...t);const n=$("<div></div>");t.forEach(e=>{const t=I[e][0];n.append(`<${t.prototype._tagName}></${t.prototype._tagName}>`)});const{refreshProcess:r}=T(null,Re.rootController);return H(Re.tagNames,n,Re.globalRootController,r).then(()=>H(Re.tagNames,(e||(e=$("body")),e),Re.rootController,r).then(e=>(A(r),e)))},updateJquery:()=>{$.fn.safeReplace=function(e){return Re.safeReplace($(this),e)},$.fn.safeEmpty=function(){return Re.safeEmpty($(this))},$.fn.safeRemove=function(){return Re.safeRemove($(this))}},controllerToTag:e=>n(e.name).replace(/-controller$/,""),registerGlobal:e=>{const t=Re.register(e);let n=e.prototype._tagName;return x.includes(n)||x.push(n),t},cleanCache:()=>{D={}},register:(e,t=!1)=>{let r=Re.controllerToTag(e);return!I[r]||t?(I[r]=[e,[]],e.prototype._tagName=r,{addMixin:(...e)=>{for(let t of e){let e;"string"==typeof t?e=n(t):t&&(e=Re.controllerToTag(t)),I[r][1].push(e)}}}):{addMixin:(...e)=>{}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=Re.CSRF_TOKEN,Re.ajax(e,t,n,$.post)),get:(e,t,n)=>Re.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=Re.VERSION,n._method=n._method||"api";const s=new Promise((o,i)=>r(t,n).then((t,n,r)=>{o(t,n,r),"redirect"===t.status?$e(t):s.then(()=>{Re.refresh(e.$container)})}).catch((e,t,n)=>{301===e.status&&e.responseJSON?(e=e.responseJSON,$e(e),o(e,t,n)):i(e,t,n)}));return s},submitFormAndUpdateView:(e,t,n,r)=>{let s=new FormData(t);const i=new Promise((l,a)=>{o(s,n||t.action,r||t.method).then((t,n,r)=>{l(t,n,r),"redirect"===t.status?$e(t):i.then(()=>{Re.refresh(e.$container,e)})}).catch((e,t,n)=>{301===e.status?(e=e.responseJSON,$e(e),l(e,t,n)):a(e,t,n)})});return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise((s,i)=>{o(r,t||e.action,n||e.method).then(s).catch(i)})},getController:e=>G(e),safeEmpty:e=>(e.children().each(function(e,t){let n=$(t);Re.safeRemove(n)}),e),safeReplace:(e,t)=>(t.insertBefore(e),Re.safeRemove(e)),safeRemove:e=>(e.each(function(){let e=$(this);e.data(`${M}`)&&e.data(`${M}`).remove()}),e.find(`.${J}`).each(function(){const e=$(this).data(`${M}`);e&&e.remove()}),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=W(e);return e.contentUrl=t.url,Q(e,t.args)}return new Promise(e=>{e($())})}(e).then(t=>{if(t===U)return;let n=$(t);return Re.reconcile(e,n)}),reconcile:(e,t,n=null,r=null)=>{const s=!n;if(s){let n=e.$container.clone().empty();n.data(M,null),n.removeClass(J),n.append(t),t=n}n=n??e.$container;const{refreshProcess:o,isRunningProcess:i}=T(r,e);return ee(t,e,o).then(()=>{var r;return Y(t,n),s&&e.$container.addClass(J).data(M,e),(r=e)._childController={},r.find(`.${J}`).each(function(){const e=$(this),t=G(e);t&&G(e.parent())===r&&j(r,t)}),i||A(o),e})},refresh:(e,t=null)=>ee(e,t)};function Ce(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)"__proto__"!==r&&(e[r]=n[r])}return e}var Ne=function e(t,n){function r(e,r,s){if("undefined"!=typeof document){"number"==typeof(s=Ce({},n,s)).expires&&(s.expires=new Date(Date.now()+864e5*s.expires)),s.expires&&(s.expires=s.expires.toUTCString()),e=encodeURIComponent(e).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var o="";for(var i in s)s[i]&&(o+="; "+i,!0!==s[i]&&(o+="="+s[i].split(";")[0]));return document.cookie=e+"="+t.write(r,e)+o}}return Object.create({set:r,get:function(e){if("undefined"!=typeof document&&(!arguments.length||e)){for(var n=document.cookie?document.cookie.split("; "):[],r={},s=0;s<n.length;s++){var o=n[s].split("="),i=o.slice(1).join("=");try{var l=decodeURIComponent(o[0]);if(l in r||(r[l]=t.read(i,l)),e===l)break}catch(e){}}return e?r[e]:r}},remove:function(e,t){r(e,"",Ce({},t,{expires:-1}))},withAttributes:function(t){return e(this.converter,Ce({},this.attributes,t))},withConverter:function(t){return e(Ce({},this.converter,t),this.attributes)}},{attributes:{value:Object.freeze(n)},converter:{value:Object.freeze(t)}})}({read:function(e){return'"'===e[0]&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}},{path:"/"});let Oe,Se=[];function Fe(){if(!jest)throw new Error("JEST is not defined");0===Se.length&&(Oe=$.ajax.bind($),Se.push(jest.spyOn($,"ajax")),Se[0].mockImplementation(function(e){return Oe(e).then(e=>e).catch(e=>e)}))}const Ee=ge,ke={get_controller:async function(e,t={},n=""){Fe();const r=$("body");Re.updateJquery(),r.safeEmpty();const s=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))s.data(e,n);const o=$("<div></div>").append(s);r.append(o),Re._isInit=!1,Re.cleanCache(),await Re.init_sdc();const i=Re.getController(s);return i.navControllerPath=[e],i},getCsrfToken:function(){return function(e){if(document.cookie&&""!==document.cookie){const t=document.cookie.split(";");for(let n=0;n<t.length;n++){const r=t[n].trim();if(r.substring(0,10)===e+"=")return decodeURIComponent(r.substring(10))}}return""}("csrftoken")},controllerFromTestHtml:async function(e,t=null){Fe();const n=$("body");Re.updateJquery(),n.safeEmpty().append(e),Re._isInit=!1,Re.cleanCache(),await Re.init_sdc();let r=Re.rootController.iterateAllChildren();if(!t)return r;const s=r[0].onRefresh,o=jest.spyOn(r[0],"onRefresh");return new Promise(e=>{o.mockImplementation(function(){o.mockRestore();const t=s.apply(r[0],arguments);return e(r),t})})},logout:()=>{Ne.remove("sessionid"),console.log("Logged out")},login:e=>{const t=globalThis.SDC_TEST_USER?.[e];return t?(Ne.set("sessionid",t),console.log(`Logged in as ${e}`),!0):(Ne.remove("sessionid"),console.warn(`Unknown test user: ${e}`),!1)}};window&&(window.sdcApp=Re);export{we as AbstractSDC,de as SdcModel,ue as SdcQuerySet,b as allOff,Re as app,l as checkIfParamNumberBoolOrString,c as clearErrorsInForm,L as controllerFactory,v as on,ne as registerModel,q as runControlFlowFunctions,u as setErrorsInForm,w as setEvent,Ee as socketReconnect,ke as test_utils,R as trigger};
|
package/package.json
CHANGED
|
@@ -9,7 +9,9 @@ import {
|
|
|
9
9
|
loadFilesFromController,
|
|
10
10
|
refresh,
|
|
11
11
|
runControllerFillContent,
|
|
12
|
+
VIEW_REDIRECT,
|
|
12
13
|
} from "./sdc_view.js";
|
|
14
|
+
import { trigger } from "./sdc_events.js";
|
|
13
15
|
|
|
14
16
|
import { runOnInitWithParameter } from "./sdc_params.js";
|
|
15
17
|
import { setControllerEvents } from "./sdc_dom_events.js";
|
|
@@ -199,6 +201,7 @@ function runControllerShow(controller, $html) {
|
|
|
199
201
|
*/
|
|
200
202
|
function runControllerLoad(controller) {
|
|
201
203
|
return loadFilesFromController(controller).then((html) => {
|
|
204
|
+
if (html === VIEW_REDIRECT) return html;
|
|
202
205
|
if (!controller.onLoad || controller._onLoadDone) {
|
|
203
206
|
return html;
|
|
204
207
|
}
|
|
@@ -224,9 +227,16 @@ function runControllerLoad(controller) {
|
|
|
224
227
|
export function runControlFlowFunctions(controller, process) {
|
|
225
228
|
const prom_controller = runControllerLoad(controller)
|
|
226
229
|
.then(function ($html) {
|
|
230
|
+
if ($html === VIEW_REDIRECT) {
|
|
231
|
+
if (typeof controller.confirmPageLoaded === "function") {
|
|
232
|
+
trigger("navLoaded", controller);
|
|
233
|
+
}
|
|
234
|
+
return VIEW_REDIRECT;
|
|
235
|
+
}
|
|
227
236
|
return runControllerShow(controller, $html);
|
|
228
237
|
})
|
|
229
|
-
.then(() => {
|
|
238
|
+
.then((result) => {
|
|
239
|
+
if (result === VIEW_REDIRECT) return;
|
|
230
240
|
return runRefresh(controller, process);
|
|
231
241
|
})
|
|
232
242
|
.catch(function ($html) {
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
replaceTagElementsInContainer,
|
|
8
8
|
reloadHTMLController,
|
|
9
|
+
VIEW_REDIRECT,
|
|
9
10
|
DATA_CONTROLLER_KEY,
|
|
10
11
|
CONTROLLER_CLASS,
|
|
11
12
|
getController,
|
|
@@ -402,6 +403,7 @@ export let app = {
|
|
|
402
403
|
*/
|
|
403
404
|
reloadController: (controller) => {
|
|
404
405
|
return reloadHTMLController(controller).then((html) => {
|
|
406
|
+
if (html === VIEW_REDIRECT) return;
|
|
405
407
|
let $html = $(html);
|
|
406
408
|
return app.reconcile(controller, $html);
|
|
407
409
|
});
|
|
@@ -14,6 +14,9 @@ import { trigger } from "./sdc_events.js";
|
|
|
14
14
|
*/
|
|
15
15
|
let htmlFiles = {};
|
|
16
16
|
|
|
17
|
+
// A redirect is a navigation result, not HTML to render or cache.
|
|
18
|
+
export const VIEW_REDIRECT = Symbol("view redirect");
|
|
19
|
+
|
|
17
20
|
export const DATA_CONTROLLER_KEY = "_controller_";
|
|
18
21
|
export const CONTROLLER_CLASS = "_sdc_controller_";
|
|
19
22
|
|
|
@@ -100,6 +103,7 @@ function loadHTMLFile(controller, args) {
|
|
|
100
103
|
if (!contentUrl) {
|
|
101
104
|
return Promise.resolve(false);
|
|
102
105
|
} else if (htmlFiles[_tagName]) {
|
|
106
|
+
controller.autoRedirect = null;
|
|
103
107
|
return Promise.resolve(htmlFiles[_tagName]);
|
|
104
108
|
}
|
|
105
109
|
|
|
@@ -108,6 +112,7 @@ function loadHTMLFile(controller, args) {
|
|
|
108
112
|
|
|
109
113
|
return $.get(contentUrl, args)
|
|
110
114
|
.then(function (data) {
|
|
115
|
+
controller.autoRedirect = null;
|
|
111
116
|
if (!contentReload) {
|
|
112
117
|
htmlFiles[_tagName] = data;
|
|
113
118
|
}
|
|
@@ -117,11 +122,9 @@ function loadHTMLFile(controller, args) {
|
|
|
117
122
|
.catch(function (err) {
|
|
118
123
|
if (err.status === 301) {
|
|
119
124
|
const data = err.responseJSON;
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
return '<p>Redirected</p>';
|
|
125
|
+
controller.autoRedirect = data["url-link"];
|
|
126
|
+
trigger("_RedirectOnView", controller.autoRedirect);
|
|
127
|
+
return VIEW_REDIRECT;
|
|
125
128
|
}
|
|
126
129
|
controller.autoRedirect = null;
|
|
127
130
|
if (typeof controller.confirmPageLoaded === "function") {
|
|
@@ -216,6 +219,7 @@ export function loadFilesFromController(controller) {
|
|
|
216
219
|
return Promise.all([loadHTMLFile(controller, getElements.args)]).then(
|
|
217
220
|
function (results) {
|
|
218
221
|
let htmlFile = results[0];
|
|
222
|
+
if (htmlFile === VIEW_REDIRECT) return VIEW_REDIRECT;
|
|
219
223
|
if (htmlFile) {
|
|
220
224
|
try {
|
|
221
225
|
return $(htmlFile);
|