Subversion Repository Public Repository

Nextrek

Diff Revisions 1085 vs 1086 for /s2s/data/5BCC16F29DC79547E53B16B76EC0822CB2E9.json

Diff revisions: vs.
  @@ -1 +1,18 @@
1 - {"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 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 \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 var scene;\n scene = SceneManager.scene;\n scene.preparing = true;\n this.object.update();\n this.object.update();\n return scene.preparing = false;\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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LEtBQUssQ0FBQyxLQUFOLENBQVksSUFBQyxDQUFBLE1BQWIsRUFESjthQUZKO1dBTEo7O0FBREo7TUFXQSxJQUFHLElBQUMsQ0FBQSxNQUFNLENBQUMsSUFBWDs7Y0FDb0IsQ0FBQztTQURyQjtPQWhCSjs7QUFtQkEsV0FBTztFQXBCRTs7O0FBc0JiOzs7Ozs7aUNBS0EsTUFBQSxHQUFRLFNBQUE7SUFDSixJQUFHLElBQUMsQ0FBQSxlQUFELElBQXFCLENBQUMsSUFBQyxDQUFBLGFBQTFCO2FBQ0ksSUFBQyxDQUFBLGFBQUQsR0FBaUIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBekIsQ0FBb0MsSUFBQyxDQUFBLGVBQXJDLEVBRHJCOztFQURJOzs7O0dBdFV1QixFQUFFLENBQUM7O0FBMlV0QyxFQUFFLENBQUMsb0JBQUgsR0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyIjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiNcbiMgICBTY3JpcHQ6IENvbXBvbmVudF9TdHlsZUhhbmRsZXJcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIENvbXBvbmVudF9VSUJlaGF2aW9yIGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgIyMjKlxuICAgICogQ2FsbGVkIGlmIHRoaXMgb2JqZWN0IGluc3RhbmNlIGlzIHJlc3RvcmVkIGZyb20gYSBkYXRhLWJ1bmRsZS4gSXQgY2FuIGJlIHVzZWRcbiAgICAqIHJlLWFzc2lnbiBldmVudC1oYW5kbGVyLCBhbm9ueW1vdXMgZnVuY3Rpb25zLCBldGMuXG4gICAgKiBcbiAgICAqIEBtZXRob2Qgb25EYXRhQnVuZGxlUmVzdG9yZS5cbiAgICAqIEBwYXJhbSBPYmplY3QgZGF0YSAtIFRoZSBkYXRhLWJ1bmRsZVxuICAgICogQHBhcmFtIGdzLk9iamVjdENvZGVjQ29udGV4dCBjb250ZXh0IC0gVGhlIGNvZGVjLWNvbnRleHQuXG4gICAgIyMjXG4gICAgb25EYXRhQnVuZGxlUmVzdG9yZTogKGRhdGEsIGNvbnRleHQpIC0+XG4gICAgICAgIEBzZXR1cEV2ZW50SGFuZGxlcnMoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBAbW9kdWxlIHVpXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X1VJQmVoYXZpb3JcbiAgICAqIEBleHRlbmRzIGdzLkNvbXBvbmVudFxuICAgICogQG1lbWJlcm9mIHVpXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogKCkgLT5cbiAgICAgICAgQGJyZWFrQ2hhaW5BdCA9IG51bGxcbiAgICAgICAgQGNvbnRhaW5zUG9pbnRlciA9IG5vXG4gICAgICAgIEBpc0FuaW1hdGluZyA9IG5vXG4gICAgICAgIEB2aWV3RGF0YV8gPSBbeWVzLCBubywgbm8sIHllcywgbm9dXG4gICAgICAgIEBuZXh0S2V5T2JqZWN0SWQgPSBcIlwiXG4gICAgICAgIEBuZXh0S2V5T2JqZWN0XyA9IG51bGxcbiAgICAgICAgQHByZXZLZXlPYmplY3RfID0gbnVsbFxuICAgICAgICBcbiAgICBAYWNjZXNzb3JzIFwibmV4dEtleU9iamVjdFwiLCBcbiAgICAgICAgc2V0OiAodikgLT5cbiAgICAgICAgICAgIEBuZXh0S2V5T2JqZWN0XyA9IHZcbiAgICAgICAgICAgIGlmIHZcbiAgICAgICAgICAgICAgICB2LnVpLnByZXZLZXlPYmplY3RfID0gQG9iamVjdFxuICAgICAgICBnZXQ6IC0+IEBuZXh0S2V5T2JqZWN0X1xuICAgICAgICBcbiAgICBAYWNjZXNzb3JzIFwicHJldktleU9iamVjdFwiLCBcbiAgICAgICAgc2V0OiAodikgLT5cbiAgICAgICAgICAgIEBwcmV2S2V5T2JqZWN0XyA9IHZcbiAgICAgICAgICAgIGlmIHZcbiAgICAgICAgICAgICAgICB2LnVpLm5leHRLZXlPYmplY3RfID0gQG9iamVjdFxuICAgICAgICBnZXQ6IC0+IEBwcmV2S2V5T2JqZWN0X1xuICAgICAgICAgICAgICAgIFxuICAgIEBhY2Nlc3NvcnMgXCJzZWxlY3RlZFwiLCBcbiAgICAgICAgc2V0OiAodikgLT4gXG4gICAgICAgICAgICBpZiB2ICE9IEB2aWV3RGF0YV9bMl1cbiAgICAgICAgICAgICAgICBAdmlld0RhdGFfWzJdID0gdlxuICAgICAgICAgICAgICAgIEB1cGRhdGVTdHlsZSgpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGdldDogLT4gQHZpZXdEYXRhX1syXVxuICAgICAgICBcbiAgICBAYWNjZXNzb3JzIFwiaG92ZXJcIiwgXG4gICAgICAgIHNldDogKHYpIC0+IFxuICAgICAgICAgICAgaWYgdiAhPSBAdmlld0RhdGFfWzFdXG4gICAgICAgICAgICAgICAgQHZpZXdEYXRhX1sxXSA9IHZcbiAgICAgICAgICAgICAgICBAdXBkYXRlU3R5bGUoKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICBnZXQ6IC0+IEB2aWV3RGF0YV9bMV1cbiAgICAgICAgXG4gICAgQGFjY2Vzc29ycyBcImVuYWJsZWRcIixcbiAgICAgICAgc2V0OiAodikgLT4gXG4gICAgICAgICAgICBpZiB2ICE9IEB2aWV3RGF0YV9bM11cbiAgICAgICAgICAgICAgICBAdmlld0RhdGFfWzNdID0gdlxuICAgICAgICAgICAgICAgIEB1cGRhdGVTdHlsZSgpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGdldDogLT4gQHZpZXdEYXRhX1szXVxuICAgICAgICBcbiAgICBAYWNjZXNzb3JzIFwiZm9jdXNlZFwiLFxuICAgICAgICBzZXQ6ICh2KSAtPlxuICAgICAgICAgICAgaWYgdiAhPSBAdmlld0RhdGFfWzRdXG4gICAgICAgICAgICAgICAgQHZpZXdEYXRhX1s0XSA9IHZcbiAgICAgICAgICAgICAgICBAdXBkYXRlU3R5bGUoKVxuICAgICAgICBnZXQ6IC0+IEB2aWV3RGF0YV9bNF1cbiAgICAgICAgXG4gICAgQGFjY2Vzc29ycyBcInZpZXdEYXRhXCIsXG4gICAgICAgIHNldDogKHYpIC0+XG4gICAgICAgICAgICBpZiB2ICE9IEB2aWV3RGF0YV9cbiAgICAgICAgICAgICAgICBAdmlld0RhdGFfID0gdlxuICAgICAgICAgICAgICAgIEB1cGRhdGVTdHlsZSgpXG4gICAgICAgIGdldDogLT4gQHZpZXdEYXRhX1xuICAgIFxuICAgIFxuICAgICMjIypcbiAgICAqIFByZXBhcmVzIHRoZSBVSS1PYmplY3QgZm9yIGRpc3BsYXkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWRcbiAgICAqIGJlZm9yZSBhIG5ldyBjcmVhdGVkIFVJLU9iamVjdCB3aWxsIGJlIGRpc3BsYXllZCB0byBwb3NpdGlvbiBhbGxcbiAgICAqIHN1Yi1lbGVtZW50cyBjb3JyZWN0bHkuXG4gICAgKlxuICAgICogQG1ldGhvZCBwcmVwYXJlXG4gICAgIyMjXG4gICAgcHJlcGFyZTogLT5cbiAgICAgICAgc2NlbmUgPSBTY2VuZU1hbmFnZXIuc2NlbmVcbiAgICAgICAgc2NlbmUucHJlcGFyaW5nID0geWVzXG4gICAgICAgIEBvYmplY3QudXBkYXRlKCkgIyBGaXJzdCBVcGRhdGU6IEJyaW5nIGFsbCBzdWItZWxlbWVudHMgaW4gY29ycmVjdCBzaXplXG4gICAgICAgIEBvYmplY3QudXBkYXRlKCkgIyBTZWNvbmQgVXBkYXRlOiBDb3JyZWN0IGxheW91dFxuICAgICAgICBzY2VuZS5wcmVwYXJpbmcgPSBub1xuICAgICBcbiAgICAgXG4gICAgIyMjKlxuICAgICogRXhlY3V0ZXMgYW4gYW5pbWF0aW9uIGRlZmluZWQgZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuIEVhY2ggVUktT2JqZWN0XG4gICAgKiBjYW4gaGF2ZSBhbmltYXRpb25zIGZvciBjZXJ0YWluIGV2ZW50cyBkZWZpbmVkIGluIEpTT04uXG4gICAgKlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIGV4ZWN1dGUgdGhlIGFuaW1hdGlvbiBmb3Igc3VjaCBhcyBcIm9uVGVybWluYXRlXCIgb3IgXCJvbkluaXRpYWxpemVcIi4gSWZcbiAgICAqIG5vIGFuaW1hdGlvbiBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LCBub3RoaW5nIHdpbGwgaGFwcGVuIGFuZCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgXG4gICAgKiBpbW1lZGlhdGVseS5cbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLlxuICAgICogQG1ldGhvZCBleGVjdXRlQW5pbWF0aW9uXG4gICAgIyMjXG4gICAgZXhlY3V0ZUFuaW1hdGlvbjogKGV2ZW50LCBjYWxsYmFjaykgLT5cbiAgICAgICAgQGlzQW5pbWF0aW5nID0geWVzXG4gICAgICAgIEBkaXNhcHBlYXJDb3VudGVyID0gQG9iamVjdC5zdWJPYmplY3RzLmxlbmd0aCArIDFcbiAgICAgICAgQGRpc2FwcGVhckNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgICAgXG4gICAgICAgIGZvciBvYmplY3QgaW4gQG9iamVjdC5zdWJPYmplY3RzXG4gICAgICAgICAgICBpZiBvYmplY3QudWlcbiAgICAgICAgICAgICAgICBvYmplY3QudWkuZXhlY3V0ZUFuaW1hdGlvbihldmVudCwgKHNlbmRlcikgPT5cbiAgICAgICAgICAgICAgICAgICAgQGRpc2FwcGVhckNvdW50ZXItLVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgQGRpc2FwcGVhckNvdW50ZXIgPT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgQGlzQW5pbWF0aW5nID0gbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIEBkaXNhcHBlYXJDYWxsYmFjaz8oQG9iamVjdClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgQGRpc2FwcGVhckNvdW50ZXItLVxuICAgICAgICAgXG4gICAgICAgIGFuaW1hdGlvbiA9IEBvYmplY3QuYW5pbWF0aW9ucz8uZmlyc3QgKGEpIC0+IGEuZXZlbnRzLmluZGV4T2YoZXZlbnQpICE9IC0xXG4gICAgICAgIFxuICAgICAgICBpZiBhbmltYXRpb25cbiAgICAgICAgICAgIEBvYmplY3QuYW5pbWF0aW9uRXhlY3V0b3IuZXhlY3V0ZShhbmltYXRpb24sIChzZW5kZXIpID0+XG4gICAgICAgICAgICAgICAgQGRpc2FwcGVhckNvdW50ZXItLVxuICAgICAgICAgICAgICAgIGlmIEBkaXNhcHBlYXJDb3VudGVyID09IDBcbiAgICAgICAgICAgICAgICAgICAgQGlzQW5pbWF0aW5nID0gbm9cbiAgICAgICAgICAgICAgICAgICAgQGRpc2FwcGVhckNhbGxiYWNrPyhAb2JqZWN0KSBcbiAgICAgICAgICAgIClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQGRpc2FwcGVhckNvdW50ZXItLVxuICAgICAgICAgICAgaWYgQGRpc2FwcGVhckNvdW50ZXIgPT0gMFxuICAgICAgICAgICAgICAgIEBpc0FuaW1hdGluZyA9IG5vXG4gICAgICAgICAgICAgICAgQGRpc2FwcGVhckNhbGxiYWNrPyhAb2JqZWN0KSBcbiAgICBcbiAgICAjIyMqXG4gICAgKiBFeGVjdXRlcyB0aGUgYW5pbWF0aW9uIGRlZmluZWQgZm9yIHRoZSBcIm9uSW5pdGlhbGl6ZVwiIGV2ZW50LiBFYWNoIFVJLU9iamVjdFxuICAgICogY2FuIGhhdmUgYW5pbWF0aW9ucyBmb3IgY2VydGFpbiBldmVudHMgZGVmaW5lZCBpbiBKU09OLlxuICAgICpcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLlxuICAgICogQG1ldGhvZCBhcHBlYXJcbiAgICAjIyMgICAgICAgIFxuICAgIGFwcGVhcjogKGNhbGxiYWNrKSAtPiBcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLmVtaXQoXCJ1aUFuaW1hdGlvblN0YXJ0XCIpXG4gICAgICAgIGNiID0gKHNlbmRlcikgPT4gXG4gICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInVpQW5pbWF0aW9uRmluaXNoXCIpXG4gICAgICAgICAgICBjYWxsYmFjaz8oc2VuZGVyKVxuICAgICAgICBAZXhlY3V0ZUFuaW1hdGlvbihcIm9uSW5pdGlhbGl6ZVwiLCBjYilcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogRXhlY3V0ZXMgdGhlIGFuaW1hdGlvbiBkZWZpbmVkIGZvciB0aGUgXCJvblRlcm1pbmF0ZVwiIGV2ZW50LiBFYWNoIFVJLU9iamVjdFxuICAgICogY2FuIGhhdmUgYW5pbWF0aW9ucyBmb3IgY2VydGFpbiBldmVudHMgZGVmaW5lZCBpbiBKU09OLlxuICAgICpcbiAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLlxuICAgICogQG1ldGhvZCBkaXNhcHBlYXJcbiAgICAjIyMgICAgXG4gICAgZGlzYXBwZWFyOiAoY2FsbGJhY2spIC0+IFxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcInVpQW5pbWF0aW9uU3RhcnRcIilcbiAgICAgICAgY2IgPSAoc2VuZGVyKSA9PiBcbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5lbWl0KFwidWlBbmltYXRpb25GaW5pc2hcIilcbiAgICAgICAgICAgIGNhbGxiYWNrPyhzZW5kZXIpXG4gICAgICAgIEBleGVjdXRlQW5pbWF0aW9uKFwib25UZXJtaW5hdGVcIiwgY2IpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIERpc3Bvc2VzIHRoZSBjb21wb25lbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAgIyMjXG4gICAgZGlzcG9zZTogLT5cbiAgICAgICAgc3VwZXJcbiAgICAgICAgXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyIFwibW91c2VVcFwiLCBAb2JqZWN0XG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwib2JqZWN0R290Rm9jdXNcIiwgQG9iamVjdClcbiAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9mZkJ5T3duZXIoXCJrZXlVcFwiLCBAb2JqZWN0KVxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcIm1vdXNlRG93blwiLCBAb2JqZWN0KVxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcIm1vdXNlTW92ZWRcIiwgQG9iamVjdClcbiAgICAgXG4gICAgIyMjKlxuICAgICogQWRkcyBldmVudC1oYW5kbGVycyBmb3IgbW91c2UvdG91Y2ggZXZlbnRzXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cEV2ZW50SGFuZGxlcnNcbiAgICAjIyMgXG4gICAgc2V0dXBFdmVudEhhbmRsZXJzOiAtPlxuICAgICAgICBpZiBAb2JqZWN0LmZvY3VzYWJsZVxuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwib2JqZWN0R290Rm9jdXNcIiwgKChlKSA9PlxuICAgICAgICAgICAgICAgIGlmIGUuc2VuZGVyICE9IEBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgQGJsdXIoKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG51bGwsIEBvYmplY3RcblxuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwia2V5VXBcIiwgKChlKSA9PlxuICAgICAgICAgICAgICAgIGlmIEBmb2N1c2VkXG4gICAgICAgICAgICAgICAgICAgIGlmIEBuZXh0S2V5T2JqZWN0IGFuZCAoSW5wdXQucmVsZWFzZShJbnB1dC5LRVlfRE9XTikgb3IgSW5wdXQucmVsZWFzZShJbnB1dC5LRVlfUklHSFQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgQG5leHRLZXlPYmplY3QudWkuZm9jdXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgZS5icmVha0NoYWluID0geWVzXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgQHByZXZLZXlPYmplY3QgYW5kIChJbnB1dC5yZWxlYXNlKElucHV0LktFWV9VUCkgb3IgSW5wdXQucmVsZWFzZShJbnB1dC5LRVlfTEVGVCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBAcHJldktleU9iamVjdC51aS5mb2N1cygpXG4gICAgICAgICAgICAgICAgICAgICAgICBlLmJyZWFrQ2hhaW4gPSB5ZXNcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBudWxsLCBAb2JqZWN0XG4gICAgICAgICAgICBcbiAgICAgICAgaWYgQG9iamVjdC5zdHlsZXMuZmlyc3QgKChzKSAtPiBzLnNlbGVjdG9yID09IDEpXG4gICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub24gXCJtb3VzZU1vdmVkXCIsICgoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmICFAZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICBjb250YWlucyA9IFJlY3QuY29udGFpbnMoQG9iamVjdC5kc3RSZWN0LngsIEBvYmplY3QuZHN0UmVjdC55LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dC5Nb3VzZS54IC0gQG9iamVjdC5vcmlnaW4ueCwgSW5wdXQuTW91c2UueSAtIEBvYmplY3Qub3JpZ2luLnkpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIEBjb250YWluc1BvaW50ZXIgIT0gY29udGFpbnMgb3IgKEBob3ZlciBhbmQgIWNvbnRhaW5zKVxuICAgICAgICAgICAgICAgICAgICAgICAgQGNvbnRhaW5zUG9pbnRlciA9IGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0Lm5lZWRzVXBkYXRlID0geWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBAaG92ZXIgPSBjb250YWluc1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBAdXBkYXRlUGFyZW50U3R5bGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgQHVwZGF0ZUNoaWxkcmVuU3R5bGUoKVxuICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBudWxsLCBAb2JqZWN0XG4gICAgICAgICAgICBcbiAgICAgICAgaWYgQG9iamVjdC5mb2N1c2FibGUgb3IgQG9iamVjdC5zdHlsZXMuZmlyc3QgKChzKSAtPiBzLnNlbGVjdG9yID09IDIgfHwgcy5zZWxlY3RvciA9PSA0KVxuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLm9uIFwibW91c2VEb3duXCIsICgoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmICFAZW5hYmxlZCBvciBJbnB1dC5Nb3VzZS5idXR0b25zW0lucHV0Lk1vdXNlLkxFRlRdICE9IDFcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgPSBSZWN0LmNvbnRhaW5zKEBvYmplY3QuZHN0UmVjdC54LCBAb2JqZWN0LmRzdFJlY3QueSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBvYmplY3QuZHN0UmVjdC53aWR0aCwgQG9iamVjdC5kc3RSZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQuTW91c2UueCAtIEBvYmplY3Qub3JpZ2luLngsIElucHV0Lk1vdXNlLnkgLSBAb2JqZWN0Lm9yaWdpbi55KVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIEBvYmplY3QubmVlZHNVcGRhdGUgPSB5ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvY3VzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgQG9iamVjdC5zZWxlY3RhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgQG9iamVjdC5ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc2VsZWN0ZWQgPSB5ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBncy5PYmplY3RNYW5hZ2VyLmN1cnJlbnQub2JqZWN0c0J5R3JvdXAoQG9iamVjdC5ncm91cClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG9iamVjdCBpbiBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2JqZWN0ICE9IEBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QudWkuc2VsZWN0ZWQgPSBub1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHNlbGVjdGVkID0gIUBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1cGRhdGVTdHlsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBAdXBkYXRlUGFyZW50U3R5bGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgbnVsbCwgQG9iamVjdCwgMFxuICAgICAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIEluaXRpYWxpemVzIHRoZSBiaW5kaW5nLWhhbmRsZXIuXG4gICAgKiBcbiAgICAqIEBtZXRob2Qgc2V0dXBcbiAgICAjIyNcbiAgICBzZXR1cDogLT5cbiAgICAgICAgQHNldHVwRXZlbnRIYW5kbGVycygpXG4gICAgXG4gICAgIyMjKlxuICAgICogR2l2ZXMgdGhlIGlucHV0IGZvY3VzIHRvIHRoaXMgVUkgb2JqZWN0LiBJZiB0aGUgVUkgb2JqZWN0IGlzIG5vdCBmb2N1c2FibGUsIG5vdGhpbmcgd2lsbCBoYXBwZW4uXG4gICAgKiBcbiAgICAqIEBtZXRob2QgZm9jdXNcbiAgICAjIyMgICAgICAgICAgICAgICBcbiAgICBmb2N1czogLT5cbiAgICAgICAgaWYgQG9iamVjdC5mb2N1c2FibGUgYW5kICFAZm9jdXNlZFxuICAgICAgICAgICAgQGZvY3VzZWQgPSB5ZXNcbiAgICAgICAgICAgIEB1cGRhdGVDaGlsZHJlblN0eWxlKClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZ3MuR2xvYmFsRXZlbnRNYW5hZ2VyLmVtaXQoXCJvYmplY3RHb3RGb2N1c1wiLCBAb2JqZWN0KVxuICAgIFxuICAgICMjIypcbiAgICAqIFJlbW92ZXMgdGhlIGlucHV0IGZvY3VzIGZyb20gdGhpcyBVSSBvYmplY3QuIElmIHRoZSBVSSBvYmplY3QgaXMgbm90IGZvY3VzYWJsZSwgbm90aGluZyB3aWxsIGhhcHBlbi5cbiAgICAqIFxuICAgICogQG1ldGhvZCBibHVyXG4gICAgIyMjXG4gICAgYmx1cjogLT5cbiAgICAgICAgaWYgQG9iamVjdC5mb2N1c2FibGUgYW5kIEBmb2N1c2VkXG4gICAgICAgICAgICBAZm9jdXNlZCA9IG5vXG4gICAgICAgICAgICBAdXBkYXRlQ2hpbGRyZW5TdHlsZSgpXG4gICAgICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIuZW1pdChcIm9iamVjdExvc3RGb2N1c1wiLCBAb2JqZWN0KVxuICAgICAgICAgICAgXG4gICAgdXBkYXRlUGFyZW50U3R5bGU6IC0+XG4gICAgICAgIHBhcmVudCA9IEBvYmplY3QucGFyZW50XG4gICAgICAgIHdoaWxlIHBhcmVudFxuICAgICAgICAgICAgcGFyZW50LnVpPy51cGRhdGVTdHlsZSgpXG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgXG4gICAgdXBkYXRlQ2hpbGRyZW5TdHlsZTogKCkgLT5cbiAgICAgICAgaWYgQG9iamVjdC5jb250cm9sc1xuICAgICAgICAgICAgZm9yIGNvbnRyb2wgaW4gQG9iamVjdC5jb250cm9sc1xuICAgICAgICAgICAgICAgIGlmIGNvbnRyb2wgYW5kIGNvbnRyb2wudWlcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC51aS51cGRhdGVTdHlsZSgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudWkudXBkYXRlQ2hpbGRyZW5TdHlsZSgpXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgIFxuICAgIHVwZGF0ZVN0eWxlOiAtPlxuICAgICAgICBpZiBAb2JqZWN0LnN0eWxlc1xuICAgICAgICAgICAgZm9yIHN0eWxlIGluIEBvYmplY3Quc3R5bGVzXG4gICAgICAgICAgICAgICAgaWYgIUB2aWV3RGF0YV9bc3R5bGUuc2VsZWN0b3JdXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnJldmVydChAb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciBzdHlsZSBpbiBAb2JqZWN0LnN0eWxlc1xuICAgICAgICAgICAgICAgIGlmIHN0eWxlLnRhcmdldCA9PSAtMVxuICAgICAgICAgICAgICAgICAgICBpZiBAdmlld0RhdGFfW3N0eWxlLnNlbGVjdG9yXVxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYXBwbHkoQG9iamVjdClcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdHMgPSBAb2JqZWN0LnBhcmVudHNCeVN0eWxlW3N0eWxlLnRhcmdldF1cbiAgICAgICAgICAgICAgICAgICAgaWYgb2JqZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gb2JqZWN0c1swXVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2JqZWN0IGFuZCBvYmplY3QudWkudmlld0RhdGFfW3N0eWxlLnNlbGVjdG9yXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFwcGx5KEBvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiBAb2JqZWN0LmZvbnRcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmJlaGF2aW9yLnJlZnJlc2g/KCkgIyBGSVhNRTogQ3JlYXRlcyBhIGRlcGVuZGVuY3kgb24gVGV4dC1CZWhhdmlvclxuICAgICAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBiaW5kaW5nLWhhbmRsZXIuXG4gICAgKiBcbiAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgIyMjICAgXG4gICAgdXBkYXRlOiAtPlxuICAgICAgICBpZiBAbmV4dEtleU9iamVjdElkIGFuZCAhQG5leHRLZXlPYmplY3RcbiAgICAgICAgICAgIEBuZXh0S2V5T2JqZWN0ID0gZ3MuT2JqZWN0TWFuYWdlci5jdXJyZW50Lm9iamVjdEJ5SWQoQG5leHRLZXlPYmplY3RJZClcbiAgICAgICAgXG4gICAgIFxudWkuQ29tcG9uZW50X1VJQmVoYXZpb3IgPSBDb21wb25lbnRfVUlCZWhhdmlvciJdfQ==\n//# sourceURL=Component_UIBehavior_143.js"},"summary":["name","type"]}
1 + {
2 + "uid": "5BCC16F29DC79547E53B16B76EC0822CB2E9",
3 + "isLoaded": true,
4 + "lastModificationTime": 0,
5 + "items": {
6 + "name": "Component_UIBehavior",
7 + "type": "game_script",
8 + "order": 14,
9 + "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",
10 + "parentId": "01A95DA3K01E8A4CB4SBE17E790BCE1FC035",
11 + "folder": false,
12 + "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"
13 + },
14 + "summary": [
15 + "name",
16 + "type"
17 + ]
18 + }