sdc_client 0.4.12 → 0.4.13

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
@@ -24,7 +24,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
24
24
  \*********************************************/
25
25
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
26
26
 
27
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* binding */ AbstractSDC)\n/* harmony export */ });\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_socket_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\n\nclass AbstractSDC {\n constructor() {\n this._uuid = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.uuidv4)();\n this.contentUrl = '';\n this.contentReload = false;\n this.hasSubnavView = false;\n this.events = [];\n this.load_async = false;\n this.isEventsSet = false;\n this._allEvents = null;\n this._urlParams = [];\n this._models = [];\n\n // ------------------ Old deprecated properties ----------------------\n this._cssUrls = [];\n this.afterShow = () => {\n console.warn('afterShow is deprecated!!');\n };\n // -------------- End old deprecated properties ----------------------\n\n /**\n *\n * @type {{string: AbstractSDC}}\n */\n this._mixins = {};\n\n /**\n * @type {string}\n */\n this._tagName = '';\n\n /**\n * @type {{string:AbstractSDC}}\n */\n this._childController = {};\n\n /**\n * @type {AbstractSDC}\n */\n this._parentController = null;\n\n /**\n * @type {boolean}\n */\n this._onLoadDone = false;\n\n /**\n * @type {jquery}\n */\n this.$container = null;\n\n /**\n *\n * @type {boolean}\n */\n this._isMixin = false;\n }\n\n /**\n *\n * @param {string} method must be in {}\n * @param {Array} args in arguments of\n *\n */\n _runLifecycle(method, args) {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG) {\n console.debug(method, this._tagName);\n }\n let returnPromisses = [];\n if (this._isMixin) {\n return;\n }\n this._isMixin = true;\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (typeof mixin[method] === 'function') {\n returnPromisses.push(mixin[method].apply(this, args));\n }\n }\n return Promise.all(returnPromisses).then(() => {\n this._isMixin = false;\n });\n }\n onInit() {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG) {\n console.DEBUG(Array.apply(null, arguments), this._tagName);\n }\n }\n onLoad() {\n return this._runLifecycle('onLoad', arguments);\n }\n willShow() {\n return this._runLifecycle('willShow', arguments);\n }\n onRefresh() {\n return this._runLifecycle('onRefresh', arguments);\n }\n onRemove() {\n this._runLifecycle('onRemove', arguments);\n return true;\n }\n remove() {\n for (const model of this._models) {\n model.close();\n }\n let _childController = this._childController;\n for (let i in _childController) {\n if (_childController.hasOwnProperty(i)) {\n for (let cc of _childController[i]) {\n if (!cc.remove()) {\n return false;\n }\n }\n }\n }\n if (!this.onRemove || this.onRemove()) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_0__.allOff)(this);\n const c_name = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.tagNameToCamelCase)(this._tagName);\n if (this._parentController._childController[c_name]) {\n let arr = this._parentController._childController[c_name];\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] === this) {\n arr.splice(i, 1);\n }\n }\n }\n this.$container.remove();\n delete this;\n return true;\n }\n return false;\n }\n controller_name() {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.tagNameToReadableName)(this._tagName);\n }\n addEvent(event, selector, handler) {\n this.getEvents();\n this._allEvents[event] = this._allEvents[event] || {};\n this._allEvents[event][selector] = handler;\n }\n getEvents() {\n if (this._allEvents) return this._allEvents;\n let allEvents = [];\n allEvents = allEvents.concat(this.events);\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (Array.isArray(mixin.events)) {\n allEvents = allEvents.concat(mixin.events);\n }\n }\n return this._allEvents = Object.assign({}, ...allEvents);\n }\n post(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.post(this, url, args);\n }\n get(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.get(this, url, args);\n }\n submitForm(form, url, method) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.submitFormAndUpdateView(this, form, url, method);\n }\n serverCall(methode, args) {\n let re = /sdc_view\\/([^/]+)/i;\n let app = this.contentUrl.match(re);\n if (!app || app.length < 2) {\n console.error('To use the serverCall function the contentUrl must be set: ' + this.name);\n return;\n }\n return (0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_2__.callServer)(app[1], this._tagName, methode, args);\n }\n\n /**\n *\n * @param model_name {string}\n * @param model_query {Object}\n * @constructor\n */\n newModel(model_name, model_query = {}) {\n let model = new _sdc_socket_js__WEBPACK_IMPORTED_MODULE_2__.Model(model_name, model_query);\n this._models.push(model);\n return model;\n }\n\n /**\n * Adapter to this.$container.find\n * @param {string} domSelector\n */\n find(domSelector) {\n return this.$container.find(domSelector);\n }\n refresh() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.refresh(this.$container, this);\n }\n reload() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reloadController(this);\n }\n submitModelForm($form, e) {\n return this._submitModelForm($form, e);\n }\n\n /**\n * Model Form Events\n */\n\n _submitModelForm($form, e) {\n let p_list = [];\n if (!this._isMixin) {\n e.stopPropagation();\n e.preventDefault();\n let model = $form.data('model');\n const values = model.syncForm($form);\n for (let instance_value of values) {\n p_list.push(new Promise((resolve, reject) => {\n let prom;\n if (instance_value.pk !== null) {\n prom = model.save(instance_value.pk);\n } else {\n prom = model.create(instance_value);\n }\n prom.then(res => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.clearErrorsInForm)($form);\n resolve(res);\n }).catch(data => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.setErrorsInForm)($form, $(data.html));\n reject(data);\n });\n }));\n }\n }\n return Promise.all(p_list).then(res => {\n return Object.assign({}, ...res.flat());\n });\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQztFQUNOO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvQWJzdHJhY3RTREMuanM/ZDdmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FsbE9mZn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHthcHB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQge2NhbGxTZXJ2ZXIsIE1vZGVsfSBmcm9tIFwiLi9zZGNfc29ja2V0LmpzXCI7XG5pbXBvcnQge3V1aWR2NCwgc2V0RXJyb3JzSW5Gb3JtLCBjbGVhckVycm9yc0luRm9ybSwgdGFnTmFtZVRvQ2FtZWxDYXNlLCB0YWdOYW1lVG9SZWFkYWJsZU5hbWV9IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgQWJzdHJhY3RTREMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl91dWlkID0gdXVpZHY0KCk7XG4gICAgICAgIHRoaXMuY29udGVudFVybCA9ICcnO1xuICAgICAgICB0aGlzLmNvbnRlbnRSZWxvYWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNTdWJuYXZWaWV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgICAgIHRoaXMubG9hZF9hc3luYyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRXZlbnRzU2V0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2FsbEV2ZW50cyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fdXJsUGFyYW1zID0gW107XG4gICAgICAgIHRoaXMuX21vZGVscyA9IFtdO1xuXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBPbGQgZGVwcmVjYXRlZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy5fY3NzVXJscyA9IFtdO1xuICAgICAgICB0aGlzLmFmdGVyU2hvdyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignYWZ0ZXJTaG93IGlzIGRlcHJlY2F0ZWQhIScpXG4gICAgICAgIH07XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tIEVuZCBvbGQgZGVwcmVjYXRlZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBAdHlwZSB7e3N0cmluZzogQWJzdHJhY3RTREN9fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fbWl4aW5zID0ge307XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl90YWdOYW1lID0gJyc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHt7c3RyaW5nOkFic3RyYWN0U0RDfX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2NoaWxkQ29udHJvbGxlciA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7QWJzdHJhY3RTREN9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9wYXJlbnRDb250cm9sbGVyID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9vbkxvYWREb25lID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtqcXVlcnl9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLiRjb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2lzTWl4aW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgbXVzdCBiZSBpbiB7fVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgaW4gYXJndW1lbnRzIG9mXG4gICAgICpcbiAgICAgKi9cbiAgICBfcnVuTGlmZWN5Y2xlKG1ldGhvZCwgYXJncykge1xuICAgICAgICBpZiAoYXBwLkRFQlVHKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKG1ldGhvZCwgdGhpcy5fdGFnTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuUHJvbWlzc2VzID0gW107XG4gICAgICAgIGlmICh0aGlzLl9pc01peGluKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNNaXhpbiA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IG1peGluS2V5IGluIHRoaXMuX21peGlucykge1xuICAgICAgICAgICAgbGV0IG1peGluID0gdGhpcy5fbWl4aW5zW21peGluS2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWl4aW5bbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuUHJvbWlzc2VzLnB1c2gobWl4aW5bbWV0aG9kXS5hcHBseSh0aGlzLCBhcmdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmV0dXJuUHJvbWlzc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2lzTWl4aW4gPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Jbml0KCkge1xuICAgICAgICBpZiAoYXBwLkRFQlVHKSB7XG4gICAgICAgICAgICBjb25zb2xlLkRFQlVHKEFycmF5LmFwcGx5KG51bGwsIGFyZ3VtZW50cyksIHRoaXMuX3RhZ05hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Mb2FkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKCdvbkxvYWQnLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHdpbGxTaG93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKCd3aWxsU2hvdycsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgb25SZWZyZXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKCdvblJlZnJlc2gnLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICB0aGlzLl9ydW5MaWZlY3ljbGUoJ29uUmVtb3ZlJywgYXJndW1lbnRzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgdGhpcy5fbW9kZWxzKSB7XG4gICAgICAgICAgICBtb2RlbC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBfY2hpbGRDb250cm9sbGVyID0gdGhpcy5fY2hpbGRDb250cm9sbGVyO1xuICAgICAgICBmb3IgKGxldCBpIGluIF9jaGlsZENvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGlmIChfY2hpbGRDb250cm9sbGVyLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2Mgb2YgX2NoaWxkQ29udHJvbGxlcltpXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNjLnJlbW92ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub25SZW1vdmUgfHwgdGhpcy5vblJlbW92ZSgpKSB7XG4gICAgICAgICAgICBhbGxPZmYodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBjX25hbWUgPSB0YWdOYW1lVG9DYW1lbENhc2UodGhpcy5fdGFnTmFtZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NfbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5fcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NfbmFtZV07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFycltpXSA9PT0gdGhpcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy4kY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb250cm9sbGVyX25hbWUoKSB7XG4gICAgICAgIHJldHVybiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUodGhpcy5fdGFnTmFtZSk7XG4gICAgfVxuXG4gICAgYWRkRXZlbnQoZXZlbnQsIHNlbGVjdG9yLCBoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuZ2V0RXZlbnRzKCk7XG4gICAgICAgIHRoaXMuX2FsbEV2ZW50c1tldmVudF0gPSB0aGlzLl9hbGxFdmVudHNbZXZlbnRdIHx8IHt9O1xuICAgICAgICB0aGlzLl9hbGxFdmVudHNbZXZlbnRdW3NlbGVjdG9yXSA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgZ2V0RXZlbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5fYWxsRXZlbnRzKSByZXR1cm4gdGhpcy5fYWxsRXZlbnRzO1xuICAgICAgICBsZXQgYWxsRXZlbnRzID0gW107XG4gICAgICAgIGFsbEV2ZW50cyA9IGFsbEV2ZW50cy5jb25jYXQodGhpcy5ldmVudHMpO1xuICAgICAgICBmb3IgKGxldCBtaXhpbktleSBpbiB0aGlzLl9taXhpbnMpIHtcbiAgICAgICAgICAgIGxldCBtaXhpbiA9IHRoaXMuX21peGluc1ttaXhpbktleV07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtaXhpbi5ldmVudHMpKSB7XG4gICAgICAgICAgICAgICAgYWxsRXZlbnRzID0gYWxsRXZlbnRzLmNvbmNhdChtaXhpbi5ldmVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiAodGhpcy5fYWxsRXZlbnRzID0gT2JqZWN0LmFzc2lnbih7fSwgLi4uYWxsRXZlbnRzKSk7XG4gICAgfVxuXG4gICAgcG9zdCh1cmwsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFwcC5wb3N0KHRoaXMsIHVybCwgYXJncyk7XG4gICAgfVxuXG4gICAgZ2V0KHVybCwgYXJncykge1xuICAgICAgICByZXR1cm4gYXBwLmdldCh0aGlzLCB1cmwsIGFyZ3MpO1xuICAgIH1cblxuICAgIHN1Ym1pdEZvcm0oZm9ybSwgdXJsLCBtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGFwcC5zdWJtaXRGb3JtQW5kVXBkYXRlVmlldyh0aGlzLCBmb3JtLCB1cmwsIG1ldGhvZCk7XG4gICAgfVxuXG4gICAgc2VydmVyQ2FsbChtZXRob2RlLCBhcmdzKSB7XG4gICAgICAgIGxldCByZSA9IC9zZGNfdmlld1xcLyhbXi9dKykvaTtcbiAgICAgICAgbGV0IGFwcCA9IHRoaXMuY29udGVudFVybC5tYXRjaChyZSk7XG4gICAgICAgIGlmICghYXBwIHx8IGFwcC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUbyB1c2UgdGhlIHNlcnZlckNhbGwgZnVuY3Rpb24gdGhlIGNvbnRlbnRVcmwgbXVzdCBiZSBzZXQ6ICcgKyB0aGlzLm5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxTZXJ2ZXIoYXBwWzFdLCB0aGlzLl90YWdOYW1lLCBtZXRob2RlLCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbF9uYW1lIHtzdHJpbmd9XG4gICAgICogQHBhcmFtIG1vZGVsX3F1ZXJ5IHtPYmplY3R9XG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgbmV3TW9kZWwobW9kZWxfbmFtZSwgbW9kZWxfcXVlcnkgPSB7fSkge1xuICAgICAgICBsZXQgbW9kZWwgPSBuZXcgTW9kZWwobW9kZWxfbmFtZSwgbW9kZWxfcXVlcnkpO1xuICAgICAgICB0aGlzLl9tb2RlbHMucHVzaChtb2RlbCk7XG4gICAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGFwdGVyIHRvIHRoaXMuJGNvbnRhaW5lci5maW5kXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRvbVNlbGVjdG9yXG4gICAgICovXG4gICAgZmluZChkb21TZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gdGhpcy4kY29udGFpbmVyLmZpbmQoZG9tU2VsZWN0b3IpO1xuICAgIH1cblxuICAgIHJlZnJlc2goKSB7XG4gICAgICAgIHJldHVybiBhcHAucmVmcmVzaCh0aGlzLiRjb250YWluZXIsIHRoaXMpO1xuICAgIH1cblxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIGFwcC5yZWxvYWRDb250cm9sbGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb2RlbCBGb3JtIEV2ZW50c1xuICAgICAqL1xuXG4gICAgX3N1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSkge1xuICAgICAgICBsZXQgcF9saXN0ID0gW107XG4gICAgICAgIGlmICghdGhpcy5faXNNaXhpbikge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGxldCBtb2RlbCA9ICRmb3JtLmRhdGEoJ21vZGVsJyk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBtb2RlbC5zeW5jRm9ybSgkZm9ybSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbnN0YW5jZV92YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBwX2xpc3QucHVzaChuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tO1xuICAgICAgICAgICAgICAgICAgICBpZihpbnN0YW5jZV92YWx1ZS5wayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbSA9IG1vZGVsLnNhdmUoaW5zdGFuY2VfdmFsdWUucGspO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbSA9IG1vZGVsLmNyZWF0ZShpbnN0YW5jZV92YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9tLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJFcnJvcnNJbkZvcm0oJGZvcm0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JzSW5Gb3JtKCRmb3JtLCAkKGRhdGEuaHRtbCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwX2xpc3QpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIC4uLnJlcy5mbGF0KCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59Il0sIm5hbWVzIjpbImFsbE9mZiIsImFwcCIsImNhbGxTZXJ2ZXIiLCJNb2RlbCIsInV1aWR2NCIsInNldEVycm9yc0luRm9ybSIsImNsZWFyRXJyb3JzSW5Gb3JtIiwidGFnTmFtZVRvQ2FtZWxDYXNlIiwidGFnTmFtZVRvUmVhZGFibGVOYW1lIiwiQWJzdHJhY3RTREMiLCJjb25zdHJ1Y3RvciIsIl91dWlkIiwiY29udGVudFVybCIsImNvbnRlbnRSZWxvYWQiLCJoYXNTdWJuYXZWaWV3IiwiZXZlbnRzIiwibG9hZF9hc3luYyIsImlzRXZlbnRzU2V0IiwiX2FsbEV2ZW50cyIsIl91cmxQYXJhbXMiLCJfbW9kZWxzIiwiX2Nzc1VybHMiLCJhZnRlclNob3ciLCJjb25zb2xlIiwid2FybiIsIl9taXhpbnMiLCJfdGFnTmFtZSIsIl9jaGlsZENvbnRyb2xsZXIiLCJfcGFyZW50Q29udHJvbGxlciIsIl9vbkxvYWREb25lIiwiJGNvbnRhaW5lciIsIl9pc01peGluIiwiX3J1bkxpZmVjeWNsZSIsIm1ldGhvZCIsImFyZ3MiLCJERUJVRyIsImRlYnVnIiwicmV0dXJuUHJvbWlzc2VzIiwibWl4aW5LZXkiLCJtaXhpbiIsInB1c2giLCJhcHBseSIsIlByb21pc2UiLCJhbGwiLCJ0aGVuIiwib25Jbml0IiwiQXJyYXkiLCJhcmd1bWVudHMiLCJvbkxvYWQiLCJ3aWxsU2hvdyIsIm9uUmVmcmVzaCIsIm9uUmVtb3ZlIiwicmVtb3ZlIiwibW9kZWwiLCJjbG9zZSIsImkiLCJoYXNPd25Qcm9wZXJ0eSIsImNjIiwiY19uYW1lIiwiYXJyIiwibGVuZ3RoIiwic3BsaWNlIiwiY29udHJvbGxlcl9uYW1lIiwiYWRkRXZlbnQiLCJldmVudCIsInNlbGVjdG9yIiwiaGFuZGxlciIsImdldEV2ZW50cyIsImFsbEV2ZW50cyIsImNvbmNhdCIsImlzQXJyYXkiLCJPYmplY3QiLCJhc3NpZ24iLCJwb3N0IiwidXJsIiwiZ2V0Iiwic3VibWl0Rm9ybSIsImZvcm0iLCJzdWJtaXRGb3JtQW5kVXBkYXRlVmlldyIsInNlcnZlckNhbGwiLCJtZXRob2RlIiwicmUiLCJtYXRjaCIsImVycm9yIiwibmFtZSIsIm5ld01vZGVsIiwibW9kZWxfbmFtZSIsIm1vZGVsX3F1ZXJ5IiwiZmluZCIsImRvbVNlbGVjdG9yIiwicmVmcmVzaCIsInJlbG9hZCIsInJlbG9hZENvbnRyb2xsZXIiLCJzdWJtaXRNb2RlbEZvcm0iLCIkZm9ybSIsImUiLCJfc3VibWl0TW9kZWxGb3JtIiwicF9saXN0Iiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJkYXRhIiwidmFsdWVzIiwic3luY0Zvcm0iLCJpbnN0YW5jZV92YWx1ZSIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9tIiwicGsiLCJzYXZlIiwiY3JlYXRlIiwicmVzIiwiY2F0Y2giLCIkIiwiaHRtbCIsImZsYXQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/AbstractSDC.js\n");
27
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* binding */ AbstractSDC)\n/* harmony export */ });\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_socket_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\n\nclass AbstractSDC {\n constructor() {\n this._uuid = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.uuidv4)();\n this.contentUrl = '';\n this.contentReload = false;\n this.hasSubnavView = false;\n this.events = [];\n this.load_async = false;\n this.isEventsSet = false;\n this._allEvents = null;\n this._urlParams = [];\n this._models = [];\n\n // ------------------ Old deprecated properties ----------------------\n this._cssUrls = [];\n this.afterShow = () => {\n console.warn('afterShow is deprecated!!');\n };\n // -------------- End old deprecated properties ----------------------\n\n /**\n *\n * @type {{string: AbstractSDC}}\n */\n this._mixins = {};\n\n /**\n * @type {string}\n */\n this._tagName = '';\n\n /**\n * @type {{string:AbstractSDC}}\n */\n this._childController = {};\n\n /**\n * @type {AbstractSDC}\n */\n this._parentController = null;\n\n /**\n * @type {boolean}\n */\n this._onLoadDone = false;\n\n /**\n * @type {jquery}\n */\n this.$container = null;\n\n /**\n *\n * @type {boolean}\n */\n this._isMixin = false;\n }\n\n /**\n *\n * @param {string} method must be in {}\n * @param {Array} args in arguments of\n *\n */\n _runLifecycle(method, args) {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG) {\n console.debug(method, this._tagName);\n }\n let returnPromisses = [];\n if (this._isMixin) {\n return;\n }\n this._isMixin = true;\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (typeof mixin[method] === 'function') {\n returnPromisses.push(mixin[method].apply(this, args));\n }\n }\n return Promise.all(returnPromisses).then(() => {\n this._isMixin = false;\n });\n }\n onInit() {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG) {\n console.DEBUG(Array.apply(null, arguments), this._tagName);\n }\n }\n onLoad() {\n return this._runLifecycle('onLoad', arguments);\n }\n willShow() {\n return this._runLifecycle('willShow', arguments);\n }\n onRefresh() {\n return this._runLifecycle('onRefresh', arguments);\n }\n onRemove() {\n this._runLifecycle('onRemove', arguments);\n return true;\n }\n remove() {\n for (const model of this._models) {\n model.close();\n }\n let _childController = this._childController;\n for (let i in _childController) {\n if (_childController.hasOwnProperty(i)) {\n for (let cc of _childController[i]) {\n if (!cc.remove()) {\n return false;\n }\n }\n }\n }\n if (!this.onRemove || this.onRemove()) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_0__.allOff)(this);\n const c_name = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.tagNameToCamelCase)(this._tagName);\n if (this._parentController._childController[c_name]) {\n let arr = this._parentController._childController[c_name];\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] === this) {\n arr.splice(i, 1);\n }\n }\n }\n this.$container.remove();\n delete this;\n return true;\n }\n return false;\n }\n controller_name() {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.tagNameToReadableName)(this._tagName);\n }\n addEvent(event, selector, handler) {\n this.getEvents();\n this._allEvents[event] = this._allEvents[event] || {};\n this._allEvents[event][selector] = handler;\n }\n getEvents() {\n if (this._allEvents) return this._allEvents;\n let allEvents = [];\n allEvents = allEvents.concat(this.events);\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (Array.isArray(mixin.events)) {\n allEvents = allEvents.concat(mixin.events);\n }\n }\n return this._allEvents = Object.assign({}, ...allEvents);\n }\n post(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.post(this, url, args);\n }\n get(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.get(this, url, args);\n }\n submitForm(form, url, method) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.submitFormAndUpdateView(this, form, url, method);\n }\n serverCall(methode, args) {\n let re = /sdc_view\\/([^/]+)/i;\n let app = this.contentUrl.match(re);\n if (!app || app.length < 2) {\n console.error('To use the serverCall function the contentUrl must be set: ' + this.name);\n return;\n }\n return (0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_2__.callServer)(app[1], this._tagName, methode, args);\n }\n\n /**\n *\n * @param model_name {string}\n * @param model_query {Object}\n * @constructor\n */\n newModel(model_name, model_query = {}) {\n let model = new _sdc_socket_js__WEBPACK_IMPORTED_MODULE_2__.Model(model_name, model_query);\n this._models.push(model);\n return model;\n }\n\n /**\n * Adapter to this.$container.find\n * @param {string} domSelector\n */\n find(domSelector) {\n return this.$container.find(domSelector);\n }\n refresh() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.refresh(this.$container, this);\n }\n reload() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reloadController(this);\n }\n submitModelFormDistributor($form, e) {\n if (this.hasOwnProperty('_submitModelForm') && typeof this._submitModelForm === 'function') {\n return this._submitModelForm($form, e);\n }\n if (this.hasOwnProperty('submitModelForm') && typeof this.submitModelForm === 'function') {\n return this.submitModelForm($form, e);\n }\n return this._fallbackSubmitModelForm($form, e);\n }\n\n /**\n * Model Form Events\n */\n\n _fallbackSubmitModelForm($form, e) {\n let p_list = [];\n if (!this._isMixin) {\n e.stopPropagation();\n e.preventDefault();\n let model = $form.data('model');\n const values = model.syncForm($form);\n for (let instance_value of values) {\n p_list.push(new Promise((resolve, reject) => {\n let prom;\n if (instance_value.pk !== null) {\n prom = model.save(instance_value.pk);\n } else {\n prom = model.create(instance_value);\n }\n prom.then(res => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.clearErrorsInForm)($form);\n resolve(res);\n }).catch(data => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_3__.setErrorsInForm)($form, $(data.html));\n reject(data);\n });\n }));\n }\n }\n return Promise.all(p_list).then(res => {\n return Object.assign({}, ...res.flat());\n });\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9BYnN0cmFjdFNEQy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUF1QztBQUNMO0FBQ2dCO0FBQ21FO0FBRTlHLE1BQU1TLFdBQVcsQ0FBQztFQUNyQkMsV0FBV0EsQ0FBQSxFQUFHO0lBQ1YsSUFBSSxDQUFDQyxLQUFLLEdBQUdQLHFEQUFNLENBQUMsQ0FBQztJQUNyQixJQUFJLENBQUNRLFVBQVUsR0FBRyxFQUFFO0lBQ3BCLElBQUksQ0FBQ0MsYUFBYSxHQUFHLEtBQUs7SUFDMUIsSUFBSSxDQUFDQyxhQUFhLEdBQUcsS0FBSztJQUMxQixJQUFJLENBQUNDLE1BQU0sR0FBRyxFQUFFO0lBQ2hCLElBQUksQ0FBQ0MsVUFBVSxHQUFHLEtBQUs7SUFDdkIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsS0FBSztJQUN4QixJQUFJLENBQUNDLFVBQVUsR0FBRyxJQUFJO0lBRXRCLElBQUksQ0FBQ0MsVUFBVSxHQUFHLEVBQUU7SUFDcEIsSUFBSSxDQUFDQyxPQUFPLEdBQUcsRUFBRTs7SUFFakI7SUFDQSxJQUFJLENBQUNDLFFBQVEsR0FBRyxFQUFFO0lBQ2xCLElBQUksQ0FBQ0MsU0FBUyxHQUFHLE1BQU07TUFDbkJDLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDLDJCQUEyQixDQUFDO0lBQzdDLENBQUM7SUFDRDs7SUFHQTtBQUNSO0FBQ0E7QUFDQTtJQUNRLElBQUksQ0FBQ0MsT0FBTyxHQUFHLENBQUMsQ0FBQzs7SUFFakI7QUFDUjtBQUNBO0lBQ1EsSUFBSSxDQUFDQyxRQUFRLEdBQUcsRUFBRTs7SUFFbEI7QUFDUjtBQUNBO0lBQ1EsSUFBSSxDQUFDQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7O0lBRTFCO0FBQ1I7QUFDQTtJQUNRLElBQUksQ0FBQ0MsaUJBQWlCLEdBQUcsSUFBSTs7SUFFN0I7QUFDUjtBQUNBO0lBQ1EsSUFBSSxDQUFDQyxXQUFXLEdBQUcsS0FBSzs7SUFFeEI7QUFDUjtBQUNBO0lBQ1EsSUFBSSxDQUFDQyxVQUFVLEdBQUcsSUFBSTs7SUFFdEI7QUFDUjtBQUNBO0FBQ0E7SUFDUSxJQUFJLENBQUNDLFFBQVEsR0FBRyxLQUFLO0VBQ3pCOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJQyxhQUFhQSxDQUFDQyxNQUFNLEVBQUVDLElBQUksRUFBRTtJQUN4QixJQUFJakMsNkNBQUcsQ0FBQ2tDLEtBQUssRUFBRTtNQUNYWixPQUFPLENBQUNhLEtBQUssQ0FBQ0gsTUFBTSxFQUFFLElBQUksQ0FBQ1AsUUFBUSxDQUFDO0lBQ3hDO0lBRUEsSUFBSVcsZUFBZSxHQUFHLEVBQUU7SUFDeEIsSUFBSSxJQUFJLENBQUNOLFFBQVEsRUFBRTtNQUNmO0lBQ0o7SUFDQSxJQUFJLENBQUNBLFFBQVEsR0FBRyxJQUFJO0lBQ3BCLEtBQUssSUFBSU8sUUFBUSxJQUFJLElBQUksQ0FBQ2IsT0FBTyxFQUFFO01BQy9CLElBQUljLEtBQUssR0FBRyxJQUFJLENBQUNkLE9BQU8sQ0FBQ2EsUUFBUSxDQUFDO01BQ2xDLElBQUksT0FBT0MsS0FBSyxDQUFDTixNQUFNLENBQUMsS0FBSyxVQUFVLEVBQUU7UUFFckNJLGVBQWUsQ0FBQ0csSUFBSSxDQUFDRCxLQUFLLENBQUNOLE1BQU0sQ0FBQyxDQUFDUSxLQUFLLENBQUMsSUFBSSxFQUFFUCxJQUFJLENBQUMsQ0FBQztNQUN6RDtJQUNKO0lBRUEsT0FBT1EsT0FBTyxDQUFDQyxHQUFHLENBQUNOLGVBQWUsQ0FBQyxDQUFDTyxJQUFJLENBQUMsTUFBTTtNQUMzQyxJQUFJLENBQUNiLFFBQVEsR0FBRyxLQUFLO0lBQ3pCLENBQUMsQ0FBQztFQUNOO0VBRUFjLE1BQU1BLENBQUEsRUFBRztJQUNMLElBQUk1Qyw2Q0FBRyxDQUFDa0MsS0FBSyxFQUFFO01BQ1haLE9BQU8sQ0FBQ1ksS0FBSyxDQUFDVyxLQUFLLENBQUNMLEtBQUssQ0FBQyxJQUFJLEVBQUVNLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQ3JCLFFBQVEsQ0FBQztJQUM5RDtFQUNKO0VBRUFzQixNQUFNQSxDQUFBLEVBQUc7SUFDTCxPQUFPLElBQUksQ0FBQ2hCLGFBQWEsQ0FBQyxRQUFRLEVBQUVlLFNBQVMsQ0FBQztFQUNsRDtFQUVBRSxRQUFRQSxDQUFBLEVBQUc7SUFDUCxPQUFPLElBQUksQ0FBQ2pCLGFBQWEsQ0FBQyxVQUFVLEVBQUVlLFNBQVMsQ0FBQztFQUNwRDtFQUVBRyxTQUFTQSxDQUFBLEVBQUc7SUFDUixPQUFPLElBQUksQ0FBQ2xCLGFBQWEsQ0FBQyxXQUFXLEVBQUVlLFNBQVMsQ0FBQztFQUNyRDtFQUVBSSxRQUFRQSxDQUFBLEVBQUc7SUFDUCxJQUFJLENBQUNuQixhQUFhLENBQUMsVUFBVSxFQUFFZSxTQUFTLENBQUM7SUFDekMsT0FBTyxJQUFJO0VBQ2Y7RUFFQUssTUFBTUEsQ0FBQSxFQUFHO0lBQ0wsS0FBSyxNQUFNQyxLQUFLLElBQUksSUFBSSxDQUFDakMsT0FBTyxFQUFFO01BQzlCaUMsS0FBSyxDQUFDQyxLQUFLLENBQUMsQ0FBQztJQUNqQjtJQUNBLElBQUkzQixnQkFBZ0IsR0FBRyxJQUFJLENBQUNBLGdCQUFnQjtJQUM1QyxLQUFLLElBQUk0QixDQUFDLElBQUk1QixnQkFBZ0IsRUFBRTtNQUM1QixJQUFJQSxnQkFBZ0IsQ0FBQzZCLGNBQWMsQ0FBQ0QsQ0FBQyxDQUFDLEVBQUU7UUFDcEMsS0FBSyxJQUFJRSxFQUFFLElBQUk5QixnQkFBZ0IsQ0FBQzRCLENBQUMsQ0FBQyxFQUFFO1VBQ2hDLElBQUksQ0FBQ0UsRUFBRSxDQUFDTCxNQUFNLENBQUMsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxLQUFLO1VBQ2hCO1FBQ0o7TUFDSjtJQUNKO0lBRUEsSUFBSSxDQUFDLElBQUksQ0FBQ0QsUUFBUSxJQUFJLElBQUksQ0FBQ0EsUUFBUSxDQUFDLENBQUMsRUFBRTtNQUNuQ25ELHNEQUFNLENBQUMsSUFBSSxDQUFDO01BQ1osTUFBTTBELE1BQU0sR0FBR25ELGlFQUFrQixDQUFDLElBQUksQ0FBQ21CLFFBQVEsQ0FBQztNQUNoRCxJQUFJLElBQUksQ0FBQ0UsaUJBQWlCLENBQUNELGdCQUFnQixDQUFDK0IsTUFBTSxDQUFDLEVBQUU7UUFDakQsSUFBSUMsR0FBRyxHQUFHLElBQUksQ0FBQy9CLGlCQUFpQixDQUFDRCxnQkFBZ0IsQ0FBQytCLE1BQU0sQ0FBQztRQUN6RCxLQUFLLElBQUlILENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0ksR0FBRyxDQUFDQyxNQUFNLEVBQUVMLENBQUMsRUFBRSxFQUFFO1VBQ2pDLElBQUlJLEdBQUcsQ0FBQ0osQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCSSxHQUFHLENBQUNFLE1BQU0sQ0FBQ04sQ0FBQyxFQUFFLENBQUMsQ0FBQztVQUNwQjtRQUNKO01BQ0o7TUFFQSxJQUFJLENBQUN6QixVQUFVLENBQUNzQixNQUFNLENBQUMsQ0FBQztNQUN4QixPQUFPLElBQUk7TUFDWCxPQUFPLElBQUk7SUFDZjtJQUVBLE9BQU8sS0FBSztFQUNoQjtFQUVBVSxlQUFlQSxDQUFBLEVBQUc7SUFDZCxPQUFPdEQsb0VBQXFCLENBQUMsSUFBSSxDQUFDa0IsUUFBUSxDQUFDO0VBQy9DO0VBRUFxQyxRQUFRQSxDQUFDQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsT0FBTyxFQUFFO0lBQy9CLElBQUksQ0FBQ0MsU0FBUyxDQUFDLENBQUM7SUFDaEIsSUFBSSxDQUFDakQsVUFBVSxDQUFDOEMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDOUMsVUFBVSxDQUFDOEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQzlDLFVBQVUsQ0FBQzhDLEtBQUssQ0FBQyxDQUFDQyxRQUFRLENBQUMsR0FBR0MsT0FBTztFQUM5QztFQUVBQyxTQUFTQSxDQUFBLEVBQUc7SUFDUixJQUFJLElBQUksQ0FBQ2pELFVBQVUsRUFBRSxPQUFPLElBQUksQ0FBQ0EsVUFBVTtJQUMzQyxJQUFJa0QsU0FBUyxHQUFHLEVBQUU7SUFDbEJBLFNBQVMsR0FBR0EsU0FBUyxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDdEQsTUFBTSxDQUFDO0lBQ3pDLEtBQUssSUFBSXVCLFFBQVEsSUFBSSxJQUFJLENBQUNiLE9BQU8sRUFBRTtNQUMvQixJQUFJYyxLQUFLLEdBQUcsSUFBSSxDQUFDZCxPQUFPLENBQUNhLFFBQVEsQ0FBQztNQUNsQyxJQUFJUSxLQUFLLENBQUN3QixPQUFPLENBQUMvQixLQUFLLENBQUN4QixNQUFNLENBQUMsRUFBRTtRQUM3QnFELFNBQVMsR0FBR0EsU0FBUyxDQUFDQyxNQUFNLENBQUM5QixLQUFLLENBQUN4QixNQUFNLENBQUM7TUFDOUM7SUFDSjtJQUdBLE9BQVEsSUFBSSxDQUFDRyxVQUFVLEdBQUdxRCxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHSixTQUFTLENBQUM7RUFDN0Q7RUFFQUssSUFBSUEsQ0FBQ0MsR0FBRyxFQUFFeEMsSUFBSSxFQUFFO0lBQ1osT0FBT2pDLDZDQUFHLENBQUN3RSxJQUFJLENBQUMsSUFBSSxFQUFFQyxHQUFHLEVBQUV4QyxJQUFJLENBQUM7RUFDcEM7RUFFQXlDLEdBQUdBLENBQUNELEdBQUcsRUFBRXhDLElBQUksRUFBRTtJQUNYLE9BQU9qQyw2Q0FBRyxDQUFDMEUsR0FBRyxDQUFDLElBQUksRUFBRUQsR0FBRyxFQUFFeEMsSUFBSSxDQUFDO0VBQ25DO0VBRUEwQyxVQUFVQSxDQUFDQyxJQUFJLEVBQUVILEdBQUcsRUFBRXpDLE1BQU0sRUFBRTtJQUMxQixPQUFPaEMsNkNBQUcsQ0FBQzZFLHVCQUF1QixDQUFDLElBQUksRUFBRUQsSUFBSSxFQUFFSCxHQUFHLEVBQUV6QyxNQUFNLENBQUM7RUFDL0Q7RUFFQThDLFVBQVVBLENBQUNDLE9BQU8sRUFBRTlDLElBQUksRUFBRTtJQUN0QixJQUFJK0MsRUFBRSxHQUFHLG9CQUFvQjtJQUM3QixJQUFJaEYsR0FBRyxHQUFHLElBQUksQ0FBQ1csVUFBVSxDQUFDc0UsS0FBSyxDQUFDRCxFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDaEYsR0FBRyxJQUFJQSxHQUFHLENBQUMyRCxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQ3hCckMsT0FBTyxDQUFDNEQsS0FBSyxDQUFDLDZEQUE2RCxHQUFHLElBQUksQ0FBQ0MsSUFBSSxDQUFDO01BQ3hGO0lBQ0o7SUFFQSxPQUFPbEYsMERBQVUsQ0FBQ0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ3lCLFFBQVEsRUFBRXNELE9BQU8sRUFBRTlDLElBQUksQ0FBQztFQUMzRDs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSW1ELFFBQVFBLENBQUNDLFVBQVUsRUFBRUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ25DLElBQUlsQyxLQUFLLEdBQUcsSUFBSWxELGlEQUFLLENBQUNtRixVQUFVLEVBQUVDLFdBQVcsQ0FBQztJQUM5QyxJQUFJLENBQUNuRSxPQUFPLENBQUNvQixJQUFJLENBQUNhLEtBQUssQ0FBQztJQUN4QixPQUFPQSxLQUFLO0VBQ2hCOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0VBQ0ltQyxJQUFJQSxDQUFDQyxXQUFXLEVBQUU7SUFDZCxPQUFPLElBQUksQ0FBQzNELFVBQVUsQ0FBQzBELElBQUksQ0FBQ0MsV0FBVyxDQUFDO0VBQzVDO0VBRUFDLE9BQU9BLENBQUEsRUFBRztJQUNOLE9BQU96Riw2Q0FBRyxDQUFDeUYsT0FBTyxDQUFDLElBQUksQ0FBQzVELFVBQVUsRUFBRSxJQUFJLENBQUM7RUFDN0M7RUFFQTZELE1BQU1BLENBQUEsRUFBRztJQUNMLE9BQU8xRiw2Q0FBRyxDQUFDMkYsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0VBQ3JDO0VBRUFDLDBCQUEwQkEsQ0FBQ0MsS0FBSyxFQUFFQyxDQUFDLEVBQUU7SUFDakMsSUFBSSxJQUFJLENBQUN2QyxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQ3dDLGdCQUFnQixLQUFLLFVBQVUsRUFBRTtNQUN4RixPQUFPLElBQUksQ0FBQ0EsZ0JBQWdCLENBQUNGLEtBQUssRUFBRUMsQ0FBQyxDQUFDO0lBQzFDO0lBQ0EsSUFBSSxJQUFJLENBQUN2QyxjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQ3lDLGVBQWUsS0FBSyxVQUFVLEVBQUU7TUFDdEYsT0FBTyxJQUFJLENBQUNBLGVBQWUsQ0FBQ0gsS0FBSyxFQUFFQyxDQUFDLENBQUM7SUFDekM7SUFDQSxPQUFPLElBQUksQ0FBQ0csd0JBQXdCLENBQUNKLEtBQUssRUFBRUMsQ0FBQyxDQUFDO0VBQ2xEOztFQUVBO0FBQ0o7QUFDQTs7RUFFSUcsd0JBQXdCQSxDQUFDSixLQUFLLEVBQUVDLENBQUMsRUFBRTtJQUMvQixJQUFJSSxNQUFNLEdBQUcsRUFBRTtJQUNmLElBQUksQ0FBQyxJQUFJLENBQUNwRSxRQUFRLEVBQUU7TUFDaEJnRSxDQUFDLENBQUNLLGVBQWUsQ0FBQyxDQUFDO01BQ25CTCxDQUFDLENBQUNNLGNBQWMsQ0FBQyxDQUFDO01BQ2xCLElBQUloRCxLQUFLLEdBQUd5QyxLQUFLLENBQUNRLElBQUksQ0FBQyxPQUFPLENBQUM7TUFDL0IsTUFBTUMsTUFBTSxHQUFHbEQsS0FBSyxDQUFDbUQsUUFBUSxDQUFDVixLQUFLLENBQUM7TUFDcEMsS0FBSyxJQUFJVyxjQUFjLElBQUlGLE1BQU0sRUFBRTtRQUMvQkosTUFBTSxDQUFDM0QsSUFBSSxDQUFDLElBQUlFLE9BQU8sQ0FBQyxDQUFDZ0UsT0FBTyxFQUFFQyxNQUFNLEtBQUs7VUFDekMsSUFBSUMsSUFBSTtVQUNSLElBQUlILGNBQWMsQ0FBQ0ksRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1QkQsSUFBSSxHQUFHdkQsS0FBSyxDQUFDeUQsSUFBSSxDQUFDTCxjQUFjLENBQUNJLEVBQUUsQ0FBQztVQUN4QyxDQUFDLE1BQU07WUFDSEQsSUFBSSxHQUFHdkQsS0FBSyxDQUFDMEQsTUFBTSxDQUFDTixjQUFjLENBQUM7VUFDdkM7VUFFQUcsSUFBSSxDQUFDaEUsSUFBSSxDQUFFb0UsR0FBRyxJQUFLO1lBQ2YxRyxnRUFBaUIsQ0FBQ3dGLEtBQUssQ0FBQztZQUN4QlksT0FBTyxDQUFDTSxHQUFHLENBQUM7VUFDaEIsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBRVgsSUFBSSxJQUFLO1lBQ2ZqRyw4REFBZSxDQUFDeUYsS0FBSyxFQUFFb0IsQ0FBQyxDQUFDWixJQUFJLENBQUNhLElBQUksQ0FBQyxDQUFDO1lBQ3BDUixNQUFNLENBQUNMLElBQUksQ0FBQztVQUNoQixDQUFDLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztNQUNQO0lBQ0o7SUFFQSxPQUFPNUQsT0FBTyxDQUFDQyxHQUFHLENBQUN3RCxNQUFNLENBQUMsQ0FBQ3ZELElBQUksQ0FBRW9FLEdBQUcsSUFBSztNQUNyQyxPQUFPekMsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBR3dDLEdBQUcsQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7RUFDTjtBQUNKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL0Fic3RyYWN0U0RDLmpzP2Q3ZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthbGxPZmZ9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcbmltcG9ydCB7YXBwfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHtjYWxsU2VydmVyLCBNb2RlbH0gZnJvbSBcIi4vc2RjX3NvY2tldC5qc1wiO1xuaW1wb3J0IHt1dWlkdjQsIHNldEVycm9yc0luRm9ybSwgY2xlYXJFcnJvcnNJbkZvcm0sIHRhZ05hbWVUb0NhbWVsQ2FzZSwgdGFnTmFtZVRvUmVhZGFibGVOYW1lfSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcblxuZXhwb3J0IGNsYXNzIEFic3RyYWN0U0RDIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fdXVpZCA9IHV1aWR2NCgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRVcmwgPSAnJztcbiAgICAgICAgdGhpcy5jb250ZW50UmVsb2FkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzU3VibmF2VmlldyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLmxvYWRfYXN5bmMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0V2ZW50c1NldCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hbGxFdmVudHMgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3VybFBhcmFtcyA9IFtdO1xuICAgICAgICB0aGlzLl9tb2RlbHMgPSBbXTtcblxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0gT2xkIGRlcHJlY2F0ZWQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMuX2Nzc1VybHMgPSBbXTtcbiAgICAgICAgdGhpcy5hZnRlclNob3cgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ2FmdGVyU2hvdyBpcyBkZXByZWNhdGVkISEnKVxuICAgICAgICB9O1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLSBFbmQgb2xkIGRlcHJlY2F0ZWQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge3tzdHJpbmc6IEFic3RyYWN0U0RDfX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX21peGlucyA9IHt9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fdGFnTmFtZSA9ICcnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7e3N0cmluZzpBYnN0cmFjdFNEQ319XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jaGlsZENvbnRyb2xsZXIgPSB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge0Fic3RyYWN0U0RDfVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcGFyZW50Q29udHJvbGxlciA9IG51bGw7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fb25Mb2FkRG9uZSA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAdHlwZSB7anF1ZXJ5fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy4kY29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9pc01peGluID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIG11c3QgYmUgaW4ge31cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIGluIGFyZ3VtZW50cyBvZlxuICAgICAqXG4gICAgICovXG4gICAgX3J1bkxpZmVjeWNsZShtZXRob2QsIGFyZ3MpIHtcbiAgICAgICAgaWYgKGFwcC5ERUJVRykge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhtZXRob2QsIHRoaXMuX3RhZ05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldHVyblByb21pc3NlcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5faXNNaXhpbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzTWl4aW4gPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBtaXhpbktleSBpbiB0aGlzLl9taXhpbnMpIHtcbiAgICAgICAgICAgIGxldCBtaXhpbiA9IHRoaXMuX21peGluc1ttaXhpbktleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1peGluW21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcblxuICAgICAgICAgICAgICAgIHJldHVyblByb21pc3Nlcy5wdXNoKG1peGluW21ldGhvZF0uYXBwbHkodGhpcywgYXJncykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJldHVyblByb21pc3NlcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9pc01peGluID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uSW5pdCgpIHtcbiAgICAgICAgaWYgKGFwcC5ERUJVRykge1xuICAgICAgICAgICAgY29uc29sZS5ERUJVRyhBcnJheS5hcHBseShudWxsLCBhcmd1bWVudHMpLCB0aGlzLl90YWdOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkxpZmVjeWNsZSgnb25Mb2FkJywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICB3aWxsU2hvdygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkxpZmVjeWNsZSgnd2lsbFNob3cnLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIG9uUmVmcmVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkxpZmVjeWNsZSgnb25SZWZyZXNoJywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fcnVuTGlmZWN5Y2xlKCdvblJlbW92ZScsIGFyZ3VtZW50cylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRoaXMuX21vZGVscykge1xuICAgICAgICAgICAgbW9kZWwuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgX2NoaWxkQ29udHJvbGxlciA9IHRoaXMuX2NoaWxkQ29udHJvbGxlcjtcbiAgICAgICAgZm9yIChsZXQgaSBpbiBfY2hpbGRDb250cm9sbGVyKSB7XG4gICAgICAgICAgICBpZiAoX2NoaWxkQ29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNjIG9mIF9jaGlsZENvbnRyb2xsZXJbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYy5yZW1vdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9uUmVtb3ZlIHx8IHRoaXMub25SZW1vdmUoKSkge1xuICAgICAgICAgICAgYWxsT2ZmKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgY19uYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKHRoaXMuX3RhZ05hbWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjX25hbWVdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyciA9IHRoaXMuX3BhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjX25hbWVdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcnJbaV0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuJGNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29udHJvbGxlcl9uYW1lKCkge1xuICAgICAgICByZXR1cm4gdGFnTmFtZVRvUmVhZGFibGVOYW1lKHRoaXMuX3RhZ05hbWUpO1xuICAgIH1cblxuICAgIGFkZEV2ZW50KGV2ZW50LCBzZWxlY3RvciwgaGFuZGxlcikge1xuICAgICAgICB0aGlzLmdldEV2ZW50cygpO1xuICAgICAgICB0aGlzLl9hbGxFdmVudHNbZXZlbnRdID0gdGhpcy5fYWxsRXZlbnRzW2V2ZW50XSB8fCB7fTtcbiAgICAgICAgdGhpcy5fYWxsRXZlbnRzW2V2ZW50XVtzZWxlY3Rvcl0gPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIGdldEV2ZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbEV2ZW50cykgcmV0dXJuIHRoaXMuX2FsbEV2ZW50cztcbiAgICAgICAgbGV0IGFsbEV2ZW50cyA9IFtdO1xuICAgICAgICBhbGxFdmVudHMgPSBhbGxFdmVudHMuY29uY2F0KHRoaXMuZXZlbnRzKTtcbiAgICAgICAgZm9yIChsZXQgbWl4aW5LZXkgaW4gdGhpcy5fbWl4aW5zKSB7XG4gICAgICAgICAgICBsZXQgbWl4aW4gPSB0aGlzLl9taXhpbnNbbWl4aW5LZXldO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWl4aW4uZXZlbnRzKSkge1xuICAgICAgICAgICAgICAgIGFsbEV2ZW50cyA9IGFsbEV2ZW50cy5jb25jYXQobWl4aW4uZXZlbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gKHRoaXMuX2FsbEV2ZW50cyA9IE9iamVjdC5hc3NpZ24oe30sIC4uLmFsbEV2ZW50cykpO1xuICAgIH1cblxuICAgIHBvc3QodXJsLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBhcHAucG9zdCh0aGlzLCB1cmwsIGFyZ3MpO1xuICAgIH1cblxuICAgIGdldCh1cmwsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFwcC5nZXQodGhpcywgdXJsLCBhcmdzKTtcbiAgICB9XG5cbiAgICBzdWJtaXRGb3JtKGZvcm0sIHVybCwgbWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBhcHAuc3VibWl0Rm9ybUFuZFVwZGF0ZVZpZXcodGhpcywgZm9ybSwgdXJsLCBtZXRob2QpO1xuICAgIH1cblxuICAgIHNlcnZlckNhbGwobWV0aG9kZSwgYXJncykge1xuICAgICAgICBsZXQgcmUgPSAvc2RjX3ZpZXdcXC8oW14vXSspL2k7XG4gICAgICAgIGxldCBhcHAgPSB0aGlzLmNvbnRlbnRVcmwubWF0Y2gocmUpO1xuICAgICAgICBpZiAoIWFwcCB8fCBhcHAubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVG8gdXNlIHRoZSBzZXJ2ZXJDYWxsIGZ1bmN0aW9uIHRoZSBjb250ZW50VXJsIG11c3QgYmUgc2V0OiAnICsgdGhpcy5uYW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxsU2VydmVyKGFwcFsxXSwgdGhpcy5fdGFnTmFtZSwgbWV0aG9kZSwgYXJncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZWxfbmFtZSB7c3RyaW5nfVxuICAgICAqIEBwYXJhbSBtb2RlbF9xdWVyeSB7T2JqZWN0fVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIG5ld01vZGVsKG1vZGVsX25hbWUsIG1vZGVsX3F1ZXJ5ID0ge30pIHtcbiAgICAgICAgbGV0IG1vZGVsID0gbmV3IE1vZGVsKG1vZGVsX25hbWUsIG1vZGVsX3F1ZXJ5KTtcbiAgICAgICAgdGhpcy5fbW9kZWxzLnB1c2gobW9kZWwpO1xuICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRhcHRlciB0byB0aGlzLiRjb250YWluZXIuZmluZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb21TZWxlY3RvclxuICAgICAqL1xuICAgIGZpbmQoZG9tU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGNvbnRhaW5lci5maW5kKGRvbVNlbGVjdG9yKTtcbiAgICB9XG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgICByZXR1cm4gYXBwLnJlZnJlc2godGhpcy4kY29udGFpbmVyLCB0aGlzKTtcbiAgICB9XG5cbiAgICByZWxvYWQoKSB7XG4gICAgICAgIHJldHVybiBhcHAucmVsb2FkQ29udHJvbGxlcih0aGlzKTtcbiAgICB9XG5cbiAgICBzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvcigkZm9ybSwgZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnX3N1Ym1pdE1vZGVsRm9ybScpICYmIHR5cGVvZiB0aGlzLl9zdWJtaXRNb2RlbEZvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdWJtaXRNb2RlbEZvcm0oJGZvcm0sIGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdzdWJtaXRNb2RlbEZvcm0nKSAmJiB0eXBlb2YgdGhpcy5zdWJtaXRNb2RlbEZvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZhbGxiYWNrU3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb2RlbCBGb3JtIEV2ZW50c1xuICAgICAqL1xuXG4gICAgX2ZhbGxiYWNrU3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKSB7XG4gICAgICAgIGxldCBwX2xpc3QgPSBbXTtcbiAgICAgICAgaWYgKCF0aGlzLl9pc01peGluKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgbGV0IG1vZGVsID0gJGZvcm0uZGF0YSgnbW9kZWwnKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG1vZGVsLnN5bmNGb3JtKCRmb3JtKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluc3RhbmNlX3ZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgIHBfbGlzdC5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb207XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZV92YWx1ZS5wayAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbSA9IG1vZGVsLnNhdmUoaW5zdGFuY2VfdmFsdWUucGspO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbSA9IG1vZGVsLmNyZWF0ZShpbnN0YW5jZV92YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9tLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJFcnJvcnNJbkZvcm0oJGZvcm0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JzSW5Gb3JtKCRmb3JtLCAkKGRhdGEuaHRtbCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwX2xpc3QpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIC4uLnJlcy5mbGF0KCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59Il0sIm5hbWVzIjpbImFsbE9mZiIsImFwcCIsImNhbGxTZXJ2ZXIiLCJNb2RlbCIsInV1aWR2NCIsInNldEVycm9yc0luRm9ybSIsImNsZWFyRXJyb3JzSW5Gb3JtIiwidGFnTmFtZVRvQ2FtZWxDYXNlIiwidGFnTmFtZVRvUmVhZGFibGVOYW1lIiwiQWJzdHJhY3RTREMiLCJjb25zdHJ1Y3RvciIsIl91dWlkIiwiY29udGVudFVybCIsImNvbnRlbnRSZWxvYWQiLCJoYXNTdWJuYXZWaWV3IiwiZXZlbnRzIiwibG9hZF9hc3luYyIsImlzRXZlbnRzU2V0IiwiX2FsbEV2ZW50cyIsIl91cmxQYXJhbXMiLCJfbW9kZWxzIiwiX2Nzc1VybHMiLCJhZnRlclNob3ciLCJjb25zb2xlIiwid2FybiIsIl9taXhpbnMiLCJfdGFnTmFtZSIsIl9jaGlsZENvbnRyb2xsZXIiLCJfcGFyZW50Q29udHJvbGxlciIsIl9vbkxvYWREb25lIiwiJGNvbnRhaW5lciIsIl9pc01peGluIiwiX3J1bkxpZmVjeWNsZSIsIm1ldGhvZCIsImFyZ3MiLCJERUJVRyIsImRlYnVnIiwicmV0dXJuUHJvbWlzc2VzIiwibWl4aW5LZXkiLCJtaXhpbiIsInB1c2giLCJhcHBseSIsIlByb21pc2UiLCJhbGwiLCJ0aGVuIiwib25Jbml0IiwiQXJyYXkiLCJhcmd1bWVudHMiLCJvbkxvYWQiLCJ3aWxsU2hvdyIsIm9uUmVmcmVzaCIsIm9uUmVtb3ZlIiwicmVtb3ZlIiwibW9kZWwiLCJjbG9zZSIsImkiLCJoYXNPd25Qcm9wZXJ0eSIsImNjIiwiY19uYW1lIiwiYXJyIiwibGVuZ3RoIiwic3BsaWNlIiwiY29udHJvbGxlcl9uYW1lIiwiYWRkRXZlbnQiLCJldmVudCIsInNlbGVjdG9yIiwiaGFuZGxlciIsImdldEV2ZW50cyIsImFsbEV2ZW50cyIsImNvbmNhdCIsImlzQXJyYXkiLCJPYmplY3QiLCJhc3NpZ24iLCJwb3N0IiwidXJsIiwiZ2V0Iiwic3VibWl0Rm9ybSIsImZvcm0iLCJzdWJtaXRGb3JtQW5kVXBkYXRlVmlldyIsInNlcnZlckNhbGwiLCJtZXRob2RlIiwicmUiLCJtYXRjaCIsImVycm9yIiwibmFtZSIsIm5ld01vZGVsIiwibW9kZWxfbmFtZSIsIm1vZGVsX3F1ZXJ5IiwiZmluZCIsImRvbVNlbGVjdG9yIiwicmVmcmVzaCIsInJlbG9hZCIsInJlbG9hZENvbnRyb2xsZXIiLCJzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvciIsIiRmb3JtIiwiZSIsIl9zdWJtaXRNb2RlbEZvcm0iLCJzdWJtaXRNb2RlbEZvcm0iLCJfZmFsbGJhY2tTdWJtaXRNb2RlbEZvcm0iLCJwX2xpc3QiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImRhdGEiLCJ2YWx1ZXMiLCJzeW5jRm9ybSIsImluc3RhbmNlX3ZhbHVlIiwicmVzb2x2ZSIsInJlamVjdCIsInByb20iLCJwayIsInNhdmUiLCJjcmVhdGUiLCJyZXMiLCJjYXRjaCIsIiQiLCJodG1sIiwiZmxhdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/AbstractSDC.js\n");
28
28
 
29
29
  /***/ }),
30
30
 
@@ -84,7 +84,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
84
84
  \********************************************/
85
85
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
86
86
 
87
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Model: () => (/* binding */ Model),\n/* harmony export */ callServer: () => (/* binding */ callServer),\n/* harmony export */ close: () => (/* binding */ close),\n/* harmony export */ isConnected: () => (/* binding */ isConnected)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nconst MAX_FILE_UPLOAD = 25000;\nlet OPEN_REQUESTS = {};\nfunction callServer(app, controller, funcName, args) {\n let id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n isConnected().then(() => {\n SDC_SOCKET.send(JSON.stringify({\n event: 'sdc_call',\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args\n }));\n });\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\n}\nfunction _connect() {\n IS_CONNECTING = true;\n return new Promise(resolve => {\n if (window.location.protocol === \"https:\") {\n SDC_SOCKET = new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`);\n } else {\n SDC_SOCKET = new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`);\n }\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][1](data.data || null);\n delete OPEN_REQUESTS[data.id];\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushMsg', data.header || '', data.msg || '');\n }\n if (data.type && data.type === 'sdc_recall') {\n if (OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][0](data.data);\n delete OPEN_REQUESTS[data.id];\n }\n } else if (data.type && data.type === 'sdc_event') {\n let event = data.event;\n if (event) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(event, data.payload);\n }\n } else if (data.type && data.type === 'sdc_redirect') {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('onNavLink', data.link);\n }\n }\n };\n SDC_SOCKET.onclose = function () {\n if (IS_CONNECTED) {\n console.error('SDC Socket closed unexpectedly');\n }\n IS_CONNECTED = false;\n for (const [key, value] of Object.entries(OPEN_REQUESTS)) {\n value[1]({});\n delete OPEN_REQUESTS[key];\n }\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n SDC_SOCKET.onerror = function (err) {\n console.error('Socket encountered error: ', err.message, 'Closing socket');\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\n });\n}\nfunction close() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n}\nfunction parse_hidden_inputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === 'true';\n } else if (value === 'undefined') {\n return undefined;\n } else if (value.toLowerCase() === 'none') {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\nfunction isConnected() {\n return new Promise(resolve => {\n if (IS_CONNECTED) {\n return resolve();\n } else if (IS_CONNECTING) {\n setTimeout(() => {\n isConnected().then(() => {\n resolve();\n });\n }, 200);\n } else {\n return resolve(_connect());\n }\n });\n}\nclass Model {\n /**\n *\n * @param model_name {string}\n * @param model_query {json}\n */\n constructor(model_name, model_query = {}) {\n this.values_list = [];\n this.values = {};\n this.model_name = model_name;\n this.model_query = model_query;\n this._is_connected = false;\n this._is_conneting_process = false;\n this._auto_reconnect = true;\n this.socket = null;\n this.open_request = {};\n this.on_update = () => {};\n this.on_create = () => {};\n this.form_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.values_list.length) {\n return {\n value: this.values_list[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n length() {\n return this.values_list.length;\n }\n byPk(pk) {\n if (pk !== null) {\n let elem = this.values_list.find(elm => elm.pk === pk);\n if (!elem) {\n elem = {\n pk: pk\n };\n this.values_list.push(elem);\n }\n return elem;\n }\n return {\n pk: pk\n };\n }\n filter(model_query) {\n this.model_query = Object.assign({}, this.model_query, model_query);\n return this;\n }\n load() {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'load',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n listView(filter = {}, cb_resolve = null, cb_reject = null) {\n let $div_list = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'list_view',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n filter: filter\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_list;\n }\n detailView(pk = -1, cb_resolve = null, cb_reject = null) {\n let $div_list = $('<div class=\"container-fluid\">');\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n load_promise.then(() => {\n if (pk === -1) {\n pk = this.values_list[0].pk;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'detail_view',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_list;\n }\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n syncModelToForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n let self = this;\n $forms.each(function () {\n if (!this.hasAttribute('data-model_pk')) {\n return;\n }\n let pk = $(this).data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'checkbox') {\n form_item.checked = instance[name];\n } else if (form_item.type === 'file' && instance[name] instanceof File) {\n let container = new DataTransfer();\n container.items.add(instance[name]);\n form_item.files = container;\n } else {\n $(form_item).val(instance[name]);\n }\n }\n }\n });\n }\n syncForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n const self = this;\n let instances = [];\n $forms.each(function () {\n let $form = $(this);\n let pk = $form.data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'hidden') {\n instance[name] = parse_hidden_inputs($(form_item).val());\n } else if (form_item.type === 'checkbox') {\n instance[name] = form_item.checked;\n } else if (form_item.type === 'file') {\n instance[name] = form_item.files[0];\n } else {\n instance[name] = $(form_item).val();\n }\n }\n }\n instances.push(instance);\n return instance;\n });\n if (this.values_list.length <= 1 && instances.length > 0) {\n this.values = instances.at(-1);\n }\n return instances;\n }\n createForm(cb_resolve = null, cb_reject = null) {\n let $div_form = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'create_form',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [data => {\n $div_form.append(data.html);\n let $form = $div_form.closest('form').addClass(`sdc-model-create-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', null);\n if (!$form[0].hasAttribute('sdc_submit')) {\n $form.attr('sdc_submit', 'submitModelForm');\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_form);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_form;\n }\n editForm(pk = -1, cb_resolve = null, cb_reject = null) {\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div class=\"container-fluid\">');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'edit_form',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [data => {\n $div_form.append(data.html);\n let $form = $div_form.closest('form').addClass(`sdc-model-edit-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', pk);\n if (!$form[0].hasAttribute('sdc_submit')) {\n $form.attr('sdc_submit', 'submitModelForm');\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_form);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_form;\n }\n new() {\n return new Promise((resolve, reject) => {\n const $form = $('<form>').append(this.createForm(() => {\n this.syncFormToModel($form);\n resolve();\n }, reject));\n });\n }\n save(pk = -1) {\n return this.isConnected().then(() => {\n let elem_list;\n if (pk > -1) {\n elem_list = [this.byPk(pk)];\n } else {\n elem_list = this.values_list;\n }\n let p_list = [];\n elem_list.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n p_list.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'save',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n data: elem,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = JSON.parse(res.data.instance);\n this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n }));\n });\n return Promise.all(p_list);\n });\n }\n create(values = this.values) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(values).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'create',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n data: values,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = JSON.parse(res.data.instance);\n this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n });\n });\n }\n delete(pk = -1) {\n if (pk === -1) pk = this.values?.pk;\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'delete',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._is_connected) {\n resolve();\n } else if (!this._is_conneting_process) {\n this._is_conneting_process = true;\n this.open_request['_connecting_process'] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolve_origin, reject_origin] = this.open_request['_connecting_process'];\n this.open_request['_connecting_process'] = [() => {\n resolve_origin();\n resolve();\n }, () => {\n reject_origin();\n reject();\n }];\n }\n });\n }\n close() {\n if (this.socket) {\n this._auto_reconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this['socket'];\n }\n }\n clean() {\n this.values_list = [];\n this.values = {};\n return this;\n }\n _readFiles(elem) {\n let to_solve = [];\n let files = {};\n for (const [key, value] of Object.entries(elem)) {\n if (value instanceof File) {\n to_solve.push(new Promise((resolve, reject) => {\n ((key, value) => {\n let reader = new FileReader();\n reader.onload = e => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.open_request[id] = [resolve, reject];\n let result = e.target.result;\n let number_of_chunks = parseInt(Math.ceil(result.length / MAX_FILE_UPLOAD));\n files[key] = {\n id: id,\n file_name: value.name,\n field_name: key,\n content_length: value.size\n };\n for (let i = 0; i < number_of_chunks; ++i) {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'upload',\n event_id: id,\n args: {\n chunk: result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)),\n idx: i,\n number_of_chunks: number_of_chunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n }\n };\n reader.onerror = () => {\n reject();\n };\n reader.readAsBinaryString(value);\n })(key, value);\n }));\n }\n }\n return Promise.all(to_solve).then(() => {\n return files;\n });\n }\n _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][1](data);\n delete this.open_request[data.event_id];\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this.open_request['_connecting_process'][1](data);\n delete this.open_request['_connecting_process'];\n this._auto_reconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this._is_connected = true;\n this._is_conneting_process = false;\n this.open_request['_connecting_process'][0](data);\n delete this.open_request['_connecting_process'];\n } else if (data.type === 'load') {\n const json_res = JSON.parse(data.args.data);\n this.values_list = [];\n this._parseServerRes(json_res);\n } else if (data.type === 'on_update' || data.type === 'on_create') {\n const json_res = JSON.parse(data.args.data);\n let obj = this._parseServerRes(json_res);\n let cb;\n if (data.type === 'on_create') {\n cb = this.on_create;\n } else {\n cb = this.on_update;\n }\n cb(obj);\n }\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][0](data);\n delete this.open_request[data.event_id];\n }\n }\n }\n _connectToServer() {\n return new Promise(resolve => {\n const model_identifier = `${this.model_name}` + (this.model_id > 0 ? `/${this.model_id}` : '');\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${model_identifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${model_identifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`);\n this._is_connected = false;\n for (const [_key, value] of Object.entries(this.open_request)) {\n value[1](e);\n }\n this.open_request = {};\n setTimeout(() => {\n if (this._auto_reconnect) {\n this._connectToServer().then(() => {});\n }\n }, 1000);\n };\n this.socket.onerror = err => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._is_connected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'connect',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n }\n _parseServerRes(res) {\n let updated = [];\n for (let json_data of res) {\n const pk = json_data.pk;\n const obj = this.byPk(pk);\n for (const [k, v] of Object.entries(json_data.fields)) {\n //if(v && typeof v === 'object' && v['__is_sdc_model__']) {\n // obj[k] = new Model(v['model'], {'pk': v['pk']})\n //} else {\n obj[k] = v;\n //}\n }\n updated.push(obj);\n }\n if (this.values_list.length === 1) {\n this.values = this.values_list.at(-1);\n } else {\n this.values = {};\n }\n return updated;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFFQyxNQUFNLENBQUM7SUFDN0MsQ0FBQyxDQUFDO0VBQ047RUFFQXNILGVBQWVBLENBQUN0QyxHQUFHLEVBQUU7SUFDakIsSUFBSTBFLE9BQU8sR0FBRyxFQUFFO0lBQ2hCLEtBQUssSUFBSUMsU0FBUyxJQUFJM0UsR0FBRyxFQUFFO01BQ3ZCLE1BQU1sQixFQUFFLEdBQUc2RixTQUFTLENBQUM3RixFQUFFO01BQ3ZCLE1BQU1zRixHQUFHLEdBQUcsSUFBSSxDQUFDdkYsSUFBSSxDQUFDQyxFQUFFLENBQUM7TUFDekIsS0FBSyxNQUFNLENBQUM4RixDQUFDLEVBQUVDLENBQUMsQ0FBQyxJQUFJdkksTUFBTSxDQUFDQyxPQUFPLENBQUNvSSxTQUFTLENBQUNHLE1BQU0sQ0FBQyxFQUFFO1FBQ25EO1FBQ0E7UUFDQTtRQUNBVixHQUFHLENBQUNRLENBQUMsQ0FBQyxHQUFHQyxDQUFDO1FBQ1Y7TUFDSjtNQUVBSCxPQUFPLENBQUN4RixJQUFJLENBQUNrRixHQUFHLENBQUM7SUFDckI7SUFFQSxJQUFJLElBQUksQ0FBQ3RHLFdBQVcsQ0FBQ0wsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUMvQixJQUFJLENBQUNNLE1BQU0sR0FBRyxJQUFJLENBQUNELFdBQVcsQ0FBQzJELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDLE1BQU07TUFDSCxJQUFJLENBQUMxRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCO0lBRUEsT0FBTzJHLE9BQU87RUFFbEI7QUFDSiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzP2FkYmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthcHB9IGZyb20gJy4vc2RjX21haW4uanMnO1xuaW1wb3J0IHt0cmlnZ2VyfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmxldCBJU19DT05ORUNURUQgPSBmYWxzZTtcbmxldCBJU19DT05ORUNUSU5HID0gZmFsc2U7XG5sZXQgU0RDX1NPQ0tFVCA9IG51bGxcbmNvbnN0IE1BWF9GSUxFX1VQTE9BRCA9IDI1MDAwO1xubGV0IE9QRU5fUkVRVUVTVFMgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxTZXJ2ZXIoYXBwLCBjb250cm9sbGVyLCBmdW5jTmFtZSwgYXJncykge1xuXG4gICAgbGV0IGlkID0gdXVpZHY0KCk7XG4gICAgaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgU0RDX1NPQ0tFVC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiAnc2RjX2NhbGwnLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlcixcbiAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgZnVuY3Rpb246IGZ1bmNOYW1lLFxuICAgICAgICAgICAgYXJnczogYXJnc1xuICAgICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBPUEVOX1JFUVVFU1RTW2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfY29ubmVjdCgpIHtcbiAgICBJU19DT05ORUNUSU5HID0gdHJ1ZTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIikge1xuICAgICAgICAgICAgU0RDX1NPQ0tFVCA9IG5ldyBXZWJTb2NrZXQoYHdzczovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgU0RDX1NPQ0tFVC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgICAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdwdXNoRXJyb3JNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoT1BFTl9SRVFVRVNUU1tkYXRhLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzFdKGRhdGEuZGF0YSB8fCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcigncHVzaE1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09ICdzZGNfcmVjYWxsJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoT1BFTl9SRVFVRVNUU1tkYXRhLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9SRVFVRVNUU1tkYXRhLmlkXVswXShkYXRhLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09ICdzZGNfZXZlbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBldmVudCA9IGRhdGEuZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihldmVudCwgZGF0YS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSAnc2RjX3JlZGlyZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdvbk5hdkxpbmsnLCBkYXRhLmxpbmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBTRENfU09DS0VULm9uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZihJU19DT05ORUNURUQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTREMgU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoT1BFTl9SRVFVRVNUUykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVsxXSh7fSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNba2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgX2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIFNEQ19TT0NLRVQub25lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogJywgZXJyLm1lc3NhZ2UsICdDbG9zaW5nIHNvY2tldCcpO1xuICAgICAgICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFNEQ19TT0NLRVQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgU0RDX1NPQ0tFVC5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBJU19DT05ORUNURUQgPSB0cnVlO1xuICAgICAgICAgICAgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgSVNfQ09OTkVDVEVEID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBTRENfU09DS0VULmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICB9XG5cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2hpZGRlbl9pbnB1dHModmFsdWUpIHtcblxuICAgIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICAgIGxldCBpc0ludFJlZyA9IC9eLT9cXGQrJC87XG4gICAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gICAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuXG4gICAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkubWF0Y2goaXNCb29sUmVnKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0ludFJlZykpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzRmxvYXRSZWcpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzU3RyaW5nUmVnKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Nvbm5lY3RlZCgpIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAoSVNfQ09OTkVDVEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKElTX0NPTk5FQ1RJTkcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShfY29ubmVjdCgpKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9kZWwge1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGVsX25hbWUge3N0cmluZ31cbiAgICAgKiBAcGFyYW0gbW9kZWxfcXVlcnkge2pzb259XG4gICAgICovXG4gICAgY29uc3RydWN0b3IobW9kZWxfbmFtZSwgbW9kZWxfcXVlcnkgPSB7fSkge1xuICAgICAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIHRoaXMubW9kZWxfbmFtZSA9IG1vZGVsX25hbWU7XG4gICAgICAgIHRoaXMubW9kZWxfcXVlcnkgPSBtb2RlbF9xdWVyeTtcbiAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdCA9IHt9O1xuICAgICAgICB0aGlzLm9uX3VwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbl9jcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5mb3JtX2lkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGxldCBpZHggPSAtMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICArK2lkeDtcbiAgICAgICAgICAgICAgICBpZiAoaWR4IDwgdGhpcy52YWx1ZXNfbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogdGhpcy52YWx1ZXNfbGlzdFtpZHhdLCBkb25lOiBmYWxzZX07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoO1xuICAgIH1cblxuICAgIGJ5UGsocGspIHtcbiAgICAgICAgaWYgKHBrICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgZWxlbSA9IHRoaXMudmFsdWVzX2xpc3QuZmluZChlbG0gPT4gZWxtLnBrID09PSBwayk7XG4gICAgICAgICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgICAgICAgICBlbGVtID0ge3BrOiBwa307XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNfbGlzdC5wdXNoKGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtwazogcGt9O1xuXG4gICAgfVxuXG4gICAgZmlsdGVyKG1vZGVsX3F1ZXJ5KSB7XG4gICAgICAgIHRoaXMubW9kZWxfcXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsX3F1ZXJ5LCBtb2RlbF9xdWVyeSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdFZpZXcoZmlsdGVyID0ge30sIGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgICAgIGxldCAkZGl2X2xpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnbGlzdF92aWV3JyxcbiAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgJGRpdl9saXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgICAgICAgIGFwcC5yZWZyZXNoKCRkaXZfbGlzdCk7XG4gICAgICAgICAgICAgICAgY2JfcmVzb2x2ZSAmJiBjYl9yZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgfSwgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNiX3JlamVjdCAmJiBjYl9yZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1dO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAkZGl2X2xpc3Q7XG4gICAgfVxuXG4gICAgZGV0YWlsVmlldyhwayA9IC0xLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgICAgICBsZXQgJGRpdl9saXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5sb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkX3Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAocGsgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcGsgPSB0aGlzLnZhbHVlc19saXN0WzBdLnBrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2RldGFpbF92aWV3JyxcbiAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBwazogcGtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICRkaXZfbGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2X2xpc3QpO1xuICAgICAgICAgICAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgIH0sIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XTtcblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9saXN0O1xuICAgIH1cblxuICAgIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY0Zvcm0oJGZvcm1zKTtcbiAgICB9XG5cbiAgICBzeW5jTW9kZWxUb0Zvcm0oJGZvcm1zKSB7XG4gICAgICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLW1vZGVsX3BrJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGsgPSAkKHRoaXMpLmRhdGEoJ21vZGVsX3BrJyk7XG4gICAgICAgICAgICBsZXQgaW5zdGFuY2UgPSBzZWxmLmJ5UGsocGspO1xuICAgICAgICAgICAgZm9yIChsZXQgZm9ybV9pdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGZvcm1faXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9pdGVtLmNoZWNrZWQgPSBpbnN0YW5jZVtuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2ZpbGUnICYmIGluc3RhbmNlW25hbWVdIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IG5ldyBEYXRhVHJhbnNmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pdGVtcy5hZGQoaW5zdGFuY2VbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9pdGVtLmZpbGVzID0gY29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChmb3JtX2l0ZW0pLnZhbChpbnN0YW5jZVtuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgc3luY0Zvcm0oJGZvcm1zKSB7XG4gICAgICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBpbnN0YW5jZXMgPSBbXTtcblxuICAgICAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgJGZvcm0gPSAkKHRoaXMpO1xuICAgICAgICAgICAgbGV0IHBrID0gJGZvcm0uZGF0YSgnbW9kZWxfcGsnKTtcbiAgICAgICAgICAgIGxldCBpbnN0YW5jZSA9IHNlbGYuYnlQayhwayk7XG4gICAgICAgICAgICBmb3IgKGxldCBmb3JtX2l0ZW0gb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gZm9ybV9pdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1faXRlbS50eXBlID09PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBwYXJzZV9oaWRkZW5faW5wdXRzKCQoZm9ybV9pdGVtKS52YWwoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gZm9ybV9pdGVtLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBmb3JtX2l0ZW0uZmlsZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9ICQoZm9ybV9pdGVtKS52YWwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggPD0gMSAmJiBpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBpbnN0YW5jZXMuYXQoLTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlcztcblxuICAgIH1cblxuICAgIGNyZWF0ZUZvcm0oY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICAgICAgbGV0ICRkaXZfZm9ybSA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdjcmVhdGVfZm9ybScsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgJGRpdl9mb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgICAgICAgIGxldCAkZm9ybSA9ICRkaXZfZm9ybS5jbG9zZXN0KCdmb3JtJykuYWRkQ2xhc3MoYHNkYy1tb2RlbC1jcmVhdGUtZm9ybSBzZGMtbW9kZWwtZm9ybSAke3RoaXMuZm9ybV9pZH1gKS5kYXRhKCdtb2RlbCcsIHRoaXMpLmRhdGEoJ21vZGVsX3BrJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKCEkZm9ybVswXS5oYXNBdHRyaWJ1dGUoJ3NkY19zdWJtaXQnKSkge1xuICAgICAgICAgICAgICAgICAgICAkZm9ybS5hdHRyKCdzZGNfc3VibWl0JywgJ3N1Ym1pdE1vZGVsRm9ybScpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9mb3JtKTtcbiAgICAgICAgICAgICAgICBjYl9yZXNvbHZlICYmIGNiX3Jlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2JfcmVqZWN0ICYmIGNiX3JlamVjdChyZXMpO1xuICAgICAgICAgICAgfV07XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICRkaXZfZm9ybTtcbiAgICB9XG5cbiAgICBlZGl0Rm9ybShwayA9IC0xLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgICAgICBsZXQgbG9hZF9wcm9taXNlO1xuICAgICAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMuaXNDb25uZWN0ZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvYWRfcHJvbWlzZSA9IHRoaXMubG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0ICRkaXZfZm9ybSA9ICQoJzxkaXYgIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG5cbiAgICAgICAgbG9hZF9wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBrIDw9IC0xKSB7XG4gICAgICAgICAgICAgICAgcGsgPSB0aGlzLnZhbHVlc19saXN0LmF0KHBrKS5waztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdlZGl0X2Zvcm0nLFxuICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHBrOiBwa1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgJGRpdl9mb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgICAgICAgIGxldCAkZm9ybSA9ICRkaXZfZm9ybS5jbG9zZXN0KCdmb3JtJykuYWRkQ2xhc3MoYHNkYy1tb2RlbC1lZGl0LWZvcm0gc2RjLW1vZGVsLWZvcm0gJHt0aGlzLmZvcm1faWR9YCkuZGF0YSgnbW9kZWwnLCB0aGlzKS5kYXRhKCdtb2RlbF9waycsIHBrKTtcbiAgICAgICAgICAgICAgICBpZiAoISRmb3JtWzBdLmhhc0F0dHJpYnV0ZSgnc2RjX3N1Ym1pdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICRmb3JtLmF0dHIoJ3NkY19zdWJtaXQnLCAnc3VibWl0TW9kZWxGb3JtJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2X2Zvcm0pO1xuICAgICAgICAgICAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgIH0sIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICRkaXZfZm9ybTtcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkZm9ybSA9ICQoJzxmb3JtPicpLmFwcGVuZCh0aGlzLmNyZWF0ZUZvcm0oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0Zvcm1Ub01vZGVsKCRmb3JtKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCByZWplY3QpKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzYXZlKHBrID0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBlbGVtX2xpc3Q7XG4gICAgICAgICAgICBpZiAocGsgPiAtMSkge1xuICAgICAgICAgICAgICAgIGVsZW1fbGlzdCA9IFt0aGlzLmJ5UGsocGspXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbV9saXN0ID0gdGhpcy52YWx1ZXNfbGlzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwX2xpc3QgPSBbXVxuICAgICAgICAgICAgZWxlbV9saXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgICAgIHBfbGlzdC5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZEZpbGVzKGVsZW0pLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnc2F2ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZWxlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwX2xpc3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGUodmFsdWVzID0gdGhpcy52YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZEZpbGVzKHZhbHVlcykudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlcy5kYXRhLmluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9LCByZWplY3RdO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVsZXRlKHBrID0gLTEpIHtcbiAgICAgICAgaWYgKHBrID09PSAtMSkgcGsgPSB0aGlzLnZhbHVlcz8ucGtcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBrOiBwa1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNfY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc19jb25uZXRpbmdfcHJvY2VzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXSA9IFsoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5fY2hlY2tDb25uZWN0aW9uKCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcmVzb2x2ZV9vcmlnaW4sIHJlamVjdF9vcmlnaW5dID0gdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXTtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddID0gW1xuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlX29yaWdpbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Rfb3JpZ2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b19yZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzWydzb2NrZXQnXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFuKCkge1xuICAgICAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9yZWFkRmlsZXMoZWxlbSkge1xuICAgICAgICBsZXQgdG9fc29sdmUgPSBbXTtcbiAgICAgICAgbGV0IGZpbGVzID0ge31cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZWxlbSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgICAgICB0b19zb2x2ZS5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgKChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtYmVyX29mX2NodW5rcyA9IHBhcnNlSW50KE1hdGguY2VpbChyZXN1bHQubGVuZ3RoIC8gTUFYX0ZJTEVfVVBMT0FEKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcl9vZl9jaHVua3M7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bms6IHJlc3VsdC5zbGljZShNQVhfRklMRV9VUExPQUQgKiBpLCBNQVhfRklMRV9VUExPQUQgKiAoaSArIDEpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHg6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX2NodW5rczogbnVtYmVyX29mX2NodW5rcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRvX3NvbHZlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25NZXNzYWdlKGUpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVuX3JlcXVlc3QuaGFzT3duUHJvcGVydHkoZGF0YS5ldmVudF9pZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtkYXRhLmV2ZW50X2lkXVsxXShkYXRhKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcGVuX3JlcXVlc3RbZGF0YS5ldmVudF9pZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyKCdwdXNoRXJyb3JNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddWzFdKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddO1xuICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcigncHVzaE1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb25uZWN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddWzBdKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wZW5fcmVxdWVzdFsnX2Nvbm5lY3RpbmdfcHJvY2VzcyddO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdsb2FkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25fcmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25fcmVzKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdvbl91cGRhdGUnIHx8IGRhdGEudHlwZSA9PT0gJ29uX2NyZWF0ZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqc29uX3JlcyA9IEpTT04ucGFyc2UoZGF0YS5hcmdzLmRhdGEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IG9iaiA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGpzb25fcmVzKTtcbiAgICAgICAgICAgICAgICBsZXQgY2I7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnb25fY3JlYXRlJykge1xuICAgICAgICAgICAgICAgICAgICBjYiA9IHRoaXMub25fY3JlYXRlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNiID0gdGhpcy5vbl91cGRhdGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2Iob2JqKTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMub3Blbl9yZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbZGF0YS5ldmVudF9pZF1bMF0oZGF0YSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2Nvbm5lY3RUb1NlcnZlcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZGVsX2lkZW50aWZpZXIgPSBgJHt0aGlzLm1vZGVsX25hbWV9YCArICh0aGlzLm1vZGVsX2lkID4gMCA/IGAvJHt0aGlzLm1vZGVsX2lkfWAgOiAnJyk7XG4gICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSBcImh0dHBzOlwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3MvbW9kZWwvJHttb2RlbF9pZGVudGlmaWVyfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxfaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU0RDIE1vZGVsICgke3RoaXMubW9kZWxfbmFtZX0sICR7dGhpcy5tb2RlbF9pZH0pIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3Blbl9yZXF1ZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVsxXShlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3QgPSB7fTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXV0b19yZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RUb1NlcnZlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTW9kZWwgU29ja2V0IGVuY291bnRlcmVkIGVycm9yOiAke2Vycn0gQ2xvc2luZyBzb2NrZXRgKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNfY29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBfY2hlY2tDb25uZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2Nvbm5lY3QnLFxuICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcGFyc2VTZXJ2ZXJSZXMocmVzKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0gW11cbiAgICAgICAgZm9yIChsZXQganNvbl9kYXRhIG9mIHJlcykge1xuICAgICAgICAgICAgY29uc3QgcGsgPSBqc29uX2RhdGEucGtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHRoaXMuYnlQayhwayk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhqc29uX2RhdGEuZmllbGRzKSkge1xuICAgICAgICAgICAgICAgIC8vaWYodiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdlsnX19pc19zZGNfbW9kZWxfXyddKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgb2JqW2tdID0gbmV3IE1vZGVsKHZbJ21vZGVsJ10sIHsncGsnOiB2WydwayddfSlcbiAgICAgICAgICAgICAgICAvL30gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqW2tdID0gdjtcbiAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXBkYXRlZC5wdXNoKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdGhpcy52YWx1ZXNfbGlzdC5hdCgtMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG5cbiAgICB9XG59Il0sIm5hbWVzIjpbImFwcCIsInRyaWdnZXIiLCJ1dWlkdjQiLCJJU19DT05ORUNURUQiLCJJU19DT05ORUNUSU5HIiwiU0RDX1NPQ0tFVCIsIk1BWF9GSUxFX1VQTE9BRCIsIk9QRU5fUkVRVUVTVFMiLCJjYWxsU2VydmVyIiwiY29udHJvbGxlciIsImZ1bmNOYW1lIiwiYXJncyIsImlkIiwiaXNDb25uZWN0ZWQiLCJ0aGVuIiwic2VuZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJldmVudCIsImZ1bmN0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJfY29ubmVjdCIsIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJXZWJTb2NrZXQiLCJob3N0Iiwib25tZXNzYWdlIiwiZSIsImRhdGEiLCJwYXJzZSIsImlzX2Vycm9yIiwibXNnIiwiaGVhZGVyIiwidHlwZSIsInBheWxvYWQiLCJsaW5rIiwib25jbG9zZSIsImNvbnNvbGUiLCJlcnJvciIsImtleSIsInZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsInNldFRpbWVvdXQiLCJvbmVycm9yIiwiZXJyIiwibWVzc2FnZSIsImNsb3NlIiwib25vcGVuIiwicGFyc2VfaGlkZGVuX2lucHV0cyIsImlzRmxvYXRSZWciLCJpc0ludFJlZyIsImlzQm9vbFJlZyIsImlzU3RyaW5nUmVnIiwidG9Mb3dlckNhc2UiLCJtYXRjaCIsInVuZGVmaW5lZCIsInBhcnNlSW50IiwicGFyc2VGbG9hdCIsInN1YnN0cmluZyIsImxlbmd0aCIsIk1vZGVsIiwiY29uc3RydWN0b3IiLCJtb2RlbF9uYW1lIiwibW9kZWxfcXVlcnkiLCJ2YWx1ZXNfbGlzdCIsInZhbHVlcyIsIl9pc19jb25uZWN0ZWQiLCJfaXNfY29ubmV0aW5nX3Byb2Nlc3MiLCJfYXV0b19yZWNvbm5lY3QiLCJzb2NrZXQiLCJvcGVuX3JlcXVlc3QiLCJvbl91cGRhdGUiLCJvbl9jcmVhdGUiLCJmb3JtX2lkIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJpZHgiLCJuZXh0IiwiZG9uZSIsImJ5UGsiLCJwayIsImVsZW0iLCJmaW5kIiwiZWxtIiwicHVzaCIsImZpbHRlciIsImFzc2lnbiIsImxvYWQiLCJldmVudF90eXBlIiwiZXZlbnRfaWQiLCJsaXN0VmlldyIsImNiX3Jlc29sdmUiLCJjYl9yZWplY3QiLCIkZGl2X2xpc3QiLCIkIiwiYXBwZW5kIiwiaHRtbCIsInJlZnJlc2giLCJyZXMiLCJkZXRhaWxWaWV3IiwibG9hZF9wcm9taXNlIiwic3luY0Zvcm1Ub01vZGVsIiwiJGZvcm1zIiwic3luY0Zvcm0iLCJzeW5jTW9kZWxUb0Zvcm0iLCJoYXNDbGFzcyIsInNlbGYiLCJlYWNoIiwiaGFzQXR0cmlidXRlIiwiaW5zdGFuY2UiLCJmb3JtX2l0ZW0iLCJlbGVtZW50cyIsIm5hbWUiLCJjaGVja2VkIiwiRmlsZSIsImNvbnRhaW5lciIsIkRhdGFUcmFuc2ZlciIsIml0ZW1zIiwiYWRkIiwiZmlsZXMiLCJ2YWwiLCJpbnN0YW5jZXMiLCIkZm9ybSIsImF0IiwiY3JlYXRlRm9ybSIsIiRkaXZfZm9ybSIsImNsb3Nlc3QiLCJhZGRDbGFzcyIsImF0dHIiLCJlZGl0Rm9ybSIsIm5ldyIsInNhdmUiLCJlbGVtX2xpc3QiLCJwX2xpc3QiLCJmb3JFYWNoIiwiX3JlYWRGaWxlcyIsIl9wYXJzZVNlcnZlclJlcyIsImFsbCIsImNyZWF0ZSIsImRlbGV0ZSIsIl9jb25uZWN0VG9TZXJ2ZXIiLCJfY2hlY2tDb25uZWN0aW9uIiwicmVzb2x2ZV9vcmlnaW4iLCJyZWplY3Rfb3JpZ2luIiwiY2xlYW4iLCJ0b19zb2x2ZSIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCJyZXN1bHQiLCJ0YXJnZXQiLCJudW1iZXJfb2ZfY2h1bmtzIiwiTWF0aCIsImNlaWwiLCJmaWxlX25hbWUiLCJmaWVsZF9uYW1lIiwiY29udGVudF9sZW5ndGgiLCJzaXplIiwiaSIsImNodW5rIiwic2xpY2UiLCJjb250ZW50X3R5cGUiLCJyZWFkQXNCaW5hcnlTdHJpbmciLCJfb25NZXNzYWdlIiwiaGFzT3duUHJvcGVydHkiLCJqc29uX3JlcyIsIm9iaiIsImNiIiwibW9kZWxfaWRlbnRpZmllciIsIm1vZGVsX2lkIiwiYmluZCIsIl9rZXkiLCJ1cGRhdGVkIiwianNvbl9kYXRhIiwiayIsInYiLCJmaWVsZHMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n");
87
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Model: () => (/* binding */ Model),\n/* harmony export */ callServer: () => (/* binding */ callServer),\n/* harmony export */ close: () => (/* binding */ close),\n/* harmony export */ isConnected: () => (/* binding */ isConnected)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nconst MAX_FILE_UPLOAD = 25000;\nlet OPEN_REQUESTS = {};\nfunction callServer(app, controller, funcName, args) {\n let id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n isConnected().then(() => {\n SDC_SOCKET.send(JSON.stringify({\n event: 'sdc_call',\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args\n }));\n });\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\n}\nfunction _connect() {\n IS_CONNECTING = true;\n return new Promise(resolve => {\n if (window.location.protocol === \"https:\") {\n SDC_SOCKET = new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`);\n } else {\n SDC_SOCKET = new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`);\n }\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][1](data.data || null);\n delete OPEN_REQUESTS[data.id];\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushMsg', data.header || '', data.msg || '');\n }\n if (data.type && data.type === 'sdc_recall') {\n if (OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][0](data.data);\n delete OPEN_REQUESTS[data.id];\n }\n } else if (data.type && data.type === 'sdc_event') {\n let event = data.event;\n if (event) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(event, data.payload);\n }\n } else if (data.type && data.type === 'sdc_redirect') {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('onNavLink', data.link);\n }\n }\n };\n SDC_SOCKET.onclose = function () {\n if (IS_CONNECTED) {\n console.error('SDC Socket closed unexpectedly');\n }\n IS_CONNECTED = false;\n for (const [key, value] of Object.entries(OPEN_REQUESTS)) {\n value[1]({});\n delete OPEN_REQUESTS[key];\n }\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n SDC_SOCKET.onerror = function (err) {\n console.error('Socket encountered error: ', err.message, 'Closing socket');\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\n });\n}\nfunction close() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n}\nfunction parse_hidden_inputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === 'true';\n } else if (value === 'undefined') {\n return undefined;\n } else if (value.toLowerCase() === 'none') {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\nfunction isConnected() {\n return new Promise(resolve => {\n if (IS_CONNECTED) {\n return resolve();\n } else if (IS_CONNECTING) {\n setTimeout(() => {\n isConnected().then(() => {\n resolve();\n });\n }, 200);\n } else {\n return resolve(_connect());\n }\n });\n}\nclass Model {\n /**\n *\n * @param model_name {string}\n * @param model_query {json}\n */\n constructor(model_name, model_query = {}) {\n this.values_list = [];\n this.values = {};\n this.model_name = model_name;\n this.model_query = model_query;\n this._is_connected = false;\n this._is_conneting_process = false;\n this._auto_reconnect = true;\n this.socket = null;\n this.open_request = {};\n this.on_update = () => {};\n this.on_create = () => {};\n this.form_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n }\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.values_list.length) {\n return {\n value: this.values_list[idx],\n done: false\n };\n }\n return {\n value: null,\n done: true\n };\n }\n };\n }\n length() {\n return this.values_list.length;\n }\n byPk(pk) {\n if (pk !== null) {\n let elem = this.values_list.find(elm => elm.pk === pk);\n if (!elem) {\n elem = {\n pk: pk\n };\n this.values_list.push(elem);\n }\n return elem;\n }\n return {\n pk: pk\n };\n }\n filter(model_query) {\n this.model_query = Object.assign({}, this.model_query, model_query);\n return this;\n }\n load() {\n return this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'load',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n listView(filter = {}, cb_resolve = null, cb_reject = null) {\n let $div_list = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'list_view',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n filter: filter\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_list;\n }\n detailView(pk = -1, cb_resolve = null, cb_reject = null) {\n let $div_list = $('<div class=\"container-fluid\">');\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n load_promise.then(() => {\n if (pk === -1) {\n pk = this.values_list[0].pk;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'detail_view',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [data => {\n $div_list.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_list);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_list;\n }\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n syncModelToForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n let self = this;\n $forms.each(function () {\n if (!this.hasAttribute('data-model_pk')) {\n return;\n }\n let pk = $(this).data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'checkbox') {\n form_item.checked = instance[name];\n } else if (form_item.type === 'file' && instance[name] instanceof File) {\n let container = new DataTransfer();\n container.items.add(instance[name]);\n form_item.files = container;\n } else {\n $(form_item).val(instance[name]);\n }\n }\n }\n });\n }\n syncForm($forms) {\n if (!$forms || !$forms.hasClass(this.form_id)) {\n $forms = $(`.${this.form_id}`);\n }\n const self = this;\n let instances = [];\n $forms.each(function () {\n let $form = $(this);\n let pk = $form.data('model_pk');\n let instance = self.byPk(pk);\n for (let form_item of this.elements) {\n let name = form_item.name;\n if (name && name !== '') {\n if (form_item.type === 'hidden') {\n instance[name] = parse_hidden_inputs($(form_item).val());\n } else if (form_item.type === 'checkbox') {\n instance[name] = form_item.checked;\n } else if (form_item.type === 'file') {\n instance[name] = form_item.files[0];\n } else {\n instance[name] = $(form_item).val();\n }\n }\n }\n instances.push(instance);\n return instance;\n });\n if (this.values_list.length <= 1 && instances.length > 0) {\n this.values = instances.at(-1);\n }\n return instances;\n }\n createForm(cb_resolve = null, cb_reject = null) {\n let $div_form = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'create_form',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [data => {\n $div_form.append(data.html);\n let $form = $div_form.closest('form').addClass(`sdc-model-create-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', null);\n if (!$form[0].hasAttribute('sdc_submit')) {\n $form.attr('sdc_submit', 'submitModelFormDistributor');\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_form);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_form;\n }\n editForm(pk = -1, cb_resolve = null, cb_reject = null) {\n let load_promise;\n if (this.values_list.length !== 0) {\n load_promise = this.isConnected();\n } else {\n load_promise = this.load();\n }\n let $div_form = $('<div class=\"container-fluid\">');\n load_promise.then(() => {\n if (pk <= -1) {\n pk = this.values_list.at(pk).pk;\n }\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'edit_form',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [data => {\n $div_form.append(data.html);\n let $form = $div_form.closest('form').addClass(`sdc-model-edit-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', pk);\n if (!$form[0].hasAttribute('sdc_submit')) {\n $form.attr('sdc_submit', 'submitModelFormDistributor');\n }\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.refresh($div_form);\n cb_resolve && cb_resolve(data);\n }, res => {\n cb_reject && cb_reject(res);\n }];\n });\n return $div_form;\n }\n new() {\n return new Promise((resolve, reject) => {\n const $form = $('<form>').append(this.createForm(() => {\n this.syncFormToModel($form);\n resolve();\n }, reject));\n });\n }\n save(pk = -1) {\n return this.isConnected().then(() => {\n let elem_list;\n if (pk > -1) {\n elem_list = [this.byPk(pk)];\n } else {\n elem_list = this.values_list;\n }\n let p_list = [];\n elem_list.forEach(elem => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n p_list.push(new Promise((resolve, reject) => {\n this._readFiles(elem).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'save',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n data: elem,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = JSON.parse(res.data.instance);\n this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n }));\n });\n return Promise.all(p_list);\n });\n }\n create(values = this.values) {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(values).then(files => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'create',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n data: values,\n files: files\n }\n }));\n this.open_request[id] = [res => {\n let data = JSON.parse(res.data.instance);\n this._parseServerRes(data);\n resolve(res);\n }, reject];\n });\n });\n });\n }\n delete(pk = -1) {\n if (pk === -1) pk = this.values?.pk;\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'delete',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query,\n pk: pk\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n });\n }\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._is_connected) {\n resolve();\n } else if (!this._is_conneting_process) {\n this._is_conneting_process = true;\n this.open_request['_connecting_process'] = [() => {}, () => {}];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolve_origin, reject_origin] = this.open_request['_connecting_process'];\n this.open_request['_connecting_process'] = [() => {\n resolve_origin();\n resolve();\n }, () => {\n reject_origin();\n reject();\n }];\n }\n });\n }\n close() {\n if (this.socket) {\n this._auto_reconnect = false;\n this.socket.onclose = () => {};\n this.socket.close();\n delete this['socket'];\n }\n }\n clean() {\n this.values_list = [];\n this.values = {};\n return this;\n }\n _readFiles(elem) {\n let to_solve = [];\n let files = {};\n for (const [key, value] of Object.entries(elem)) {\n if (value instanceof File) {\n to_solve.push(new Promise((resolve, reject) => {\n ((key, value) => {\n let reader = new FileReader();\n reader.onload = e => {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n this.open_request[id] = [resolve, reject];\n let result = e.target.result;\n let number_of_chunks = parseInt(Math.ceil(result.length / MAX_FILE_UPLOAD));\n files[key] = {\n id: id,\n file_name: value.name,\n field_name: key,\n content_length: value.size\n };\n for (let i = 0; i < number_of_chunks; ++i) {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'upload',\n event_id: id,\n args: {\n chunk: result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)),\n idx: i,\n number_of_chunks: number_of_chunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n }\n };\n reader.onerror = () => {\n reject();\n };\n reader.readAsBinaryString(value);\n })(key, value);\n }));\n }\n }\n return Promise.all(to_solve).then(() => {\n return files;\n });\n }\n _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][1](data);\n delete this.open_request[data.event_id];\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushErrorMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this.open_request['_connecting_process'][1](data);\n delete this.open_request['_connecting_process'];\n this._auto_reconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)('pushMsg', data.header || '', data.msg || '');\n }\n if (data.type === 'connect') {\n this._is_connected = true;\n this._is_conneting_process = false;\n this.open_request['_connecting_process'][0](data);\n delete this.open_request['_connecting_process'];\n } else if (data.type === 'load') {\n const json_res = JSON.parse(data.args.data);\n this.values_list = [];\n this._parseServerRes(json_res);\n } else if (data.type === 'on_update' || data.type === 'on_create') {\n const json_res = JSON.parse(data.args.data);\n let obj = this._parseServerRes(json_res);\n let cb;\n if (data.type === 'on_create') {\n cb = this.on_create;\n } else {\n cb = this.on_update;\n }\n cb(obj);\n }\n if (this.open_request.hasOwnProperty(data.event_id)) {\n this.open_request[data.event_id][0](data);\n delete this.open_request[data.event_id];\n }\n }\n }\n _connectToServer() {\n return new Promise(resolve => {\n const model_identifier = `${this.model_name}` + (this.model_id > 0 ? `/${this.model_id}` : '');\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${model_identifier}`);\n } else {\n this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${model_identifier}`);\n }\n this.socket.onmessage = this._onMessage.bind(this);\n this.socket.onclose = e => {\n console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`);\n this._is_connected = false;\n for (const [_key, value] of Object.entries(this.open_request)) {\n value[1](e);\n }\n this.open_request = {};\n setTimeout(() => {\n if (this._auto_reconnect) {\n this._connectToServer().then(() => {});\n }\n }, 1000);\n };\n this.socket.onerror = err => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._is_connected) {\n try {\n this.socket.close();\n } catch (e) {}\n }\n };\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n _checkConnection() {\n const id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_2__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(JSON.stringify({\n event: 'model',\n event_type: 'connect',\n event_id: id,\n args: {\n model_name: this.model_name,\n model_query: this.model_query\n }\n }));\n this.open_request[id] = [resolve, reject];\n });\n }\n _parseServerRes(res) {\n let updated = [];\n for (let json_data of res) {\n const pk = json_data.pk;\n const obj = this.byPk(pk);\n for (const [k, v] of Object.entries(json_data.fields)) {\n //if(v && typeof v === 'object' && v['__is_sdc_model__']) {\n // obj[k] = new Model(v['model'], {'pk': v['pk']})\n //} else {\n obj[k] = v;\n //}\n }\n updated.push(obj);\n }\n if (this.values_list.length === 1) {\n this.values = this.values_list.at(-1);\n } else {\n this.values = {};\n }\n return updated;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFFQyxNQUFNLENBQUM7SUFDN0MsQ0FBQyxDQUFDO0VBQ047RUFFQXNILGVBQWVBLENBQUN0QyxHQUFHLEVBQUU7SUFDakIsSUFBSTBFLE9BQU8sR0FBRyxFQUFFO0lBQ2hCLEtBQUssSUFBSUMsU0FBUyxJQUFJM0UsR0FBRyxFQUFFO01BQ3ZCLE1BQU1sQixFQUFFLEdBQUc2RixTQUFTLENBQUM3RixFQUFFO01BQ3ZCLE1BQU1zRixHQUFHLEdBQUcsSUFBSSxDQUFDdkYsSUFBSSxDQUFDQyxFQUFFLENBQUM7TUFDekIsS0FBSyxNQUFNLENBQUM4RixDQUFDLEVBQUVDLENBQUMsQ0FBQyxJQUFJdkksTUFBTSxDQUFDQyxPQUFPLENBQUNvSSxTQUFTLENBQUNHLE1BQU0sQ0FBQyxFQUFFO1FBQ25EO1FBQ0E7UUFDQTtRQUNBVixHQUFHLENBQUNRLENBQUMsQ0FBQyxHQUFHQyxDQUFDO1FBQ1Y7TUFDSjtNQUVBSCxPQUFPLENBQUN4RixJQUFJLENBQUNrRixHQUFHLENBQUM7SUFDckI7SUFFQSxJQUFJLElBQUksQ0FBQ3RHLFdBQVcsQ0FBQ0wsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUMvQixJQUFJLENBQUNNLE1BQU0sR0FBRyxJQUFJLENBQUNELFdBQVcsQ0FBQzJELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDLE1BQU07TUFDSCxJQUFJLENBQUMxRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCO0lBRUEsT0FBTzJHLE9BQU87RUFFbEI7QUFDSiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc29ja2V0LmpzP2FkYmMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthcHB9IGZyb20gJy4vc2RjX21haW4uanMnO1xuaW1wb3J0IHt0cmlnZ2VyfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmxldCBJU19DT05ORUNURUQgPSBmYWxzZTtcbmxldCBJU19DT05ORUNUSU5HID0gZmFsc2U7XG5sZXQgU0RDX1NPQ0tFVCA9IG51bGxcbmNvbnN0IE1BWF9GSUxFX1VQTE9BRCA9IDI1MDAwO1xubGV0IE9QRU5fUkVRVUVTVFMgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxTZXJ2ZXIoYXBwLCBjb250cm9sbGVyLCBmdW5jTmFtZSwgYXJncykge1xuXG4gICAgbGV0IGlkID0gdXVpZHY0KCk7XG4gICAgaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgU0RDX1NPQ0tFVC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiAnc2RjX2NhbGwnLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlcixcbiAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgZnVuY3Rpb246IGZ1bmNOYW1lLFxuICAgICAgICAgICAgYXJnczogYXJnc1xuICAgICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBPUEVOX1JFUVVFU1RTW2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfY29ubmVjdCgpIHtcbiAgICBJU19DT05ORUNUSU5HID0gdHJ1ZTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIikge1xuICAgICAgICAgICAgU0RDX1NPQ0tFVCA9IG5ldyBXZWJTb2NrZXQoYHdzczovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgU0RDX1NPQ0tFVC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGUuZGF0YSk7XG4gICAgICAgICAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdwdXNoRXJyb3JNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoT1BFTl9SRVFVRVNUU1tkYXRhLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzFdKGRhdGEuZGF0YSB8fCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcigncHVzaE1zZycsIGRhdGEuaGVhZGVyIHx8ICcnLCBkYXRhLm1zZyB8fCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09ICdzZGNfcmVjYWxsJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoT1BFTl9SRVFVRVNUU1tkYXRhLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9SRVFVRVNUU1tkYXRhLmlkXVswXShkYXRhLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09ICdzZGNfZXZlbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBldmVudCA9IGRhdGEuZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihldmVudCwgZGF0YS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSAnc2RjX3JlZGlyZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdvbk5hdkxpbmsnLCBkYXRhLmxpbmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBTRENfU09DS0VULm9uY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZihJU19DT05ORUNURUQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTREMgU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoT1BFTl9SRVFVRVNUUykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVsxXSh7fSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNba2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgX2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIFNEQ19TT0NLRVQub25lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogJywgZXJyLm1lc3NhZ2UsICdDbG9zaW5nIHNvY2tldCcpO1xuICAgICAgICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFNEQ19TT0NLRVQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgU0RDX1NPQ0tFVC5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBJU19DT05ORUNURUQgPSB0cnVlO1xuICAgICAgICAgICAgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgSVNfQ09OTkVDVEVEID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBTRENfU09DS0VULmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcblxuICAgICAgICB9XG5cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2hpZGRlbl9pbnB1dHModmFsdWUpIHtcblxuICAgIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICAgIGxldCBpc0ludFJlZyA9IC9eLT9cXGQrJC87XG4gICAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gICAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuXG4gICAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkubWF0Y2goaXNCb29sUmVnKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0ludFJlZykpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzRmxvYXRSZWcpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzU3RyaW5nUmVnKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Nvbm5lY3RlZCgpIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAoSVNfQ09OTkVDVEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKElTX0NPTk5FQ1RJTkcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShfY29ubmVjdCgpKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9kZWwge1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGVsX25hbWUge3N0cmluZ31cbiAgICAgKiBAcGFyYW0gbW9kZWxfcXVlcnkge2pzb259XG4gICAgICovXG4gICAgY29uc3RydWN0b3IobW9kZWxfbmFtZSwgbW9kZWxfcXVlcnkgPSB7fSkge1xuICAgICAgICB0aGlzLnZhbHVlc19saXN0ID0gW107XG4gICAgICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgICAgIHRoaXMubW9kZWxfbmFtZSA9IG1vZGVsX25hbWU7XG4gICAgICAgIHRoaXMubW9kZWxfcXVlcnkgPSBtb2RlbF9xdWVyeTtcbiAgICAgICAgdGhpcy5faXNfY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdCA9IHt9O1xuICAgICAgICB0aGlzLm9uX3VwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbl9jcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5mb3JtX2lkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIGxldCBpZHggPSAtMTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICArK2lkeDtcbiAgICAgICAgICAgICAgICBpZiAoaWR4IDwgdGhpcy52YWx1ZXNfbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt2YWx1ZTogdGhpcy52YWx1ZXNfbGlzdFtpZHhdLCBkb25lOiBmYWxzZX07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoO1xuICAgIH1cblxuICAgIGJ5UGsocGspIHtcbiAgICAgICAgaWYgKHBrICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgZWxlbSA9IHRoaXMudmFsdWVzX2xpc3QuZmluZChlbG0gPT4gZWxtLnBrID09PSBwayk7XG4gICAgICAgICAgICBpZiAoIWVsZW0pIHtcbiAgICAgICAgICAgICAgICBlbGVtID0ge3BrOiBwa307XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNfbGlzdC5wdXNoKGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtwazogcGt9O1xuXG4gICAgfVxuXG4gICAgZmlsdGVyKG1vZGVsX3F1ZXJ5KSB7XG4gICAgICAgIHRoaXMubW9kZWxfcXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsX3F1ZXJ5LCBtb2RlbF9xdWVyeSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdFZpZXcoZmlsdGVyID0ge30sIGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgICAgIGxldCAkZGl2X2xpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnbGlzdF92aWV3JyxcbiAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgJGRpdl9saXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgICAgICAgIGFwcC5yZWZyZXNoKCRkaXZfbGlzdCk7XG4gICAgICAgICAgICAgICAgY2JfcmVzb2x2ZSAmJiBjYl9yZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgfSwgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNiX3JlamVjdCAmJiBjYl9yZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1dO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAkZGl2X2xpc3Q7XG4gICAgfVxuXG4gICAgZGV0YWlsVmlldyhwayA9IC0xLCBjYl9yZXNvbHZlID0gbnVsbCwgY2JfcmVqZWN0ID0gbnVsbCkge1xuICAgICAgICBsZXQgJGRpdl9saXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuXG4gICAgICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5sb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkX3Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAocGsgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcGsgPSB0aGlzLnZhbHVlc19saXN0WzBdLnBrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2RldGFpbF92aWV3JyxcbiAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBwazogcGtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICRkaXZfbGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2X2xpc3QpO1xuICAgICAgICAgICAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgIH0sIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XTtcblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9saXN0O1xuICAgIH1cblxuICAgIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY0Zvcm0oJGZvcm1zKTtcbiAgICB9XG5cbiAgICBzeW5jTW9kZWxUb0Zvcm0oJGZvcm1zKSB7XG4gICAgICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLW1vZGVsX3BrJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGsgPSAkKHRoaXMpLmRhdGEoJ21vZGVsX3BrJyk7XG4gICAgICAgICAgICBsZXQgaW5zdGFuY2UgPSBzZWxmLmJ5UGsocGspO1xuICAgICAgICAgICAgZm9yIChsZXQgZm9ybV9pdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGZvcm1faXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9pdGVtLmNoZWNrZWQgPSBpbnN0YW5jZVtuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtX2l0ZW0udHlwZSA9PT0gJ2ZpbGUnICYmIGluc3RhbmNlW25hbWVdIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IG5ldyBEYXRhVHJhbnNmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pdGVtcy5hZGQoaW5zdGFuY2VbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybV9pdGVtLmZpbGVzID0gY29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChmb3JtX2l0ZW0pLnZhbChpbnN0YW5jZVtuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgc3luY0Zvcm0oJGZvcm1zKSB7XG4gICAgICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtX2lkKSkge1xuICAgICAgICAgICAgJGZvcm1zID0gJChgLiR7dGhpcy5mb3JtX2lkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGxldCBpbnN0YW5jZXMgPSBbXTtcblxuICAgICAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgJGZvcm0gPSAkKHRoaXMpO1xuICAgICAgICAgICAgbGV0IHBrID0gJGZvcm0uZGF0YSgnbW9kZWxfcGsnKTtcbiAgICAgICAgICAgIGxldCBpbnN0YW5jZSA9IHNlbGYuYnlQayhwayk7XG4gICAgICAgICAgICBmb3IgKGxldCBmb3JtX2l0ZW0gb2YgdGhpcy5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gZm9ybV9pdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1faXRlbS50eXBlID09PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBwYXJzZV9oaWRkZW5faW5wdXRzKCQoZm9ybV9pdGVtKS52YWwoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gZm9ybV9pdGVtLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybV9pdGVtLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSBmb3JtX2l0ZW0uZmlsZXNbMF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9ICQoZm9ybV9pdGVtKS52YWwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy52YWx1ZXNfbGlzdC5sZW5ndGggPD0gMSAmJiBpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBpbnN0YW5jZXMuYXQoLTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlcztcblxuICAgIH1cblxuICAgIGNyZWF0ZUZvcm0oY2JfcmVzb2x2ZSA9IG51bGwsIGNiX3JlamVjdCA9IG51bGwpIHtcbiAgICAgICAgbGV0ICRkaXZfZm9ybSA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdjcmVhdGVfZm9ybScsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgJGRpdl9mb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgICAgICAgIGxldCAkZm9ybSA9ICRkaXZfZm9ybS5jbG9zZXN0KCdmb3JtJykuYWRkQ2xhc3MoYHNkYy1tb2RlbC1jcmVhdGUtZm9ybSBzZGMtbW9kZWwtZm9ybSAke3RoaXMuZm9ybV9pZH1gKS5kYXRhKCdtb2RlbCcsIHRoaXMpLmRhdGEoJ21vZGVsX3BrJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKCEkZm9ybVswXS5oYXNBdHRyaWJ1dGUoJ3NkY19zdWJtaXQnKSkge1xuICAgICAgICAgICAgICAgICAgICAkZm9ybS5hdHRyKCdzZGNfc3VibWl0JywgJ3N1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2X2Zvcm0pO1xuICAgICAgICAgICAgICAgIGNiX3Jlc29sdmUgJiYgY2JfcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgIH0sIChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYl9yZWplY3QgJiYgY2JfcmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XTtcblxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gJGRpdl9mb3JtO1xuICAgIH1cblxuICAgIGVkaXRGb3JtKHBrID0gLTEsIGNiX3Jlc29sdmUgPSBudWxsLCBjYl9yZWplY3QgPSBudWxsKSB7XG4gICAgICAgIGxldCBsb2FkX3Byb21pc2U7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlc19saXN0Lmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5pc0Nvbm5lY3RlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9hZF9wcm9taXNlID0gdGhpcy5sb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgJGRpdl9mb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgICAgICBsb2FkX3Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAocGsgPD0gLTEpIHtcbiAgICAgICAgICAgICAgICBwayA9IHRoaXMudmFsdWVzX2xpc3QuYXQocGspLnBrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2VkaXRfZm9ybScsXG4gICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbF9xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcGs6IHBrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAkZGl2X2Zvcm0uYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgICAgICAgICAgbGV0ICRmb3JtID0gJGRpdl9mb3JtLmNsb3Nlc3QoJ2Zvcm0nKS5hZGRDbGFzcyhgc2RjLW1vZGVsLWVkaXQtZm9ybSBzZGMtbW9kZWwtZm9ybSAke3RoaXMuZm9ybV9pZH1gKS5kYXRhKCdtb2RlbCcsIHRoaXMpLmRhdGEoJ21vZGVsX3BrJywgcGspO1xuICAgICAgICAgICAgICAgIGlmICghJGZvcm1bMF0uaGFzQXR0cmlidXRlKCdzZGNfc3VibWl0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgJGZvcm0uYXR0cignc2RjX3N1Ym1pdCcsICdzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvcicpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXBwLnJlZnJlc2goJGRpdl9mb3JtKTtcbiAgICAgICAgICAgICAgICBjYl9yZXNvbHZlICYmIGNiX3Jlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY2JfcmVqZWN0ICYmIGNiX3JlamVjdChyZXMpO1xuICAgICAgICAgICAgfV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAkZGl2X2Zvcm07XG4gICAgfVxuXG4gICAgbmV3KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJGZvcm0gPSAkKCc8Zm9ybT4nKS5hcHBlbmQodGhpcy5jcmVhdGVGb3JtKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNGb3JtVG9Nb2RlbCgkZm9ybSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgcmVqZWN0KSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc2F2ZShwayA9IC0xKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZWxlbV9saXN0O1xuICAgICAgICAgICAgaWYgKHBrID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtX2xpc3QgPSBbdGhpcy5ieVBrKHBrKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1fbGlzdCA9IHRoaXMudmFsdWVzX2xpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcF9saXN0ID0gW11cbiAgICAgICAgICAgIGVsZW1fbGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgICAgICBwX2xpc3QucHVzaChuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ3NhdmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGVsZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlamVjdF07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocF9saXN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY3JlYXRlKHZhbHVlcyA9IHRoaXMudmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRGaWxlcyh2YWx1ZXMpLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6ICdtb2RlbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbaWRdID0gWyhyZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVNlcnZlclJlcyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlbGV0ZShwayA9IC0xKSB7XG4gICAgICAgIGlmIChwayA9PT0gLTEpIHBrID0gdGhpcy52YWx1ZXM/LnBrXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogJ2RlbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxfcXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBwazogcGtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzX2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faXNfY29ubmV0aW5nX3Byb2Nlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ10gPSBbKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RUb1NlcnZlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuX2NoZWNrQ29ubmVjdGlvbigpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3Jlc29sdmVfb3JpZ2luLCByZWplY3Rfb3JpZ2luXSA9IHRoaXMub3Blbl9yZXF1ZXN0WydfY29ubmVjdGluZ19wcm9jZXNzJ107XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZV9vcmlnaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0X29yaWdpbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9fcmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpc1snc29ja2V0J107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhbigpIHtcbiAgICAgICAgdGhpcy52YWx1ZXNfbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHt9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfcmVhZEZpbGVzKGVsZW0pIHtcbiAgICAgICAgbGV0IHRvX3NvbHZlID0gW107XG4gICAgICAgIGxldCBmaWxlcyA9IHt9XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW0pKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICAgICAgdG9fc29sdmUucHVzaChuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICgoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bWJlcl9vZl9jaHVua3MgPSBwYXJzZUludChNYXRoLmNlaWwocmVzdWx0Lmxlbmd0aCAvIE1BWF9GSUxFX1VQTE9BRCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoOiB2YWx1ZS5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJfb2ZfY2h1bmtzOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ21vZGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICd1cGxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rOiByZXN1bHQuc2xpY2UoTUFYX0ZJTEVfVVBMT0FEICogaSwgTUFYX0ZJTEVfVVBMT0FEICogKGkgKyAxKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaHVua3M6IG51bWJlcl9vZl9jaHVua3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbF9uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KShrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0b19zb2x2ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmlsZXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uTWVzc2FnZShlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICBpZiAoZGF0YS5pc19lcnJvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMub3Blbl9yZXF1ZXN0Lmhhc093blByb3BlcnR5KGRhdGEuZXZlbnRfaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbZGF0YS5ldmVudF9pZF1bMV0oZGF0YSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcigncHVzaEVycm9yTXNnJywgZGF0YS5oZWFkZXIgfHwgJycsIGRhdGEubXNnIHx8ICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXVsxXShkYXRhKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRvX3JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICAgICAgICAgIHRyaWdnZXIoJ3B1c2hNc2cnLCBkYXRhLmhlYWRlciB8fCAnJywgZGF0YS5tc2cgfHwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc19jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzX2Nvbm5ldGluZ19wcm9jZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXVswXShkYXRhKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcGVuX3JlcXVlc3RbJ19jb25uZWN0aW5nX3Byb2Nlc3MnXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbG9hZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqc29uX3JlcyA9IEpTT04ucGFyc2UoZGF0YS5hcmdzLmRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzX2xpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uX3Jlcyk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnb25fdXBkYXRlJyB8fCBkYXRhLnR5cGUgPT09ICdvbl9jcmVhdGUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganNvbl9yZXMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKTtcblxuICAgICAgICAgICAgICAgIGxldCBvYmogPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uX3Jlcyk7XG4gICAgICAgICAgICAgICAgbGV0IGNiO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ29uX2NyZWF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IgPSB0aGlzLm9uX2NyZWF0ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYiA9IHRoaXMub25fdXBkYXRlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNiKG9iaik7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5fcmVxdWVzdC5oYXNPd25Qcm9wZXJ0eShkYXRhLmV2ZW50X2lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzBdKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm9wZW5fcmVxdWVzdFtkYXRhLmV2ZW50X2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jb25uZWN0VG9TZXJ2ZXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBtb2RlbF9pZGVudGlmaWVyID0gYCR7dGhpcy5tb2RlbF9uYW1lfWAgKyAodGhpcy5tb2RlbF9pZCA+IDAgPyBgLyR7dGhpcy5tb2RlbF9pZH1gIDogJycpO1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChgd3NzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL21vZGVsLyR7bW9kZWxfaWRlbnRpZmllcn1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy9tb2RlbC8ke21vZGVsX2lkZW50aWZpZXJ9YCk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fb25NZXNzYWdlLmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFNEQyBNb2RlbCAoJHt0aGlzLm1vZGVsX25hbWV9LCAke3RoaXMubW9kZWxfaWR9KSBTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW19rZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9wZW5fcmVxdWVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbMV0oZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub3Blbl9yZXF1ZXN0ID0ge307XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F1dG9fcmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYE1vZGVsIFNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogJHtlcnJ9IENsb3Npbmcgc29ja2V0YCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzX2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgX2NoZWNrQ29ubmVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiAnbW9kZWwnLFxuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdjb25uZWN0JyxcbiAgICAgICAgICAgICAgICBldmVudF9pZDogaWQsXG4gICAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsX3F1ZXJ5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICB0aGlzLm9wZW5fcmVxdWVzdFtpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3BhcnNlU2VydmVyUmVzKHJlcykge1xuICAgICAgICBsZXQgdXBkYXRlZCA9IFtdXG4gICAgICAgIGZvciAobGV0IGpzb25fZGF0YSBvZiByZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBrID0ganNvbl9kYXRhLnBrXG4gICAgICAgICAgICBjb25zdCBvYmogPSB0aGlzLmJ5UGsocGspO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoanNvbl9kYXRhLmZpZWxkcykpIHtcbiAgICAgICAgICAgICAgICAvL2lmKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnICYmIHZbJ19faXNfc2RjX21vZGVsX18nXSkge1xuICAgICAgICAgICAgICAgIC8vICAgIG9ialtrXSA9IG5ldyBNb2RlbCh2Wydtb2RlbCddLCB7J3BrJzogdlsncGsnXX0pXG4gICAgICAgICAgICAgICAgLy99IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ialtrXSA9IHY7XG4gICAgICAgICAgICAgICAgLy99XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVwZGF0ZWQucHVzaChvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWVzX2xpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHRoaXMudmFsdWVzX2xpc3QuYXQoLTEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuXG4gICAgfVxufSJdLCJuYW1lcyI6WyJhcHAiLCJ0cmlnZ2VyIiwidXVpZHY0IiwiSVNfQ09OTkVDVEVEIiwiSVNfQ09OTkVDVElORyIsIlNEQ19TT0NLRVQiLCJNQVhfRklMRV9VUExPQUQiLCJPUEVOX1JFUVVFU1RTIiwiY2FsbFNlcnZlciIsImNvbnRyb2xsZXIiLCJmdW5jTmFtZSIsImFyZ3MiLCJpZCIsImlzQ29ubmVjdGVkIiwidGhlbiIsInNlbmQiLCJKU09OIiwic3RyaW5naWZ5IiwiZXZlbnQiLCJmdW5jdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiX2Nvbm5lY3QiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsInByb3RvY29sIiwiV2ViU29ja2V0IiwiaG9zdCIsIm9ubWVzc2FnZSIsImUiLCJkYXRhIiwicGFyc2UiLCJpc19lcnJvciIsIm1zZyIsImhlYWRlciIsInR5cGUiLCJwYXlsb2FkIiwibGluayIsIm9uY2xvc2UiLCJjb25zb2xlIiwiZXJyb3IiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJzZXRUaW1lb3V0Iiwib25lcnJvciIsImVyciIsIm1lc3NhZ2UiLCJjbG9zZSIsIm9ub3BlbiIsInBhcnNlX2hpZGRlbl9pbnB1dHMiLCJpc0Zsb2F0UmVnIiwiaXNJbnRSZWciLCJpc0Jvb2xSZWciLCJpc1N0cmluZ1JlZyIsInRvTG93ZXJDYXNlIiwibWF0Y2giLCJ1bmRlZmluZWQiLCJwYXJzZUludCIsInBhcnNlRmxvYXQiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJNb2RlbCIsImNvbnN0cnVjdG9yIiwibW9kZWxfbmFtZSIsIm1vZGVsX3F1ZXJ5IiwidmFsdWVzX2xpc3QiLCJ2YWx1ZXMiLCJfaXNfY29ubmVjdGVkIiwiX2lzX2Nvbm5ldGluZ19wcm9jZXNzIiwiX2F1dG9fcmVjb25uZWN0Iiwic29ja2V0Iiwib3Blbl9yZXF1ZXN0Iiwib25fdXBkYXRlIiwib25fY3JlYXRlIiwiZm9ybV9pZCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiaWR4IiwibmV4dCIsImRvbmUiLCJieVBrIiwicGsiLCJlbGVtIiwiZmluZCIsImVsbSIsInB1c2giLCJmaWx0ZXIiLCJhc3NpZ24iLCJsb2FkIiwiZXZlbnRfdHlwZSIsImV2ZW50X2lkIiwibGlzdFZpZXciLCJjYl9yZXNvbHZlIiwiY2JfcmVqZWN0IiwiJGRpdl9saXN0IiwiJCIsImFwcGVuZCIsImh0bWwiLCJyZWZyZXNoIiwicmVzIiwiZGV0YWlsVmlldyIsImxvYWRfcHJvbWlzZSIsInN5bmNGb3JtVG9Nb2RlbCIsIiRmb3JtcyIsInN5bmNGb3JtIiwic3luY01vZGVsVG9Gb3JtIiwiaGFzQ2xhc3MiLCJzZWxmIiwiZWFjaCIsImhhc0F0dHJpYnV0ZSIsImluc3RhbmNlIiwiZm9ybV9pdGVtIiwiZWxlbWVudHMiLCJuYW1lIiwiY2hlY2tlZCIsIkZpbGUiLCJjb250YWluZXIiLCJEYXRhVHJhbnNmZXIiLCJpdGVtcyIsImFkZCIsImZpbGVzIiwidmFsIiwiaW5zdGFuY2VzIiwiJGZvcm0iLCJhdCIsImNyZWF0ZUZvcm0iLCIkZGl2X2Zvcm0iLCJjbG9zZXN0IiwiYWRkQ2xhc3MiLCJhdHRyIiwiZWRpdEZvcm0iLCJuZXciLCJzYXZlIiwiZWxlbV9saXN0IiwicF9saXN0IiwiZm9yRWFjaCIsIl9yZWFkRmlsZXMiLCJfcGFyc2VTZXJ2ZXJSZXMiLCJhbGwiLCJjcmVhdGUiLCJkZWxldGUiLCJfY29ubmVjdFRvU2VydmVyIiwiX2NoZWNrQ29ubmVjdGlvbiIsInJlc29sdmVfb3JpZ2luIiwicmVqZWN0X29yaWdpbiIsImNsZWFuIiwidG9fc29sdmUiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkIiwicmVzdWx0IiwidGFyZ2V0IiwibnVtYmVyX29mX2NodW5rcyIsIk1hdGgiLCJjZWlsIiwiZmlsZV9uYW1lIiwiZmllbGRfbmFtZSIsImNvbnRlbnRfbGVuZ3RoIiwic2l6ZSIsImkiLCJjaHVuayIsInNsaWNlIiwiY29udGVudF90eXBlIiwicmVhZEFzQmluYXJ5U3RyaW5nIiwiX29uTWVzc2FnZSIsImhhc093blByb3BlcnR5IiwianNvbl9yZXMiLCJvYmoiLCJjYiIsIm1vZGVsX2lkZW50aWZpZXIiLCJtb2RlbF9pZCIsImJpbmQiLCJfa2V5IiwidXBkYXRlZCIsImpzb25fZGF0YSIsImsiLCJ2IiwiZmllbGRzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_socket.js\n");
88
88
 
89
89
  /***/ }),
90
90
 
@@ -114,7 +114,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
114
114
  \******************************************/
115
115
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
116
116
 
117
- 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 */ 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 = {};\nconst DATA_CONTROLLER_KEY = '_controller_';\nconst CONTROLLER_CLASS = '_sdc_controller_';\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(`_bind_to_update_handler sdc_uuid_${parentController._uuid}`);\n } else {\n emptyList = emptyList.concat(findSdcTgs($element, tagNameList, parentController));\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 (controller._urlParams.hasOwnProperty(key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n url = url.replace(re, \"\" + urlValues.shift());\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 path - a content URL from the controller.\n * @param {object} args - get args.\n * @param tag - a normalized tag-name as string.\n * @param hardReload - true if the file has to be reloaded every time.\n * @returns {Promise<Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(path, args, tag, hardReload) {\n if (!path) {\n return Promise.resolve(false);\n } else if (htmlFiles[tag]) {\n return Promise.resolve(htmlFiles[tag]);\n }\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = 'content';\n return $.get(path, args).then(function (data) {\n if (!hardReload) {\n htmlFiles[tag] = data;\n }\n return data;\n }).catch(function (err) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('navLoaded', {\n 'controller_name': () => err.status\n });\n if (err.status === 301) {\n const data = err.responseJSON;\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('onNavLink', data['url-link']);\n throw \"<sdc-error data-code='301'></sdc-error>\";\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 */\nfunction replaceAllTagElementsInContainer($container, parentController) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $container, parentController);\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 {string} - 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 let 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 controller.parsedContentUrl = url;\n return {\n url: url,\n args: params[params.length - 1]\n };\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 = {\n args: {}\n };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller, controller.contentUrl);\n controller.contentUrl = getElements.url;\n }\n return Promise.all([loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload)]).then(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 return null;\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, controller.contentUrl);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload);\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 * @returns {boolean}\n */\nfunction runReplaceTagElementsInContainer($element, tagName, superTagNameList, parentController) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller);\n }\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(parentController, $element, tagName, superTagNameList);\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, $element);\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 * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html) {\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 return replaceAllTagElementsInContainer(controller.$container, controller);\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 */\nfunction replaceTagElementsInContainer(tagList, $container, parentController) {\n return new Promise(resolve => {\n let tagDescriptionElements = findSdcTgs($container, tagList, parentController);\n let tagCount = tagDescriptionElements.length;\n if (tagCount === 0) {\n return resolve();\n }\n for (let elementIndex = 0; elementIndex < tagDescriptionElements.length; elementIndex++) {\n runReplaceTagElementsInContainer(tagDescriptionElements[elementIndex].dom, tagDescriptionElements[elementIndex].tag, tagDescriptionElements[elementIndex].super, parentController).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\nfunction reloadMethodHTML(controller) {\n return _reloadMethodHTML(controller, controller.$container);\n}\nfunction _reloadMethodHTML(controller, $dom) {\n const plist = [];\n $dom.find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`).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.toLowerCase().replace(/^this./, '');\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n if (result !== undefined) {\n if (typeof result === 'function') {\n result = result.bind(controller)($this.data());\n }\n plist.push(Promise.resolve(result).then(x => {\n const $new_content = $(`<div></div>`);\n $new_content.append(x);\n return replaceTagElementsInContainer((0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.tagList)(), $new_content, controller).then(() => {\n return _reloadMethodHTML(controller, $new_content).then(() => {\n $this.safeEmpty().text('').append(x);\n return true;\n });\n });\n }));\n }\n });\n return Promise.all(plist);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdmlldy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQXdGO0FBQzVDO0FBQ1Y7QUFDTTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBRVgsTUFBTUMsbUJBQW1CLEdBQUcsY0FBYztBQUMxQyxNQUFNQyxnQkFBZ0IsR0FBRyxrQkFBa0I7QUFHM0MsU0FBU0MsVUFBVUEsQ0FBQSxFQUFHO0VBQ3pCSCxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTSSxVQUFVQSxDQUFDQyxVQUFVLEVBQUVDLFdBQVcsRUFBRUMsZ0JBQWdCLEVBQUU7RUFDM0QsSUFBSSxDQUFDRixVQUFVLEVBQUU7SUFDYixPQUFPLEVBQUU7RUFDYjtFQUNBLElBQUlHLFNBQVMsR0FBR0gsVUFBVSxDQUFDSSxRQUFRLENBQUMsQ0FBQztFQUNyQyxJQUFJQyxTQUFTLEdBQUcsRUFBRTtFQUNsQkYsU0FBUyxDQUFDRyxJQUFJLENBQUMsVUFBVUMsQ0FBQyxFQUFFQyxPQUFPLEVBQUU7SUFDakMsSUFBSUMsUUFBUSxHQUFHQyxDQUFDLENBQUNGLE9BQU8sQ0FBQztJQUN6QixJQUFJRyxPQUFPLEdBQUdGLFFBQVEsQ0FBQ0csSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDQyxXQUFXLENBQUMsQ0FBQyxDQUFDQyxLQUFLLENBQUMsR0FBRyxDQUFDO0lBQy9ELElBQUlKLENBQUMsQ0FBQ0ssT0FBTyxDQUFDSixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUVWLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtNQUN6Q0ksU0FBUyxDQUFDVyxJQUFJLENBQUM7UUFDWEMsR0FBRyxFQUFFTixPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2ZPLEtBQUssRUFBRVAsT0FBTyxDQUFDUSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUM5QkMsR0FBRyxFQUFFWDtNQUNULENBQUMsQ0FBQztJQUVOLENBQUMsTUFBTSxJQUFJRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNVLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtNQUN2Q1osUUFBUSxDQUFDYSxRQUFRLENBQUUsb0NBQW1DcEIsZ0JBQWdCLENBQUNxQixLQUFNLEVBQUMsQ0FBQztJQUNuRixDQUFDLE1BQU07TUFDSGxCLFNBQVMsR0FBR0EsU0FBUyxDQUFDbUIsTUFBTSxDQUFDekIsVUFBVSxDQUFDVSxRQUFRLEVBQUVSLFdBQVcsRUFBRUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyRjtFQUNKLENBQUMsQ0FBQztFQUVGLE9BQU9HLFNBQVM7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU29CLDRCQUE0QkEsQ0FBQ0MsVUFBVSxFQUFFQyxHQUFHLEVBQUVDLFNBQVMsRUFBRTtFQUM5RCxLQUFLLElBQUlDLE9BQU8sSUFBSUgsVUFBVSxDQUFDSSxVQUFVLEVBQUU7SUFDdkMsSUFBSUosVUFBVSxDQUFDSSxVQUFVLENBQUNDLGNBQWMsQ0FBQ0YsT0FBTyxDQUFDLEVBQUU7TUFDL0MsSUFBSUcsR0FBRyxHQUFHTixVQUFVLENBQUNJLFVBQVUsQ0FBQ0QsT0FBTyxDQUFDO01BQ3hDLElBQUlJLEVBQUUsR0FBR0MsTUFBTSxDQUFDLE1BQU0sR0FBR0YsR0FBRyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUM7TUFDOUNMLEdBQUcsR0FBR0EsR0FBRyxDQUFDUSxPQUFPLENBQUNGLEVBQUUsRUFBRSxFQUFFLEdBQUdMLFNBQVMsQ0FBQ1EsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRDtFQUNKO0VBRUEsT0FBT1QsR0FBRztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTVSxZQUFZQSxDQUFDQyxJQUFJLEVBQUVDLElBQUksRUFBRXRCLEdBQUcsRUFBRXVCLFVBQVUsRUFBRTtFQUMvQyxJQUFJLENBQUNGLElBQUksRUFBRTtJQUNQLE9BQU9HLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztFQUNqQyxDQUFDLE1BQU0sSUFBSS9DLFNBQVMsQ0FBQ3NCLEdBQUcsQ0FBQyxFQUFFO0lBQ3ZCLE9BQU93QixPQUFPLENBQUNDLE9BQU8sQ0FBQy9DLFNBQVMsQ0FBQ3NCLEdBQUcsQ0FBQyxDQUFDO0VBQzFDO0VBRUFzQixJQUFJLENBQUNJLE9BQU8sR0FBR2xELDZDQUFHLENBQUNrRCxPQUFPO0VBQzFCSixJQUFJLENBQUNLLE9BQU8sR0FBRyxTQUFTO0VBRXhCLE9BQU9sQyxDQUFDLENBQUNtQyxHQUFHLENBQUNQLElBQUksRUFBRUMsSUFBSSxDQUFDLENBQUNPLElBQUksQ0FBQyxVQUFVQyxJQUFJLEVBQUU7SUFDMUMsSUFBSSxDQUFDUCxVQUFVLEVBQUU7TUFDYjdDLFNBQVMsQ0FBQ3NCLEdBQUcsQ0FBQyxHQUFHOEIsSUFBSTtJQUN6QjtJQUVBLE9BQU9BLElBQUk7RUFDZixDQUFDLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLFVBQVVDLEdBQUcsRUFBRTtJQUNwQnZELHVEQUFPLENBQUMsV0FBVyxFQUFFO01BQUMsaUJBQWlCLEVBQUV3RCxDQUFBLEtBQUtELEdBQUcsQ0FBQ0U7SUFBTSxDQUFDLENBQUM7SUFDMUQsSUFBSUYsR0FBRyxDQUFDRSxNQUFNLEtBQUssR0FBRyxFQUFFO01BQ3BCLE1BQU1KLElBQUksR0FBR0UsR0FBRyxDQUFDRyxZQUFZO01BQzdCMUQsdURBQU8sQ0FBQyxXQUFXLEVBQUVxRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7TUFDdEMsTUFBTSx5Q0FBeUM7SUFDbkQ7SUFFQSxNQUFPLHlCQUF3QkUsR0FBRyxDQUFDRSxNQUFPLEtBQUlGLEdBQUcsQ0FBQ0ksWUFBYSxjQUFhO0VBQ2hGLENBQUMsQ0FBQztBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsZ0NBQWdDQSxDQUFDdEQsVUFBVSxFQUFFRSxnQkFBZ0IsRUFBRTtFQUNwRUEsZ0JBQWdCLEdBQUdBLGdCQUFnQixJQUFJRixVQUFVLENBQUMrQyxJQUFJLENBQUNuRCxtQkFBbUIsQ0FBQztFQUMzRSxPQUFPMkQsNkJBQTZCLENBQUM5RCw2Q0FBRyxDQUFDK0QsUUFBUSxFQUFFeEQsVUFBVSxFQUFFRSxnQkFBZ0IsQ0FBQztBQUNwRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVN1RCxlQUFlQSxDQUFDL0IsVUFBVSxFQUFFO0VBQ2pDLElBQUlDLEdBQUcsR0FBR0QsVUFBVSxDQUFDZ0MsVUFBVTtFQUMvQixJQUFJaEMsVUFBVSxJQUFJQSxVQUFVLENBQUNJLFVBQVUsQ0FBQzZCLE1BQU0sS0FBSyxDQUFDLEVBQUU7SUFDbEQsSUFBSTFCLEVBQUUsR0FBRyxrQkFBa0I7SUFDM0IsSUFBSTJCLE9BQU87SUFDWGxDLFVBQVUsQ0FBQ0ksVUFBVSxHQUFHLEVBQUU7SUFDMUIsT0FBUThCLE9BQU8sR0FBRzNCLEVBQUUsQ0FBQzRCLElBQUksQ0FBQ2xDLEdBQUcsQ0FBQyxFQUFHO01BQzdCRCxVQUFVLENBQUNJLFVBQVUsQ0FBQ2QsSUFBSSxDQUFDNEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3RDbEMsVUFBVSxDQUFDb0MsYUFBYSxHQUFHLElBQUk7SUFDbkM7RUFDSjtFQUVBLElBQUlDLE1BQU0sR0FBR3ZFLDJEQUFXLENBQUNrQyxVQUFVLEVBQUVBLFVBQVUsQ0FBQzFCLFVBQVUsQ0FBQztFQUMzRCxJQUFJMEIsVUFBVSxDQUFDSSxVQUFVLENBQUM2QixNQUFNLEVBQUU7SUFDOUJoQyxHQUFHLEdBQUdGLDRCQUE0QixDQUFDQyxVQUFVLEVBQUVDLEdBQUcsRUFBRW9DLE1BQU0sQ0FBQztFQUMvRDtFQUVBckMsVUFBVSxDQUFDc0MsZ0JBQWdCLEdBQUdyQyxHQUFHO0VBRWpDLE9BQU87SUFBQ0EsR0FBRyxFQUFFQSxHQUFHO0lBQUVZLElBQUksRUFBRXdCLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDSixNQUFNLEdBQUcsQ0FBQztFQUFDLENBQUM7QUFDdEQ7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNNLGFBQWFBLENBQUNDLEtBQUssRUFBRTtFQUNqQyxJQUFJQSxLQUFLLENBQUNDLFFBQVEsQ0FBQ3RFLGdCQUFnQixDQUFDLEVBQUU7SUFDbEMsT0FBT3FFLEtBQUssQ0FBQ25CLElBQUksQ0FBRSxHQUFFbkQsbUJBQW9CLEVBQUMsQ0FBQztFQUMvQztFQUNBLE9BQU9zRSxLQUFLLENBQUNFLE9BQU8sQ0FBRSxJQUFHdkUsZ0JBQWlCLEVBQUMsQ0FBQyxDQUFDa0QsSUFBSSxDQUFFLEdBQUVuRCxtQkFBb0IsRUFBQyxDQUFDO0FBQy9FOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTeUUsdUJBQXVCQSxDQUFDM0MsVUFBVSxFQUFFO0VBQ2hELElBQUk0QyxXQUFXLEdBQUc7SUFBQy9CLElBQUksRUFBRSxDQUFDO0VBQUMsQ0FBQztFQUM1QixJQUFJYixVQUFVLENBQUNnQyxVQUFVLEVBQUU7SUFDdkJZLFdBQVcsR0FBR2IsZUFBZSxDQUFDL0IsVUFBVSxFQUFFQSxVQUFVLENBQUNnQyxVQUFVLENBQUM7SUFDaEVoQyxVQUFVLENBQUNnQyxVQUFVLEdBQUdZLFdBQVcsQ0FBQzNDLEdBQUc7RUFDM0M7RUFFQSxPQUFPYyxPQUFPLENBQUM4QixHQUFHLENBQUMsQ0FDZmxDLFlBQVksQ0FBQ1gsVUFBVSxDQUFDZ0MsVUFBVSxFQUFFWSxXQUFXLENBQUMvQixJQUFJLEVBQUViLFVBQVUsQ0FBQzhDLFFBQVEsRUFBRTlDLFVBQVUsQ0FBQ29DLGFBQWEsQ0FBQyxDQUN2RyxDQUFDLENBQUNoQixJQUFJLENBQUMsVUFBVTJCLE9BQU8sRUFBRTtJQUN2QixJQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSUMsUUFBUSxFQUFFO01BQ1YsSUFBSTtRQUNBLE9BQU9oRSxDQUFDLENBQUNnRSxRQUFRLENBQUM7TUFDdEIsQ0FBQyxDQUFDLE1BQU07UUFDSixPQUFPaEUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDaUUsTUFBTSxDQUFDRCxRQUFRLENBQUM7TUFDNUM7SUFDSjtJQUVBLE9BQU8sSUFBSTtFQUNmLENBQUMsQ0FBQztBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Usb0JBQW9CQSxDQUFDbEQsVUFBVSxFQUFFO0VBQzdDLElBQUlBLFVBQVUsQ0FBQ2dDLFVBQVUsRUFBRTtJQUN2QixJQUFJWSxXQUFXLEdBQUdiLGVBQWUsQ0FBQy9CLFVBQVUsRUFBRUEsVUFBVSxDQUFDZ0MsVUFBVSxDQUFDO0lBQ3BFaEMsVUFBVSxDQUFDZ0MsVUFBVSxHQUFHWSxXQUFXLENBQUMzQyxHQUFHO0lBQ3ZDLE9BQU9VLFlBQVksQ0FBQ1gsVUFBVSxDQUFDZ0MsVUFBVSxFQUFFWSxXQUFXLENBQUMvQixJQUFJLEVBQUViLFVBQVUsQ0FBQzhDLFFBQVEsRUFBRTlDLFVBQVUsQ0FBQ29DLGFBQWEsQ0FBQztFQUMvRztFQUVBLE9BQU8sSUFBSXJCLE9BQU8sQ0FBQ0MsT0FBTyxJQUFJO0lBQzFCQSxPQUFPLENBQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hCLENBQUMsQ0FBQztBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTbUUsZ0NBQWdDQSxDQUFDcEUsUUFBUSxFQUFFRSxPQUFPLEVBQUVtRSxnQkFBZ0IsRUFBRTVFLGdCQUFnQixFQUFFO0VBQzdGLElBQUl3QixVQUFVLEdBQUdqQixRQUFRLENBQUNzQyxJQUFJLENBQUNuRCxtQkFBbUIsQ0FBQztFQUNuRCxJQUFJOEIsVUFBVSxFQUFFO0lBQ1osT0FBTzRCLGdDQUFnQyxDQUFDN0MsUUFBUSxFQUFFaUIsVUFBVSxDQUFDO0VBQ2pFO0VBRUFBLFVBQVUsR0FBR3JDLHFFQUFpQixDQUFDYSxnQkFBZ0IsRUFBRU8sUUFBUSxFQUFFRSxPQUFPLEVBQUVtRSxnQkFBZ0IsQ0FBQztFQUNyRnJFLFFBQVEsQ0FBQ3NDLElBQUksQ0FBQ25ELG1CQUFtQixFQUFFOEIsVUFBVSxDQUFDO0VBQzlDakIsUUFBUSxDQUFDYSxRQUFRLENBQUN6QixnQkFBZ0IsQ0FBQztFQUNuQyxPQUFPUCwyRUFBdUIsQ0FBQ29DLFVBQVUsRUFBRWpCLFFBQVEsQ0FBQztBQUN4RDs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3NFLHdCQUF3QkEsQ0FBQ3JELFVBQVUsRUFBRXNELEtBQUssRUFBRTtFQUN4RCxJQUFJQSxLQUFLLElBQUlBLEtBQUssQ0FBQ3JCLE1BQU0sR0FBRyxDQUFDLEVBQUU7SUFDM0JqQyxVQUFVLENBQUMxQixVQUFVLENBQUNpRixLQUFLLENBQUMsQ0FBQztJQUM3QnZELFVBQVUsQ0FBQzFCLFVBQVUsQ0FBQ2tGLElBQUksQ0FBQ3hELFVBQVUsQ0FBQzhDLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDbkQsS0FBSyxJQUFJVyxRQUFRLElBQUl6RCxVQUFVLENBQUMwRCxPQUFPLEVBQUU7TUFDckMxRCxVQUFVLENBQUMxQixVQUFVLENBQUNrRixJQUFJLENBQUN4RCxVQUFVLENBQUMwRCxPQUFPLENBQUNELFFBQVEsQ0FBQyxDQUFDWCxRQUFRLEVBQUUsRUFBRSxDQUFDO0lBQ3pFO0lBQ0E5QyxVQUFVLENBQUMxQixVQUFVLENBQUMyRSxNQUFNLENBQUNLLEtBQUssQ0FBQztFQUN2QztFQUVBLE9BQU8xQixnQ0FBZ0MsQ0FBQzVCLFVBQVUsQ0FBQzFCLFVBQVUsRUFBRTBCLFVBQVUsQ0FBQztBQUM5RTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM2Qiw2QkFBNkJBLENBQUNoRSxPQUFPLEVBQUVTLFVBQVUsRUFBRUUsZ0JBQWdCLEVBQUU7RUFDakYsT0FBTyxJQUFJdUMsT0FBTyxDQUFFQyxPQUFPLElBQUs7SUFFNUIsSUFBSTJDLHNCQUFzQixHQUFHdEYsVUFBVSxDQUFDQyxVQUFVLEVBQUVULE9BQU8sRUFBRVcsZ0JBQWdCLENBQUM7SUFDOUUsSUFBSW9GLFFBQVEsR0FBR0Qsc0JBQXNCLENBQUMxQixNQUFNO0lBRTVDLElBQUkyQixRQUFRLEtBQUssQ0FBQyxFQUFFO01BQ2hCLE9BQU81QyxPQUFPLENBQUMsQ0FBQztJQUNwQjtJQUVBLEtBQUssSUFBSTZDLFlBQVksR0FBRyxDQUFDLEVBQUVBLFlBQVksR0FBR0Ysc0JBQXNCLENBQUMxQixNQUFNLEVBQUU0QixZQUFZLEVBQUUsRUFBRTtNQUNyRlYsZ0NBQWdDLENBQUNRLHNCQUFzQixDQUFDRSxZQUFZLENBQUMsQ0FBQ25FLEdBQUcsRUFDckVpRSxzQkFBc0IsQ0FBQ0UsWUFBWSxDQUFDLENBQUN0RSxHQUFHLEVBQ3hDb0Usc0JBQXNCLENBQUNFLFlBQVksQ0FBQyxDQUFDckUsS0FBSyxFQUMxQ2hCLGdCQUFnQixDQUFDLENBQUM0QyxJQUFJLENBQUMsTUFBTTtRQUM3QndDLFFBQVEsRUFBRTtRQUNWLElBQUlBLFFBQVEsS0FBSyxDQUFDLEVBQUU7VUFDaEIsT0FBTzVDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BCO01BQ0osQ0FBQyxDQUFDO0lBQ047RUFDSixDQUFDLENBQUM7QUFDTjtBQUVPLFNBQVM4QyxnQkFBZ0JBLENBQUM5RCxVQUFVLEVBQUU7RUFDekMsT0FBTytELGlCQUFpQixDQUFDL0QsVUFBVSxFQUFFQSxVQUFVLENBQUMxQixVQUFVLENBQUM7QUFDL0Q7QUFDQSxTQUFTeUYsaUJBQWlCQSxDQUFDL0QsVUFBVSxFQUFFZ0UsSUFBSSxFQUFFO0VBQ3pDLE1BQU1DLEtBQUssR0FBRyxFQUFFO0VBRWhCRCxJQUFJLENBQUNFLElBQUksQ0FBRSxxQ0FBb0NsRSxVQUFVLENBQUNILEtBQU0sRUFBQyxDQUFDLENBQUNqQixJQUFJLENBQUMsWUFBWTtJQUNoRixNQUFNdUYsS0FBSyxHQUFHbkYsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyQixJQUFJb0YsTUFBTSxHQUFHQyxTQUFTO0lBQ3RCLElBQUdGLEtBQUssQ0FBQzFCLFFBQVEsQ0FBRSxlQUFjLENBQUMsRUFBRTtNQUNoQzJCLE1BQU0sR0FBR0QsS0FBSyxDQUFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDLE1BQU07TUFDSCxJQUFJaUQsa0JBQWtCLEdBQUcsSUFBSSxDQUFDckYsT0FBTyxDQUFDRSxXQUFXLENBQUMsQ0FBQyxDQUFDc0IsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7TUFDekUsSUFBSVQsVUFBVSxDQUFDc0Usa0JBQWtCLENBQUMsRUFBRTtRQUNoQ0YsTUFBTSxHQUFHcEUsVUFBVSxDQUFDc0Usa0JBQWtCLENBQUM7TUFDM0M7SUFDSjtJQUVBLElBQUlGLE1BQU0sS0FBS0MsU0FBUyxFQUFFO01BQ3RCLElBQUksT0FBT0QsTUFBTSxLQUFLLFVBQVUsRUFBRTtRQUM5QkEsTUFBTSxHQUFHQSxNQUFNLENBQUNHLElBQUksQ0FBQ3ZFLFVBQVUsQ0FBQyxDQUFDbUUsS0FBSyxDQUFDOUMsSUFBSSxDQUFDLENBQUMsQ0FBQztNQUNsRDtNQUVBNEMsS0FBSyxDQUFDM0UsSUFBSSxDQUFDeUIsT0FBTyxDQUFDQyxPQUFPLENBQUNvRCxNQUFNLENBQUMsQ0FBQ2hELElBQUksQ0FBRW9ELENBQUMsSUFBSztRQUMzQyxNQUFNQyxZQUFZLEdBQUd6RixDQUFDLENBQUUsYUFBWSxDQUFDO1FBQ3JDeUYsWUFBWSxDQUFDeEIsTUFBTSxDQUFDdUIsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8zQyw2QkFBNkIsQ0FBQ2hFLDJEQUFPLENBQUMsQ0FBQyxFQUFFNEcsWUFBWSxFQUFFekUsVUFBVSxDQUFDLENBQUNvQixJQUFJLENBQUMsTUFBSztVQUNoRixPQUFPMkMsaUJBQWlCLENBQUMvRCxVQUFVLEVBQUV5RSxZQUFZLENBQUMsQ0FBQ3JELElBQUksQ0FBQyxNQUFLO1lBQ3pEK0MsS0FBSyxDQUFDTyxTQUFTLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMxQixNQUFNLENBQUN1QixDQUFDLENBQUM7WUFDcEMsT0FBTyxJQUFJO1VBQ2YsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDO01BQ04sQ0FBQyxDQUFDLENBQUM7SUFDUDtFQUVKLENBQUMsQ0FBQztFQUVGLE9BQU96RCxPQUFPLENBQUM4QixHQUFHLENBQUNvQixLQUFLLENBQUM7QUFDN0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX3ZpZXcuanM/MjRiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2NvbnRyb2xsZXJGYWN0b3J5LCBydW5Db250cm9sRmxvd0Z1bmN0aW9ucywgdGFnTGlzdH0gZnJvbSBcIi4vc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7Z2V0VXJsUGFyYW19IGZyb20gXCIuL3NkY19wYXJhbXMuanNcIjtcbmltcG9ydCB7YXBwfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHt0cmlnZ2VyfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5cbi8qKlxuICogTGlzdCBvZiBIVE1MIGZpbGVzLlxuICogQHR5cGUge3t9fVxuICovXG5sZXQgaHRtbEZpbGVzID0ge307XG5cbmV4cG9ydCBjb25zdCBEQVRBX0NPTlRST0xMRVJfS0VZID0gJ19jb250cm9sbGVyXyc7XG5leHBvcnQgY29uc3QgQ09OVFJPTExFUl9DTEFTUyA9ICdfc2RjX2NvbnRyb2xsZXJfJztcblxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5DYWNoZSgpIHtcbiAgICBodG1sRmlsZXMgPSB7fTtcbn1cblxuLyoqXG4gKiBmaW5kU2RjVGdzIEZpbmRzIGFsbCByZWdpc3RlcmVkIHRhZ3MgaW4gYSBjb250YWluZXIuIEJ1dCBpdCBpZ25vcmVzXG4gKiByZWdpc3RlcmVkIHRhZ3MgaW4gcmVnaXN0ZXJlZCB0YWdzLiBJdCBjb2xsZWN0cyBhbGwgdGhvc2VcbiAqIGRvbXMgYW5kIHJldHVybnMgYSBsaXN0IG9mIG9iamVjdHMgY29udGFpbmluZyBhbHNvIHRoZSB0YWcgbmFtZSB0aGUgZG9tIGFuZCB0aGUgdGFnXG4gKiBuYW1lcyBvZiB0aGUgc3VwZXIgY29udHJvbGxlclxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0galF1ZXJ5IGNvbnRhaW5lclxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB0YWdOYW1lTGlzdCAtIGEgc3RyaW5nIGxpc3Qgd2l0aCB0YWcgbmFtZXMuXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gY29udHJvbGxlciBpbiBzdXJyb3VuZGluZ1xuICogQHJldHVybiB7QXJyYXl9IC0gYSBhcnJheSBvZiBvYmplY3RzIHdpdGggYWxsIHJlZ2lzdGVyIHRhZ3MgZm91bmRcbiAqL1xuZnVuY3Rpb24gZmluZFNkY1RncygkY29udGFpbmVyLCB0YWdOYW1lTGlzdCwgcGFyZW50Q29udHJvbGxlcikge1xuICAgIGlmICghJGNvbnRhaW5lcikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCAkY2hpbGRyZW4gPSAkY29udGFpbmVyLmNoaWxkcmVuKCk7XG4gICAgbGV0IGVtcHR5TGlzdCA9IFtdO1xuICAgICRjaGlsZHJlbi5lYWNoKGZ1bmN0aW9uIChfLCBlbGVtZW50KSB7XG4gICAgICAgIGxldCAkZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIGxldCB0YWdOYW1lID0gJGVsZW1lbnQucHJvcCgndGFnTmFtZScpLnRvTG93ZXJDYXNlKCkuc3BsaXQoJ18nKTtcbiAgICAgICAgaWYgKCQuaW5BcnJheSh0YWdOYW1lWzBdLCB0YWdOYW1lTGlzdCkgPj0gMCkge1xuICAgICAgICAgICAgZW1wdHlMaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgIHRhZzogdGFnTmFtZVswXSxcbiAgICAgICAgICAgICAgICBzdXBlcjogdGFnTmFtZS5zcGxpY2UoMSkgfHwgW10sXG4gICAgICAgICAgICAgICAgZG9tOiAkZWxlbWVudFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lWzBdLnN0YXJ0c1dpdGgoJ3RoaXMuJykpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmFkZENsYXNzKGBfYmluZF90b191cGRhdGVfaGFuZGxlciBzZGNfdXVpZF8ke3BhcmVudENvbnRyb2xsZXIuX3V1aWR9YClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVtcHR5TGlzdCA9IGVtcHR5TGlzdC5jb25jYXQoZmluZFNkY1RncygkZWxlbWVudCwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpKVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW1wdHlMaXN0O1xufVxuXG4vKipcbiAqIHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIgZmlsbHMgdGhlIHBhcmFtZXRlciBvZiB0aGUgY29udGVudFxuICogdXJsIHRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgdGFnIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gY29udHJvbGxlciBvYmplY3RcbiAqIEBwYXJhbSB1cmwgLSB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMXG4gKiBAcGFyYW0gdXJsVmFsdWVzIC0gdmFsdWVzIGZvciB0aGUgdXJsIHBsYWNlaG9sZGVyLiBJbiBzYW1lIG9yZGVyISFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyKGNvbnRyb2xsZXIsIHVybCwgdXJsVmFsdWVzKSB7XG4gICAgZm9yIChsZXQga2V5X2lkeCBpbiBjb250cm9sbGVyLl91cmxQYXJhbXMpIHtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXIuX3VybFBhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXlfaWR4KSkge1xuICAgICAgICAgICAgbGV0IGtleSA9IGNvbnRyb2xsZXIuX3VybFBhcmFtc1trZXlfaWR4XTtcbiAgICAgICAgICAgIGxldCByZSA9IFJlZ0V4cChcIiVcXFxcKFwiICsga2V5ICsgXCJcXFxcKVxcXFx3XCIsIFwiZ21cIik7XG4gICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShyZSwgXCJcIiArIHVybFZhbHVlcy5zaGlmdCgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogbG9hZEhUTUxGaWxlIGxvYWRzIHRoZSBIVE1MIGNvbnRlbnQgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgdmlhIGFqYXggcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgSFRNTCBmaWxlIGlzIGxvYWRlZCBhbHJlYWR5IHRoZSBmdW5jdGlvbiB0YWtlcyBubyBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHBhdGggLSBhIGNvbnRlbnQgVVJMIGZyb20gdGhlIGNvbnRyb2xsZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGdldCBhcmdzLlxuICogQHBhcmFtIHRhZyAtIGEgbm9ybWFsaXplZCB0YWctbmFtZSBhcyBzdHJpbmcuXG4gKiBAcGFyYW0gaGFyZFJlbG9hZCAtIHRydWUgaWYgdGhlIGZpbGUgaGFzIHRvIGJlIHJlbG9hZGVkIGV2ZXJ5IHRpbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gLSB3YWl0cyBmb3IgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxuICovXG5mdW5jdGlvbiBsb2FkSFRNTEZpbGUocGF0aCwgYXJncywgdGFnLCBoYXJkUmVsb2FkKSB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoaHRtbEZpbGVzW3RhZ10pIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShodG1sRmlsZXNbdGFnXSlcbiAgICB9XG5cbiAgICBhcmdzLlZFUlNJT04gPSBhcHAuVkVSU0lPTjtcbiAgICBhcmdzLl9tZXRob2QgPSAnY29udGVudCc7XG5cbiAgICByZXR1cm4gJC5nZXQocGF0aCwgYXJncykudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoIWhhcmRSZWxvYWQpIHtcbiAgICAgICAgICAgIGh0bWxGaWxlc1t0YWddID0gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdHJpZ2dlcignbmF2TG9hZGVkJywgeydjb250cm9sbGVyX25hbWUnOiAoKT0+IGVyci5zdGF0dXN9KTtcbiAgICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDMwMSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGVyci5yZXNwb25zZUpTT047XG4gICAgICAgICAgICB0cmlnZ2VyKCdvbk5hdkxpbmsnLCBkYXRhWyd1cmwtbGluayddKTtcbiAgICAgICAgICAgIHRocm93IFwiPHNkYy1lcnJvciBkYXRhLWNvZGU9JzMwMSc+PC9zZGMtZXJyb3I+XCI7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBgPHNkYy1lcnJvciBkYXRhLWNvZGU9XCIke2Vyci5zdGF0dXN9XCI+JHtlcnIucmVzcG9uc2VUZXh0fTwvc2RjLWVycm9yPmA7XG4gICAgfSk7XG59XG5cbi8qKlxuICogcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIgcmVwbGFjZXMgYWxsIHJlZ2lzdGVyZWQgdGFncyBieSB0aGUgY29udHJvbGxlci5cbiAqIEluIHRoaXMgc3RlcCB0aGUgbGlmZS1jeWNsZSBzdGFydHMuXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBnaXZlbiBjb250YWluZXJcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBwYXJlbnQgY29udG9sbGVyIHN1cnJvdW5kZWQgdGhlIGNvbnRhaW5lclxuICovXG5mdW5jdGlvbiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyKSB7XG4gICAgcGFyZW50Q29udHJvbGxlciA9IHBhcmVudENvbnRyb2xsZXIgfHwgJGNvbnRhaW5lci5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICAgIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihhcHAudGFnTmFtZXMsICRjb250YWluZXIsIHBhcmVudENvbnRyb2xsZXIpO1xufVxuXG4vKipcbiAqIHBhcnNlQ29udGVudFVybCB1c2VzIHRoZSBjb250ZW50IFVSTCBwcmVmaXggdG8gbWFyZ2UgdGhlXG4gKiBjb3JyZWN0IFVSTC4gQWxzbyBwYXJzZXMgdGhlIHVybCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gY29udHJvbGxlciBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcikge1xuICAgIGxldCB1cmwgPSBjb250cm9sbGVyLmNvbnRlbnRVcmw7XG4gICAgaWYgKGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsZXQgcmUgPSAvJVxcKChbXildKylcXClcXHcvZ207XG4gICAgICAgIGxldCBtYXRjaGVzO1xuICAgICAgICBjb250cm9sbGVyLl91cmxQYXJhbXMgPSBbXTtcbiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gcmUuZXhlYyh1cmwpKSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5fdXJsUGFyYW1zLnB1c2gobWF0Y2hlc1sxXSk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmNvbnRlbnRSZWxvYWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHBhcmFtcyA9IGdldFVybFBhcmFtKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuJGNvbnRhaW5lcik7XG4gICAgaWYgKGNvbnRyb2xsZXIuX3VybFBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgdXJsID0gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29udHJvbGxlci5wYXJzZWRDb250ZW50VXJsID0gdXJsO1xuXG4gICAgcmV0dXJuIHt1cmw6IHVybCwgYXJnczogcGFyYW1zW3BhcmFtcy5sZW5ndGggLSAxXX07XG59XG5cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2xsZXIoJGVsZW0pIHtcbiAgICBpZiAoJGVsZW0uaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICAgICAgcmV0dXJuICRlbGVtLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgICB9XG4gICAgcmV0dXJuICRlbGVtLmNsb3Nlc3QoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xufVxuXG4vKipcbiAqIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICogVGhlIGNvbnRlbnQgaXMgc2F2ZWQgYXMgalF1ZXJ5IG9iamVjdCB0byB0aGUgY29udHJvbGxlci4kY29udGVudCBwcm9wZXJ0eSBvZlxuICogdGhlIGNvbnRyb2xsZXIuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICBsZXQgZ2V0RWxlbWVudHMgPSB7YXJnczoge319O1xuICAgIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICAgICAgZ2V0RWxlbWVudHMgPSBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlciwgY29udHJvbGxlci5jb250ZW50VXJsKTtcbiAgICAgICAgY29udHJvbGxlci5jb250ZW50VXJsID0gZ2V0RWxlbWVudHMudXJsO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLmNvbnRlbnRVcmwsIGdldEVsZW1lbnRzLmFyZ3MsIGNvbnRyb2xsZXIuX3RhZ05hbWUsIGNvbnRyb2xsZXIuY29udGVudFJlbG9hZClcbiAgICBdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgIGxldCBodG1sRmlsZSA9IHJlc3VsdHNbMF07XG4gICAgICAgIGlmIChodG1sRmlsZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJChodG1sRmlsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJCgnPGRpdj48L2Rpdj4nKS5hcHBlbmQoaHRtbEZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG59XG5cbi8qKlxuICogcmVsb2FkSFRNTENvbnRyb2xsZXIgbG9hZHMgdGhlIGNvbnRlbnQgKEhUTUwpIG9mIGFcbiAqIENvbnRyb2xsZXIuIElmIHlvdSBoYXZlIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgVVJMIGlzIHJlZ2lzdGVyZWQsIGZvciB0aGlzXG4gKiBjb250cm9sbGVyIHRoZSBvcmlnaW4gY29udGVudCBVUkwgaXMgaWdub3JlZC5cbiAqXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPGpRdWVyeT59IC0gdGhlIHByb21pc2Ugd2FpdHMgdG8gdGhlIGZpbGVzIGFyZSBsb2FkZWQuIGl0IHJldHVybnMgdGhlIGpRdWVyeSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRIVE1MQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgaWYgKGNvbnRyb2xsZXIuY29udGVudFVybCkge1xuICAgICAgICBsZXQgZ2V0RWxlbWVudHMgPSBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlciwgY29udHJvbGxlci5jb250ZW50VXJsKTtcbiAgICAgICAgY29udHJvbGxlci5jb250ZW50VXJsID0gZ2V0RWxlbWVudHMudXJsO1xuICAgICAgICByZXR1cm4gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIuY29udGVudFVybCwgZ2V0RWxlbWVudHMuYXJncywgY29udHJvbGxlci5fdGFnTmFtZSwgY29udHJvbGxlci5jb250ZW50UmVsb2FkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIHJlc29sdmUoJCgpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0XG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoJGVsZW1lbnQsIHRhZ05hbWUsIHN1cGVyVGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpIHtcbiAgICBsZXQgY29udHJvbGxlciA9ICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gICAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKCRlbGVtZW50LCBjb250cm9sbGVyKTtcbiAgICB9XG5cbiAgICBjb250cm9sbGVyID0gY29udHJvbGxlckZhY3RvcnkocGFyZW50Q29udHJvbGxlciwgJGVsZW1lbnQsIHRhZ05hbWUsIHN1cGVyVGFnTmFtZUxpc3QpO1xuICAgICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgY29udHJvbGxlcik7XG4gICAgJGVsZW1lbnQuYWRkQ2xhc3MoQ09OVFJPTExFUl9DTEFTUyk7XG4gICAgcmV0dXJuIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zKGNvbnRyb2xsZXIsICRlbGVtZW50KTtcbn1cblxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCBlbXB0aWVzIHRoZSByZWdpc3RlcmVkIHRhZyBhbmQgcmVwbGFjZXMgaXQgYnkgdGhlIGNvbnRyb2xsZXJcbiAqIGNvbnRlbnQuIEl0IHNldHMgdGhlIENTUyB0YWdzIGZvciB0aGUgcmVsYXRpb24gd2l0aCB0aGUgQ1NTIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQoY29udHJvbGxlciwgJGh0bWwpIHtcbiAgICBpZiAoJGh0bWwgJiYgJGh0bWwubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250cm9sbGVyLiRjb250YWluZXIuZW1wdHkoKTtcbiAgICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fdGFnTmFtZSwgJycpO1xuICAgICAgICBmb3IgKGxldCBtaXhpbktleSBpbiBjb250cm9sbGVyLl9taXhpbnMpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX21peGluc1ttaXhpbktleV0uX3RhZ05hbWUsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXBwZW5kKCRodG1sKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoY29udHJvbGxlci4kY29udGFpbmVyLCBjb250cm9sbGVyKTtcbn1cblxuXG4vKipcbiAqIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIEZpbmRzIGFsbCByZWdpc3RlcmVkIHRhZ3MgaW4gYSBjb250YWluZXIuIEJ1dCBpdCBpZ25vcmVzXG4gKiByZWdpc3RlcmVkIHRhZ3MgaW4gcmVnaXN0ZXJlZCB0YWdzLiBGb3IgZWFjaCByZWdpc3RlcmVkIHRhZyBpdCBsb2FkcyB0aGUgY29udGVudC5cbiAqIEFmdGVyd2FyZHMgaXQgc3RhcnRzIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSBjb250cm9sbGVyLiBJIHRoZSBuZXh0IHN0ZXAgaXQgc3RhcnRzIHRoZVxuICogcHJvY2VkdXJlIGZvciB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGNvbnRyb2xsZXIgdGFnLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTGlzdCAtIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgdGFnc1xuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyIHRvIGZpbmQgdGhlIHRhZ3NcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcih0YWdMaXN0LCAkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgICAgbGV0IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMgPSBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ0xpc3QsIHBhcmVudENvbnRyb2xsZXIpO1xuICAgICAgICBsZXQgdGFnQ291bnQgPSB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDtcblxuICAgICAgICBpZiAodGFnQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBlbGVtZW50SW5kZXggPSAwOyBlbGVtZW50SW5kZXggPCB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDsgZWxlbWVudEluZGV4KyspIHtcbiAgICAgICAgICAgIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5kb20sXG4gICAgICAgICAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnRhZyxcbiAgICAgICAgICAgICAgICB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzW2VsZW1lbnRJbmRleF0uc3VwZXIsXG4gICAgICAgICAgICAgICAgcGFyZW50Q29udHJvbGxlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGFnQ291bnQtLTtcbiAgICAgICAgICAgICAgICBpZiAodGFnQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIF9yZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuJGNvbnRhaW5lcilcbn1cbmZ1bmN0aW9uIF9yZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRkb20pIHtcbiAgICBjb25zdCBwbGlzdCA9IFtdO1xuXG4gICAgJGRvbS5maW5kKGAuX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIuc2RjX3V1aWRfJHtjb250cm9sbGVyLl91dWlkfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgIGxldCByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmKCR0aGlzLmhhc0NsYXNzKGBfd2l0aF9oYW5kbGVyYCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICR0aGlzLmRhdGEoJ2hhbmRsZXInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250cm9sbGVyX2hhbmRsZXIgPSB0aGlzLnRhZ05hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9edGhpcy4vLCAnJyk7XG4gICAgICAgICAgICBpZiAoY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5iaW5kKGNvbnRyb2xsZXIpKCR0aGlzLmRhdGEoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBsaXN0LnB1c2goUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbigoeCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRuZXdfY29udGVudCA9ICQoYDxkaXY+PC9kaXY+YCk7XG4gICAgICAgICAgICAgICAgJG5ld19jb250ZW50LmFwcGVuZCh4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIodGFnTGlzdCgpLCAkbmV3X2NvbnRlbnQsIGNvbnRyb2xsZXIpLnRoZW4oKCk9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyLCAkbmV3X2NvbnRlbnQpLnRoZW4oKCk9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5zYWZlRW1wdHkoKS50ZXh0KCcnKS5hcHBlbmQoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHBsaXN0KTtcbn0iXSwibmFtZXMiOlsiY29udHJvbGxlckZhY3RvcnkiLCJydW5Db250cm9sRmxvd0Z1bmN0aW9ucyIsInRhZ0xpc3QiLCJnZXRVcmxQYXJhbSIsImFwcCIsInRyaWdnZXIiLCJodG1sRmlsZXMiLCJEQVRBX0NPTlRST0xMRVJfS0VZIiwiQ09OVFJPTExFUl9DTEFTUyIsImNsZWFuQ2FjaGUiLCJmaW5kU2RjVGdzIiwiJGNvbnRhaW5lciIsInRhZ05hbWVMaXN0IiwicGFyZW50Q29udHJvbGxlciIsIiRjaGlsZHJlbiIsImNoaWxkcmVuIiwiZW1wdHlMaXN0IiwiZWFjaCIsIl8iLCJlbGVtZW50IiwiJGVsZW1lbnQiLCIkIiwidGFnTmFtZSIsInByb3AiLCJ0b0xvd2VyQ2FzZSIsInNwbGl0IiwiaW5BcnJheSIsInB1c2giLCJ0YWciLCJzdXBlciIsInNwbGljZSIsImRvbSIsInN0YXJ0c1dpdGgiLCJhZGRDbGFzcyIsIl91dWlkIiwiY29uY2F0IiwicmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlciIsImNvbnRyb2xsZXIiLCJ1cmwiLCJ1cmxWYWx1ZXMiLCJrZXlfaWR4IiwiX3VybFBhcmFtcyIsImhhc093blByb3BlcnR5Iiwia2V5IiwicmUiLCJSZWdFeHAiLCJyZXBsYWNlIiwic2hpZnQiLCJsb2FkSFRNTEZpbGUiLCJwYXRoIiwiYXJncyIsImhhcmRSZWxvYWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlZFUlNJT04iLCJfbWV0aG9kIiwiZ2V0IiwidGhlbiIsImRhdGEiLCJjYXRjaCIsImVyciIsImNvbnRyb2xsZXJfbmFtZSIsInN0YXR1cyIsInJlc3BvbnNlSlNPTiIsInJlc3BvbnNlVGV4dCIsInJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyIiwicmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJ0YWdOYW1lcyIsInBhcnNlQ29udGVudFVybCIsImNvbnRlbnRVcmwiLCJsZW5ndGgiLCJtYXRjaGVzIiwiZXhlYyIsImNvbnRlbnRSZWxvYWQiLCJwYXJhbXMiLCJwYXJzZWRDb250ZW50VXJsIiwiZ2V0Q29udHJvbGxlciIsIiRlbGVtIiwiaGFzQ2xhc3MiLCJjbG9zZXN0IiwibG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIiLCJnZXRFbGVtZW50cyIsImFsbCIsIl90YWdOYW1lIiwicmVzdWx0cyIsImh0bWxGaWxlIiwiYXBwZW5kIiwicmVsb2FkSFRNTENvbnRyb2xsZXIiLCJydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lciIsInN1cGVyVGFnTmFtZUxpc3QiLCJydW5Db250cm9sbGVyRmlsbENvbnRlbnQiLCIkaHRtbCIsImVtcHR5IiwiYXR0ciIsIm1peGluS2V5IiwiX21peGlucyIsInRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMiLCJ0YWdDb3VudCIsImVsZW1lbnRJbmRleCIsInJlbG9hZE1ldGhvZEhUTUwiLCJfcmVsb2FkTWV0aG9kSFRNTCIsIiRkb20iLCJwbGlzdCIsImZpbmQiLCIkdGhpcyIsInJlc3VsdCIsInVuZGVmaW5lZCIsImNvbnRyb2xsZXJfaGFuZGxlciIsImJpbmQiLCJ4IiwiJG5ld19jb250ZW50Iiwic2FmZUVtcHR5IiwidGV4dCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n");
117
+ 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 */ 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 = {};\nconst DATA_CONTROLLER_KEY = '_controller_';\nconst CONTROLLER_CLASS = '_sdc_controller_';\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(`_bind_to_update_handler sdc_uuid_${parentController._uuid}`);\n } else {\n emptyList = emptyList.concat(findSdcTgs($element, tagNameList, parentController));\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 (controller._urlParams.hasOwnProperty(key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n url = url.replace(re, \"\" + urlValues.shift());\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 path - a content URL from the controller.\n * @param {object} args - get args.\n * @param tag - a normalized tag-name as string.\n * @param hardReload - true if the file has to be reloaded every time.\n * @returns {Promise<Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(path, args, tag, hardReload) {\n if (!path) {\n return Promise.resolve(false);\n } else if (htmlFiles[tag]) {\n return Promise.resolve(htmlFiles[tag]);\n }\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = 'content';\n return $.get(path, args).then(function (data) {\n if (!hardReload) {\n htmlFiles[tag] = data;\n }\n return data;\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 }\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('navLoaded', {\n 'controller_name': () => err.status\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 */\nfunction replaceAllTagElementsInContainer($container, parentController) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $container, parentController);\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 {string} - 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 let 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 controller.parsedContentUrl = url;\n return {\n url: url,\n args: params[params.length - 1]\n };\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 = {\n args: {}\n };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller, controller.contentUrl);\n controller.contentUrl = getElements.url;\n }\n return Promise.all([loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload)]).then(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 return null;\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, controller.contentUrl);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload);\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 * @returns {boolean}\n */\nfunction runReplaceTagElementsInContainer($element, tagName, superTagNameList, parentController) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller);\n }\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(parentController, $element, tagName, superTagNameList);\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, $element);\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 * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html) {\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 return replaceAllTagElementsInContainer(controller.$container, controller);\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 */\nfunction replaceTagElementsInContainer(tagList, $container, parentController) {\n return new Promise(resolve => {\n let tagDescriptionElements = findSdcTgs($container, tagList, parentController);\n let tagCount = tagDescriptionElements.length;\n if (tagCount === 0) {\n return resolve();\n }\n for (let elementIndex = 0; elementIndex < tagDescriptionElements.length; elementIndex++) {\n runReplaceTagElementsInContainer(tagDescriptionElements[elementIndex].dom, tagDescriptionElements[elementIndex].tag, tagDescriptionElements[elementIndex].super, parentController).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\nfunction reloadMethodHTML(controller) {\n return _reloadMethodHTML(controller, controller.$container);\n}\nfunction _reloadMethodHTML(controller, $dom) {\n const plist = [];\n $dom.find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`).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.toLowerCase().replace(/^this./, '');\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n if (result !== undefined) {\n if (typeof result === 'function') {\n result = result.bind(controller)($this.data());\n }\n plist.push(Promise.resolve(result).then(x => {\n const $new_content = $(`<div></div>`);\n $new_content.append(x);\n return replaceTagElementsInContainer((0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.tagList)(), $new_content, controller).then(() => {\n return _reloadMethodHTML(controller, $new_content).then(() => {\n $this.safeEmpty().text('').append(x);\n return true;\n });\n });\n }));\n }\n });\n return Promise.all(plist);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q3VCLENBQUMsQ0FBQztZQUNwQyxPQUFPLElBQUk7VUFDZixDQUFDLENBQUM7UUFDTixDQUFDLENBQUM7TUFDTixDQUFDLENBQUMsQ0FBQztJQUNQO0VBRUosQ0FBQyxDQUFDO0VBRUYsT0FBT3pELE9BQU8sQ0FBQzhCLEdBQUcsQ0FBQ29CLEtBQUssQ0FBQztBQUM3QiIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdmlldy5qcz8yNGI1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y29udHJvbGxlckZhY3RvcnksIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zLCB0YWdMaXN0fSBmcm9tIFwiLi9zZGNfY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IHtnZXRVcmxQYXJhbX0gZnJvbSBcIi4vc2RjX3BhcmFtcy5qc1wiO1xuaW1wb3J0IHthcHB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQge3RyaWdnZXJ9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxuLyoqXG4gKiBMaXN0IG9mIEhUTUwgZmlsZXMuXG4gKiBAdHlwZSB7e319XG4gKi9cbmxldCBodG1sRmlsZXMgPSB7fTtcblxuZXhwb3J0IGNvbnN0IERBVEFfQ09OVFJPTExFUl9LRVkgPSAnX2NvbnRyb2xsZXJfJztcbmV4cG9ydCBjb25zdCBDT05UUk9MTEVSX0NMQVNTID0gJ19zZGNfY29udHJvbGxlcl8nO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkNhY2hlKCkge1xuICAgIGh0bWxGaWxlcyA9IHt9O1xufVxuXG4vKipcbiAqIGZpbmRTZGNUZ3MgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEl0IGNvbGxlY3RzIGFsbCB0aG9zZVxuICogZG9tcyBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluaW5nIGFsc28gdGhlIHRhZyBuYW1lIHRoZSBkb20gYW5kIHRoZSB0YWdcbiAqIG5hbWVzIG9mIHRoZSBzdXBlciBjb250cm9sbGVyXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHRhZ05hbWVMaXN0IC0gYSBzdHJpbmcgbGlzdCB3aXRoIHRhZyBuYW1lcy5cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcmV0dXJuIHtBcnJheX0gLSBhIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhbGwgcmVnaXN0ZXIgdGFncyBmb3VuZFxuICovXG5mdW5jdGlvbiBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSB7XG4gICAgaWYgKCEkY29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0ICRjaGlsZHJlbiA9ICRjb250YWluZXIuY2hpbGRyZW4oKTtcbiAgICBsZXQgZW1wdHlMaXN0ID0gW107XG4gICAgJGNoaWxkcmVuLmVhY2goZnVuY3Rpb24gKF8sIGVsZW1lbnQpIHtcbiAgICAgICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgICAgbGV0IHRhZ05hbWUgPSAkZWxlbWVudC5wcm9wKCd0YWdOYW1lJykudG9Mb3dlckNhc2UoKS5zcGxpdCgnXycpO1xuICAgICAgICBpZiAoJC5pbkFycmF5KHRhZ05hbWVbMF0sIHRhZ05hbWVMaXN0KSA+PSAwKSB7XG4gICAgICAgICAgICBlbXB0eUxpc3QucHVzaCh7XG4gICAgICAgICAgICAgICAgdGFnOiB0YWdOYW1lWzBdLFxuICAgICAgICAgICAgICAgIHN1cGVyOiB0YWdOYW1lLnNwbGljZSgxKSB8fCBbXSxcbiAgICAgICAgICAgICAgICBkb206ICRlbGVtZW50XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWVbMF0uc3RhcnRzV2l0aCgndGhpcy4nKSkge1xuICAgICAgICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoYF9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyIHNkY191dWlkXyR7cGFyZW50Q29udHJvbGxlci5fdXVpZH1gKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW1wdHlMaXN0ID0gZW1wdHlMaXN0LmNvbmNhdChmaW5kU2RjVGdzKCRlbGVtZW50LCB0YWdOYW1lTGlzdCwgcGFyZW50Q29udHJvbGxlcikpXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlbXB0eUxpc3Q7XG59XG5cbi8qKlxuICogcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlciBmaWxscyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBjb250ZW50XG4gKiB1cmwgdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSB0YWcgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHBhcmFtIHVybCAtIHRoZSBvcmlnaW4gY29udGVudCBVUkxcbiAqIEBwYXJhbSB1cmxWYWx1ZXMgLSB2YWx1ZXMgZm9yIHRoZSB1cmwgcGxhY2Vob2xkZXIuIEluIHNhbWUgb3JkZXIhIVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY29ycmVjdCBVUkwgd2l0aCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCB1cmxWYWx1ZXMpIHtcbiAgICBmb3IgKGxldCBrZXlfaWR4IGluIGNvbnRyb2xsZXIuX3VybFBhcmFtcykge1xuICAgICAgICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmhhc093blByb3BlcnR5KGtleV9pZHgpKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gY29udHJvbGxlci5fdXJsUGFyYW1zW2tleV9pZHhdO1xuICAgICAgICAgICAgbGV0IHJlID0gUmVnRXhwKFwiJVxcXFwoXCIgKyBrZXkgKyBcIlxcXFwpXFxcXHdcIiwgXCJnbVwiKTtcbiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKHJlLCBcIlwiICsgdXJsVmFsdWVzLnNoaWZ0KCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybDtcbn1cblxuLyoqXG4gKiBsb2FkSFRNTEZpbGUgbG9hZHMgdGhlIEhUTUwgY29udGVudCBmaWxlIGZyb20gdGhlIHNlcnZlciB2aWEgYWpheCByZXF1ZXN0LlxuICpcbiAqIElmIHRoZSBIVE1MIGZpbGUgaXMgbG9hZGVkIGFscmVhZHkgdGhlIGZ1bmN0aW9uIHRha2VzIG5vIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIGEgY29udGVudCBVUkwgZnJvbSB0aGUgY29udHJvbGxlci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gZ2V0IGFyZ3MuXG4gKiBAcGFyYW0gdGFnIC0gYSBub3JtYWxpemVkIHRhZy1uYW1lIGFzIHN0cmluZy5cbiAqIEBwYXJhbSBoYXJkUmVsb2FkIC0gdHJ1ZSBpZiB0aGUgZmlsZSBoYXMgdG8gYmUgcmVsb2FkZWQgZXZlcnkgdGltZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fSAtIHdhaXRzIGZvciB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIGxvYWRIVE1MRmlsZShwYXRoLCBhcmdzLCB0YWcsIGhhcmRSZWxvYWQpIHtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChodG1sRmlsZXNbdGFnXSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGh0bWxGaWxlc1t0YWddKVxuICAgIH1cblxuICAgIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICAgIGFyZ3MuX21ldGhvZCA9ICdjb250ZW50JztcblxuICAgIHJldHVybiAkLmdldChwYXRoLCBhcmdzKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICghaGFyZFJlbG9hZCkge1xuICAgICAgICAgICAgaHRtbEZpbGVzW3RhZ10gPSBkYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gMzAxKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gZXJyLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIHRyaWdnZXIoJ19SZWRpcmVjdE9uVmlldycsIGRhdGFbJ3VybC1saW5rJ10pO1xuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXIoJ25hdkxvYWRlZCcsIHsnY29udHJvbGxlcl9uYW1lJzogKCk9PiBlcnIuc3RhdHVzfSk7XG5cbiAgICAgICAgdGhyb3cgYDxzZGMtZXJyb3IgZGF0YS1jb2RlPVwiJHtlcnIuc3RhdHVzfVwiPiR7ZXJyLnJlc3BvbnNlVGV4dH08L3NkYy1lcnJvcj5gO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyIHJlcGxhY2VzIGFsbCByZWdpc3RlcmVkIHRhZ3MgYnkgdGhlIGNvbnRyb2xsZXIuXG4gKiBJbiB0aGlzIHN0ZXAgdGhlIGxpZmUtY3ljbGUgc3RhcnRzLlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0gZ2l2ZW4gY29udGFpbmVyXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gcGFyZW50IGNvbnRvbGxlciBzdXJyb3VuZGVkIHRoZSBjb250YWluZXJcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoJGNvbnRhaW5lciwgcGFyZW50Q29udHJvbGxlcikge1xuICAgIHBhcmVudENvbnRyb2xsZXIgPSBwYXJlbnRDb250cm9sbGVyIHx8ICRjb250YWluZXIuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKTtcbiAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoYXBwLnRhZ05hbWVzLCAkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKiBwYXJzZUNvbnRlbnRVcmwgdXNlcyB0aGUgY29udGVudCBVUkwgcHJlZml4IHRvIG1hcmdlIHRoZVxuICogY29ycmVjdCBVUkwuIEFsc28gcGFyc2VzIHRoZSB1cmwgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpIHtcbiAgICBsZXQgdXJsID0gY29udHJvbGxlci5jb250ZW50VXJsO1xuICAgIGlmIChjb250cm9sbGVyICYmIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbGV0IHJlID0gLyVcXCgoW14pXSspXFwpXFx3L2dtO1xuICAgICAgICBsZXQgbWF0Y2hlcztcbiAgICAgICAgY29udHJvbGxlci5fdXJsUGFyYW1zID0gW107XG4gICAgICAgIHdoaWxlICgobWF0Y2hlcyA9IHJlLmV4ZWModXJsKSkpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5wdXNoKG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgY29udHJvbGxlci5jb250ZW50UmVsb2FkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwYXJhbXMgPSBnZXRVcmxQYXJhbShjb250cm9sbGVyLCBjb250cm9sbGVyLiRjb250YWluZXIpO1xuICAgIGlmIChjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgIHVybCA9IHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnRyb2xsZXIucGFyc2VkQ29udGVudFVybCA9IHVybDtcblxuICAgIHJldHVybiB7dXJsOiB1cmwsIGFyZ3M6IHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV19O1xufVxuXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICogQHJldHVybiB7QWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sbGVyKCRlbGVtKSB7XG4gICAgaWYgKCRlbGVtLmhhc0NsYXNzKENPTlRST0xMRVJfQ0xBU1MpKSB7XG4gICAgICAgIHJldHVybiAkZWxlbS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG4gICAgfVxuICAgIHJldHVybiAkZWxlbS5jbG9zZXN0KGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbn1cblxuLyoqXG4gKiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqIFRoZSBjb250ZW50IGlzIHNhdmVkIGFzIGpRdWVyeSBvYmplY3QgdG8gdGhlIGNvbnRyb2xsZXIuJGNvbnRlbnQgcHJvcGVydHkgb2ZcbiAqIHRoZSBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGpRdWVyeT59IC0gdGhlIHByb21pc2Ugd2FpdHMgdG8gdGhlIGZpbGVzIGFyZSBsb2FkZWQuIGl0IHJldHVybnMgdGhlIGpRdWVyeSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgbGV0IGdldEVsZW1lbnRzID0ge2FyZ3M6IHt9fTtcbiAgICBpZiAoY29udHJvbGxlci5jb250ZW50VXJsKSB7XG4gICAgICAgIGdldEVsZW1lbnRzID0gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuY29udGVudFVybCk7XG4gICAgICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICBsb2FkSFRNTEZpbGUoY29udHJvbGxlci5jb250ZW50VXJsLCBnZXRFbGVtZW50cy5hcmdzLCBjb250cm9sbGVyLl90YWdOYW1lLCBjb250cm9sbGVyLmNvbnRlbnRSZWxvYWQpXG4gICAgXSkudGhlbihmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgICBsZXQgaHRtbEZpbGUgPSByZXN1bHRzWzBdO1xuICAgICAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQoaHRtbEZpbGUpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQoJzxkaXY+PC9kaXY+JykuYXBwZW5kKGh0bWxGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlbG9hZEhUTUxDb250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkSFRNTENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICAgICAgbGV0IGdldEVsZW1lbnRzID0gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuY29udGVudFVybCk7XG4gICAgICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgICAgICAgcmV0dXJuIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLmNvbnRlbnRVcmwsIGdldEVsZW1lbnRzLmFyZ3MsIGNvbnRyb2xsZXIuX3RhZ05hbWUsIGNvbnRyb2xsZXIuY29udGVudFJlbG9hZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICByZXNvbHZlKCQoKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWVcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdFxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKCRlbGVtZW50LCB0YWdOYW1lLCBzdXBlclRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSB7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICAgIGlmIChjb250cm9sbGVyKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkZWxlbWVudCwgY29udHJvbGxlcik7XG4gICAgfVxuXG4gICAgY29udHJvbGxlciA9IGNvbnRyb2xsZXJGYWN0b3J5KHBhcmVudENvbnRyb2xsZXIsICRlbGVtZW50LCB0YWdOYW1lLCBzdXBlclRhZ05hbWVMaXN0KTtcbiAgICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIGNvbnRyb2xsZXIpO1xuICAgICRlbGVtZW50LmFkZENsYXNzKENPTlRST0xMRVJfQ0xBU1MpO1xuICAgIHJldHVybiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCAkZWxlbWVudCk7XG59XG5cblxuLyoqXG4gKiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQgZW1wdGllcyB0aGUgcmVnaXN0ZXJlZCB0YWcgYW5kIHJlcGxhY2VzIGl0IGJ5IHRoZSBjb250cm9sbGVyXG4gKiBjb250ZW50LiBJdCBzZXRzIHRoZSBDU1MgdGFncyBmb3IgdGhlIHJlbGF0aW9uIHdpdGggdGhlIENTUyBmaWxlcy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0ganMgY29udHJvbGxlciBpbnN0YW5jZVxuICogQHBhcmFtIHtqcXVlcnl9ICRodG1sIC0galF1ZXJ5IGxvYWRlZCBjb250ZW50XG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sKSB7XG4gICAgaWYgKCRodG1sICYmICRodG1sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmVtcHR5KCk7XG4gICAgICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX3RhZ05hbWUsICcnKTtcbiAgICAgICAgZm9yIChsZXQgbWl4aW5LZXkgaW4gY29udHJvbGxlci5fbWl4aW5zKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXR0cihjb250cm9sbGVyLl9taXhpbnNbbWl4aW5LZXldLl90YWdOYW1lLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmFwcGVuZCgkaHRtbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKGNvbnRyb2xsZXIuJGNvbnRhaW5lciwgY29udHJvbGxlcik7XG59XG5cblxuLyoqXG4gKiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lciBGaW5kcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGluIGEgY29udGFpbmVyLiBCdXQgaXQgaWdub3Jlc1xuICogcmVnaXN0ZXJlZCB0YWdzIGluIHJlZ2lzdGVyZWQgdGFncy4gRm9yIGVhY2ggcmVnaXN0ZXJlZCB0YWcgaXQgbG9hZHMgdGhlIGNvbnRlbnQuXG4gKiBBZnRlcndhcmRzIGl0IHN0YXJ0cyB0aGUgbGlmZSBjeWNsZSBvZiB0aGUgY29udHJvbGxlci4gSSB0aGUgbmV4dCBzdGVwIGl0IHN0YXJ0cyB0aGVcbiAqIHByb2NlZHVyZSBmb3IgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBjb250cm9sbGVyIHRhZy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHRhZ0xpc3QgLSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIHRhZ3NcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0galF1ZXJ5IGNvbnRhaW5lciB0byBmaW5kIHRoZSB0YWdzXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gY29udHJvbGxlciBpbiBzdXJyb3VuZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIodGFnTGlzdCwgJGNvbnRhaW5lciwgcGFyZW50Q29udHJvbGxlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICAgIGxldCB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzID0gZmluZFNkY1RncygkY29udGFpbmVyLCB0YWdMaXN0LCBwYXJlbnRDb250cm9sbGVyKTtcbiAgICAgICAgbGV0IHRhZ0NvdW50ID0gdGFnRGVzY3JpcHRpb25FbGVtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgZWxlbWVudEluZGV4ID0gMDsgZWxlbWVudEluZGV4IDwgdGFnRGVzY3JpcHRpb25FbGVtZW50cy5sZW5ndGg7IGVsZW1lbnRJbmRleCsrKSB7XG4gICAgICAgICAgICBydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcih0YWdEZXNjcmlwdGlvbkVsZW1lbnRzW2VsZW1lbnRJbmRleF0uZG9tLFxuICAgICAgICAgICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS50YWcsXG4gICAgICAgICAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnN1cGVyLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbnRyb2xsZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRhZ0NvdW50LS07XG4gICAgICAgICAgICAgICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlcikge1xuICAgIHJldHVybiBfcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyLCBjb250cm9sbGVyLiRjb250YWluZXIpXG59XG5mdW5jdGlvbiBfcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyLCAkZG9tKSB7XG4gICAgY29uc3QgcGxpc3QgPSBbXTtcblxuICAgICRkb20uZmluZChgLl9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyLnNkY191dWlkXyR7Y29udHJvbGxlci5fdXVpZH1gKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZigkdGhpcy5oYXNDbGFzcyhgX3dpdGhfaGFuZGxlcmApKSB7XG4gICAgICAgICAgICByZXN1bHQgPSAkdGhpcy5kYXRhKCdoYW5kbGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbGxlcl9oYW5kbGVyID0gdGhpcy50YWdOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXnRoaXMuLywgJycpO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuYmluZChjb250cm9sbGVyKSgkdGhpcy5kYXRhKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwbGlzdC5wdXNoKFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oKHgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkbmV3X2NvbnRlbnQgPSAkKGA8ZGl2PjwvZGl2PmApO1xuICAgICAgICAgICAgICAgICRuZXdfY29udGVudC5hcHBlbmQoeCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKHRhZ0xpc3QoKSwgJG5ld19jb250ZW50LCBjb250cm9sbGVyKS50aGVuKCgpPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJG5ld19jb250ZW50KS50aGVuKCgpPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2FmZUVtcHR5KCkudGV4dCgnJykuYXBwZW5kKHgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICB9KTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChwbGlzdCk7XG59Il0sIm5hbWVzIjpbImNvbnRyb2xsZXJGYWN0b3J5IiwicnVuQ29udHJvbEZsb3dGdW5jdGlvbnMiLCJ0YWdMaXN0IiwiZ2V0VXJsUGFyYW0iLCJhcHAiLCJ0cmlnZ2VyIiwiaHRtbEZpbGVzIiwiREFUQV9DT05UUk9MTEVSX0tFWSIsIkNPTlRST0xMRVJfQ0xBU1MiLCJjbGVhbkNhY2hlIiwiZmluZFNkY1RncyIsIiRjb250YWluZXIiLCJ0YWdOYW1lTGlzdCIsInBhcmVudENvbnRyb2xsZXIiLCIkY2hpbGRyZW4iLCJjaGlsZHJlbiIsImVtcHR5TGlzdCIsImVhY2giLCJfIiwiZWxlbWVudCIsIiRlbGVtZW50IiwiJCIsInRhZ05hbWUiLCJwcm9wIiwidG9Mb3dlckNhc2UiLCJzcGxpdCIsImluQXJyYXkiLCJwdXNoIiwidGFnIiwic3VwZXIiLCJzcGxpY2UiLCJkb20iLCJzdGFydHNXaXRoIiwiYWRkQ2xhc3MiLCJfdXVpZCIsImNvbmNhdCIsInJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIiLCJjb250cm9sbGVyIiwidXJsIiwidXJsVmFsdWVzIiwia2V5X2lkeCIsIl91cmxQYXJhbXMiLCJoYXNPd25Qcm9wZXJ0eSIsImtleSIsInJlIiwiUmVnRXhwIiwicmVwbGFjZSIsInNoaWZ0IiwibG9hZEhUTUxGaWxlIiwicGF0aCIsImFyZ3MiLCJoYXJkUmVsb2FkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJWRVJTSU9OIiwiX21ldGhvZCIsImdldCIsInRoZW4iLCJkYXRhIiwiY2F0Y2giLCJlcnIiLCJzdGF0dXMiLCJyZXNwb25zZUpTT04iLCJjb250cm9sbGVyX25hbWUiLCJyZXNwb25zZVRleHQiLCJyZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lciIsInJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIiwidGFnTmFtZXMiLCJwYXJzZUNvbnRlbnRVcmwiLCJjb250ZW50VXJsIiwibGVuZ3RoIiwibWF0Y2hlcyIsImV4ZWMiLCJjb250ZW50UmVsb2FkIiwicGFyYW1zIiwicGFyc2VkQ29udGVudFVybCIsImdldENvbnRyb2xsZXIiLCIkZWxlbSIsImhhc0NsYXNzIiwiY2xvc2VzdCIsImxvYWRGaWxlc0Zyb21Db250cm9sbGVyIiwiZ2V0RWxlbWVudHMiLCJhbGwiLCJfdGFnTmFtZSIsInJlc3VsdHMiLCJodG1sRmlsZSIsImFwcGVuZCIsInJlbG9hZEhUTUxDb250cm9sbGVyIiwicnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJzdXBlclRhZ05hbWVMaXN0IiwicnVuQ29udHJvbGxlckZpbGxDb250ZW50IiwiJGh0bWwiLCJlbXB0eSIsImF0dHIiLCJtaXhpbktleSIsIl9taXhpbnMiLCJ0YWdEZXNjcmlwdGlvbkVsZW1lbnRzIiwidGFnQ291bnQiLCJlbGVtZW50SW5kZXgiLCJyZWxvYWRNZXRob2RIVE1MIiwiX3JlbG9hZE1ldGhvZEhUTUwiLCIkZG9tIiwicGxpc3QiLCJmaW5kIiwiJHRoaXMiLCJyZXN1bHQiLCJ1bmRlZmluZWQiLCJjb250cm9sbGVyX2hhbmRsZXIiLCJiaW5kIiwieCIsIiRuZXdfY29udGVudCIsInNhZmVFbXB0eSIsInRleHQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n");
118
118
 
119
119
  /***/ })
120
120
 
@@ -1 +1 @@
1
- var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n;e.d(t,{wz:()=>ee,ms:()=>q,yA:()=>le,sD:()=>d,kb:()=>_,wH:()=>C,on:()=>N,YV:()=>k,eA:()=>m,YF:()=>E,WQ:()=>ae,QN:()=>ce,gV:()=>x});const r=/([^\s,]+)/g,s=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function o(){return n||(n=$("body")),n}function i(){return new Promise((function(e){e()}))}function l(e){return(e=(e=e.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))).replace(/[0-9]+/g,(e=>`-${e}`))).replace(/^[-]/g,"")}function a(e){return e.replace(/-./g,(e=>`${e[1].toUpperCase()}`))}const c=(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 h(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",u,!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 u(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 d(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 f(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function _(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function m(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 p(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),s={};for(let t in r)r.hasOwnProperty(t)&&t!==F&&!e.includes(t)&&(s[t]=r[t]);n=[];for(let t=0;t<e.length;t++){let s=e[t];r.hasOwnProperty(s)?n.push(r[s]):n.push("undefined")}return n.push(s),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let s=d(e[r],t);n.push(s)}return n}(r,n)}function g(e,t,n){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let o;var i;"function"==typeof e._on_init_params?o=e._on_init_params():o=(i=e.onInit.toString().replace(s,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(r)||[];let l=p(o,t,n._parentController);if(e.onInit.apply(n,l),n===e)for(let r in e._mixins)g(e._mixins[r],t,n)}let y={},v={};function w(){return Object.keys(v)}function O(e,t){if(e){let n=a(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function b(e,t,n,r){let s=[];r=function(e,t){e=(e=e.concat(v[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 v[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)s.push(v[e][0]);let o=new(function(e,...t){let n=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}get mixins(){return this._mixins}};return c(n,e),t.forEach((e=>{c(n,e)})),n}(v[n][0],...s));return o._tagName=n,O(e,o),o.$container=t,function(e,t){g(t,e,t)}(t,o),o}function C(e,t,n,r){let s=a(n);if(y[s]){let n=y[s];return O(e,n),n.$container=t,n}return b(e,t,n,r)}function k(e){const t=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=A(e,e.contentUrl),e.contentUrl=t.url),Promise.all([L(e.contentUrl,t.args,e._tagName,e.contentReload)]).then((function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null}))}(e).then((t=>!e.onLoad||e._onLoadDone?t:(e._onLoadDone=!0,(e.onLoad(t)||i()).then((()=>t)))))}(e).then((function(t){return function(e,t){return I(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){return e.refresh&&e.refresh()}(e))).catch((function(t){return I(e,t)}));return e.load_async?Promise.resolve():t}let P={},S={};function N(e,t){return E(e),S.hasOwnProperty(e)?t[S[e]]?void P[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function E(e,t){t||(t=e),S[e]||(S[e]=t,P[e]=[])}function q(e){for(let t in P)if(P.hasOwnProperty(t))for(let n=P[t].length;n>=0;n--)e===P[t][n]&&P[t].splice(n,1)}function x(e){let t=Array.apply(null,arguments);if(e=t.shift(),!P.hasOwnProperty(e)||!S.hasOwnProperty(e))return i();let n=P[e],r=S[e],s=[];for(let e=0;e<n.length;e++){let o=n[e][r].apply(n[e],t);void 0!==o&&s.push(o)}return Promise.all(s)}let R={};const F="_controller_",j="_sdc_controller_";function T(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(T(o,t,n))})),s}function L(e,t,n,r){return e?R[n]?Promise.resolve(R[n]):(t.VERSION=le.VERSION,t._method="content",$.get(e,t).then((function(e){return r||(R[n]=e),e})).catch((function(e){if(x("navLoaded",{controller_name:()=>e.status}),301===e.status)throw x("onNavLink",e.responseJSON["url-link"]),"<sdc-error data-code='301'></sdc-error>";throw`<sdc-error data-code="${e.status}">${e.responseText}</sdc-error>`}))):Promise.resolve(!1)}function U(e,t){return t=t||e.data(F),J(le.tagNames,e,t)}function A(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 n=function(e,t){return p(e._urlParams,t)}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(e._urlParams.hasOwnProperty(r)){let s=e._urlParams[r],o=RegExp("%\\("+s+"\\)\\w","gm");t=t.replace(o,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function M(e){return e.hasClass(j)?e.data(`${F}`):e.closest(`.${j}`).data(`${F}`)}function D(e,t,n,r){let s=e.data(F);return s?U(e,s):(s=C(r,e,t,n),e.data(F,s),e.addClass(j),k(s))}function I(e,t){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 U(e.$container,e)}function J(e,t,n){return new Promise((r=>{let s=T(t,e,n),o=s.length;if(0===o)return r();for(let e=0;e<s.length;e++)D(s[e].dom,s[e].tag,s[e].super,n).then((()=>{if(o--,0===o)return r()}))}))}function V(e){return G(e,e.$container)}function G(e,t){const n=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each((function(){const t=$(this);let r;if(t.hasClass("_with_handler"))r=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(r=e[t])}void 0!==r&&("function"==typeof r&&(r=r.bind(e)(t.data())),n.push(Promise.resolve(r).then((n=>{const r=$("<div></div>");return r.append(n),J(w(),r,e).then((()=>G(e,r).then((()=>(t.safeEmpty().text("").append(n),!0)))))}))))})),Promise.all(n)}let W=!1,B=!1,K=null;const z=25e3;let H={};function Q(){return B=!0,new Promise((e=>{K="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),K.onmessage=function(e){let t=JSON.parse(e.data);if(t.is_error)(t.msg||t.header)&&x("pushErrorMsg",t.header||"",t.msg||""),H[t.id]&&(H[t.id][1](t.data||null),delete H[t.id]);else if((t.msg||t.header)&&x("pushMsg",t.header||"",t.msg||""),t.type&&"sdc_recall"===t.type)H[t.id]&&(H[t.id][0](t.data),delete H[t.id]);else if(t.type&&"sdc_event"===t.type){let e=t.event;e&&x(e,t.payload)}else t.type&&"sdc_redirect"===t.type&&x("onNavLink",t.link)},K.onclose=function(){W&&console.error("SDC Socket closed unexpectedly"),W=!1;for(const[e,t]of Object.entries(H))t[1]({}),delete H[e];setTimeout((()=>{Q()}),1e3)},K.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),W)try{K.close()}catch(e){}},K.onopen=function(){W=!0,B=!1,e()}}))}function Y(){if(W){W=!1;try{K.close()}catch(e){}}}function X(){return new Promise((e=>W?e():B?void setTimeout((()=>{X().then((()=>{e()}))}),200):e(Q())))}class Z{constructor(e,t={}){this.values_list=[],this.values={},this.model_name=e,this.model_query=t,this._is_connected=!1,this._is_conneting_process=!1,this._auto_reconnect=!0,this.socket=null,this.open_request={},this.on_update=()=>{},this.on_create=()=>{},this.form_id=f()}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.values_list.length?{value:this.values_list[e],done:!1}:{value:null,done:!0})}}length(){return this.values_list.length}byPk(e){if(null!==e){let t=this.values_list.find((t=>t.pk===e));return t||(t={pk:e},this.values_list.push(t)),t}return{pk:e}}filter(e){return this.model_query=Object.assign({},this.model_query,e),this}load(){return this.isConnected().then((()=>{const e=f();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}))}listView(e={},t=null,n=null){let r=$('<div class="container-fluid">');return this.isConnected().then((()=>{const s=f();this.socket.send(JSON.stringify({event:"model",event_type:"list_view",event_id:s,args:{model_name:this.model_name,model_query:this.model_query,filter:e}})),this.open_request[s]=[e=>{r.append(e.html),le.refresh(r),t&&t(e)},e=>{n&&n(e)}]})),r}detailView(e=-1,t=null,n=null){let r,s=$('<div class="container-fluid">');return r=0!==this.values_list.length?this.isConnected():this.load(),r.then((()=>{-1===e&&(e=this.values_list[0].pk);const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:r,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[r]=[e=>{s.append(e.html),le.refresh(s),t&&t(e)},e=>{n&&n(e)}]})),s}syncFormToModel(e){return this.syncForm(e)}syncModelToForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));let t=this;e.each((function(){if(!this.hasAttribute("data-model_pk"))return;let e=$(this).data("model_pk"),n=t.byPk(e);for(let e of this.elements){let t=e.name;if(t&&""!==t)if("checkbox"===e.type)e.checked=n[t];else if("file"===e.type&&n[t]instanceof File){let r=new DataTransfer;r.items.add(n[t]),e.files=r}else $(e).val(n[t])}}))}syncForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));const t=this;let n=[];return e.each((function(){let e=$(this).data("model_pk"),r=t.byPk(e);for(let e of this.elements){let t=e.name;t&&""!==t&&("hidden"===e.type?r[t]=(s=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===s.toLowerCase():"undefined"!==s?"none"===s.toLowerCase()?null:s.match(/^-?\d+$/)?parseInt(s):s.match(/^-?\d+\.?\d+$/)?parseFloat(s):s.match(/^(['][^']*['])|(["][^"]*["])$/)?s.substring(1,s.length-1):s:void 0:"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}var s;return n.push(r),r})),this.values_list.length<=1&&n.length>0&&(this.values=n.at(-1)),n}createForm(e=null,t=null){let n=$('<div class="container-fluid">');return this.isConnected().then((()=>{const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"create_form",event_id:r,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[r]=[t=>{n.append(t.html);let r=n.closest("form").addClass(`sdc-model-create-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",null);r[0].hasAttribute("sdc_submit")||r.attr("sdc_submit","submitModelForm"),le.refresh(n),e&&e(t)},e=>{t&&t(e)}]})),n}editForm(e=-1,t=null,n=null){let r;r=0!==this.values_list.length?this.isConnected():this.load();let s=$('<div class="container-fluid">');return r.then((()=>{e<=-1&&(e=this.values_list.at(e).pk);const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"edit_form",event_id:r,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[r]=[n=>{s.append(n.html);let r=s.closest("form").addClass(`sdc-model-edit-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e);r[0].hasAttribute("sdc_submit")||r.attr("sdc_submit","submitModelForm"),le.refresh(s),t&&t(n)},e=>{n&&n(e)}]})),s}new(){return new Promise(((e,t)=>{const n=$("<form>").append(this.createForm((()=>{this.syncFormToModel(n),e()}),t))}))}save(e=-1){return this.isConnected().then((()=>{let t;t=e>-1?[this.byPk(e)]:this.values_list;let n=[];return t.forEach((e=>{const t=f();n.push(new Promise(((n,r)=>{this._readFiles(e).then((s=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:s}})),this.open_request[t]=[e=>{let t=JSON.parse(e.data.instance);this._parseServerRes(t),n(e)},r]}))})))})),Promise.all(n)}))}create(e=this.values){const t=f();return this.isConnected().then((()=>new Promise(((n,r)=>{this._readFiles(e).then((s=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:s}})),this.open_request[t]=[e=>{let t=JSON.parse(e.data.instance);this._parseServerRes(t),n(e)},r]}))}))))}delete(e=-1){-1===e&&(e=this.values?.pk);const t=f();return this.isConnected().then((()=>new Promise(((n,r)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[t]=[n,r]}))))}isConnected(){return new Promise(((e,t)=>{if(this._is_connected)e();else if(this._is_conneting_process){const[n,r]=this.open_request._connecting_process;this.open_request._connecting_process=[()=>{n(),e()},()=>{r(),t()}]}else this._is_conneting_process=!0,this.open_request._connecting_process=[()=>{},()=>{}],this._connectToServer().then((()=>{e(this._checkConnection())}))}))}close(){this.socket&&(this._auto_reconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket)}clean(){return this.values_list=[],this.values={},this}_readFiles(e){let t=[],n={};for(const[r,s]of Object.entries(e))s instanceof File&&t.push(new Promise(((e,t)=>{((r,s)=>{let o=new FileReader;o.onload=o=>{const i=f();this.open_request[i]=[e,t];let l=o.target.result,a=parseInt(Math.ceil(l.length/z));n[r]={id:i,file_name:s.name,field_name:r,content_length:s.size};for(let e=0;e<a;++e)this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:i,args:{chunk:l.slice(z*e,z*(e+1)),idx:e,number_of_chunks:a,file_name:s.name,field_name:r,content_length:s.size,content_type:s.type,model_name:this.model_name,model_query:this.model_query}}))},o.onerror=()=>{t()},o.readAsBinaryString(s)})(r,s)})));return Promise.all(t).then((()=>n))}_onMessage(e){let t=JSON.parse(e.data);if(t.is_error)this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][1](t),delete this.open_request[t.event_id]),(t.msg||t.header)&&x("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),delete this.open_request._connecting_process,this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&x("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),delete this.open_request._connecting_process;else if("load"===t.type){const e=JSON.parse(t.args.data);this.values_list=[],this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=this._parseServerRes(e);n="on_create"===t.type?this.on_create:this.on_update,n(r)}this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),delete this.open_request[t.event_id])}}_connectToServer(){return new Promise((e=>{const t=`${this.model_name}`+(this.model_id>0?`/${this.model_id}`:"");"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.model_name}, ${this.model_id}) Socket closed unexpectedly`),this._is_connected=!1;for(const[t,n]of Object.entries(this.open_request))n[1](e);this.open_request={},setTimeout((()=>{this._auto_reconnect&&this._connectToServer().then((()=>{}))}),1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._is_connected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}}))}_checkConnection(){const e=f();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}_parseServerRes(e){let t=[];for(let n of e){const e=n.pk,r=this.byPk(e);for(const[e,t]of Object.entries(n.fields))r[e]=t;t.push(r)}return 1===this.values_list.length?this.values=this.values_list.at(-1):this.values={},t}}class ee{constructor(){this._uuid=f(),this.contentUrl="",this.contentReload=!1,this.hasSubnavView=!1,this.events=[],this.load_async=!1,this.isEventsSet=!1,this._allEvents=null,this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName="",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){le.DEBUG&&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(){le.DEBUG&&console.DEBUG(Array.apply(null,arguments),this._tagName)}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}remove(){for(const e of this._models)e.close();let e=this._childController;for(let t in e)if(e.hasOwnProperty(t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){q(this);const e=a(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=Object.assign({},...e)}post(e,t){return le.post(this,e,t)}get(e,t){return le.get(this,e,t)}submitForm(e,t,n){return le.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){let s=f();return X().then((()=>{K.send(JSON.stringify({event:"sdc_call",id:s,controller:t,app:e,function:n,args:r}))})),new Promise(((e,t)=>{H[s]=[e,t]}))}(n[1],this._tagName,e,t);console.error("To use the serverCall function the contentUrl must be set: "+this.name)}newModel(e,t={}){let n=new Z(e,t);return this._models.push(n),n}find(e){return this.$container.find(e)}refresh(){return le.refresh(this.$container,this)}reload(){return le.reloadController(this)}submitModelForm(e,t){return this._submitModelForm(e,t)}_submitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let r=e.data("model");const s=r.syncForm(e);for(let t of s)n.push(new Promise(((n,s)=>{let o;o=null!==t.pk?r.save(t.pk):r.create(t),o.then((t=>{_(e),n(t)})).catch((t=>{m(e,$(t.html)),s(t)}))})))}return Promise.all(n).then((e=>Object.assign({},...e.flat())))}}const te=Object.keys(window).filter((e=>/^on/.test(e))).map((e=>e.slice(2)));function ne(e){let t=e.type;e.hasOwnProperty("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){if(!r&&(r=M(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 re(e){if(e.isEventsSet)return;const t=e.getEvents();for(let n in t)if(t.hasOwnProperty(n)){let r=t[n];for(let t in r)r.hasOwnProperty(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(" ")))}))}}const se={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])=>{e.startsWith("on")?n[0].addEventListener(e.substring(2).toLowerCase(),t):(se[e.toLowerCase()]&&(e=se[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};let oe,ie,le={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:y,rootController:null,_isInit:!1,_origin_trigger:null,init_sdc:()=>{le._isInit||(le._isInit=!0,le._origin_trigger?Y():(le._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return te.includes(t)||(te.push(t),$(window).on(t,ne)),le._origin_trigger.call(this,e)},le.updateJquery()),X(),function(){const e=$(window);te.forEach((t=>{e.off(t).on(t,ne)}))}(),le.rootController=le.rootController||new ee),le.tagNames=w();for(let[e,t]of Object.entries(le.Global))t.$container||(y[e].$container=o());return J(le.tagNames,o(),le.rootController)},updateJquery:()=>{$.fn.safeReplace=function(e){return le.safeReplace($(this),e)},$.fn.safeEmpty=function(){return le.safeEmpty($(this))},$.fn.safeRemove=function(){return le.safeRemove($(this))}},controllerToTag:e=>l(e.name).replace(/-controller$/,""),registerGlobal:e=>{let t=le.controllerToTag(e),n=new e;v[t]=[n,[]],n._tagName=t,window[a(t)]=y[a(t)]=n},cleanCache:()=>{R={}},register:e=>{let t=le.controllerToTag(e);return v[t]=[e,[]],e.prototype._tagName=t,{addMixin:(...e)=>{for(let n of e){let e;"string"==typeof n?e=l(n):n&&(e=le.controllerToTag(n)),v[t][1].push(e)}}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=le.CSRF_TOKEN,le.ajax(e,t,params,$.post)),get:(e,t,n)=>le.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=le.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?x("onNavLink",t["url-link"]):s.then((()=>{le.refresh(e.$container)}))})).catch(i)));return s},submitFormAndUpdateView:(e,t,n,r)=>{let s=new FormData(t);const o=e=>{e["url-link"]?x("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise(((l,a)=>{h(s,n||t.action,r||t.method).then(((t,n,r)=>{l(t,n,r),"redirect"===t.status?o(t):i.then((()=>{le.refresh(e.$container)}))})).catch(((e,t,n)=>{301===e.status?(e=e.responseJSON,o(e),l(e,t,n)):a(e,t,n)}))}));return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise(((s,o)=>{h(r,t||e.action,n||e.method).then(s).catch(o)}))},getController:e=>M(e),safeEmpty:e=>(e.children().each((function(e,t){let n=$(t);le.safeRemove(n)})),e),safeReplace:(e,t)=>(t.insertBefore(e),le.safeRemove(e)),safeRemove:e=>(e.each((function(){let e=$(this);e.data(`${F}`)&&e.data(`${F}`).remove()})),e.find(`.${j}`).each((function(){const e=$(this).data(`${F}`);e&&e.remove()})),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=A(e,e.contentUrl);return e.contentUrl=t.url,L(e.contentUrl,t.args,e._tagName,e.contentReload)}return new Promise((e=>{e($())}))}(e).then((t=>{let n=$(t);e._childController={},J(le.tagNames,n,e).then((()=>{le.safeEmpty(e.$container),e.$container.append(n),le.refresh(e.$container,e)}))})),refresh:(e,t)=>{if(t||(t=le.getController(e)),!t)return i();let n=t,r=[];for(;n;)n.isEventsSet=!1,r.unshift(n),n=n._parentController;return J(le.tagNames,t.$container,t).then((()=>{V(t).then((()=>{for(let e of r)re(e);t.onRefresh(e)}))}))}};const ae=Y,ce={get_controller:async function(e,t={},n=""){if(!jest)throw new Error("JEST is not defined");oe||(ie=$.ajax.bind($),oe=jest.spyOn($,"ajax"),oe.mockImplementation((function(e){return ie(e).then((e=>e)).catch((e=>e))})));const r=$("body");le.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);return r.append(o),le._isInit=!1,le.cleanCache(),await le.init_sdc(),le.getController(s)}};var he=t.wz,ue=t.ms,de=t.yA,fe=t.sD,_e=t.kb,me=t.wH,pe=t.on,ge=t.YV,ye=t.eA,ve=t.YF,we=t.WQ,$e=t.QN,Oe=t.gV;export{he as AbstractSDC,ue as allOff,de as app,fe as checkIfParamNumberBoolOrString,_e as clearErrorsInForm,me as controllerFactory,pe as on,ge as runControlFlowFunctions,ye as setErrorsInForm,ve as setEvent,we as socketReconnect,$e as test_utils,Oe as trigger};
1
+ var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n;e.d(t,{wz:()=>ee,ms:()=>q,yA:()=>le,sD:()=>d,kb:()=>_,wH:()=>k,on:()=>N,YV:()=>C,eA:()=>m,YF:()=>E,WQ:()=>ae,QN:()=>ce,gV:()=>F});const r=/([^\s,]+)/g,s=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function o(){return n||(n=$("body")),n}function i(){return new Promise((function(e){e()}))}function l(e){return(e=(e=e.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))).replace(/[0-9]+/g,(e=>`-${e}`))).replace(/^[-]/g,"")}function a(e){return e.replace(/-./g,(e=>`${e[1].toUpperCase()}`))}const c=(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 h(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",u,!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 u(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 d(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 f(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function _(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function m(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 p(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),s={};for(let t in r)r.hasOwnProperty(t)&&t!==x&&!e.includes(t)&&(s[t]=r[t]);n=[];for(let t=0;t<e.length;t++){let s=e[t];r.hasOwnProperty(s)?n.push(r[s]):n.push("undefined")}return n.push(s),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let s=d(e[r],t);n.push(s)}return n}(r,n)}function g(e,t,n){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let o;var i;"function"==typeof e._on_init_params?o=e._on_init_params():o=(i=e.onInit.toString().replace(s,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(r)||[];let l=p(o,t,n._parentController);if(e.onInit.apply(n,l),n===e)for(let r in e._mixins)g(e._mixins[r],t,n)}let y={},v={};function w(){return Object.keys(v)}function b(e,t){if(e){let n=a(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function O(e,t,n,r){let s=[];r=function(e,t){e=(e=e.concat(v[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 v[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)s.push(v[e][0]);let o=new(function(e,...t){let n=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}get mixins(){return this._mixins}};return c(n,e),t.forEach((e=>{c(n,e)})),n}(v[n][0],...s));return o._tagName=n,b(e,o),o.$container=t,function(e,t){g(t,e,t)}(t,o),o}function k(e,t,n,r){let s=a(n);if(y[s]){let n=y[s];return b(e,n),n.$container=t,n}return O(e,t,n,r)}function C(e){const t=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=D(e,e.contentUrl),e.contentUrl=t.url),Promise.all([T(e.contentUrl,t.args,e._tagName,e.contentReload)]).then((function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null}))}(e).then((t=>!e.onLoad||e._onLoadDone?t:(e._onLoadDone=!0,(e.onLoad(t)||i()).then((()=>t)))))}(e).then((function(t){return function(e,t){return I(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){return e.refresh&&e.refresh()}(e))).catch((function(t){return I(e,t)}));return e.load_async?Promise.resolve():t}let P={},S={};function N(e,t){return E(e),S.hasOwnProperty(e)?t[S[e]]?void P[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function E(e,t){t||(t=e),S[e]||(S[e]=t,P[e]=[])}function q(e){for(let t in P)if(P.hasOwnProperty(t))for(let n=P[t].length;n>=0;n--)e===P[t][n]&&P[t].splice(n,1)}function F(e){let t=Array.apply(null,arguments);if(e=t.shift(),!P.hasOwnProperty(e)||!S.hasOwnProperty(e))return i();let n=P[e],r=S[e],s=[];for(let e=0;e<n.length;e++){let o=n[e][r].apply(n[e],t);void 0!==o&&s.push(o)}return Promise.all(s)}let R={};const x="_controller_",j="_sdc_controller_";function M(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(M(o,t,n))})),s}function T(e,t,n,r){return e?R[n]?Promise.resolve(R[n]):(t.VERSION=le.VERSION,t._method="content",$.get(e,t).then((function(e){return r||(R[n]=e),e})).catch((function(e){throw 301===e.status&&F("_RedirectOnView",e.responseJSON["url-link"]),F("navLoaded",{controller_name:()=>e.status}),`<sdc-error data-code="${e.status}">${e.responseText}</sdc-error>`}))):Promise.resolve(!1)}function L(e,t){return t=t||e.data(x),J(le.tagNames,e,t)}function D(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 n=function(e,t){return p(e._urlParams,t)}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(e._urlParams.hasOwnProperty(r)){let s=e._urlParams[r],o=RegExp("%\\("+s+"\\)\\w","gm");t=t.replace(o,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function U(e){return e.hasClass(j)?e.data(`${x}`):e.closest(`.${j}`).data(`${x}`)}function A(e,t,n,r){let s=e.data(x);return s?L(e,s):(s=k(r,e,t,n),e.data(x,s),e.addClass(j),C(s))}function I(e,t){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 L(e.$container,e)}function J(e,t,n){return new Promise((r=>{let s=M(t,e,n),o=s.length;if(0===o)return r();for(let e=0;e<s.length;e++)A(s[e].dom,s[e].tag,s[e].super,n).then((()=>{if(o--,0===o)return r()}))}))}function V(e){return G(e,e.$container)}function G(e,t){const n=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each((function(){const t=$(this);let r;if(t.hasClass("_with_handler"))r=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(r=e[t])}void 0!==r&&("function"==typeof r&&(r=r.bind(e)(t.data())),n.push(Promise.resolve(r).then((n=>{const r=$("<div></div>");return r.append(n),J(w(),r,e).then((()=>G(e,r).then((()=>(t.safeEmpty().text("").append(n),!0)))))}))))})),Promise.all(n)}let W=!1,B=!1,K=null;const z=25e3;let H={};function Q(){return B=!0,new Promise((e=>{K="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),K.onmessage=function(e){let t=JSON.parse(e.data);if(t.is_error)(t.msg||t.header)&&F("pushErrorMsg",t.header||"",t.msg||""),H[t.id]&&(H[t.id][1](t.data||null),delete H[t.id]);else if((t.msg||t.header)&&F("pushMsg",t.header||"",t.msg||""),t.type&&"sdc_recall"===t.type)H[t.id]&&(H[t.id][0](t.data),delete H[t.id]);else if(t.type&&"sdc_event"===t.type){let e=t.event;e&&F(e,t.payload)}else t.type&&"sdc_redirect"===t.type&&F("onNavLink",t.link)},K.onclose=function(){W&&console.error("SDC Socket closed unexpectedly"),W=!1;for(const[e,t]of Object.entries(H))t[1]({}),delete H[e];setTimeout((()=>{Q()}),1e3)},K.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),W)try{K.close()}catch(e){}},K.onopen=function(){W=!0,B=!1,e()}}))}function Y(){if(W){W=!1;try{K.close()}catch(e){}}}function X(){return new Promise((e=>W?e():B?void setTimeout((()=>{X().then((()=>{e()}))}),200):e(Q())))}class Z{constructor(e,t={}){this.values_list=[],this.values={},this.model_name=e,this.model_query=t,this._is_connected=!1,this._is_conneting_process=!1,this._auto_reconnect=!0,this.socket=null,this.open_request={},this.on_update=()=>{},this.on_create=()=>{},this.form_id=f()}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.values_list.length?{value:this.values_list[e],done:!1}:{value:null,done:!0})}}length(){return this.values_list.length}byPk(e){if(null!==e){let t=this.values_list.find((t=>t.pk===e));return t||(t={pk:e},this.values_list.push(t)),t}return{pk:e}}filter(e){return this.model_query=Object.assign({},this.model_query,e),this}load(){return this.isConnected().then((()=>{const e=f();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}))}listView(e={},t=null,n=null){let r=$('<div class="container-fluid">');return this.isConnected().then((()=>{const s=f();this.socket.send(JSON.stringify({event:"model",event_type:"list_view",event_id:s,args:{model_name:this.model_name,model_query:this.model_query,filter:e}})),this.open_request[s]=[e=>{r.append(e.html),le.refresh(r),t&&t(e)},e=>{n&&n(e)}]})),r}detailView(e=-1,t=null,n=null){let r,s=$('<div class="container-fluid">');return r=0!==this.values_list.length?this.isConnected():this.load(),r.then((()=>{-1===e&&(e=this.values_list[0].pk);const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:r,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[r]=[e=>{s.append(e.html),le.refresh(s),t&&t(e)},e=>{n&&n(e)}]})),s}syncFormToModel(e){return this.syncForm(e)}syncModelToForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));let t=this;e.each((function(){if(!this.hasAttribute("data-model_pk"))return;let e=$(this).data("model_pk"),n=t.byPk(e);for(let e of this.elements){let t=e.name;if(t&&""!==t)if("checkbox"===e.type)e.checked=n[t];else if("file"===e.type&&n[t]instanceof File){let r=new DataTransfer;r.items.add(n[t]),e.files=r}else $(e).val(n[t])}}))}syncForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));const t=this;let n=[];return e.each((function(){let e=$(this).data("model_pk"),r=t.byPk(e);for(let e of this.elements){let t=e.name;t&&""!==t&&("hidden"===e.type?r[t]=(s=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===s.toLowerCase():"undefined"!==s?"none"===s.toLowerCase()?null:s.match(/^-?\d+$/)?parseInt(s):s.match(/^-?\d+\.?\d+$/)?parseFloat(s):s.match(/^(['][^']*['])|(["][^"]*["])$/)?s.substring(1,s.length-1):s:void 0:"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}var s;return n.push(r),r})),this.values_list.length<=1&&n.length>0&&(this.values=n.at(-1)),n}createForm(e=null,t=null){let n=$('<div class="container-fluid">');return this.isConnected().then((()=>{const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"create_form",event_id:r,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[r]=[t=>{n.append(t.html);let r=n.closest("form").addClass(`sdc-model-create-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",null);r[0].hasAttribute("sdc_submit")||r.attr("sdc_submit","submitModelFormDistributor"),le.refresh(n),e&&e(t)},e=>{t&&t(e)}]})),n}editForm(e=-1,t=null,n=null){let r;r=0!==this.values_list.length?this.isConnected():this.load();let s=$('<div class="container-fluid">');return r.then((()=>{e<=-1&&(e=this.values_list.at(e).pk);const r=f();this.socket.send(JSON.stringify({event:"model",event_type:"edit_form",event_id:r,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[r]=[n=>{s.append(n.html);let r=s.closest("form").addClass(`sdc-model-edit-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e);r[0].hasAttribute("sdc_submit")||r.attr("sdc_submit","submitModelFormDistributor"),le.refresh(s),t&&t(n)},e=>{n&&n(e)}]})),s}new(){return new Promise(((e,t)=>{const n=$("<form>").append(this.createForm((()=>{this.syncFormToModel(n),e()}),t))}))}save(e=-1){return this.isConnected().then((()=>{let t;t=e>-1?[this.byPk(e)]:this.values_list;let n=[];return t.forEach((e=>{const t=f();n.push(new Promise(((n,r)=>{this._readFiles(e).then((s=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:s}})),this.open_request[t]=[e=>{let t=JSON.parse(e.data.instance);this._parseServerRes(t),n(e)},r]}))})))})),Promise.all(n)}))}create(e=this.values){const t=f();return this.isConnected().then((()=>new Promise(((n,r)=>{this._readFiles(e).then((s=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:s}})),this.open_request[t]=[e=>{let t=JSON.parse(e.data.instance);this._parseServerRes(t),n(e)},r]}))}))))}delete(e=-1){-1===e&&(e=this.values?.pk);const t=f();return this.isConnected().then((()=>new Promise(((n,r)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[t]=[n,r]}))))}isConnected(){return new Promise(((e,t)=>{if(this._is_connected)e();else if(this._is_conneting_process){const[n,r]=this.open_request._connecting_process;this.open_request._connecting_process=[()=>{n(),e()},()=>{r(),t()}]}else this._is_conneting_process=!0,this.open_request._connecting_process=[()=>{},()=>{}],this._connectToServer().then((()=>{e(this._checkConnection())}))}))}close(){this.socket&&(this._auto_reconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket)}clean(){return this.values_list=[],this.values={},this}_readFiles(e){let t=[],n={};for(const[r,s]of Object.entries(e))s instanceof File&&t.push(new Promise(((e,t)=>{((r,s)=>{let o=new FileReader;o.onload=o=>{const i=f();this.open_request[i]=[e,t];let l=o.target.result,a=parseInt(Math.ceil(l.length/z));n[r]={id:i,file_name:s.name,field_name:r,content_length:s.size};for(let e=0;e<a;++e)this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:i,args:{chunk:l.slice(z*e,z*(e+1)),idx:e,number_of_chunks:a,file_name:s.name,field_name:r,content_length:s.size,content_type:s.type,model_name:this.model_name,model_query:this.model_query}}))},o.onerror=()=>{t()},o.readAsBinaryString(s)})(r,s)})));return Promise.all(t).then((()=>n))}_onMessage(e){let t=JSON.parse(e.data);if(t.is_error)this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][1](t),delete this.open_request[t.event_id]),(t.msg||t.header)&&F("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),delete this.open_request._connecting_process,this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&F("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),delete this.open_request._connecting_process;else if("load"===t.type){const e=JSON.parse(t.args.data);this.values_list=[],this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=this._parseServerRes(e);n="on_create"===t.type?this.on_create:this.on_update,n(r)}this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),delete this.open_request[t.event_id])}}_connectToServer(){return new Promise((e=>{const t=`${this.model_name}`+(this.model_id>0?`/${this.model_id}`:"");"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.model_name}, ${this.model_id}) Socket closed unexpectedly`),this._is_connected=!1;for(const[t,n]of Object.entries(this.open_request))n[1](e);this.open_request={},setTimeout((()=>{this._auto_reconnect&&this._connectToServer().then((()=>{}))}),1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._is_connected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}}))}_checkConnection(){const e=f();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}_parseServerRes(e){let t=[];for(let n of e){const e=n.pk,r=this.byPk(e);for(const[e,t]of Object.entries(n.fields))r[e]=t;t.push(r)}return 1===this.values_list.length?this.values=this.values_list.at(-1):this.values={},t}}class ee{constructor(){this._uuid=f(),this.contentUrl="",this.contentReload=!1,this.hasSubnavView=!1,this.events=[],this.load_async=!1,this.isEventsSet=!1,this._allEvents=null,this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName="",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){le.DEBUG&&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(){le.DEBUG&&console.DEBUG(Array.apply(null,arguments),this._tagName)}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}remove(){for(const e of this._models)e.close();let e=this._childController;for(let t in e)if(e.hasOwnProperty(t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){q(this);const e=a(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=Object.assign({},...e)}post(e,t){return le.post(this,e,t)}get(e,t){return le.get(this,e,t)}submitForm(e,t,n){return le.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){let s=f();return X().then((()=>{K.send(JSON.stringify({event:"sdc_call",id:s,controller:t,app:e,function:n,args:r}))})),new Promise(((e,t)=>{H[s]=[e,t]}))}(n[1],this._tagName,e,t);console.error("To use the serverCall function the contentUrl must be set: "+this.name)}newModel(e,t={}){let n=new Z(e,t);return this._models.push(n),n}find(e){return this.$container.find(e)}refresh(){return le.refresh(this.$container,this)}reload(){return le.reloadController(this)}submitModelFormDistributor(e,t){return this.hasOwnProperty("_submitModelForm")&&"function"==typeof this._submitModelForm?this._submitModelForm(e,t):this.hasOwnProperty("submitModelForm")&&"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this._fallbackSubmitModelForm(e,t)}_fallbackSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let r=e.data("model");const s=r.syncForm(e);for(let t of s)n.push(new Promise(((n,s)=>{let o;o=null!==t.pk?r.save(t.pk):r.create(t),o.then((t=>{_(e),n(t)})).catch((t=>{m(e,$(t.html)),s(t)}))})))}return Promise.all(n).then((e=>Object.assign({},...e.flat())))}}const te=Object.keys(window).filter((e=>/^on/.test(e))).map((e=>e.slice(2)));function ne(e){let t=e.type;e.hasOwnProperty("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){if(!r&&(r=U(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 re(e){if(e.isEventsSet)return;const t=e.getEvents();for(let n in t)if(t.hasOwnProperty(n)){let r=t[n];for(let t in r)r.hasOwnProperty(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(" ")))}))}}const se={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])=>{e.startsWith("on")?n[0].addEventListener(e.substring(2).toLowerCase(),t):(se[e.toLowerCase()]&&(e=se[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};let oe,ie,le={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:y,rootController:null,_isInit:!1,_origin_trigger:null,init_sdc:()=>{le._isInit||(le._isInit=!0,le._origin_trigger?Y():(le._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return te.includes(t)||(te.push(t),$(window).on(t,ne)),le._origin_trigger.call(this,e)},le.updateJquery()),X(),function(){const e=$(window);te.forEach((t=>{e.off(t).on(t,ne)}))}(),le.rootController=le.rootController||new ee),le.tagNames=w();for(let[e,t]of Object.entries(le.Global))t.$container||(y[e].$container=o());return J(le.tagNames,o(),le.rootController)},updateJquery:()=>{$.fn.safeReplace=function(e){return le.safeReplace($(this),e)},$.fn.safeEmpty=function(){return le.safeEmpty($(this))},$.fn.safeRemove=function(){return le.safeRemove($(this))}},controllerToTag:e=>l(e.name).replace(/-controller$/,""),registerGlobal:e=>{let t=le.controllerToTag(e),n=new e;v[t]=[n,[]],n._tagName=t,window[a(t)]=y[a(t)]=n},cleanCache:()=>{R={}},register:e=>{let t=le.controllerToTag(e);return v[t]=[e,[]],e.prototype._tagName=t,{addMixin:(...e)=>{for(let n of e){let e;"string"==typeof n?e=l(n):n&&(e=le.controllerToTag(n)),v[t][1].push(e)}}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=le.CSRF_TOKEN,le.ajax(e,t,params,$.post)),get:(e,t,n)=>le.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=le.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?F("onNavLink",t["url-link"]):s.then((()=>{le.refresh(e.$container)}))})).catch(i)));return s},submitFormAndUpdateView:(e,t,n,r)=>{let s=new FormData(t);const o=e=>{e["url-link"]?F("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise(((l,a)=>{h(s,n||t.action,r||t.method).then(((t,n,r)=>{l(t,n,r),"redirect"===t.status?o(t):i.then((()=>{le.refresh(e.$container)}))})).catch(((e,t,n)=>{301===e.status?(e=e.responseJSON,o(e),l(e,t,n)):a(e,t,n)}))}));return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise(((s,o)=>{h(r,t||e.action,n||e.method).then(s).catch(o)}))},getController:e=>U(e),safeEmpty:e=>(e.children().each((function(e,t){let n=$(t);le.safeRemove(n)})),e),safeReplace:(e,t)=>(t.insertBefore(e),le.safeRemove(e)),safeRemove:e=>(e.each((function(){let e=$(this);e.data(`${x}`)&&e.data(`${x}`).remove()})),e.find(`.${j}`).each((function(){const e=$(this).data(`${x}`);e&&e.remove()})),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=D(e,e.contentUrl);return e.contentUrl=t.url,T(e.contentUrl,t.args,e._tagName,e.contentReload)}return new Promise((e=>{e($())}))}(e).then((t=>{let n=$(t);e._childController={},J(le.tagNames,n,e).then((()=>{le.safeEmpty(e.$container),e.$container.append(n),le.refresh(e.$container,e)}))})),refresh:(e,t)=>{if(t||(t=le.getController(e)),!t)return i();let n=t,r=[];for(;n;)n.isEventsSet=!1,r.unshift(n),n=n._parentController;return J(le.tagNames,t.$container,t).then((()=>{V(t).then((()=>{for(let e of r)re(e);t.onRefresh(e)}))}))}};const ae=Y,ce={get_controller:async function(e,t={},n=""){if(!jest)throw new Error("JEST is not defined");oe||(ie=$.ajax.bind($),oe=jest.spyOn($,"ajax"),oe.mockImplementation((function(e){return ie(e).then((e=>e)).catch((e=>e))})));const r=$("body");le.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);return r.append(o),le._isInit=!1,le.cleanCache(),await le.init_sdc(),le.getController(s)}};var he=t.wz,ue=t.ms,de=t.yA,fe=t.sD,_e=t.kb,me=t.wH,pe=t.on,ge=t.YV,ye=t.eA,ve=t.YF,we=t.WQ,$e=t.QN,be=t.gV;export{he as AbstractSDC,ue as allOff,de as app,fe as checkIfParamNumberBoolOrString,_e as clearErrorsInForm,me as controllerFactory,pe as on,ge as runControlFlowFunctions,ye as setErrorsInForm,ve as setEvent,we as socketReconnect,$e as test_utils,be as trigger};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdc_client",
3
- "version": "0.4.12",
3
+ "version": "0.4.13",
4
4
  "description": "Simple Dom Control",
5
5
  "main": "dist/ugly.index.js",
6
6
  "type": "module",
@@ -226,15 +226,21 @@ export class AbstractSDC {
226
226
  return app.reloadController(this);
227
227
  }
228
228
 
229
- submitModelForm($form, e) {
230
- return this._submitModelForm($form, e);
229
+ submitModelFormDistributor($form, e) {
230
+ if (this.hasOwnProperty('_submitModelForm') && typeof this._submitModelForm === 'function') {
231
+ return this._submitModelForm($form, e);
232
+ }
233
+ if (this.hasOwnProperty('submitModelForm') && typeof this.submitModelForm === 'function') {
234
+ return this.submitModelForm($form, e);
235
+ }
236
+ return this._fallbackSubmitModelForm($form, e);
231
237
  }
232
238
 
233
239
  /**
234
240
  * Model Form Events
235
241
  */
236
242
 
237
- _submitModelForm($form, e) {
243
+ _fallbackSubmitModelForm($form, e) {
238
244
  let p_list = [];
239
245
  if (!this._isMixin) {
240
246
  e.stopPropagation();
@@ -244,7 +250,7 @@ export class AbstractSDC {
244
250
  for (let instance_value of values) {
245
251
  p_list.push(new Promise((resolve, reject) => {
246
252
  let prom;
247
- if(instance_value.pk !== null) {
253
+ if (instance_value.pk !== null) {
248
254
  prom = model.save(instance_value.pk);
249
255
  } else {
250
256
  prom = model.create(instance_value);
@@ -392,7 +392,7 @@ export class Model {
392
392
  $div_form.append(data.html);
393
393
  let $form = $div_form.closest('form').addClass(`sdc-model-create-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', null);
394
394
  if (!$form[0].hasAttribute('sdc_submit')) {
395
- $form.attr('sdc_submit', 'submitModelForm')
395
+ $form.attr('sdc_submit', 'submitModelFormDistributor')
396
396
  }
397
397
 
398
398
  app.refresh($div_form);
@@ -437,7 +437,7 @@ export class Model {
437
437
  $div_form.append(data.html);
438
438
  let $form = $div_form.closest('form').addClass(`sdc-model-edit-form sdc-model-form ${this.form_id}`).data('model', this).data('model_pk', pk);
439
439
  if (!$form[0].hasAttribute('sdc_submit')) {
440
- $form.attr('sdc_submit', 'submitModelForm')
440
+ $form.attr('sdc_submit', 'submitModelFormDistributor')
441
441
  }
442
442
 
443
443
  app.refresh($div_form);
@@ -103,12 +103,11 @@ function loadHTMLFile(path, args, tag, hardReload) {
103
103
 
104
104
  return data;
105
105
  }).catch(function (err) {
106
- trigger('navLoaded', {'controller_name': ()=> err.status});
107
106
  if (err.status === 301) {
108
107
  const data = err.responseJSON;
109
- trigger('onNavLink', data['url-link']);
110
- throw "<sdc-error data-code='301'></sdc-error>";
108
+ trigger('_RedirectOnView', data['url-link']);
111
109
  }
110
+ trigger('navLoaded', {'controller_name': ()=> err.status});
112
111
 
113
112
  throw `<sdc-error data-code="${err.status}">${err.responseText}</sdc-error>`;
114
113
  });