Subversion Repository Public Repository

Nextrek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
    "uid": "87BE6898K0E78A48FCSB889E1DAAB10BF84B",
    "isLoaded": true,
    "lastModificationTime": 0,
    "items": {
        "name": "Component_HotspotBehavior",
        "type": "game_script",
        "order": 1,
        "content": "# ===================================================================\n#\n#   Script: Component_HotspotBehavior\n#\n#   $$COPYRIGHT$$\n#\n# ===================================================================\n\nclass HotspotShape\n    @RECTANGLE = \"rect\"\n    @PIXEL = \"pixel\"\ngs.HotspotShape = HotspotShape\n\nclass Component_HotspotBehavior 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    * Adds a hotspot-behavior to a game object. That allows a game object\n    * to respond to mouse/touch actions by firing an action-event or changing\n    * the game object's image.\n    *\n    * @module gs\n    * @class Component_HotspotBehavior\n    * @extends gs.Component\n    * @memberof gs\n    * @constructor\n    ###\n    constructor: (params) ->\n        ###*\n        * The shape used to detect if a hotspot is clicked, hovered, etc.\n        * @property shape\n        * @type boolean\n        ###\n        @shape = gs.HotspotShape.RECTANGLE\n        \n        ###*\n        * Indicates if the hotspot is selected.\n        * @property selected\n        * @type boolean\n        ###\n        @selected = no\n        \n        ###*\n        * Indicates if the hotspot is enabled.\n        * @property enabled\n        * @type boolean\n        ###\n        @enabled = yes\n        \n        ###*\n        * @property imageHandling\n        * @type number\n        * @protected\n        ###\n        @imageHandling = 0\n        \n        ###*\n        * Indicates if the mouse/touch pointer is inside the hotspot bounds.\n        * @property contains\n        * @type boolean\n        * @protected\n        ###\n        @containsPointer = no\n        \n        ###*\n        * Indicates if the action-button was pressed before.\n        * @property buttonUp\n        * @type boolean\n        * @protected\n        ###\n        @buttonUp = no\n        \n        ###*\n        * Indicates if the action-button is pressed.\n        * @property buttonDown\n        * @type boolean\n        * @protected\n        ###\n        @buttonDown = no\n        \n        ###*\n        * @property actionButtons\n        * @type Object\n        * @protected\n        ###\n        @actionButtons = { \"left\": Input.Mouse.BUTTON_LEFT, \"right\": Input.Mouse.BUTTON_RIGHT, \"middle\": Input.Mouse.BUTTON_MIDDLE }\n        \n        ###*\n        * The default action-button. By default the left-button is used.\n        *\n        * @property actionButton\n        * @type number\n        ###\n        @actionButton = @actionButtons[params?.actionButton ? \"left\"]\n        \n        ###*\n        * The sound played if the hotspot action is executed.\n        * @property sound\n        * @type Object\n        ###\n        @sound = params?.sound\n\n        ###*\n        * <p>The sounds played depending on the hotspot state.</p>\n        * <ul>\n        * <li>0 = Select Sound</li>\n        * <li>1 = Unselect Sound</li>\n        * </ul>\n        * @property sounds\n        * @type Object[]\n        ###\n        @sounds = params?.sounds || []\n    \n    \n    ###*\n    * Gets the render-index of the object associated with the hotspot component. This \n    * implementation is necessary to be able to act as an owner for gs.EventEmitter.on \n    * event registration. \n    *\n    * @property rIndex\n    * @type number\n    ###\n    @accessors \"rIndex\", \n        get: -> @object.rIndex\n        \n    ###*\n    * Sets up event handlers.\n    *\n    * @method setupEventHandlers\n    ###   \n    setupEventHandlers: ->\n        gs.GlobalEventManager.offByOwner(\"mouseUp\", this)\n        gs.GlobalEventManager.offByOwner(\"mouseMoved\", this)\n        \n        gs.GlobalEventManager.on \"mouseUp\", ((e) => \n            return if not @object.visible\n            mx = Input.Mouse.x - @object.origin.x\n            my = Input.Mouse.y - @object.origin.y\n            contains = Rect.contains(@object.dstRect.x, @object.dstRect.y, \n                         @object.dstRect.width, @object.dstRect.height,\n                         mx, my)\n            if contains\n                contains = @checkShape(mx - @object.dstRect.x, my - @object.dstRect.y)\n                if contains\n                    @containsPointer = contains\n                    @updateInput()\n                    @updateEvents()\n                    @object.needsUpdate = yes\n                    e.breakChain = yes\n            ),\n            null, this\n            \n        if @object.images or yes\n            gs.GlobalEventManager.on \"mouseMoved\", ((e) =>\n                return if not @object.visible\n                \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                    mx = Input.Mouse.x - @object.origin.x\n                    my = Input.Mouse.y - @object.origin.y\n                    contains = @checkShape(mx - @object.dstRect.x, my - @object.dstRect.y)\n                    \n                if @containsPointer != contains\n                    @containsPointer = contains\n                    @object.needsUpdate = yes\n                    \n                    if contains\n                        @object.events.emit(\"enter\", this)\n                    else\n                        @object.events.emit(\"leave\", this)\n                \n                @updateInput()\n            ),\n            null, this\n            \n    ###*\n    * Initializes the hotspot component.\n    *\n    * @method setup\n    ###\n    setup: ->\n        super\n        \n        @sound = ui.Component_FormulaHandler.fieldValue(@object, @sound)\n        \n        if @sounds?\n            for sound, i in @sounds\n                @sounds[i] = ui.Component_FormulaHandler.fieldValue(@object, sound)\n        else\n           @sounds = []\n        \n        \n        @setupEventHandlers()\n                \n \n    \n    ###*\n    * Disposes the component.\n    *\n    * @method dispose\n    ###\n    dispose: ->\n        super\n        \n        gs.GlobalEventManager.offByOwner(\"mouseUp\", this)\n        gs.GlobalEventManager.offByOwner(\"mouseMoved\", this)\n        \n    \n    ###*\n    * Checks if the specified point is inside of the hotspot's shape.\n    *\n    * @method checkShape\n    * @param x - The x-coordinate of the point.\n    * @param y - The y-coordinate of the point.\n    * @return If <b>true</b> the point is inside of the hotspot's shape. Otherwise <b>false</b>.\n    ###  \n    checkShape: (x, y) ->\n        result = yes\n        \n        switch @shape\n            when gs.HotspotShape.PIXEL\n                if @object.bitmap\n                    result = @object.bitmap.isPixelSet(x, y)\n                else\n                    result = @object.target?.bitmap.isPixelSet(x, y)\n        \n        return result\n        \n    ###*\n    * Updates the image depending on the hotspot state.\n    *\n    * @method updateImage\n    * @protected\n    ###                \n    updateImage: ->\n        object = @object.target || @object\n        if @object.images?\n            baseImage = if @enabled then @object.images[4] || @object.images[0] else @object.images[0]\n            if @containsPointer\n                if @object.selected or @selected\n                    object.image = @object.images[3] || @object.images[2] || baseImage\n                else\n                    object.image = @object.images[1] || baseImage\n            else\n                if @object.selected or @selected\n                    object.image = @object.images[2] || @object.images[4] || baseImage\n                else\n                    object.image = baseImage\n                    \n            if !object.image\n                object.bitmap = null\n\n    \n    ###*\n    * Updates the hotspot position and size from an other target game object. For example, \n    * that is useful for adding a hotspot to an other moving game object.\n    *\n    * @method updateFromTarget\n    * @protected\n    ### \n    updateFromTarget: ->\n        if @object.target?\n            @object.dstRect.x = @object.target.dstRect.x\n            @object.dstRect.y = @object.target.dstRect.y\n            @object.dstRect.width = @object.target.dstRect.width\n            @object.dstRect.height = @object.target.dstRect.height\n            @object.offset.x = @object.target.offset.x\n            @object.offset.y = @object.target.offset.y\n            @object.origin.x = @object.target.origin.x\n            @object.origin.y = @object.target.origin.y \n     \n    ###*\n    * Updates the event-handling and fires necessary events.\n    *\n    * @method updateEvents\n    * @protected\n    ###        \n    updateEvents: ->\n        if @buttonUp and @object.enabled and @enabled and @object.visible\n            if @object.selectable\n                group = gs.ObjectManager.current.objectsByGroup(@object.group)\n                for object in group\n                    if object != @object\n                        object.selected = no\n                if @object.group\n                    @selected = yes\n                else\n                    @selected = !@selected\n                \n                if @selected\n                    AudioManager.playSound(@sounds[0] || @sound)\n                else\n                    AudioManager.playSound(@sounds[1] || @sound)\n                @object.events.emit(\"click\", this)\n                @object.events.emit(\"stateChanged\", @object)\n            else\n                AudioManager.playSound(@sounds[0] || @sound)\n                @object.events.emit(\"click\", this)\n                @object.events.emit(\"action\", this)\n    \n    ###*\n    * Updates the game object's color depending on the state of the hotspot.\n    *\n    * @method updateColor\n    * @protected\n    ###  \n    updateColor: ->\n        if !@object.enabled\n            @object.color.set(0, 0, 0, 100)\n        else\n            @object.color.set(0, 0, 0, 0)\n     \n    ###*\n    * Stores current states of mouse/touch pointer and buttons.\n    *\n    * @method updateInput\n    * @protected\n    ###        \n    updateInput: ->\n        @buttonUp = Input.Mouse.buttons[@actionButton] == 2 and @containsPointer\n        @buttonDown = Input.Mouse.buttons[@actionButton] == 1 and @containsPointer\n        \n    ###*\n    * Updates the hotspot component.\n    *\n    * @method update\n    ###\n    update: ->\n        if not @object.visible then return\n\n        @updateColor()\n        @updateFromTarget()\n        @updateImage()\n        \ngs.Component_HotspotBehavior = Component_HotspotBehavior",
        "parentId": "01A95DA3K01E8A4CB4SBE17E790BCE1FC035",
        "folder": false,
        "compiledContent": "var Component_HotspotBehavior, HotspotShape,\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\nHotspotShape = (function() {\n  function HotspotShape() {}\n\n  HotspotShape.RECTANGLE = \"rect\";\n\n  HotspotShape.PIXEL = \"pixel\";\n\n  return HotspotShape;\n\n})();\n\ngs.HotspotShape = HotspotShape;\n\nComponent_HotspotBehavior = (function(superClass) {\n  extend(Component_HotspotBehavior, 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_HotspotBehavior.prototype.onDataBundleRestore = function(data, context) {\n    return this.setupEventHandlers();\n  };\n\n\n  /**\n  * Adds a hotspot-behavior to a game object. That allows a game object\n  * to respond to mouse/touch actions by firing an action-event or changing\n  * the game object's image.\n  *\n  * @module gs\n  * @class Component_HotspotBehavior\n  * @extends gs.Component\n  * @memberof gs\n  * @constructor\n   */\n\n  function Component_HotspotBehavior(params) {\n\n    /**\n    * The shape used to detect if a hotspot is clicked, hovered, etc.\n    * @property shape\n    * @type boolean\n     */\n    var ref;\n    this.shape = gs.HotspotShape.RECTANGLE;\n\n    /**\n    * Indicates if the hotspot is selected.\n    * @property selected\n    * @type boolean\n     */\n    this.selected = false;\n\n    /**\n    * Indicates if the hotspot is enabled.\n    * @property enabled\n    * @type boolean\n     */\n    this.enabled = true;\n\n    /**\n    * @property imageHandling\n    * @type number\n    * @protected\n     */\n    this.imageHandling = 0;\n\n    /**\n    * Indicates if the mouse/touch pointer is inside the hotspot bounds.\n    * @property contains\n    * @type boolean\n    * @protected\n     */\n    this.containsPointer = false;\n\n    /**\n    * Indicates if the action-button was pressed before.\n    * @property buttonUp\n    * @type boolean\n    * @protected\n     */\n    this.buttonUp = false;\n\n    /**\n    * Indicates if the action-button is pressed.\n    * @property buttonDown\n    * @type boolean\n    * @protected\n     */\n    this.buttonDown = false;\n\n    /**\n    * @property actionButtons\n    * @type Object\n    * @protected\n     */\n    this.actionButtons = {\n      \"left\": Input.Mouse.BUTTON_LEFT,\n      \"right\": Input.Mouse.BUTTON_RIGHT,\n      \"middle\": Input.Mouse.BUTTON_MIDDLE\n    };\n\n    /**\n    * The default action-button. By default the left-button is used.\n    *\n    * @property actionButton\n    * @type number\n     */\n    this.actionButton = this.actionButtons[(ref = params != null ? params.actionButton : void 0) != null ? ref : \"left\"];\n\n    /**\n    * The sound played if the hotspot action is executed.\n    * @property sound\n    * @type Object\n     */\n    this.sound = params != null ? params.sound : void 0;\n\n    /**\n    * <p>The sounds played depending on the hotspot state.</p>\n    * <ul>\n    * <li>0 = Select Sound</li>\n    * <li>1 = Unselect Sound</li>\n    * </ul>\n    * @property sounds\n    * @type Object[]\n     */\n    this.sounds = (params != null ? params.sounds : void 0) || [];\n  }\n\n\n  /**\n  * Gets the render-index of the object associated with the hotspot component. This \n  * implementation is necessary to be able to act as an owner for gs.EventEmitter.on \n  * event registration. \n  *\n  * @property rIndex\n  * @type number\n   */\n\n  Component_HotspotBehavior.accessors(\"rIndex\", {\n    get: function() {\n      return this.object.rIndex;\n    }\n  });\n\n\n  /**\n  * Sets up event handlers.\n  *\n  * @method setupEventHandlers\n   */\n\n  Component_HotspotBehavior.prototype.setupEventHandlers = function() {\n    gs.GlobalEventManager.offByOwner(\"mouseUp\", this);\n    gs.GlobalEventManager.offByOwner(\"mouseMoved\", this);\n    gs.GlobalEventManager.on(\"mouseUp\", ((function(_this) {\n      return function(e) {\n        var contains, mx, my;\n        if (!_this.object.visible) {\n          return;\n        }\n        mx = Input.Mouse.x - _this.object.origin.x;\n        my = Input.Mouse.y - _this.object.origin.y;\n        contains = Rect.contains(_this.object.dstRect.x, _this.object.dstRect.y, _this.object.dstRect.width, _this.object.dstRect.height, mx, my);\n        if (contains) {\n          contains = _this.checkShape(mx - _this.object.dstRect.x, my - _this.object.dstRect.y);\n          if (contains) {\n            _this.containsPointer = contains;\n            _this.updateInput();\n            _this.updateEvents();\n            _this.object.needsUpdate = true;\n            return e.breakChain = true;\n          }\n        }\n      };\n    })(this)), null, this);\n    if (this.object.images || true) {\n      return gs.GlobalEventManager.on(\"mouseMoved\", ((function(_this) {\n        return function(e) {\n          var contains, mx, my;\n          if (!_this.object.visible) {\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            mx = Input.Mouse.x - _this.object.origin.x;\n            my = Input.Mouse.y - _this.object.origin.y;\n            contains = _this.checkShape(mx - _this.object.dstRect.x, my - _this.object.dstRect.y);\n          }\n          if (_this.containsPointer !== contains) {\n            _this.containsPointer = contains;\n            _this.object.needsUpdate = true;\n            if (contains) {\n              _this.object.events.emit(\"enter\", _this);\n            } else {\n              _this.object.events.emit(\"leave\", _this);\n            }\n          }\n          return _this.updateInput();\n        };\n      })(this)), null, this);\n    }\n  };\n\n\n  /**\n  * Initializes the hotspot component.\n  *\n  * @method setup\n   */\n\n  Component_HotspotBehavior.prototype.setup = function() {\n    var i, j, len, ref, sound;\n    Component_HotspotBehavior.__super__.setup.apply(this, arguments);\n    this.sound = ui.Component_FormulaHandler.fieldValue(this.object, this.sound);\n    if (this.sounds != null) {\n      ref = this.sounds;\n      for (i = j = 0, len = ref.length; j < len; i = ++j) {\n        sound = ref[i];\n        this.sounds[i] = ui.Component_FormulaHandler.fieldValue(this.object, sound);\n      }\n    } else {\n      this.sounds = [];\n    }\n    return this.setupEventHandlers();\n  };\n\n\n  /**\n  * Disposes the component.\n  *\n  * @method dispose\n   */\n\n  Component_HotspotBehavior.prototype.dispose = function() {\n    Component_HotspotBehavior.__super__.dispose.apply(this, arguments);\n    gs.GlobalEventManager.offByOwner(\"mouseUp\", this);\n    return gs.GlobalEventManager.offByOwner(\"mouseMoved\", this);\n  };\n\n\n  /**\n  * Checks if the specified point is inside of the hotspot's shape.\n  *\n  * @method checkShape\n  * @param x - The x-coordinate of the point.\n  * @param y - The y-coordinate of the point.\n  * @return If <b>true</b> the point is inside of the hotspot's shape. Otherwise <b>false</b>.\n   */\n\n  Component_HotspotBehavior.prototype.checkShape = function(x, y) {\n    var ref, result;\n    result = true;\n    switch (this.shape) {\n      case gs.HotspotShape.PIXEL:\n        if (this.object.bitmap) {\n          result = this.object.bitmap.isPixelSet(x, y);\n        } else {\n          result = (ref = this.object.target) != null ? ref.bitmap.isPixelSet(x, y) : void 0;\n        }\n    }\n    return result;\n  };\n\n\n  /**\n  * Updates the image depending on the hotspot state.\n  *\n  * @method updateImage\n  * @protected\n   */\n\n  Component_HotspotBehavior.prototype.updateImage = function() {\n    var baseImage, object;\n    object = this.object.target || this.object;\n    if (this.object.images != null) {\n      baseImage = this.enabled ? this.object.images[4] || this.object.images[0] : this.object.images[0];\n      if (this.containsPointer) {\n        if (this.object.selected || this.selected) {\n          object.image = this.object.images[3] || this.object.images[2] || baseImage;\n        } else {\n          object.image = this.object.images[1] || baseImage;\n        }\n      } else {\n        if (this.object.selected || this.selected) {\n          object.image = this.object.images[2] || this.object.images[4] || baseImage;\n        } else {\n          object.image = baseImage;\n        }\n      }\n      if (!object.image) {\n        return object.bitmap = null;\n      }\n    }\n  };\n\n\n  /**\n  * Updates the hotspot position and size from an other target game object. For example, \n  * that is useful for adding a hotspot to an other moving game object.\n  *\n  * @method updateFromTarget\n  * @protected\n   */\n\n  Component_HotspotBehavior.prototype.updateFromTarget = function() {\n    if (this.object.target != null) {\n      this.object.dstRect.x = this.object.target.dstRect.x;\n      this.object.dstRect.y = this.object.target.dstRect.y;\n      this.object.dstRect.width = this.object.target.dstRect.width;\n      this.object.dstRect.height = this.object.target.dstRect.height;\n      this.object.offset.x = this.object.target.offset.x;\n      this.object.offset.y = this.object.target.offset.y;\n      this.object.origin.x = this.object.target.origin.x;\n      return this.object.origin.y = this.object.target.origin.y;\n    }\n  };\n\n\n  /**\n  * Updates the event-handling and fires necessary events.\n  *\n  * @method updateEvents\n  * @protected\n   */\n\n  Component_HotspotBehavior.prototype.updateEvents = function() {\n    var group, j, len, object;\n    if (this.buttonUp && this.object.enabled && this.enabled && this.object.visible) {\n      if (this.object.selectable) {\n        group = gs.ObjectManager.current.objectsByGroup(this.object.group);\n        for (j = 0, len = group.length; j < len; j++) {\n          object = group[j];\n          if (object !== this.object) {\n            object.selected = false;\n          }\n        }\n        if (this.object.group) {\n          this.selected = true;\n        } else {\n          this.selected = !this.selected;\n        }\n        if (this.selected) {\n          AudioManager.playSound(this.sounds[0] || this.sound);\n        } else {\n          AudioManager.playSound(this.sounds[1] || this.sound);\n        }\n        this.object.events.emit(\"click\", this);\n        return this.object.events.emit(\"stateChanged\", this.object);\n      } else {\n        AudioManager.playSound(this.sounds[0] || this.sound);\n        this.object.events.emit(\"click\", this);\n        return this.object.events.emit(\"action\", this);\n      }\n    }\n  };\n\n\n  /**\n  * Updates the game object's color depending on the state of the hotspot.\n  *\n  * @method updateColor\n  * @protected\n   */\n\n  Component_HotspotBehavior.prototype.updateColor = function() {\n    if (!this.object.enabled) {\n      return this.object.color.set(0, 0, 0, 100);\n    } else {\n      return this.object.color.set(0, 0, 0, 0);\n    }\n  };\n\n\n  /**\n  * Stores current states of mouse/touch pointer and buttons.\n  *\n  * @method updateInput\n  * @protected\n   */\n\n  Component_HotspotBehavior.prototype.updateInput = function() {\n    this.buttonUp = Input.Mouse.buttons[this.actionButton] === 2 && this.containsPointer;\n    return this.buttonDown = Input.Mouse.buttons[this.actionButton] === 1 && this.containsPointer;\n  };\n\n\n  /**\n  * Updates the hotspot component.\n  *\n  * @method update\n   */\n\n  Component_HotspotBehavior.prototype.update = function() {\n    if (!this.object.visible) {\n      return;\n    }\n    this.updateColor();\n    this.updateFromTarget();\n    return this.updateImage();\n  };\n\n  return Component_HotspotBehavior;\n\n})(gs.Component);\n\ngs.Component_HotspotBehavior = Component_HotspotBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLElBQUEsdUNBQUE7RUFBQTs7O0FBQU07OztFQUNGLFlBQUMsQ0FBQSxTQUFELEdBQWE7O0VBQ2IsWUFBQyxDQUFBLEtBQUQsR0FBUzs7Ozs7O0FBQ2IsRUFBRSxDQUFDLFlBQUgsR0FBa0I7O0FBRVo7Ozs7QUFDRjs7Ozs7Ozs7O3NDQVFBLG1CQUFBLEdBQXFCLFNBQUMsSUFBRCxFQUFPLE9BQVA7V0FDakIsSUFBQyxDQUFBLGtCQUFELENBQUE7RUFEaUI7OztBQUdyQjs7Ozs7Ozs7Ozs7O0VBV2EsbUNBQUMsTUFBRDs7QUFDVDs7Ozs7QUFBQSxRQUFBO0lBS0EsSUFBQyxDQUFBLEtBQUQsR0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDOztBQUV6Qjs7Ozs7SUFLQSxJQUFDLENBQUEsUUFBRCxHQUFZOztBQUVaOzs7OztJQUtBLElBQUMsQ0FBQSxPQUFELEdBQVc7O0FBRVg7Ozs7O0lBS0EsSUFBQyxDQUFBLGFBQUQsR0FBaUI7O0FBRWpCOzs7Ozs7SUFNQSxJQUFDLENBQUEsZUFBRCxHQUFtQjs7QUFFbkI7Ozs7OztJQU1BLElBQUMsQ0FBQSxRQUFELEdBQVk7O0FBRVo7Ozs7OztJQU1BLElBQUMsQ0FBQSxVQUFELEdBQWM7O0FBRWQ7Ozs7O0lBS0EsSUFBQyxDQUFBLGFBQUQsR0FBaUI7TUFBRSxNQUFBLEVBQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUF0QjtNQUFtQyxPQUFBLEVBQVMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUF4RDtNQUFzRSxRQUFBLEVBQVUsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUE1Rjs7O0FBRWpCOzs7Ozs7SUFNQSxJQUFDLENBQUEsWUFBRCxHQUFnQixJQUFDLENBQUEsYUFBYyx1RUFBdUIsTUFBdkI7O0FBRS9COzs7OztJQUtBLElBQUMsQ0FBQSxLQUFELG9CQUFTLE1BQU0sQ0FBRTs7QUFFakI7Ozs7Ozs7OztJQVNBLElBQUMs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LEVBQTJCLENBQTNCLEVBSEo7O0VBRFM7OztBQU1iOzs7Ozs7O3NDQU1BLFdBQUEsR0FBYSxTQUFBO0lBQ1QsSUFBQyxDQUFBLFFBQUQsR0FBWSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQSxJQUFDLENBQUEsWUFBRCxDQUFwQixLQUFzQyxDQUF0QyxJQUE0QyxJQUFDLENBQUE7V0FDekQsSUFBQyxDQUFBLFVBQUQsR0FBYyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQVEsQ0FBQSxJQUFDLENBQUEsWUFBRCxDQUFwQixLQUFzQyxDQUF0QyxJQUE0QyxJQUFDLENBQUE7RUFGbEQ7OztBQUliOzs7Ozs7c0NBS0EsTUFBQSxHQUFRLFNBQUE7SUFDSixJQUFHLENBQUksSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFmO0FBQTRCLGFBQTVCOztJQUVBLElBQUMsQ0FBQSxXQUFELENBQUE7SUFDQSxJQUFDLENBQUEsZ0JBQUQsQ0FBQTtXQUNBLElBQUMsQ0FBQSxXQUFELENBQUE7RUFMSTs7OztHQXRVNEIsRUFBRSxDQUFDOztBQTZVM0MsRUFBRSxDQUFDLHlCQUFILEdBQStCIiwic291cmNlc0NvbnRlbnQiOlsiIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jXG4jICAgU2NyaXB0OiBDb21wb25lbnRfSG90c3BvdEJlaGF2aW9yXG4jXG4jICAgJCRDT1BZUklHSFQkJFxuI1xuIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNsYXNzIEhvdHNwb3RTaGFwZVxuICAgIEBSRUNUQU5HTEUgPSBcInJlY3RcIlxuICAgIEBQSVhFTCA9IFwicGl4ZWxcIlxuZ3MuSG90c3BvdFNoYXBlID0gSG90c3BvdFNoYXBlXG5cbmNsYXNzIENvbXBvbmVudF9Ib3RzcG90QmVoYXZpb3IgZXh0ZW5kcyBncy5Db21wb25lbnRcbiAgICAjIyMqXG4gICAgKiBDYWxsZWQgaWYgdGhpcyBvYmplY3QgaW5zdGFuY2UgaXMgcmVzdG9yZWQgZnJvbSBhIGRhdGEtYnVuZGxlLiBJdCBjYW4gYmUgdXNlZFxuICAgICogcmUtYXNzaWduIGV2ZW50LWhhbmRsZXIsIGFub255bW91cyBmdW5jdGlvbnMsIGV0Yy5cbiAgICAqIFxuICAgICogQG1ldGhvZCBvbkRhdGFCdW5kbGVSZXN0b3JlLlxuICAgICogQHBhcmFtIE9iamVjdCBkYXRhIC0gVGhlIGRhdGEtYnVuZGxlXG4gICAgKiBAcGFyYW0gZ3MuT2JqZWN0Q29kZWNDb250ZXh0IGNvbnRleHQgLSBUaGUgY29kZWMtY29udGV4dC5cbiAgICAjIyNcbiAgICBvbkRhdGFCdW5kbGVSZXN0b3JlOiAoZGF0YSwgY29udGV4dCkgLT5cbiAgICAgICAgQHNldHVwRXZlbnRIYW5kbGVycygpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFkZHMgYSBob3RzcG90LWJlaGF2aW9yIHRvIGEgZ2FtZSBvYmplY3QuIFRoYXQgYWxsb3dzIGEgZ2FtZSBvYmplY3RcbiAgICAqIHRvIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggYWN0aW9ucyBieSBmaXJpbmcgYW4gYWN0aW9uLWV2ZW50IG9yIGNoYW5naW5nXG4gICAgKiB0aGUgZ2FtZSBvYmplY3QncyBpbWFnZS5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X0hvdHNwb3RCZWhhdmlvclxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50XG4gICAgKiBAbWVtYmVyb2YgZ3NcbiAgICAqIEBjb25zdHJ1Y3RvclxuICAgICMjI1xuICAgIGNvbnN0cnVjdG9yOiAocGFyYW1zKSAtPlxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIHNoYXBlIHVzZWQgdG8gZGV0ZWN0IGlmIGEgaG90c3BvdCBpcyBjbGlja2VkLCBob3ZlcmVkLCBldGMuXG4gICAgICAgICogQHByb3BlcnR5IHNoYXBlXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAjIyNcbiAgICAgICAgQHNoYXBlID0gZ3MuSG90c3BvdFNoYXBlLlJFQ1RBTkdMRVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgaG90c3BvdCBpcyBzZWxlY3RlZC5cbiAgICAgICAgKiBAcHJvcGVydHkgc2VsZWN0ZWRcbiAgICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgICMjI1xuICAgICAgICBAc2VsZWN0ZWQgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgaG90c3BvdCBpcyBlbmFibGVkLlxuICAgICAgICAqIEBwcm9wZXJ0eSBlbmFibGVkXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAjIyNcbiAgICAgICAgQGVuYWJsZWQgPSB5ZXNcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBAcHJvcGVydHkgaW1hZ2VIYW5kbGluZ1xuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBpbWFnZUhhbmRsaW5nID0gMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgbW91c2UvdG91Y2ggcG9pbnRlciBpcyBpbnNpZGUgdGhlIGhvdHNwb3QgYm91bmRzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjb250YWluc1xuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAY29udGFpbnNQb2ludGVyID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGFjdGlvbi1idXR0b24gd2FzIHByZXNzZWQgYmVmb3JlLlxuICAgICAgICAqIEBwcm9wZXJ0eSBidXR0b25VcFxuICAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAgKiBAcHJvdGVjdGVkXG4gICAgICAgICMjI1xuICAgICAgICBAYnV0dG9uVXAgPSBub1xuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWN0aW9uLWJ1dHRvbiBpcyBwcmVzc2VkLlxuICAgICAgICAqIEBwcm9wZXJ0eSBidXR0b25Eb3duXG4gICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBidXR0b25Eb3duID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBAcHJvcGVydHkgYWN0aW9uQnV0dG9uc1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgICAgIyMjXG4gICAgICAgIEBhY3Rpb25CdXR0b25zID0geyBcImxlZnRcIjogSW5wdXQuTW91c2UuQlVUVE9OX0xFRlQsIFwicmlnaHRcIjogSW5wdXQuTW91c2UuQlVUVE9OX1JJR0hULCBcIm1pZGRsZVwiOiBJbnB1dC5Nb3VzZS5CVVRUT05fTUlERExFIH1cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZGVmYXVsdCBhY3Rpb24tYnV0dG9uLiBCeSBkZWZhdWx0IHRoZSBsZWZ0LWJ1dHRvbiBpcyB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQHByb3BlcnR5IGFjdGlvbkJ1dHRvblxuICAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICAjIyNcbiAgICAgICAgQGFjdGlvbkJ1dHRvbiA9IEBhY3Rpb25CdXR0b25zW3BhcmFtcz8uYWN0aW9uQnV0dG9uID8gXCJsZWZ0XCJdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIHNvdW5kIHBsYXllZCBpZiB0aGUgaG90c3BvdCBhY3Rpb24gaXMgZXhlY3V0ZWQuXG4gICAgICAgICogQHByb3BlcnR5IHNvdW5kXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjI1xuICAgICAgICBAc291bmQgPSBwYXJhbXM/LnNvdW5kXG5cbiAgICAgICAgIyMjKlxuICAgICAgICAqIDxwPlRoZSBzb3VuZHMgcGxheWVkIGRlcGVuZGluZyBvbiB0aGUgaG90c3BvdCBzdGF0ZS48L3A+XG4gICAgICAgICogPHVsPlxuICAgICAgICAqIDxsaT4wID0gU2VsZWN0IFNvdW5kPC9saT5cbiAgICAgICAgKiA8bGk+MSA9IFVuc2VsZWN0IFNvdW5kPC9saT5cbiAgICAgICAgKiA8L3VsPlxuICAgICAgICAqIEBwcm9wZXJ0eSBzb3VuZHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyNcbiAgICAgICAgQHNvdW5kcyA9IHBhcmFtcz8uc291bmRzIHx8IFtdXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogR2V0cyB0aGUgcmVuZGVyLWluZGV4IG9mIHRoZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBob3RzcG90IGNvbXBvbmVudC4gVGhpcyBcbiAgICAqIGltcGxlbWVudGF0aW9uIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIGFjdCBhcyBhbiBvd25lciBmb3IgZ3MuRXZlbnRFbWl0dGVyLm9uIFxuICAgICogZXZlbnQgcmVnaXN0cmF0aW9uLiBcbiAgICAqXG4gICAgKiBAcHJvcGVydHkgckluZGV4XG4gICAgKiBAdHlwZSBudW1iZXJcbiAgICAjIyNcbiAgICBAYWNjZXNzb3JzIFwickluZGV4XCIsIFxuICAgICAgICBnZXQ6IC0+IEBvYmplY3QuckluZGV4XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNldHMgdXAgZXZlbnQgaGFuZGxlcnMuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cEV2ZW50SGFuZGxlcnNcbiAgICAjIyMgICBcbiAgICBzZXR1cEV2ZW50SGFuZGxlcnM6IC0+XG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwibW91c2VVcFwiLCB0aGlzKVxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcIm1vdXNlTW92ZWRcIiwgdGhpcylcbiAgICAgICAgXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vbiBcIm1vdXNlVXBcIiwgKChlKSA9PiBcbiAgICAgICAgICAgIHJldHVybiBpZiBub3QgQG9iamVjdC52aXNpYmxlXG4gICAgICAgICAgICBteCA9IElucHV0Lk1vdXNlLnggLSBAb2JqZWN0Lm9yaWdpbi54XG4gICAgICAgICAgICBteSA9IElucHV0Lk1vdXNlLnkgLSBAb2JqZWN0Lm9yaWdpbi55XG4gICAgICAgICAgICBjb250YWlucyA9IFJlY3QuY29udGFpbnMoQG9iamVjdC5kc3RSZWN0LngsIEBvYmplY3QuZHN0UmVjdC55LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3Qud2lkdGgsIEBvYmplY3QuZHN0UmVjdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgbXgsIG15KVxuICAgICAgICAgICAgaWYgY29udGFpbnNcbiAgICAgICAgICAgICAgICBjb250YWlucyA9IEBjaGVja1NoYXBlKG14IC0gQG9iamVjdC5kc3RSZWN0LngsIG15IC0gQG9iamVjdC5kc3RSZWN0LnkpXG4gICAgICAgICAgICAgICAgaWYgY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgQGNvbnRhaW5zUG9pbnRlciA9IGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgIEB1cGRhdGVJbnB1dCgpXG4gICAgICAgICAgICAgICAgICAgIEB1cGRhdGVFdmVudHMoKVxuICAgICAgICAgICAgICAgICAgICBAb2JqZWN0Lm5lZWRzVXBkYXRlID0geWVzXG4gICAgICAgICAgICAgICAgICAgIGUuYnJlYWtDaGFpbiA9IHllc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG51bGwsIHRoaXNcbiAgICAgICAgICAgIFxuICAgICAgICBpZiBAb2JqZWN0LmltYWdlcyBvciB5ZXNcbiAgICAgICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vbiBcIm1vdXNlTW92ZWRcIiwgKChlKSA9PlxuICAgICAgICAgICAgICAgIHJldHVybiBpZiBub3QgQG9iamVjdC52aXNpYmxlXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29udGFpbnMgPSBSZWN0LmNvbnRhaW5zKEBvYmplY3QuZHN0UmVjdC54LCBAb2JqZWN0LmRzdFJlY3QueSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgQG9iamVjdC5kc3RSZWN0LndpZHRoLCBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Lk1vdXNlLnggLSBAb2JqZWN0Lm9yaWdpbi54LCBJbnB1dC5Nb3VzZS55IC0gQG9iamVjdC5vcmlnaW4ueSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgIG14ID0gSW5wdXQuTW91c2UueCAtIEBvYmplY3Qub3JpZ2luLnhcbiAgICAgICAgICAgICAgICAgICAgbXkgPSBJbnB1dC5Nb3VzZS55IC0gQG9iamVjdC5vcmlnaW4ueVxuICAgICAgICAgICAgICAgICAgICBjb250YWlucyA9IEBjaGVja1NoYXBlKG14IC0gQG9iamVjdC5kc3RSZWN0LngsIG15IC0gQG9iamVjdC5kc3RSZWN0LnkpXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIEBjb250YWluc1BvaW50ZXIgIT0gY29udGFpbnNcbiAgICAgICAgICAgICAgICAgICAgQGNvbnRhaW5zUG9pbnRlciA9IGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgIEBvYmplY3QubmVlZHNVcGRhdGUgPSB5ZXNcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIGNvbnRhaW5zXG4gICAgICAgICAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwiZW50ZXJcIiwgdGhpcylcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgQG9iamVjdC5ldmVudHMuZW1pdChcImxlYXZlXCIsIHRoaXMpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgQHVwZGF0ZUlucHV0KClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBudWxsLCB0aGlzXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBJbml0aWFsaXplcyB0aGUgaG90c3BvdCBjb21wb25lbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cFxuICAgICMjI1xuICAgIHNldHVwOiAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBcbiAgICAgICAgQHNvdW5kID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoQG9iamVjdCwgQHNvdW5kKVxuICAgICAgICBcbiAgICAgICAgaWYgQHNvdW5kcz9cbiAgICAgICAgICAgIGZvciBzb3VuZCwgaSBpbiBAc291bmRzXG4gICAgICAgICAgICAgICAgQHNvdW5kc1tpXSA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKEBvYmplY3QsIHNvdW5kKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgIEBzb3VuZHMgPSBbXVxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIEBzZXR1cEV2ZW50SGFuZGxlcnMoKVxuICAgICAgICAgICAgICAgIFxuIFxuICAgIFxuICAgICMjIypcbiAgICAqIERpc3Bvc2VzIHRoZSBjb21wb25lbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAgIyMjXG4gICAgZGlzcG9zZTogLT5cbiAgICAgICAgc3VwZXJcbiAgICAgICAgXG4gICAgICAgIGdzLkdsb2JhbEV2ZW50TWFuYWdlci5vZmZCeU93bmVyKFwibW91c2VVcFwiLCB0aGlzKVxuICAgICAgICBncy5HbG9iYWxFdmVudE1hbmFnZXIub2ZmQnlPd25lcihcIm1vdXNlTW92ZWRcIiwgdGhpcylcbiAgICAgICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcG9pbnQgaXMgaW5zaWRlIG9mIHRoZSBob3RzcG90J3Mgc2hhcGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBjaGVja1NoYXBlXG4gICAgKiBAcGFyYW0geCAtIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgICogQHBhcmFtIHkgLSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICAqIEByZXR1cm4gSWYgPGI+dHJ1ZTwvYj4gdGhlIHBvaW50IGlzIGluc2lkZSBvZiB0aGUgaG90c3BvdCdzIHNoYXBlLiBPdGhlcndpc2UgPGI+ZmFsc2U8L2I+LlxuICAgICMjIyAgXG4gICAgY2hlY2tTaGFwZTogKHgsIHkpIC0+XG4gICAgICAgIHJlc3VsdCA9IHllc1xuICAgICAgICBcbiAgICAgICAgc3dpdGNoIEBzaGFwZVxuICAgICAgICAgICAgd2hlbiBncy5Ib3RzcG90U2hhcGUuUElYRUxcbiAgICAgICAgICAgICAgICBpZiBAb2JqZWN0LmJpdG1hcFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBAb2JqZWN0LmJpdG1hcC5pc1BpeGVsU2V0KHgsIHkpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBAb2JqZWN0LnRhcmdldD8uYml0bWFwLmlzUGl4ZWxTZXQoeCwgeSlcbiAgICAgICAgXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgaW1hZ2UgZGVwZW5kaW5nIG9uIHRoZSBob3RzcG90IHN0YXRlLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlSW1hZ2VcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgICAgICAgICAgICAgICAgXG4gICAgdXBkYXRlSW1hZ2U6IC0+XG4gICAgICAgIG9iamVjdCA9IEBvYmplY3QudGFyZ2V0IHx8IEBvYmplY3RcbiAgICAgICAgaWYgQG9iamVjdC5pbWFnZXM/XG4gICAgICAgICAgICBiYXNlSW1hZ2UgPSBpZiBAZW5hYmxlZCB0aGVuIEBvYmplY3QuaW1hZ2VzWzRdIHx8IEBvYmplY3QuaW1hZ2VzWzBdIGVsc2UgQG9iamVjdC5pbWFnZXNbMF1cbiAgICAgICAgICAgIGlmIEBjb250YWluc1BvaW50ZXJcbiAgICAgICAgICAgICAgICBpZiBAb2JqZWN0LnNlbGVjdGVkIG9yIEBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBvYmplY3QuaW1hZ2UgPSBAb2JqZWN0LmltYWdlc1szXSB8fCBAb2JqZWN0LmltYWdlc1syXSB8fCBiYXNlSW1hZ2VcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5pbWFnZSA9IEBvYmplY3QuaW1hZ2VzWzFdIHx8IGJhc2VJbWFnZVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGlmIEBvYmplY3Quc2VsZWN0ZWQgb3IgQHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5pbWFnZSA9IEBvYmplY3QuaW1hZ2VzWzJdIHx8IEBvYmplY3QuaW1hZ2VzWzRdIHx8IGJhc2VJbWFnZVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmltYWdlID0gYmFzZUltYWdlXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgIW9iamVjdC5pbWFnZVxuICAgICAgICAgICAgICAgIG9iamVjdC5iaXRtYXAgPSBudWxsXG5cbiAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBob3RzcG90IHBvc2l0aW9uIGFuZCBzaXplIGZyb20gYW4gb3RoZXIgdGFyZ2V0IGdhbWUgb2JqZWN0LiBGb3IgZXhhbXBsZSwgXG4gICAgKiB0aGF0IGlzIHVzZWZ1bCBmb3IgYWRkaW5nIGEgaG90c3BvdCB0byBhbiBvdGhlciBtb3ZpbmcgZ2FtZSBvYmplY3QuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVGcm9tVGFyZ2V0XG4gICAgKiBAcHJvdGVjdGVkXG4gICAgIyMjIFxuICAgIHVwZGF0ZUZyb21UYXJnZXQ6IC0+XG4gICAgICAgIGlmIEBvYmplY3QudGFyZ2V0P1xuICAgICAgICAgICAgQG9iamVjdC5kc3RSZWN0LnggPSBAb2JqZWN0LnRhcmdldC5kc3RSZWN0LnhcbiAgICAgICAgICAgIEBvYmplY3QuZHN0UmVjdC55ID0gQG9iamVjdC50YXJnZXQuZHN0UmVjdC55XG4gICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3Qud2lkdGggPSBAb2JqZWN0LnRhcmdldC5kc3RSZWN0LndpZHRoXG4gICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3QuaGVpZ2h0ID0gQG9iamVjdC50YXJnZXQuZHN0UmVjdC5oZWlnaHRcbiAgICAgICAgICAgIEBvYmplY3Qub2Zmc2V0LnggPSBAb2JqZWN0LnRhcmdldC5vZmZzZXQueFxuICAgICAgICAgICAgQG9iamVjdC5vZmZzZXQueSA9IEBvYmplY3QudGFyZ2V0Lm9mZnNldC55XG4gICAgICAgICAgICBAb2JqZWN0Lm9yaWdpbi54ID0gQG9iamVjdC50YXJnZXQub3JpZ2luLnhcbiAgICAgICAgICAgIEBvYmplY3Qub3JpZ2luLnkgPSBAb2JqZWN0LnRhcmdldC5vcmlnaW4ueSBcbiAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgZXZlbnQtaGFuZGxpbmcgYW5kIGZpcmVzIG5lY2Vzc2FyeSBldmVudHMuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVFdmVudHNcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgICAgICAgIFxuICAgIHVwZGF0ZUV2ZW50czogLT5cbiAgICAgICAgaWYgQGJ1dHRvblVwIGFuZCBAb2JqZWN0LmVuYWJsZWQgYW5kIEBlbmFibGVkIGFuZCBAb2JqZWN0LnZpc2libGVcbiAgICAgICAgICAgIGlmIEBvYmplY3Quc2VsZWN0YWJsZVxuICAgICAgICAgICAgICAgIGdyb3VwID0gZ3MuT2JqZWN0TWFuYWdlci5jdXJyZW50Lm9iamVjdHNCeUdyb3VwKEBvYmplY3QuZ3JvdXApXG4gICAgICAgICAgICAgICAgZm9yIG9iamVjdCBpbiBncm91cFxuICAgICAgICAgICAgICAgICAgICBpZiBvYmplY3QgIT0gQG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNlbGVjdGVkID0gbm9cbiAgICAgICAgICAgICAgICBpZiBAb2JqZWN0Lmdyb3VwXG4gICAgICAgICAgICAgICAgICAgIEBzZWxlY3RlZCA9IHllc1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgQHNlbGVjdGVkID0gIUBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIEBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIucGxheVNvdW5kKEBzb3VuZHNbMF0gfHwgQHNvdW5kKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLnBsYXlTb3VuZChAc291bmRzWzFdIHx8IEBzb3VuZClcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwiY2xpY2tcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwic3RhdGVDaGFuZ2VkXCIsIEBvYmplY3QpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLnBsYXlTb3VuZChAc291bmRzWzBdIHx8IEBzb3VuZClcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwiY2xpY2tcIiwgdGhpcylcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmV2ZW50cy5lbWl0KFwiYWN0aW9uXCIsIHRoaXMpXG4gICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgZ2FtZSBvYmplY3QncyBjb2xvciBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBob3RzcG90LlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQ29sb3JcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgIFxuICAgIHVwZGF0ZUNvbG9yOiAtPlxuICAgICAgICBpZiAhQG9iamVjdC5lbmFibGVkXG4gICAgICAgICAgICBAb2JqZWN0LmNvbG9yLnNldCgwLCAwLCAwLCAxMDApXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEBvYmplY3QuY29sb3Iuc2V0KDAsIDAsIDAsIDApXG4gICAgIFxuICAgICMjIypcbiAgICAqIFN0b3JlcyBjdXJyZW50IHN0YXRlcyBvZiBtb3VzZS90b3VjaCBwb2ludGVyIGFuZCBidXR0b25zLlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlSW5wdXRcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAjIyMgICAgICAgIFxuICAgIHVwZGF0ZUlucHV0OiAtPlxuICAgICAgICBAYnV0dG9uVXAgPSBJbnB1dC5Nb3VzZS5idXR0b25zW0BhY3Rpb25CdXR0b25dID09IDIgYW5kIEBjb250YWluc1BvaW50ZXJcbiAgICAgICAgQGJ1dHRvbkRvd24gPSBJbnB1dC5Nb3VzZS5idXR0b25zW0BhY3Rpb25CdXR0b25dID09IDEgYW5kIEBjb250YWluc1BvaW50ZXJcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgaG90c3BvdCBjb21wb25lbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyNcbiAgICB1cGRhdGU6IC0+XG4gICAgICAgIGlmIG5vdCBAb2JqZWN0LnZpc2libGUgdGhlbiByZXR1cm5cblxuICAgICAgICBAdXBkYXRlQ29sb3IoKVxuICAgICAgICBAdXBkYXRlRnJvbVRhcmdldCgpXG4gICAgICAgIEB1cGRhdGVJbWFnZSgpXG4gICAgICAgIFxuZ3MuQ29tcG9uZW50X0hvdHNwb3RCZWhhdmlvciA9IENvbXBvbmVudF9Ib3RzcG90QmVoYXZpb3IiXX0=\n//# sourceURL=Component_HotspotBehavior_19.js"
    },
    "summary": [
        "name",
        "type",
        "order"
    ]
}

Commits for Nextrek/s2s/data/87BE6898K0E78A48FCSB889E1DAAB10BF84B.json

Diff revisions: vs.
Revision Author Commited Message
1086 Diff Diff ASorrentino picture ASorrentino Fri 11 May, 2018 21:50:37 +0000
1084 MOliva picture MOliva Fri 11 May, 2018 12:41:55 +0000