

Nextrek
@ 1348
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "uid": "5BCC16F29DC79547E53B16B76EC0822CB2E9", "isLoaded": true, "lastModificationTime": 0, "items": { "name": "Component_UIBehavior", "type": "game_script", "order": 14, "content": "# ===================================================================\n#\n# Script: Component_StyleHandler\n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_UIBehavior extends gs.Component\n ###*\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n ###\n onDataBundleRestore: (data, context) ->\n @setupEventHandlers()\n \n ###*\n * @module ui\n * @class Component_UIBehavior\n * @extends gs.Component\n * @memberof ui\n * @constructor\n ###\n constructor: () ->\n @breakChainAt = null\n @containsPointer = no\n @isAnimating = no\n @viewData_ = [yes, no, no, yes, no]\n @nextKeyObjectId = \"\"\n @nextKeyObject_ = null\n @prevKeyObject_ = null\n \n @accessors \"nextKeyObject\", \n set: (v) ->\n @nextKeyObject_ = v\n if v\n v.ui.prevKeyObject_ = @object\n get: -> @nextKeyObject_\n \n @accessors \"prevKeyObject\", \n set: (v) ->\n @prevKeyObject_ = v\n if v\n v.ui.nextKeyObject_ = @object\n get: -> @prevKeyObject_\n \n @accessors \"selected\", \n set: (v) -> \n if v != @viewData_[2]\n @viewData_[2] = v\n @updateStyle()\n \n get: -> @viewData_[2]\n \n @accessors \"hover\", \n set: (v) -> \n if v != @viewData_[1]\n @viewData_[1] = v\n @updateStyle()\n \n get: -> @viewData_[1]\n \n @accessors \"enabled\",\n set: (v) -> \n if v != @viewData_[3]\n @viewData_[3] = v\n @updateStyle()\n \n get: -> @viewData_[3]\n \n @accessors \"focused\",\n set: (v) ->\n if v != @viewData_[4]\n @viewData_[4] = v\n @updateStyle()\n get: -> @viewData_[4]\n \n @accessors \"viewData\",\n set: (v) ->\n if v != @viewData_\n @viewData_ = v\n @updateStyle()\n get: -> @viewData_\n \n \n ###*\n * Prepares the UI-Object for display. This method should be called\n * before a new created UI-Object will be displayed to position all\n * sub-elements correctly.\n *\n * @method prepare\n ###\n prepare: ->\n debugger\n scene = SceneManager.scene\n scene.preparing = yes\n @object.update() # First Update: Bring all sub-elements in correct size\n @object.update() # Second Update: Correct layout\n scene.preparing = no\n @object.events.emit(\"uiPrepareFinish\")\n \n \n ###*\n * Executes an animation defined for the specified event. Each UI-Object\n * can have animations for certain events defined in JSON.\n *\n * @param {string} event - The event to execute the animation for such as \"onTerminate\" or \"onInitialize\". If\n * no animation has been defined for the specified event, nothing will happen and the callback will be called \n * immediately.\n * @param {Function} callback - An optional callback function called when the animation ends.\n * @method executeAnimation\n ###\n executeAnimation: (event, callback) ->\n @isAnimating = yes\n @disappearCounter = @object.subObjects.length + 1\n @disappearCallback = callback\n \n for object in @object.subObjects\n if object.ui\n object.ui.executeAnimation(event, (sender) =>\n @disappearCounter--\n \n if @disappearCounter == 0\n @isAnimating = no\n @disappearCallback?(@object)\n )\n else\n @disappearCounter--\n \n animation = @object.animations?.first (a) -> a.events.indexOf(event) != -1\n \n if animation\n @object.animationExecutor.execute(animation, (sender) =>\n @disappearCounter--\n if @disappearCounter == 0\n @isAnimating = no\n @disappearCallback?(@object) \n )\n else\n @disappearCounter--\n if @disappearCounter == 0\n @isAnimating = no\n @disappearCallback?(@object) \n \n ###*\n * Executes the animation defined for the \"onInitialize\" event. Each UI-Object\n * can have animations for certain events defined in JSON.\n *\n * @param {Function} callback - An optional callback function called when the animation ends.\n * @method appear\n ### \n appear: (callback) -> \n gs.GlobalEventManager.emit(\"uiAnimationStart\")\n cb = (sender) => \n gs.GlobalEventManager.emit(\"uiAnimationFinish\")\n callback?(sender)\n @executeAnimation(\"onInitialize\", cb)\n \n ###*\n * Executes the animation defined for the \"onTerminate\" event. Each UI-Object\n * can have animations for certain events defined in JSON.\n *\n * @param {Function} callback - An optional callback function called when the animation ends.\n * @method disappear\n ### \n disappear: (callback) -> \n gs.GlobalEventManager.emit(\"uiAnimationStart\")\n cb = (sender) => \n gs.GlobalEventManager.emit(\"uiAnimationFinish\")\n callback?(sender)\n @executeAnimation(\"onTerminate\", cb)\n \n ###*\n * Disposes the component.\n *\n * @method dispose\n ###\n dispose: ->\n super\n \n gs.GlobalEventManager.offByOwner \"mouseUp\", @object\n gs.GlobalEventManager.offByOwner(\"objectGotFocus\", @object)\n gs.GlobalEventManager.offByOwner(\"keyUp\", @object)\n gs.GlobalEventManager.offByOwner(\"mouseDown\", @object)\n gs.GlobalEventManager.offByOwner(\"mouseMoved\", @object)\n \n ###*\n * Adds event-handlers for mouse/touch events\n *\n * @method setupEventHandlers\n ### \n setupEventHandlers: ->\n if @object.focusable\n gs.GlobalEventManager.on \"objectGotFocus\", ((e) =>\n if e.sender != @object\n @blur()\n ),\n null, @object\n\n gs.GlobalEventManager.on \"keyUp\", ((e) =>\n if @focused\n if @nextKeyObject and (Input.release(Input.KEY_DOWN) or Input.release(Input.KEY_RIGHT))\n @nextKeyObject.ui.focus()\n e.breakChain = yes\n else if @prevKeyObject and (Input.release(Input.KEY_UP) or Input.release(Input.KEY_LEFT))\n @prevKeyObject.ui.focus()\n e.breakChain = yes\n ),\n null, @object\n \n if @object.styles.first ((s) -> s.selector == 1)\n gs.GlobalEventManager.on \"mouseMoved\", ((e) =>\n return if !@enabled\n contains = Rect.contains(@object.dstRect.x, @object.dstRect.y, \n @object.dstRect.width, @object.dstRect.height,\n Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y)\n \n if @containsPointer != contains or (@hover and !contains)\n @containsPointer = contains\n @object.needsUpdate = yes\n @hover = contains\n \n @updateParentStyle()\n @updateChildrenStyle()\n \n return null \n ),\n null, @object\n \n if @object.focusable or @object.styles.first ((s) -> s.selector == 2 || s.selector == 4)\n gs.GlobalEventManager.on \"mouseDown\", ((e) =>\n return if !@enabled or Input.Mouse.buttons[Input.Mouse.LEFT] != 1\n contains = Rect.contains(@object.dstRect.x, @object.dstRect.y, \n @object.dstRect.width, @object.dstRect.height,\n Input.Mouse.x - @object.origin.x, Input.Mouse.y - @object.origin.y)\n \n if contains\n @object.needsUpdate = yes\n \n @focus()\n \n if @object.selectable\n if @object.group\n @selected = yes\n group = gs.ObjectManager.current.objectsByGroup(@object.group)\n for object in group\n if object != @object\n object.ui.selected = no\n else\n @selected = !@selected\n else\n @updateStyle()\n \n @updateParentStyle()\n \n return null \n ),\n null, @object, 0\n \n ###*\n * Initializes the binding-handler.\n * \n * @method setup\n ###\n setup: ->\n @setupEventHandlers()\n \n ###*\n * Gives the input focus to this UI object. If the UI object is not focusable, nothing will happen.\n * \n * @method focus\n ### \n focus: ->\n if @object.focusable and !@focused\n @focused = yes\n @updateChildrenStyle()\n \n gs.GlobalEventManager.emit(\"objectGotFocus\", @object)\n \n ###*\n * Removes the input focus from this UI object. If the UI object is not focusable, nothing will happen.\n * \n * @method blur\n ###\n blur: ->\n if @object.focusable and @focused\n @focused = no\n @updateChildrenStyle()\n gs.GlobalEventManager.emit(\"objectLostFocus\", @object)\n \n updateParentStyle: ->\n parent = @object.parent\n while parent\n parent.ui?.updateStyle()\n parent = parent.parent\n return null\n \n updateChildrenStyle: () ->\n if @object.controls\n for control in @object.controls\n if control and control.ui\n control.ui.updateStyle()\n control.ui.updateChildrenStyle()\n return null\n \n updateStyle: ->\n if @object.styles\n for style in @object.styles\n if !@viewData_[style.selector]\n style.revert(@object)\n \n for style in @object.styles\n if style.target == -1\n if @viewData_[style.selector]\n style.apply(@object)\n else\n objects = @object.parentsByStyle[style.target]\n if objects\n object = objects[0]\n if object and object.ui.viewData_[style.selector]\n style.apply(@object)\n \n if @object.font\n @object.behavior.refresh?() # FIXME: Creates a dependency on Text-Behavior\n \n return null\n \n ###*\n * Updates the binding-handler.\n * \n * @method update\n ### \n update: ->\n if @nextKeyObjectId and !@nextKeyObject\n @nextKeyObject = gs.ObjectManager.current.objectById(@nextKeyObjectId)\n \n \nui.Component_UIBehavior = Component_UIBehavior", "parentId": "01A95DA3K01E8A4CB4SBE17E790BCE1FC035", "folder": false, "compiledContent": "var Component_UIBehavior,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\nComponent_UIBehavior = (function(superClass) {\n extend(Component_UIBehavior, superClass);\n\n\n /**\n * Called if this object instance is restored from a data-bundle. It can be used\n * re-assign event-handler, anonymous functions, etc.\n * \n * @method onDataBundleRestore.\n * @param Object data - The data-bundle\n * @param gs.ObjectCodecContext context - The codec-context.\n */\n\n Component_UIBehavior.prototype.onDataBundleRestore = function(data, context) {\n return this.setupEventHandlers();\n };\n\n\n /**\n * @module ui\n * @class Component_UIBehavior\n * @extends gs.Component\n * @memberof ui\n * @constructor\n */\n\n function Component_UIBehavior() {\n this.breakChainAt = null;\n this.containsPointer = false;\n this.isAnimating = false;\n this.viewData_ = [true, false, false, true, false];\n this.nextKeyObjectId = \"\";\n this.nextKeyObject_ = null;\n this.prevKeyObject_ = null;\n }\n\n Component_UIBehavior.accessors(\"nextKeyObject\", {\n set: function(v) {\n this.nextKeyObject_ = v;\n if (v) {\n return v.ui.prevKeyObject_ = this.object;\n }\n },\n get: function() {\n return this.nextKeyObject_;\n }\n });\n\n Component_UIBehavior.accessors(\"prevKeyObject\", {\n set: function(v) {\n this.prevKeyObject_ = v;\n if (v) {\n return v.ui.nextKeyObject_ = this.object;\n }\n },\n get: function() {\n return this.prevKeyObject_;\n }\n });\n\n Component_UIBehavior.accessors(\"selected\", {\n set: function(v) {\n if (v !== this.viewData_[2]) {\n this.viewData_[2] = v;\n return this.updateStyle();\n }\n },\n get: function() {\n return this.viewData_[2];\n }\n });\n\n Component_UIBehavior.accessors(\"hover\", {\n set: function(v) {\n if (v !== this.viewData_[1]) {\n this.viewData_[1] = v;\n return this.updateStyle();\n }\n },\n get: function() {\n return this.viewData_[1];\n }\n });\n\n Component_UIBehavior.accessors(\"enabled\", {\n set: function(v) {\n if (v !== this.viewData_[3]) {\n this.viewData_[3] = v;\n return this.updateStyle();\n }\n },\n get: function() {\n return this.viewData_[3];\n }\n });\n\n Component_UIBehavior.accessors(\"focused\", {\n set: function(v) {\n if (v !== this.viewData_[4]) {\n this.viewData_[4] = v;\n return this.updateStyle();\n }\n },\n get: function() {\n return this.viewData_[4];\n }\n });\n\n Component_UIBehavior.accessors(\"viewData\", {\n set: function(v) {\n if (v !== this.viewData_) {\n this.viewData_ = v;\n return this.updateStyle();\n }\n },\n get: function() {\n return this.viewData_;\n }\n });\n\n\n /**\n * Prepares the UI-Object for display. This method should be called\n * before a new created UI-Object will be displayed to position all\n * sub-elements correctly.\n *\n * @method prepare\n */\n\n Component_UIBehavior.prototype.prepare = function() {\n debugger;\n var scene;\n scene = SceneManager.scene;\n scene.preparing = true;\n this.object.update();\n this.object.update();\n scene.preparing = false;\n return this.object.events.emit(\"uiPrepareFinish\");\n };\n\n\n /**\n * Executes an animation defined for the specified event. Each UI-Object\n * can have animations for certain events defined in JSON.\n *\n * @param {string} event - The event to execute the animation for such as \"onTerminate\" or \"onInitialize\". If\n * no animation has been defined for the specified event, nothing will happen and the callback will be called \n * immediately.\n * @param {Function} callback - An optional callback function called when the animation ends.\n * @method executeAnimation\n */\n\n Component_UIBehavior.prototype.executeAnimation = function(event, callback) {\n var animation, i, len, object, ref, ref1;\n this.isAnimating = true;\n this.disappearCounter = this.object.subObjects.length + 1;\n this.disappearCallback = callback;\n ref = this.object.subObjects;\n for (i = 0, len = ref.length; i < len; i++) {\n object = ref[i];\n if (object.ui) {\n object.ui.executeAnimation(event, (function(_this) {\n return function(sender) {\n _this.disappearCounter--;\n if (_this.disappearCounter === 0) {\n _this.isAnimating = false;\n return typeof _this.disappearCallback === \"function\" ? _this.disappearCallback(_this.object) : void 0;\n }\n };\n })(this));\n } else {\n this.disappearCounter--;\n }\n }\n animation = (ref1 = this.object.animations) != null ? ref1.first(function(a) {\n return a.events.indexOf(event) !== -1;\n }) : void 0;\n if (animation) {\n return this.object.animationExecutor.execute(animation, (function(_this) {\n return function(sender) {\n _this.disappearCounter--;\n if (_this.disappearCounter === 0) {\n _this.isAnimating = false;\n return typeof _this.disappearCallback === \"function\" ? _this.disappearCallback(_this.object) : void 0;\n }\n };\n })(this));\n } else {\n this.disappearCounter--;\n if (this.disappearCounter === 0) {\n this.isAnimating = false;\n return typeof this.disappearCallback === \"function\" ? this.disappearCallback(this.object) : void 0;\n }\n }\n };\n\n\n /**\n * Executes the animation defined for the \"onInitialize\" event. Each UI-Object\n * can have animations for certain events defined in JSON.\n *\n * @param {Function} callback - An optional callback function called when the animation ends.\n * @method appear\n */\n\n Component_UIBehavior.prototype.appear = function(callback) {\n var cb;\n gs.GlobalEventManager.emit(\"uiAnimationStart\");\n cb = (function(_this) {\n return function(sender) {\n gs.GlobalEventManager.emit(\"uiAnimationFinish\");\n return typeof callback === \"function\" ? callback(sender) : void 0;\n };\n })(this);\n return this.executeAnimation(\"onInitialize\", cb);\n };\n\n\n /**\n * Executes the animation defined for the \"onTerminate\" event. Each UI-Object\n * can have animations for certain events defined in JSON.\n *\n * @param {Function} callback - An optional callback function called when the animation ends.\n * @method disappear\n */\n\n Component_UIBehavior.prototype.disappear = function(callback) {\n var cb;\n gs.GlobalEventManager.emit(\"uiAnimationStart\");\n cb = (function(_this) {\n return function(sender) {\n gs.GlobalEventManager.emit(\"uiAnimationFinish\");\n return typeof callback === \"function\" ? callback(sender) : void 0;\n };\n })(this);\n return this.executeAnimation(\"onTerminate\", cb);\n };\n\n\n /**\n * Disposes the component.\n *\n * @method dispose\n */\n\n Component_UIBehavior.prototype.dispose = function() {\n Component_UIBehavior.__super__.dispose.apply(this, arguments);\n gs.GlobalEventManager.offByOwner(\"mouseUp\", this.object);\n gs.GlobalEventManager.offByOwner(\"objectGotFocus\", this.object);\n gs.GlobalEventManager.offByOwner(\"keyUp\", this.object);\n gs.GlobalEventManager.offByOwner(\"mouseDown\", this.object);\n return gs.GlobalEventManager.offByOwner(\"mouseMoved\", this.object);\n };\n\n\n /**\n * Adds event-handlers for mouse/touch events\n *\n * @method setupEventHandlers\n */\n\n Component_UIBehavior.prototype.setupEventHandlers = function() {\n if (this.object.focusable) {\n gs.GlobalEventManager.on(\"objectGotFocus\", ((function(_this) {\n return function(e) {\n if (e.sender !== _this.object) {\n return _this.blur();\n }\n };\n })(this)), null, this.object);\n gs.GlobalEventManager.on(\"keyUp\", ((function(_this) {\n return function(e) {\n if (_this.focused) {\n if (_this.nextKeyObject && (Input.release(Input.KEY_DOWN) || Input.release(Input.KEY_RIGHT))) {\n _this.nextKeyObject.ui.focus();\n return e.breakChain = true;\n } else if (_this.prevKeyObject && (Input.release(Input.KEY_UP) || Input.release(Input.KEY_LEFT))) {\n _this.prevKeyObject.ui.focus();\n return e.breakChain = true;\n }\n }\n };\n })(this)), null, this.object);\n }\n if (this.object.styles.first((function(s) {\n return s.selector === 1;\n }))) {\n gs.GlobalEventManager.on(\"mouseMoved\", ((function(_this) {\n return function(e) {\n var contains;\n if (!_this.enabled) {\n return;\n }\n contains = Rect.contains(_this.object.dstRect.x, _this.object.dstRect.y, _this.object.dstRect.width, _this.object.dstRect.height, Input.Mouse.x - _this.object.origin.x, Input.Mouse.y - _this.object.origin.y);\n if (_this.containsPointer !== contains || (_this.hover && !contains)) {\n _this.containsPointer = contains;\n _this.object.needsUpdate = true;\n _this.hover = contains;\n _this.updateParentStyle();\n _this.updateChildrenStyle();\n }\n return null;\n };\n })(this)), null, this.object);\n }\n if (this.object.focusable || this.object.styles.first((function(s) {\n return s.selector === 2 || s.selector === 4;\n }))) {\n return gs.GlobalEventManager.on(\"mouseDown\", ((function(_this) {\n return function(e) {\n var contains, group, i, len, object;\n if (!_this.enabled || Input.Mouse.buttons[Input.Mouse.LEFT] !== 1) {\n return;\n }\n contains = Rect.contains(_this.object.dstRect.x, _this.object.dstRect.y, _this.object.dstRect.width, _this.object.dstRect.height, Input.Mouse.x - _this.object.origin.x, Input.Mouse.y - _this.object.origin.y);\n if (contains) {\n _this.object.needsUpdate = true;\n _this.focus();\n if (_this.object.selectable) {\n if (_this.object.group) {\n _this.selected = true;\n group = gs.ObjectManager.current.objectsByGroup(_this.object.group);\n for (i = 0, len = group.length; i < len; i++) {\n object = group[i];\n if (object !== _this.object) {\n object.ui.selected = false;\n }\n }\n } else {\n _this.selected = !_this.selected;\n }\n } else {\n _this.updateStyle();\n }\n _this.updateParentStyle();\n }\n return null;\n };\n })(this)), null, this.object, 0);\n }\n };\n\n\n /**\n * Initializes the binding-handler.\n * \n * @method setup\n */\n\n Component_UIBehavior.prototype.setup = function() {\n return this.setupEventHandlers();\n };\n\n\n /**\n * Gives the input focus to this UI object. If the UI object is not focusable, nothing will happen.\n * \n * @method focus\n */\n\n Component_UIBehavior.prototype.focus = function() {\n if (this.object.focusable && !this.focused) {\n this.focused = true;\n this.updateChildrenStyle();\n return gs.GlobalEventManager.emit(\"objectGotFocus\", this.object);\n }\n };\n\n\n /**\n * Removes the input focus from this UI object. If the UI object is not focusable, nothing will happen.\n * \n * @method blur\n */\n\n Component_UIBehavior.prototype.blur = function() {\n if (this.object.focusable && this.focused) {\n this.focused = false;\n this.updateChildrenStyle();\n return gs.GlobalEventManager.emit(\"objectLostFocus\", this.object);\n }\n };\n\n Component_UIBehavior.prototype.updateParentStyle = function() {\n var parent, ref;\n parent = this.object.parent;\n while (parent) {\n if ((ref = parent.ui) != null) {\n ref.updateStyle();\n }\n parent = parent.parent;\n }\n return null;\n };\n\n Component_UIBehavior.prototype.updateChildrenStyle = function() {\n var control, i, len, ref;\n if (this.object.controls) {\n ref = this.object.controls;\n for (i = 0, len = ref.length; i < len; i++) {\n control = ref[i];\n if (control && control.ui) {\n control.ui.updateStyle();\n control.ui.updateChildrenStyle();\n }\n }\n }\n return null;\n };\n\n Component_UIBehavior.prototype.updateStyle = function() {\n var base, i, j, len, len1, object, objects, ref, ref1, style;\n if (this.object.styles) {\n ref = this.object.styles;\n for (i = 0, len = ref.length; i < len; i++) {\n style = ref[i];\n if (!this.viewData_[style.selector]) {\n style.revert(this.object);\n }\n }\n ref1 = this.object.styles;\n for (j = 0, len1 = ref1.length; j < len1; j++) {\n style = ref1[j];\n if (style.target === -1) {\n if (this.viewData_[style.selector]) {\n style.apply(this.object);\n }\n } else {\n objects = this.object.parentsByStyle[style.target];\n if (objects) {\n object = objects[0];\n if (object && object.ui.viewData_[style.selector]) {\n style.apply(this.object);\n }\n }\n }\n }\n if (this.object.font) {\n if (typeof (base = this.object.behavior).refresh === \"function\") {\n base.refresh();\n }\n }\n }\n return null;\n };\n\n\n /**\n * Updates the binding-handler.\n * \n * @method update\n */\n\n Component_UIBehavior.prototype.update = function() {\n if (this.nextKeyObjectId && !this.nextKeyObject) {\n return this.nextKeyObject = gs.ObjectManager.current.objectById(this.nextKeyObjectId);\n }\n };\n\n return Component_UIBehavior;\n\n})(gs.Component);\n\nui.Component_UIBehavior = Component_UIBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsb0JBQUE7RUFBQTs7O0FBQU07Ozs7QUFDRjs7Ozs7Ozs7O2lDQVFBLG1CQUFBLEdBQXFCLFNBQUMsSUFBRCxFQUFPLE9BQVA7V0FDakIsSUFBQyxDQUFBLGtCQUFELENBQUE7RUFEaUI7OztBQUdyQjs7Ozs7Ozs7RUFPYSw4QkFBQTtJQUNULElBQUMsQ0FBQSxZQUFELEdBQWdCO0lBQ2hCLElBQUMsQ0FBQSxlQUFELEdBQW1CO0lBQ25CLElBQUMsQ0FBQSxXQUFELEdBQWU7SUFDZixJQUFDLENBQUEsU0FBRCxHQUFhLENBQUMsSUFBRCxFQUFNLEtBQU4sRUFBVSxLQUFWLEVBQWMsSUFBZCxFQUFtQixLQUFuQjtJQUNiLElBQUMsQ0FBQSxlQUFELEdBQW1CO0lBQ25CLElBQUMsQ0FBQSxjQUFELEdBQWtCO0lBQ2xCLElBQUMsQ0FBQSxjQUFELEdBQWtCO0VBUFQ7O0VBU2Isb0JBQUMsQ0FBQSxTQUFELENBQVcsZUFBWCxFQUNJO0lBQUEsR0FBQSxFQUFLLFNBQUMsQ0FBRDtNQUNELElBQUMsQ0FBQSxjQUFELEdBQWtCO01BQ2xCLElBQUcsQ0FBSDtlQUNJLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBTCxHQUFzQixJQUFDLENBQUEsT0FEM0I7O0lBRkMsQ0FBTDtJQUlBLEdBQUEsRUFBSyxTQUFBO2FBQUcsSUFBQyxDQUFBO0lBQUosQ0FKTDtHQURKOztFQU9BLG9CQUFDLENBQUEsU0FBRCxDQUFXLGVBQVgsRUFDSTtJQUFBLEdBQUEsRUFBSyxTQUFDLENBQUQ7TUFDRCxJQUFDLENBQUEsY0FBRCxHQUFrQjtNQUNsQixJQUFHLENBQUg7ZUFDSSxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQUwsR0FBc0IsSUFBQyxDQUFBLE9BRDNCOztJQUZDLENBQUw7SUFJQSxHQUFBLEVBQUssU0FBQTthQUFHLElBQUMsQ0FBQTtJQUFKLENBSkw7R0FESjs7RUFPQSxv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QUFXLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBVSxDQUFBLEtBQUssQ0FBQyxRQUFOLENBQWxDO2NBQ0ksS0FBSyxDQUFDLEtBQU4sQ0FBWSxJQUFDLENBQUEsTUFBYixFQURKO2FBRko7V0FMSjs7QUFESjtNQVdBLElBQUcsSUFBQyxDQUFBLE1BQU0sQ0FBQyxJQUFYOztjQUNvQixDQUFDO1NBRHJCO09BaEJKOztBQW1CQSxXQUFPO0VBcEJFOzs7QUFzQmI7Ozs7OztpQ0FLQSxNQUFBLEdBQVEsU0FBQTtJQUNKLElBQUcsSUFBQyxDQUFBLGVBQUQsSUFBcUIsQ0FBQyxJQUFDLENBQUEsYUFBMUI7YUFDSSxJQUFDLENBQUEsYUFBRCxHQUFpQixFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUF6QixDQUFvQyxJQUFDLENBQUEsZUFBckMsRUFEckI7O0VBREk7Ozs7R0F4VXVCLEVBQUUsQ0FBQzs7QUE2VXRDLEVBQUUsQ0FBQyxvQkFBSCxHQUEwQiIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogQ29tcG9uZW50X1N0eWxlSGFuZGxlclxuI1xuIyAgICQkQ09QWVJJR0hUJCRcbiNcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY2xhc3MgQ29tcG9uZW50X1VJQmVoYXZpb3IgZXh0ZW5kcyBncy5Db21wb25lbnRcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgQHNldHVwRXZlbnRIYW5kbGVycygpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEBtb2R1bGUgdWlcbiAgICAqIEBjbGFzcyBDb21wb25lbnRfVUlCZWhhdmlvclxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgKiBAbWVtYmVyb2YgdWlcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAoKSAtPlxuICAgICAgICBAYnJlYWtDaGFpbkF0ID0gbnVsbFxuICAgICAgICBAY29udGFpbnNQb2ludGVyID0gbm9cbiAgICAgICAgQGlzQW5pbWF0aW5nID0gbm9cbiAgICAgICAgQHZpZXdEYXRhXyA9IFt5ZXMsIG5vLCBubywgeWVzLCBub11cbiAgICAgICAgQG5leHRLZXlPYmplY3RJZCA9IFwiXCJcbiAgICAgICAgQG5leHRLZXlPYmplY3RfID0gbnVsbFxuICAgICAgICBAcHJldktleU9iamVjdF8gPSBudWxsXG4gICAgICAgIFxuICAgIEBhY2Nlc3NvcnMgXCJuZXh0S2V5T2JqZWN0XCIsIFxuICAgICAgICBzZXQ6ICh2KSAtPlxuICAgICAgICAgICAgQG5leHRLZXlPYmplY3RfID0gdlxuICAgICAgICAgICAgaWYgdlxuICAgICAgICAgICAgICAgIHYudWkucHJldktleU9iamVjdF8gPSBAb2JqZWN0XG4gICAgICAgIGdldDogLT4gQG5leHRLZXlPYmplY3RfXG4gICAgICAgIFxuICAgIEBhY2Nlc3NvcnMgXCJwcmV2S2V5T2JqZWN0XCIsIFxuICAgICAgICBzZXQ6ICh2KSAtPlxuICAgICAgICAgICAgQHByZXZLZXlPYmplY3RfID0gdlxuICAgICAgICAgICAgaWYgdlxuICAgICAgICAgICAgICAgIHYudWkubmV4dEtleU9iamVjdF8gPSBAb2JqZWN0XG4gICAgICAgIGdldDogLT4gQHByZXZLZXlPYmplY3RfXG4gICAgICAgICAgICAgICAgXG4gICAgQGFjY2Vzc29ycyBcInNlbGVjdGVkXCIsIFxuICAgICAgICBzZXQ6ICh2KSAtPiBcbiAgICAgICAgICAgIGlmIHYgIT0gQHZpZXdEYXRhX1syXVxuICAgICAgICAgICAgICAgIEB2aWV3RGF0YV9bMl0gPSB2XG4gICAgICAgICAgICAgICAgQHVwZGF0ZVN0eWxlKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgZ2V0OiAtPiBAdmlld0RhdGFfWzJdXG4gICAgICAgIFxuICAgIEBhY2Nlc3NvcnMgXCJob3ZlclwiLCBcbiAgICAgICAgc2V0OiAodikgLT4gXG4gICAgICAgICAgICBpZiB2ICE9IEB2aWV3RGF0YV9bMV1cbiAgICAgICAgICAgICAgICBAdmlld0RhdGFfWzFdID0gdlxuICAgICAgICAgICAgICAgIEB1cGRhdGVTdHlsZSgpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGdldDogLT4gQHZpZXdEYXRhX1sxXVxuICAgICAgICBcbiAgICBAYWNjZXNzb3JzIFwiZW5hYmxlZFwiLFxuICAgICAgICBzZXQ6ICh2KSAtPiBcbiAgICAgICAgICAgIGlmIHYgIT0gQHZpZXdEYXRhX1szXVxuICAgICAgICAgICAgICAgIEB2aWV3RGF0YV9bM10gPSB2XG4gICAgICAgICAgICAgICAgQHVwZGF0ZVN0eWxlKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgZ2V0OiAtPiBAdmlld0RhdGFfWzNdXG4gICAgICAgIFxuICAgIEBhY2Nlc3NvcnMgXCJmb2N1c2VkXCIsXG4gICAgICAgIHNldDogKHYpIC0+XG4gICAgICAgICAgICBpZiB2ICE9IEB2aWV3RGF0YV9bNF1cbiAgICAgICAgICAgICAgICBAdmlld0RhdGFfWzRdID0gdlxuICAgICAgICAgICAgICAgIEB1cGRhdGVTdHlsZSgpXG4gICAgICAgIGdldDogLT4gQHZpZXdEYXRhX1s0XVxuICAgICAgICBcbiAgICBAYWNjZXNzb3JzIFwidmlld0RhdGFcIixcbiAgICAgICAgc2V0OiAodikgLT5cbiAgICAgICAgICAgIGlmIHYgIT0gQHZpZXdEYXRhX1xuICAgICAgICAgICAgICAgIEB2aWV3RGF0YV8gPSB2XG4gICAgICAgICAgICAgICAgQHVwZGF0ZVN0eWxlKClcbiAgICAgICAgZ2V0OiAtPiBAdmlld0RhdGFfXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogUHJlcGFyZXMgdGhlIFVJLU9iamVjdCBmb3IgZGlzcGxheS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZFxuICAgICogYmVmb3JlIGEgbmV3IGNyZWF0ZWQgVUktT2JqZWN0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHBvc2l0aW9uIGFsbFxuICAgICogc3ViLWVsZW1lbnRzIGNvcnJlY3RseS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHByZXBhcmVcbiAgICAjIyNcbiAgICBwcmVwYXJlOiAtPlxuICAgICAgICBkZWJ1Z2dlclxuICAgICAgICBzY2VuZSA9IFNjZW5lTWFuYWdlci5zY2VuZVxuICAgICAgICBzY2VuZS5wcmVwYXJpbmcgPSB5ZXNcbiAgICAgICAgQG9iamVjdC51cGRhdGUoKSAjIEZpcnN0IFVwZGF0ZTogQnJpbmcgYWxsIHN1Yi1lbGVtZW50cyBpbiBjb3JyZWN0IHNpemVcbiAgICAgICAgQG9iamVjdC51cGRhdGUoKSAjIFNlY29uZCBVcGRhdGU6IENvcnJlY3QgbGF5b3V0XG4gICAgICAgIHNjZW5lLnByZXBhcmluZyA9IG5vXG4gICAgICAgIEBvYmplY3QuZXZlbnRzLmVtaXQoXCJ1aVByZXBhcmVGaW5pc2hcIilcbiAgICAgXG4gICAgIFxuICAgICMjIypcbiAgICAqIEV4ZWN1dGVzIGFuIGFuaW1hdGlvbiBkZWZpbmVkIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LiBFYWNoIFVJLU9iamVjdFxuICAgICogY2FuIGhhdmUgYW5pbWF0aW9ucyBmb3IgY2VydGFpbiBldmVudHMgZGVmaW5lZCBpbiBKU09OLlxuICAgICpcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCB0byBleGVjdXRlIHRoZSBhbmltYXRpb24gZm9yIHN1Y2ggYXMgXCJvblRlcm1pbmF0ZVwiIG9yIFwib25Jbml0aWFsaXplXCIuIElmXG4gICAgKiBubyBhbmltYXRpb24gaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhlIHNwZWNpZmllZCBldmVudCwgbm90aGluZyB3aWxsIGhhcHBlbiBhbmQgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIFxuICAgICogaW1tZWRpYXRlbHkuXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy5cbiAgICAqIEBtZXRob2QgZXhlY3V0ZUFuaW1hdGlvblxuICAgICMjI1xuICAgIGV4ZWN1dGVBbmltYXRpb246IChldmVudCwgY2FsbGJhY2spIC0+XG4gICAgICAgIEBpc0FuaW1hdGluZyA9IHllc1xuICAgICAgICBAZGlzYXBwZWFyQ291bnRlciA9IEBvYmplY3Quc3ViT2JqZWN0cy5sZW5ndGggKyAxXG4gICAgICAgIEBkaXNhcHBlYXJDYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgICAgIFxuICAgICAgICBmb3Igb2JqZWN0IGluIEBvYmplY3Quc3ViT2JqZWN0c1xuICAgICAgICAgICAgaWYgb2JqZWN0LnVpXG4gICAgICAgICAgICAgICAgb2JqZWN0LnVpLmV4ZWN1dGVBbmltYXRpb24oZXZlbnQsIChzZW5kZXIpID0+XG4gICAgICAgICAgICAgICAgICAgIEBkaXNhcHBlYXJDb3VudGVyLS1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIEBkaXNhcHBlYXJDb3VudGVyID09IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpc0FuaW1hdGluZyA9IG5vXG4gICAgICAgICAgICAgICAgICAgICAgICBAZGlzYXBwZWFyQ2FsbGJhY2s/KEBvYmplY3QpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIEBkaXNhcHBlYXJDb3VudGVyLS1cbiAgICAgICAgIFxuICAgICAgICBhbmltYXRpb24gPSBAb2JqZWN0LmFuaW1hdGlvbnM/LmZpcnN0IChhKSAtPiBhLmV2ZW50cy5pbmRleE9mKGV2ZW50KSAhPSAtMVxuICAgICAgICBcbiAgICAgICAgaWYgYW5pbWF0aW9uXG4gICAgICAgICAgICBAb2JqZWN0LmFuaW1hdGlvbkV4ZWN1dG9yLmV4ZWN1dGUoYW5pbWF0aW9uLCAoc2VuZGVyKSA9PlxuICAgICAgICAgICAgICAgIEBkaXNhcHBlYXJDb3VudGVyLS1cbiAgICAgICAgICAgICAgICBpZiBAZGlzYXBwZWFyQ291bnRlciA9PSAwXG4gICAgICAgICAgICAgICAgICAgIEBpc0FuaW1hdGluZyA9IG5vXG4gICAgICAgICAgICAgICAgICAgIEBkaXNhcHBlYXJDYWxsYmFjaz8oQG9iamVjdCkgXG4gICAgICAgICAgICApXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBkaXNhcHBlYXJDb3VudGVyLS1cbiAgICAgICAgICAgIGlmIEBkaXNhcHBlYXJDb3VudGVyID09IDBcbiAgICAgICAgICAgICAgICBAaXNBbmltYXRpbmcgPSBub1xuICAgICAgICAgICAgICAgIEBkaXNhcHBlYXJDYWxsYmFjaz8oQG9iamVjdCkgXG4gICAgXG4gICAgIyMjKlxuICAgICogRXhlY3V0ZXMgdGhlIGFuaW1hdGlvbiBkZWZpbmVkIGZvciB0aGUgXCJvbkluaXRpYWxpemVcIiBldmVudC4gRWFjaCBVSS1PYmplY3RcbiAgICAqIGNhbiBoYXZlIGFuaW1hdGlvbnMgZm9yIGNlcnRhaW4gZXZlbnRzIGRlZmluZWQgaW4gSlNPTi5cbiAgICAqXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy5cbiAgICAqIEBtZXRob2QgYXBwZWFyXG4gICAgIyMjICAgICAgICBcbiAgICBhcHBlYXI6IChjYWxsYmFjaykgLT4gXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidWlBbmltYXRpb25TdGFydFwiKVxuICAgICAgICBjYiA9IChzZW5kZXIpID0+IFxuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLmVtaXQoXCJ1aUFuaW1hdGlvbkZpbmlzaFwiKVxuICAgICAgICAgICAgY2FsbGJhY2s/KHNlbmRlcilcbiAgICAgICAgQGV4ZWN1dGVBbmltYXRpb24oXCJvbkluaXRpYWxpemVcIiwgY2IpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEV4ZWN1dGVzIHRoZSBhbmltYXRpb24gZGVmaW5lZCBmb3IgdGhlIFwib25UZXJtaW5hdGVcIiBldmVudC4gRWFjaCBVSS1PYmplY3RcbiAgICAqIGNhbiBoYXZlIGFuaW1hdGlvbnMgZm9yIGNlcnRhaW4gZXZlbnRzIGRlZmluZWQgaW4gSlNPTi5cbiAgICAqXG4gICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy5cbiAgICAqIEBtZXRob2QgZGlzYXBwZWFyXG4gICAgIyMjICAgIFxuICAgIGRpc2FwcGVhcjogKGNhbGxiYWNrKSAtPiBcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLmVtaXQoXCJ1aUFuaW1hdGlvblN0YXJ0XCIpXG4gICAgICAgIGNiID0gKHNlbmRlcikgPT4gXG4gICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInVpQW5pbWF0aW9uRmluaXNoXCIpXG4gICAgICAgICAgICBjYWxsYmFjaz8oc2VuZGVyKVxuICAgICAgICBAZXhlY3V0ZUFuaW1hdGlvbihcIm9uVGVybWluYXRlXCIsIGNiKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBEaXNwb3NlcyB0aGUgY29tcG9uZW50LlxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZVxuICAgICMjI1xuICAgIGRpc3Bvc2U6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lciBcIm1vdXNlVXBcIiwgQG9iamVjdFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcIm9iamVjdEdvdEZvY3VzXCIsIEBvYmplY3QpXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwia2V5VXBcIiwgQG9iamVjdClcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9mZkJ5T3duZXIoXCJtb3VzZURvd25cIiwgQG9iamVjdClcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9mZkJ5T3duZXIoXCJtb3VzZU1vdmVkXCIsIEBvYmplY3QpXG4gICAgIFxuICAgICMjIypcbiAgICAqIEFkZHMgZXZlbnQtaGFuZGxlcnMgZm9yIG1vdXNlL3RvdWNoIGV2ZW50c1xuICAgICpcbiAgICAqIEBtZXRob2Qgc2V0dXBFdmVudEhhbmRsZXJzXG4gICAgIyMjIFxuICAgIHNldHVwRXZlbnRIYW5kbGVyczogLT5cbiAgICAgICAgaWYgQG9iamVjdC5mb2N1c2FibGVcbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vbiBcIm9iamVjdEdvdEZvY3VzXCIsICgoZSkgPT5cbiAgICAgICAgICAgICAgICBpZiBlLnNlbmRlciAhPSBAb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIEBibHVyKClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBudWxsLCBAb2JqZWN0XG5cbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vbiBcImtleVVwXCIsICgoZSkgPT5cbiAgICAgICAgICAgICAgICBpZiBAZm9jdXNlZFxuICAgICAgICAgICAgICAgICAgICBpZiBAbmV4dEtleU9iamVjdCBhbmQgKElucHV0LnJlbGVhc2UoSW5wdXQuS0VZX0RPV04pIG9yIElucHV0LnJlbGVhc2UoSW5wdXQuS0VZX1JJR0hUKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIEBuZXh0S2V5T2JqZWN0LnVpLmZvY3VzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuYnJlYWtDaGFpbiA9IHllc1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIEBwcmV2S2V5T2JqZWN0IGFuZCAoSW5wdXQucmVsZWFzZShJbnB1dC5LRVlfVVApIG9yIElucHV0LnJlbGVhc2UoSW5wdXQuS0VZX0xFRlQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgQHByZXZLZXlPYmplY3QudWkuZm9jdXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgZS5icmVha0NoYWluID0geWVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbnVsbCwgQG9iamVjdFxuICAgICAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3Quc3R5bGVzLmZpcnN0ICgocykgLT4gcy5zZWxlY3RvciA9PSAxKVxuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwibW91c2VNb3ZlZFwiLCAoKGUpID0+XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZiAhQGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgPSBSZWN0LmNvbnRhaW5zKEBvYmplY3QuZHN0UmVjdC54LCBAb2JqZWN0LmRzdFJlY3QueSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBvYmplY3QuZHN0UmVjdC53aWR0aCwgQG9iamVjdC5kc3RSZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQuTW91c2UueCAtIEBvYmplY3Qub3JpZ2luLngsIElucHV0Lk1vdXNlLnkgLSBAb2JqZWN0Lm9yaWdpbi55KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiBAY29udGFpbnNQb2ludGVyICE9IGNvbnRhaW5zIG9yIChAaG92ZXIgYW5kICFjb250YWlucylcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjb250YWluc1BvaW50ZXIgPSBjb250YWluc1xuICAgICAgICAgICAgICAgICAgICAgICAgQG9iamVjdC5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICAgICAgICAgICAgICAgICAgQGhvdmVyID0gY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgQHVwZGF0ZVBhcmVudFN0eWxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIEB1cGRhdGVDaGlsZHJlblN0eWxlKClcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgbnVsbCwgQG9iamVjdFxuICAgICAgICAgICAgXG4gICAgICAgIGlmIEBvYmplY3QuZm9jdXNhYmxlIG9yIEBvYmplY3Quc3R5bGVzLmZpcnN0ICgocykgLT4gcy5zZWxlY3RvciA9PSAyIHx8IHMuc2VsZWN0b3IgPT0gNClcbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vbiBcIm1vdXNlRG93blwiLCAoKGUpID0+XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZiAhQGVuYWJsZWQgb3IgSW5wdXQuTW91c2UuYnV0dG9uc1tJbnB1dC5Nb3VzZS5MRUZUXSAhPSAxXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gUmVjdC5jb250YWlucyhAb2JqZWN0LmRzdFJlY3QueCwgQG9iamVjdC5kc3RSZWN0LnksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Lk1vdXNlLnggLSBAb2JqZWN0Lm9yaWdpbi54LCBJbnB1dC5Nb3VzZS55IC0gQG9iamVjdC5vcmlnaW4ueSlcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0Lm5lZWRzVXBkYXRlID0geWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb2N1cygpXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIEBvYmplY3Quc2VsZWN0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIEBvYmplY3QuZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHNlbGVjdGVkID0geWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3MuT2JqZWN0TWFuYWdlci5jdXJyZW50Lm9iamVjdHNCeUdyb3VwKEBvYmplY3QuZ3JvdXApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBvYmplY3QgaW4gZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9iamVjdCAhPSBAb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnVpLnNlbGVjdGVkID0gbm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzZWxlY3RlZCA9ICFAc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdXBkYXRlU3R5bGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgQHVwZGF0ZVBhcmVudFN0eWxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG51bGwsIEBvYmplY3QsIDBcbiAgICAgICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBJbml0aWFsaXplcyB0aGUgYmluZGluZy1oYW5kbGVyLlxuICAgICogXG4gICAgKiBAbWV0aG9kIHNldHVwXG4gICAgIyMjXG4gICAgc2V0dXA6IC0+XG4gICAgICAgIEBzZXR1cEV2ZW50SGFuZGxlcnMoKVxuICAgIFxuICAgICMjIypcbiAgICAqIEdpdmVzIHRoZSBpbnB1dCBmb2N1cyB0byB0aGlzIFVJIG9iamVjdC4gSWYgdGhlIFVJIG9iamVjdCBpcyBub3QgZm9jdXNhYmxlLCBub3RoaW5nIHdpbGwgaGFwcGVuLlxuICAgICogXG4gICAgKiBAbWV0aG9kIGZvY3VzXG4gICAgIyMjICAgICAgICAgICAgICAgXG4gICAgZm9jdXM6IC0+XG4gICAgICAgIGlmIEBvYmplY3QuZm9jdXNhYmxlIGFuZCAhQGZvY3VzZWRcbiAgICAgICAgICAgIEBmb2N1c2VkID0geWVzXG4gICAgICAgICAgICBAdXBkYXRlQ2hpbGRyZW5TdHlsZSgpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwib2JqZWN0R290Rm9jdXNcIiwgQG9iamVjdClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBSZW1vdmVzIHRoZSBpbnB1dCBmb2N1cyBmcm9tIHRoaXMgVUkgb2JqZWN0LiBJZiB0aGUgVUkgb2JqZWN0IGlzIG5vdCBmb2N1c2FibGUsIG5vdGhpbmcgd2lsbCBoYXBwZW4uXG4gICAgKiBcbiAgICAqIEBtZXRob2QgYmx1clxuICAgICMjI1xuICAgIGJsdXI6IC0+XG4gICAgICAgIGlmIEBvYmplY3QuZm9jdXNhYmxlIGFuZCBAZm9jdXNlZFxuICAgICAgICAgICAgQGZvY3VzZWQgPSBub1xuICAgICAgICAgICAgQHVwZGF0ZUNoaWxkcmVuU3R5bGUoKVxuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLmVtaXQoXCJvYmplY3RMb3N0Rm9jdXNcIiwgQG9iamVjdClcbiAgICAgICAgICAgIFxuICAgIHVwZGF0ZVBhcmVudFN0eWxlOiAtPlxuICAgICAgICBwYXJlbnQgPSBAb2JqZWN0LnBhcmVudFxuICAgICAgICB3aGlsZSBwYXJlbnRcbiAgICAgICAgICAgIHBhcmVudC51aT8udXBkYXRlU3R5bGUoKVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudFxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIFxuICAgIHVwZGF0ZUNoaWxkcmVuU3R5bGU6ICgpIC0+XG4gICAgICAgIGlmIEBvYmplY3QuY29udHJvbHNcbiAgICAgICAgICAgIGZvciBjb250cm9sIGluIEBvYmplY3QuY29udHJvbHNcbiAgICAgICAgICAgICAgICBpZiBjb250cm9sIGFuZCBjb250cm9sLnVpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudWkudXBkYXRlU3R5bGUoKVxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLnVpLnVwZGF0ZUNoaWxkcmVuU3R5bGUoKVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICBcbiAgICB1cGRhdGVTdHlsZTogLT5cbiAgICAgICAgaWYgQG9iamVjdC5zdHlsZXNcbiAgICAgICAgICAgIGZvciBzdHlsZSBpbiBAb2JqZWN0LnN0eWxlc1xuICAgICAgICAgICAgICAgIGlmICFAdmlld0RhdGFfW3N0eWxlLnNlbGVjdG9yXVxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5yZXZlcnQoQG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3Igc3R5bGUgaW4gQG9iamVjdC5zdHlsZXNcbiAgICAgICAgICAgICAgICBpZiBzdHlsZS50YXJnZXQgPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgaWYgQHZpZXdEYXRhX1tzdHlsZS5zZWxlY3Rvcl1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFwcGx5KEBvYmplY3QpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBvYmplY3RzID0gQG9iamVjdC5wYXJlbnRzQnlTdHlsZVtzdHlsZS50YXJnZXRdXG4gICAgICAgICAgICAgICAgICAgIGlmIG9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdHNbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9iamVjdCBhbmQgb2JqZWN0LnVpLnZpZXdEYXRhX1tzdHlsZS5zZWxlY3Rvcl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hcHBseShAb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgQG9iamVjdC5mb250XG4gICAgICAgICAgICAgICAgQG9iamVjdC5iZWhhdmlvci5yZWZyZXNoPygpICMgRklYTUU6IENyZWF0ZXMgYSBkZXBlbmRlbmN5IG9uIFRleHQtQmVoYXZpb3JcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgYmluZGluZy1oYW5kbGVyLlxuICAgICogXG4gICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICMjIyAgIFxuICAgIHVwZGF0ZTogLT5cbiAgICAgICAgaWYgQG5leHRLZXlPYmplY3RJZCBhbmQgIUBuZXh0S2V5T2JqZWN0XG4gICAgICAgICAgICBAbmV4dEtleU9iamVjdCA9IGdzLk9iamVjdE1hbmFnZXIuY3VycmVudC5vYmplY3RCeUlkKEBuZXh0S2V5T2JqZWN0SWQpXG4gICAgICAgIFxuICAgICBcbnVpLkNvbXBvbmVudF9VSUJlaGF2aW9yID0gQ29tcG9uZW50X1VJQmVoYXZpb3IiXX0=\n//# sourceURL=Component_UIBehavior_146.js" }, "summary": [ "name", "type" ] } |