(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/backpack/backpack_controller.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '454feBZaSJINIbY0IysJHCJ', 'backpack_controller'); // Scripts/mod/backpack/backpack_controller.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 背包内出售物品的面板 //
Create: 2018-12-24 16:50:14 // -------------------------------------------------------------------- var BackPackConst = require("backpack_const"); var MainuiController = require("mainui_controller"); var MainuiConst = require("mainui_const"); var BackpackEvent = require("backpack_event"); var JumpController = require("jump_controller"); var TipsController = require("tips_controller"); var GuideController = require("guide_controller"); var BackpackController = cc.Class({ "extends": BaseController, ctor: function ctor() {}, // 初始化配置数据 initConfig: function initConfig() { var BackpackModel = require("backpack_model"); this.model = new BackpackModel(); this.model.initConfig(); }, // 返回当前的model getModel: function getModel() { return this.model; }, // 注册监听事件 registerEvents: function registerEvents() { if (this.login_event_success == null) { this.login_event_success = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () { this.requestInitProto(); }.bind(this)); } if (this.re_link_game == null) { this.re_link_game = gcore.GlobalEvent.bind(EventId.EVT_RE_LINK_GAME, function () { var GuideController = require("guide_controller"); if (!GuideController.getInstance().isInGuide()) this.openMainWindow(false); // 断线重连先关掉背包窗体 // this.requestInitProto() }.bind(this)); } }, // 注册协议接受事件 registerProtocals: function registerProtocals() { this.RegisterProtocal(10500, this.on10500); this.RegisterProtocal(10501, this.on10501); this.RegisterProtocal(10510, this.on10510); //增加物品通知 this.RegisterProtocal(10511, this.on10511); //删除物品通知 this.RegisterProtocal(10512, this.on10512); //刷新物品通知 this.RegisterProtocal(10515, this.handle10515); //使用物品 this.RegisterProtocal(10522, this.handle10522); //出售背包物品 this.RegisterProtocal(10523, this.handle10523); this.RegisterProtocal(11008, this.handle11008); }, // 请求角色道具初始数据 requestInitProto: function requestInitProto() {// this.sender10500() // this.sender10501() }, sender10500: function sender10500() { this.SendProtocal(10500, {}); }, sender10501: function sender10501() { this.SendProtocal(10501, {}); }, // 初始化道具背包 on10500: function on10500(data) { data.bag_code = BackPackConst.Bag_Code.BACKPACK; this.model.initItemList(data); }, // 初始化装备被曝 on10501: function on10501(data) { data.bag_code = BackPackConst.Bag_Code.EQUIPS; this.model.initItemList(data); }, // 增加一个物品 on10510: function on10510(data) { cc.log("增加一个物品", data); this.model.updateBagItemsNum(data); }, // 删除一个物品 on10511: function on10511(data) { cc.log("删除一个物品", data); this.model.deleteBagItems(data); }, // 刷新一个物品 on10512: function on10512(data) { this.model.updateBagItemsNum(data, true); }, // ============================== // desc:出售物品 // @storage: // @args: // @return // ============================== sender10522: function sender10522(storage, args) { var protocal = {}; protocal.storage = storage; protocal.args = args; this.SendProtocal(10522, protocal); }, handle10522: function handle10522(data) { message(data.msg); if (this.batch_use) { this.openBatchUseItemView(false); } if (this.sell_window) { //出售成功之后关闭出售面板 this.openSellWindow(false); } this.closeGiftSelectPanel(); gcore.GlobalEvent.fire(BackpackEvent.Sell_Goods_Success); }, // ============================== // desc:使用物品 // @id: // @quantity: // @args: // @return // ============================== sender10515: function sender10515(id, quantity, args) { var protocal = {}; protocal.id = id; protocal.quantity = quantity; protocal.args = args || {}; this.SendProtocal(10515, protocal); }, handle10515: function handle10515(data) { message(data.msg); if (data.flag == 1) { this.openBatchUseItemView(false); this.closeGiftSelectPanel(); } }, sender10523: function sender10523(id, num) { var protocal = {}; protocal.id = id; protocal.num = num; this.SendProtocal(10523, protocal); }, handle10523: function handle10523(data) { message(data.msg); if (data.flag == 1) { gcore.GlobalEvent.fire(BackpackEvent.Compose_Goods_Success); TipsController.getInstance().showBackPackCompTips(false); } }, //背包碎片合成 sender11008: function sender11008(bid, num) { var proto = {}; proto.bid = bid; proto.num = num; this.SendProtocal(11008, proto); }, handle11008: function handle11008(data) { gcore.GlobalEvent.fire(BackpackEvent.Compose_BackPack_Success); message(data.msg); TipsController.getInstance().showBackPackCompTips(false); TipsController.getInstance().showCompChooseTips(false); if (data.result == 1) { var items = []; for (var i in data.partners) { var v = data.partners[i]; var info = Config.partner_data.data_partner_base[v.partner_bid]; items[parseInt(i)] = {}; items[parseInt(i)].bid = v.partner_bid; items[parseInt(i)].star = info.init_star; items[parseInt(i)].camp_type = info.camp_type; items[parseInt(i)].show_type = MainuiConst.item_exhibition_type.partner_type; } MainuiController.getInstance().openGetItemView(true, items, 0); } }, /** * 打开背包主入口 * @param {*} status * @param {*} params */ openMainWindow: function openMainWindow(status, params) { if (!status) { if (this.backpack_win) { this.backpack_win.close(); this.backpack_win = null; } } else { if (this.backpack_win == null) { this.backpack_win = Utils.createClass("backpack_window"); } this.backpack_win.open(params); } }, /** * 显示道具提示信息 * @author zhanghuxing 2019-01-21 * @param {[type]} status [description] * @param {[type]} data 可以是bid, 或者配置表条目 * @param {[type]} extend_data [description] * @param {[type]} item_list 需要的物品列表 * @return {[type]} [description] */ openTipsSource: function openTipsSource(status, data, extend_data, item_list) { if (status) { if (GuideController.getInstance().isInGuide()) return; if (typeof data == "number") { data = Utils.getItemConfig(data); } if (data == null) return; if (!this.tips_source) { var TipsSource = require("tips_source_window"); this.tips_source = new TipsSource(this); } // if (typeof data == "number") { // data = Utils.getItemConfig(data); // } var open_params = {}; open_params.data = data; open_params.extend_data = extend_data; open_params.item_list = item_list; this.tips_source.open(open_params); } else { if (this.tips_source) { this.tips_source.close(); this.tips_source = null; } } }, /** * desc:出售物品 */ openItemSellPanel: function openItemSellPanel(status, goods_vo, bag_code) { if (status == false) { if (this.item_sell_panel != null) { this.item_sell_panel.close(); this.item_sell_panel = null; } } else { var bag_code = bag_code || BackPackConst.Bag_Code.BACKPACK; if (this.item_sell_panel == null) { this.item_sell_panel = Utils.createClass("item_sell_panel_window", this); } if (this.item_sell_panel.isOpen() == false) { this.item_sell_panel.open([goods_vo, bag_code]); } } }, // --==============================-- // --desc:打开批量使用物品窗口 // --@item:必须是物品真是数据 // --@type:出售或者使用 // --@select_vo :自选礼包点击批量使用要传选中的物品id列表过来 // --@return // --==============================-- openBatchUseItemView: function openBatchUseItemView(status, item, type, select_vo) { if (status == false) { if (this.batch_use != null) { this.batch_use.close(); this.batch_use = null; } } else { if (item == null || item.config == null) return; if (this.batch_use == null) { this.batch_use = Utils.createClass("backpack_batchuse_window", this); } if (this.batch_use && this.batch_use.isOpen() == false) { this.batch_use.open([item, type, select_vo]); } } }, /** * 打开出售物品界面展示 * author:{author} * @status: * @list: * return */ openSellWindow: function openSellWindow(status, bag_code, list) { if (status == false) { if (this.sell_window != null) { this.sell_window.close(); this.sell_window = null; } } else { bag_code = bag_code || BackPackConst.Bag_Code.BACKPACK; if (list == null || Utils.next(list) == null) return; if (this.sell_window == null) { this.sell_window = Utils.createClass("backpack_sell_window", this); } if (this.sell_window.isOpen() == false) { this.sell_window.open(bag_code, list); } } }, openGiftSelectPanel: function openGiftSelectPanel(gift_vo) { if (this.gift_panel == null) { this.gift_panel = Utils.createClass("gift_select_window", this); } if (this.gift_panel && this.gift_panel.isOpen() == false) { this.gift_panel.open(gift_vo); } }, closeGiftSelectPanel: function closeGiftSelectPanel() { if (this.gift_panel != null) { this.gift_panel.close(); this.gift_panel = null; } }, //跳转物品来源的 gotoItemSources: function gotoItemSources(evt_type, extend, bid, need_item_list) { if (evt_type == null || extend == null) return; if (evt_type == "evt_partner_call") { //召唤 JumpController.getInstance().jumpViewByEvtData([1]); } else if (evt_type == "evt_mall_buy") { //商城 if (extend[0]) { JumpController.getInstance().jumpViewByEvtData([15, extend[0], bid]); } } else if (evt_type == "evt_vip") { //vip JumpController.getInstance().jumpViewByEvtData([7, VIPTABCONST.VIP, extend[0]]); } else if (evt_type == "evt_boss") {//个人BOSS挑战 } else if (evt_type == "evt_world_boss") {//世界boss } else if (evt_type == "evt_tower") { //星命塔 JumpController.getInstance().jumpViewByEvtData([12]); } else if (evt_type == "evt_divination") {//占卜 // AuguryController:getInstance():openMainView(true) } else if (evt_type == "evt_dun_chapter") { //剧情副本 JumpController.getInstance().jumpViewByEvtData([5]); } else if (evt_type == "evt_gold_market") {//金币市场 } else if (evt_type == "evt_silver_market") {//银币市场 } else if (evt_type == "evt_arena") { //竞技场挑战 JumpController.getInstance().jumpViewByEvtData([3]); } else if (evt_type == "evt_arena_box") { //竞技场宝箱 JumpController.getInstance().jumpViewByEvtData([3]); } else if (evt_type == "evt_bag_eqm") { //装备背包 JumpController.getInstance().jumpViewByEvtData([8, BackPackConst.item_tab_type.EQUIPS]); } else if (evt_type == "evt_bag_partner") { //英雄背包 JumpController.getInstance().jumpViewByEvtData([8, BackPackConst.item_tab_type.HERO]); } else if (evt_type == "evt_dun_stone") { //宝石副本 JumpController.getInstance().jumpViewByEvtData([17]); } else if (evt_type == "evt_bag_star_life") { //特殊背包 JumpController.getInstance().jumpViewByEvtData([8, BackPackConst.item_tab_type.SPECIAL]); } else if (evt_type == "evt_friend") { //好友 JumpController.getInstance().jumpViewByEvtData([4]); } else if (evt_type == "evt_league") { JumpController.getInstance().jumpViewByEvtData([14]); } else if (evt_type == "evt_league_dungeon") { //公会副本 JumpController.getInstance().jumpViewByEvtData([31]); } else if (evt_type == "evt_league_donate") { //公会捐献 JumpController.getInstance().jumpViewByEvtData([13]); } else if (evt_type == "evt_league_sail") { //公会远航 JumpController.getInstance().jumpViewByEvtData([18]); } else if (evt_type == "evt_league_skill") { //公会技能 JumpController.getInstance().jumpViewByEvtData([32]); } else if (evt_type == "evt_league_shop") { //公会商店 var MallConst = require("mall_const"); JumpController.getInstance().jumpViewByEvtData([15, MallConst.MallType.UnionShop]); } else if (evt_type == "evt_league_redpacket") { //公会红包 JumpController.getInstance().jumpViewByEvtData([33]); } else if (evt_type == "evt_league_war") { //公会战 JumpController.getInstance().jumpViewByEvtData([21]); } else if (evt_type == "evt_god_world") { //神界冒险 JumpController.getInstance().jumpViewByEvtData([34]); } else if (evt_type == "evt_league_help") {//帮内求助 } else if (evt_type == "evt_exchange") { //兑换 JumpController.getInstance().jumpViewByEvtData([35]); } else if (evt_type == "evt_arena_champion") { //冠军赛 JumpController.getInstance().jumpViewByEvtData([36]); } else if (evt_type == "evt_endless") { //无尽试炼 JumpController.getInstance().jumpViewByEvtData([43]); } else if (evt_type == "evt_partner_power") {//神将召唤 // var PartnersummonController = require("partnersummon_controller"); // PartnersummonController.getInstance().openGodPartnerSummonView(true) } else if (evt_type == "evt_hero") {//神将召唤 } else if (evt_type == "evt_pet") { //萌宠 var MainuiController = require("mainui_controller"); var BattleConst = require("battle_const"); MainuiController.getInstance().requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Escort); } else if (evt_type == "evt_shengqi") { //圣器 JumpController.getInstance().jumpViewByEvtData([20]); } else if (evt_type == "evt_xingming") { //星命 JumpController.getInstance().jumpViewByEvtData([12]); } else if (evt_type == "evt_primus") { // var PrimusController = require("primus_controller"); // PrimusController.getInstance().openPrimusMainWindow(true); JumpController.getInstance().jumpViewByEvtData([27]); } else if (evt_type == "evt_skyladder") { JumpController.getInstance().jumpViewByEvtData([29]); } else if (evt_type == "evt_skyshop") { JumpController.getInstance().jumpViewByEvtData([37]); } else if (evt_type == "evt_change") { //充值 JumpController.getInstance().jumpViewByEvtData([7]); } else if (evt_type == "evt_yueke") {//月卡 } else if (evt_type == "evt_invest") { //投资计划 JumpController.getInstance().jumpViewByEvtData([38]); } else if (evt_type == "evt_growfund") { //成长资金 JumpController.getInstance().jumpViewByEvtData([39]); } else if (evt_type == "evt_partner") { //打开英雄界面 JumpController.getInstance().jumpViewByEvtData([19]); } else if (evt_type == "evt_partner_gemstone") {//打开宝石界面 } else if (evt_type == "evt_lucky_treasure" || evt_type == "evt_treasure") { //打开幸运探宝 JumpController.getInstance().jumpViewByEvtData([40]); } else if (evt_type == "evt_recruit_high") { //先知召唤 先知殿 var SeerpalaceConst = require("seerpalace_const"); JumpController.getInstance().jumpViewByEvtData([24, SeerpalaceConst.Tab_Index.Summon]); } else if (evt_type == "evt_hero_conversion") { //先知召唤 英雄转换 var SeerpalaceConst = require("seerpalace_const"); JumpController.getInstance().jumpViewByEvtData([24, SeerpalaceConst.Tab_Index.Change]); } else if (evt_type == "evt_partner_synthesis") { //融合祭坛 JumpController.getInstance().jumpViewByEvtData([23]); } else if (evt_type == "evt_partner_decompose") { //祭祀小屋 JumpController.getInstance().jumpViewByEvtData([22]); } else if (evt_type == "evt_partner_eqm_synthesis") { //锻造屋 JumpController.getInstance().jumpViewByEvtData([26]); } else if (evt_type == "evt_expedition") { //英雄远征 JumpController.getInstance().jumpViewByEvtData([25]); } else if (evt_type == "evt_grocery_store") { //杂货店 JumpController.getInstance().jumpViewByEvtData([6]); } else if (evt_type == "evt_daily_quest") { //日常任务进度宝箱获得! JumpController.getInstance().jumpViewByEvtData([41]); } else if (evt_type == "evt_achievement") { //完成成就任务获得! var TaskConst = require("task_const"); JumpController.getInstance().jumpViewByEvtData([41, TaskConst.type.feat]); } else if (evt_type == "evt_rune_synthesis") { var ForgeHouseConst = require("forgehouse_const"); JumpController.getInstance().jumpViewByEvtData([26, ForgeHouseConst.Tab_Index.Artifact]); } else if (evt_type == "evt_skillshop") { var MallConst = require("mall_const"); JumpController.getInstance().jumpViewByEvtData([15, MallConst.MallType.SkillShop]); } else if (evt_type == "evt_eliteshop") { var MallConst = require("mall_const"); JumpController.getInstance().jumpViewByEvtData([15, MallConst.MallType.EliteShop]); } else if (evt_type == "evt_elitematch") { //精英赛 JumpController.getInstance().jumpViewByEvtData([28]); } else if (evt_type == "evt_element_temple") { //元素圣殿 JumpController.getInstance().jumpViewByEvtData([42]); } else { message("暂无跳转,或者还没添加!"); } }, getBackpackRoot: function getBackpackRoot() { if (this.backpack_win) return this.backpack_win.root_wnd; } }); module.exports = BackpackController; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYWNrcGFja1xcYmFja3BhY2tfY29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJCYWNrUGFja0NvbnN0IiwicmVxdWlyZSIsIk1haW51aUNvbnRyb2xsZXIiLCJNYWludWlDb25zdCIsIkJhY2twYWNrRXZlbnQiLCJKdW1wQ29udHJvbGxlciIsIlRpcHNDb250cm9sbGVyIiwiR3VpZGVDb250cm9sbGVyIiwiQmFja3BhY2tDb250cm9sbGVyIiwiY2MiLCJDbGFzcyIsIkJhc2VDb250cm9sbGVyIiwiY3RvciIsImluaXRDb25maWciLCJCYWNrcGFja01vZGVsIiwibW9kZWwiLCJnZXRNb2RlbCIsInJlZ2lzdGVyRXZlbnRzIiwibG9naW5fZXZlbnRfc3VjY2VzcyIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJiaW5kIiwiRXZlbnRJZCIsIkVWVF9ST0xFX0NSRUFURV9TVUNDRVNTIiwicmVxdWVzdEluaXRQcm90byIsInJlX2xpbmtfZ2FtZSIsIkVWVF9SRV9MSU5LX0dBTUUiLCJnZXRJbnN0YW5jZSIsImlzSW5HdWlkZSIsIm9wZW5NYWluV2luZG93IiwicmVnaXN0ZXJQcm90b2NhbHMiLCJSZWdpc3RlclByb3RvY2FsIiwib24xMDUwMCIsIm9uMTA1MDEiLCJvbjEwNTEwIiwib24xMDUxMSIsIm9uMTA1MTIiLCJoYW5kbGUxMDUxNSIsImhhbmRsZTEwNTIyIiwiaGFuZGxlMTA1MjMiLCJoYW5kbGUxMTAwOCIsInNlbmRlcjEwNTAwIiwiU2VuZFByb3RvY2FsIiwic2VuZGVyMTA1MDEiLCJkYXRhIiwiYmFnX2NvZGUiLCJCYWdfQ29kZSIsIkJBQ0tQQUNLIiwiaW5pdEl0ZW1MaXN0IiwiRVFVSVBTIiwibG9nIiwidXBkYXRlQmFnSXRlbXNOdW0iLCJkZWxldGVCYWdJdGVtcyIsInNlbmRlcjEwNTIyIiwic3RvcmFnZSIsImFyZ3MiLCJwcm90b2NhbCIsIm1lc3NhZ2UiLCJtc2ciLCJiYXRjaF91c2UiLCJvcGVuQmF0Y2hVc2VJdGVtVmlldyIsInNlbGxfd2luZG93Iiwib3BlblNlbGxXaW5kb3ciLCJjbG9zZUdpZnRTZWxlY3RQYW5lbCIsImZpcmUiLCJTZWxsX0dvb2RzX1N1Y2Nlc3MiLCJzZW5kZXIxMDUxNSIsImlkIiwicXVhbnRpdHkiLCJmbGFnIiwic2VuZGVyMTA1MjMiLCJudW0iLCJDb21wb3NlX0dvb2RzX1N1Y2Nlc3MiLCJzaG93QmFja1BhY2tDb21wVGlwcyIsInNlbmRlcjExMDA4IiwiYmlkIiwicHJvdG8iLCJDb21wb3NlX0JhY2tQYWNrX1N1Y2Nlc3MiLCJzaG93Q29tcENob29zZVRpcHMiLCJyZXN1bHQiLCJpdGVtcyIsImkiLCJwYXJ0bmVycyIsInYiLCJpbmZvIiwiQ29uZmlnIiwicGFydG5lcl9kYXRhIiwiZGF0YV9wYXJ0bmVyX2Jhc2UiLCJwYXJ0bmVyX2JpZCIsInBhcnNlSW50Iiwic3RhciIsImluaXRfc3RhciIsImNhbXBfdHlwZSIsInNob3dfdHlwZSIsIml0ZW1fZXhoaWJpdGlvbl90eXBlIiwicGFydG5lcl90eXBlIiwib3BlbkdldEl0ZW1WaWV3Iiwic3RhdHVzIiwicGFyYW1zIiwiYmFja3BhY2tfd2luIiwiY2xvc2UiLCJVdGlscyIsImNyZWF0ZUNsYXNzIiwib3BlbiIsIm9wZW5UaXBzU291cmNlIiwiZXh0ZW5kX2RhdGEiLCJpdGVtX2xpc3QiLCJnZXRJdGVtQ29uZmlnIiwidGlwc19zb3VyY2UiLCJUaXBzU291cmNlIiwib3Blbl9wYXJhbXMiLCJvcGVuSXRlbVNlbGxQYW5lbCIsImdvb2RzX3ZvIiwiaXRlbV9zZWxsX3BhbmVsIiwiaXNPcGVuIiwiaXRlbSIsInR5cGUiLCJzZWxlY3Rfdm8iLCJjb25maWciLCJsaXN0IiwibmV4dCIsIm9wZW5HaWZ0U2VsZWN0UGFuZWwiLCJnaWZ0X3ZvIiwiZ2lmdF9wYW5lbCIsImdvdG9JdGVtU291cmNlcyIsImV2dF90eXBlIiwiZXh0ZW5kIiwibmVlZF9pdGVtX2xpc3QiLCJqdW1wVmlld0J5RXZ0RGF0YSIsIlZJUFRBQkNPTlNUIiwiVklQIiwiaXRlbV90YWJfdHlwZSIsIkhFUk8iLCJTUEVDSUFMIiwiTWFsbENvbnN0IiwiTWFsbFR5cGUiLCJVbmlvblNob3AiLCJCYXR0bGVDb25zdCIsInJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93IiwiRmlnaHRfVHlwZSIsIkVzY29ydCIsIlNlZXJwYWxhY2VDb25zdCIsIlRhYl9JbmRleCIsIlN1bW1vbiIsIkNoYW5nZSIsIlRhc2tDb25zdCIsImZlYXQiLCJGb3JnZUhvdXNlQ29uc3QiLCJBcnRpZmFjdCIsIlNraWxsU2hvcCIsIkVsaXRlU2hvcCIsImdldEJhY2twYWNrUm9vdCIsInJvb3Rfd25kIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxhQUFhLEdBQUdDLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJQyxnQkFBZ0IsR0FBR0QsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlFLFdBQVcsR0FBR0YsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsSUFBSUcsYUFBYSxHQUFHSCxPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSUksY0FBYyxHQUFHSixPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUssY0FBYyxHQUFHTCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSU0sZUFBZSxHQUFHTixPQUFPLENBQUMsa0JBQUQsQ0FBN0I7O0FBRUEsSUFBSU8sa0JBQWtCLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQzlCLGFBQVNDLGNBRHFCO0FBRTlCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVksQ0FDakIsQ0FINkI7QUFLOUI7QUFDQUMsRUFBQUEsVUFBVSxFQUFFLHNCQUFZO0FBQ3BCLFFBQUlDLGFBQWEsR0FBR2IsT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUNBLFNBQUtjLEtBQUwsR0FBYSxJQUFJRCxhQUFK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QSxJQUFHeEIsUUFBUSxJQUFJLGVBQWYsRUFBK0I7QUFDakMsVUFBSVMsU0FBUyxHQUFHckksT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0FJLE1BQUFBLGNBQWMsQ0FBQ3NCLFdBQWYsR0FBNkJxRyxpQkFBN0IsQ0FBK0MsQ0FBQyxFQUFELEVBQUtNLFNBQVMsQ0FBQ0MsUUFBVixDQUFtQmUsU0FBeEIsQ0FBL0M7QUFDSCxLQUhLLE1BR0EsSUFBR3pCLFFBQVEsSUFBSSxnQkFBZixFQUFnQztBQUFDO0FBQ25DeEgsTUFBQUEsY0FBYyxDQUFDc0IsV0FBZixHQUE2QnFHLGlCQUE3QixDQUErQyxDQUFDLEVBQUQsQ0FBL0M7QUFDSCxLQUZLLE1BRUEsSUFBR0gsUUFBUSxJQUFJLG9CQUFmLEVBQW9DO0FBQUM7QUFDdkN4SCxNQUFBQSxjQUFjLENBQUNzQixXQUFmLEdBQTZCcUcsaUJBQTdCLENBQStDLENBQUMsRUFBRCxDQUEvQztBQUNILEtBRkssTUFFQTtBQUNGdkUsTUFBQUEsT0FBTyxDQUFDLGNBQUQsQ0FBUDtBQUNIO0FBQ0osR0FoZDZCO0FBa2Q5QjhGLEVBQUFBLGVBQWUsRUFBRSwyQkFBVztBQUN4QixRQUFJLEtBQUtwRCxZQUFULEVBQ0ksT0FBTyxLQUFLQSxZQUFMLENBQWtCcUQsUUFBekI7QUFDUDtBQXJkNkIsQ0FBVCxDQUF6QjtBQXdkQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCbEosa0JBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOiDjOWMheWGheWHuuWUrueJqeWTgeeahOmdouadv1xuLy8gPGJyLz5DcmVhdGU6IDIwMTgtMTItMjQgMTY6NTA6MTRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgQmFja1BhY2tDb25zdCA9IHJlcXVpcmUoXCJiYWNrcGFja19jb25zdFwiKTtcbnZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xudmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcbnZhciBCYWNrcGFja0V2ZW50ID0gcmVxdWlyZShcImJhY2twYWNrX2V2ZW50XCIpO1xudmFyIEp1bXBDb250cm9sbGVyID0gcmVxdWlyZShcImp1bXBfY29udHJvbGxlclwiKTtcbnZhciBUaXBzQ29udHJvbGxlciA9IHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIilcbnZhciBHdWlkZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpZGVfY29udHJvbGxlclwiKTtcblxudmFyIEJhY2twYWNrQ29udHJvbGxlciA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ29udHJvbGxlcixcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMlumFjee9ruaVsOaNrlxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEJhY2twYWNrTW9kZWwgPSByZXF1aXJlKFwiYmFja3BhY2tfbW9kZWxcIik7XG4gICAgICAgIHRoaXMubW9kZWwgPSBuZXcgQmFja3BhY2tNb2RlbCgpO1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcbiAgICB9LFxuXG4gICAgLy8g6L+U5Zue5b2T5YmN55qEbW9kZWxcbiAgICBnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9naW5fZXZlbnRfc3VjY2VzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luX2V2ZW50X3N1Y2Nlc3MgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MsIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5pdFByb3RvKClcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZV9saW5rX2dhbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZV9saW5rX2dhbWUgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JFX0xJTktfR0FNRSwgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgR3VpZGVDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWRlX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgaWYgKCFHdWlkZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5pc0luR3VpZGUoKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuTWFpbldpbmRvdyhmYWxzZSkgIC8vIOaWree6v+mHjei/nuWFiOWFs+aOieiDjOWMheeql+S9k1xuXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5yZXF1ZXN0SW5pdFByb3RvKClcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM5Y2P6K6u5o6l5Y+X5LqL5Lu2XG4gICAgcmVnaXN0ZXJQcm90b2NhbHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwNTAwLCB0aGlzLm9uMTA1MDApO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTA1MDEsIHRoaXMub24xMDUwMSk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMDUxMCwgdGhpcy5vbjEwNTEwKTsgICAgLy/lop7liqDnianlk4HpgJrnn6VcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwNTExLCB0aGlzLm9uMTA1MTEpOyAgICAvL+WIoOmZpOeJqeWTgemAmuefpVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTA1MTIsIHRoaXMub24xMDUxMik7ICAgIC8v5Yi35paw54mp5ZOB6YCa55+lXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMDUxNSwgdGhpcy5oYW5kbGUxMDUxNSk7Ly/kvb/nlKjnianlk4FcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDEwNTIyLCB0aGlzLmhhbmRsZTEwNTIyKTsvL+WHuuWUruiDjOWMheeJqeWTgVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTA1MjMsIHRoaXMuaGFuZGxlMTA1MjMpO1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwMDgsIHRoaXMuaGFuZGxlMTEwMDgpO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgfSxcblxuICAgIC8vIOivt+axguinkuiJsumBk+WFt+WIneWni+aVsOaNrlxuICAgIHJlcXVlc3RJbml0UHJvdG86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhpcy5zZW5kZXIxMDUwMCgpXG4gICAgICAgIC8vIHRoaXMuc2VuZGVyMTA1MDEoKVxuICAgIH0sXG5cbiAgICBzZW5kZXIxMDUwMDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMDUwMCwge30pO1xuICAgIH0sXG5cbiAgICBzZW5kZXIxMDUwMTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMDUwMSwge30pO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbpgZPlhbfog4zljIVcbiAgICBvbjEwNTAwOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBkYXRhLmJhZ19jb2RlID0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDS1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRJdGVtTGlzdChkYXRhKVxuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJboo4XlpIfooqvmm51cbiAgICBvbjEwNTAxOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBkYXRhLmJhZ19jb2RlID0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5FUVVJUFNcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0SXRlbUxpc3QoZGF0YSlcbiAgICB9LFxuXG4gICAgLy8g5aKe5Yqg5LiA5Liq54mp5ZOBXG4gICAgb24xMDUxMDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgY2MubG9nKFwi5aKe5Yqg5LiA5Liq54mp5ZOBXCIsZGF0YSlcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVCYWdJdGVtc051bShkYXRhKVxuICAgIH0sXG5cbiAgICAvLyDliKDpmaTkuIDkuKrnianlk4FcbiAgICBvbjEwNTExOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBjYy5sb2coXCLliKDpmaTkuIDkuKrnianlk4FcIixkYXRhKVxuICAgICAgICB0aGlzLm1vZGVsLmRlbGV0ZUJhZ0l0ZW1zKGRhdGEpXG4gICAgfSxcblxuICAgIC8vIOWIt+aWsOS4gOS4queJqeWTgVxuICAgIG9uMTA1MTI6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRoaXMubW9kZWwudXBkYXRlQmFnSXRlbXNOdW0oZGF0YSwgdHJ1ZSlcbiAgICB9LFxuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gZGVzYzrlh7rllK7nianlk4FcbiAgICAvLyBAc3RvcmFnZTpcbiAgICAvLyBAYXJnczpcbiAgICAvLyBAcmV0dXJuIFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHNlbmRlcjEwNTIyOmZ1bmN0aW9uKHN0b3JhZ2UsYXJncyl7XG4gICAgICAgIHZhciBwcm90b2NhbCA9e307XG4gICAgICAgIHByb3RvY2FsLnN0b3JhZ2UgPSBzdG9yYWdlO1xuICAgICAgICBwcm90b2NhbC5hcmdzID0gYXJncztcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTA1MjIscHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMDUyMjpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZykgICBcbiAgICAgICAgaWYodGhpcy5iYXRjaF91c2UpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkJhdGNoVXNlSXRlbVZpZXcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuc2VsbF93aW5kb3cpey8v5Ye65ZSu5oiQ5Yqf5LmL5ZCO5YWz6Zet5Ye65ZSu6Z2i5p2/XG4gICAgICAgICAgICB0aGlzLm9wZW5TZWxsV2luZG93KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlR2lmdFNlbGVjdFBhbmVsKCk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoQmFja3BhY2tFdmVudC5TZWxsX0dvb2RzX1N1Y2Nlc3MpO1xuICAgIH0sXG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBkZXNjOuS9v+eUqOeJqeWTgVxuICAgIC8vIEBpZDpcbiAgICAvLyBAcXVhbnRpdHk6XG4gICAgLy8gQGFyZ3M6XG4gICAgLy8gQHJldHVybiBcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBzZW5kZXIxMDUxNTpmdW5jdGlvbihpZCxxdWFudGl0eSxhcmdzKXtcbiAgICAgICAgdmFyIHByb3RvY2FsID17fVxuICAgICAgICBwcm90b2NhbC5pZCA9IGlkXG4gICAgICAgIHByb3RvY2FsLnF1YW50aXR5ID0gcXVhbnRpdHlcbiAgICAgICAgcHJvdG9jYWwuYXJncyA9IGFyZ3MgfHwge307XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDEwNTE1LHByb3RvY2FsKVxuICAgIH0sXG5cbiAgICBoYW5kbGUxMDUxNTpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmKGRhdGEuZmxhZyA9PSAxKXtcbiAgICAgICAgICAgIHRoaXMub3BlbkJhdGNoVXNlSXRlbVZpZXcoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZUdpZnRTZWxlY3RQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjEwNTIzOmZ1bmN0aW9uKGlkLG51bSl7XG4gICAgICAgIHZhciBwcm90b2NhbCA9e307XG4gICAgICAgIHByb3RvY2FsLmlkID0gaWQ7XG4gICAgICAgIHByb3RvY2FsLm51bSA9IG51bTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTA1MjMscHJvdG9jYWwpO1xuICAgIH0sXG4gICAgIFxuICAgIGhhbmRsZTEwNTIzOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYoZGF0YS5mbGFnID09IDEpe1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShCYWNrcGFja0V2ZW50LkNvbXBvc2VfR29vZHNfU3VjY2Vzcyk7XG4gICAgICAgICAgICBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNob3dCYWNrUGFja0NvbXBUaXBzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iDjOWMheeijueJh+WQiOaIkFxuICAgIHNlbmRlcjExMDA4OmZ1bmN0aW9uKGJpZCxudW0pe1xuICAgICAgICB2YXIgcHJvdG8gPSB7fTtcbiAgICAgICAgcHJvdG8uYmlkID0gYmlkO1xuICAgICAgICBwcm90by5udW0gPSBudW07XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDA4LCBwcm90byk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDA4OmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEJhY2twYWNrRXZlbnQuQ29tcG9zZV9CYWNrUGFja19TdWNjZXNzKTtcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIFRpcHNDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2hvd0JhY2tQYWNrQ29tcFRpcHMoZmFsc2UpO1xuICAgICAgICBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNob3dDb21wQ2hvb3NlVGlwcyhmYWxzZSk7XG4gICAgICAgIGlmKGRhdGEucmVzdWx0ID09IDEpe1xuICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGkgaW4gZGF0YS5wYXJ0bmVycyl7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBkYXRhLnBhcnRuZXJzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBpbmZvID0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX3BhcnRuZXJfYmFzZVt2LnBhcnRuZXJfYmlkXTtcbiAgICAgICAgICAgICAgICBpdGVtc1twYXJzZUludChpKV0gPSB7fTtcbiAgICAgICAgICAgICAgICBpdGVtc1twYXJzZUludChpKV0uYmlkID0gdi5wYXJ0bmVyX2JpZDtcbiAgICAgICAgICAgICAgICBpdGVtc1twYXJzZUludChpKV0uc3RhciA9IGluZm8uaW5pdF9zdGFyO1xuICAgICAgICAgICAgICAgIGl0ZW1zW3BhcnNlSW50KGkpXS5jYW1wX3R5cGUgPSBpbmZvLmNhbXBfdHlwZTtcbiAgICAgICAgICAgICAgICBpdGVtc1twYXJzZUludChpKV0uc2hvd190eXBlID0gTWFpbnVpQ29uc3QuaXRlbV9leGhpYml0aW9uX3R5cGUucGFydG5lcl90eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5HZXRJdGVtVmlldyh0cnVlLCBpdGVtcywgMClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmiZPlvIDog4zljIXkuLvlhaXlj6NcbiAgICAgKiBAcGFyYW0geyp9IHN0YXR1cyBcbiAgICAgKiBAcGFyYW0geyp9IHBhcmFtcyBcbiAgICAgKi9cbiAgICBvcGVuTWFpbldpbmRvdzogZnVuY3Rpb24gKHN0YXR1cywgcGFyYW1zKSB7XG4gICAgICAgIGlmICghc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5iYWNrcGFja193aW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJhY2twYWNrX3dpbi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFja3BhY2tfd2luID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJhY2twYWNrX3dpbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iYWNrcGFja193aW4gPSBVdGlscy5jcmVhdGVDbGFzcyhcImJhY2twYWNrX3dpbmRvd1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iYWNrcGFja193aW4ub3BlbihwYXJhbXMpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pi+56S66YGT5YW35o+Q56S65L+h5oGvXG4gICAgICogQGF1dGhvciB6aGFuZ2h1eGluZyAyMDE5LTAxLTIxXG4gICAgICogQHBhcmFtICB7W3R5cGVdfSBzdGF0dXMgICAgICBbZGVzY3JpcHRpb25dXG4gICAgICogQHBhcmFtICB7W3R5cGVdfSBkYXRhICAgICAgICDlj6/ku6XmmK9iaWQsIOaIluiAhemFjee9ruihqOadoeebrlxuICAgICAqIEBwYXJhbSAge1t0eXBlXX0gZXh0ZW5kX2RhdGEgW2Rlc2NyaXB0aW9uXVxuICAgICAqIEBwYXJhbSAge1t0eXBlXX0gaXRlbV9saXN0ICAg6ZyA6KaB55qE54mp5ZOB5YiX6KGoXG4gICAgICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAgICovXG4gICAgb3BlblRpcHNTb3VyY2U6IGZ1bmN0aW9uIChzdGF0dXMsIGRhdGEsIGV4dGVuZF9kYXRhLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYoR3VpZGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaXNJbkd1aWRlKCkpcmV0dXJuO1xuXG4gICAgICAgICAgICBpZih0eXBlb2YoZGF0YSkgPT0gXCJudW1iZXJcIil7XG4gICAgICAgICAgICAgICAgZGF0YSA9IFV0aWxzLmdldEl0ZW1Db25maWcoZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGRhdGEgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpcHNfc291cmNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIFRpcHNTb3VyY2UgPSByZXF1aXJlKFwidGlwc19zb3VyY2Vfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudGlwc19zb3VyY2UgPSBuZXcgVGlwc1NvdXJjZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmICh0eXBlb2YgZGF0YSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAvLyAgICAgZGF0YSA9IFV0aWxzLmdldEl0ZW1Db25maWcoZGF0YSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB2YXIgb3Blbl9wYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIG9wZW5fcGFyYW1zLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgb3Blbl9wYXJhbXMuZXh0ZW5kX2RhdGEgPSBleHRlbmRfZGF0YTtcbiAgICAgICAgICAgIG9wZW5fcGFyYW1zLml0ZW1fbGlzdCA9IGl0ZW1fbGlzdDtcbiAgICAgICAgICAgIHRoaXMudGlwc19zb3VyY2Uub3BlbihvcGVuX3BhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy50aXBzX3NvdXJjZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGlwc19zb3VyY2UuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRpcHNfc291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBkZXNjOuWHuuWUrueJqeWTgSAgXG4gICAgICovXG4gICAgb3Blbkl0ZW1TZWxsUGFuZWw6ZnVuY3Rpb24oc3RhdHVzLCBnb29kc192bywgYmFnX2NvZGUpe1xuICAgICAgICBpZihzdGF0dXMgPT0gZmFsc2Upe1xuICAgICAgICAgICAgaWYodGhpcy5pdGVtX3NlbGxfcGFuZWwgIT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX3NlbGxfcGFuZWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fc2VsbF9wYW5lbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdmFyIGJhZ19jb2RlID0gYmFnX2NvZGUgfHwgQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSztcbiAgICAgICAgICAgIGlmKHRoaXMuaXRlbV9zZWxsX3BhbmVsID09IG51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9zZWxsX3BhbmVsID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJpdGVtX3NlbGxfcGFuZWxfd2luZG93XCIsdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLml0ZW1fc2VsbF9wYW5lbC5pc09wZW4oKSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX3NlbGxfcGFuZWwub3BlbihbZ29vZHNfdm8sIGJhZ19jb2RlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIC0tZGVzYzrmiZPlvIDmibnph4/kvb/nlKjnianlk4Hnqpflj6NcbiAgICAvLyAtLUBpdGVtOuW/hemhu+aYr+eJqeWTgeecn+aYr+aVsOaNrlxuICAgIC8vIC0tQHR5cGU65Ye65ZSu5oiW6ICF5L2/55SoXG4gICAgLy8gLS1Ac2VsZWN0X3ZvIDroh6rpgInnpLzljIXngrnlh7vmibnph4/kvb/nlKjopoHkvKDpgInkuK3nmoTnianlk4FpZOWIl+ihqOi/h+adpVxuICAgIC8vIC0tQHJldHVybiBcbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgb3BlbkJhdGNoVXNlSXRlbVZpZXc6ZnVuY3Rpb24oc3RhdHVzLCBpdGVtLCB0eXBlLHNlbGVjdF92byl7XG4gICAgICAgIGlmKHN0YXR1cyA9PSBmYWxzZSl7XG4gICAgICAgICAgICBpZih0aGlzLmJhdGNoX3VzZSAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdGNoX3VzZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmF0Y2hfdXNlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZihpdGVtID09IG51bGwgfHwgaXRlbS5jb25maWcgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLmJhdGNoX3VzZSA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmJhdGNoX3VzZSA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYmFja3BhY2tfYmF0Y2h1c2Vfd2luZG93XCIsdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmJhdGNoX3VzZSAmJiB0aGlzLmJhdGNoX3VzZS5pc09wZW4oKSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXRjaF91c2Uub3BlbihbaXRlbSwgdHlwZSxzZWxlY3Rfdm9dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmiZPlvIDlh7rllK7nianlk4HnlYzpnaLlsZXnpLpcbiAgICAgKiBhdXRob3I6e2F1dGhvcn1cbiAgICAgKiBAc3RhdHVzOlxuICAgICAqIEBsaXN0OiBcbiAgICAgKiByZXR1cm5cbiAgICAgKi9cbiAgICBvcGVuU2VsbFdpbmRvdzpmdW5jdGlvbihzdGF0dXMsIGJhZ19jb2RlLCBsaXN0KXtcbiAgICAgICAgaWYoc3RhdHVzID09IGZhbHNlKXtcbiAgICAgICAgICAgIGlmKHRoaXMuc2VsbF93aW5kb3cgIT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxsX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsbF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGJhZ19jb2RlID0gYmFnX2NvZGUgfHwgQmFja1BhY2tDb25zdC5CYWdfQ29kZS5CQUNLUEFDSztcbiAgICAgICAgICAgIGlmKGxpc3QgPT0gbnVsbCB8fCBVdGlscy5uZXh0KGxpc3QpID09IG51bGwpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy5zZWxsX3dpbmRvdyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGxfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJiYWNrcGFja19zZWxsX3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5zZWxsX3dpbmRvdy5pc09wZW4oKSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxsX3dpbmRvdy5vcGVuKGJhZ19jb2RlLCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBvcGVuR2lmdFNlbGVjdFBhbmVsOmZ1bmN0aW9uKGdpZnRfdm8pe1xuICAgICAgICBpZih0aGlzLmdpZnRfcGFuZWwgPT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLmdpZnRfcGFuZWwgPSBVdGlscy5jcmVhdGVDbGFzcyhcImdpZnRfc2VsZWN0X3dpbmRvd1wiLHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuZ2lmdF9wYW5lbCAmJiB0aGlzLmdpZnRfcGFuZWwuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgdGhpcy5naWZ0X3BhbmVsLm9wZW4oZ2lmdF92byk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VHaWZ0U2VsZWN0UGFuZWw6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5naWZ0X3BhbmVsICE9IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5naWZ0X3BhbmVsLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmdpZnRfcGFuZWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6Lez6L2s54mp5ZOB5p2l5rqQ55qEXG4gICAgZ290b0l0ZW1Tb3VyY2VzOiBmdW5jdGlvbiAoZXZ0X3R5cGUsIGV4dGVuZCwgYmlkLCBuZWVkX2l0ZW1fbGlzdCkge1xuICAgICAgICBpZiAoZXZ0X3R5cGUgPT0gbnVsbCB8fCBleHRlbmQgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIGlmIChldnRfdHlwZSA9PSBcImV2dF9wYXJ0bmVyX2NhbGxcIikgeyAgIC8v5Y+s5ZSkXG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFsxXSk7XG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X21hbGxfYnV5XCIpey8v5ZWG5Z+OXG4gICAgICAgICAgICBpZihleHRlbmRbMF0pe1xuICAgICAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzE1LCBleHRlbmRbMF0sIGJpZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF92aXBcIil7Ly92aXBcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzcsIFZJUFRBQkNPTlNULlZJUCwgZXh0ZW5kWzBdXSk7XG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X2Jvc3NcIil7Ly/kuKrkurpCT1NT5oyR5oiYXG5cbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfd29ybGRfYm9zc1wiKXsvL+S4lueVjGJvc3NcblxuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF90b3dlclwiKXsvL+aYn+WRveWhlFxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMTJdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfZGl2aW5hdGlvblwiKXsvL+WNoOWNnFxuICAgICAgICAgICAgLy8gQXVndXJ5Q29udHJvbGxlcjpnZXRJbnN0YW5jZSgpOm9wZW5NYWluVmlldyh0cnVlKVxuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9kdW5fY2hhcHRlclwiKXsvL+WJp+aDheWJr+acrFxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbNV0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9nb2xkX21hcmtldFwiKXsvL+mHkeW4geW4guWculxuXG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X3NpbHZlcl9tYXJrZXRcIil7Ly/pk7bluIHluILlnLpcblxuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9hcmVuYVwiKXsvL+ernuaKgOWcuuaMkeaImFxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbM10pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9hcmVuYV9ib3hcIil7Ly/nq57mioDlnLrlrp3nrrFcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzNdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfYmFnX2VxbVwiKXsvL+ijheWkh+iDjOWMhVxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbOCwgQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkVRVUlQU10pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9iYWdfcGFydG5lclwiKXsvL+iLsembhOiDjOWMhVxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbOCwgQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkhFUk9dKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfZHVuX3N0b25lXCIpey8v5a6d55+z5Ymv5pysXG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFsxN10pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9iYWdfc3Rhcl9saWZlXCIpey8v54m55q6K6IOM5YyFXG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFs4LCBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuU1BFQ0lBTF0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9mcmllbmRcIil7Ly/lpb3lj4tcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzRdKTtcbiAgICAgICAgfWVsc2UgaWYgKGV2dF90eXBlID09IFwiZXZ0X2xlYWd1ZVwiKSB7XG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFsxNF0pO1xuICAgICAgICB9IGVsc2UgaWYgKGV2dF90eXBlID09IFwiZXZ0X2xlYWd1ZV9kdW5nZW9uXCIpIHsgICAgLy/lhazkvJrlia/mnKxcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzMxXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZ0X3R5cGUgPT0gXCJldnRfbGVhZ3VlX2RvbmF0ZVwiKSB7ICAgICAvL+WFrOS8muaNkOeMrlxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMTNdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfbGVhZ3VlX3NhaWxcIil7Ly/lhazkvJrov5zoiKpcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzE4XSk7XG4gICAgICAgIH1lbHNlIGlmIChldnRfdHlwZSA9PSBcImV2dF9sZWFndWVfc2tpbGxcIikgeyAgICAgLy/lhazkvJrmioDog71cbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzMyXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZ0X3R5cGUgPT0gXCJldnRfbGVhZ3VlX3Nob3BcIikgeyAgICAgLy/lhazkvJrllYblupdcbiAgICAgICAgICAgIHZhciBNYWxsQ29uc3QgPSByZXF1aXJlKFwibWFsbF9jb25zdFwiKTtcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzE1LCBNYWxsQ29uc3QuTWFsbFR5cGUuVW5pb25TaG9wXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZ0X3R5cGUgPT0gXCJldnRfbGVhZ3VlX3JlZHBhY2tldFwiKSB7ICAgICAvL+WFrOS8mue6ouWMhVxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMzNdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfbGVhZ3VlX3dhclwiKXsvL+WFrOS8muaImFxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMjFdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfZ29kX3dvcmxkXCIpey8v56We55WM5YaS6ZmpXG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFszNF0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9sZWFndWVfaGVscFwiKXsvL+W4ruWGheaxguWKqVxuXG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X2V4Y2hhbmdlXCIpey8v5YWR5o2iXG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFszNV0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9hcmVuYV9jaGFtcGlvblwiKXsvL+WGoOWGm+i1m1xuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMzZdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfZW5kbGVzc1wiKXsvL+aXoOWwveivleeCvFxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbNDNdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfcGFydG5lcl9wb3dlclwiKXsvL+elnuWwhuWPrOWUpFxuICAgICAgICAgICAgLy8gdmFyIFBhcnRuZXJzdW1tb25Db250cm9sbGVyID0gcmVxdWlyZShcInBhcnRuZXJzdW1tb25fY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIC8vIFBhcnRuZXJzdW1tb25Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkdvZFBhcnRuZXJTdW1tb25WaWV3KHRydWUpXG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X2hlcm9cIil7Ly/npZ7lsIblj6zllKRcblxuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9wZXRcIil7Ly/okIzlrqBcbiAgICAgICAgICAgIHZhciBNYWludWlDb250cm9sbGVyICAgID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgdmFyIEJhdHRsZUNvbnN0ICAgICAgICAgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xuICAgICAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRXNjb3J0KTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfc2hlbmdxaVwiKXsvL+Wco+WZqFxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMjBdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfeGluZ21pbmdcIil7Ly/mmJ/lkb1cbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzEyXSk7XG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X3ByaW11c1wiKXtcbiAgICAgICAgICAgIC8vIHZhciBQcmltdXNDb250cm9sbGVyID0gcmVxdWlyZShcInByaW11c19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgLy8gUHJpbXVzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5QcmltdXNNYWluV2luZG93KHRydWUpO1xuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMjddKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfc2t5bGFkZGVyXCIpe1xuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMjldKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfc2t5c2hvcFwiKXtcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzM3XSk7XG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X2NoYW5nZVwiKXsvL+WFheWAvFxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbN10pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF95dWVrZVwiKXsvL+aciOWNoVxuXG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X2ludmVzdFwiKXsvL+aKlei1hOiuoeWIklxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMzhdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfZ3Jvd2Z1bmRcIil7Ly/miJDplb/otYTph5FcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzM5XSk7XG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X3BhcnRuZXJcIil7Ly/miZPlvIDoi7Hpm4TnlYzpnaJcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzE5XSk7XG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X3BhcnRuZXJfZ2Vtc3RvbmVcIil7Ly/miZPlvIDlrp3nn7PnlYzpnaJcblxuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9sdWNreV90cmVhc3VyZVwiIHx8IGV2dF90eXBlID09IFwiZXZ0X3RyZWFzdXJlXCIpey8v5omT5byA5bm46L+Q5o6i5a6dXG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFs0MF0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9yZWNydWl0X2hpZ2hcIil7Ly/lhYjnn6Xlj6zllKQg5YWI55+l5q6/XG4gICAgICAgICAgICB2YXIgU2VlcnBhbGFjZUNvbnN0ID0gcmVxdWlyZShcInNlZXJwYWxhY2VfY29uc3RcIilcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzI0LCBTZWVycGFsYWNlQ29uc3QuVGFiX0luZGV4LlN1bW1vbl0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9oZXJvX2NvbnZlcnNpb25cIil7Ly/lhYjnn6Xlj6zllKQg6Iux6ZuE6L2s5o2iXG4gICAgICAgICAgICB2YXIgU2VlcnBhbGFjZUNvbnN0ID0gcmVxdWlyZShcInNlZXJwYWxhY2VfY29uc3RcIilcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzI0LCBTZWVycGFsYWNlQ29uc3QuVGFiX0luZGV4LkNoYW5nZV0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9wYXJ0bmVyX3N5bnRoZXNpc1wiKXsvL+iejeWQiOelreWdm1xuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMjNdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfcGFydG5lcl9kZWNvbXBvc2VcIil7Ly/npa3npYDlsI/lsYtcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzIyXSk7XG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X3BhcnRuZXJfZXFtX3N5bnRoZXNpc1wiKXsvL+mUu+mAoOWxi1xuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMjZdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfZXhwZWRpdGlvblwiKXsvL+iLsembhOi/nOW+gVxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMjVdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfZ3JvY2VyeV9zdG9yZVwiKXsvL+adgui0p+W6l1xuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbNl0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9kYWlseV9xdWVzdFwiKXsvL+aXpeW4uOS7u+WKoei/m+W6puWuneeuseiOt+W+l++8gVxuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbNDFdKTtcbiAgICAgICAgfWVsc2UgaWYoZXZ0X3R5cGUgPT0gXCJldnRfYWNoaWV2ZW1lbnRcIil7Ly/lrozmiJDmiJDlsLHku7vliqHojrflvpfvvIFcbiAgICAgICAgICAgIHZhciBUYXNrQ29uc3QgPSByZXF1aXJlKFwidGFza19jb25zdFwiKTtcbiAgICAgICAgICAgIEp1bXBDb250cm9sbGVyLmdldEluc3RhbmNlKCkuanVtcFZpZXdCeUV2dERhdGEoWzQxLCBUYXNrQ29uc3QudHlwZS5mZWF0XSk7XG4gICAgICAgIH1lbHNlIGlmKGV2dF90eXBlID09IFwiZXZ0X3J1bmVfc3ludGhlc2lzXCIpe1xuICAgICAgICAgICAgdmFyIEZvcmdlSG91c2VDb25zdCA9IHJlcXVpcmUoXCJmb3JnZWhvdXNlX2NvbnN0XCIpO1xuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbMjYsIEZvcmdlSG91c2VDb25zdC5UYWJfSW5kZXguQXJ0aWZhY3RdKVxuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9za2lsbHNob3BcIil7XG4gICAgICAgICAgICB2YXIgTWFsbENvbnN0ID0gcmVxdWlyZShcIm1hbGxfY29uc3RcIik7XG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFsxNSwgTWFsbENvbnN0Lk1hbGxUeXBlLlNraWxsU2hvcF0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9lbGl0ZXNob3BcIil7XG4gICAgICAgICAgICB2YXIgTWFsbENvbnN0ID0gcmVxdWlyZShcIm1hbGxfY29uc3RcIik7XG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFsxNSwgTWFsbENvbnN0Lk1hbGxUeXBlLkVsaXRlU2hvcF0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9lbGl0ZW1hdGNoXCIpey8v57K+6Iux6LWbXG4gICAgICAgICAgICBKdW1wQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmp1bXBWaWV3QnlFdnREYXRhKFsyOF0pO1xuICAgICAgICB9ZWxzZSBpZihldnRfdHlwZSA9PSBcImV2dF9lbGVtZW50X3RlbXBsZVwiKXsvL+WFg+e0oOWco+auv1xuICAgICAgICAgICAgSnVtcENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5qdW1wVmlld0J5RXZ0RGF0YShbNDJdKTtcbiAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZShcIuaaguaXoOi3s+i9rO+8jOaIluiAhei/mOayoea3u+WKoO+8gVwiKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEJhY2twYWNrUm9vdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmJhY2twYWNrX3dpbilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhY2twYWNrX3dpbi5yb290X3duZDtcbiAgICB9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja3BhY2tDb250cm9sbGVyO1xuIl19