Subversion Repository Public Repository

Nextrek

Diff Revisions 1085 vs 1086 for /s2s/data/7AD6803FKBBC9A4E4CSAF66EFC2E93FF462D.json

Diff revisions: vs.
  @@ -6,10 +6,10 @@
6 6 "name": "Component_LayoutSceneBehavior",
7 7 "type": "game_script",
8 8 "order": 1,
9 - "content": "# ===================================================================\n#\n# Script: Component_LayoutSceneBehavior \n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_LayoutSceneBehavior extends gs.Component_SceneBehavior\n # @objectCodecBlackList = [\"objectManager\"]\n ###*\n * The base class of all scene-behavior components. A scene-behavior component\n * define the logic of a single game scene. \n *\n * @module gs\n * @class Component_LayoutSceneBehavior\n * @extends gs.Component_SceneBehavior\n * @memberof gs\n ###\n constructor: ->\n super()\n \n @objectManager = SceneManager\n @layout = null\n @resourceContext = null\n \n ###*\n * Initializes the scene. \n *\n * @method initialize\n ### \n initialize: ->\n super\n \n @resourceContext = ResourceManager.createContext()\n ResourceManager.context = @resourceContext\n \n if not @object.layoutData?\n @object.layoutData = { \"type\": \"ui.FreeLayout\", \"controls\": [], \"frame\": [0, 0, 1, 1] }\n \n LanguageManager.loadBundles()\n \n ###*\n * Disposes the scene. \n *\n * @method dispose\n ###\n dispose: ->\n super\n \n ###*\n * Prepares all data for the scene and loads the necessary graphic and audio resources.\n *\n * @method prepareData\n * @abstract\n ### \n prepareData: ->\n gs.ObjectManager.current = @objectManager\n \n if not GameManager.initialized\n GameManager.initialize()\n \n @dataFields = ui.UiFactory.dataSources[@object.layoutData.dataSource || \"default\"]()\n window.$dataFields = @dataFields\n @music = ui.Component_FormulaHandler.fieldValue(@object, @object.layoutData.music)\n AudioManager.loadMusic(@music)\n @prepareTransition(RecordManager.system.menuTransition)\n \n ResourceLoader.loadUiTypesGraphics(ui.UiFactory.customTypes)\n ResourceLoader.loadUiLayoutGraphics(@object.layoutData)\n \n if @dataFields?\n ResourceLoader.loadUiDataFieldsGraphics(@dataFields)\n ResourceManager.getBitmap(\"Graphics/Characters/JaneDate_Normal\")\n \n ###*\n * Prepares all visual game object for the scene.\n *\n * @method prepareVisual\n ### \n prepareVisual: ->\n scale = Graphics.scale\n vocab = RecordManager.vocabulary\n\n if not @layout?\n @dataObject = {}\n @layout = ui.UiFactory.createFromDescriptor(@object.layoutData, @object)\n \n if @music?\n AudioManager.changeMusic(@music, 30)\n\n \n @layout.ui.prepare()\n @layout.ui.appear()\n @layout.update()\n \n @transition()\n \n if SceneManager.previousScenes.length == 0\n if GameManager.tempFields.isExitingGame\n GameManager.tempFields.isExitingGame = no\n gs.GameNotifier.postResetSceneChange(@object.layoutName)\n else\n gs.GameNotifier.postSceneChange(@object.layoutName)\n \n ###*\n * Updates the scene's content.\n *\n * @method updateContent\n ### \n updateContent: ->\n GameManager.update()\n Graphics.viewport.update()\n \n ###*\n * Shows/Hides the current scene. A hidden scene is no longer shown and executed\n * but all objects and data is still there and be shown again anytime.\n *\n * @method show\n * @param {boolean} visible - Indicates if the scene should be shown or hidden.\n ### \n show: (visible) ->\n if visible\n ResourceManager.context = @resourceContext\n @layout.visible = visible\n @layout.update()\n @objectManager.active = visible\n if visible\n gs.ObjectManager.current = SceneManager #@objectManager\n #@objectManager.update()\n \n ###*\n * Action method which triggers a full refresh on the object returned by the specified binding-expression.\n * The params must be a direct binding-expression string.\n *\n * @method fullRefreshObject\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The binding expression.\n ### \n fullRefreshObject: (sender, object) ->\n object = ui.Component_FormulaHandler.fieldValue(sender, object)\n object?.fullRefresh()\n \n ###*\n * Action method which triggers a refresh on the object returned by the specified binding-expression.\n * The params must be a direct binding-expression string.\n *\n * @method refreshObject\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The binding expression.\n ### \n refreshObject: (sender, object) ->\n object = ui.Component_FormulaHandler.fieldValue(sender, object)\n object?.needsUpdate = true\n \n addStyle: (sender, style) ->\n styleObject = ui.UIManager.styles[style]\n styleObject?.apply(sender)\n sender.needsUpdate = yes\n if styleObject?.font\n sender.behavior.refresh()\n \n removeStyle: (sender, style) -> \n styleObject = ui.UIManager.styles[style]\n styleObject?.revert(sender)\n sender.descriptor.styles.remove(style)\n \n for s in sender.descriptor.styles\n ui.UIManager.styles[s]?.apply(sender)\n sender.needsUpdate = yes\n if styleObject?.font\n sender.behavior.refresh()\n \n \n \n ###*\n * Action method which executes the specified bindings.\n *\n * @method executeBindings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object[]} params - An array of binding-definitions.\n ### \n executeBindings: (sender, bindings) ->\n for binding in bindings\n ui.Component_FormulaHandler.executeBinding(sender, binding)\n \n return null\n \n ###*\n * Action method which executes the specified formulas.\n *\n * @method executeFormulas\n * @param {gs.Object_Base} sender - The sender object.\n * @param {ui.Formula[]} params - An array of formula-definitions.\n ### \n executeFormulas: (sender, formulas) ->\n for formula in formulas\n ui.Component_FormulaHandler.executeFormula(sender, formula)\n \n ###*\n * Action method which executes an animation on a specified target game object.\n *\n * @method executeAnimation\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains target-id and animations: { target, animations }\n ### \n executeAnimation: (sender, params) ->\n object = ui.Component_FormulaHandler.fieldValue(sender, params.target)\n animation = object?.animations.first (a) -> a.event == params.event\n \n if animation and object\n object.animationExecutor.execute(animation)\n \n ###*\n * Action method which emits the specified event.\n *\n * @method emitEvent\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains event name, source and data.\n * <ul>\n * <li>params.name - The name of the event to emit</li>\n * <li>params.source - A binding-expression to define the game object which should emit the event.</li>\n * <li>params.data - An object containing additional event specific data.</li>\n * </ul>\n ### \n emitEvent: (sender, params) ->\n object = ui.Component_FormulaHandler.fieldValue(sender, params.source)\n object?.events.emit(params.name, object, ui.Component_FormulaHandler.fieldValue(sender, params.data))\n \n ###*\n * Action method which changes the game's aspect ratio.\n *\n * @method executeBindings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - If <b>true</b> the game screen will stretched so that it fills the entire screen\n * of the player without any black borders. Otherwise the game screen stretches but keeps its ratio\n * so black borders are possible if the game resolution's ratio and the target display's ratio are not match. It can also\n * be a binding-expression.\n ###\n adjustAspectRatio: (sender, adjust) ->\n adjust = ui.Component_FormulaHandler.fieldValue(sender, adjust)\n \n GameManager.settings.adjustAspectRatio = adjust\n Graphics.keepRatio = !adjust\n Graphics.onResize()\n \n ###*\n * Action method which enters fullscreen mode.\n *\n * @method enterFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - Can be <b>null</b>\n ###\n enterFullScreen: (sender, params) -> \n gs.Graphics.enterFullscreen()\n GameManager.settings.fullScreen = Graphics.isFullscreen()\n \n \n ###*\n * Action method which leaves fullscreen mode.\n *\n * @method leaveFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - Can be <b>null</b>\n ###\n leaveFullScreen: -> \n gs.Graphics.leaveFullscreen()\n GameManager.settings.fullScreen = Graphics.isFullscreen()\n \n ###*\n * Action method which toggles between window and fullscreen mode.\n *\n * @method toggleFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>\n ###\n toggleFullScreen: (sender, params) ->\n if gs.Graphics.isFullscreen()\n gs.Graphics.leaveFullscreen()\n else\n gs.Graphics.enterFullscreen()\n\n GameManager.settings.fullScreen = gs.Graphics.isFullscreen()\n \n ###*\n * Action method which plays the specified sound.\n *\n * @method playSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - The sound to play.\n ###\n playSound: (sender, params) ->\n AudioManager.loadSound(params)\n AudioManager.playSound(params)\n \n ###*\n * Action method which plays the specified voice.\n *\n * @method playVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - The voice to play.\n ###\n playVoice: (sender, params) ->\n AudioManager.loadSound(params)\n AudioManager.playVoice(params)\n \n \n ###*\n * Action method which turns voice on or off.\n *\n * @method turnOnOffVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> voice will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n ### \n turnOnOffVoice: (sender, state) ->\n if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnVoice() else @turnOffVoice()\n \n ###*\n * Action method which turns music on or off.\n *\n * @method turnOnOffMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> music will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n ### \n turnOnOffMusic: (sender, state) ->\n if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnMusic() else @turnOffMusic()\n \n ###*\n * Action method which turns sound on or off.\n *\n * @method turnOnOffSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> sound will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n ### \n turnOnOffSound: (sender, state) ->\n if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnSound() else @turnOffSound()\n \n ###*\n * Action method which turns off voice.\n *\n * @method turnOffVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOffVoice: ->\n AudioManager.stopAllVoices()\n \n ###*\n * Action method which turns off music.\n *\n * @method turnOffMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOffMusic: ->\n AudioManager.stopMusic()\n \n ###*\n * Action method which turns off sound.\n *\n * @method turnOffSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOffSound: ->\n AudioManager.stopAllSounds()\n \n ###*\n * Action method which turns on voice.\n *\n * @method turnOnVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOnVoice: ->\n \n ###*\n * Action method which turns on sound.\n *\n * @method turnOnSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOnSound: ->\n \n ###*\n * Action method which turns on music.\n *\n * @method turnOnMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOnMusic: ->\n AudioManager.resumeMusic()\n \n ###*\n * Action method which selects the specified language.\n *\n * @method selectLanguage\n * @param {gs.Object_Base} sender - The sender object.\n * @param {number|string} params - Index of the language to set. Can be a binding-expression.\n ### \n selectLanguage: (sender, params)->\n language = LanguageManager.languages[ui.Component_FormulaHandler.fieldValue(sender, params)]\n LanguageManager.selectLanguage(language)\n \n ###*\n * Action method which resets global data storage.\n *\n * @method resetGlobalData\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n ### \n resetGlobalData: (sender) -> \n GameManager.resetGlobalData()\n \n ###*\n * Action method which saves game settings.\n *\n * @method saveSettings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n ### \n saveSettings: (sender) -> GameManager.saveSettings()\n \n ###*\n * Action method which prepares the game for saving by taking a snapshot of the current game state\n * and storing it in GameManager.saveGame.\n *\n * @method prepareSaveGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n ### \n prepareSaveGame: (sender, params) ->\n GameManager.prepareSaveGame(params?.snapshot)\n \n ###*\n * Action method which saves the current game at the specified save slot.\n *\n * @method saveGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the slot-index where the game should be saved.\n * <ul>\n * <li>params.slot - The slot-index where the game should be saved. Can be a binding-expression.</li>\n * </ul>\n ### \n saveGame: (sender, params) -> GameManager.save(ui.Component_FormulaHandler.fieldValue(sender, params.slot))\n \n ###*\n * Action method which loads the game from the specified save slot.\n *\n * @method loadGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the slot-index where the game should be loaded from.\n * <ul>\n * <li>params.slot - The slot-index where the game should be loaded from. Can be a binding-expression.</li>\n * </ul>\n ### \n loadGame: (sender, params) ->\n GameManager.tempSettings.skip = no\n GameManager.load(ui.Component_FormulaHandler.fieldValue(sender, params.slot))\n \n ###*\n * Action method which starts a new game.\n *\n * @method newGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>\n ### \n newGame: (sender, params) ->\n AudioManager.stopAllMusic(30)\n GameManager.newGame()\n \n scene = new vn.Object_Scene()\n SceneManager.clear()\n SceneManager.switchTo(scene)\n \n ###*\n * Action method which exists the current game. It doesn't change the scene and\n * should be called before switching back to the title screen or main menu.\n *\n * @method exitGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>\n ### \n exitGame: (sender, params) ->\n GameManager.exitGame()\n \n ###*\n * Action method which switches to another scene.\n *\n * @method switchScene\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the class name of the scene to switch to.\n * <ul>\n * <li>params.name - The class-name of the scene to switch to. The class must be defined in vn-namespace.</li>\n * </ul>\n ### \n switchScene: (sender, params) ->\n f = =>\n if params.clear\n SceneManager.clear()\n \n scene = new vn[params.name]()\n SceneManager.switchTo(scene, params.savePrevious)\n \n if !params.savePrevious\n @layout.ui.disappear (e) => f()\n else\n f()\n \n ###*\n * Action method which switches to another game scene.\n *\n * @method switchGameScene\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the UID of the scene to switch to.\n * <ul>\n * <li>params.uid - The UID of the scene to switch to.</li>\n * </ul>\n ### \n switchGameScene: (sender, params) ->\n f = =>\n if params.clear\n SceneManager.clear()\n \n uid = params.uid\n if params.name\n sceneDocuments = DataManager.getDocumentsByType(\"vn.scene\")\n sceneDocument = sceneDocuments.first (d) -> d.items.name == params.name\n if sceneDocument\n uid = sceneDocument.uid\n \n sceneData = uid: uid, pictures: [], texts: []\n GameManager.sceneData = sceneData\n newScene = new vn.Object_Scene()\n newScene.sceneData = sceneData\n \n SceneManager.switchTo(newScene, params.savePrevious)\n \n if !params.savePrevious\n (@layout||@object.layout).ui.disappear (e) => f()\n else\n f()\n \n ###*\n * Action method which switches to another layout.\n *\n * @method switchLayout\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the name of the layout to switch to.\n * <ul>\n * <li>params.name - The name of the layout to switch to.</li>\n * <li>params.savePrevious - Indicates if the current layout should not be erased but paused and hidden instead so\n * that it can be restored using <i>returnToPrevious</i> action.</li>\n * <li>params.dataFields - Defines the data of \"$dataFields\" binding-expression variable. Can be a binding-expression\n * or a direct object. Optional.</li>\n * </ul>\n ### \n switchLayout: (sender, layout) ->\n f = =>\n Graphics.freeze()\n if layout.clear\n SceneManager.clear()\n \n scene = new gs.Object_Layout(layout.name)\n \n dataFields = sender.dataFields\n if typeof layout.dataFields == \"string\"\n dataFields = ui.Component_FormulaHandler.fieldValue(sender, layout.dataFields)\n else if layout.dataFields?\n dataFields = layout.dataFields\n \n scene.dataFields = dataFields\n scene.controllers = layout.controllers\n \n if layout.senderData?\n for senderField in layout.senderData\n scene[senderField] = sender[senderField]\n SceneManager.switchTo(scene, layout.savePrevious, layout.stack)\n \n if !layout.savePrevious\n (@layout||@object.layout).ui.disappear (e) => f()\n else\n f()\n \n ###*\n * Action method which returns to previous layout. (If savePrevious was set to <b>true</b> on switchLayout.).\n *\n * @method previousLayout\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n ### \n previousLayout: (sender) ->\n SceneManager.returnToPrevious()\n \n ###*\n * Action method which disposes the specified control.\n *\n * @method disposeControl\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The ID of the control to dispose. Can be a binding-expression.\n ### \n disposeControl: (sender, id) ->\n control = @objectManager.objectById(ui.Component_FormulaHandler.fieldValue(sender, id))\n \n \n control?.ui.disappear (sender) -> sender.dispose()\n \n ###*\n * Action method which creates a new control from the specified descriptor.\n *\n * @method createControl\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - Contains the descriptor and other data needed to construct the control.\n * <ul>\n * <li>params.descriptor - The control' descriptor. Can be a direct descriptor definition or a template name</li>\n * <li>params.parent - A binding-expression which returns the control's parent.</li>\n * <li>params.senderData - An object containing additional data merged into the control object.</li>\n * </ul>\n ### \n createControl: (sender, data) ->\n if typeof data.descriptor == \"string\"\n descriptor = ui.UIManager.customTypes[data.descriptor]\n else\n descriptor = data.descriptor\n \n \n parent = ui.Component_FormulaHandler.fieldValue(sender, data.parent)\n control = ui.UiFactory._createFromDescriptor(descriptor, parent ? @object)\n \n if data.senderData?\n for fieldName in data.senderData\n control[fieldName] = sender[fieldName]\n control.ui.prepare()\n control.ui.appear()\n \n return control\n \n ###*\n * Action method which quits the game.\n *\n * @method quitGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - Can be <b>null</b>.\n ### \n quitGame: (sender, data) ->\n SceneManager.switchTo(null)\n \n \n \ngs.Component_LayoutSceneBehavior = Component_LayoutSceneBehavior",
9 + "content": "# ===================================================================\n#\n# Script: Component_LayoutSceneBehavior \n#\n# $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_LayoutSceneBehavior extends gs.Component_SceneBehavior\n # @objectCodecBlackList = [\"objectManager\"]\n ###*\n * The base class of all scene-behavior components. A scene-behavior component\n * define the logic of a single game scene. \n *\n * @module gs\n * @class Component_LayoutSceneBehavior\n * @extends gs.Component_SceneBehavior\n * @memberof gs\n ###\n constructor: ->\n super()\n \n @objectManager = SceneManager\n @layout = null\n @resourceContext = null\n \n ###*\n * Initializes the scene. \n *\n * @method initialize\n ### \n initialize: ->\n super\n \n @resourceContext = ResourceManager.createContext()\n ResourceManager.context = @resourceContext\n \n if not @object.layoutData?\n @object.layoutData = { \"type\": \"ui.FreeLayout\", \"controls\": [], \"frame\": [0, 0, 1, 1] }\n \n LanguageManager.loadBundles()\n \n ###*\n * Disposes the scene. \n *\n * @method dispose\n ###\n dispose: ->\n super\n \n ###*\n * Prepares all data for the scene and loads the necessary graphic and audio resources.\n *\n * @method prepareData\n * @abstract\n ### \n prepareData: ->\n gs.ObjectManager.current = @objectManager\n \n if not GameManager.initialized\n GameManager.initialize()\n \n @dataFields = ui.UiFactory.dataSources[@object.layoutData.dataSource || \"default\"]()\n window.$dataFields = @dataFields\n @music = ui.Component_FormulaHandler.fieldValue(@object, @object.layoutData.music)\n AudioManager.loadMusic(@music)\n @prepareTransition(RecordManager.system.menuTransition)\n \n ResourceLoader.loadUiTypesGraphics(ui.UiFactory.customTypes)\n ResourceLoader.loadUiLayoutGraphics(@object.layoutData)\n \n if @dataFields?\n ResourceLoader.loadUiDataFieldsGraphics(@dataFields)\n ResourceManager.getBitmap(\"Graphics/Characters/JaneDate_Normal\")\n \n ###*\n * Prepares all visual game object for the scene.\n *\n * @method prepareVisual\n ### \n prepareVisual: ->\n scale = Graphics.scale\n vocab = RecordManager.vocabulary\n\n if not @layout?\n @dataObject = {}\n @layout = ui.UiFactory.createFromDescriptor(@object.layoutData, @object)\n \n if @music?\n AudioManager.changeMusic(@music, 30)\n\n \n @layout.ui.prepare()\n @layout.ui.appear()\n @layout.update()\n \n @transition()\n \n if SceneManager.previousScenes.length == 0\n if GameManager.tempFields.isExitingGame\n GameManager.tempFields.isExitingGame = no\n gs.GameNotifier.postResetSceneChange(@object.layoutName)\n else\n gs.GameNotifier.postSceneChange(@object.layoutName)\n \n ###*\n * Updates the scene's content.\n *\n * @method updateContent\n ### \n updateContent: ->\n GameManager.update()\n Graphics.viewport.update()\n \n ###*\n * Shows/Hides the current scene. A hidden scene is no longer shown and executed\n * but all objects and data is still there and be shown again anytime.\n *\n * @method show\n * @param {boolean} visible - Indicates if the scene should be shown or hidden.\n ### \n show: (visible) ->\n if visible\n ResourceManager.context = @resourceContext\n @layout.visible = visible\n @layout.update()\n @objectManager.active = visible\n if visible\n gs.ObjectManager.current = SceneManager #@objectManager\n #@objectManager.update()\n \n ###*\n * Action method which triggers a full refresh on the object returned by the specified binding-expression.\n * The params must be a direct binding-expression string.\n *\n * @method fullRefreshObject\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The binding expression.\n ### \n fullRefreshObject: (sender, object) ->\n object = ui.Component_FormulaHandler.fieldValue(sender, object)\n object?.fullRefresh()\n \n ###*\n * Action method which triggers a refresh on the object returned by the specified binding-expression.\n * The params must be a direct binding-expression string.\n *\n * @method refreshObject\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The binding expression.\n ### \n refreshObject: (sender, object) ->\n object = ui.Component_FormulaHandler.fieldValue(sender, object)\n object?.needsUpdate = true\n \n addStyle: (sender, style) ->\n styleObject = ui.UIManager.styles[style]\n styleObject?.apply(sender)\n sender.needsUpdate = yes\n if styleObject?.font\n sender.behavior.refresh()\n \n removeStyle: (sender, style) -> \n styleObject = ui.UIManager.styles[style]\n styleObject?.revert(sender)\n sender.descriptor.styles.remove(style)\n \n for s in sender.descriptor.styles\n ui.UIManager.styles[s]?.apply(sender)\n sender.needsUpdate = yes\n if styleObject?.font\n sender.behavior.refresh()\n \n \n \n ###*\n * Action method which executes the specified bindings.\n *\n * @method executeBindings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object[]} params - An array of binding-definitions.\n ### \n executeBindings: (sender, bindings) ->\n for binding in bindings\n ui.Component_FormulaHandler.executeBinding(sender, binding)\n \n return null\n \n ###*\n * Action method which executes the specified formulas.\n *\n * @method executeFormulas\n * @param {gs.Object_Base} sender - The sender object.\n * @param {ui.Formula[]} params - An array of formula-definitions.\n ### \n executeFormulas: (sender, formulas) ->\n for formula in formulas\n ui.Component_FormulaHandler.executeFormula(sender, formula)\n \n ###*\n * Action method which executes an animation on a specified target game object.\n *\n * @method executeAnimation\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains target-id and animations: { target, animations }\n ### \n executeAnimation: (sender, params) ->\n object = ui.Component_FormulaHandler.fieldValue(sender, params.target)\n animation = object?.animations.first (a) -> a.event == params.event\n \n if animation and object\n object.animationExecutor.execute(animation)\n \n ###*\n * Action method which emits the specified event.\n *\n * @method emitEvent\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains event name, source and data.\n * <ul>\n * <li>params.name - The name of the event to emit</li>\n * <li>params.source - A binding-expression to define the game object which should emit the event.</li>\n * <li>params.data - An object containing additional event specific data.</li>\n * </ul>\n ### \n emitEvent: (sender, params) ->\n object = ui.Component_FormulaHandler.fieldValue(sender, params.source)\n object?.events.emit(params.name, object, ui.Component_FormulaHandler.fieldValue(sender, params.data))\n \n ###*\n * Action method which changes the game's aspect ratio.\n *\n * @method executeBindings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - If <b>true</b> the game screen will stretched so that it fills the entire screen\n * of the player without any black borders. Otherwise the game screen stretches but keeps its ratio\n * so black borders are possible if the game resolution's ratio and the target display's ratio are not match. It can also\n * be a binding-expression.\n ###\n adjustAspectRatio: (sender, adjust) ->\n adjust = ui.Component_FormulaHandler.fieldValue(sender, adjust)\n \n GameManager.settings.adjustAspectRatio = adjust\n Graphics.keepRatio = !adjust\n Graphics.onResize()\n \n ###*\n * Action method which enters fullscreen mode.\n *\n * @method enterFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - Can be <b>null</b>\n ###\n enterFullScreen: (sender, params) -> \n gs.Graphics.enterFullscreen()\n GameManager.settings.fullScreen = Graphics.isFullscreen()\n \n \n ###*\n * Action method which leaves fullscreen mode.\n *\n * @method leaveFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - Can be <b>null</b>\n ###\n leaveFullScreen: -> \n gs.Graphics.leaveFullscreen()\n GameManager.settings.fullScreen = Graphics.isFullscreen()\n \n ###*\n * Action method which toggles between window and fullscreen mode.\n *\n * @method toggleFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>\n ###\n toggleFullScreen: (sender, params) ->\n if gs.Graphics.isFullscreen()\n gs.Graphics.leaveFullscreen()\n else\n gs.Graphics.enterFullscreen()\n\n GameManager.settings.fullScreen = gs.Graphics.isFullscreen()\n \n ###*\n * Action method which plays the specified sound.\n *\n * @method playSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - The sound to play.\n ###\n playSound: (sender, params) ->\n AudioManager.loadSound(params)\n AudioManager.playSound(params)\n \n ###*\n * Action method which plays the specified voice.\n *\n * @method playVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - The voice to play.\n ###\n playVoice: (sender, params) ->\n AudioManager.loadSound(params)\n AudioManager.playVoice(params)\n \n \n ###*\n * Action method which turns voice on or off.\n *\n * @method turnOnOffVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> voice will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n ### \n turnOnOffVoice: (sender, state) ->\n if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnVoice() else @turnOffVoice()\n \n ###*\n * Action method which turns music on or off.\n *\n * @method turnOnOffMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> music will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n ### \n turnOnOffMusic: (sender, state) ->\n if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnMusic() else @turnOffMusic()\n \n ###*\n * Action method which turns sound on or off.\n *\n * @method turnOnOffSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> sound will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n ### \n turnOnOffSound: (sender, state) ->\n if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnSound() else @turnOffSound()\n \n ###*\n * Action method which turns off voice.\n *\n * @method turnOffVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOffVoice: ->\n AudioManager.stopAllVoices()\n \n ###*\n * Action method which turns off music.\n *\n * @method turnOffMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOffMusic: ->\n AudioManager.stopMusic()\n \n ###*\n * Action method which turns off sound.\n *\n * @method turnOffSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOffSound: ->\n AudioManager.stopAllSounds()\n \n ###*\n * Action method which turns on voice.\n *\n * @method turnOnVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOnVoice: ->\n \n ###*\n * Action method which turns on sound.\n *\n * @method turnOnSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOnSound: ->\n \n ###*\n * Action method which turns on music.\n *\n * @method turnOnMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n ### \n turnOnMusic: ->\n AudioManager.resumeMusic()\n \n ###*\n * Action method which selects the specified language.\n *\n * @method selectLanguage\n * @param {gs.Object_Base} sender - The sender object.\n * @param {number|string} params - Index of the language to set. Can be a binding-expression.\n ### \n selectLanguage: (sender, params)->\n language = LanguageManager.languages[ui.Component_FormulaHandler.fieldValue(sender, params)]\n LanguageManager.selectLanguage(language)\n \n ###*\n * Action method which resets global data storage.\n *\n * @method resetGlobalData\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n ### \n resetGlobalData: (sender) -> \n GameManager.resetGlobalData()\n \n ###*\n * Action method which saves game settings.\n *\n * @method saveSettings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n ### \n saveSettings: (sender) -> GameManager.saveSettings()\n \n ###*\n * Action method which prepares the game for saving by taking a snapshot of the current game state\n * and storing it in GameManager.saveGame.\n *\n * @method prepareSaveGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n ### \n prepareSaveGame: (sender, params) ->\n GameManager.prepareSaveGame(params?.snapshot)\n \n ###*\n * Action method which saves the current game at the specified save slot.\n *\n * @method saveGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the slot-index where the game should be saved.\n * <ul>\n * <li>params.slot - The slot-index where the game should be saved. Can be a binding-expression.</li>\n * </ul>\n ### \n saveGame: (sender, params) -> GameManager.save(ui.Component_FormulaHandler.fieldValue(sender, params.slot))\n \n ###*\n * Action method which loads the game from the specified save slot.\n *\n * @method loadGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the slot-index where the game should be loaded from.\n * <ul>\n * <li>params.slot - The slot-index where the game should be loaded from. Can be a binding-expression.</li>\n * </ul>\n ### \n loadGame: (sender, params) ->\n GameManager.tempSettings.skip = no\n GameManager.load(ui.Component_FormulaHandler.fieldValue(sender, params.slot))\n \n ###*\n * Action method which starts a new game.\n *\n * @method newGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>\n ### \n newGame: (sender, params) ->\n AudioManager.stopAllMusic(30)\n GameManager.newGame()\n \n scene = new vn.Object_Scene()\n SceneManager.clear()\n SceneManager.switchTo(scene)\n \n ###*\n * Action method which exists the current game. It doesn't change the scene and\n * should be called before switching back to the title screen or main menu.\n *\n * @method exitGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>\n ### \n exitGame: (sender, params) ->\n GameManager.exitGame()\n \n ###*\n * Action method which switches to another scene.\n *\n * @method switchScene\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the class name of the scene to switch to.\n * <ul>\n * <li>params.name - The class-name of the scene to switch to. The class must be defined in vn-namespace.</li>\n * </ul>\n ### \n switchScene: (sender, params) ->\n f = =>\n if params.clear\n SceneManager.clear()\n \n scene = new vn[params.name]()\n SceneManager.switchTo(scene, params.savePrevious)\n \n if !params.savePrevious\n @layout.ui.disappear (e) => f()\n else\n f()\n \n ###*\n * Action method which switches to another game scene.\n *\n * @method switchGameScene\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the UID of the scene to switch to.\n * <ul>\n * <li>params.uid - The UID of the scene to switch to.</li>\n * </ul>\n ### \n switchGameScene: (sender, params) ->\n f = =>\n if params.clear\n SceneManager.clear()\n \n uid = params.uid\n if params.name\n sceneDocuments = DataManager.getDocumentsByType(\"vn.scene\")\n sceneDocument = sceneDocuments.first (d) -> d.items.name == params.name\n if sceneDocument\n uid = sceneDocument.uid\n \n sceneData = uid: uid, pictures: [], texts: []\n GameManager.sceneData = sceneData\n newScene = new vn.Object_Scene()\n newScene.sceneData = sceneData\n \n SceneManager.switchTo(newScene, params.savePrevious)\n \n if !params.savePrevious\n (@layout||@object.layout).ui.disappear (e) => f()\n else\n f()\n \n ###*\n * Action method which switches to another layout.\n *\n * @method switchLayout\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the name of the layout to switch to.\n * <ul>\n * <li>params.name - The name of the layout to switch to.</li>\n * <li>params.savePrevious - Indicates if the current layout should not be erased but paused and hidden instead so\n * that it can be restored using <i>returnToPrevious</i> action.</li>\n * <li>params.dataFields - Defines the data of \"$dataFields\" binding-expression variable. Can be a binding-expression\n * or a direct object. Optional.</li>\n * </ul>\n ### \n switchLayout: (sender, layout) ->\n f = =>\n Graphics.freeze()\n if layout.clear\n SceneManager.clear()\n \n scene = new gs.Object_Layout(layout.name)\n \n dataFields = sender.dataFields\n if typeof layout.dataFields == \"string\"\n dataFields = ui.Component_FormulaHandler.fieldValue(sender, layout.dataFields)\n else if layout.dataFields?\n dataFields = layout.dataFields\n \n scene.dataFields = dataFields\n scene.controllers = layout.controllers\n \n if layout.senderData?\n for senderField in layout.senderData\n scene[senderField] = sender[senderField]\n SceneManager.switchTo(scene, layout.savePrevious, layout.stack)\n \n if !layout.savePrevious\n (@layout||@object.layout).ui.disappear (e) => f()\n else\n f()\n \n ###*\n * Action method which returns to previous layout. (If savePrevious was set to <b>true</b> on switchLayout.).\n *\n * @method previousLayout\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n ### \n previousLayout: (sender) ->\n SceneManager.returnToPrevious()\n \n ###*\n * Action method which disposes the specified control.\n *\n * @method disposeControl\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The ID of the control to dispose. Can be a binding-expression.\n ### \n disposeControl: (sender, id) ->\n control = @objectManager.objectById(ui.Component_FormulaHandler.fieldValue(sender, id))\n \n \n control?.ui.disappear (sender) -> sender.dispose()\n \n ###*\n * Action method which creates a new control from the specified descriptor.\n *\n * @method createControl\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - Contains the descriptor and other data needed to construct the control.\n * <ul>\n * <li>params.descriptor - The control' descriptor. Can be a direct descriptor definition or a template name</li>\n * <li>params.parent - A binding-expression which returns the control's parent.</li>\n * <li>params.senderData - An object containing additional data merged into the control object.</li>\n * </ul>\n ### \n createControl: (sender, data) ->\n if typeof data.descriptor == \"string\"\n descriptor = ui.UIManager.customTypes[data.descriptor]\n else\n descriptor = data.descriptor\n \n parent = ui.Component_FormulaHandler.fieldValue(sender, data.parent)\n control = ui.UiFactory._createFromDescriptor(descriptor, parent ? (@object.layout||@object) )\n \n if data.senderData?\n for fieldName in data.senderData\n control[fieldName] = sender[fieldName]\n control.ui.prepare()\n control.ui.appear()\n \n return control\n \n ###*\n * Action method which quits the game.\n *\n * @method quitGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - Can be <b>null</b>.\n ### \n quitGame: (sender, data) ->\n SceneManager.switchTo(null)\n \n \n \ngs.Component_LayoutSceneBehavior = Component_LayoutSceneBehavior",
10 10 "parentId": "0C1D8BE8KDB63A469AS9782EB90E63254DB3",
11 11 "folder": false,
12 - "compiledContent": "var Component_LayoutSceneBehavior,\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_LayoutSceneBehavior = (function(superClass) {\n extend(Component_LayoutSceneBehavior, superClass);\n\n\n /**\n * The base class of all scene-behavior components. A scene-behavior component\n * define the logic of a single game scene. \n *\n * @module gs\n * @class Component_LayoutSceneBehavior\n * @extends gs.Component_SceneBehavior\n * @memberof gs\n */\n\n function Component_LayoutSceneBehavior() {\n Component_LayoutSceneBehavior.__super__.constructor.call(this);\n this.objectManager = SceneManager;\n this.layout = null;\n this.resourceContext = null;\n }\n\n\n /**\n * Initializes the scene. \n *\n * @method initialize\n */\n\n Component_LayoutSceneBehavior.prototype.initialize = function() {\n Component_LayoutSceneBehavior.__super__.initialize.apply(this, arguments);\n this.resourceContext = ResourceManager.createContext();\n ResourceManager.context = this.resourceContext;\n if (this.object.layoutData == null) {\n this.object.layoutData = {\n \"type\": \"ui.FreeLayout\",\n \"controls\": [],\n \"frame\": [0, 0, 1, 1]\n };\n }\n return LanguageManager.loadBundles();\n };\n\n\n /**\n * Disposes the scene. \n *\n * @method dispose\n */\n\n Component_LayoutSceneBehavior.prototype.dispose = function() {\n return Component_LayoutSceneBehavior.__super__.dispose.apply(this, arguments);\n };\n\n\n /**\n * Prepares all data for the scene and loads the necessary graphic and audio resources.\n *\n * @method prepareData\n * @abstract\n */\n\n Component_LayoutSceneBehavior.prototype.prepareData = function() {\n gs.ObjectManager.current = this.objectManager;\n if (!GameManager.initialized) {\n GameManager.initialize();\n }\n this.dataFields = ui.UiFactory.dataSources[this.object.layoutData.dataSource || \"default\"]();\n window.$dataFields = this.dataFields;\n this.music = ui.Component_FormulaHandler.fieldValue(this.object, this.object.layoutData.music);\n AudioManager.loadMusic(this.music);\n this.prepareTransition(RecordManager.system.menuTransition);\n ResourceLoader.loadUiTypesGraphics(ui.UiFactory.customTypes);\n ResourceLoader.loadUiLayoutGraphics(this.object.layoutData);\n if (this.dataFields != null) {\n ResourceLoader.loadUiDataFieldsGraphics(this.dataFields);\n }\n return ResourceManager.getBitmap(\"Graphics/Characters/JaneDate_Normal\");\n };\n\n\n /**\n * Prepares all visual game object for the scene.\n *\n * @method prepareVisual\n */\n\n Component_LayoutSceneBehavior.prototype.prepareVisual = function() {\n var scale, vocab;\n scale = Graphics.scale;\n vocab = RecordManager.vocabulary;\n if (this.layout == null) {\n this.dataObject = {};\n this.layout = ui.UiFactory.createFromDescriptor(this.object.layoutData, this.object);\n if (this.music != null) {\n AudioManager.changeMusic(this.music, 30);\n }\n }\n this.layout.ui.prepare();\n this.layout.ui.appear();\n this.layout.update();\n this.transition();\n if (SceneManager.previousScenes.length === 0) {\n if (GameManager.tempFields.isExitingGame) {\n GameManager.tempFields.isExitingGame = false;\n return gs.GameNotifier.postResetSceneChange(this.object.layoutName);\n } else {\n return gs.GameNotifier.postSceneChange(this.object.layoutName);\n }\n }\n };\n\n\n /**\n * Updates the scene's content.\n *\n * @method updateContent\n */\n\n Component_LayoutSceneBehavior.prototype.updateContent = function() {\n GameManager.update();\n return Graphics.viewport.update();\n };\n\n\n /**\n * Shows/Hides the current scene. A hidden scene is no longer shown and executed\n * but all objects and data is still there and be shown again anytime.\n *\n * @method show\n * @param {boolean} visible - Indicates if the scene should be shown or hidden.\n */\n\n Component_LayoutSceneBehavior.prototype.show = function(visible) {\n if (visible) {\n ResourceManager.context = this.resourceContext;\n }\n this.layout.visible = visible;\n this.layout.update();\n this.objectManager.active = visible;\n if (visible) {\n return gs.ObjectManager.current = SceneManager;\n }\n };\n\n\n /**\n * Action method which triggers a full refresh on the object returned by the specified binding-expression.\n * The params must be a direct binding-expression string.\n *\n * @method fullRefreshObject\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The binding expression.\n */\n\n Component_LayoutSceneBehavior.prototype.fullRefreshObject = function(sender, object) {\n object = ui.Component_FormulaHandler.fieldValue(sender, object);\n return object != null ? object.fullRefresh() : void 0;\n };\n\n\n /**\n * Action method which triggers a refresh on the object returned by the specified binding-expression.\n * The params must be a direct binding-expression string.\n *\n * @method refreshObject\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The binding expression.\n */\n\n Component_LayoutSceneBehavior.prototype.refreshObject = function(sender, object) {\n object = ui.Component_FormulaHandler.fieldValue(sender, object);\n return object != null ? object.needsUpdate = true : void 0;\n };\n\n Component_LayoutSceneBehavior.prototype.addStyle = function(sender, style) {\n var styleObject;\n styleObject = ui.UIManager.styles[style];\n if (styleObject != null) {\n styleObject.apply(sender);\n }\n sender.needsUpdate = true;\n if (styleObject != null ? styleObject.font : void 0) {\n return sender.behavior.refresh();\n }\n };\n\n Component_LayoutSceneBehavior.prototype.removeStyle = function(sender, style) {\n var i, len, ref, ref1, s, styleObject;\n styleObject = ui.UIManager.styles[style];\n if (styleObject != null) {\n styleObject.revert(sender);\n }\n sender.descriptor.styles.remove(style);\n ref = sender.descriptor.styles;\n for (i = 0, len = ref.length; i < len; i++) {\n s = ref[i];\n if ((ref1 = ui.UIManager.styles[s]) != null) {\n ref1.apply(sender);\n }\n }\n sender.needsUpdate = true;\n if (styleObject != null ? styleObject.font : void 0) {\n return sender.behavior.refresh();\n }\n };\n\n\n /**\n * Action method which executes the specified bindings.\n *\n * @method executeBindings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object[]} params - An array of binding-definitions.\n */\n\n Component_LayoutSceneBehavior.prototype.executeBindings = function(sender, bindings) {\n var binding, i, len;\n for (i = 0, len = bindings.length; i < len; i++) {\n binding = bindings[i];\n ui.Component_FormulaHandler.executeBinding(sender, binding);\n }\n return null;\n };\n\n\n /**\n * Action method which executes the specified formulas.\n *\n * @method executeFormulas\n * @param {gs.Object_Base} sender - The sender object.\n * @param {ui.Formula[]} params - An array of formula-definitions.\n */\n\n Component_LayoutSceneBehavior.prototype.executeFormulas = function(sender, formulas) {\n var formula, i, len, results;\n results = [];\n for (i = 0, len = formulas.length; i < len; i++) {\n formula = formulas[i];\n results.push(ui.Component_FormulaHandler.executeFormula(sender, formula));\n }\n return results;\n };\n\n\n /**\n * Action method which executes an animation on a specified target game object.\n *\n * @method executeAnimation\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains target-id and animations: { target, animations }\n */\n\n Component_LayoutSceneBehavior.prototype.executeAnimation = function(sender, params) {\n var animation, object;\n object = ui.Component_FormulaHandler.fieldValue(sender, params.target);\n animation = object != null ? object.animations.first(function(a) {\n return a.event === params.event;\n }) : void 0;\n if (animation && object) {\n return object.animationExecutor.execute(animation);\n }\n };\n\n\n /**\n * Action method which emits the specified event.\n *\n * @method emitEvent\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains event name, source and data.\n * <ul>\n * <li>params.name - The name of the event to emit</li>\n * <li>params.source - A binding-expression to define the game object which should emit the event.</li>\n * <li>params.data - An object containing additional event specific data.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.emitEvent = function(sender, params) {\n var object;\n object = ui.Component_FormulaHandler.fieldValue(sender, params.source);\n return object != null ? object.events.emit(params.name, object, ui.Component_FormulaHandler.fieldValue(sender, params.data)) : void 0;\n };\n\n\n /**\n * Action method which changes the game's aspect ratio.\n *\n * @method executeBindings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - If <b>true</b> the game screen will stretched so that it fills the entire screen\n * of the player without any black borders. Otherwise the game screen stretches but keeps its ratio\n * so black borders are possible if the game resolution's ratio and the target display's ratio are not match. It can also\n * be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.adjustAspectRatio = function(sender, adjust) {\n adjust = ui.Component_FormulaHandler.fieldValue(sender, adjust);\n GameManager.settings.adjustAspectRatio = adjust;\n Graphics.keepRatio = !adjust;\n return Graphics.onResize();\n };\n\n\n /**\n * Action method which enters fullscreen mode.\n *\n * @method enterFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.enterFullScreen = function(sender, params) {\n gs.Graphics.enterFullscreen();\n return GameManager.settings.fullScreen = Graphics.isFullscreen();\n };\n\n\n /**\n * Action method which leaves fullscreen mode.\n *\n * @method leaveFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.leaveFullScreen = function() {\n gs.Graphics.leaveFullscreen();\n return GameManager.settings.fullScreen = Graphics.isFullscreen();\n };\n\n\n /**\n * Action method which toggles between window and fullscreen mode.\n *\n * @method toggleFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.toggleFullScreen = function(sender, params) {\n if (gs.Graphics.isFullscreen()) {\n gs.Graphics.leaveFullscreen();\n } else {\n gs.Graphics.enterFullscreen();\n }\n return GameManager.settings.fullScreen = gs.Graphics.isFullscreen();\n };\n\n\n /**\n * Action method which plays the specified sound.\n *\n * @method playSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - The sound to play.\n */\n\n Component_LayoutSceneBehavior.prototype.playSound = function(sender, params) {\n AudioManager.loadSound(params);\n return AudioManager.playSound(params);\n };\n\n\n /**\n * Action method which plays the specified voice.\n *\n * @method playVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - The voice to play.\n */\n\n Component_LayoutSceneBehavior.prototype.playVoice = function(sender, params) {\n AudioManager.loadSound(params);\n return AudioManager.playVoice(params);\n };\n\n\n /**\n * Action method which turns voice on or off.\n *\n * @method turnOnOffVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> voice will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnOffVoice = function(sender, state) {\n if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n return this.turnOnVoice();\n } else {\n return this.turnOffVoice();\n }\n };\n\n\n /**\n * Action method which turns music on or off.\n *\n * @method turnOnOffMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> music will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnOffMusic = function(sender, state) {\n if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n return this.turnOnMusic();\n } else {\n return this.turnOffMusic();\n }\n };\n\n\n /**\n * Action method which turns sound on or off.\n *\n * @method turnOnOffSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> sound will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnOffSound = function(sender, state) {\n if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n return this.turnOnSound();\n } else {\n return this.turnOffSound();\n }\n };\n\n\n /**\n * Action method which turns off voice.\n *\n * @method turnOffVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOffVoice = function() {\n return AudioManager.stopAllVoices();\n };\n\n\n /**\n * Action method which turns off music.\n *\n * @method turnOffMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOffMusic = function() {\n return AudioManager.stopMusic();\n };\n\n\n /**\n * Action method which turns off sound.\n *\n * @method turnOffSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOffSound = function() {\n return AudioManager.stopAllSounds();\n };\n\n\n /**\n * Action method which turns on voice.\n *\n * @method turnOnVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnVoice = function() {};\n\n\n /**\n * Action method which turns on sound.\n *\n * @method turnOnSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnSound = function() {};\n\n\n /**\n * Action method which turns on music.\n *\n * @method turnOnMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnMusic = function() {\n return AudioManager.resumeMusic();\n };\n\n\n /**\n * Action method which selects the specified language.\n *\n * @method selectLanguage\n * @param {gs.Object_Base} sender - The sender object.\n * @param {number|string} params - Index of the language to set. Can be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.selectLanguage = function(sender, params) {\n var language;\n language = LanguageManager.languages[ui.Component_FormulaHandler.fieldValue(sender, params)];\n return LanguageManager.selectLanguage(language);\n };\n\n\n /**\n * Action method which resets global data storage.\n *\n * @method resetGlobalData\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.resetGlobalData = function(sender) {\n return GameManager.resetGlobalData();\n };\n\n\n /**\n * Action method which saves game settings.\n *\n * @method saveSettings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.saveSettings = function(sender) {\n return GameManager.saveSettings();\n };\n\n\n /**\n * Action method which prepares the game for saving by taking a snapshot of the current game state\n * and storing it in GameManager.saveGame.\n *\n * @method prepareSaveGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.prepareSaveGame = function(sender, params) {\n return GameManager.prepareSaveGame(params != null ? params.snapshot : void 0);\n };\n\n\n /**\n * Action method which saves the current game at the specified save slot.\n *\n * @method saveGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the slot-index where the game should be saved.\n * <ul>\n * <li>params.slot - The slot-index where the game should be saved. Can be a binding-expression.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.saveGame = function(sender, params) {\n return GameManager.save(ui.Component_FormulaHandler.fieldValue(sender, params.slot));\n };\n\n\n /**\n * Action method which loads the game from the specified save slot.\n *\n * @method loadGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the slot-index where the game should be loaded from.\n * <ul>\n * <li>params.slot - The slot-index where the game should be loaded from. Can be a binding-expression.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.loadGame = function(sender, params) {\n GameManager.tempSettings.skip = false;\n return GameManager.load(ui.Component_FormulaHandler.fieldValue(sender, params.slot));\n };\n\n\n /**\n * Action method which starts a new game.\n *\n * @method newGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.newGame = function(sender, params) {\n var scene;\n AudioManager.stopAllMusic(30);\n GameManager.newGame();\n scene = new vn.Object_Scene();\n SceneManager.clear();\n return SceneManager.switchTo(scene);\n };\n\n\n /**\n * Action method which exists the current game. It doesn't change the scene and\n * should be called before switching back to the title screen or main menu.\n *\n * @method exitGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.exitGame = function(sender, params) {\n return GameManager.exitGame();\n };\n\n\n /**\n * Action method which switches to another scene.\n *\n * @method switchScene\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the class name of the scene to switch to.\n * <ul>\n * <li>params.name - The class-name of the scene to switch to. The class must be defined in vn-namespace.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.switchScene = function(sender, params) {\n var f;\n f = (function(_this) {\n return function() {\n var scene;\n if (params.clear) {\n SceneManager.clear();\n }\n scene = new vn[params.name]();\n return SceneManager.switchTo(scene, params.savePrevious);\n };\n })(this);\n if (!params.savePrevious) {\n return this.layout.ui.disappear((function(_this) {\n return function(e) {\n return f();\n };\n })(this));\n } else {\n return f();\n }\n };\n\n\n /**\n * Action method which switches to another game scene.\n *\n * @method switchGameScene\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the UID of the scene to switch to.\n * <ul>\n * <li>params.uid - The UID of the scene to switch to.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.switchGameScene = function(sender, params) {\n var f;\n f = (function(_this) {\n return function() {\n var newScene, sceneData, sceneDocument, sceneDocuments, uid;\n if (params.clear) {\n SceneManager.clear();\n }\n uid = params.uid;\n if (params.name) {\n sceneDocuments = DataManager.getDocumentsByType(\"vn.scene\");\n sceneDocument = sceneDocuments.first(function(d) {\n return d.items.name === params.name;\n });\n if (sceneDocument) {\n uid = sceneDocument.uid;\n }\n }\n sceneData = {\n uid: uid,\n pictures: [],\n texts: []\n };\n GameManager.sceneData = sceneData;\n newScene = new vn.Object_Scene();\n newScene.sceneData = sceneData;\n return SceneManager.switchTo(newScene, params.savePrevious);\n };\n })(this);\n if (!params.savePrevious) {\n return (this.layout || this.object.layout).ui.disappear((function(_this) {\n return function(e) {\n return f();\n };\n })(this));\n } else {\n return f();\n }\n };\n\n\n /**\n * Action method which switches to another layout.\n *\n * @method switchLayout\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the name of the layout to switch to.\n * <ul>\n * <li>params.name - The name of the layout to switch to.</li>\n * <li>params.savePrevious - Indicates if the current layout should not be erased but paused and hidden instead so\n * that it can be restored using <i>returnToPrevious</i> action.</li>\n * <li>params.dataFields - Defines the data of \"$dataFields\" binding-expression variable. Can be a binding-expression\n * or a direct object. Optional.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.switchLayout = function(sender, layout) {\n var f;\n f = (function(_this) {\n return function() {\n var dataFields, i, len, ref, scene, senderField;\n Graphics.freeze();\n if (layout.clear) {\n SceneManager.clear();\n }\n scene = new gs.Object_Layout(layout.name);\n dataFields = sender.dataFields;\n if (typeof layout.dataFields === \"string\") {\n dataFields = ui.Component_FormulaHandler.fieldValue(sender, layout.dataFields);\n } else if (layout.dataFields != null) {\n dataFields = layout.dataFields;\n }\n scene.dataFields = dataFields;\n scene.controllers = layout.controllers;\n if (layout.senderData != null) {\n ref = layout.senderData;\n for (i = 0, len = ref.length; i < len; i++) {\n senderField = ref[i];\n scene[senderField] = sender[senderField];\n }\n }\n return SceneManager.switchTo(scene, layout.savePrevious, layout.stack);\n };\n })(this);\n if (!layout.savePrevious) {\n return (this.layout || this.object.layout).ui.disappear((function(_this) {\n return function(e) {\n return f();\n };\n })(this));\n } else {\n return f();\n }\n };\n\n\n /**\n * Action method which returns to previous layout. (If savePrevious was set to <b>true</b> on switchLayout.).\n *\n * @method previousLayout\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.previousLayout = function(sender) {\n return SceneManager.returnToPrevious();\n };\n\n\n /**\n * Action method which disposes the specified control.\n *\n * @method disposeControl\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The ID of the control to dispose. Can be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.disposeControl = function(sender, id) {\n var control;\n control = this.objectManager.objectById(ui.Component_FormulaHandler.fieldValue(sender, id));\n return control != null ? control.ui.disappear(function(sender) {\n return sender.dispose();\n }) : void 0;\n };\n\n\n /**\n * Action method which creates a new control from the specified descriptor.\n *\n * @method createControl\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - Contains the descriptor and other data needed to construct the control.\n * <ul>\n * <li>params.descriptor - The control' descriptor. Can be a direct descriptor definition or a template name</li>\n * <li>params.parent - A binding-expression which returns the control's parent.</li>\n * <li>params.senderData - An object containing additional data merged into the control object.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.createControl = function(sender, data) {\n var control, descriptor, fieldName, i, len, parent, ref;\n if (typeof data.descriptor === \"string\") {\n descriptor = ui.UIManager.customTypes[data.descriptor];\n } else {\n descriptor = data.descriptor;\n }\n parent = ui.Component_FormulaHandler.fieldValue(sender, data.parent);\n control = ui.UiFactory._createFromDescriptor(descriptor, parent != null ? parent : this.object);\n if (data.senderData != null) {\n ref = data.senderData;\n for (i = 0, len = ref.length; i < len; i++) {\n fieldName = ref[i];\n control[fieldName] = sender[fieldName];\n }\n }\n control.ui.prepare();\n control.ui.appear();\n return control;\n };\n\n\n /**\n * Action method which quits the game.\n *\n * @method quitGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.quitGame = function(sender, data) {\n return SceneManager.switchTo(null);\n };\n\n return Component_LayoutSceneBehavior;\n\n})(gs.Component_SceneBehavior);\n\ngs.Component_LayoutSceneBehavior = Component_LayoutSceneBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsNkJBQUE7RUFBQTs7O0FBQU07Ozs7QUFFRjs7Ozs7Ozs7OztFQVNhLHVDQUFBO0lBQ1QsNkRBQUE7SUFFQSxJQUFDLENBQUEsYUFBRCxHQUFpQjtJQUNqQixJQUFDLENBQUEsTUFBRCxHQUFVO0lBQ1YsSUFBQyxDQUFBLGVBQUQsR0FBbUI7RUFMVjs7O0FBT2I7Ozs7OzswQ0FLQSxVQUFBLEdBQVksU0FBQTtJQUNSLCtEQUFBLFNBQUE7SUFFQSxJQUFDLENBQUEsZUFBRCxHQUFtQixlQUFlLENBQUMsYUFBaEIsQ0FBQTtJQUNuQixlQUFlLENBQUMsT0FBaEIsR0FBMEIsSUFBQyxDQUFBO0lBRTNCLElBQU8sOEJBQVA7TUFDSSxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVIsR0FBcUI7UUFBRSxNQUFBLEVBQVEsZUFBVjtRQUEyQixVQUFBLEVBQVksRUFBdkM7UUFBMkMsT0FBQSxFQUFTLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQUFwRDtRQUR6Qjs7V0FHQSxlQUFlLENBQUMsV0FBaEIsQ0FBQTtFQVRROzs7QUFXWjs7Ozs7OzBDQUtBLE9BQUEsR0FBUyxTQUFBO1dBQ0wsNERBQUEsU0FBQTtFQURLOzs7QUFHVDs7Ozs7OzswQ0FNQSxXQUFBLEdBQWEsU0FBQTtJQUNULEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBakIsR0FBMkIsSUFBQyxDQUFBO0lBRTVCLElBQUcsQ0FBSSxXQUFXLENBQUMsV0FBbkI7TUFDSSxXQUFXLENBQUMsVUFBWixDQUFBLEVBREo7O0lBR0EsSUFBQyxDQUFBLFVBQUQsR0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVksQ0FBQSxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFuQixJQUFpQyxTQUFqQyxDQUF6QixDQUFBO0lBQ2QsTUFBTSxDQUFDLFdBQVAsR0FBcUIsSUFBQyxD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QXZDLEVBQStDLEVBQS9DLENBQTFCOzZCQUdWLE9BQU8sQ0FBRSxFQUFFLENBQUMsU0FBWixDQUFzQixTQUFDLE1BQUQ7YUFBWSxNQUFNLENBQUMsT0FBUCxDQUFBO0lBQVosQ0FBdEI7RUFKWTs7O0FBTWhCOzs7Ozs7Ozs7Ozs7OzBDQVlBLGFBQUEsR0FBZSxTQUFDLE1BQUQsRUFBUyxJQUFUO0FBQ1gsUUFBQTtJQUFBLElBQUcsT0FBTyxJQUFJLENBQUMsVUFBWixLQUEwQixRQUE3QjtNQUNJLFVBQUEsR0FBYSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVksQ0FBQSxJQUFJLENBQUMsVUFBTCxFQUQxQztLQUFBLE1BQUE7TUFHSSxVQUFBLEdBQWEsSUFBSSxDQUFDLFdBSHRCOztJQU1BLE1BQUEsR0FBUyxFQUFFLENBQUMsd0JBQXdCLENBQUMsVUFBNUIsQ0FBdUMsTUFBdkMsRUFBK0MsSUFBSSxDQUFDLE1BQXBEO0lBQ1QsT0FBQSxHQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMscUJBQWIsQ0FBbUMsVUFBbkMsbUJBQStDLFNBQVMsSUFBQyxDQUFBLE1BQXpEO0lBRVYsSUFBRyx1QkFBSDtBQUNJO0FBQUEsV0FBQSxxQ0FBQTs7UUFDSSxPQUFRLENBQUEsU0FBQSxDQUFSLEdBQXFCLE1BQU8sQ0FBQSxTQUFBO0FBRGhDLE9BREo7O0lBR0EsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFYLENBQUE7SUFDQSxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQVgsQ0FBQTtBQUVBLFdBQU87RUFoQkk7OztBQWtCZjs7Ozs7Ozs7MENBT0EsUUFBQSxHQUFVLFNBQUMsTUFBRCxFQUFTLElBQVQ7V0FDTixZQUFZLENBQUMsUUFBYixDQUFzQixJQUF0QjtFQURNOzs7O0dBOW5COEIsRUFBRSxDQUFDOztBQW1vQi9DLEVBQUUsQ0FBQyw2QkFBSCxHQUFtQyIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3LjgIBcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIENvbXBvbmVudF9MYXlvdXRTY2VuZUJlaGF2aW9yIGV4dGVuZHMgZ3MuQ29tcG9uZW50X1NjZW5lQmVoYXZpb3JcbiAgIyAgQG9iamVjdENvZGVjQmxhY2tMaXN0ID0gW1wib2JqZWN0TWFuYWdlclwiXVxuICAgICMjIypcbiAgICAqIFRoZSBiYXNlIGNsYXNzIG9mIGFsbCBzY2VuZS1iZWhhdmlvciBjb21wb25lbnRzLiBBIHNjZW5lLWJlaGF2aW9yIGNvbXBvbmVudFxuICAgICogZGVmaW5lIHRoZSBsb2dpYyBvZiBhIHNpbmdsZSBnYW1lIHNjZW5lLiBcbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3JcbiAgICAqIEBleHRlbmRzIGdzLkNvbXBvbmVudF9TY2VuZUJlaGF2aW9yXG4gICAgKiBAbWVtYmVyb2YgZ3NcbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogLT5cbiAgICAgICAgc3VwZXIoKVxuICAgICAgICBcbiAgICAgICAgQG9iamVjdE1hbmFnZXIgPSBTY2VuZU1hbmFnZXJcbiAgICAgICAgQGxheW91dCA9IG51bGxcbiAgICAgICAgQHJlc291cmNlQ29udGV4dCA9IG51bGxcbiAgICBcbiAgICAjIyMqXG4gICAgKiBJbml0aWFsaXplcyB0aGUgc2NlbmUuIFxuICAgICpcbiAgICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgICMjIyAgICBcbiAgICBpbml0aWFsaXplOiAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBcbiAgICAgICAgQHJlc291cmNlQ29udGV4dCA9IFJlc291cmNlTWFuYWdlci5jcmVhdGVDb250ZXh0KClcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmNvbnRleHQgPSBAcmVzb3VyY2VDb250ZXh0XG4gICAgICAgIFxuICAgICAgICBpZiBub3QgQG9iamVjdC5sYXlvdXREYXRhP1xuICAgICAgICAgICAgQG9iamVjdC5sYXlvdXREYXRhID0geyBcInR5cGVcIjogXCJ1aS5GcmVlTGF5b3V0XCIsIFwiY29udHJvbHNcIjogW10sIFwiZnJhbWVcIjogWzAsIDAsIDEsIDFdIH1cbiAgICAgICAgICAgIFxuICAgICAgICBMYW5ndWFnZU1hbmFnZXIubG9hZEJ1bmRsZXMoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBEaXNwb3NlcyB0aGUgc2NlbmUuIFxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZVxuICAgICMjI1xuICAgIGRpc3Bvc2U6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgIFxuICAgICMjIypcbiAgICAqIFByZXBhcmVzIGFsbCBkYXRhIGZvciB0aGUgc2NlbmUgYW5kIGxvYWRzIHRoZSBuZWNlc3NhcnkgZ3JhcGhpYyBhbmQgYXVkaW8gcmVzb3VyY2VzLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZURhdGFcbiAgICAqIEBhYnN0cmFjdFxuICAgICMjIyAgICBcbiAgICBwcmVwYXJlRGF0YTogLT5cbiAgICAgICAgZ3MuT2JqZWN0TWFuYWdlci5jdXJyZW50ID0gQG9iamVjdE1hbmFnZXJcbiAgICAgICAgXG4gICAgICAgIGlmIG5vdCBHYW1lTWFuYWdlci5pbml0aWFsaXplZFxuICAgICAgICAgICAgR2FtZU1hbmFnZXIuaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgICBcbiAgICAgICAgQGRhdGFGaWVsZHMgPSB1aS5VaUZhY3RvcnkuZGF0YVNvdXJjZXNbQG9iamVjdC5sYXlvdXREYXRhLmRhdGFTb3VyY2UgfHwgXCJkZWZhdWx0XCJdKClcbiAgICAgICAgd2luZG93LiRkYXRhRmllbGRzID0gQGRhdGFGaWVsZHNcbiAgICAgICAgQG11c2ljID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoQG9iamVjdCwgQG9iamVjdC5sYXlvdXREYXRhLm11c2ljKVxuICAgICAgICBBdWRpb01hbmFnZXIubG9hZE11c2ljKEBtdXNpYylcbiAgICAgICAgQHByZXBhcmVUcmFuc2l0aW9uKFJlY29yZE1hbmFnZXIuc3lzdGVtLm1lbnVUcmFuc2l0aW9uKVxuICAgICAgICBcbiAgICAgICAgUmVzb3VyY2VMb2FkZXIubG9hZFVpVHlwZXNHcmFwaGljcyh1aS5VaUZhY3RvcnkuY3VzdG9tVHlwZXMpXG4gICAgICAgIFJlc291cmNlTG9hZGVyLmxvYWRVaUxheW91dEdyYXBoaWNzKEBvYmplY3QubGF5b3V0RGF0YSlcbiAgICAgICAgXG4gICAgICAgIGlmIEBkYXRhRmllbGRzP1xuICAgICAgICAgICAgUmVzb3VyY2VMb2FkZXIubG9hZFVpRGF0YUZpZWxkc0dyYXBoaWNzKEBkYXRhRmllbGRzKVxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0Qml0bWFwKFwiR3JhcGhpY3MvQ2hhcmFjdGVycy9KYW5lRGF0ZV9Ob3JtYWxcIilcbiAgICAgXG4gICAgIyMjKlxuICAgICogUHJlcGFyZXMgYWxsIHZpc3VhbCBnYW1lIG9iamVjdCBmb3IgdGhlIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZVZpc3VhbFxuICAgICMjIyAgICAgICAgIFxuICAgIHByZXBhcmVWaXN1YWw6IC0+XG4gICAgICAgIHNjYWxlID0gR3JhcGhpY3Muc2NhbGVcbiAgICAgICAgdm9jYWIgPSBSZWNvcmRNYW5hZ2VyLnZvY2FidWxhcnlcblxuICAgICAgICBpZiBub3QgQGxheW91dD9cbiAgICAgICAgICAgIEBkYXRhT2JqZWN0ID0ge31cbiAgICAgICAgICAgIEBsYXlvdXQgPSB1aS5VaUZhY3RvcnkuY3JlYXRlRnJvbURlc2NyaXB0b3IoQG9iamVjdC5sYXlvdXREYXRhLCBAb2JqZWN0KVxuICAgIFxuICAgICAgICAgICAgaWYgQG11c2ljP1xuICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5jaGFuZ2VNdXNpYyhAbXVzaWMsIDMwKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgQGxheW91dC51aS5wcmVwYXJlKClcbiAgICAgICAgQGxheW91dC51aS5hcHBlYXIoKVxuICAgICAgICBAbGF5b3V0LnVwZGF0ZSgpXG4gICAgICAgIFxuICAgICAgICBAdHJhbnNpdGlvbigpXG4gICAgICAgIFxuICAgICAgICBpZiBTY2VuZU1hbmFnZXIucHJldmlvdXNTY2VuZXMubGVuZ3RoID09IDBcbiAgICAgICAgICAgIGlmIEdhbWVNYW5hZ2VyLnRlbXBGaWVsZHMuaXNFeGl0aW5nR2FtZVxuICAgICAgICAgICAgICAgIEdhbWVNYW5hZ2VyLnRlbXBGaWVsZHMuaXNFeGl0aW5nR2FtZSA9IG5vXG4gICAgICAgICAgICAgICAgZ3MuR2FtZU5vdGlmaWVyLnBvc3RSZXNldFNjZW5lQ2hhbmdlKEBvYmplY3QubGF5b3V0TmFtZSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBncy5HYW1lTm90aWZpZXIucG9zdFNjZW5lQ2hhbmdlKEBvYmplY3QubGF5b3V0TmFtZSlcbiAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgc2NlbmUncyBjb250ZW50LlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQ29udGVudFxuICAgICMjIyAgICBcbiAgICB1cGRhdGVDb250ZW50OiAtPlxuICAgICAgICBHYW1lTWFuYWdlci51cGRhdGUoKVxuICAgICAgICBHcmFwaGljcy52aWV3cG9ydC51cGRhdGUoKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBTaG93cy9IaWRlcyB0aGUgY3VycmVudCBzY2VuZS4gQSBoaWRkZW4gc2NlbmUgaXMgbm8gbG9uZ2VyIHNob3duIGFuZCBleGVjdXRlZFxuICAgICogYnV0IGFsbCBvYmplY3RzIGFuZCBkYXRhIGlzIHN0aWxsIHRoZXJlIGFuZCBiZSBzaG93biBhZ2FpbiBhbnl0aW1lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2hvd1xuICAgICogQHBhcmFtIHtib29sZWFufSB2aXNpYmxlIC0gSW5kaWNhdGVzIGlmIHRoZSBzY2VuZSBzaG91bGQgYmUgc2hvd24gb3IgaGlkZGVuLlxuICAgICMjIyAgICAgICAgICBcbiAgICBzaG93OiAodmlzaWJsZSkgLT5cbiAgICAgICAgaWYgdmlzaWJsZVxuICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmNvbnRleHQgPSBAcmVzb3VyY2VDb250ZXh0XG4gICAgICAgIEBsYXlvdXQudmlzaWJsZSA9IHZpc2libGVcbiAgICAgICAgQGxheW91dC51cGRhdGUoKVxuICAgICAgICBAb2JqZWN0TWFuYWdlci5hY3RpdmUgPSB2aXNpYmxlXG4gICAgICAgIGlmIHZpc2libGVcbiAgICAgICAgICAgIGdzLk9iamVjdE1hbmFnZXIuY3VycmVudCA9IFNjZW5lTWFuYWdlciAjQG9iamVjdE1hbmFnZXJcbiAgICAgICAgI0BvYmplY3RNYW5hZ2VyLnVwZGF0ZSgpXG4gICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHJpZ2dlcnMgYSBmdWxsIHJlZnJlc2ggb24gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAqIFRoZSBwYXJhbXMgbXVzdCBiZSBhIGRpcmVjdCBiaW5kaW5nLWV4cHJlc3Npb24gc3RyaW5nLlxuICAgICpcbiAgICAqIEBtZXRob2QgZnVsbFJlZnJlc2hPYmplY3RcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtICBUaGUgYmluZGluZyBleHByZXNzaW9uLlxuICAgICMjIyAgICBcbiAgICBmdWxsUmVmcmVzaE9iamVjdDogKHNlbmRlciwgb2JqZWN0KSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIG9iamVjdClcbiAgICAgICAgb2JqZWN0Py5mdWxsUmVmcmVzaCgpXG4gICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHRyaWdnZXJzIGEgcmVmcmVzaCBvbiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgYmluZGluZy1leHByZXNzaW9uLlxuICAgICogVGhlIHBhcmFtcyBtdXN0IGJlIGEgZGlyZWN0IGJpbmRpbmctZXhwcmVzc2lvbiBzdHJpbmcuXG4gICAgKlxuICAgICogQG1ldGhvZCByZWZyZXNoT2JqZWN0XG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMgLSAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbi5cbiAgICAjIyMgICAgXG4gICAgcmVmcmVzaE9iamVjdDogKHNlbmRlciwgb2JqZWN0KSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIG9iamVjdClcbiAgICAgICAgb2JqZWN0Py5uZWVkc1VwZGF0ZSA9IHRydWVcbiAgICAgICAgXG4gICAgYWRkU3R5bGU6IChzZW5kZXIsIHN0eWxlKSAtPlxuICAgICAgICBzdHlsZU9iamVjdCA9IHVpLlVJTWFuYWdlci5zdHlsZXNbc3R5bGVdXG4gICAgICAgIHN0eWxlT2JqZWN0Py5hcHBseShzZW5kZXIpXG4gICAgICAgIHNlbmRlci5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICBpZiBzdHlsZU9iamVjdD8uZm9udFxuICAgICAgICAgICAgc2VuZGVyLmJlaGF2aW9yLnJlZnJlc2goKVxuICAgICAgICBcbiAgICByZW1vdmVTdHlsZTogKHNlbmRlciwgc3R5bGUpIC0+IFxuICAgICAgICBzdHlsZU9iamVjdCA9IHVpLlVJTWFuYWdlci5zdHlsZXNbc3R5bGVdXG4gICAgICAgIHN0eWxlT2JqZWN0Py5yZXZlcnQoc2VuZGVyKVxuICAgICAgICBzZW5kZXIuZGVzY3JpcHRvci5zdHlsZXMucmVtb3ZlKHN0eWxlKVxuICAgICAgICBcbiAgICAgICAgZm9yIHMgaW4gc2VuZGVyLmRlc2NyaXB0b3Iuc3R5bGVzXG4gICAgICAgICAgICB1aS5VSU1hbmFnZXIuc3R5bGVzW3NdPy5hcHBseShzZW5kZXIpXG4gICAgICAgIHNlbmRlci5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICBpZiBzdHlsZU9iamVjdD8uZm9udFxuICAgICAgICAgICAgc2VuZGVyLmJlaGF2aW9yLnJlZnJlc2goKVxuICAgICAgICAgICAgXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIGJpbmRpbmdzLlxuICAgICpcbiAgICAqIEBtZXRob2QgZXhlY3V0ZUJpbmRpbmdzXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0W119IHBhcmFtcyAtICBBbiBhcnJheSBvZiBiaW5kaW5nLWRlZmluaXRpb25zLlxuICAgICMjIyBcbiAgICBleGVjdXRlQmluZGluZ3M6IChzZW5kZXIsIGJpbmRpbmdzKSAtPlxuICAgICAgICBmb3IgYmluZGluZyBpbiBiaW5kaW5nc1xuICAgICAgICAgICAgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmV4ZWN1dGVCaW5kaW5nKHNlbmRlciwgYmluZGluZylcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggZXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBmb3JtdWxhcy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGV4ZWN1dGVGb3JtdWxhc1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge3VpLkZvcm11bGFbXX0gcGFyYW1zIC0gIEFuIGFycmF5IG9mIGZvcm11bGEtZGVmaW5pdGlvbnMuXG4gICAgIyMjICBcbiAgICBleGVjdXRlRm9ybXVsYXM6IChzZW5kZXIsIGZvcm11bGFzKSAtPlxuICAgICAgICBmb3IgZm9ybXVsYSBpbiBmb3JtdWxhc1xuICAgICAgICAgICAgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmV4ZWN1dGVGb3JtdWxhKHNlbmRlciwgZm9ybXVsYSlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGV4ZWN1dGVzIGFuIGFuaW1hdGlvbiBvbiBhIHNwZWNpZmllZCB0YXJnZXQgZ2FtZSBvYmplY3QuXG4gICAgKlxuICAgICogQG1ldGhvZCBleGVjdXRlQW5pbWF0aW9uXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSAgQ29udGFpbnMgdGFyZ2V0LWlkIGFuZCBhbmltYXRpb25zOiB7IHRhcmdldCwgYW5pbWF0aW9ucyB9XG4gICAgIyMjICAgICAgICAgXG4gICAgZXhlY3V0ZUFuaW1hdGlvbjogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHBhcmFtcy50YXJnZXQpXG4gICAgICAgIGFuaW1hdGlvbiA9IG9iamVjdD8uYW5pbWF0aW9ucy5maXJzdCAoYSkgLT4gYS5ldmVudCA9PSBwYXJhbXMuZXZlbnRcbiAgICAgICAgXG4gICAgICAgIGlmIGFuaW1hdGlvbiBhbmQgb2JqZWN0XG4gICAgICAgICAgICBvYmplY3QuYW5pbWF0aW9uRXhlY3V0b3IuZXhlY3V0ZShhbmltYXRpb24pXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGVtaXRzIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBlbWl0RXZlbnRcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIGV2ZW50IG5hbWUsIHNvdXJjZSBhbmQgZGF0YS5cbiAgICAqIDx1bD5cbiAgICAqIDxsaT5wYXJhbXMubmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBlbWl0PC9saT5cbiAgICAqIDxsaT5wYXJhbXMuc291cmNlIC0gQSBiaW5kaW5nLWV4cHJlc3Npb24gdG8gZGVmaW5lIHRoZSBnYW1lIG9iamVjdCB3aGljaCBzaG91bGQgZW1pdCB0aGUgZXZlbnQuPC9saT5cbiAgICAqIDxsaT5wYXJhbXMuZGF0YSAtIEFuIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgZXZlbnQgc3BlY2lmaWMgZGF0YS48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgXG4gICAgZW1pdEV2ZW50OiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIG9iamVjdCA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNvdXJjZSlcbiAgICAgICAgb2JqZWN0Py5ldmVudHMuZW1pdChwYXJhbXMubmFtZSwgb2JqZWN0LCB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHBhcmFtcy5kYXRhKSlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGNoYW5nZXMgdGhlIGdhbWUncyBhc3BlY3QgcmF0aW8uXG4gICAgKlxuICAgICogQG1ldGhvZCBleGVjdXRlQmluZGluZ3NcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMgLSAgSWYgPGI+dHJ1ZTwvYj4gdGhlIGdhbWUgc2NyZWVuIHdpbGwgc3RyZXRjaGVkIHNvIHRoYXQgaXQgZmlsbHMgdGhlIGVudGlyZSBzY3JlZW5cbiAgICAqIG9mIHRoZSBwbGF5ZXIgd2l0aG91dCBhbnkgYmxhY2sgYm9yZGVycy4gT3RoZXJ3aXNlIHRoZSBnYW1lIHNjcmVlbiBzdHJldGNoZXMgYnV0IGtlZXBzIGl0cyByYXRpb1xuICAgICogc28gYmxhY2sgYm9yZGVycyBhcmUgcG9zc2libGUgaWYgdGhlIGdhbWUgcmVzb2x1dGlvbidzIHJhdGlvIGFuZCB0aGUgdGFyZ2V0IGRpc3BsYXkncyByYXRpbyBhcmUgbm90IG1hdGNoLiBJdCBjYW4gYWxzb1xuICAgICogYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjXG4gICAgYWRqdXN0QXNwZWN0UmF0aW86IChzZW5kZXIsIGFkanVzdCkgLT5cbiAgICAgICAgYWRqdXN0ID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBhZGp1c3QpXG4gICAgXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmFkanVzdEFzcGVjdFJhdGlvID0gYWRqdXN0XG4gICAgICAgIEdyYXBoaWNzLmtlZXBSYXRpbyA9ICFhZGp1c3RcbiAgICAgICAgR3JhcGhpY3Mub25SZXNpemUoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGVudGVycyBmdWxsc2NyZWVuIG1vZGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBlbnRlckZ1bGxTY3JlZW5cbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj5cbiAgICAjIyNcbiAgICBlbnRlckZ1bGxTY3JlZW46IChzZW5kZXIsIHBhcmFtcykgLT4gXG4gICAgICAgIGdzLkdyYXBoaWNzLmVudGVyRnVsbHNjcmVlbigpXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmZ1bGxTY3JlZW4gPSBHcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggbGVhdmVzIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGxlYXZlRnVsbFNjcmVlblxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPlxuICAgICMjI1xuICAgIGxlYXZlRnVsbFNjcmVlbjogLT4gXG4gICAgICAgIGdzLkdyYXBoaWNzLmxlYXZlRnVsbHNjcmVlbigpXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmZ1bGxTY3JlZW4gPSBHcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHRvZ2dsZXMgYmV0d2VlbiB3aW5kb3cgYW5kIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHRvZ2dsZUZ1bGxTY3JlZW5cbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjXG4gICAgdG9nZ2xlRnVsbFNjcmVlbjogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBpZiBncy5HcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICAgICAgZ3MuR3JhcGhpY3MubGVhdmVGdWxsc2NyZWVuKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZ3MuR3JhcGhpY3MuZW50ZXJGdWxsc2NyZWVuKClcblxuICAgICAgICBHYW1lTWFuYWdlci5zZXR0aW5ncy5mdWxsU2NyZWVuID0gZ3MuR3JhcGhpY3MuaXNGdWxsc2NyZWVuKClcbiAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggcGxheXMgdGhlIHNwZWNpZmllZCBzb3VuZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHBsYXlTb3VuZFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHNvdW5kIHRvIHBsYXkuXG4gICAgIyMjXG4gICAgcGxheVNvdW5kOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIEF1ZGlvTWFuYWdlci5sb2FkU291bmQocGFyYW1zKVxuICAgICAgICBBdWRpb01hbmFnZXIucGxheVNvdW5kKHBhcmFtcylcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBwbGF5cyB0aGUgc3BlY2lmaWVkIHZvaWNlLlxuICAgICpcbiAgICAqIEBtZXRob2QgcGxheVZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBUaGUgdm9pY2UgdG8gcGxheS5cbiAgICAjIyNcbiAgICBwbGF5Vm9pY2U6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLmxvYWRTb3VuZChwYXJhbXMpXG4gICAgICAgIEF1ZGlvTWFuYWdlci5wbGF5Vm9pY2UocGFyYW1zKVxuICAgICAgXG4gICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgdm9pY2Ugb24gb3Igb2ZmLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9uT2ZmVm9pY2VcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gSWYgPGI+dHJ1ZTwvYj4gdm9pY2Ugd2lsbCBiZSB0dXJuZWQgb24uIE90aGVyd2lzZSBpdCB3aWxsIGJlIHR1cm5lZCBvZmYuIENhbiBhbHNvIGJlIGEgYmluZGluZy1leHByZXNzaW9uLlxuICAgICMjIyBcbiAgICB0dXJuT25PZmZWb2ljZTogKHNlbmRlciwgc3RhdGUpIC0+XG4gICAgICAgIGlmIHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgc3RhdGUpIHRoZW4gQHR1cm5PblZvaWNlKCkgZWxzZSBAdHVybk9mZlZvaWNlKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBtdXNpYyBvbiBvciBvZmYuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT25PZmZNdXNpY1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBwYXJhbXMgLSBJZiA8Yj50cnVlPC9iPiBtdXNpYyB3aWxsIGJlIHR1cm5lZCBvbi4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHVybmVkIG9mZi4gQ2FuIGFsc28gYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjIFxuICAgIHR1cm5Pbk9mZk11c2ljOiAoc2VuZGVyLCBzdGF0ZSkgLT5cbiAgICAgICAgaWYgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBzdGF0ZSkgdGhlbiBAdHVybk9uTXVzaWMoKSBlbHNlIEB0dXJuT2ZmTXVzaWMoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHR1cm5zIHNvdW5kIG9uIG9yIG9mZi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHR1cm5Pbk9mZlNvdW5kXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIElmIDxiPnRydWU8L2I+IHNvdW5kIHdpbGwgYmUgdHVybmVkIG9uLiBPdGhlcndpc2UgaXQgd2lsbCBiZSB0dXJuZWQgb2ZmLiBDYW4gYWxzbyBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAjIyMgXG4gICAgdHVybk9uT2ZmU291bmQ6IChzZW5kZXIsIHN0YXRlKSAtPlxuICAgICAgICBpZiB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHN0YXRlKSB0aGVuIEB0dXJuT25Tb3VuZCgpIGVsc2UgQHR1cm5PZmZTb3VuZCgpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb2ZmIHZvaWNlLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9mZlZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9mZlZvaWNlOiAtPlxuICAgICAgICBBdWRpb01hbmFnZXIuc3RvcEFsbFZvaWNlcygpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb2ZmIG11c2ljLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9mZk11c2ljXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9mZk11c2ljOiAtPlxuICAgICAgICBBdWRpb01hbmFnZXIuc3RvcE11c2ljKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBvZmYgc291bmQuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT2ZmU291bmRcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICB0dXJuT2ZmU291bmQ6IC0+XG4gICAgICAgIEF1ZGlvTWFuYWdlci5zdG9wQWxsU291bmRzKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBvbiB2b2ljZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHR1cm5PblZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9uVm9pY2U6IC0+XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb24gc291bmQuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT25Tb3VuZFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj4uXG4gICAgIyMjIFxuICAgIHR1cm5PblNvdW5kOiAtPlxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHR1cm5zIG9uIG11c2ljLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9uTXVzaWNcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICB0dXJuT25NdXNpYzogLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnJlc3VtZU11c2ljKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzZWxlY3RzIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZWxlY3RMYW5ndWFnZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHBhcmFtcyAtIEluZGV4IG9mIHRoZSBsYW5ndWFnZSB0byBzZXQuIENhbiBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAjIyMgXG4gICAgc2VsZWN0TGFuZ3VhZ2U6IChzZW5kZXIsIHBhcmFtcyktPlxuICAgICAgICBsYW5ndWFnZSA9IExhbmd1YWdlTWFuYWdlci5sYW5ndWFnZXNbdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBwYXJhbXMpXVxuICAgICAgICBMYW5ndWFnZU1hbmFnZXIuc2VsZWN0TGFuZ3VhZ2UobGFuZ3VhZ2UpXG4gICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCByZXNldHMgZ2xvYmFsIGRhdGEgc3RvcmFnZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHJlc2V0R2xvYmFsRGF0YVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICByZXNldEdsb2JhbERhdGE6IChzZW5kZXIpIC0+IFxuICAgICAgICBHYW1lTWFuYWdlci5yZXNldEdsb2JhbERhdGEoKVxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggc2F2ZXMgZ2FtZSBzZXR0aW5ncy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNhdmVTZXR0aW5nc1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICBzYXZlU2V0dGluZ3M6IChzZW5kZXIpIC0+IEdhbWVNYW5hZ2VyLnNhdmVTZXR0aW5ncygpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBwcmVwYXJlcyB0aGUgZ2FtZSBmb3Igc2F2aW5nIGJ5IHRha2luZyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGdhbWUgc3RhdGVcbiAgICAqIGFuZCBzdG9yaW5nIGl0IGluIEdhbWVNYW5hZ2VyLnNhdmVHYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZVNhdmVHYW1lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj4uXG4gICAgIyMjIFxuICAgIHByZXBhcmVTYXZlR2FtZTogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBHYW1lTWFuYWdlci5wcmVwYXJlU2F2ZUdhbWUocGFyYW1zPy5zbmFwc2hvdClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzYXZlcyB0aGUgY3VycmVudCBnYW1lIGF0IHRoZSBzcGVjaWZpZWQgc2F2ZSBzbG90LlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2F2ZUdhbWVcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBzbG90LWluZGV4IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZC5cbiAgICAqIDx1bD5cbiAgICAqIDxsaT5wYXJhbXMuc2xvdCAtIFRoZSBzbG90LWluZGV4IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZC4gQ2FuIGJlIGEgYmluZGluZy1leHByZXNzaW9uLjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyBcbiAgICBzYXZlR2FtZTogKHNlbmRlciwgcGFyYW1zKSAtPiBHYW1lTWFuYWdlci5zYXZlKHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNsb3QpKVxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggbG9hZHMgdGhlIGdhbWUgZnJvbSB0aGUgc3BlY2lmaWVkIHNhdmUgc2xvdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGxvYWRHYW1lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDb250YWlucyB0aGUgc2xvdC1pbmRleCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLnNsb3QgLSBUaGUgc2xvdC1pbmRleCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uIENhbiBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgXG4gICAgbG9hZEdhbWU6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgR2FtZU1hbmFnZXIudGVtcFNldHRpbmdzLnNraXAgPSBub1xuICAgICAgICBHYW1lTWFuYWdlci5sb2FkKHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNsb3QpKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHN0YXJ0cyBhIG5ldyBnYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgbmV3R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjIFxuICAgIG5ld0dhbWU6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnN0b3BBbGxNdXNpYygzMClcbiAgICAgICAgR2FtZU1hbmFnZXIubmV3R2FtZSgpXG4gICAgICAgIFxuICAgICAgICBzY2VuZSA9IG5ldyB2bi5PYmplY3RfU2NlbmUoKVxuICAgICAgICBTY2VuZU1hbmFnZXIuY2xlYXIoKVxuICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBleGlzdHMgdGhlIGN1cnJlbnQgZ2FtZS4gSXQgZG9lc24ndCBjaGFuZ2UgdGhlIHNjZW5lIGFuZFxuICAgICogc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc3dpdGNoaW5nIGJhY2sgdG8gdGhlIHRpdGxlIHNjcmVlbiBvciBtYWluIG1lbnUuXG4gICAgKlxuICAgICogQG1ldGhvZCBleGl0R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjIFxuICAgIGV4aXRHYW1lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIEdhbWVNYW5hZ2VyLmV4aXRHYW1lKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzd2l0Y2hlcyB0byBhbm90aGVyIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc3dpdGNoU2NlbmVcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzY2VuZSB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLm5hbWUgLSBUaGUgY2xhc3MtbmFtZSBvZiB0aGUgc2NlbmUgdG8gc3dpdGNoIHRvLiBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHZuLW5hbWVzcGFjZS48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgIFxuICAgIHN3aXRjaFNjZW5lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIGYgPSA9PlxuICAgICAgICAgICAgaWYgcGFyYW1zLmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHNjZW5lID0gbmV3IHZuW3BhcmFtcy5uYW1lXSgpXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUsIHBhcmFtcy5zYXZlUHJldmlvdXMpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgIXBhcmFtcy5zYXZlUHJldmlvdXNcbiAgICAgICAgICAgIEBsYXlvdXQudWkuZGlzYXBwZWFyIChlKSA9PiBmKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZigpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggc3dpdGNoZXMgdG8gYW5vdGhlciBnYW1lIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc3dpdGNoR2FtZVNjZW5lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDb250YWlucyB0aGUgVUlEIG9mIHRoZSBzY2VuZSB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLnVpZCAtIFRoZSBVSUQgb2YgdGhlIHNjZW5lIHRvIHN3aXRjaCB0by48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgXG4gICAgc3dpdGNoR2FtZVNjZW5lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIGYgPSA9PlxuICAgICAgICAgICAgaWYgcGFyYW1zLmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWRcbiAgICAgICAgICAgIGlmIHBhcmFtcy5uYW1lXG4gICAgICAgICAgICAgICAgc2NlbmVEb2N1bWVudHMgPSBEYXRhTWFuYWdlci5nZXREb2N1bWVudHNCeVR5cGUoXCJ2bi5zY2VuZVwiKVxuICAgICAgICAgICAgICAgIHNjZW5lRG9jdW1lbnQgPSBzY2VuZURvY3VtZW50cy5maXJzdCAoZCkgLT4gZC5pdGVtcy5uYW1lID09IHBhcmFtcy5uYW1lXG4gICAgICAgICAgICAgICAgaWYgc2NlbmVEb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICB1aWQgPSBzY2VuZURvY3VtZW50LnVpZFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBzY2VuZURhdGEgPSB1aWQ6IHVpZCwgcGljdHVyZXM6IFtdLCB0ZXh0czogW11cbiAgICAgICAgICAgIEdhbWVNYW5hZ2VyLnNjZW5lRGF0YSA9IHNjZW5lRGF0YVxuICAgICAgICAgICAgbmV3U2NlbmUgPSBuZXcgdm4uT2JqZWN0X1NjZW5lKClcbiAgICAgICAgICAgIG5ld1NjZW5lLnNjZW5lRGF0YSA9IHNjZW5lRGF0YVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8obmV3U2NlbmUsIHBhcmFtcy5zYXZlUHJldmlvdXMpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgIXBhcmFtcy5zYXZlUHJldmlvdXNcbiAgICAgICAgICAgIChAbGF5b3V0fHxAb2JqZWN0LmxheW91dCkudWkuZGlzYXBwZWFyIChlKSA9PiBmKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZigpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzd2l0Y2hlcyB0byBhbm90aGVyIGxheW91dC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHN3aXRjaExheW91dFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHRvIHN3aXRjaCB0by48L2xpPlxuICAgICogPGxpPnBhcmFtcy5zYXZlUHJldmlvdXMgLSBJbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgbGF5b3V0IHNob3VsZCBub3QgYmUgZXJhc2VkIGJ1dCBwYXVzZWQgYW5kIGhpZGRlbiBpbnN0ZWFkIHNvXG4gICAgKiB0aGF0IGl0IGNhbiBiZSByZXN0b3JlZCB1c2luZyA8aT5yZXR1cm5Ub1ByZXZpb3VzPC9pPiBhY3Rpb24uPC9saT5cbiAgICAqIDxsaT5wYXJhbXMuZGF0YUZpZWxkcyAtIERlZmluZXMgdGhlIGRhdGEgb2YgXCIkZGF0YUZpZWxkc1wiIGJpbmRpbmctZXhwcmVzc2lvbiB2YXJpYWJsZS4gQ2FuIGJlIGEgYmluZGluZy1leHByZXNzaW9uXG4gICAgKiBvciBhIGRpcmVjdCBvYmplY3QuIE9wdGlvbmFsLjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyAgICBcbiAgICBzd2l0Y2hMYXlvdXQ6IChzZW5kZXIsIGxheW91dCkgLT5cbiAgICAgICAgZiA9ID0+XG4gICAgICAgICAgICBHcmFwaGljcy5mcmVlemUoKVxuICAgICAgICAgICAgaWYgbGF5b3V0LmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHNjZW5lID0gbmV3IGdzLk9iamVjdF9MYXlvdXQobGF5b3V0Lm5hbWUpXG4gICAgICAgICAgXG4gICAgICAgICAgICBkYXRhRmllbGRzID0gc2VuZGVyLmRhdGFGaWVsZHNcbiAgICAgICAgICAgIGlmIHR5cGVvZiBsYXlvdXQuZGF0YUZpZWxkcyA9PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkcyA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgbGF5b3V0LmRhdGFGaWVsZHMpXG4gICAgICAgICAgICBlbHNlIGlmIGxheW91dC5kYXRhRmllbGRzP1xuICAgICAgICAgICAgICAgIGRhdGFGaWVsZHMgPSBsYXlvdXQuZGF0YUZpZWxkc1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgc2NlbmUuZGF0YUZpZWxkcyA9IGRhdGFGaWVsZHNcbiAgICAgICAgICAgIHNjZW5lLmNvbnRyb2xsZXJzID0gbGF5b3V0LmNvbnRyb2xsZXJzXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIGxheW91dC5zZW5kZXJEYXRhP1xuICAgICAgICAgICAgICAgIGZvciBzZW5kZXJGaWVsZCBpbiBsYXlvdXQuc2VuZGVyRGF0YVxuICAgICAgICAgICAgICAgICAgICBzY2VuZVtzZW5kZXJGaWVsZF0gPSBzZW5kZXJbc2VuZGVyRmllbGRdXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUsIGxheW91dC5zYXZlUHJldmlvdXMsIGxheW91dC5zdGFjaylcbiAgICAgICAgXG4gICAgICAgIGlmICFsYXlvdXQuc2F2ZVByZXZpb3VzXG4gICAgICAgICAgICAoQGxheW91dHx8QG9iamVjdC5sYXlvdXQpLnVpLmRpc2FwcGVhciAoZSkgPT4gZigpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGYoKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHJldHVybnMgdG8gcHJldmlvdXMgbGF5b3V0LiAoSWYgc2F2ZVByZXZpb3VzIHdhcyBzZXQgdG8gPGI+dHJ1ZTwvYj4gb24gc3dpdGNoTGF5b3V0LikuXG4gICAgKlxuICAgICogQG1ldGhvZCBwcmV2aW91c0xheW91dFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyAgICAgXG4gICAgcHJldmlvdXNMYXlvdXQ6IChzZW5kZXIpIC0+XG4gICAgICAgIFNjZW5lTWFuYWdlci5yZXR1cm5Ub1ByZXZpb3VzKClcbiAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggZGlzcG9zZXMgdGhlIHNwZWNpZmllZCBjb250cm9sLlxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZUNvbnRyb2xcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtIFRoZSBJRCBvZiB0aGUgY29udHJvbCB0byBkaXNwb3NlLiBDYW4gYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjICAgIFxuICAgIGRpc3Bvc2VDb250cm9sOiAoc2VuZGVyLCBpZCkgLT5cbiAgICAgICAgY29udHJvbCA9IEBvYmplY3RNYW5hZ2VyLm9iamVjdEJ5SWQodWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBpZCkpXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgY29udHJvbD8udWkuZGlzYXBwZWFyIChzZW5kZXIpIC0+IHNlbmRlci5kaXNwb3NlKClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29udHJvbCBmcm9tIHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRvci5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNyZWF0ZUNvbnRyb2xcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBkZXNjcmlwdG9yIGFuZCBvdGhlciBkYXRhIG5lZWRlZCB0byBjb25zdHJ1Y3QgdGhlIGNvbnRyb2wuXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLmRlc2NyaXB0b3IgLSBUaGUgY29udHJvbCcgZGVzY3JpcHRvci4gQ2FuIGJlIGEgZGlyZWN0IGRlc2NyaXB0b3IgZGVmaW5pdGlvbiBvciBhIHRlbXBsYXRlIG5hbWU8L2xpPlxuICAgICogPGxpPnBhcmFtcy5wYXJlbnQgLSBBIGJpbmRpbmctZXhwcmVzc2lvbiB3aGljaCByZXR1cm5zIHRoZSBjb250cm9sJ3MgcGFyZW50LjwvbGk+XG4gICAgKiA8bGk+cGFyYW1zLnNlbmRlckRhdGEgLSBBbiBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIGRhdGEgbWVyZ2VkIGludG8gdGhlIGNvbnRyb2wgb2JqZWN0LjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyAgXG4gICAgY3JlYXRlQ29udHJvbDogKHNlbmRlciwgZGF0YSkgLT5cbiAgICAgICAgaWYgdHlwZW9mIGRhdGEuZGVzY3JpcHRvciA9PSBcInN0cmluZ1wiXG4gICAgICAgICAgICBkZXNjcmlwdG9yID0gdWkuVUlNYW5hZ2VyLmN1c3RvbVR5cGVzW2RhdGEuZGVzY3JpcHRvcl1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRhdGEuZGVzY3JpcHRvclxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIHBhcmVudCA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgZGF0YS5wYXJlbnQpXG4gICAgICAgIGNvbnRyb2wgPSB1aS5VaUZhY3RvcnkuX2NyZWF0ZUZyb21EZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHBhcmVudCA/IEBvYmplY3QpXG4gICAgICAgIFxuICAgICAgICBpZiBkYXRhLnNlbmRlckRhdGE/XG4gICAgICAgICAgICBmb3IgZmllbGROYW1lIGluIGRhdGEuc2VuZGVyRGF0YVxuICAgICAgICAgICAgICAgIGNvbnRyb2xbZmllbGROYW1lXSA9IHNlbmRlcltmaWVsZE5hbWVdXG4gICAgICAgIGNvbnRyb2wudWkucHJlcGFyZSgpXG4gICAgICAgIGNvbnRyb2wudWkuYXBwZWFyKClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBjb250cm9sXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggcXVpdHMgdGhlIGdhbWUuXG4gICAgKlxuICAgICogQG1ldGhvZCBxdWl0R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICBxdWl0R2FtZTogKHNlbmRlciwgZGF0YSkgLT5cbiAgICAgICAgU2NlbmVNYW5hZ2VyLnN3aXRjaFRvKG51bGwpXG4gICAgICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIFxuZ3MuQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3IgPSBDb21wb25lbnRfTGF5b3V0U2NlbmVCZWhhdmlvciJdfQ==\n//# sourceURL=Component_LayoutSceneBehavior_22.js"
12 + "compiledContent": "var Component_LayoutSceneBehavior,\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_LayoutSceneBehavior = (function(superClass) {\n extend(Component_LayoutSceneBehavior, superClass);\n\n\n /**\n * The base class of all scene-behavior components. A scene-behavior component\n * define the logic of a single game scene. \n *\n * @module gs\n * @class Component_LayoutSceneBehavior\n * @extends gs.Component_SceneBehavior\n * @memberof gs\n */\n\n function Component_LayoutSceneBehavior() {\n Component_LayoutSceneBehavior.__super__.constructor.call(this);\n this.objectManager = SceneManager;\n this.layout = null;\n this.resourceContext = null;\n }\n\n\n /**\n * Initializes the scene. \n *\n * @method initialize\n */\n\n Component_LayoutSceneBehavior.prototype.initialize = function() {\n Component_LayoutSceneBehavior.__super__.initialize.apply(this, arguments);\n this.resourceContext = ResourceManager.createContext();\n ResourceManager.context = this.resourceContext;\n if (this.object.layoutData == null) {\n this.object.layoutData = {\n \"type\": \"ui.FreeLayout\",\n \"controls\": [],\n \"frame\": [0, 0, 1, 1]\n };\n }\n return LanguageManager.loadBundles();\n };\n\n\n /**\n * Disposes the scene. \n *\n * @method dispose\n */\n\n Component_LayoutSceneBehavior.prototype.dispose = function() {\n return Component_LayoutSceneBehavior.__super__.dispose.apply(this, arguments);\n };\n\n\n /**\n * Prepares all data for the scene and loads the necessary graphic and audio resources.\n *\n * @method prepareData\n * @abstract\n */\n\n Component_LayoutSceneBehavior.prototype.prepareData = function() {\n gs.ObjectManager.current = this.objectManager;\n if (!GameManager.initialized) {\n GameManager.initialize();\n }\n this.dataFields = ui.UiFactory.dataSources[this.object.layoutData.dataSource || \"default\"]();\n window.$dataFields = this.dataFields;\n this.music = ui.Component_FormulaHandler.fieldValue(this.object, this.object.layoutData.music);\n AudioManager.loadMusic(this.music);\n this.prepareTransition(RecordManager.system.menuTransition);\n ResourceLoader.loadUiTypesGraphics(ui.UiFactory.customTypes);\n ResourceLoader.loadUiLayoutGraphics(this.object.layoutData);\n if (this.dataFields != null) {\n ResourceLoader.loadUiDataFieldsGraphics(this.dataFields);\n }\n return ResourceManager.getBitmap(\"Graphics/Characters/JaneDate_Normal\");\n };\n\n\n /**\n * Prepares all visual game object for the scene.\n *\n * @method prepareVisual\n */\n\n Component_LayoutSceneBehavior.prototype.prepareVisual = function() {\n var scale, vocab;\n scale = Graphics.scale;\n vocab = RecordManager.vocabulary;\n if (this.layout == null) {\n this.dataObject = {};\n this.layout = ui.UiFactory.createFromDescriptor(this.object.layoutData, this.object);\n if (this.music != null) {\n AudioManager.changeMusic(this.music, 30);\n }\n }\n this.layout.ui.prepare();\n this.layout.ui.appear();\n this.layout.update();\n this.transition();\n if (SceneManager.previousScenes.length === 0) {\n if (GameManager.tempFields.isExitingGame) {\n GameManager.tempFields.isExitingGame = false;\n return gs.GameNotifier.postResetSceneChange(this.object.layoutName);\n } else {\n return gs.GameNotifier.postSceneChange(this.object.layoutName);\n }\n }\n };\n\n\n /**\n * Updates the scene's content.\n *\n * @method updateContent\n */\n\n Component_LayoutSceneBehavior.prototype.updateContent = function() {\n GameManager.update();\n return Graphics.viewport.update();\n };\n\n\n /**\n * Shows/Hides the current scene. A hidden scene is no longer shown and executed\n * but all objects and data is still there and be shown again anytime.\n *\n * @method show\n * @param {boolean} visible - Indicates if the scene should be shown or hidden.\n */\n\n Component_LayoutSceneBehavior.prototype.show = function(visible) {\n if (visible) {\n ResourceManager.context = this.resourceContext;\n }\n this.layout.visible = visible;\n this.layout.update();\n this.objectManager.active = visible;\n if (visible) {\n return gs.ObjectManager.current = SceneManager;\n }\n };\n\n\n /**\n * Action method which triggers a full refresh on the object returned by the specified binding-expression.\n * The params must be a direct binding-expression string.\n *\n * @method fullRefreshObject\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The binding expression.\n */\n\n Component_LayoutSceneBehavior.prototype.fullRefreshObject = function(sender, object) {\n object = ui.Component_FormulaHandler.fieldValue(sender, object);\n return object != null ? object.fullRefresh() : void 0;\n };\n\n\n /**\n * Action method which triggers a refresh on the object returned by the specified binding-expression.\n * The params must be a direct binding-expression string.\n *\n * @method refreshObject\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The binding expression.\n */\n\n Component_LayoutSceneBehavior.prototype.refreshObject = function(sender, object) {\n object = ui.Component_FormulaHandler.fieldValue(sender, object);\n return object != null ? object.needsUpdate = true : void 0;\n };\n\n Component_LayoutSceneBehavior.prototype.addStyle = function(sender, style) {\n var styleObject;\n styleObject = ui.UIManager.styles[style];\n if (styleObject != null) {\n styleObject.apply(sender);\n }\n sender.needsUpdate = true;\n if (styleObject != null ? styleObject.font : void 0) {\n return sender.behavior.refresh();\n }\n };\n\n Component_LayoutSceneBehavior.prototype.removeStyle = function(sender, style) {\n var i, len, ref, ref1, s, styleObject;\n styleObject = ui.UIManager.styles[style];\n if (styleObject != null) {\n styleObject.revert(sender);\n }\n sender.descriptor.styles.remove(style);\n ref = sender.descriptor.styles;\n for (i = 0, len = ref.length; i < len; i++) {\n s = ref[i];\n if ((ref1 = ui.UIManager.styles[s]) != null) {\n ref1.apply(sender);\n }\n }\n sender.needsUpdate = true;\n if (styleObject != null ? styleObject.font : void 0) {\n return sender.behavior.refresh();\n }\n };\n\n\n /**\n * Action method which executes the specified bindings.\n *\n * @method executeBindings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object[]} params - An array of binding-definitions.\n */\n\n Component_LayoutSceneBehavior.prototype.executeBindings = function(sender, bindings) {\n var binding, i, len;\n for (i = 0, len = bindings.length; i < len; i++) {\n binding = bindings[i];\n ui.Component_FormulaHandler.executeBinding(sender, binding);\n }\n return null;\n };\n\n\n /**\n * Action method which executes the specified formulas.\n *\n * @method executeFormulas\n * @param {gs.Object_Base} sender - The sender object.\n * @param {ui.Formula[]} params - An array of formula-definitions.\n */\n\n Component_LayoutSceneBehavior.prototype.executeFormulas = function(sender, formulas) {\n var formula, i, len, results;\n results = [];\n for (i = 0, len = formulas.length; i < len; i++) {\n formula = formulas[i];\n results.push(ui.Component_FormulaHandler.executeFormula(sender, formula));\n }\n return results;\n };\n\n\n /**\n * Action method which executes an animation on a specified target game object.\n *\n * @method executeAnimation\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains target-id and animations: { target, animations }\n */\n\n Component_LayoutSceneBehavior.prototype.executeAnimation = function(sender, params) {\n var animation, object;\n object = ui.Component_FormulaHandler.fieldValue(sender, params.target);\n animation = object != null ? object.animations.first(function(a) {\n return a.event === params.event;\n }) : void 0;\n if (animation && object) {\n return object.animationExecutor.execute(animation);\n }\n };\n\n\n /**\n * Action method which emits the specified event.\n *\n * @method emitEvent\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains event name, source and data.\n * <ul>\n * <li>params.name - The name of the event to emit</li>\n * <li>params.source - A binding-expression to define the game object which should emit the event.</li>\n * <li>params.data - An object containing additional event specific data.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.emitEvent = function(sender, params) {\n var object;\n object = ui.Component_FormulaHandler.fieldValue(sender, params.source);\n return object != null ? object.events.emit(params.name, object, ui.Component_FormulaHandler.fieldValue(sender, params.data)) : void 0;\n };\n\n\n /**\n * Action method which changes the game's aspect ratio.\n *\n * @method executeBindings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - If <b>true</b> the game screen will stretched so that it fills the entire screen\n * of the player without any black borders. Otherwise the game screen stretches but keeps its ratio\n * so black borders are possible if the game resolution's ratio and the target display's ratio are not match. It can also\n * be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.adjustAspectRatio = function(sender, adjust) {\n adjust = ui.Component_FormulaHandler.fieldValue(sender, adjust);\n GameManager.settings.adjustAspectRatio = adjust;\n Graphics.keepRatio = !adjust;\n return Graphics.onResize();\n };\n\n\n /**\n * Action method which enters fullscreen mode.\n *\n * @method enterFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.enterFullScreen = function(sender, params) {\n gs.Graphics.enterFullscreen();\n return GameManager.settings.fullScreen = Graphics.isFullscreen();\n };\n\n\n /**\n * Action method which leaves fullscreen mode.\n *\n * @method leaveFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.leaveFullScreen = function() {\n gs.Graphics.leaveFullscreen();\n return GameManager.settings.fullScreen = Graphics.isFullscreen();\n };\n\n\n /**\n * Action method which toggles between window and fullscreen mode.\n *\n * @method toggleFullScreen\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.toggleFullScreen = function(sender, params) {\n if (gs.Graphics.isFullscreen()) {\n gs.Graphics.leaveFullscreen();\n } else {\n gs.Graphics.enterFullscreen();\n }\n return GameManager.settings.fullScreen = gs.Graphics.isFullscreen();\n };\n\n\n /**\n * Action method which plays the specified sound.\n *\n * @method playSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - The sound to play.\n */\n\n Component_LayoutSceneBehavior.prototype.playSound = function(sender, params) {\n AudioManager.loadSound(params);\n return AudioManager.playSound(params);\n };\n\n\n /**\n * Action method which plays the specified voice.\n *\n * @method playVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - The voice to play.\n */\n\n Component_LayoutSceneBehavior.prototype.playVoice = function(sender, params) {\n AudioManager.loadSound(params);\n return AudioManager.playVoice(params);\n };\n\n\n /**\n * Action method which turns voice on or off.\n *\n * @method turnOnOffVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> voice will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnOffVoice = function(sender, state) {\n if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n return this.turnOnVoice();\n } else {\n return this.turnOffVoice();\n }\n };\n\n\n /**\n * Action method which turns music on or off.\n *\n * @method turnOnOffMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> music will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnOffMusic = function(sender, state) {\n if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n return this.turnOnMusic();\n } else {\n return this.turnOffMusic();\n }\n };\n\n\n /**\n * Action method which turns sound on or off.\n *\n * @method turnOnOffSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - If <b>true</b> sound will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnOffSound = function(sender, state) {\n if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n return this.turnOnSound();\n } else {\n return this.turnOffSound();\n }\n };\n\n\n /**\n * Action method which turns off voice.\n *\n * @method turnOffVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOffVoice = function() {\n return AudioManager.stopAllVoices();\n };\n\n\n /**\n * Action method which turns off music.\n *\n * @method turnOffMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOffMusic = function() {\n return AudioManager.stopMusic();\n };\n\n\n /**\n * Action method which turns off sound.\n *\n * @method turnOffSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOffSound = function() {\n return AudioManager.stopAllSounds();\n };\n\n\n /**\n * Action method which turns on voice.\n *\n * @method turnOnVoice\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnVoice = function() {};\n\n\n /**\n * Action method which turns on sound.\n *\n * @method turnOnSound\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnSound = function() {};\n\n\n /**\n * Action method which turns on music.\n *\n * @method turnOnMusic\n * @param {gs.Object_Base} sender - The sender object.\n * @param {boolean|string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.turnOnMusic = function() {\n return AudioManager.resumeMusic();\n };\n\n\n /**\n * Action method which selects the specified language.\n *\n * @method selectLanguage\n * @param {gs.Object_Base} sender - The sender object.\n * @param {number|string} params - Index of the language to set. Can be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.selectLanguage = function(sender, params) {\n var language;\n language = LanguageManager.languages[ui.Component_FormulaHandler.fieldValue(sender, params)];\n return LanguageManager.selectLanguage(language);\n };\n\n\n /**\n * Action method which resets global data storage.\n *\n * @method resetGlobalData\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.resetGlobalData = function(sender) {\n return GameManager.resetGlobalData();\n };\n\n\n /**\n * Action method which saves game settings.\n *\n * @method saveSettings\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.saveSettings = function(sender) {\n return GameManager.saveSettings();\n };\n\n\n /**\n * Action method which prepares the game for saving by taking a snapshot of the current game state\n * and storing it in GameManager.saveGame.\n *\n * @method prepareSaveGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.prepareSaveGame = function(sender, params) {\n return GameManager.prepareSaveGame(params != null ? params.snapshot : void 0);\n };\n\n\n /**\n * Action method which saves the current game at the specified save slot.\n *\n * @method saveGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the slot-index where the game should be saved.\n * <ul>\n * <li>params.slot - The slot-index where the game should be saved. Can be a binding-expression.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.saveGame = function(sender, params) {\n return GameManager.save(ui.Component_FormulaHandler.fieldValue(sender, params.slot));\n };\n\n\n /**\n * Action method which loads the game from the specified save slot.\n *\n * @method loadGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the slot-index where the game should be loaded from.\n * <ul>\n * <li>params.slot - The slot-index where the game should be loaded from. Can be a binding-expression.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.loadGame = function(sender, params) {\n GameManager.tempSettings.skip = false;\n return GameManager.load(ui.Component_FormulaHandler.fieldValue(sender, params.slot));\n };\n\n\n /**\n * Action method which starts a new game.\n *\n * @method newGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.newGame = function(sender, params) {\n var scene;\n AudioManager.stopAllMusic(30);\n GameManager.newGame();\n scene = new vn.Object_Scene();\n SceneManager.clear();\n return SceneManager.switchTo(scene);\n };\n\n\n /**\n * Action method which exists the current game. It doesn't change the scene and\n * should be called before switching back to the title screen or main menu.\n *\n * @method exitGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>\n */\n\n Component_LayoutSceneBehavior.prototype.exitGame = function(sender, params) {\n return GameManager.exitGame();\n };\n\n\n /**\n * Action method which switches to another scene.\n *\n * @method switchScene\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the class name of the scene to switch to.\n * <ul>\n * <li>params.name - The class-name of the scene to switch to. The class must be defined in vn-namespace.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.switchScene = function(sender, params) {\n var f;\n f = (function(_this) {\n return function() {\n var scene;\n if (params.clear) {\n SceneManager.clear();\n }\n scene = new vn[params.name]();\n return SceneManager.switchTo(scene, params.savePrevious);\n };\n })(this);\n if (!params.savePrevious) {\n return this.layout.ui.disappear((function(_this) {\n return function(e) {\n return f();\n };\n })(this));\n } else {\n return f();\n }\n };\n\n\n /**\n * Action method which switches to another game scene.\n *\n * @method switchGameScene\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the UID of the scene to switch to.\n * <ul>\n * <li>params.uid - The UID of the scene to switch to.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.switchGameScene = function(sender, params) {\n var f;\n f = (function(_this) {\n return function() {\n var newScene, sceneData, sceneDocument, sceneDocuments, uid;\n if (params.clear) {\n SceneManager.clear();\n }\n uid = params.uid;\n if (params.name) {\n sceneDocuments = DataManager.getDocumentsByType(\"vn.scene\");\n sceneDocument = sceneDocuments.first(function(d) {\n return d.items.name === params.name;\n });\n if (sceneDocument) {\n uid = sceneDocument.uid;\n }\n }\n sceneData = {\n uid: uid,\n pictures: [],\n texts: []\n };\n GameManager.sceneData = sceneData;\n newScene = new vn.Object_Scene();\n newScene.sceneData = sceneData;\n return SceneManager.switchTo(newScene, params.savePrevious);\n };\n })(this);\n if (!params.savePrevious) {\n return (this.layout || this.object.layout).ui.disappear((function(_this) {\n return function(e) {\n return f();\n };\n })(this));\n } else {\n return f();\n }\n };\n\n\n /**\n * Action method which switches to another layout.\n *\n * @method switchLayout\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Contains the name of the layout to switch to.\n * <ul>\n * <li>params.name - The name of the layout to switch to.</li>\n * <li>params.savePrevious - Indicates if the current layout should not be erased but paused and hidden instead so\n * that it can be restored using <i>returnToPrevious</i> action.</li>\n * <li>params.dataFields - Defines the data of \"$dataFields\" binding-expression variable. Can be a binding-expression\n * or a direct object. Optional.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.switchLayout = function(sender, layout) {\n var f;\n f = (function(_this) {\n return function() {\n var dataFields, i, len, ref, scene, senderField;\n Graphics.freeze();\n if (layout.clear) {\n SceneManager.clear();\n }\n scene = new gs.Object_Layout(layout.name);\n dataFields = sender.dataFields;\n if (typeof layout.dataFields === \"string\") {\n dataFields = ui.Component_FormulaHandler.fieldValue(sender, layout.dataFields);\n } else if (layout.dataFields != null) {\n dataFields = layout.dataFields;\n }\n scene.dataFields = dataFields;\n scene.controllers = layout.controllers;\n if (layout.senderData != null) {\n ref = layout.senderData;\n for (i = 0, len = ref.length; i < len; i++) {\n senderField = ref[i];\n scene[senderField] = sender[senderField];\n }\n }\n return SceneManager.switchTo(scene, layout.savePrevious, layout.stack);\n };\n })(this);\n if (!layout.savePrevious) {\n return (this.layout || this.object.layout).ui.disappear((function(_this) {\n return function(e) {\n return f();\n };\n })(this));\n } else {\n return f();\n }\n };\n\n\n /**\n * Action method which returns to previous layout. (If savePrevious was set to <b>true</b> on switchLayout.).\n *\n * @method previousLayout\n * @param {gs.Object_Base} sender - The sender object.\n * @param {Object} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.previousLayout = function(sender) {\n return SceneManager.returnToPrevious();\n };\n\n\n /**\n * Action method which disposes the specified control.\n *\n * @method disposeControl\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - The ID of the control to dispose. Can be a binding-expression.\n */\n\n Component_LayoutSceneBehavior.prototype.disposeControl = function(sender, id) {\n var control;\n control = this.objectManager.objectById(ui.Component_FormulaHandler.fieldValue(sender, id));\n return control != null ? control.ui.disappear(function(sender) {\n return sender.dispose();\n }) : void 0;\n };\n\n\n /**\n * Action method which creates a new control from the specified descriptor.\n *\n * @method createControl\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - Contains the descriptor and other data needed to construct the control.\n * <ul>\n * <li>params.descriptor - The control' descriptor. Can be a direct descriptor definition or a template name</li>\n * <li>params.parent - A binding-expression which returns the control's parent.</li>\n * <li>params.senderData - An object containing additional data merged into the control object.</li>\n * </ul>\n */\n\n Component_LayoutSceneBehavior.prototype.createControl = function(sender, data) {\n var control, descriptor, fieldName, i, len, parent, ref;\n if (typeof data.descriptor === \"string\") {\n descriptor = ui.UIManager.customTypes[data.descriptor];\n } else {\n descriptor = data.descriptor;\n }\n parent = ui.Component_FormulaHandler.fieldValue(sender, data.parent);\n control = ui.UiFactory._createFromDescriptor(descriptor, parent != null ? parent : this.object.layout || this.object);\n if (data.senderData != null) {\n ref = data.senderData;\n for (i = 0, len = ref.length; i < len; i++) {\n fieldName = ref[i];\n control[fieldName] = sender[fieldName];\n }\n }\n control.ui.prepare();\n control.ui.appear();\n return control;\n };\n\n\n /**\n * Action method which quits the game.\n *\n * @method quitGame\n * @param {gs.Object_Base} sender - The sender object.\n * @param {string} params - Can be <b>null</b>.\n */\n\n Component_LayoutSceneBehavior.prototype.quitGame = function(sender, data) {\n return SceneManager.switchTo(null);\n };\n\n return Component_LayoutSceneBehavior;\n\n})(gs.Component_SceneBehavior);\n\ngs.Component_LayoutSceneBehavior = Component_LayoutSceneBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsNkJBQUE7RUFBQTs7O0FBQU07Ozs7QUFFRjs7Ozs7Ozs7OztFQVNhLHVDQUFBO0lBQ1QsNkRBQUE7SUFFQSxJQUFDLENBQUEsYUFBRCxHQUFpQjtJQUNqQixJQUFDLENBQUEsTUFBRCxHQUFVO0lBQ1YsSUFBQyxDQUFBLGVBQUQsR0FBbUI7RUFMVjs7O0FBT2I7Ozs7OzswQ0FLQSxVQUFBLEdBQVksU0FBQTtJQUNSLCtEQUFBLFNBQUE7SUFFQSxJQUFDLENBQUEsZUFBRCxHQUFtQixlQUFlLENBQUMsYUFBaEIsQ0FBQTtJQUNuQixlQUFlLENBQUMsT0FBaEIsR0FBMEIsSUFBQyxDQUFBO0lBRTNCLElBQU8sOEJBQVA7TUFDSSxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVIsR0FBcUI7UUFBRSxNQUFBLEVBQVEsZUFBVjtRQUEyQixVQUFBLEVBQVksRUFBdkM7UUFBMkMsT0FBQSxFQUFTLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQUFwRDtRQUR6Qjs7V0FHQSxlQUFlLENBQUMsV0FBaEIsQ0FBQTtFQVRROzs7QUFXWjs7Ozs7OzBDQUtBLE9BQUEsR0FBUyxTQUFBO1dBQ0wsNERBQUEsU0FBQTtFQURLOzs7QUFHVDs7Ozs7OzswQ0FNQSxXQUFBLEdBQWEsU0FBQTtJQUNULEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBakIsR0FBMkIsSUFBQyxDQUFBO0lBRTVCLElBQUcsQ0FBSSxXQUFXLENBQUMsV0FBbkI7TUFDSSxXQUFXLENBQUMsVUFBWixDQUFBLEVBREo7O0lBR0EsSUFBQyxDQUFBLFVBQUQsR0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVksQ0FBQSxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFuQixJQUFpQyxTQUFqQyxDQUF6QixDQUFBO0lBQ2QsTUFBTSxDQUFDLFdBQVAsR0FBcUIsSUFBQyxDQUFBO0lBQ3RCLElBQUMsQ0FBQSxLQUFELEdBQVMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLFVBQTVCLENBQXVDLElBQUMsQ0FBQSxNQUF4QyxFQUFnRCxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFuRTtJQUNULFlBQVksQ0FBQyxTQUFiLENBQXVCLElBQUMsQ0FBQSxLQUF4QjtJQUNBLElBQUMsQ0FBQSxpQkFBRCxDQUFtQixhQUFhLENBQUMsTUFBTSxDQUFDLGNBQXhDO0lBRUEsY0FBYyxDQUFDLG1CQUFmLENBQW1DLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBaEQ7SUFDQSxjQUFjLENBQUMsb0JBQWYsQ0FBb0MsSUFBQyxDQUFBLE1BQU0sQ0FBQyxVQUE1QztJQUVBLElBQUcsdUJBQUg7TUFDSSxjQUFjLENBQUMsd0JBQWYsQ0FBd0MsSUFBQyxDQUFBLFVBQXpDLEVBREo7O1dBRUEsZUFBZSxDQUFDLFNBQWhCLENBQTBCLHFDQUExQjtFQWpCUzs7O0FBbUJiOzs7Ozs7MENBS0EsYUFBQSxHQUFlLFNBQUE7QUFDWCxRQUFBO0lBQUEsS0FBQSxHQUFRLFFBQVEsQ0FBQztJQUNqQixLQUFBLEdBQVEsYUFBYSxDQUFDO0lBRXRCLElBQU8sbUJBQVA7TUFDSSxJQUFDLENBQUEsVUFBRCxHQUFjO01BQ2QsSUFBQyxDQUFBLE1BQUQsR0FBVSxFQUFFLENBQUMsU0FBUyxDQUFDLG9CQUFiLENBQWtDLElBQUMsQ0FBQSxNQUFNLENBQUMsVUFBMUMsRUFBc0QsSUFBQyxDQUFBLE1BQXZEO01BRVYsSUFBRyxrQkFBSDtRQUNJLFlBQVksQ0FBQyxXQUFiLENBQXlCLElBQUMsQ0FBQSxLQUExQixFQUFpQyxFQUFqQyxFQURKO09BSko7O0lBUUEsSUFBQyxDQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBWCxDQUFBO0lBQ0EsSUFBQyxDQUFBLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBWCxDQUFBO0lBQ0EsSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFSLENBQUE7SUFFQSxJQUFDLENBQUEsVUFBRCxDQUFBO0lBRUEsSUFBRyxZQUFZLENBQUMsY0FBYyxDQUFDLE1BQTVCLEtBQXNDLENBQXpDO01BQ0ksSUFBRyxXQUFXLENBQUMsVUFBVSxDQUFDLGFBQTFCO1FBQ0ksV0FBVyxDQUFDLFVBQVUsQ0FBQyxhQUF2QixHQUF1QztlQUN2QyxFQUFFLENBQUMsWUFBWSxDQUFDLG9CQUFoQixDQUFxQyxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQTdDLEVBRko7T0FBQSxNQUFBO2VBSUksRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFoQixDQUFnQyxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQXhDLEVBSko7T0FESjs7RUFsQlc7OztBQXlCZjs7Ozs7OzBDQUtBLGFBQUEsR0FBZSxTQUFBO0lBQ1gsV0FBVyxDQUFDLE1BQVosQ0FBQTtXQUNBLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBbEIsQ0FBQTtFQUZXOzs7QUFJZjs7Ozs7Ozs7MENBT0EsSUFBQSxHQUFNLFNBQUMsT0FBRDtJQUNGLElBQUcsT0FBSDtNQUNJLGVBQWUsQ0FBQyxPQUFoQixHQUEwQixJQUFDLENBQUEsZ0JBRC9COztJQUVBLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBUixHQUFrQjtJQUNsQixJQUFDLENBQUEsTUFBTSxDQUFDLE1BQVIsQ0FBQTtJQUNBLElBQUMsQ0FBQSxhQUFhLENBQUMsTUFBZixHQUF3QjtJQUN4QixJQUFHLE9BQUg7YUFDSSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQWpCLEdBQTJCLGFBRC9COztFQU5FOzs7QUFVTjs7Ozs7Ozs7OzBDQVFBLGlCQUFBLEdBQW1CLFNBQUMsTUFBRCxFQUFTLE1BQVQ7SUFDZixNQUFBLEdBQVMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLFVBQTVCLENBQXVDLE1BQXZDLEVBQStDLE1BQS9DOzRCQUNULE1BQU0sQ0FBRSxXQUFSLENBQUE7RUFGZTs7O0FBSW5COzs7Ozs7Ozs7MENBUUEsYUFBQSxHQUFlLFNBQUMsTUFBRCxFQUFTLE1BQVQ7SUFDWCxNQUFBLEdBQVMsRUFBRSxDQUFDLHdCQUF3QixDQUFDLFVBQTVCLENBQXVDLE1BQXZDLEVBQStDLE1BQS9DOzRCQUNULE1BQU0sQ0FBRSxXQUFSLEdBQXNCO0VBRlg7OzBDQUlmLFFBQUEsR0FBVSxTQUFDLE1BQUQsRUFBUyxLQUFUO0FBQ04sUUFBQTtJQUFBLFdBQUEsR0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU8sQ0FBQSxLQUFBOztNQUNsQyxXQUFXLENBQUUsS0FBYixDQUFtQixNQUFuQjs7SUFDQSxNQUFNLENBQUMsV0FBUCxHQUFxQjtJQUNyQiwwQkFBRyxXQUFXLENBQUUsYUFBaEI7YUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQWhCLENBQUEsRUFESjs7RUFKTTs7MENBT1YsV0FBQSxHQUFhLFNBQUMsTUFBRCxFQUFTLEtBQVQ7QUFDVCxRQUFBO0lBQUEsV0FBQSxHQUFjLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTyxDQUFBLEtBQUE7O01BQ2xDLFdBQVcsQ0FBRSxNQUFiLENBQW9CLE1BQXBCOztJQUNBLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQXpCLENBQWdDLEtBQWhDO0FBRUE7QUFBQSxTQUFBLHFDQUFBOzs7WUFDMEIsQ0FBRSxLQUF4QixDQUE4QixNQUE5Qjs7QUFESjtJQUVBLE1BQU0sQ0FBQyxXQUFQLEdBQXFCO0lBQ3JCLDBCQUFHLFdBQVcsQ0FBRSxhQUFoQjthQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBaEIsQ0FBQSxFQURKOztFQVJTOzs7QUFhYjs7Ozs7Ozs7MENBT0EsZUFBQSxHQUFpQixTQUFDLE1BQUQsRUFBUyxRQUFUO0FBQ2IsUUFBQTtBQUFBLFNBQUEsMENBQUE7O01BQ0ksRUFBRSxDQUFDLHdCQUF3QixDQUFDLGNBQTVCLENBQTJDLE1BQTNDLEVBQW1ELE9BQW5EO0FBREo7QUFHQSxXQUFPO0VBSk07OztBQU1qQjs7Ozs7Ozs7MENBT0EsZUFBQSxHQUFpQixTQUFDLE1BQUQsRUFBUyxRQUFUO0FBQ2IsUUFBQTtBQUFBO1NBQUEsMENBQUE7O21CQUNJLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxjQUE1QixDQUEyQyxNQUEzQyxFQUFtRCxPQUFuRDtBQURKOztFQURhOzs7QUFJakI7Ozs7Ozs7OzBDQU9BLGdCQUFBLEdBQWtCLFNBQUMsTUFBRCxFQUFTLE1BQVQ7QUFDZCxRQUFBO0lBQUEsTUFBQSxHQUFTLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxVQUE1QixDQUF1QyxNQUF2QyxFQUErQyxNQUFNLENBQUMsTUFBdEQ7SUFDVCxTQUFBLG9CQUFZLE1BQU0sQ0FBRSxVQUFVLENBQUMsS0FBbkIsQ0FBeUIsU0FBQyxDQUFEO2FBQU8sQ0FBQyxDQUFDLEtBQUYsS0FBVyxNQUFNLENBQUM7SUFBekIsQ0FBekI7SUFFWixJQUFHLFNBQUEsSUFBYyxNQUFqQjthQUNJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUF6QixDQUFpQyxTQUFqQyxFQURKOztFQUpjOzs7QUFPbEI7Ozs7Ozs7Ozs7Ozs7MENBWUEsU0FBQSxHQUFXLFNBQUMsTUFBRCxFQUFTLE1BQVQ7QUFDUCxRQUFBO0lBQUEsTUFBQSxHQUFTLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxVQUE1QixDQUF1QyxNQUF2QyxFQUErQyxNQUFNLENBQUMsTUFBdEQ7NEJBQ1QsTUFBTSxDQUFFLE1BQU0sQ0FBQyxJQUFmLENBQW9CLE1BQU0sQ0FBQyxJQUEzQixFQUFpQyxNQUFqQyxFQUF5QyxFQUFFLENBQUMsd0JBQXdCLENBQUMsVUFBNUIsQ0FBdUMsTUFBdkMsRUFBK0MsTUFBTSxDQUFDLElBQXRELENBQXpDO0VBRk87OztBQUlYOzs7Ozs7Ozs7OzswQ0FVQSxpQkFBQSxHQUFtQixTQUFDLE1BQUQsRUFBUyxNQUFUO0lBQ2YsTUFBQSxHQUFTLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxVQUE1QixDQUF1QyxNQUF2QyxFQUErQyxNQUEvQztJQUVULFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQXJCLEdBQXlDO0lBQ3pDLFFBQVEsQ0FBQyxTQUFULEdBQXFCLENBQUM7V0FDdEIsUUFBUSxDQUFDLFFBQVQsQ0FBQTtFQUxlOzs7QUFPbkI7Ozs7Ozs7OzBDQU9BLGVBQUEsR0FBaUIsU0FBQyxNQUFELEVBQVMsTUFBVDtJQUNiLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBWixDQUFBO1dBQ0EsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFyQixHQUFrQyxRQUFRLENBQUMsWUFBVCxDQUFBO0VBRnJCOzs7QUFLakI7Ozs7Ozs7OzBDQU9BLGVBQUEsR0FBaUIsU0FBQTtJQUNiLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBWixDQUFBO1dBQ0EsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFyQixHQUFrQyxRQUFRLENBQUMsWUFBVCxDQUFBO0VBRnJCOzs7QUFJakI7Ozs7Ozs7OzBDQU9BLGdCQUFBLEdBQWtCLFNBQUMsTUFBRCxFQUFTLE1BQVQ7SUFDZCxJQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWixDQUFBLENBQUg7TUFDSSxFQUFFLENBQUMsUUFBUSxDQUFDLGVBQVosQ0FBQSxFQURKO0tBQUEsTUFBQTtNQUdJLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBWixDQUFBLEVBSEo7O1dBS0EsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFyQixHQUFrQyxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVosQ0FBQTtFQU5wQjs7O0FBUWxCOzs7Ozs7OzswQ0FPQSxTQUFBLEdBQVcsU0FBQyxNQUFELEVBQVMsTUFBVDtJQUNQLFlBQVksQ0FBQyxTQUFiLENBQXVCLE1BQXZCO1dBQ0EsWUFBWSxDQUFDLFNBQWIsQ0FBdUIsTUFBdkI7RUFGTzs7O0FBSVg7Ozs7Ozs7OzBDQU9BLFNBQUEsR0FBVyxTQUFDLE1BQUQsRUFBUyxNQUFUO0lBQ1AsWUFBWSxDQUFDLFNBQWIsQ0FBdUIsTUFBdkI7V0FDQSxZQUFZLENBQUMsU0FBYixDQUF1QixNQUF2QjtFQUZPOzs7QUFLWDs7Ozs7Ozs7MENBT0EsY0FBQSxHQUFnQixTQUFDLE1BQUQsRUFBUyxLQUFUO0lBQ1osSUFBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsVUFBNUIsQ0FBdUMsTUFBdkMsRUFBK0MsS0FBL0MsQ0FBSDthQUE4RCxJQUFDLENBQUEsV0FBRCxDQUFBLEVBQTlEO0tBQUEsTUFBQTthQUFrRixJQUFDLENBQUEsWUFBRCxDQUFBLEVBQWxGOztFQURZOzs7QUFHaEI7Ozs7Ozs7OzBDQU9BLGNBQUEsR0FBZ0IsU0FBQyxNQUFELEVBQVMsS0FBVDtJQUNaLElBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDLFVBQTVCLENBQXVDLE1BQXZDLEVBQStDLEtBQS9DLENBQUg7YUFBOEQsSUFBQyxDQUFBLFdBQUQsQ0FBQSxFQUE5RDtLQUFBLE1BQUE7YUFBa0YsSUFBQyxDQUFBLFlBQUQsQ0FBQSxFQUFsRjs7RUFEWTs7O0FBR2hCOzs7Ozs7OzswQ0FPQSxjQUFBLEdBQWdCLFNBQUMsTUFBRCxFQUFTLEtBQVQ7SUFDWixJQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxVQUE1QixDQUF1QyxNQUF2QyxFQUErQyxLQUEvQyxDQUFIO2FBQThELElBQUMsQ0FBQSxXQUFELENBQUEsRUFBOUQ7S0FBQSxNQUFBO2FBQWtGLElBQUMsQ0FBQSxZQUFELENBQUEsRUFBbEY7O0VBRFk7OztBQUdoQjs7Ozs7Ozs7MENBT0EsWUFBQSxHQUFjLFNBQUE7V0FDVixZQUFZLENBQUMsYUFBYixDQUFBO0VBRFU7OztBQUdkOzs7Ozs7OzswQ0FPQSxZQUFBLEdBQWMsU0FBQTtXQUNWLFlBQVksQ0FBQyxTQUFiLENBQUE7RUFEVTs7O0FBR2Q7Ozs7Ozs7OzBDQU9BLFlBQUEsR0FBYyxTQUFBO1dBQ1YsWUFBWSxDQUFDLGFBQWIsQ0FBQTtFQURVOzs7QUFHZDs7Ozs7Ozs7MENBT0EsV0FBQSxHQUFhLFNBQUEsR0FBQTs7O0FBRWI7Ozs7Ozs7OzBDQU9BLFdBQUEsR0FBYSxTQUFBLEdBQUE7OztBQUViOzs7Ozs7OzswQ0FPQSxXQUFBLEdBQWEsU0FBQTtXQUNULFlBQVksQ0FBQyxXQUFiLENBQUE7RUFEUzs7O0FBR2I7Ozs7Ozs7OzBDQU9BLGNBQUEsR0FBZ0IsU0FBQyxNQUFELEVBQVMsTUFBVDtBQUNaLFFBQUE7SUFBQSxRQUFBLEdBQVcsZUFBZSxDQUFDLFNBQVUsQ0FBQSxFQUFFLENBQUMsd0JBQXdCLENBQUMsVUFBNUIsQ0FBdUMsTUFBdkMsRUFBK0MsTUFBL0MsQ0FBQTtXQUNyQyxlQUFlLENBQUMsY0FBaEIsQ0FBK0IsUUFBL0I7RUFGWTs7O0FBSWhCOzs7Ozs7OzswQ0FPQSxlQUFBLEdBQWlCLFNBQUMsTUFBRDtXQUNiLFdBQVcsQ0FBQyxlQUFaLENBQUE7RUFEYTs7O0FBR2pCOzs7Ozs7OzswQ0FPQSxZQUFBLEdBQWMsU0FBQyxNQUFEO1dBQVksV0FBVyxDQUFDLFlBQVosQ0FBQTtFQUFaOzs7QUFFZDs7Ozs7Ozs7OzBDQVFBLGVBQUEsR0FBaUIsU0FBQyxNQUFELEVBQVMsTUFBVDtXQUNiLFdBQVcsQ0FBQyxlQUFaLGtCQUE0QixNQUFNLENBQUUsaUJBQXBDO0VBRGE7OztBQUdqQjs7Ozs7Ozs7Ozs7MENBVUEsUUFBQSxHQUFVLFNBQUMsTUFBRCxFQUFTLE1BQVQ7V0FBb0IsV0FBVyxDQUFDLElBQVosQ0FBaUIsRUFBRSxDQUFDLHdCQUF3QixDQUFDLFVBQTVCLENBQXVDLE1BQXZDLEVBQStDLE1BQU0sQ0FBQyxJQUF0RCxDQUFqQjtFQUFwQjs7O0FBRVY7Ozs7Ozs7Ozs7OzBDQVVBLFFBQUEsR0FBVSxTQUFDLE1BQUQsRUFBUyxNQUFUO0lBQ04sV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUF6QixHQUFnQztXQUNoQyxXQUFXLENBQUMsSUFBWixDQUFpQixFQUFFLENBQUMsd0JBQXdCLENBQUMsVUFBNUIsQ0FBdUMsTUFBdkMsRUFBK0MsTUFBTSxDQUFDLElBQXRELENBQWpCO0VBRk07OztBQUlWOzs7Ozs7OzswQ0FPQSxPQUFBLEdBQVMsU0FBQyxNQUFELEVBQVMsTUFBVDtBQUNMLFFBQUE7SUFBQSxZQUFZLENBQUMsWUFBYixDQUEwQixFQUExQjtJQUNBLFdBQVcsQ0FBQyxPQUFaLENBQUE7SUFFQSxLQUFBLEdBQVksSUFBQSxFQUFFLENBQUMsWUFBSCxDQUFBO0lBQ1osWUFBWSxDQUFDLEtBQWIsQ0FBQTtXQUNBLFlBQVksQ0FBQyxRQUFiLENBQXNCLEtBQXRCO0VBTks7OztBQVFUOzs7Ozs7Ozs7MENBUUEsUUFBQSxHQUFVLFNBQUMsTUFBRCxFQUFTLE1BQVQ7V0FDTixXQUFXLENBQUMsUUFBWixDQUFBO0VBRE07OztBQUdWOzs7Ozs7Ozs7OzswQ0FVQSxXQUFBLEdBQWEsU0FBQyxNQUFELEVBQVMsTUFBVDtBQUNULFFBQUE7SUFBQSxDQUFBLEdBQUksQ0FBQSxTQUFBLEtBQUE7YUFBQSxTQUFBO0FBQ0EsWUFBQTtRQUFBLElBQUcsTUFBTSxDQUFDLEtBQVY7VUFDSSxZQUFZLENBQUMsS0FBYixDQUFBLEVBREo7O1FBR0EsS0FBQSxHQUFZLElBQUEsRUFBRyxDQUFBLE1BQU0sQ0FBQyxJQUFQLENBQUgsQ0FBQTtlQUNaLFlBQVksQ0FBQyxRQUFiLENBQXNCLEtBQXRCLEVBQTZCLE1BQU0sQ0FBQyxZQUFwQztNQUxBO0lBQUEsQ0FBQSxDQUFBLENBQUEsSUFBQTtJQU9KLElBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWDthQUNJLElBQUMsQ0FBQSxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVgsQ0FBcUIsQ0FBQSxTQUFBLEtBQUE7ZUFBQSxTQUFDLENBQUQ7aUJBQU8sQ0FBQSxDQUFBO1FBQVA7TUFBQSxDQUFBLENBQUEsQ0FBQSxJQUFBLENBQXJCLEVBREo7S0FBQSxNQUFBO2FBR0ksQ0FBQSxDQUFBLEVBSEo7O0VBUlM7OztBQWFiOzs7Ozs7Ozs7OzswQ0FVQSxlQUFBLEdBQWlCLFNBQUMsTUFBRCxFQUFTLE1BQVQ7QUFDYixRQUFBO0lBQUEsQ0FBQSxHQUFJLENBQUEsU0FBQSxLQUFBO2FBQUEsU0FBQTtBQUNBLFlBQUE7UUFBQSxJQUFHLE1BQU0sQ0FBQyxLQUFWO1VBQ0ksWUFBWSxDQUFDLEtBQWIsQ0FBQSxFQURKOztRQUdBLEdBQUEsR0FBTSxNQUFNLENBQUM7UUFDYixJQUFHLE1BQU0sQ0FBQyxJQUFWO1VBQ0ksY0FBQSxHQUFpQixXQUFXLENBQUMsa0JBQVosQ0FBK0IsVUFBL0I7VUFDakIsYUFBQSxHQUFnQixjQUFjLENBQUMsS0FBZixDQUFxQixTQUFDLENBQUQ7bUJBQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFSLEtBQWdCLE1BQU0sQ0FBQztVQUE5QixDQUFyQjtVQUNoQixJQUFHLGFBQUg7WUFDSSxHQUFBLEdBQU0sYUFBYSxDQUFDLElBRHhCO1dBSEo7O1FBTUEsU0FBQSxHQUFZO1VBQUEsR0FBQSxFQUFLLEdBQUw7VUFBVSxRQUFBLEVBQVUsRUFBcEI7VUFBd0IsS0FBQSxFQUFPLEVBQS9COztRQUNaLFdBQVcsQ0FBQyxTQUFaLEdBQXdCO1FBQ3hCLFFBQUEsR0FBZSxJQUFBLEVBQUUsQ0FBQyxZQUFILENBQUE7UUFDZixRQUFRLENBQUMsU0FBVCxHQUFxQjtlQUVyQixZQUFZLENBQUMsUUFBYixDQUFzQixRQUF0QixFQUFnQyxNQUFNLENBQUMsWUFBdkM7TUFoQkE7SUFBQSxDQUFBLENBQUEsQ0FBQSxJQUFBO0lBa0JKLElBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWDthQUNJLENBQUMsSUFBQyxDQUFBLE1BQUQsSUFBUyxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQWxCLENBQXlCLENBQUMsRUFBRSxDQUFDLFNBQTdCLENBQXVDLENBQUEsU0FBQSxLQUFBO2VBQUEsU0FBQyxDQUFEO2lCQUFPLENBQUEsQ0FBQTtRQUFQO01BQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxDQUF2QyxFQURKO0tBQUEsTUFBQTthQUdJLENBQUEsQ0FBQSxFQUhKOztFQW5CYTs7O0FBd0JqQjs7Ozs7Ozs7Ozs7Ozs7OzBDQWNBLFlBQUEsR0FBYyxTQUFDLE1BQUQsRUFBUyxNQUFUO0FBQ1YsUUFBQTtJQUFBLENBQUEsR0FBSSxDQUFBLFNBQUEsS0FBQTthQUFBLFNBQUE7QUFDQSxZQUFBO1FBQUEsUUFBUSxDQUFDLE1BQVQsQ0FBQTtRQUNBLElBQUcsTUFBTSxDQUFDLEtBQVY7VUFDSSxZQUFZLENBQUMsS0FBYixDQUFBLEVBREo7O1FBR0EsS0FBQSxHQUFZLElBQUEsRUFBRSxDQUFDLGFBQUgsQ0FBaUIsTUFBTSxDQUFDLElBQXhCO1FBRVosVUFBQSxHQUFhLE1BQU0sQ0FBQztRQUNwQixJQUFHLE9BQU8sTUFBTSxDQUFDLFVBQWQsS0FBNEIsUUFBL0I7VUFDSSxVQUFBLEdBQWEsRUFBRSxDQUFDLHdCQUF3QixDQUFDLFVBQTVCLENBQXVDLE1BQXZDLEVBQStDLE1BQU0sQ0FBQyxVQUF0RCxFQURqQjtTQUFBLE1BRUssSUFBRyx5QkFBSDtVQUNELFVBQUEsR0FBYSxNQUFNLENBQUMsV0FEbkI7O1FBR0wsS0FBSyxDQUFDLFVBQU4sR0FBbUI7UUFDbkIsS0FBSyxDQUFDLFdBQU4sR0FBb0IsTUFBTSxDQUFDO1FBRTNCLElBQUcseUJBQUg7QUFDSTtBQUFBLGVBQUEscUNBQUE7O1lBQ0ksS0FBTSxDQUFBLFdBQUEsQ0FBTixHQUFxQixNQUFPLENBQUEsV0FBQTtBQURoQyxXQURKOztlQUdBLFlBQVksQ0FBQyxRQUFiLENBQXNCLEtBQXRCLEVBQTZCLE1BQU0sQ0FBQyxZQUFwQyxFQUFrRCxNQUFNLENBQUMsS0FBekQ7TUFuQkE7SUFBQSxDQUFBLENBQUEsQ0FBQSxJQUFBO0lBcUJKLElBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWDthQUNJLENBQUMsSUFBQyxDQUFBLE1BQUQsSUFBUyxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQWxCLENBQXlCLENBQUMsRUFBRSxDQUFDLFNBQTdCLENBQXVDLENBQUEsU0FBQSxLQUFBO2VBQUEsU0FBQyxDQUFEO2lCQUFPLENBQUEsQ0FBQTtRQUFQO01BQUEsQ0FBQSxDQUFBLENBQUEsSUFBQSxDQUF2QyxFQURKO0tBQUEsTUFBQTthQUdJLENBQUEsQ0FBQSxFQUhKOztFQXRCVTs7O0FBMkJkOzs7Ozs7OzswQ0FPQSxjQUFBLEdBQWdCLFNBQUMsTUFBRDtXQUNaLFlBQVksQ0FBQyxnQkFBYixDQUFBO0VBRFk7OztBQUdoQjs7Ozs7Ozs7MENBT0EsY0FBQSxHQUFnQixTQUFDLE1BQUQsRUFBUyxFQUFUO0FBQ1osUUFBQTtJQUFBLE9BQUEsR0FBVSxJQUFDLENBQUEsYUFBYSxDQUFDLFVBQWYsQ0FBMEIsRUFBRSxDQUFDLHdCQUF3QixDQUFDLFVBQTVCLENBQXVDLE1BQXZDLEVBQStDLEVBQS9DLENBQTFCOzZCQUdWLE9BQU8sQ0FBRSxFQUFFLENBQUMsU0FBWixDQUFzQixTQUFDLE1BQUQ7YUFBWSxNQUFNLENBQUMsT0FBUCxDQUFBO0lBQVosQ0FBdEI7RUFKWTs7O0FBTWhCOzs7Ozs7Ozs7Ozs7OzBDQVlBLGFBQUEsR0FBZSxTQUFDLE1BQUQsRUFBUyxJQUFUO0FBQ1gsUUFBQTtJQUFBLElBQUcsT0FBTyxJQUFJLENBQUMsVUFBWixLQUEwQixRQUE3QjtNQUNJLFVBQUEsR0FBYSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVksQ0FBQSxJQUFJLENBQUMsVUFBTCxFQUQxQztLQUFBLE1BQUE7TUFHSSxVQUFBLEdBQWEsSUFBSSxDQUFDLFdBSHRCOztJQUtBLE1BQUEsR0FBUyxFQUFFLENBQUMsd0JBQXdCLENBQUMsVUFBNUIsQ0FBdUMsTUFBdkMsRUFBK0MsSUFBSSxDQUFDLE1BQXBEO0lBQ1QsT0FBQSxHQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMscUJBQWIsQ0FBbUMsVUFBbkMsbUJBQStDLFNBQVUsSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFSLElBQWdCLElBQUMsQ0FBQSxNQUExRTtJQUVWLElBQUcsdUJBQUg7QUFDSTtBQUFBLFdBQUEscUNBQUE7O1FBQ0ksT0FBUSxDQUFBLFNBQUEsQ0FBUixHQUFxQixNQUFPLENBQUEsU0FBQTtBQURoQyxPQURKOztJQUdBLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBWCxDQUFBO0lBQ0EsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFYLENBQUE7QUFFQSxXQUFPO0VBZkk7OztBQWlCZjs7Ozs7Ozs7MENBT0EsUUFBQSxHQUFVLFNBQUMsTUFBRCxFQUFTLElBQVQ7V0FDTixZQUFZLENBQUMsUUFBYixDQUFzQixJQUF0QjtFQURNOzs7O0dBN25COEIsRUFBRSxDQUFDOztBQWtvQi9DLEVBQUUsQ0FBQyw2QkFBSCxHQUFtQyIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3LjgIBcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIENvbXBvbmVudF9MYXlvdXRTY2VuZUJlaGF2aW9yIGV4dGVuZHMgZ3MuQ29tcG9uZW50X1NjZW5lQmVoYXZpb3JcbiAgIyAgQG9iamVjdENvZGVjQmxhY2tMaXN0ID0gW1wib2JqZWN0TWFuYWdlclwiXVxuICAgICMjIypcbiAgICAqIFRoZSBiYXNlIGNsYXNzIG9mIGFsbCBzY2VuZS1iZWhhdmlvciBjb21wb25lbnRzLiBBIHNjZW5lLWJlaGF2aW9yIGNvbXBvbmVudFxuICAgICogZGVmaW5lIHRoZSBsb2dpYyBvZiBhIHNpbmdsZSBnYW1lIHNjZW5lLiBcbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3JcbiAgICAqIEBleHRlbmRzIGdzLkNvbXBvbmVudF9TY2VuZUJlaGF2aW9yXG4gICAgKiBAbWVtYmVyb2YgZ3NcbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogLT5cbiAgICAgICAgc3VwZXIoKVxuICAgICAgICBcbiAgICAgICAgQG9iamVjdE1hbmFnZXIgPSBTY2VuZU1hbmFnZXJcbiAgICAgICAgQGxheW91dCA9IG51bGxcbiAgICAgICAgQHJlc291cmNlQ29udGV4dCA9IG51bGxcbiAgICBcbiAgICAjIyMqXG4gICAgKiBJbml0aWFsaXplcyB0aGUgc2NlbmUuIFxuICAgICpcbiAgICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgICMjIyAgICBcbiAgICBpbml0aWFsaXplOiAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBcbiAgICAgICAgQHJlc291cmNlQ29udGV4dCA9IFJlc291cmNlTWFuYWdlci5jcmVhdGVDb250ZXh0KClcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmNvbnRleHQgPSBAcmVzb3VyY2VDb250ZXh0XG4gICAgICAgIFxuICAgICAgICBpZiBub3QgQG9iamVjdC5sYXlvdXREYXRhP1xuICAgICAgICAgICAgQG9iamVjdC5sYXlvdXREYXRhID0geyBcInR5cGVcIjogXCJ1aS5GcmVlTGF5b3V0XCIsIFwiY29udHJvbHNcIjogW10sIFwiZnJhbWVcIjogWzAsIDAsIDEsIDFdIH1cbiAgICAgICAgICAgIFxuICAgICAgICBMYW5ndWFnZU1hbmFnZXIubG9hZEJ1bmRsZXMoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBEaXNwb3NlcyB0aGUgc2NlbmUuIFxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZVxuICAgICMjI1xuICAgIGRpc3Bvc2U6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgIFxuICAgICMjIypcbiAgICAqIFByZXBhcmVzIGFsbCBkYXRhIGZvciB0aGUgc2NlbmUgYW5kIGxvYWRzIHRoZSBuZWNlc3NhcnkgZ3JhcGhpYyBhbmQgYXVkaW8gcmVzb3VyY2VzLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZURhdGFcbiAgICAqIEBhYnN0cmFjdFxuICAgICMjIyAgICBcbiAgICBwcmVwYXJlRGF0YTogLT5cbiAgICAgICAgZ3MuT2JqZWN0TWFuYWdlci5jdXJyZW50ID0gQG9iamVjdE1hbmFnZXJcbiAgICAgICAgXG4gICAgICAgIGlmIG5vdCBHYW1lTWFuYWdlci5pbml0aWFsaXplZFxuICAgICAgICAgICAgR2FtZU1hbmFnZXIuaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgICBcbiAgICAgICAgQGRhdGFGaWVsZHMgPSB1aS5VaUZhY3RvcnkuZGF0YVNvdXJjZXNbQG9iamVjdC5sYXlvdXREYXRhLmRhdGFTb3VyY2UgfHwgXCJkZWZhdWx0XCJdKClcbiAgICAgICAgd2luZG93LiRkYXRhRmllbGRzID0gQGRhdGFGaWVsZHNcbiAgICAgICAgQG11c2ljID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoQG9iamVjdCwgQG9iamVjdC5sYXlvdXREYXRhLm11c2ljKVxuICAgICAgICBBdWRpb01hbmFnZXIubG9hZE11c2ljKEBtdXNpYylcbiAgICAgICAgQHByZXBhcmVUcmFuc2l0aW9uKFJlY29yZE1hbmFnZXIuc3lzdGVtLm1lbnVUcmFuc2l0aW9uKVxuICAgICAgICBcbiAgICAgICAgUmVzb3VyY2VMb2FkZXIubG9hZFVpVHlwZXNHcmFwaGljcyh1aS5VaUZhY3RvcnkuY3VzdG9tVHlwZXMpXG4gICAgICAgIFJlc291cmNlTG9hZGVyLmxvYWRVaUxheW91dEdyYXBoaWNzKEBvYmplY3QubGF5b3V0RGF0YSlcbiAgICAgICAgXG4gICAgICAgIGlmIEBkYXRhRmllbGRzP1xuICAgICAgICAgICAgUmVzb3VyY2VMb2FkZXIubG9hZFVpRGF0YUZpZWxkc0dyYXBoaWNzKEBkYXRhRmllbGRzKVxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0Qml0bWFwKFwiR3JhcGhpY3MvQ2hhcmFjdGVycy9KYW5lRGF0ZV9Ob3JtYWxcIilcbiAgICAgXG4gICAgIyMjKlxuICAgICogUHJlcGFyZXMgYWxsIHZpc3VhbCBnYW1lIG9iamVjdCBmb3IgdGhlIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZVZpc3VhbFxuICAgICMjIyAgICAgICAgIFxuICAgIHByZXBhcmVWaXN1YWw6IC0+XG4gICAgICAgIHNjYWxlID0gR3JhcGhpY3Muc2NhbGVcbiAgICAgICAgdm9jYWIgPSBSZWNvcmRNYW5hZ2VyLnZvY2FidWxhcnlcblxuICAgICAgICBpZiBub3QgQGxheW91dD9cbiAgICAgICAgICAgIEBkYXRhT2JqZWN0ID0ge31cbiAgICAgICAgICAgIEBsYXlvdXQgPSB1aS5VaUZhY3RvcnkuY3JlYXRlRnJvbURlc2NyaXB0b3IoQG9iamVjdC5sYXlvdXREYXRhLCBAb2JqZWN0KVxuICAgIFxuICAgICAgICAgICAgaWYgQG11c2ljP1xuICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5jaGFuZ2VNdXNpYyhAbXVzaWMsIDMwKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgQGxheW91dC51aS5wcmVwYXJlKClcbiAgICAgICAgQGxheW91dC51aS5hcHBlYXIoKVxuICAgICAgICBAbGF5b3V0LnVwZGF0ZSgpXG4gICAgICAgIFxuICAgICAgICBAdHJhbnNpdGlvbigpXG4gICAgICAgIFxuICAgICAgICBpZiBTY2VuZU1hbmFnZXIucHJldmlvdXNTY2VuZXMubGVuZ3RoID09IDBcbiAgICAgICAgICAgIGlmIEdhbWVNYW5hZ2VyLnRlbXBGaWVsZHMuaXNFeGl0aW5nR2FtZVxuICAgICAgICAgICAgICAgIEdhbWVNYW5hZ2VyLnRlbXBGaWVsZHMuaXNFeGl0aW5nR2FtZSA9IG5vXG4gICAgICAgICAgICAgICAgZ3MuR2FtZU5vdGlmaWVyLnBvc3RSZXNldFNjZW5lQ2hhbmdlKEBvYmplY3QubGF5b3V0TmFtZSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBncy5HYW1lTm90aWZpZXIucG9zdFNjZW5lQ2hhbmdlKEBvYmplY3QubGF5b3V0TmFtZSlcbiAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgc2NlbmUncyBjb250ZW50LlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQ29udGVudFxuICAgICMjIyAgICBcbiAgICB1cGRhdGVDb250ZW50OiAtPlxuICAgICAgICBHYW1lTWFuYWdlci51cGRhdGUoKVxuICAgICAgICBHcmFwaGljcy52aWV3cG9ydC51cGRhdGUoKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBTaG93cy9IaWRlcyB0aGUgY3VycmVudCBzY2VuZS4gQSBoaWRkZW4gc2NlbmUgaXMgbm8gbG9uZ2VyIHNob3duIGFuZCBleGVjdXRlZFxuICAgICogYnV0IGFsbCBvYmplY3RzIGFuZCBkYXRhIGlzIHN0aWxsIHRoZXJlIGFuZCBiZSBzaG93biBhZ2FpbiBhbnl0aW1lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2hvd1xuICAgICogQHBhcmFtIHtib29sZWFufSB2aXNpYmxlIC0gSW5kaWNhdGVzIGlmIHRoZSBzY2VuZSBzaG91bGQgYmUgc2hvd24gb3IgaGlkZGVuLlxuICAgICMjIyAgICAgICAgICBcbiAgICBzaG93OiAodmlzaWJsZSkgLT5cbiAgICAgICAgaWYgdmlzaWJsZVxuICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmNvbnRleHQgPSBAcmVzb3VyY2VDb250ZXh0XG4gICAgICAgIEBsYXlvdXQudmlzaWJsZSA9IHZpc2libGVcbiAgICAgICAgQGxheW91dC51cGRhdGUoKVxuICAgICAgICBAb2JqZWN0TWFuYWdlci5hY3RpdmUgPSB2aXNpYmxlXG4gICAgICAgIGlmIHZpc2libGVcbiAgICAgICAgICAgIGdzLk9iamVjdE1hbmFnZXIuY3VycmVudCA9IFNjZW5lTWFuYWdlciAjQG9iamVjdE1hbmFnZXJcbiAgICAgICAgI0BvYmplY3RNYW5hZ2VyLnVwZGF0ZSgpXG4gICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHJpZ2dlcnMgYSBmdWxsIHJlZnJlc2ggb24gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAqIFRoZSBwYXJhbXMgbXVzdCBiZSBhIGRpcmVjdCBiaW5kaW5nLWV4cHJlc3Npb24gc3RyaW5nLlxuICAgICpcbiAgICAqIEBtZXRob2QgZnVsbFJlZnJlc2hPYmplY3RcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtICBUaGUgYmluZGluZyBleHByZXNzaW9uLlxuICAgICMjIyAgICBcbiAgICBmdWxsUmVmcmVzaE9iamVjdDogKHNlbmRlciwgb2JqZWN0KSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIG9iamVjdClcbiAgICAgICAgb2JqZWN0Py5mdWxsUmVmcmVzaCgpXG4gICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHRyaWdnZXJzIGEgcmVmcmVzaCBvbiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgYmluZGluZy1leHByZXNzaW9uLlxuICAgICogVGhlIHBhcmFtcyBtdXN0IGJlIGEgZGlyZWN0IGJpbmRpbmctZXhwcmVzc2lvbiBzdHJpbmcuXG4gICAgKlxuICAgICogQG1ldGhvZCByZWZyZXNoT2JqZWN0XG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMgLSAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbi5cbiAgICAjIyMgICAgXG4gICAgcmVmcmVzaE9iamVjdDogKHNlbmRlciwgb2JqZWN0KSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIG9iamVjdClcbiAgICAgICAgb2JqZWN0Py5uZWVkc1VwZGF0ZSA9IHRydWVcbiAgICAgICAgXG4gICAgYWRkU3R5bGU6IChzZW5kZXIsIHN0eWxlKSAtPlxuICAgICAgICBzdHlsZU9iamVjdCA9IHVpLlVJTWFuYWdlci5zdHlsZXNbc3R5bGVdXG4gICAgICAgIHN0eWxlT2JqZWN0Py5hcHBseShzZW5kZXIpXG4gICAgICAgIHNlbmRlci5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICBpZiBzdHlsZU9iamVjdD8uZm9udFxuICAgICAgICAgICAgc2VuZGVyLmJlaGF2aW9yLnJlZnJlc2goKVxuICAgICAgICBcbiAgICByZW1vdmVTdHlsZTogKHNlbmRlciwgc3R5bGUpIC0+IFxuICAgICAgICBzdHlsZU9iamVjdCA9IHVpLlVJTWFuYWdlci5zdHlsZXNbc3R5bGVdXG4gICAgICAgIHN0eWxlT2JqZWN0Py5yZXZlcnQoc2VuZGVyKVxuICAgICAgICBzZW5kZXIuZGVzY3JpcHRvci5zdHlsZXMucmVtb3ZlKHN0eWxlKVxuICAgICAgICBcbiAgICAgICAgZm9yIHMgaW4gc2VuZGVyLmRlc2NyaXB0b3Iuc3R5bGVzXG4gICAgICAgICAgICB1aS5VSU1hbmFnZXIuc3R5bGVzW3NdPy5hcHBseShzZW5kZXIpXG4gICAgICAgIHNlbmRlci5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICBpZiBzdHlsZU9iamVjdD8uZm9udFxuICAgICAgICAgICAgc2VuZGVyLmJlaGF2aW9yLnJlZnJlc2goKVxuICAgICAgICAgICAgXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIGJpbmRpbmdzLlxuICAgICpcbiAgICAqIEBtZXRob2QgZXhlY3V0ZUJpbmRpbmdzXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0W119IHBhcmFtcyAtICBBbiBhcnJheSBvZiBiaW5kaW5nLWRlZmluaXRpb25zLlxuICAgICMjIyBcbiAgICBleGVjdXRlQmluZGluZ3M6IChzZW5kZXIsIGJpbmRpbmdzKSAtPlxuICAgICAgICBmb3IgYmluZGluZyBpbiBiaW5kaW5nc1xuICAgICAgICAgICAgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmV4ZWN1dGVCaW5kaW5nKHNlbmRlciwgYmluZGluZylcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggZXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBmb3JtdWxhcy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGV4ZWN1dGVGb3JtdWxhc1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge3VpLkZvcm11bGFbXX0gcGFyYW1zIC0gIEFuIGFycmF5IG9mIGZvcm11bGEtZGVmaW5pdGlvbnMuXG4gICAgIyMjICBcbiAgICBleGVjdXRlRm9ybXVsYXM6IChzZW5kZXIsIGZvcm11bGFzKSAtPlxuICAgICAgICBmb3IgZm9ybXVsYSBpbiBmb3JtdWxhc1xuICAgICAgICAgICAgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmV4ZWN1dGVGb3JtdWxhKHNlbmRlciwgZm9ybXVsYSlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGV4ZWN1dGVzIGFuIGFuaW1hdGlvbiBvbiBhIHNwZWNpZmllZCB0YXJnZXQgZ2FtZSBvYmplY3QuXG4gICAgKlxuICAgICogQG1ldGhvZCBleGVjdXRlQW5pbWF0aW9uXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSAgQ29udGFpbnMgdGFyZ2V0LWlkIGFuZCBhbmltYXRpb25zOiB7IHRhcmdldCwgYW5pbWF0aW9ucyB9XG4gICAgIyMjICAgICAgICAgXG4gICAgZXhlY3V0ZUFuaW1hdGlvbjogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHBhcmFtcy50YXJnZXQpXG4gICAgICAgIGFuaW1hdGlvbiA9IG9iamVjdD8uYW5pbWF0aW9ucy5maXJzdCAoYSkgLT4gYS5ldmVudCA9PSBwYXJhbXMuZXZlbnRcbiAgICAgICAgXG4gICAgICAgIGlmIGFuaW1hdGlvbiBhbmQgb2JqZWN0XG4gICAgICAgICAgICBvYmplY3QuYW5pbWF0aW9uRXhlY3V0b3IuZXhlY3V0ZShhbmltYXRpb24pXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGVtaXRzIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBlbWl0RXZlbnRcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIGV2ZW50IG5hbWUsIHNvdXJjZSBhbmQgZGF0YS5cbiAgICAqIDx1bD5cbiAgICAqIDxsaT5wYXJhbXMubmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBlbWl0PC9saT5cbiAgICAqIDxsaT5wYXJhbXMuc291cmNlIC0gQSBiaW5kaW5nLWV4cHJlc3Npb24gdG8gZGVmaW5lIHRoZSBnYW1lIG9iamVjdCB3aGljaCBzaG91bGQgZW1pdCB0aGUgZXZlbnQuPC9saT5cbiAgICAqIDxsaT5wYXJhbXMuZGF0YSAtIEFuIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgZXZlbnQgc3BlY2lmaWMgZGF0YS48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgXG4gICAgZW1pdEV2ZW50OiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIG9iamVjdCA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNvdXJjZSlcbiAgICAgICAgb2JqZWN0Py5ldmVudHMuZW1pdChwYXJhbXMubmFtZSwgb2JqZWN0LCB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHBhcmFtcy5kYXRhKSlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGNoYW5nZXMgdGhlIGdhbWUncyBhc3BlY3QgcmF0aW8uXG4gICAgKlxuICAgICogQG1ldGhvZCBleGVjdXRlQmluZGluZ3NcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMgLSAgSWYgPGI+dHJ1ZTwvYj4gdGhlIGdhbWUgc2NyZWVuIHdpbGwgc3RyZXRjaGVkIHNvIHRoYXQgaXQgZmlsbHMgdGhlIGVudGlyZSBzY3JlZW5cbiAgICAqIG9mIHRoZSBwbGF5ZXIgd2l0aG91dCBhbnkgYmxhY2sgYm9yZGVycy4gT3RoZXJ3aXNlIHRoZSBnYW1lIHNjcmVlbiBzdHJldGNoZXMgYnV0IGtlZXBzIGl0cyByYXRpb1xuICAgICogc28gYmxhY2sgYm9yZGVycyBhcmUgcG9zc2libGUgaWYgdGhlIGdhbWUgcmVzb2x1dGlvbidzIHJhdGlvIGFuZCB0aGUgdGFyZ2V0IGRpc3BsYXkncyByYXRpbyBhcmUgbm90IG1hdGNoLiBJdCBjYW4gYWxzb1xuICAgICogYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjXG4gICAgYWRqdXN0QXNwZWN0UmF0aW86IChzZW5kZXIsIGFkanVzdCkgLT5cbiAgICAgICAgYWRqdXN0ID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBhZGp1c3QpXG4gICAgXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmFkanVzdEFzcGVjdFJhdGlvID0gYWRqdXN0XG4gICAgICAgIEdyYXBoaWNzLmtlZXBSYXRpbyA9ICFhZGp1c3RcbiAgICAgICAgR3JhcGhpY3Mub25SZXNpemUoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGVudGVycyBmdWxsc2NyZWVuIG1vZGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBlbnRlckZ1bGxTY3JlZW5cbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj5cbiAgICAjIyNcbiAgICBlbnRlckZ1bGxTY3JlZW46IChzZW5kZXIsIHBhcmFtcykgLT4gXG4gICAgICAgIGdzLkdyYXBoaWNzLmVudGVyRnVsbHNjcmVlbigpXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmZ1bGxTY3JlZW4gPSBHcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggbGVhdmVzIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGxlYXZlRnVsbFNjcmVlblxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPlxuICAgICMjI1xuICAgIGxlYXZlRnVsbFNjcmVlbjogLT4gXG4gICAgICAgIGdzLkdyYXBoaWNzLmxlYXZlRnVsbHNjcmVlbigpXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmZ1bGxTY3JlZW4gPSBHcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHRvZ2dsZXMgYmV0d2VlbiB3aW5kb3cgYW5kIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHRvZ2dsZUZ1bGxTY3JlZW5cbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjXG4gICAgdG9nZ2xlRnVsbFNjcmVlbjogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBpZiBncy5HcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICAgICAgZ3MuR3JhcGhpY3MubGVhdmVGdWxsc2NyZWVuKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZ3MuR3JhcGhpY3MuZW50ZXJGdWxsc2NyZWVuKClcblxuICAgICAgICBHYW1lTWFuYWdlci5zZXR0aW5ncy5mdWxsU2NyZWVuID0gZ3MuR3JhcGhpY3MuaXNGdWxsc2NyZWVuKClcbiAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggcGxheXMgdGhlIHNwZWNpZmllZCBzb3VuZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHBsYXlTb3VuZFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHNvdW5kIHRvIHBsYXkuXG4gICAgIyMjXG4gICAgcGxheVNvdW5kOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIEF1ZGlvTWFuYWdlci5sb2FkU291bmQocGFyYW1zKVxuICAgICAgICBBdWRpb01hbmFnZXIucGxheVNvdW5kKHBhcmFtcylcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBwbGF5cyB0aGUgc3BlY2lmaWVkIHZvaWNlLlxuICAgICpcbiAgICAqIEBtZXRob2QgcGxheVZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBUaGUgdm9pY2UgdG8gcGxheS5cbiAgICAjIyNcbiAgICBwbGF5Vm9pY2U6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLmxvYWRTb3VuZChwYXJhbXMpXG4gICAgICAgIEF1ZGlvTWFuYWdlci5wbGF5Vm9pY2UocGFyYW1zKVxuICAgICAgXG4gICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgdm9pY2Ugb24gb3Igb2ZmLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9uT2ZmVm9pY2VcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gSWYgPGI+dHJ1ZTwvYj4gdm9pY2Ugd2lsbCBiZSB0dXJuZWQgb24uIE90aGVyd2lzZSBpdCB3aWxsIGJlIHR1cm5lZCBvZmYuIENhbiBhbHNvIGJlIGEgYmluZGluZy1leHByZXNzaW9uLlxuICAgICMjIyBcbiAgICB0dXJuT25PZmZWb2ljZTogKHNlbmRlciwgc3RhdGUpIC0+XG4gICAgICAgIGlmIHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgc3RhdGUpIHRoZW4gQHR1cm5PblZvaWNlKCkgZWxzZSBAdHVybk9mZlZvaWNlKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBtdXNpYyBvbiBvciBvZmYuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT25PZmZNdXNpY1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBwYXJhbXMgLSBJZiA8Yj50cnVlPC9iPiBtdXNpYyB3aWxsIGJlIHR1cm5lZCBvbi4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHVybmVkIG9mZi4gQ2FuIGFsc28gYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjIFxuICAgIHR1cm5Pbk9mZk11c2ljOiAoc2VuZGVyLCBzdGF0ZSkgLT5cbiAgICAgICAgaWYgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBzdGF0ZSkgdGhlbiBAdHVybk9uTXVzaWMoKSBlbHNlIEB0dXJuT2ZmTXVzaWMoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHR1cm5zIHNvdW5kIG9uIG9yIG9mZi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHR1cm5Pbk9mZlNvdW5kXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIElmIDxiPnRydWU8L2I+IHNvdW5kIHdpbGwgYmUgdHVybmVkIG9uLiBPdGhlcndpc2UgaXQgd2lsbCBiZSB0dXJuZWQgb2ZmLiBDYW4gYWxzbyBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAjIyMgXG4gICAgdHVybk9uT2ZmU291bmQ6IChzZW5kZXIsIHN0YXRlKSAtPlxuICAgICAgICBpZiB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHN0YXRlKSB0aGVuIEB0dXJuT25Tb3VuZCgpIGVsc2UgQHR1cm5PZmZTb3VuZCgpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb2ZmIHZvaWNlLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9mZlZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9mZlZvaWNlOiAtPlxuICAgICAgICBBdWRpb01hbmFnZXIuc3RvcEFsbFZvaWNlcygpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb2ZmIG11c2ljLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9mZk11c2ljXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9mZk11c2ljOiAtPlxuICAgICAgICBBdWRpb01hbmFnZXIuc3RvcE11c2ljKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBvZmYgc291bmQuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT2ZmU291bmRcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICB0dXJuT2ZmU291bmQ6IC0+XG4gICAgICAgIEF1ZGlvTWFuYWdlci5zdG9wQWxsU291bmRzKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBvbiB2b2ljZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHR1cm5PblZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9uVm9pY2U6IC0+XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb24gc291bmQuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT25Tb3VuZFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj4uXG4gICAgIyMjIFxuICAgIHR1cm5PblNvdW5kOiAtPlxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHR1cm5zIG9uIG11c2ljLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9uTXVzaWNcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICB0dXJuT25NdXNpYzogLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnJlc3VtZU11c2ljKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzZWxlY3RzIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZWxlY3RMYW5ndWFnZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHBhcmFtcyAtIEluZGV4IG9mIHRoZSBsYW5ndWFnZSB0byBzZXQuIENhbiBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAjIyMgXG4gICAgc2VsZWN0TGFuZ3VhZ2U6IChzZW5kZXIsIHBhcmFtcyktPlxuICAgICAgICBsYW5ndWFnZSA9IExhbmd1YWdlTWFuYWdlci5sYW5ndWFnZXNbdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBwYXJhbXMpXVxuICAgICAgICBMYW5ndWFnZU1hbmFnZXIuc2VsZWN0TGFuZ3VhZ2UobGFuZ3VhZ2UpXG4gICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCByZXNldHMgZ2xvYmFsIGRhdGEgc3RvcmFnZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHJlc2V0R2xvYmFsRGF0YVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICByZXNldEdsb2JhbERhdGE6IChzZW5kZXIpIC0+IFxuICAgICAgICBHYW1lTWFuYWdlci5yZXNldEdsb2JhbERhdGEoKVxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggc2F2ZXMgZ2FtZSBzZXR0aW5ncy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNhdmVTZXR0aW5nc1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICBzYXZlU2V0dGluZ3M6IChzZW5kZXIpIC0+IEdhbWVNYW5hZ2VyLnNhdmVTZXR0aW5ncygpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBwcmVwYXJlcyB0aGUgZ2FtZSBmb3Igc2F2aW5nIGJ5IHRha2luZyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGdhbWUgc3RhdGVcbiAgICAqIGFuZCBzdG9yaW5nIGl0IGluIEdhbWVNYW5hZ2VyLnNhdmVHYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZVNhdmVHYW1lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj4uXG4gICAgIyMjIFxuICAgIHByZXBhcmVTYXZlR2FtZTogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBHYW1lTWFuYWdlci5wcmVwYXJlU2F2ZUdhbWUocGFyYW1zPy5zbmFwc2hvdClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzYXZlcyB0aGUgY3VycmVudCBnYW1lIGF0IHRoZSBzcGVjaWZpZWQgc2F2ZSBzbG90LlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2F2ZUdhbWVcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBzbG90LWluZGV4IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZC5cbiAgICAqIDx1bD5cbiAgICAqIDxsaT5wYXJhbXMuc2xvdCAtIFRoZSBzbG90LWluZGV4IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZC4gQ2FuIGJlIGEgYmluZGluZy1leHByZXNzaW9uLjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyBcbiAgICBzYXZlR2FtZTogKHNlbmRlciwgcGFyYW1zKSAtPiBHYW1lTWFuYWdlci5zYXZlKHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNsb3QpKVxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggbG9hZHMgdGhlIGdhbWUgZnJvbSB0aGUgc3BlY2lmaWVkIHNhdmUgc2xvdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGxvYWRHYW1lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDb250YWlucyB0aGUgc2xvdC1pbmRleCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLnNsb3QgLSBUaGUgc2xvdC1pbmRleCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uIENhbiBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgXG4gICAgbG9hZEdhbWU6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgR2FtZU1hbmFnZXIudGVtcFNldHRpbmdzLnNraXAgPSBub1xuICAgICAgICBHYW1lTWFuYWdlci5sb2FkKHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNsb3QpKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHN0YXJ0cyBhIG5ldyBnYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgbmV3R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjIFxuICAgIG5ld0dhbWU6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnN0b3BBbGxNdXNpYygzMClcbiAgICAgICAgR2FtZU1hbmFnZXIubmV3R2FtZSgpXG4gICAgICAgIFxuICAgICAgICBzY2VuZSA9IG5ldyB2bi5PYmplY3RfU2NlbmUoKVxuICAgICAgICBTY2VuZU1hbmFnZXIuY2xlYXIoKVxuICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBleGlzdHMgdGhlIGN1cnJlbnQgZ2FtZS4gSXQgZG9lc24ndCBjaGFuZ2UgdGhlIHNjZW5lIGFuZFxuICAgICogc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc3dpdGNoaW5nIGJhY2sgdG8gdGhlIHRpdGxlIHNjcmVlbiBvciBtYWluIG1lbnUuXG4gICAgKlxuICAgICogQG1ldGhvZCBleGl0R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjIFxuICAgIGV4aXRHYW1lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIEdhbWVNYW5hZ2VyLmV4aXRHYW1lKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzd2l0Y2hlcyB0byBhbm90aGVyIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc3dpdGNoU2NlbmVcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzY2VuZSB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLm5hbWUgLSBUaGUgY2xhc3MtbmFtZSBvZiB0aGUgc2NlbmUgdG8gc3dpdGNoIHRvLiBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHZuLW5hbWVzcGFjZS48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgIFxuICAgIHN3aXRjaFNjZW5lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIGYgPSA9PlxuICAgICAgICAgICAgaWYgcGFyYW1zLmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHNjZW5lID0gbmV3IHZuW3BhcmFtcy5uYW1lXSgpXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUsIHBhcmFtcy5zYXZlUHJldmlvdXMpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgIXBhcmFtcy5zYXZlUHJldmlvdXNcbiAgICAgICAgICAgIEBsYXlvdXQudWkuZGlzYXBwZWFyIChlKSA9PiBmKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZigpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggc3dpdGNoZXMgdG8gYW5vdGhlciBnYW1lIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc3dpdGNoR2FtZVNjZW5lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDb250YWlucyB0aGUgVUlEIG9mIHRoZSBzY2VuZSB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLnVpZCAtIFRoZSBVSUQgb2YgdGhlIHNjZW5lIHRvIHN3aXRjaCB0by48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgXG4gICAgc3dpdGNoR2FtZVNjZW5lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIGYgPSA9PlxuICAgICAgICAgICAgaWYgcGFyYW1zLmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWRcbiAgICAgICAgICAgIGlmIHBhcmFtcy5uYW1lXG4gICAgICAgICAgICAgICAgc2NlbmVEb2N1bWVudHMgPSBEYXRhTWFuYWdlci5nZXREb2N1bWVudHNCeVR5cGUoXCJ2bi5zY2VuZVwiKVxuICAgICAgICAgICAgICAgIHNjZW5lRG9jdW1lbnQgPSBzY2VuZURvY3VtZW50cy5maXJzdCAoZCkgLT4gZC5pdGVtcy5uYW1lID09IHBhcmFtcy5uYW1lXG4gICAgICAgICAgICAgICAgaWYgc2NlbmVEb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICB1aWQgPSBzY2VuZURvY3VtZW50LnVpZFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBzY2VuZURhdGEgPSB1aWQ6IHVpZCwgcGljdHVyZXM6IFtdLCB0ZXh0czogW11cbiAgICAgICAgICAgIEdhbWVNYW5hZ2VyLnNjZW5lRGF0YSA9IHNjZW5lRGF0YVxuICAgICAgICAgICAgbmV3U2NlbmUgPSBuZXcgdm4uT2JqZWN0X1NjZW5lKClcbiAgICAgICAgICAgIG5ld1NjZW5lLnNjZW5lRGF0YSA9IHNjZW5lRGF0YVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8obmV3U2NlbmUsIHBhcmFtcy5zYXZlUHJldmlvdXMpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgIXBhcmFtcy5zYXZlUHJldmlvdXNcbiAgICAgICAgICAgIChAbGF5b3V0fHxAb2JqZWN0LmxheW91dCkudWkuZGlzYXBwZWFyIChlKSA9PiBmKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZigpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzd2l0Y2hlcyB0byBhbm90aGVyIGxheW91dC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHN3aXRjaExheW91dFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHRvIHN3aXRjaCB0by48L2xpPlxuICAgICogPGxpPnBhcmFtcy5zYXZlUHJldmlvdXMgLSBJbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgbGF5b3V0IHNob3VsZCBub3QgYmUgZXJhc2VkIGJ1dCBwYXVzZWQgYW5kIGhpZGRlbiBpbnN0ZWFkIHNvXG4gICAgKiB0aGF0IGl0IGNhbiBiZSByZXN0b3JlZCB1c2luZyA8aT5yZXR1cm5Ub1ByZXZpb3VzPC9pPiBhY3Rpb24uPC9saT5cbiAgICAqIDxsaT5wYXJhbXMuZGF0YUZpZWxkcyAtIERlZmluZXMgdGhlIGRhdGEgb2YgXCIkZGF0YUZpZWxkc1wiIGJpbmRpbmctZXhwcmVzc2lvbiB2YXJpYWJsZS4gQ2FuIGJlIGEgYmluZGluZy1leHByZXNzaW9uXG4gICAgKiBvciBhIGRpcmVjdCBvYmplY3QuIE9wdGlvbmFsLjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyAgICBcbiAgICBzd2l0Y2hMYXlvdXQ6IChzZW5kZXIsIGxheW91dCkgLT5cbiAgICAgICAgZiA9ID0+XG4gICAgICAgICAgICBHcmFwaGljcy5mcmVlemUoKVxuICAgICAgICAgICAgaWYgbGF5b3V0LmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHNjZW5lID0gbmV3IGdzLk9iamVjdF9MYXlvdXQobGF5b3V0Lm5hbWUpXG4gICAgICAgICAgXG4gICAgICAgICAgICBkYXRhRmllbGRzID0gc2VuZGVyLmRhdGFGaWVsZHNcbiAgICAgICAgICAgIGlmIHR5cGVvZiBsYXlvdXQuZGF0YUZpZWxkcyA9PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkcyA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgbGF5b3V0LmRhdGFGaWVsZHMpXG4gICAgICAgICAgICBlbHNlIGlmIGxheW91dC5kYXRhRmllbGRzP1xuICAgICAgICAgICAgICAgIGRhdGFGaWVsZHMgPSBsYXlvdXQuZGF0YUZpZWxkc1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgc2NlbmUuZGF0YUZpZWxkcyA9IGRhdGFGaWVsZHNcbiAgICAgICAgICAgIHNjZW5lLmNvbnRyb2xsZXJzID0gbGF5b3V0LmNvbnRyb2xsZXJzXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIGxheW91dC5zZW5kZXJEYXRhP1xuICAgICAgICAgICAgICAgIGZvciBzZW5kZXJGaWVsZCBpbiBsYXlvdXQuc2VuZGVyRGF0YVxuICAgICAgICAgICAgICAgICAgICBzY2VuZVtzZW5kZXJGaWVsZF0gPSBzZW5kZXJbc2VuZGVyRmllbGRdXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUsIGxheW91dC5zYXZlUHJldmlvdXMsIGxheW91dC5zdGFjaylcbiAgICAgICAgXG4gICAgICAgIGlmICFsYXlvdXQuc2F2ZVByZXZpb3VzXG4gICAgICAgICAgICAoQGxheW91dHx8QG9iamVjdC5sYXlvdXQpLnVpLmRpc2FwcGVhciAoZSkgPT4gZigpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGYoKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHJldHVybnMgdG8gcHJldmlvdXMgbGF5b3V0LiAoSWYgc2F2ZVByZXZpb3VzIHdhcyBzZXQgdG8gPGI+dHJ1ZTwvYj4gb24gc3dpdGNoTGF5b3V0LikuXG4gICAgKlxuICAgICogQG1ldGhvZCBwcmV2aW91c0xheW91dFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyAgICAgXG4gICAgcHJldmlvdXNMYXlvdXQ6IChzZW5kZXIpIC0+XG4gICAgICAgIFNjZW5lTWFuYWdlci5yZXR1cm5Ub1ByZXZpb3VzKClcbiAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggZGlzcG9zZXMgdGhlIHNwZWNpZmllZCBjb250cm9sLlxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZUNvbnRyb2xcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtIFRoZSBJRCBvZiB0aGUgY29udHJvbCB0byBkaXNwb3NlLiBDYW4gYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjICAgIFxuICAgIGRpc3Bvc2VDb250cm9sOiAoc2VuZGVyLCBpZCkgLT5cbiAgICAgICAgY29udHJvbCA9IEBvYmplY3RNYW5hZ2VyLm9iamVjdEJ5SWQodWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBpZCkpXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgY29udHJvbD8udWkuZGlzYXBwZWFyIChzZW5kZXIpIC0+IHNlbmRlci5kaXNwb3NlKClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29udHJvbCBmcm9tIHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRvci5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNyZWF0ZUNvbnRyb2xcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBkZXNjcmlwdG9yIGFuZCBvdGhlciBkYXRhIG5lZWRlZCB0byBjb25zdHJ1Y3QgdGhlIGNvbnRyb2wuXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLmRlc2NyaXB0b3IgLSBUaGUgY29udHJvbCcgZGVzY3JpcHRvci4gQ2FuIGJlIGEgZGlyZWN0IGRlc2NyaXB0b3IgZGVmaW5pdGlvbiBvciBhIHRlbXBsYXRlIG5hbWU8L2xpPlxuICAgICogPGxpPnBhcmFtcy5wYXJlbnQgLSBBIGJpbmRpbmctZXhwcmVzc2lvbiB3aGljaCByZXR1cm5zIHRoZSBjb250cm9sJ3MgcGFyZW50LjwvbGk+XG4gICAgKiA8bGk+cGFyYW1zLnNlbmRlckRhdGEgLSBBbiBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIGRhdGEgbWVyZ2VkIGludG8gdGhlIGNvbnRyb2wgb2JqZWN0LjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyAgXG4gICAgY3JlYXRlQ29udHJvbDogKHNlbmRlciwgZGF0YSkgLT5cbiAgICAgICAgaWYgdHlwZW9mIGRhdGEuZGVzY3JpcHRvciA9PSBcInN0cmluZ1wiXG4gICAgICAgICAgICBkZXNjcmlwdG9yID0gdWkuVUlNYW5hZ2VyLmN1c3RvbVR5cGVzW2RhdGEuZGVzY3JpcHRvcl1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRhdGEuZGVzY3JpcHRvclxuICAgICAgICBcbiAgICAgICAgcGFyZW50ID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBkYXRhLnBhcmVudClcbiAgICAgICAgY29udHJvbCA9IHVpLlVpRmFjdG9yeS5fY3JlYXRlRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvciwgcGFyZW50ID8gKEBvYmplY3QubGF5b3V0fHxAb2JqZWN0KSApXG4gICAgICAgIFxuICAgICAgICBpZiBkYXRhLnNlbmRlckRhdGE/XG4gICAgICAgICAgICBmb3IgZmllbGROYW1lIGluIGRhdGEuc2VuZGVyRGF0YVxuICAgICAgICAgICAgICAgIGNvbnRyb2xbZmllbGROYW1lXSA9IHNlbmRlcltmaWVsZE5hbWVdXG4gICAgICAgIGNvbnRyb2wudWkucHJlcGFyZSgpXG4gICAgICAgIGNvbnRyb2wudWkuYXBwZWFyKClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBjb250cm9sXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggcXVpdHMgdGhlIGdhbWUuXG4gICAgKlxuICAgICogQG1ldGhvZCBxdWl0R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICBxdWl0R2FtZTogKHNlbmRlciwgZGF0YSkgLT5cbiAgICAgICAgU2NlbmVNYW5hZ2VyLnN3aXRjaFRvKG51bGwpXG4gICAgICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIFxuZ3MuQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3IgPSBDb21wb25lbnRfTGF5b3V0U2NlbmVCZWhhdmlvciJdfQ==\n//# sourceURL=Component_LayoutSceneBehavior_22.js"
13 13 },
14 14 "summary": [
15 15 "name",