(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/mainui/view/mainui_view.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, '38ef2+1QgRNDLjp7wanRv/f', 'mainui_view'); // Scripts/mod/mainui/view/mainui_view.js "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } // -------------------------------------------------------------------- // @author: shiraho@syg.com(必填, 创建模块的人员) // @description: // 主界面控制 //
Create: new Date().toISOString() // -------------------------------------------------------------------- var LoaderManager = require("loadermanager"); var PathTool = require("pathtool"); var PlayerHead = require("playerhead"); var MainUiConst = require("mainui_const"); var BattleConst = require("battle_const"); var RoleController = require("role_controller"); var ExchangeController = require("exchange_controller"); var FunctionIconVo = require("function_icon_vo"); var ChatController = require("chat_controller"); var ExchangeEvent = require("exchange_event"); var LoginController = require("login_controller"); var MainuiEvent = require("mainui_event"); var PromptEvent = require("prompt_event"); var PromptController = require("prompt_controller"); var MainUIView = cc.Class({ "extends": BaseClass, ctor: function ctor() { this.rleasePrefab = false; this.initConfig(); this.createRootWnd(); }, // cc.sys.getSafeAreaRect() initConfig: function initConfig() { this.bottom_btn_list = []; // 下面7个标签页 this.cur_select_index = 0; this.render_list = []; // 待添加的实例对象 this.render_list_dic = {}; // 但添加实例字典 this.function_list = {}; //显示的实例对象 this.icon_container_list = {}; //根据方位保存需要储存的图标的父节点 this.icon_widget_list = {}; //根据方位保存需要储存的图标的widget节点 this.btn_cache_tips = {}; //红点缓存 this.left_off = 20; this.right_off = 20; this.left_max_sum = 7; this.is_in_shrink = false; this.is_shrink = false; this.layout_list = {}; }, createRootWnd: function createRootWnd() { // this.node = new cc.Node("base_root"); // this.node.setAnchorPoint(0, 0); // this.node.setContentSize(SCREEN_WIDTH, SCREEN_HEIGHT); // this.node.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5); // ViewManager.getInstance().addToSceneNode(this.node, SCENE_TAG.top) // 获取一些需要使用的单例 this.mainui_controller = require("mainui_controller").getInstance(); this.battle_controller = require("battle_controller").getInstance(); var prefabPath = PathTool.getPrefabPath("mainui", "mainui_view"); LoaderManager.getInstance().loadRes(prefabPath, function (res_object) { this.initMainUI(res_object); }.bind(this)); }, initMainUI: function initMainUI(res_object) { var _this = this; this.root_wnd = res_object; if (!window.isMobile) { this.root_wnd.getComponent(cc.Widget).enabled = false; } this.root_wnd.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5); // this.node.addChild(this.root_wnd); ViewManager.getInstance().addToSceneNode(this.root_wnd, SCENE_TAG.top); if (this.root_wnd_cb) this.root_wnd_cb(this.root_wnd); // 下部分的7个按钮 this.bottom_container = this.root_wnd.getChildByName("bottom_container"); this.btn_con = this.bottom_container.getChildByName("bnt_con"); // gcore.Timer.set(function(){ // var btn_lo = this.btn_con.getComponent(cc.Layout); // var spcingX = (this.btn_con.width - btn_lo.paddingLeft - btn_lo.paddingRight - (93 * 6 + 105))/6; // btn_lo.spacingX = spcingX; // cc.log(spcingX); // }.bind(this), 0.2) if (window.isMobile && window.FIT_HEIDGHT) { var btn_lo = this.btn_con.getComponent(cc.Layout); var spcingX = (SCREEN_WIDTH * FIT_SCALE - btn_lo.paddingLeft - btn_lo.paddingRight - (93 * 6 + 105)) / 6; btn_lo.spacingX = spcingX; } var _loop = function _loop(index) { btn = _this.btn_con.getChildByName("mainui_tab_" + (index + 1)); if (btn) { tips_point = btn.getChildByName("tips_point"); normal = btn.getChildByName("normal"); selected = btn.getChildByName("selected"); icon = btn.getChildByName("icon"); notice = btn.getChildByName("notice"); init_x = btn.getPosition().x; init_y = btn.getPosition().y; _this.bottom_btn_list[index] = { btn: btn, index: index, tips_point: tips_point, normal: normal, selected: selected, icon: icon, notice: notice, tips_status: false, init_x: init_x, init_y: init_y }; var config = Config.function_data.data_base[index + 1]; if (config && config.activate) { _this.bottom_btn_list[index].config = config; if (_this.bottom_btn_list[index].notice) { _this.bottom_btn_list[index].notice.getComponent(cc.Label).string = config.label; } } btn.on(cc.Node.EventType.TOUCH_END, function (event) { this.changeMainUiStatus(index); }.bind(_this)); if (index == MainUiConst.btn_index.main_scene) { _this.setMaiuiBtnStatus(index); } else if (index == MainUiConst.btn_index.drama_scene) { _this.bottom_btn_list[index].skeleton = icon.getComponent(sp.Skeleton); } if (index == 0) { _this.cur_select_index = index; _this.cur_select_btn = _this.bottom_btn_list[index]; _this.cur_select_btn.normal.active = false; _this.cur_select_btn.selected.active = true; btn.y = _this.bottom_btn_list[index].init_y + 10; } } }; for (var index = 0; index < 7; index++) { var btn; var tips_point; var normal; var selected; var icon; var notice; var init_x; var init_y; _loop(index); } // 上部分的显示 this.top_container = this.root_wnd.getChildByName("top_container"); this.exp_bar = this.top_container.getChildByName("exp_bar"); var exp_nd = this.top_container.getChildByName("exp_bar"); gcore.Timer.set(function () { var exp_wdg = exp_nd.getComponent(cc.Widget); this.exp_bar.width = this.root_wnd.width - exp_wdg.left; }.bind(this), 0.1); this.fight_con = this.top_container.getChildByName("fight_con"); this.coin_touch = this.top_container.getChildByName("coin_touch"); // 金币点击区域 this.gold_touch = this.top_container.getChildByName("gold_touch"); // 钻石点击区域 this.Sprite_8 = this.coin_touch.getChildByName("Sprite_8"); // 金币加号 this.Sprite_10 = this.gold_touch.getChildByName("Sprite_10"); // 钻石加号 this.coin_redpoint = this.coin_touch.getChildByName("Sprite_8").getChildByName("redPoint"); //点金红点 this.coin_redpoint.active = ExchangeController.getInstance().getModel().getRedStatus(); this.head_container = this.top_container.getChildByName("head_container"); // 头像部分 this.player_head = new PlayerHead(); this.player_head.setParent(this.head_container); this.player_head.show(); this.info_container = this.top_container.getChildByName("info_container"); this.lev_label = this.info_container.getChildByName("lev_label").getComponent(cc.Label); // 角色等级 this.name_label = this.info_container.getChildByName("name_label").getComponent(cc.Label); // 角色名字 this.coin_label_nd = this.coin_touch.getChildByName("wealth_label_1"); // 金币数量 this.gold_label_nd = this.gold_touch.getChildByName("wealth_label_2"); // 钻石数量 this.coin_label = this.coin_label_nd.getComponent(cc.Label); // 金币数量 this.gold_label = this.gold_label_nd.getComponent(cc.Label); // 钻石数量 this.fight_label = this.fight_con.getChildByName("fight_label").getComponent(cc.Label); // 战力 this.coin_nd = this.coin_touch.getChildByName("Sprite_2"); // 金币node this.gold_nd = this.gold_touch.getChildByName("Sprite_4"); // 钻石node this.coin_sp = this.coin_nd.getComponent(cc.Sprite); // 金币图标 this.gold_sp = this.gold_nd.getComponent(cc.Sprite); // 钻石图标 this.hide_container = this.root_wnd.getChildByName("hide_container"); this.handle_btn = this.hide_container.getChildByName("handle_btn"); //系统提示 this.prompt_container = this.hide_container.getChildByName("prompt_container"); this.prompt_tips_layout = this.prompt_container.getChildByName("tips_layout"); this.prompt_bubble_layout = this.prompt_container.getChildByName("bubble_layout"); this.prompt_tips_btn = this.prompt_container.getChildByName("tips_btn"); this.prompt_desc = this.prompt_bubble_layout.getChildByName("desc").getComponent(cc.Label); this.prompt_bubble = this.prompt_bubble_layout.getChildByName("bubble"); this.prompt_bubble_size = this.prompt_bubble.getContentSize(); this.prompt_tips_scroll = this.prompt_tips_layout.getChildByName("tips_scroll"); this.prompt_tips_scroll_size = this.prompt_tips_scroll.getContentSize(); this.count_size_label = this.prompt_tips_layout.getChildByName("count_size_label").getComponent(cc.Label); this.prompt_tips_bg = this.prompt_tips_layout.getChildByName("tips_bg"); this.prompt_tips_bg_size = this.prompt_tips_bg.getContentSize(); this.prompt_tips_btn.active = false; this.prompt_tips_layout.active = false; this.prompt_mask = this.hide_container.getChildByName("prompt_mask"); // 可控部分,需要隐藏或者显示 this.hide_container = this.root_wnd.getChildByName("hide_container"); // 可隐藏部分 this.handle_btn = this.hide_container.getChildByName("handle_btn"); // 下面控制按钮 //创建聊天按钮 this.creatorChatBtn(); // this.chat_btn_nd = this.hide_container.getChildByName("chat_btn"); RedMgr.getInstance().addCalHandler(this.updateChatMsgNum.bind(this)); // 战力相关 // this.power_show_nd = this.root_wnd.getChildByName("power_show"); // this.power_sk = this.power_show_nd.getChildByName("ani_con").getComponent(sp.Skeleton); // var tex_con_nd = this.power_show_nd.getChildByName("txt_con"); // this.old_power_rb = tex_con_nd.getChildByName("old_power").getComponent(cc.RichText); // this.add_power_lb = tex_con_nd.getChildByName("add_power").getComponent(cc.Label); this.updateHandleBtnShowStatus(); // this.chat_red_bg = this.chat_btn_nd.getChildByName("chat_red_bg"); // this.chat_red_num = this.chat_red_bg.getChildByName("chat_red_num").getComponent(cc.Label); if (USE_SDK == true && PLATFORM_TYPR == "SH_SDK") { //创建深海小程序客服浮标 this.creatorCustomerServiceBtn(); } this.image_2 = this.top_container.getChildByName("Image_2"); this.vip_label = this.image_2.getChildByName("vip_label").getComponent("CusRichText"); for (var k in FunctionIconVo.type) { var v = FunctionIconVo.type[k]; var icon_container = this.hide_container.getChildByName("icon_container_" + v); if (icon_container) { this.icon_container_list[v] = icon_container; var _x = 0; var _y = 0; if (v == FunctionIconVo.type.right_top_1) { _x = -8; _y = this.top_container.getContentSize().height + 15; } else if (v == FunctionIconVo.type.right_top_2) { _x = -8; _y = this.top_container.getContentSize().height - 100; } else if (v == FunctionIconVo.type.right_bottom_1) { _x = -45 - 57; // _y = this.bottom_container.getContentSize().height + 60; _y = icon_container.y; } else if (v == FunctionIconVo.type.right_bottom_2) { _x = 320.5; // _y = this.bottom_container.getContentSize().height + 60 + 55; _y = -367; } // icon_container.setPosition(_x, _y); var icon_widget = icon_container.getComponent(cc.Widget); if (icon_widget) { this.icon_widget_list[v] = icon_widget; } } } this.role_vo = RoleController.getInstance().getRoleVo(); LoaderManager.getInstance().loadRes(PathTool.getItemRes("1"), function (res) { this.coin_sp.spriteFrame = res; }.bind(this)); LoaderManager.getInstance().loadRes(PathTool.getItemRes("3"), function (res) { this.gold_sp.spriteFrame = res; }.bind(this)); // 加载完成之后注册监听 this.registerEvent(); // 创建挑战按钮 this.createChallengeEffect(); this.updateRoleData(); this.max_dun_id = this.mainui_controller.max_dun_id; if (this.max_dun_id != null) { this.checkUnLockStatus(this.max_dun_id); } // -- 判断等级解锁主按钮 this.checkUnLockStatusByLev(); // -- 所有活动的时间倒计时,统一用一个定时器在这里做处理 if (this.function_time_ticket == null) { this.action_list = require("action_controller").getInstance().getAllActionList(); this.function_time_ticket = gcore.Timer.set(function () { this.functionTimeTicketList(); }.bind(this), 1000, -1); } if (USE_SDK == true && NEED_ADAPTIVE_SDK[window.PLATFORM_TYPR]) { this.coin_nd.x = -28; // this.gold_nd.x = -28; this.coin_label_nd.x = 29; // this.gold_label_nd.x = 29; this.Sprite_8.x = -60; // this.Sprite_10.x = -60; this.Sprite_10.active = false; } // 小游戏需要调整顶部栏 if (window.PLATFORM_TYPR == "WX_SDK" || window.PLATFORM_TYPR == "SH_SDK" || PLATFORM_TYPR == "QQ_SDK") { if (window.WX_FIT) { var add_val = this.root_wnd.height * window.WX_FIT; cc.log("微信小游戏适配菜单栏"); console.log("add_val"); var top_wdg = this.top_container.getComponent(cc.Widget); var con1_wdg = this.icon_container_list[1].getComponent(cc.Widget); top_wdg.top += add_val; con1_wdg.top += add_val; } } // 关闭loading界面 LoginController.getInstance().updateLoading(1); this.close_login_ticket = gcore.Timer.set(function () { LoginController.getInstance().openLoginWindow(false); gcore.Timer.del(this.close_login_ticket); IS_LOADING = false; if (PLATFORM_TYPR == "SH_RH" || PLATFORM_TYPR == "SH_SDK") { SDK.submitLogin(); if (USE_SDK == true && PLATFORM_TYPR == "SH_SDK") { SDK.dataPlacement(90500); } } else if (USE_SDK == true && PLATFORM_TYPR == "WX_SDK") { SDK.loginLog(); } gcore.GlobalEvent.fire(MainuiEvent.LOADING_ENTER_SCENE); }.bind(this), 200, 1); //背包红点 var BackpackController = require("backpack_controller"); BackpackController.getInstance().getModel().getHeroChipRedPoint(); //红点 var ctrlCachesRed = this.mainui_controller.getCachesBtnRed(); if (ctrlCachesRed) { for (var i = 0; i < ctrlCachesRed.length; ++i) { this.updateBtnTipsPoint(ctrlCachesRed[i][0], ctrlCachesRed[i][1]); } this.mainui_controller.resetCachesRetData(); } this.updateShenqi(); var Widget = this.prompt_container.getComponent(cc.Widget); if (this.task_tips_panel == null) { Widget.bottom = 144; } else { Widget.bottom = 334.28; } Widget.updateAlignment(); }, //神器任务 updateShenqi: function updateShenqi() { var task_container = this.hide_container.getChildByName("task_container"); // let hallows_status = require("hallows_controller").getInstance().getModel().checkIsHaveAllHallows(); // let limit_dun = Config.function_data.data_base[7].activate[0][1]; var limit_lev = 6; if (Config.quest_data.data_const) { limit_lev = Config.quest_data.data_const.task_open.val[1]; } var role_vo = RoleController.getInstance().getRoleVo(); if (this.task_tips_panel == null && role_vo.lev >= limit_lev) { var TaskTipsPanel = require("task_tips_panel"); this.task_tips_panel = new TaskTipsPanel(this); this.task_tips_panel.setParent(task_container); this.task_tips_panel.show(); var Widget = this.prompt_container.getComponent(cc.Widget); Widget.bottom = 334.28; Widget.updateAlignment(); } }, deleteTaskTip: function deleteTaskTip() { if (this.task_tips_panel) { this.task_tips_panel.deleteMe(); this.task_tips_panel = null; } var Widget = this.prompt_container.getComponent(cc.Widget); Widget.bottom = 144; Widget.updateAlignment(); }, getTaskTipsPanel: function getTaskTipsPanel() { return this.task_tips_panel.root_wnd; }, // 创建挑战动画 createChallengeEffect: function createChallengeEffect() { var btn_object = this.bottom_btn_list[MainUiConst.btn_index.drama_scene]; if (btn_object == null) { return; } LoaderManager.getInstance().loadRes("spine/E51130/action.atlas", function (res) { btn_object.skeleton.skeletonData = res; btn_object.skeleton.setAnimation(0, "action1", true); }.bind(this)); }, registerEvent: function registerEvent() { this.prompt_tips_btn.on('click', function () { this._onClickPromptTips(); }, this); this.head_container.on(cc.Node.EventType.TOUCH_END, function (event) { RoleController.getInstance().openRoleInfoView(true); }, this); this.coin_touch.on(cc.Node.EventType.TOUCH_END, function (event) { ExchangeController.getInstance().openExchangeMainView(true); }, this); this.gold_touch.on(cc.Node.EventType.TOUCH_END, function (event) { if (!this.is_hero_panel) { require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.CHARGE); } else { var BackpackController = require("backpack_controller"); BackpackController.getInstance().openTipsSource(true, Utils.getItemConfig(22)); } }, this); this.handle_btn.on(cc.Node.EventType.TOUCH_END, function (event) { this.shrinkBtnContainer(); }.bind(this)); // 聊天 this.chat_newmsg_event = gcore.GlobalEvent.bind(EventId.CHAT_NEWMSG_FLAG, function () { RedMgr.getInstance().addCalHandler(this.updateChatMsgNum.bind(this)); }.bind(this)); //点金红点 this.coin_touch_redpoint = gcore.GlobalEvent.bind(ExchangeEvent.Extra_Reward, function (data) { this.coin_redpoint.active = ExchangeController.getInstance().getModel().getRedStatus(); }.bind(this)); this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, val) { switch (key) { case "power": this.updateRolePower(); break; case "lev": this.updateRoleLev(); this.checkUnLockStatusByLev(val); break; case "name": this.updateRoleName(); break; case "coin": this.updateRoleCoin(); break; case "gold": this.updateRoleGold(); break; case "face_id": this.player_head.setHeadRes(val); break; case "avatar_base_id": this.player_head.setFrameRes(val); break; case "vip_lev": this.updateRoleVip(); break; case "exp": this.updateRoleExp(); break; case "exp_max": this.updateRoleExp(); break; case "hero_exp": this.updateHeroExp(); break; default: break; } }, this); //系统提示增加 if (!this.update_prompt_tips) { this.update_prompt_tips = gcore.GlobalEvent.bind(PromptEvent.ADD_PROMPT_DATA, function (data) { // -- 主城正在显示且不在聊天界面才显示气泡 if (this.is_open && !ChatController.getInstance().isChatOpen()) { this.showPromptBubble(data); var model = PromptController.getInstance().getModel(); var list = model.getPromptList(); if (Utils.getArrLen(list) > 0) { this.showPromptTips(true, list); } } }.bind(this)); } //系统提示移除 if (!this.remove_prompt_tips) { this.remove_prompt_tips = gcore.GlobalEvent.bind(PromptEvent.REMOVE_PROMPT_DATA, function () { var model = PromptController.getInstance().getModel(); var list = model.getPromptList(); if (Utils.getArrLen(list) > 0) { this.showPromptTips(true, list); } else { this.showPromptTips(false); } }.bind(this)); } this.prompt_mask.on('touchend', function () { this.prompt_mask.active = false; this.prompt_tips_layout.active = false; }, this); }, open: function open() { if (this.root_wnd) { this.handleHideContainer(true); this.checkShowNewPromptBubble(); } }, // 打开显示的时候不需要马上显示出来,因为可能从一个界面切换到另外一个界面 这个时候不需要显示 handleHideContainer: function handleHideContainer(status) { this.hide_container_status = status; if (this.wait_update == null) { this.wait_update = gcore.Timer.set(function () { if (this.hide_container_status == true) { this.is_open = this.hide_container_status; this.hide_container.active = this.is_open; this.functionUpdateList(); gcore.Timer.del(this.wait_update); this.wait_update = null; } }.bind(this), 200, -1); } }, getHideContainerStatus: function getHideContainerStatus() { return this.hide_container_status; }, close: function close() { if (this.hide_container) { this.is_open = false; this.hide_container_status = false; this.hide_container.active = false; } // if(this.function_time_ticket){ // gcore.Timer.del(this.function_time_ticket); // this.function_time_ticket = null; // } }, // 切换主ui的状态 changeMainUiStatus: function changeMainUiStatus(index, sub_type, extend_data) { var btn_object = this.bottom_btn_list[index]; if (btn_object == null || !btn_object.is_unlock) { message(btn_object.config.desc); return; } // 切磋中的时候,不需要切换 if (this.checkFightClickStatus()) { return; } // 如果待选中的是同一个 if (this.cur_select_index == index && index != MainUiConst.btn_index.main_scene) { if (index == MainUiConst.btn_index.drama_scene) { Utils.closeAllWindow(); } return; } this.setMaiuiBtnStatus(index); // 关闭所有窗体 Utils.closeAllWindow(); // 只要不是剧情副本,都切出战斗 if (index != MainUiConst.btn_index.Darma) { this.battle_controller.requestCutOutBattle(); this.battle_controller.getModel().clearBattleScene(); // clearBattleScene this.changeBackgroundMusic(); } if (index == MainUiConst.btn_index.main_scene) { var mainSceneCtrl = require("mainscene_controller").getInstance(); mainSceneCtrl.enterMainScene(true); } else if (index == MainUiConst.btn_index.partner) { var hero_controller = require("hero_controller").getInstance(); hero_controller.openHeroBagWindow(true, sub_type); } else if (index == MainUiConst.btn_index.backpack) { var controller = require("backpack_controller").getInstance(); controller.openMainWindow(true, sub_type); } else if (index == MainUiConst.btn_index.drama_scene) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Darma); } else if (index == MainUiConst.btn_index.esecsice) { require("esecsice_controller").getInstance().openEsecsiceView(true); } else if (index == MainUiConst.btn_index.guild) { require("guild_controller").getInstance().checkOpenGuildWindow(); // 清楚主界面上面的红点 var GuildskillController = require("guildskill_controller"); GuildskillController.getInstance().getModel().clearGuildSkillIconRed(); } else if (index == MainUiConst.btn_index.hallows) { var controller = require("hallows_controller").getInstance(); if (extend_data) { var hallows_id = extend_data[0]; var index = extend_data[1]; var magic_id = extend_data[2]; controller.openHallowsMainWindow(true, hallows_id, index, magic_id); } else { controller.openHallowsMainWindow(true); } } this.doChangeBySubType(index, sub_type, extend_data); }, // 只要不是剧情战斗,都切刀指定音乐 changeBackgroundMusic: function changeBackgroundMusic() { Utils.playMusic(AUDIO_TYPE.SCENE, "s_002", true); }, //跳转处理 doChangeBySubType: function doChangeBySubType(main_type, sub_type, extend_data) { if (main_type == null || sub_type == null) return; this.sub_type = sub_type; gcore.Timer.set(function () { if (this.sub_type && this.sub_type != sub_type) return; if (main_type == MainUiConst.btn_index.main_scene) { if (sub_type == MainUiConst.sub_type.arena_call) { var SceneConst = require("scene_const"); var ArenaConst = require("arena_const"); require("mainscene_controller").getInstance().openBuild(SceneConst.CenterSceneBuild.arena, ArenaConst.arena_type.loop); } else if (sub_type == MainUiConst.sub_type.champion_call) { var SceneConst = require("scene_const"); var ArenaConst = require("arena_const"); require("mainscene_controller").getInstance().openBuild(SceneConst.CenterSceneBuild.arena, ArenaConst.arena_type.rank); } else if (sub_type == MainUiConst.sub_type.guild_boss) { if (this.role_vo && this.role_vo.gid == 0) { message(Utils.TI18N("您暂时还没有加入公会")); } else { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.GuildDun); } } else if (sub_type == MainUiConst.sub_type.startower) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.StarTower); } else if (sub_type == MainUiConst.sub_type.partnersummon) { require("partnersummon_controller").getInstance().openPartnerSummonWindow(true); } else if (sub_type == MainUiConst.sub_type.escort) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Escort, extend_data); } else if (sub_type == MainUiConst.sub_type.wonderful) { if (typeof extend_data == "number") { var ActionConst = require("action_const"); require("action_controller").getInstance().openActionMainPanel(true, ActionConst.ActionType.Wonderful, extend_data); } } else if (sub_type == MainUiConst.sub_type.godbattle) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Godbattle); } else if (sub_type == MainUiConst.sub_type.world_boss) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.WorldBoss); } else if (sub_type == MainUiConst.sub_type.function_icon) { this.mainui_controller.iconClickHandle(extend_data); } else if (sub_type == MainUiConst.sub_type.guildwar) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.GuildWar); } else if (sub_type == MainUiConst.sub_type.ladderwar) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.LadderWar); } else if (sub_type == MainUiConst.sub_type.primuswar) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.PrimusWar); } else if (sub_type == MainUiConst.sub_type.expedit_fight) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.ExpeditFight); } else if (sub_type == MainUiConst.sub_type.endless) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.Endless); } else if (sub_type == MainUiConst.sub_type.dungeonstone) { this.mainui_controller.requestOpenBattleRelevanceWindow(BattleConst.Fight_Type.DungeonStone, extend_data); } else if (sub_type == MainUiConst.sub_type.seerpalace) { // -- 先知殿 if (extend_data && typeof extend_data == "number") { require("seerpalace_controller").getInstance().openSeerpalaceMainWindow(true, extend_data); } else { require("seerpalace_controller").getInstance().openSeerpalaceMainWindow(true); } } else if (sub_type == MainUiConst.sub_type.adventure) { // -- 跳转神界冒险 require("adventure_controller").getInstance().requestEnterAdventure(); } else if (sub_type == MainUiConst.sub_type.forge_house) { //锻造屋 if (extend_data && typeof extend_data == "number") { require("forgehouse_controller").getInstance().openForgeHouseView(true, extend_data); } else { require("forgehouse_controller").getInstance().openForgeHouseView(true); } } } else if (main_type == MainUiConst.btn_index.drama_scene) { if (sub_type == MainUiConst.sub_type.dungeon_auto) { var battle_drama_model = BattleDramaController.getInstance().getModel(); var drama_data = battle_drama_model.getDramaData(); if (battle_drama_model && drama_data) { var data = battle_drama_model.getSingleBossData(drama_data.max_dun_id); BattleDramaController.getInstance().openDramBossInfoView(true, data); } } } }.bind(this), 200, 1); }, // 是否在观战或者切磋,这个时候出二级提示,退出 checkFightClickStatus: function checkFightClickStatus() { var BattleController = require("battle_controller"); var is_click_status = BattleController.getInstance().getIsClickStatus(); var combat_type = BattleController.getInstance().getModel().getCombatType(); if (is_click_status) { var BattleConst = require("battle_const"); var str = Utils.TI18N("正在观看录像或切磋中,是否退出?"); if (combat_type == BattleConst.Fight_Type.HeroTestWar) { str = Utils.TI18N("正在观看战斗演示,是否切换界面?"); } var comfire_fun = function () { BattleController.getInstance().csFightExit(); }.bind(this); var CommonAlert = require("commonalert"); CommonAlert.show(str, "确定", comfire_fun, "取消"); } else {} return is_click_status; }, // 改变按钮状态 setMaiuiBtnStatus: function setMaiuiBtnStatus(index) { if (this.cur_select_index == index) { return; } if (this.cur_select_btn) { if (this.cur_select_index == MainUiConst.btn_index.drama_scene) { if (this.cur_select_btn.skeleton && this.cur_select_btn.skeleton.skeletonData) { this.cur_select_btn.skeleton.setAnimation(0, "action1", true); } } else { this.cur_select_btn.normal.active = true; this.cur_select_btn.selected.active = false; this.cur_select_btn.btn.setPosition(this.cur_select_btn.init_x, this.cur_select_btn.init_y); } } this.cur_select_index = index; var btn_object = this.bottom_btn_list[index]; this.cur_select_btn = btn_object; if (btn_object) { if (this.cur_select_index == MainUiConst.btn_index.drama_scene) { if (this.cur_select_btn.skeleton && this.cur_select_btn.skeleton.skeletonData) { this.cur_select_btn.skeleton.setAnimation(0, "action2", true); } } else { btn_object.normal.active = false; btn_object.selected.active = true; btn_object.btn.setPosition(btn_object.init_x, btn_object.init_y + 10); } } // 设置选中的ui战斗类型,这里是需要记录的.要不然可能战斗和ui对不上 var fight_type = this.getUIFightByIndex(index); this.mainui_controller.setUIFightType(fight_type); }, // 根据主ui下面的标识,设置当前ui的战斗类型 getUIFightByIndex: function getUIFightByIndex(index) { switch (index) { case MainUiConst.btn_index.main_scene: return MainUiConst.ui_fight_type.main_scene; case MainUiConst.btn_index.partner: return MainUiConst.ui_fight_type.partner; case MainUiConst.btn_index.backpack: return MainUiConst.ui_fight_type.backpack; case MainUiConst.btn_index.drama_scene: return MainUiConst.ui_fight_type.drama_scene; case MainUiConst.btn_index.esecsice: return MainUiConst.ui_fight_type.esecsice; case MainUiConst.btn_index.guild: return MainUiConst.ui_fight_type.guild; case MainUiConst.btn_index.hallows: return MainUiConst.ui_fight_type.hallows; default: return MainUiConst.ui_fight_type.main_scene; } }, // 当前所处的主城主按钮标签 getMainUIIndex: function getMainUIIndex() { return this.cur_select_index; }, // 更新聊天num updateChatMsgNum: function updateChatMsgNum() { var chat_model = ChatController.getInstance().getModel(); var red_num = chat_model.getUnreadNum(); if (red_num > 0) { this.chat_red_bg.active = true; if (red_num > 99) red_num = "+99"; this.chat_red_num.string = red_num; } else { this.chat_red_bg.active = false; } }, // 更新角色数据 updateRoleData: function updateRoleData() { this.updateRoleName(); this.updateRoleLev(); this.updateRoleCoin(); this.updateRoleGold(); this.updateRolePower(); this.updateRoleHead(); this.updateRoleVip(); this.updateRoleExp(); this.updateRoleHeadFrame(); }, updateRoleName: function updateRoleName() { this.name_label.string = this.role_vo.name; }, updateRoleLev: function updateRoleLev() { this.lev_label.string = this.role_vo.lev; }, updateRoleCoin: function updateRoleCoin() { this.coin_label.string = Utils.getMoneyString(this.role_vo.coin); }, updateRoleGold: function updateRoleGold() { if (!this.is_hero_panel) this.gold_label.string = Utils.getMoneyString(this.role_vo.gold); }, updateRolePower: function updateRolePower() { this.fight_label.string = this.role_vo.power; }, updateRoleHead: function updateRoleHead() { this.player_head.setHeadRes(this.role_vo.face_id); }, updateRoleHeadFrame: function updateRoleHeadFrame() { this.player_head.setFrameRes(this.role_vo.avatar_base_id); }, updateRoleExp: function updateRoleExp() { if (this.role_vo == null || this.role_vo.exp == null || this.role_vo.exp_max == null) return; var pro = this.role_vo.exp / this.role_vo.exp_max; this.exp_bar.scaleX = pro; }, // 剧情章节变化的时候,开启下面图标 checkUnLockStatus: function checkUnLockStatus(max_dun_id) { if (max_dun_id == null) return; this.max_dun_id = max_dun_id; var is_unlock = false; for (var k = 0; k < this.bottom_btn_list.length; ++k) { var btn = this.bottom_btn_list[k]; if (btn.config && btn.config.activate) { var activate = btn.config.activate[0]; if (activate[0] == "dun") { is_unlock = max_dun_id >= activate[1]; if (is_unlock != btn.is_unlock) { btn.is_unlock = is_unlock; if (btn.notice) { btn.notice.active = !is_unlock; } // if(is_unlock == false){ // setChildUnEnabled(true, btn) // }else{ // setChildUnEnabled(false, btn) // } } } } } this.updateShenqi(); }, //升级的时候判断等级开启 checkUnLockStatusByLev: function checkUnLockStatusByLev(lev) { if (this.role_vo == null) return; var is_unlock = false; for (var k = 0; k < this.bottom_btn_list.length; ++k) { var btn = this.bottom_btn_list[k]; if (btn.config && btn.config.activate) { var activate = btn.config.activate[0]; if (activate[0] == "lev") { is_unlock = this.role_vo.lev >= activate[1]; if (is_unlock != btn.is_unlock) { btn.is_unlock = is_unlock; if (btn.notice) { btn.notice.active = !is_unlock; } // if(is_unlock == false){ // setChildUnEnabled(true, btn) // }else{ // setChildUnEnabled(false, btn) // } } } } } if (this.task_tips_panel == null) { this.updateShenqi(); } }, // ---------------------- 图标部分 start---------------------- -- //初始化技能图标列表 addIconList: function addIconList(list) { if (list == null || Utils.next(list) == null) return; for (var k in list) { var vo = list[k]; if (vo != null && vo.config != null) { if (!this.checkIconIn(vo.config.id)) { this.render_list_dic[vo.config.id] = vo; this.render_list.push(vo); } } } //这里先做一个排序 if (this.render_list != null && Utils.next(this.render_list != null)) { this.render_list.sort(Utils.tableLowerSorter(["pos", "sort"])); } //开启计时器,准备创建图表f if (this.add_function_timer == null) { this.add_function_timer = gcore.Timer.set(function () { this.createFunctionIcon(); }.bind(this), 2 / 60, -1); } }, //动态添加一个图标 addIcon: function addIcon(vo) { if (vo == null || vo.config == null || this.checkIconIn(vo.config.id)) return; this.render_list_dic[vo.config.id] = vo; this.render_list.push(vo); this.render_list.sort(Utils.tableLowerSorter(["pos", "sort"])); //开启计时器,准备创建图标 if (this.add_function_timer == null) { this.add_function_timer = gcore.Timer.set(function () { this.createFunctionIcon(); }.bind(this), 2 / 60, -1); } }, //监测一个图标是否存在 checkIconIn: function checkIconIn(id) { if (this.function_list[id] != null || this.render_list_dic[id] != null) { return true; } return false; }, //动态移除一个图标 removeIcon: function removeIcon(id) { var config = gdata("function_data", "data_info", [id]); if (config == null) return; if (this.function_list[id] != null) { if (this.function_list[id].deleteMe) { this.function_list[id].deleteMe(); this.function_list[id] = null; } } for (var i in this.render_list) { if (this.render_list[i].config.id == id) { this.render_list.splice(i, 1); break; } } this.render_list_dic[id] = null; if (this.layout_list == null || this.layout_list[config.type] == null) return; for (var i in this.layout_list[config.type]) { var v = this.layout_list[config.type][i]; if (v && v.config.id == id) { this.layout_list[config.type].splice(i, 1); break; } } this.updateIconLayout(config.type); }, //创建一个图标 createFunctionIcon: function createFunctionIcon() { if (!this.root_wnd) return; if (this.render_list == null || Utils.next(this.render_list) == null) { if (this.add_function_timer != null) { gcore.Timer.del(this.add_function_timer); this.add_function_timer = null; } return; } // var data = this.render_list.shift(); var data = this.render_list.splice(0, 1)[0]; if (data == null) return; this.render_list_dic[data.config.id] = null; //这类图标不需要在主界面显示 if (data.config && data.config.is_show == 0) return; this.addItemToTabArray(data); }, //将图标添加到父节点容器 addItemToTabArray: function addItemToTabArray(data) { if (data == null || data.config == null) return; if (this.layout_list == null) { this.layout_list = {}; } if (this.layout_list[data.config.type] == null) { this.layout_list[data.config.type] = []; } var is_new = true; for (var k in this.layout_list[data.config.type]) { var v = this.layout_list[data.config.type][k]; if (v.config.id == data.config.id) { v = data; is_new = false; break; } } data.is_new = is_new; this.layout_list[data.config.type].push(data); this.layout_list[data.config.type].sort(Utils.tableLowerSorter(["sort"])); this.updateIconLayout(data.config.type); }, //更新图标位置 updateIconLayout: function updateIconLayout(type) { if (this.layout_list == null || this.layout_list[type] == null || Utils.next(this.layout_list[type]) == null) return; var layout = this.getContainerByType(type); if (layout == null) return; var len = Utils.getArrLen(this.layout_list[type]); var icon = null; for (var i = 0; i < len; i++) { var data = this.layout_list[type][i]; if (data && data.config) { if (this.function_list[data.config.id] == null) { if (data.is_new == true) { data.is_new = false; var FunctionIcon = require("function_icon_panel"); icon = new FunctionIcon(data); icon.show(); icon.setParent(layout); this.function_list[data.config.id] = icon; } } icon = this.function_list[data.config.id]; if (icon != null) { this.setIconPosition(icon, i, layout, type); } } } if (this.root_wnd) { this.updateHandleBtnShowStatus(); } }, updateHandleBtnShowStatus: function updateHandleBtnShowStatus() { var right_bottom_1 = this.layout_list[FunctionIconVo.type.right_bottom_1]; var right_bottom_2 = this.layout_list[FunctionIconVo.type.right_bottom_2]; if (right_bottom_1 || right_bottom_2) { if (right_bottom_1 && right_bottom_1.length || right_bottom_2 && right_bottom_2.length) { this.handle_btn.active = true; } } else { this.handle_btn.active = false; } }, //根据位置获取图标父节点信息 getContainerByType: function getContainerByType(type) { if (this.icon_container_list != null) { return this.icon_container_list[type]; } }, //设置图标的位置 setIconPosition: function setIconPosition(icon, index, layout, type) { var size = layout.getContentSize(); var _x = 0; var _y = 0; var off_height = 10; if (type == FunctionIconVo.type.right_top_1) { // 右上,从右往左 _x = -icon.width * 0.5 - index % this.left_max_sum * (this.left_off + icon.width); _y = -icon.height * 0.5 - Math.floor(index / this.left_max_sum) * (off_height + icon.height); } else if (type == FunctionIconVo.type.right_bottom_1) { // 右下,从右往左 _x = -icon.width * 0.5 - index % this.left_max_sum * (this.left_off + icon.width); } else if (type == FunctionIconVo.type.right_bottom_2) { // 右下,从下往上 _y = icon.height * 0.5 + index * (icon.height + this.right_off); } else if (type == FunctionIconVo.type.right_top_2) { // 右上,从上往下 _x = -icon.width * 0.5; _y = -icon.height * 0.5 - index * (icon.height + off_height); } if (icon.original == null || Utils.getNorKey(icon.original.x, icon.original.y) != Utils.getNorKey(_x, _y)) { icon.setPosition(_x, _y); icon.original = cc.v2(_x, _y); } //动态调整 right_top_2 的位置 var off_y = 0; if (type == FunctionIconVo.type.right_top_1) { off_y = Math.abs(_y - off_height - icon.height * 0.5); // 算出总高度 } else if (type == FunctionIconVo.type.right_top_2) { var layout_list = this.layout_list[FunctionIconVo.type.right_top_1]; if (layout_list) { var len = Utils.getArrLen(layout_list); var temp_y = icon.height * 0.5 - Math.ceil(len / this.left_max_sum) * (off_height + icon.height); off_y = Math.abs(temp_y - off_height - icon.height * 0.5); } } if (off_y != 0 && this.top_2_off_y != off_y) { this.top_2_off_y = off_y; var top_1 = this.icon_container_list[FunctionIconVo.type.right_top_1]; var top_2 = this.icon_container_list[FunctionIconVo.type.right_top_2]; if (top_1 && top_2) { top_2.y = top_1.y - off_y; } } }, //定时器的统一倒计时 functionTimeTicketList: function functionTimeTicketList() { if (this.function_list && Utils.next(this.function_list) != null) { for (var k in this.function_list) { var icon = this.function_list[k]; if (icon && icon.data && icon.data.end_time && icon.data.end_time > 0) { if (icon.updateTime) { icon.updateTime(); } } } } if (this.action_list && Utils.next(this.action_list) != null) { for (var i in this.action_list) { var _icon = this.action_list[i]; if (_icon && _icon.updateTime && _icon.remain_sec && _icon.remain_sec > 0) { _icon.updateTime(); } } } }, //更新icon列表 functionUpdateList: function functionUpdateList() { if (this.function_list && Utils.next(this.function_list) != null) { for (var k in this.function_list) { var icon = this.function_list[k]; if (icon && icon.updateIconRes) { icon.updateIconRes(); } } } }, setBottomStatus: function setBottomStatus(status) { if (this.bottom_container) this.bottom_container.active = status; }, setTopStatus: function setTopStatus(status) { if (this.top_container) this.top_container.active = status; }, updateRoleVip: function updateRoleVip() { this.vip_label.setNum(this.role_vo.vip_lev); }, // --==============================-- // --@id:下面按钮序号 // --@data:data 可以是单纯bool值,或者是table形式{[1]={id=xxx,status=false}} // --@return // --==============================-- updateBtnTipsPoint: function updateBtnTipsPoint(id, data) { if (!this.bottom_btn_list[id]) return; if (data == null) { this.btn_cache_tips[id] = null; } else { if (_typeof(data) != "object") { this.btn_cache_tips[id] = data; } else { if (this.btn_cache_tips[id] == null) { this.btn_cache_tips[id] = {}; } if (data.bid != null) { this.btn_cache_tips[id][data.bid] = data.status; } else { for (var i in data) { if (data[i].bid != null) { this.btn_cache_tips[id][data[i].bid] = data[i].status; } } } } } var bool = false; if (this.btn_cache_tips[id]) { if (_typeof(this.btn_cache_tips[id]) == "object") { for (var i in this.btn_cache_tips[id]) { if (this.btn_cache_tips[id][i] == true) { bool = true; break; } } } else { bool = this.btn_cache_tips[id]; } } var btn_object = this.bottom_btn_list[id]; if (btn_object && btn_object.tips_status != bool) { btn_object.tips_status = bool; if (btn_object.tips_point) { btn_object.tips_point.active = bool; } } }, getRootWnd: function getRootWnd(cb) { this.root_wnd_cb = cb; if (this.root_wnd) this.root_wnd_cb(this.root_wnd); }, // ---------------------- 图标部分 end---------------------- -- //收缩右下角的图标 shrinkBtnContainer: function shrinkBtnContainer() { if (this.is_in_shrink == true) return; this.is_in_shrink = true; var layout_1 = this.icon_container_list[FunctionIconVo.type.right_bottom_1]; var layout_2 = this.icon_container_list[FunctionIconVo.type.right_bottom_2]; this.is_shrink = !this.is_shrink; layout_1.active = true; layout_2.active = true; var len = 100; var move_by_1 = null; var move_by_2 = null; var fade_1 = null; var fade_2 = null; if (this.is_shrink == true) { move_by_1 = cc.moveBy(0.1, cc.v2(len, 0)); move_by_2 = cc.moveBy(0.1, cc.v2(0, -len)); fade_1 = cc.fadeOut(0.1); fade_2 = cc.fadeOut(0.1); } else { move_by_1 = cc.moveBy(0.1, cc.v2(-len, 0)); move_by_2 = cc.moveBy(0.1, cc.v2(0, len)); fade_1 = cc.fadeIn(0.1); fade_2 = cc.fadeIn(0.1); } var call_fun_1 = cc.callFunc(function () { this.is_in_shrink = false; if (this.is_shrink == true) { layout_1.active = false; } }.bind(this)); var call_fun_2 = cc.callFunc(function () { if (this.is_shrink == true) { layout_2.active = false; } }.bind(this)); layout_1.runAction(cc.sequence(cc.spawn(move_by_1, fade_1), call_fun_1)); layout_2.runAction(cc.sequence(cc.spawn(move_by_2, fade_2), call_fun_2)); }, showPower: function showPower(power_add, last_power) { if (!power_add || !last_power) return; if (this.power_show_nd == null) { LoaderManager.getInstance().loadRes(PathTool.getPrefabPath("mainui", "power_show"), function (Prefab) { if (this.power_show_nd) { this.runPowerAction(power_add, last_power); return; } this.power_show_nd = Prefab; ViewManager.getInstance().addToSceneNode(this.power_show_nd, SCENE_TAG.dialogue); this.power_show_nd.setPosition(-SCREEN_WIDTH * 0.5, -SCREEN_HEIGHT * 0.5); var power_show_nd = this.power_show_nd.getChildByName("container"); this.power_show_nd.power_sk = power_show_nd.getChildByName("ani_con").getComponent(sp.Skeleton); var tex_con_nd = power_show_nd.getChildByName("txt_con"); this.power_show_nd.old_power_rb = tex_con_nd.getChildByName("old_power").getComponent(cc.RichText); if (cc.sys.browserType == cc.sys.BROWSER_TYPE_IE) { this.power_show_nd.old_power_rb.lineHeight = 60; } this.power_show_nd.add_power_lb = tex_con_nd.getChildByName("add_power").getComponent(cc.Label); var anima_res = PathTool.getEffectRes(179); var anima_path = PathTool.getSpinePath(anima_res); LoaderManager.getInstance().loadRes(anima_path, function (power_sd) { this.power_show_nd.power_sk.skeletonData = power_sd; this.runPowerAction(power_add, last_power); }.bind(this)); }.bind(this)); } else { this.runPowerAction(power_add, last_power); } // this.power_show_nd = this.root_wnd.getChildByName("power_show"); // this.power_sk = this.power_show_nd.getChildByName("ani_con").getComponent(sp.Skeleton); // var tex_con_nd = this.power_show_nd.getChildByName("txt_con"); // this.old_power_rb = tex_con_nd.getChildByName("old_power").getComponent(cc.RichText); // this.add_power_lb = tex_con_nd.getChildByName("add_power").getComponent(cc.Label); // if (this.power_sk.skeletonData) { // this.runPowerAction(power_add, last_power); // } else { // var anima_res = PathTool.getEffectRes(179); // var anima_path = PathTool.getSpinePath(anima_res); // LoaderManager.getInstance().loadRes(anima_path, function(power_sd) { // this.power_sk.skeletonData = power_sd; // this.runPowerAction(power_add, last_power); // }.bind(this)) // } }, runPowerAction: function runPowerAction(power_add, last_power) { this.power_show_nd.power_sk.setAnimation(0, "action", false); if (this.add_timer) { gcore.Timer.del(this.add_timer); this.add_timer = null; } this.power_show_nd.stopAllActions(); var last_power_str = last_power + ""; var last_power_ds = ""; if (cc.sys.browserType == cc.sys.BROWSER_TYPE_IE) { last_power_ds = last_power_str; } else { for (var item_i in last_power_str) { last_power_ds += ""; } } this.calcu_num = 0; this.add_timer = gcore.Timer.set(function (power_add) { this.calcu_num += 1; if (this.calcu_num < 5) { this.power_show_nd.add_power_lb.string = "+" + Math.ceil(this.calcu_num * 0.2 * power_add); } else { this.power_show_nd.add_power_lb.string = "+" + power_add; } }.bind(this, power_add), 200, 5); this.power_show_nd.old_power_rb.string = last_power_ds; this.power_show_nd.opacity = 255; console.log("输出字符串", this.power_show_nd.old_power_rb.string); console.log("输出字符串", last_power_ds); var delay_time = new cc.delayTime(1); var action = new cc.fadeOut(1); var finish_cb = new cc.callFunc(function () { if (this.add_timer) { gcore.Timer.del(this.add_timer); this.add_timer = null; } if (this.power_show_nd) { this.power_show_nd.destroy(); this.power_show_nd = null; } }.bind(this)); var power_act = cc.sequence(delay_time, action, finish_cb); this.power_show_nd.runAction(power_act); }, updateHeroExp: function updateHeroExp() { if (this.is_hero_panel) this.gold_label.string = Utils.getMoneyString(this.role_vo.hero_exp); }, changeHeroStatus: function changeHeroStatus(is_hero) { this.is_hero_panel = is_hero; if (is_hero) { LoaderManager.getInstance().loadRes(PathTool.getItemRes("22"), function (res) { this.gold_sp.spriteFrame = res; }.bind(this)); this.gold_label.string = Utils.getMoneyString(this.role_vo.hero_exp); } else { LoaderManager.getInstance().loadRes(PathTool.getItemRes("3"), function (res) { this.gold_sp.spriteFrame = res; }.bind(this)); this.gold_label.string = Utils.getMoneyString(this.role_vo.gold); } }, creatorChatBtn: function creatorChatBtn() { this.chat_btn_nd = new cc.Node("chat_btn"); var widget = this.chat_btn_nd.addComponent(cc.Widget); widget.isAlignBottom = true; widget.bottom = 367; this.chat_btn_nd.x = 317; ViewManager.getInstance().addToSceneNode(this.chat_btn_nd, SCENE_TAG.top); var btn = this.chat_btn_nd.addComponent(cc.Button); btn.transition = cc.Button.Transition.SCALE; btn.zoomScale = 0.9; btn.duration = 0.1; LoaderManager.getInstance().loadRes(PathTool.getUIIconPath("mainui", "mainui_chat_main_icon"), function (res_object) { this.chat_btn_nd.addComponent(cc.Sprite).spriteFrame = res_object; }.bind(this)); this.chat_red_bg = new cc.Node("chat_red_bg"); LoaderManager.getInstance().loadRes(PathTool.getUIIconPath("mainui", "mainui_1034"), function (res_object) { this.chat_red_bg.addComponent(cc.Sprite).spriteFrame = res_object; }.bind(this)); this.chat_btn_nd.addChild(this.chat_red_bg); this.chat_red_bg.setPosition(23, 25); this.chat_red_bg.active = false; this.chat_red_num = new cc.Node("chat_red_num").addComponent(cc.Label); this.chat_red_num.fontSize = 18; this.chat_red_num.lineHeight = 18; this.chat_red_num.horizontalAlign = cc.macro.TextAlignment.CENTER; this.chat_red_num.verticalAlign = cc.macro.TextAlignment.CENTER; this.chat_red_bg.addChild(this.chat_red_num.node); var touch_began = cc.v2(); var is_move = false; this.chat_btn_nd.on("touchstart", function (event) { is_move = false; touch_began = event.getLocation(); }, this); this.chat_btn_nd.on("touchmove", function (event) { var pos = event.getLocation(); if (!is_move) { var is_click = Math.abs(pos.x - touch_began.x) <= 30 && Math.abs(pos.y - touch_began.y) <= 30; if (is_click == false) { is_move = true; } } if (is_move) { pos = ViewManager.getInstance().getSceneNode(SCENE_TAG.top).convertToNodeSpaceAR(pos); if (!this.checkPosInRect(pos)) return; this.chat_btn_nd.setPosition(pos); } }, this); this.chat_btn_nd.on("touchend", function (event) { if (is_move == false) { Utils.playButtonSound(1); var ChatCtrl = require("chat_controller"); ChatCtrl.getInstance().openChatPanel(); this.showChatBtn(false); } }, this); var GuideController = require("guide_controller"); if (GuideController.getInstance().isInGuide()) { this.setMainUIChatBubbleStatus(false); } }, setMainUIChatBubbleStatus: function setMainUIChatBubbleStatus(status) { this.chat_bubble_status = status; this.chat_btn_nd.stopAllActions(); if (status) { this.root_wnd.runAction(cc.sequence(cc.delayTime(0.2), cc.callFunc(function () { if (this.chat_bubble_status == true) { this.showChatBtn(this.chat_bubble_status); } }, this))); } else { this.showChatBtn(this.chat_bubble_status); } }, checkPosInRect: function checkPosInRect(pos) { // let width = cc.winSize.width > SCREEN_WIDTH ? SCREEN_WIDTH : cc.winSize.width; // let size = cc.size(width,cc.winSize.height) var size = this.root_wnd.getContentSize(); var left_x = -(size.width / 2) + 40; var right_x = size.width / 2 - 40; var top_y = size.height / 2 - (this.top_container.height + 60); var bottom_y = -(size.height / 2) + (this.bottom_container.height + 60); if (pos.x < left_x) return false; if (pos.y < bottom_y) return false; if (pos.x > right_x) return false; if (pos.y > top_y) return false; return true; }, showChatBtn: function showChatBtn(status) { if (this.chat_btn_nd) { this.chat_btn_nd.active = status; } }, // 检测是否有新的气泡提示 checkShowNewPromptBubble: function checkShowNewPromptBubble() { var model = PromptController.getInstance().getModel(); var data = model.getNotBubblePrompt(); if (data) { this.showPromptBubble(data); } var list = model.getPromptList(); if (Utils.getArrLen(list) > 0) { this.showPromptTips(true, list); } }, // -- 显示系统提示气泡 showPromptBubble: function showPromptBubble(data) { if (data) { data.setShowBubbleStatus(true); this.prompt_bubble_layout.stopAllActions(); this.prompt_tips_btn.active = true; this.prompt_bubble_layout.active = true; this.prompt_desc.string = data.name; this.prompt_desc._updateRenderData(true); var size = this.prompt_desc.node.getContentSize(); this.prompt_bubble.setContentSize(cc.size(size.width + 60, this.prompt_bubble_size.height)); var fadein = cc.fadeIn(0.7); var fadeout = cc.fadeOut(0.7); this.prompt_bubble_layout.runAction(cc.sequence(fadein, fadeout)); } }, // -- 显示系统提示 showPromptTips: function showPromptTips(status, list) { var _this2 = this; cc.log(status, list, "showPromptTips"); if (status == true && list && Utils.next(list) != null) { this.prompt_tips_btn.active = true; this.prompt_tips_scroll.destroyAllChildren(); var max_width = 0; for (var k = 0; k < list.length; ++k) { var v = list[k]; this.count_size_label.string = v.name; this.count_size_label._updateRenderData(true); var size = this.count_size_label.node.getContentSize(); if (max_width < size.width) { max_width = size.width; } } if (max_width < 168) { max_width = 168; //原本的大小 } // --字的宽度和按钮的宽度相差20 max_width = max_width + 20; var len = Utils.getArrLen(list); var button_height = 49; var button_height_space = 12; var res = PathTool.getUIIconPath("mainui", "mainui_tips_bg1"); var max_height = Math.max(this.prompt_tips_scroll_size.height, len * (button_height_space + button_height)); var scroll_height = Math.min(len * (button_height_space + button_height), 160); // --根据大小调整下scroll和背景大小 var tips_scroll_width = max_width + 4; var tips_bg_width = tips_scroll_width + (this.prompt_tips_bg_size.width - this.prompt_tips_scroll_size.width); this.prompt_tips_scroll.setContentSize(cc.size(tips_scroll_width, scroll_height)); // this.prompt_tips_scroll:setInnerContainerSize(cc.size(tips_scroll_width, scroll_height)) this.prompt_tips_bg.setContentSize(cc.size(tips_bg_width, scroll_height + 60)); if (scroll_height > 160) { this.prompt_tips_scroll.setContentSize(cc.size(tips_scroll_width, max_height)); } var _loop2 = function _loop2(i) { var v = list[i]; var item = new cc.Node(); var image = item.addComponent(cc.Sprite); image.type = cc.Sprite.Type.SLICED; image.sizeMode = cc.Sprite.SizeMode.CUSTOM; item.setPosition(tips_scroll_width / 2, 5 + (button_height_space + button_height) * i); item.setContentSize(cc.size(max_width, button_height)); item.setAnchorPoint(0.5, 0); LoaderManager.getInstance().loadRes(res, function (SpriteFrame) { image.spriteFrame = SpriteFrame; }.bind(_this2)); _this2.prompt_tips_scroll.addChild(item); var label = new cc.Node().addComponent(cc.Label); label.node.color = new cc.Color().fromHEX(Config.color_data.data_color16[175]); label.string = v.name; label.fontSize = 22; label.lineHeight = 26; label.node.y = button_height / 2; item.addChild(label.node); var btn = item.addComponent(cc.Button); btn.transition = cc.Button.Transition.SCALE; btn.duration = 0.1; btn.zoomScale = 0.9; item.on('touchend', function () { this.prompt_mask.active = false; this.mainui_controller.onClickPromptTipsItem(v); this.prompt_tips_layout.active = false; }, _this2); }; for (var i = 0; i < list.length; ++i) { _loop2(i); } } else { this.prompt_tips_btn.active = false; this.prompt_tips_layout.active = false; if (this.prompt_mask) { this.prompt_mask.active = false; } } }, _onClickPromptTips: function _onClickPromptTips() { if (this.prompt_tips_layout.active) { this.prompt_tips_layout.active = false; if (this.prompt_mask) { this.prompt_mask.active = false; } } else { this.prompt_tips_layout.active = true; if (this.prompt_mask) { this.prompt_mask.active = true; } } }, //创建深海小程序客服浮标 creatorCustomerServiceBtn: function creatorCustomerServiceBtn() { if (this.customer_service) { this.customer_service.deleteMe(); this.customer_service = null; } this.customer_service = Utils.createClass("customer_service_window"); var container = require("viewmanager").getInstance().getSceneNode(SCENE_TAG.loading); this.customer_service.setParent(container); this.customer_service.show(); } }); module.exports = MainUIView; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxtYWludWlcXHZpZXdcXG1haW51aV92aWV3LmpzIl0sIm5hbWVzIjpbIkxvYWRlck1hbmFnZXIiLCJyZXF1aXJlIiwiUGF0aFRvb2wiLCJQbGF5ZXJIZWFkIiwiTWFpblVpQ29uc3QiLCJCYXR0bGVDb25zdCIsIlJvbGVDb250cm9sbGVyIiwiRXhjaGFuZ2VDb250cm9sbGVyIiwiRnVuY3Rpb25JY29uVm8iLCJDaGF0Q29udHJvbGxlciIsIkV4Y2hhbmdlRXZlbnQiLCJMb2dpbkNvbnRyb2xsZXIiLCJNYWludWlFdmVudCIsIlByb21wdEV2ZW50IiwiUHJvbXB0Q29udHJvbGxlciIsIk1haW5VSVZpZXciLCJjYyIsIkNsYXNzIiwiQmFzZUNsYXNzIiwiY3RvciIsInJsZWFzZVByZWZhYiIsImluaXRDb25maWciLCJjcmVhdGVSb290V25kIiwiYm90dG9tX2J0bl9saXN0IiwiY3VyX3NlbGVjdF9pbmRleCIsInJlbmRlcl9saXN0IiwicmVuZGVyX2xpc3RfZGljIiwiZnVuY3Rpb25fbGlzdCIsImljb25fY29udGFpbmVyX2xpc3QiLCJpY29uX3dpZGdldF9saXN0IiwiYnRuX2NhY2hlX3RpcHMiLCJsZWZ0X29mZiIsInJpZ2h0X29mZiIsImxlZnRfbWF4X3N1bSIsImlzX2luX3NocmluayIsImlzX3NocmluayIsImxheW91dF9saXN0IiwibWFpbnVpX2NvbnRyb2xsZXIiLCJnZXRJbnN0YW5jZSIsImJhdHRsZV9jb250cm9sbGVyIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJsb2FkUmVzIiwicmVzX29iamVjdCIsImluaXRNYWluVUkiLCJiaW5kIiwicm9vdF93bmQiLCJ3aW5kb3ciLCJpc01vYmlsZSIsImdldENvbXBvbmVudCIsIldpZGdldCIsImVuYWJsZWQiLCJzZXRQb3NpdGlvbiIsIlNDUkVFTl9XSURUSCIsIlNDUkVFTl9IRUlHSFQiLCJWaWV3TWFuYWdlciIsImFkZFRvU2NlbmVOb2RlIiwiU0NFTkVfVEFHIiwidG9wIiwicm9vdF93bmRfY2IiLCJib3R0b21fY29udGFpbmVyIiwiZ2V0Q2hpbGRCeU5hbWUiLCJidG5fY29uIiwiRklUX0hFSURHSFQiLCJidG5fbG8iLCJMYXlvdXQiLCJzcGNpbmdYIiwiRklUX1NDQUxFIiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiLCJzcGFjaW5nWCIsImluZGV4IiwiYnRuIiwidGlwc19wb2ludCIsIm5vcm1hbCIsInNlbGVjdGVkIiwiaWNvbiIsIm5vdGljZSIsImluaXRfeCIsImdldFBvc2l0aW9uIiwieCIsImluaXRfeSIsInkiLCJ0aXBzX3N0YXR1cyIsImNvbmZpZyIsIkNvbmZpZyIsImZ1bmN0aW9uX2RhdGEiLCJkYXRhX2Jhc2UiLCJhY3RpdmF0ZSIsIkxhYmVsIiwic3RyaW5nIiwibGFiZWwiLCJvbiIsIk5vZGUiLCJFdmVudFR5cGUiLCJUT1VDSF9FTkQiLCJldmVudCIsImNoYW5nZU1haW5VaVN0YXR1cyIsImJ0bl9pbmRleCIsIm1haW5fc2NlbmUiLCJzZXRNYWl1aUJ0blN0YXR1cyIsImRyYW1hX3NjZW5lIiwic2tlbGV0b24iLCJzcCIsIlNrZWxldG9uIiwiY3VyX3NlbGVjdF9idG4iLCJhY3RpdmUiLCJ0b3BfY29udGFpbmVyIiwiZXhwX2JhciIsImV4cF9uZCIsImdjb3JlIiwiVGltZXIiLCJzZXQiLCJleHBfd2RnIiwid2lkdGgiLCJsZWZ0IiwiZmlnaHRfY29uIiwiY29pbl90b3VjaCIsImdvbGRfdG91Y2giLCJTcHJpdGVfOCIsIlNwcml0ZV8xMCIsImNvaW5fcmVkcG9pbnQiLCJnZXRNb2RlbCIsImdldFJlZFN0YXR1cyIsImhlYWRfY29udGFpbmVyIiwicGxheWVyX2hlYWQiLCJzZXRQYXJlbnQiLCJzaG93IiwiaW5mb19jb250YWluZXIiLCJsZXZfbGFiZWwiLCJuYW1lX2xhYmVsIiwiY29pbl9sYWJlbF9uZCIsImdvbGRfbGFiZWxfbmQiLCJjb2luX2xhYmVsIiwiZ29sZF9sYWJlbCIsImZpZ2h0X2xhYmVsIiwiY29pbl9uZCIsImdvbGRfbmQiLCJjb2luX3NwIiwiU3ByaXRlIiwiZ29sZF9zcCIsImhpZGVfY29udGFpbmVyIiwiaGFuZGxlX2J0biIsInByb21wdF9jb250YWluZXIiLCJwcm9tcHRfdGlwc19sYXlvdXQiLCJwcm9tcHRfYnViYmxlX2xheW91dCIsInByb21wdF90aXBzX2J0biIsInByb21wdF9kZXNjIiwicHJvbXB0X2J1YmJsZSIsInByb21wdF9idWJibGVfc2l6ZSIsImdldENvbnRlbnRTaXplIiwicHJvbXB0X3RpcHNfc2Nyb2xsIiwicHJvbXB0X3RpcHNfc2Nyb2xsX3NpemUiLCJjb3VudF9zaXplX2xhYmVsIiwicHJvbXB0X3RpcHNfYmciLCJwcm9tcHRfdGlwc19iZ19zaXplIiwicHJvbXB0X21hc2siLCJjcmVhdG9yQ2hhdEJ0biIsIlJlZE1nciIsImFkZENhbEhhbmRsZXIiLCJ1cGRhdGVDaGF0TXNnTnVtIiwidXBkYXRlSGFuZGxlQnRuU2hvd1N0YXR1cyIsIlVTRV9TREsiLCJQTEFURk9STV9UWVBSIiwiY3JlYXRvckN1c3RvbWVyU2VydmljZUJ0biIsImltYWdlXzIiLCJ2aXBfbGFiZWwiLCJrIiwidHlwZSIsInYiLCJpY29uX2NvbnRhaW5lciIsIl94IiwiX3kiLCJyaWdodF90b3BfMSIsImhlaWdodCIsInJpZ2h0X3RvcF8yIiwicmlnaHRfYm90dG9tXzEiLCJyaWdodF9ib3R0b21fMiIsImljb25fd2lkZ2V0Iiwicm9sZV92byIsImdldFJvbGVWbyIsImdldEl0ZW1SZXMiLCJyZXMiLCJzcHJpdGVGcmFtZSIsInJlZ2lzdGVyRXZlbnQiLCJjcmVhdGVDaGFsbGVuZ2VFZmZlY3QiLCJ1cGRhdGVSb2xlRGF0YSIsIm1heF9kdW5faWQiLCJjaGVja1VuTG9ja1N0YXR1cyIsImNoZWNrVW5Mb2NrU3RhdHVzQnlMZXYiLCJmdW5jdGlvbl90aW1lX3RpY2tldCIsImFjdGlvbl9saXN0IiwiZ2V0QWxsQWN0aW9uTGlzdCIsImZ1bmN0aW9uVGltZVRpY2tldExpc3QiLCJORUVEX0FEQVBUSVZFX1NESyIsIldYX0ZJVCIsImFkZF92YWwiLCJsb2ciLCJjb25zb2xlIiwidG9wX3dkZyIsImNvbjFfd2RnIiwidXBkYXRlTG9hZGluZyIsImNsb3NlX2xvZ2luX3RpY2tldCIsIm9wZW5Mb2dpbldpbmRvdyIsImRlbCIsIklTX0xPQURJTkciLCJTREsiLCJzdWJtaXRMb2dpbiIsImRhdGFQbGFjZW1lbnQiLCJsb2dpbkxvZyIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIkxPQURJTkdfRU5URVJfU0NFTkUiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJnZXRIZXJvQ2hpcFJlZFBvaW50IiwiY3RybENhY2hlc1JlZCIsImdldENhY2hlc0J0blJlZCIsImkiLCJsZW5ndGgiLCJ1cGRhdGVCdG5UaXBzUG9pbnQiLCJyZXNldENhY2hlc1JldERhdGEiLCJ1cGRhdGVTaGVucWkiLCJ0YXNrX3RpcHNfcGFuZWwiLCJib3R0b20iLCJ1cGRhdGVBbGlnbm1lbnQiLCJ0YXNrX2NvbnRhaW5lciIsImxpbWl0X2xldiIsInF1ZXN0X2RhdGEiLCJkYXRhX2NvbnN0IiwidGFza19vcGVuIiwidmFsIiwibGV2IiwiVGFza1RpcHNQYW5lbCIsImRlbGV0ZVRhc2tUaXAiLCJkZWxldGVNZSIsImdldFRhc2tUaXBzUGFuZWwiLCJidG5fb2JqZWN0Iiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwiX29uQ2xpY2tQcm9tcHRUaXBzIiwib3BlblJvbGVJbmZvVmlldyIsIm9wZW5FeGNoYW5nZU1haW5WaWV3IiwiaXNfaGVyb19wYW5lbCIsIm9wZW5WaXBNYWluV2luZG93IiwiVklQVEFCQ09OU1QiLCJDSEFSR0UiLCJvcGVuVGlwc1NvdXJjZSIsIlV0aWxzIiwiZ2V0SXRlbUNvbmZpZyIsInNocmlua0J0bkNvbnRhaW5lciIsImNoYXRfbmV3bXNnX2V2ZW50IiwiRXZlbnRJZCIsIkNIQVRfTkVXTVNHX0ZMQUciLCJjb2luX3RvdWNoX3JlZHBvaW50IiwiRXh0cmFfUmV3YXJkIiwiZGF0YSIsIlVQREFURV9ST0xFX0FUVFJJQlVURSIsImtleSIsInVwZGF0ZVJvbGVQb3dlciIsInVwZGF0ZVJvbGVMZXYiLCJ1cGRhdGVSb2xlTmFtZSIsInVwZGF0ZVJvbGVDb2luIiwidXBkYXRlUm9sZUdvbGQiLCJzZXRIZWFkUmVzIiwic2V0RnJhbWVSZXMiLCJ1cGRhdGVSb2xlVmlwIiwidXBkYXRlUm9sZUV4cCIsInVwZGF0ZUhlcm9FeHAiLCJ1cGRhdGVfcHJvbXB0X3RpcHMiLCJBRERfUFJPTVBUX0RBVEEiLCJpc19vcGVuIiwiaXNDaGF0T3BlbiIsInNob3dQcm9tcHRCdWJibGUiLCJtb2RlbCIsImxpc3QiLCJnZXRQcm9tcHRMaXN0IiwiZ2V0QXJyTGVuIiwic2hvd1Byb21wdFRpcHMiLCJyZW1vdmVfcHJvbXB0X3RpcHMiLCJSRU1PVkVfUFJPTVBUX0RBVEEiLCJvcGVuIiwiaGFuZGxlSGlkZUNvbnRhaW5lciIsImNoZWNrU2hvd05ld1Byb21wdEJ1YmJsZSIsInN0YXR1cyIsImhpZGVfY29udGFpbmVyX3N0YXR1cyIsIndhaXRfdXBkYXRlIiwiZnVuY3Rpb25VcGRhdGVMaXN0IiwiZ2V0SGlkZUNvbnRhaW5lclN0YXR1cyIsImNsb3NlIiwic3ViX3R5cGUiLCJleHRlbmRfZGF0YSIsImlzX3VubG9jayIsIm1lc3NhZ2UiLCJkZXNjIiwiY2hlY2tGaWdodENsaWNrU3RhdHVzIiwiY2xvc2VBbGxXaW5kb3ciLCJEYXJtYSIsInJlcXVlc3RDdXRPdXRCYXR0bGUiLCJjbGVhckJhdHRsZVNjZW5lIiwiY2hhbmdlQmFja2dyb3VuZE11c2ljIiwibWFpblNjZW5lQ3RybCIsImVudGVyTWFpblNjZW5lIiwicGFydG5lciIsImhlcm9fY29udHJvbGxlciIsIm9wZW5IZXJvQmFnV2luZG93IiwiYmFja3BhY2siLCJjb250cm9sbGVyIiwib3Blbk1haW5XaW5kb3ciLCJyZXF1ZXN0T3BlbkJhdHRsZVJlbGV2YW5jZVdpbmRvdyIsIkZpZ2h0X1R5cGUiLCJlc2Vjc2ljZSIsIm9wZW5Fc2Vjc2ljZVZpZXciLCJndWlsZCIsImNoZWNrT3Blbkd1aWxkV2luZG93IiwiR3VpbGRza2lsbENvbnRyb2xsZXIiLCJjbGVhckd1aWxkU2tpbGxJY29uUmVkIiwiaGFsbG93cyIsImhhbGxvd3NfaWQiLCJtYWdpY19pZCIsIm9wZW5IYWxsb3dzTWFpbldpbmRvdyIsImRvQ2hhbmdlQnlTdWJUeXBlIiwicGxheU11c2ljIiwiQVVESU9fVFlQRSIsIlNDRU5FIiwibWFpbl90eXBlIiwiYXJlbmFfY2FsbCIsIlNjZW5lQ29uc3QiLCJBcmVuYUNvbnN0Iiwib3BlbkJ1aWxkIiwiQ2VudGVyU2NlbmVCdWlsZCIsImFyZW5hIiwiYXJlbmFfdHlwZSIsImxvb3AiLCJjaGFtcGlvbl9jYWxsIiwicmFuayIsImd1aWxkX2Jvc3MiLCJnaWQiLCJUSTE4TiIsIkd1aWxkRHVuIiwic3RhcnRvd2VyIiwiU3RhclRvd2VyIiwicGFydG5lcnN1bW1vbiIsIm9wZW5QYXJ0bmVyU3VtbW9uV2luZG93IiwiZXNjb3J0IiwiRXNjb3J0Iiwid29uZGVyZnVsIiwiQWN0aW9uQ29uc3QiLCJvcGVuQWN0aW9uTWFpblBhbmVsIiwiQWN0aW9uVHlwZSIsIldvbmRlcmZ1bCIsImdvZGJhdHRsZSIsIkdvZGJhdHRsZSIsIndvcmxkX2Jvc3MiLCJXb3JsZEJvc3MiLCJmdW5jdGlvbl9pY29uIiwiaWNvbkNsaWNrSGFuZGxlIiwiZ3VpbGR3YXIiLCJHdWlsZFdhciIsImxhZGRlcndhciIsIkxhZGRlcldhciIsInByaW11c3dhciIsIlByaW11c1dhciIsImV4cGVkaXRfZmlnaHQiLCJFeHBlZGl0RmlnaHQiLCJlbmRsZXNzIiwiRW5kbGVzcyIsImR1bmdlb25zdG9uZSIsIkR1bmdlb25TdG9uZSIsInNlZXJwYWxhY2UiLCJvcGVuU2VlcnBhbGFjZU1haW5XaW5kb3ciLCJhZHZlbnR1cmUiLCJyZXF1ZXN0RW50ZXJBZHZlbnR1cmUiLCJmb3JnZV9ob3VzZSIsIm9wZW5Gb3JnZUhvdXNlVmlldyIsImR1bmdlb25fYXV0byIsImJhdHRsZV9kcmFtYV9tb2RlbCIsIkJhdHRsZURyYW1hQ29udHJvbGxlciIsImRyYW1hX2RhdGEiLCJnZXREcmFtYURhdGEiLCJnZXRTaW5nbGVCb3NzRGF0YSIsIm9wZW5EcmFtQm9zc0luZm9WaWV3IiwiQmF0dGxlQ29udHJvbGxlciIsImlzX2NsaWNrX3N0YXR1cyIsImdldElzQ2xpY2tTdGF0dXMiLCJjb21iYXRfdHlwZSIsImdldENvbWJhdFR5cGUiLCJzdHIiLCJIZXJvVGVzdFdhciIsImNvbWZpcmVfZnVuIiwiY3NGaWdodEV4aXQiLCJDb21tb25BbGVydCIsImZpZ2h0X3R5cGUiLCJnZXRVSUZpZ2h0QnlJbmRleCIsInNldFVJRmlnaHRUeXBlIiwidWlfZmlnaHRfdHlwZSIsImdldE1haW5VSUluZGV4IiwiY2hhdF9tb2RlbCIsInJlZF9udW0iLCJnZXRVbnJlYWROdW0iLCJjaGF0X3JlZF9iZyIsImNoYXRfcmVkX251bSIsInVwZGF0ZVJvbGVIZWFkIiwidXBkYXRlUm9sZUhlYWRGcmFtZSIsIm5hbWUiLCJnZXRNb25leVN0cmluZyIsImNvaW4iLCJnb2xkIiwicG93ZXIiLCJmYWNlX2lkIiwiYXZhdGFyX2Jhc2VfaWQiLCJleHAiLCJleHBfbWF4IiwicHJvIiwic2NhbGVYIiwiYWRkSWNvbkxpc3QiLCJuZXh0Iiwidm8iLCJjaGVja0ljb25JbiIsImlkIiwicHVzaCIsInNvcnQiLCJ0YWJsZUxvd2VyU29ydGVyIiwiYWRkX2Z1bmN0aW9uX3RpbWVyIiwiY3JlYXRlRnVuY3Rpb25JY29uIiwiYWRkSWNvbiIsInJlbW92ZUljb24iLCJnZGF0YSIsInNwbGljZSIsInVwZGF0ZUljb25MYXlvdXQiLCJpc19zaG93IiwiYWRkSXRlbVRvVGFiQXJyYXkiLCJpc19uZXciLCJsYXlvdXQiLCJnZXRDb250YWluZXJCeVR5cGUiLCJsZW4iLCJGdW5jdGlvbkljb24iLCJzZXRJY29uUG9zaXRpb24iLCJzaXplIiwib2ZmX2hlaWdodCIsIk1hdGgiLCJmbG9vciIsIm9yaWdpbmFsIiwiZ2V0Tm9yS2V5IiwidjIiLCJvZmZfeSIsImFicyIsInRlbXBfeSIsImNlaWwiLCJ0b3BfMl9vZmZfeSIsInRvcF8xIiwidG9wXzIiLCJlbmRfdGltZSIsInVwZGF0ZVRpbWUiLCJyZW1haW5fc2VjIiwidXBkYXRlSWNvblJlcyIsInNldEJvdHRvbVN0YXR1cyIsInNldFRvcFN0YXR1cyIsInNldE51bSIsInZpcF9sZXYiLCJiaWQiLCJib29sIiwiZ2V0Um9vdFduZCIsImNiIiwibGF5b3V0XzEiLCJsYXlvdXRfMiIsIm1vdmVfYnlfMSIsIm1vdmVfYnlfMiIsImZhZGVfMSIsImZhZGVfMiIsIm1vdmVCeSIsImZhZGVPdXQiLCJmYWRlSW4iLCJjYWxsX2Z1bl8xIiwiY2FsbEZ1bmMiLCJjYWxsX2Z1bl8yIiwicnVuQWN0aW9uIiwic2VxdWVuY2UiLCJzcGF3biIsInNob3dQb3dlciIsInBvd2VyX2FkZCIsImxhc3RfcG93ZXIiLCJwb3dlcl9zaG93X25kIiwiUHJlZmFiIiwicnVuUG93ZXJBY3Rpb24iLCJkaWFsb2d1ZSIsInBvd2VyX3NrIiwidGV4X2Nvbl9uZCIsIm9sZF9wb3dlcl9yYiIsIlJpY2hUZXh0Iiwic3lzIiwiYnJvd3NlclR5cGUiLCJCUk9XU0VSX1RZUEVfSUUiLCJsaW5lSGVpZ2h0IiwiYWRkX3Bvd2VyX2xiIiwiYW5pbWFfcmVzIiwiZ2V0RWZmZWN0UmVzIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsInBvd2VyX3NkIiwiYWRkX3RpbWVyIiwic3RvcEFsbEFjdGlvbnMiLCJsYXN0X3Bvd2VyX3N0ciIsImxhc3RfcG93ZXJfZHMiLCJpdGVtX2kiLCJjYWxjdV9udW0iLCJvcGFjaXR5IiwiZGVsYXlfdGltZSIsImRlbGF5VGltZSIsImFjdGlvbiIsImZpbmlzaF9jYiIsImRlc3Ryb3kiLCJwb3dlcl9hY3QiLCJoZXJvX2V4cCIsImNoYW5nZUhlcm9TdGF0dXMiLCJpc19oZXJvIiwiY2hhdF9idG5fbmQiLCJ3aWRnZXQiLCJhZGRDb21wb25lbnQiLCJpc0FsaWduQm90dG9tIiwiQnV0dG9uIiwidHJhbnNpdGlvbiIsIlRyYW5zaXRpb24iLCJTQ0FMRSIsInpvb21TY2FsZSIsImR1cmF0aW9uIiwiZ2V0VUlJY29uUGF0aCIsImFkZENoaWxkIiwiZm9udFNpemUiLCJob3Jpem9udGFsQWxpZ24iLCJtYWNybyIsIlRleHRBbGlnbm1lbnQiLCJDRU5URVIiLCJ2ZXJ0aWNhbEFsaWduIiwibm9kZSIsInRvdWNoX2JlZ2FuIiwiaXNfbW92ZSIsImdldExvY2F0aW9uIiwicG9zIiwiaXNfY2xpY2siLCJnZXRTY2VuZU5vZGUiLCJjb252ZXJ0VG9Ob2RlU3BhY2VBUiIsImNoZWNrUG9zSW5SZWN0IiwicGxheUJ1dHRvblNvdW5kIiwiQ2hhdEN0cmwiLCJvcGVuQ2hhdFBhbmVsIiwic2hvd0NoYXRCdG4iLCJHdWlkZUNvbnRyb2xsZXIiLCJpc0luR3VpZGUiLCJzZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzIiwiY2hhdF9idWJibGVfc3RhdHVzIiwibGVmdF94IiwicmlnaHRfeCIsInRvcF95IiwiYm90dG9tX3kiLCJnZXROb3RCdWJibGVQcm9tcHQiLCJzZXRTaG93QnViYmxlU3RhdHVzIiwiX3VwZGF0ZVJlbmRlckRhdGEiLCJzZXRDb250ZW50U2l6ZSIsImZhZGVpbiIsImZhZGVvdXQiLCJkZXN0cm95QWxsQ2hpbGRyZW4iLCJtYXhfd2lkdGgiLCJidXR0b25faGVpZ2h0IiwiYnV0dG9uX2hlaWdodF9zcGFjZSIsIm1heF9oZWlnaHQiLCJtYXgiLCJzY3JvbGxfaGVpZ2h0IiwibWluIiwidGlwc19zY3JvbGxfd2lkdGgiLCJ0aXBzX2JnX3dpZHRoIiwiaXRlbSIsImltYWdlIiwiVHlwZSIsIlNMSUNFRCIsInNpemVNb2RlIiwiU2l6ZU1vZGUiLCJDVVNUT00iLCJzZXRBbmNob3JQb2ludCIsIlNwcml0ZUZyYW1lIiwiY29sb3IiLCJDb2xvciIsImZyb21IRVgiLCJjb2xvcl9kYXRhIiwiZGF0YV9jb2xvcjE2Iiwib25DbGlja1Byb21wdFRpcHNJdGVtIiwiY3VzdG9tZXJfc2VydmljZSIsImNyZWF0ZUNsYXNzIiwiY29udGFpbmVyIiwibG9hZGluZyIsIm1vZHVsZSIsImV4cG9ydHMiXSwi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S0FBakM7O0FBQ0EsVUFBSSxLQUFLa0QsV0FBVCxFQUFzQjtBQUNsQixhQUFLQSxXQUFMLENBQWlCbEQsTUFBakIsR0FBMEIsS0FBMUI7QUFDSDtBQUNKLEtBTEQsTUFLTztBQUNILFdBQUtzQyxrQkFBTCxDQUF3QnRDLE1BQXhCLEdBQWtDLElBQWxDOztBQUNBLFVBQUksS0FBS2tELFdBQVQsRUFBc0I7QUFDbEIsYUFBS0EsV0FBTCxDQUFpQmxELE1BQWpCLEdBQTBCLElBQTFCO0FBQ0g7QUFDSjtBQUNKLEdBMWdEcUI7QUEyZ0R0QjtBQUNBMEQsRUFBQUEseUJBQXlCLEVBQUUscUNBQVk7QUFDbkMsUUFBSSxLQUFLcWEsZ0JBQVQsRUFBMkI7QUFDdkIsV0FBS0EsZ0JBQUwsQ0FBc0IvVixRQUF0QjtBQUNBLFdBQUsrVixnQkFBTCxHQUF3QixJQUF4QjtBQUNIOztBQUNELFNBQUtBLGdCQUFMLEdBQXdCbFYsS0FBSyxDQUFDbVYsV0FBTixDQUFrQix5QkFBbEIsQ0FBeEI7O0FBQ0EsUUFBSUMsU0FBUyxHQUFHMWtCLE9BQU8sQ0FBQyxhQUFELENBQVAsQ0FBdUJxQyxXQUF2QixHQUFxQ3FmLFlBQXJDLENBQWtEbGUsU0FBUyxDQUFDbWhCLE9BQTVELENBQWhCOztBQUVBLFNBQUtILGdCQUFMLENBQXNCM2MsU0FBdEIsQ0FBZ0M2YyxTQUFoQztBQUNBLFNBQUtGLGdCQUFMLENBQXNCMWMsSUFBdEI7QUFDSDtBQXRoRHFCLENBQVQsQ0FBakI7QUEyaERBOGMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCL2pCLFVBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDkuLvnlYzpnaLmjqfliLZcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgTG9hZGVyTWFuYWdlciA9IHJlcXVpcmUoXCJsb2FkZXJtYW5hZ2VyXCIpO1xudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFBsYXllckhlYWQgPSByZXF1aXJlKFwicGxheWVyaGVhZFwiKTtcbnZhciBNYWluVWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG52YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBFeGNoYW5nZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZXhjaGFuZ2VfY29udHJvbGxlclwiKTtcbnZhciBGdW5jdGlvbkljb25WbyA9IHJlcXVpcmUoXCJmdW5jdGlvbl9pY29uX3ZvXCIpO1xudmFyIENoYXRDb250cm9sbGVyID0gcmVxdWlyZShcImNoYXRfY29udHJvbGxlclwiKTtcbnZhciBFeGNoYW5nZUV2ZW50ID0gcmVxdWlyZShcImV4Y2hhbmdlX2V2ZW50XCIpXG52YXIgTG9naW5Db250cm9sbGVyID0gcmVxdWlyZShcImxvZ2luX2NvbnRyb2xsZXJcIik7XG52YXIgTWFpbnVpRXZlbnQgPSByZXF1aXJlKFwibWFpbnVpX2V2ZW50XCIpO1xudmFyIFByb21wdEV2ZW50ID0gcmVxdWlyZShcInByb21wdF9ldmVudFwiKVxudmFyIFByb21wdENvbnRyb2xsZXIgPSByZXF1aXJlKFwicHJvbXB0X2NvbnRyb2xsZXJcIilcbnZhciBNYWluVUlWaWV3ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmxlYXNlUHJlZmFiID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdENvbmZpZygpO1xuICAgICAgICB0aGlzLmNyZWF0ZVJvb3RXbmQoKTtcbiAgICB9LFxuICAgIC8vIGNjLnN5cy5nZXRTYWZlQXJlYVJlY3QoKVxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ib3R0b21fYnRuX2xpc3QgPSBbXTsgICAgICAgICAgLy8g5LiL6Z2iN+S4quagh+etvumhtVxuICAgICAgICB0aGlzLmN1cl9zZWxlY3RfaW5kZXggPSAwO1xuICAgICAgICB0aGlzLnJlbmRlcl9saXN0ID0gW11cdFx0XHRcdFx0XHQvLyDlvoXmt7vliqDnmoTlrp7kvovlr7nosaFcbiAgICAgICAgdGhpcy5yZW5kZXJfbGlzdF9kaWMgPSB7fVx0XHRcdFx0XHQvLyDkvYbmt7vliqDlrp7kvovlrZflhbhcbiAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0ID0ge307ICAgICAgICAgICAgICAgICAgICAvL+aYvuekuueahOWunuS+i+WvueixoVxuICAgICAgICB0aGlzLmljb25fY29udGFpbmVyX2xpc3QgPSB7fTsgICAgICAgICAgICAgIC8v5qC55o2u5pa55L2N5L+d5a2Y6ZyA6KaB5YKo5a2Y55qE5Zu+5qCH55qE54i26IqC54K5XG4gICAgICAgIHRoaXMuaWNvbl93aWRnZXRfbGlzdCA9IHt9OyAgICAgICAgICAgICAgICAgLy/moLnmja7mlrnkvY3kv53lrZjpnIDopoHlgqjlrZjnmoTlm77moIfnmoR3aWRnZXToioLngrlcblxuICAgICAgICB0aGlzLmJ0bl9jYWNoZV90aXBzID0ge30gICAgICAgICAgICAvL+e6oueCuee8k+WtmFxuXG4gICAgICAgIHRoaXMubGVmdF9vZmYgPSAyMFxuICAgICAgICB0aGlzLnJpZ2h0X29mZiA9IDIwXG4gICAgICAgIHRoaXMubGVmdF9tYXhfc3VtID0gNztcbiAgICAgICAgdGhpcy5pc19pbl9zaHJpbmsgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc19zaHJpbmsgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXlvdXRfbGlzdCA9IHt9XG4gICAgfSxcblxuICAgIGNyZWF0ZVJvb3RXbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gdGhpcy5ub2RlID0gbmV3IGNjLk5vZGUoXCJiYXNlX3Jvb3RcIik7XG4gICAgICAgIC8vIHRoaXMubm9kZS5zZXRBbmNob3JQb2ludCgwLCAwKTtcbiAgICAgICAgLy8gdGhpcy5ub2RlLnNldENvbnRlbnRTaXplKFNDUkVFTl9XSURUSCwgU0NSRUVOX0hFSUdIVCk7XG4gICAgICAgIC8vIHRoaXMubm9kZS5zZXRQb3NpdGlvbigtU0NSRUVOX1dJRFRIICogMC41LCAtU0NSRUVOX0hFSUdIVCAqIDAuNSk7XG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9TY2VuZU5vZGUodGhpcy5ub2RlLCBTQ0VORV9UQUcudG9wKVxuXG4gICAgICAgIC8vIOiOt+WPluS4gOS6m+mcgOimgeS9v+eUqOeahOWNleS+i1xuICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgICB2YXIgcHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJtYWludWlcIiwgXCJtYWludWlfdmlld1wiKTtcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMocHJlZmFiUGF0aCwgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdE1haW5VSShyZXNfb2JqZWN0KTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG4gICAgaW5pdE1haW5VSTogZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgdGhpcy5yb290X3duZCA9IHJlc19vYmplY3Q7XG5cbiAgICAgICAgaWYgKCF3aW5kb3cuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdF93bmQuZ2V0Q29tcG9uZW50KGNjLldpZGdldCkuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb290X3duZC5zZXRQb3NpdGlvbigtU0NSRUVOX1dJRFRIICogMC41LCAtU0NSRUVOX0hFSUdIVCAqIDAuNSlcbiAgICAgICAgLy8gdGhpcy5ub2RlLmFkZENoaWxkKHRoaXMucm9vdF93bmQpO1xuICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvU2NlbmVOb2RlKHRoaXMucm9vdF93bmQsIFNDRU5FX1RBRy50b3ApXG5cbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmRfY2IpXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kX2NiKHRoaXMucm9vdF93bmQpO1xuXG4gICAgICAgIC8vIOS4i+mDqOWIhueahDfkuKrmjInpkq5cbiAgICAgICAgdGhpcy5ib3R0b21fY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImJvdHRvbV9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMuYnRuX2NvbiA9IHRoaXMuYm90dG9tX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImJudF9jb25cIik7XG4gICAgICAgIC8vIGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbigpeyAgICAgICAgXG4gICAgICAgIC8vICAgICB2YXIgYnRuX2xvID0gIHRoaXMuYnRuX2Nvbi5nZXRDb21wb25lbnQoY2MuTGF5b3V0KTtcbiAgICAgICAgLy8gICAgIHZhciBzcGNpbmdYID0gKHRoaXMuYnRuX2Nvbi53aWR0aCAtIGJ0bl9sby5wYWRkaW5nTGVmdCAtIGJ0bl9sby5wYWRkaW5nUmlnaHQgLSAoOTMgKiA2ICsgMTA1KSkvNjtcbiAgICAgICAgLy8gICAgIGJ0bl9sby5zcGFjaW5nWCA9IHNwY2luZ1g7XG4gICAgICAgIC8vICAgICBjYy5sb2coc3BjaW5nWCk7XG4gICAgICAgIC8vIH0uYmluZCh0aGlzKSwgMC4yKVxuICAgICAgICBpZiAod2luZG93LmlzTW9iaWxlICYmIHdpbmRvdy5GSVRfSEVJREdIVCkge1xuICAgICAgICAgICAgdmFyIGJ0bl9sbyA9IHRoaXMuYnRuX2Nvbi5nZXRDb21wb25lbnQoY2MuTGF5b3V0KTtcbiAgICAgICAgICAgIHZhciBzcGNpbmdYID0gKFNDUkVFTl9XSURUSCAqIEZJVF9TQ0FMRSAtIGJ0bl9sby5wYWRkaW5nTGVmdCAtIGJ0bl9sby5wYWRkaW5nUmlnaHQgLSAoOTMgKiA2ICsgMTA1KSkgLyA2O1xuICAgICAgICAgICAgYnRuX2xvLnNwYWNpbmdYID0gc3BjaW5nWDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA3OyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgYnRuID0gdGhpcy5idG5fY29uLmdldENoaWxkQnlOYW1lKFwibWFpbnVpX3RhYl9cIiArIChpbmRleCArIDEpKTtcblxuICAgICAgICAgICAgaWYgKGJ0bikge1xuICAgICAgICAgICAgICAgIHZhciB0aXBzX3BvaW50ID0gYnRuLmdldENoaWxkQnlOYW1lKFwidGlwc19wb2ludFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsID0gYnRuLmdldENoaWxkQnlOYW1lKFwibm9ybWFsXCIpO1xuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGJ0bi5nZXRDaGlsZEJ5TmFtZShcInNlbGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHZhciBpY29uID0gYnRuLmdldENoaWxkQnlOYW1lKFwiaWNvblwiKTtcbiAgICAgICAgICAgICAgICB2YXIgbm90aWNlID0gYnRuLmdldENoaWxkQnlOYW1lKFwibm90aWNlXCIpXG4gICAgICAgICAgICAgICAgdmFyIGluaXRfeCA9IGJ0bi5nZXRQb3NpdGlvbigpLnhcbiAgICAgICAgICAgICAgICB2YXIgaW5pdF95ID0gYnRuLmdldFBvc2l0aW9uKCkueVxuXG4gICAgICAgICAgICAgICAgdGhpcy5ib3R0b21fYnRuX2xpc3RbaW5kZXhdID0geyBidG46IGJ0biwgaW5kZXg6IGluZGV4LCB0aXBzX3BvaW50OiB0aXBzX3BvaW50LCBub3JtYWw6IG5vcm1hbCwgc2VsZWN0ZWQ6IHNlbGVjdGVkLCBpY29uOiBpY29uLCBub3RpY2U6IG5vdGljZSwgdGlwc19zdGF0dXM6IGZhbHNlLCBpbml0X3g6IGluaXRfeCwgaW5pdF95OiBpbml0X3kgfVxuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBDb25maWcuZnVuY3Rpb25fZGF0YS5kYXRhX2Jhc2VbaW5kZXggKyAxXVxuICAgICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmFjdGl2YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XS5jb25maWcgPSBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XS5ub3RpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XS5ub3RpY2UuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKS5zdHJpbmcgPSBjb25maWcubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZU1haW5VaVN0YXR1cyhpbmRleCk7XG4gICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBNYWluVWlDb25zdC5idG5faW5kZXgubWFpbl9zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1haXVpQnRuU3RhdHVzKGluZGV4KVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmRyYW1hX3NjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XS5za2VsZXRvbiA9IGljb24uZ2V0Q29tcG9uZW50KHNwLlNrZWxldG9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0X2luZGV4ID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0X2J0biA9IHRoaXMuYm90dG9tX2J0bl9saXN0W2luZGV4XVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cl9zZWxlY3RfYnRuLm5vcm1hbC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0X2J0bi5zZWxlY3RlZC5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGJ0bi55ID0gdGhpcy5ib3R0b21fYnRuX2xpc3RbaW5kZXhdLmluaXRfeSArIDEwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOS4iumDqOWIhueahOaYvuekulxuICAgICAgICB0aGlzLnRvcF9jb250YWluZXIgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwidG9wX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5leHBfYmFyID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiZXhwX2JhclwiKVxuICAgICAgICB2YXIgZXhwX25kID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiZXhwX2JhclwiKTtcblxuICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGV4cF93ZGcgPSBleHBfbmQuZ2V0Q29tcG9uZW50KGNjLldpZGdldCk7XG4gICAgICAgICAgICB0aGlzLmV4cF9iYXIud2lkdGggPSB0aGlzLnJvb3Rfd25kLndpZHRoIC0gZXhwX3dkZy5sZWZ0O1xuICAgICAgICB9LmJpbmQodGhpcyksIDAuMSlcblxuICAgICAgICB0aGlzLmZpZ2h0X2NvbiA9IHRoaXMudG9wX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImZpZ2h0X2NvblwiKTtcbiAgICAgICAgdGhpcy5jb2luX3RvdWNoID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiY29pbl90b3VjaFwiKTsgICAgICAgICAgICAgICAgICAgICAvLyDph5HluIHngrnlh7vljLrln59cbiAgICAgICAgdGhpcy5nb2xkX3RvdWNoID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiZ29sZF90b3VjaFwiKTsgICAgICAgICAgICAgICAgICAgICAvLyDpkrvnn7Pngrnlh7vljLrln59cbiAgICAgICAgdGhpcy5TcHJpdGVfOCA9IHRoaXMuY29pbl90b3VjaC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV84XCIpOyAgICAgICAgICAgICAgICAgICAgIC8vIOmHkeW4geWKoOWPt1xuICAgICAgICB0aGlzLlNwcml0ZV8xMCA9IHRoaXMuZ29sZF90b3VjaC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV8xMFwiKTsgICAgICAgICAgICAgICAgICAgICAvLyDpkrvnn7PliqDlj7dcbiAgICAgICAgdGhpcy5jb2luX3JlZHBvaW50ID0gdGhpcy5jb2luX3RvdWNoLmdldENoaWxkQnlOYW1lKFwiU3ByaXRlXzhcIikuZ2V0Q2hpbGRCeU5hbWUoXCJyZWRQb2ludFwiKSAvL+eCuemHkee6oueCuVxuICAgICAgICB0aGlzLmNvaW5fcmVkcG9pbnQuYWN0aXZlID0gRXhjaGFuZ2VDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRSZWRTdGF0dXMoKTtcblxuICAgICAgICB0aGlzLmhlYWRfY29udGFpbmVyID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiaGVhZF9jb250YWluZXJcIik7ICAgICAgICAgICAgICAgLy8g5aS05YOP6YOo5YiGXG4gICAgICAgIHRoaXMucGxheWVyX2hlYWQgPSBuZXcgUGxheWVySGVhZCgpO1xuICAgICAgICB0aGlzLnBsYXllcl9oZWFkLnNldFBhcmVudCh0aGlzLmhlYWRfY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJfaGVhZC5zaG93KClcblxuICAgICAgICB0aGlzLmluZm9fY29udGFpbmVyID0gdGhpcy50b3BfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiaW5mb19jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMubGV2X2xhYmVsID0gdGhpcy5pbmZvX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImxldl9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpOyAgICAgICAgICAgICAgICAgICAgICAgLy8g6KeS6Imy562J57qnXG4gICAgICAgIHRoaXMubmFtZV9sYWJlbCA9IHRoaXMuaW5mb19jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJuYW1lX2xhYmVsXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7ICAgICAgICAgICAgICAgICAgICAgLy8g6KeS6Imy5ZCN5a2XXG4gICAgICAgIHRoaXMuY29pbl9sYWJlbF9uZCA9IHRoaXMuY29pbl90b3VjaC5nZXRDaGlsZEJ5TmFtZShcIndlYWx0aF9sYWJlbF8xXCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDph5HluIHmlbDph49cbiAgICAgICAgdGhpcy5nb2xkX2xhYmVsX25kID0gdGhpcy5nb2xkX3RvdWNoLmdldENoaWxkQnlOYW1lKFwid2VhbHRoX2xhYmVsXzJcIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOmSu+efs+aVsOmHj1xuICAgICAgICB0aGlzLmNvaW5fbGFiZWwgPSB0aGlzLmNvaW5fbGFiZWxfbmQuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTsgICAgICAgICAgICAgICAgIC8vIOmHkeW4geaVsOmHj1xuICAgICAgICB0aGlzLmdvbGRfbGFiZWwgPSB0aGlzLmdvbGRfbGFiZWxfbmQuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTsgICAgICAgICAgICAgICAgIC8vIOmSu+efs+aVsOmHj1xuICAgICAgICB0aGlzLmZpZ2h0X2xhYmVsID0gdGhpcy5maWdodF9jb24uZ2V0Q2hpbGRCeU5hbWUoXCJmaWdodF9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpOyAgICAgICAgICAgICAgICAgICAvLyDmiJjliptcbiAgICAgICAgdGhpcy5jb2luX25kID0gdGhpcy5jb2luX3RvdWNoLmdldENoaWxkQnlOYW1lKFwiU3ByaXRlXzJcIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6YeR5biBbm9kZVxuICAgICAgICB0aGlzLmdvbGRfbmQgPSB0aGlzLmdvbGRfdG91Y2guZ2V0Q2hpbGRCeU5hbWUoXCJTcHJpdGVfNFwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDpkrvnn7Nub2RlXG4gICAgICAgIHRoaXMuY29pbl9zcCA9IHRoaXMuY29pbl9uZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6YeR5biB5Zu+5qCHXG4gICAgICAgIHRoaXMuZ29sZF9zcCA9IHRoaXMuZ29sZF9uZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6ZK755+z5Zu+5qCHXG5cbiAgICAgICAgdGhpcy5oaWRlX2NvbnRhaW5lciA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJoaWRlX2NvbnRhaW5lclwiKVxuICAgICAgICB0aGlzLmhhbmRsZV9idG4gPSB0aGlzLmhpZGVfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiaGFuZGxlX2J0blwiKVxuICAgICAgICAvL+ezu+e7n+aPkOekulxuICAgICAgICB0aGlzLnByb21wdF9jb250YWluZXIgPSB0aGlzLmhpZGVfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwicHJvbXB0X2NvbnRhaW5lclwiKVxuICAgICAgICB0aGlzLnByb21wdF90aXBzX2xheW91dCA9IHRoaXMucHJvbXB0X2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInRpcHNfbGF5b3V0XCIpXG4gICAgICAgIHRoaXMucHJvbXB0X2J1YmJsZV9sYXlvdXQgPSB0aGlzLnByb21wdF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJidWJibGVfbGF5b3V0XCIpXG4gICAgICAgIHRoaXMucHJvbXB0X3RpcHNfYnRuID0gdGhpcy5wcm9tcHRfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGlwc19idG5cIilcbiAgICAgICAgdGhpcy5wcm9tcHRfZGVzYyA9IHRoaXMucHJvbXB0X2J1YmJsZV9sYXlvdXQuZ2V0Q2hpbGRCeU5hbWUoXCJkZXNjXCIpLmdldENvbXBvbmVudChjYy5MYWJlbClcbiAgICAgICAgdGhpcy5wcm9tcHRfYnViYmxlID0gdGhpcy5wcm9tcHRfYnViYmxlX2xheW91dC5nZXRDaGlsZEJ5TmFtZShcImJ1YmJsZVwiKVxuICAgICAgICB0aGlzLnByb21wdF9idWJibGVfc2l6ZSA9IHRoaXMucHJvbXB0X2J1YmJsZS5nZXRDb250ZW50U2l6ZSgpXG5cbiAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19zY3JvbGwgPSB0aGlzLnByb21wdF90aXBzX2xheW91dC5nZXRDaGlsZEJ5TmFtZShcInRpcHNfc2Nyb2xsXCIpXG4gICAgICAgIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsX3NpemUgPSB0aGlzLnByb21wdF90aXBzX3Njcm9sbC5nZXRDb250ZW50U2l6ZSgpXG4gICAgICAgIHRoaXMuY291bnRfc2l6ZV9sYWJlbCA9IHRoaXMucHJvbXB0X3RpcHNfbGF5b3V0LmdldENoaWxkQnlOYW1lKFwiY291bnRfc2l6ZV9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpXG5cbiAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19iZyA9IHRoaXMucHJvbXB0X3RpcHNfbGF5b3V0LmdldENoaWxkQnlOYW1lKFwidGlwc19iZ1wiKVxuICAgICAgICB0aGlzLnByb21wdF90aXBzX2JnX3NpemUgPSB0aGlzLnByb21wdF90aXBzX2JnLmdldENvbnRlbnRTaXplKClcbiAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19idG4uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJvbXB0X3RpcHNfbGF5b3V0LmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMucHJvbXB0X21hc2sgPSB0aGlzLmhpZGVfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwicHJvbXB0X21hc2tcIilcbiAgICAgICAgLy8g5Y+v5o6n6YOo5YiGLOmcgOimgemakOiXj+aIluiAheaYvuekulxuICAgICAgICB0aGlzLmhpZGVfY29udGFpbmVyID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImhpZGVfY29udGFpbmVyXCIpICAgICAgICAgICAgICAgICAgICAvLyDlj6/pmpDol4/pg6jliIZcbiAgICAgICAgdGhpcy5oYW5kbGVfYnRuID0gdGhpcy5oaWRlX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImhhbmRsZV9idG5cIikgICAgICAgICAgICAgICAgICAgICAgLy8g5LiL6Z2i5o6n5Yi25oyJ6ZKuXG4gICAgICAgIC8v5Yib5bu66IGK5aSp5oyJ6ZKuXG4gICAgICAgIHRoaXMuY3JlYXRvckNoYXRCdG4oKVxuICAgICAgICAvLyB0aGlzLmNoYXRfYnRuX25kID0gdGhpcy5oaWRlX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImNoYXRfYnRuXCIpO1xuICAgICAgICBSZWRNZ3IuZ2V0SW5zdGFuY2UoKS5hZGRDYWxIYW5kbGVyKHRoaXMudXBkYXRlQ2hhdE1zZ051bS5iaW5kKHRoaXMpKTtcbiAgICAgICAgLy8g5oiY5Yqb55u45YWzXG4gICAgICAgIC8vIHRoaXMucG93ZXJfc2hvd19uZCA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJwb3dlcl9zaG93XCIpO1xuICAgICAgICAvLyB0aGlzLnBvd2VyX3NrID0gdGhpcy5wb3dlcl9zaG93X25kLmdldENoaWxkQnlOYW1lKFwiYW5pX2NvblwiKS5nZXRDb21wb25lbnQoc3AuU2tlbGV0b24pO1xuICAgICAgICAvLyB2YXIgdGV4X2Nvbl9uZCA9IHRoaXMucG93ZXJfc2hvd19uZC5nZXRDaGlsZEJ5TmFtZShcInR4dF9jb25cIik7XG4gICAgICAgIC8vIHRoaXMub2xkX3Bvd2VyX3JiID0gdGV4X2Nvbl9uZC5nZXRDaGlsZEJ5TmFtZShcIm9sZF9wb3dlclwiKS5nZXRDb21wb25lbnQoY2MuUmljaFRleHQpO1xuICAgICAgICAvLyB0aGlzLmFkZF9wb3dlcl9sYiA9IHRleF9jb25fbmQuZ2V0Q2hpbGRCeU5hbWUoXCJhZGRfcG93ZXJcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUhhbmRsZUJ0blNob3dTdGF0dXMoKVxuICAgICAgICAvLyB0aGlzLmNoYXRfcmVkX2JnID0gdGhpcy5jaGF0X2J0bl9uZC5nZXRDaGlsZEJ5TmFtZShcImNoYXRfcmVkX2JnXCIpO1xuICAgICAgICAvLyB0aGlzLmNoYXRfcmVkX251bSA9IHRoaXMuY2hhdF9yZWRfYmcuZ2V0Q2hpbGRCeU5hbWUoXCJjaGF0X3JlZF9udW1cIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgaWYgKFVTRV9TREsgPT0gdHJ1ZSAmJiBQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIpIHtcbiAgICAgICAgICAgIC8v5Yib5bu65rex5rW35bCP56iL5bqP5a6i5pyN5rWu5qCHIFxuICAgICAgICAgICAgdGhpcy5jcmVhdG9yQ3VzdG9tZXJTZXJ2aWNlQnRuKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmltYWdlXzIgPSB0aGlzLnRvcF9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV8yXCIpXG4gICAgICAgIHRoaXMudmlwX2xhYmVsID0gdGhpcy5pbWFnZV8yLmdldENoaWxkQnlOYW1lKFwidmlwX2xhYmVsXCIpLmdldENvbXBvbmVudChcIkN1c1JpY2hUZXh0XCIpXG5cblxuXG4gICAgICAgIGZvciAodmFyIGsgaW4gRnVuY3Rpb25JY29uVm8udHlwZSkge1xuICAgICAgICAgICAgdmFyIHYgPSBGdW5jdGlvbkljb25Wby50eXBlW2tdO1xuICAgICAgICAgICAgdmFyIGljb25fY29udGFpbmVyID0gdGhpcy5oaWRlX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImljb25fY29udGFpbmVyX1wiICsgdik7XG4gICAgICAgICAgICBpZiAoaWNvbl9jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmljb25fY29udGFpbmVyX2xpc3Rbdl0gPSBpY29uX2NvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICB2YXIgX3ggPSAwO1xuICAgICAgICAgICAgICAgIHZhciBfeSA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT0gRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF90b3BfMSkge1xuICAgICAgICAgICAgICAgICAgICBfeCA9IC04O1xuICAgICAgICAgICAgICAgICAgICBfeSA9IHRoaXMudG9wX2NvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpLmhlaWdodCArIDE1O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X3RvcF8yKSB7XG4gICAgICAgICAgICAgICAgICAgIF94ID0gLTg7XG4gICAgICAgICAgICAgICAgICAgIF95ID0gdGhpcy50b3BfY29udGFpbmVyLmdldENvbnRlbnRTaXplKCkuaGVpZ2h0IC0gMTAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X2JvdHRvbV8xKSB7XG4gICAgICAgICAgICAgICAgICAgIF94ID0gLTQ1IC0gNTc7XG4gICAgICAgICAgICAgICAgICAgIC8vIF95ID0gdGhpcy5ib3R0b21fY29udGFpbmVyLmdldENvbnRlbnRTaXplKCkuaGVpZ2h0ICsgNjA7XG4gICAgICAgICAgICAgICAgICAgIF95ID0gaWNvbl9jb250YWluZXIueTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF9ib3R0b21fMikge1xuICAgICAgICAgICAgICAgICAgICBfeCA9IDMyMC41O1xuICAgICAgICAgICAgICAgICAgICAvLyBfeSA9IHRoaXMuYm90dG9tX2NvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpLmhlaWdodCArIDYwICsgNTU7XG4gICAgICAgICAgICAgICAgICAgIF95ID0gLTM2N1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpY29uX2NvbnRhaW5lci5zZXRQb3NpdGlvbihfeCwgX3kpO1xuICAgICAgICAgICAgICAgIHZhciBpY29uX3dpZGdldCA9IGljb25fY29udGFpbmVyLmdldENvbXBvbmVudChjYy5XaWRnZXQpO1xuICAgICAgICAgICAgICAgIGlmIChpY29uX3dpZGdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmljb25fd2lkZ2V0X2xpc3Rbdl0gPSBpY29uX3dpZGdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhQYXRoVG9vbC5nZXRJdGVtUmVzKFwiMVwiKSwgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgdGhpcy5jb2luX3NwLnNwcml0ZUZyYW1lID0gcmVzXG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoUGF0aFRvb2wuZ2V0SXRlbVJlcyhcIjNcIiksIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ29sZF9zcC5zcHJpdGVGcmFtZSA9IHJlc1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIC8vIOWKoOi9veWujOaIkOS5i+WQjuazqOWGjOebkeWQrFxuICAgICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoKTtcbiAgICAgICAgLy8g5Yib5bu65oyR5oiY5oyJ6ZKuXG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhbGxlbmdlRWZmZWN0KCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm9sZURhdGEoKTtcbiAgICAgICAgdGhpcy5tYXhfZHVuX2lkID0gdGhpcy5tYWludWlfY29udHJvbGxlci5tYXhfZHVuX2lkXG4gICAgICAgIGlmICh0aGlzLm1heF9kdW5faWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1VuTG9ja1N0YXR1cyh0aGlzLm1heF9kdW5faWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIC0tIOWIpOaWreetiee6p+ino+mUgeS4u+aMiemSrlxuICAgICAgICB0aGlzLmNoZWNrVW5Mb2NrU3RhdHVzQnlMZXYoKVxuICAgICAgICAvLyAtLSDmiYDmnInmtLvliqjnmoTml7bpl7TlgJLorqHml7Ys57uf5LiA55So5LiA5Liq5a6a5pe25Zmo5Zyo6L+Z6YeM5YGa5aSE55CGXG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX3RpbWVfdGlja2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uX2xpc3QgPSByZXF1aXJlKFwiYWN0aW9uX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRBbGxBY3Rpb25MaXN0KClcbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25fdGltZV90aWNrZXQgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25UaW1lVGlja2V0TGlzdCgpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwLCAtMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVU0VfU0RLID09IHRydWUgJiYgTkVFRF9BREFQVElWRV9TREtbd2luZG93LlBMQVRGT1JNX1RZUFJdKSB7XG4gICAgICAgICAgICB0aGlzLmNvaW5fbmQueCA9IC0yODtcbiAgICAgICAgICAgIC8vIHRoaXMuZ29sZF9uZC54ID0gLTI4O1xuICAgICAgICAgICAgdGhpcy5jb2luX2xhYmVsX25kLnggPSAyOTtcbiAgICAgICAgICAgIC8vIHRoaXMuZ29sZF9sYWJlbF9uZC54ID0gMjk7XG4gICAgICAgICAgICB0aGlzLlNwcml0ZV84LnggPSAtNjA7XG4gICAgICAgICAgICAvLyB0aGlzLlNwcml0ZV8xMC54ID0gLTYwO1xuICAgICAgICAgICAgdGhpcy5TcHJpdGVfMTAuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIOWwj+a4uOaIj+mcgOimgeiwg+aVtOmhtumDqOagj1xuICAgICAgICBpZiAod2luZG93LlBMQVRGT1JNX1RZUFIgPT0gXCJXWF9TREtcIiB8fCB3aW5kb3cuUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiIHx8IFBMQVRGT1JNX1RZUFIgPT0gXCJRUV9TREtcIikge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5XWF9GSVQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWRkX3ZhbCA9IHRoaXMucm9vdF93bmQuaGVpZ2h0ICogd2luZG93LldYX0ZJVDtcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLlvq7kv6HlsI/muLjmiI/pgILphY3oj5zljZXmoI9cIik7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJhZGRfdmFsXCIpO1xuICAgICAgICAgICAgICAgIHZhciB0b3Bfd2RnID0gdGhpcy50b3BfY29udGFpbmVyLmdldENvbXBvbmVudChjYy5XaWRnZXQpO1xuICAgICAgICAgICAgICAgIHZhciBjb24xX3dkZyA9IHRoaXMuaWNvbl9jb250YWluZXJfbGlzdFsxXS5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KTtcbiAgICAgICAgICAgICAgICB0b3Bfd2RnLnRvcCArPSBhZGRfdmFsO1xuICAgICAgICAgICAgICAgIGNvbjFfd2RnLnRvcCArPSBhZGRfdmFsO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDlhbPpl61sb2FkaW5n55WM6Z2iXG4gICAgICAgIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZUxvYWRpbmcoMSk7XG4gICAgICAgIHRoaXMuY2xvc2VfbG9naW5fdGlja2V0ID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIExvZ2luQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5Mb2dpbldpbmRvdyhmYWxzZSk7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5jbG9zZV9sb2dpbl90aWNrZXQpO1xuICAgICAgICAgICAgSVNfTE9BRElORyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKFBMQVRGT1JNX1RZUFIgPT0gXCJTSF9SSFwiIHx8IFBMQVRGT1JNX1RZUFIgPT0gXCJTSF9TREtcIikge1xuICAgICAgICAgICAgICAgIFNESy5zdWJtaXRMb2dpbigpO1xuICAgICAgICAgICAgICAgIGlmIChVU0VfU0RLID09IHRydWUgJiYgUExBVEZPUk1fVFlQUiA9PSBcIlNIX1NES1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIFNESy5kYXRhUGxhY2VtZW50KDkwNTAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFVTRV9TREsgPT0gdHJ1ZSAmJiBQTEFURk9STV9UWVBSID09IFwiV1hfU0RLXCIpIHtcbiAgICAgICAgICAgICAgICBTREsubG9naW5Mb2coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoTWFpbnVpRXZlbnQuTE9BRElOR19FTlRFUl9TQ0VORSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMjAwLCAxKVxuXG4gICAgICAgIC8v6IOM5YyF57qi54K5XG4gICAgICAgIGxldCBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKVxuICAgICAgICBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldEhlcm9DaGlwUmVkUG9pbnQoKVxuXG4gICAgICAgIC8v57qi54K5XG4gICAgICAgIGxldCBjdHJsQ2FjaGVzUmVkID0gdGhpcy5tYWludWlfY29udHJvbGxlci5nZXRDYWNoZXNCdG5SZWQoKVxuICAgICAgICBpZiAoY3RybENhY2hlc1JlZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdHJsQ2FjaGVzUmVkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCdG5UaXBzUG9pbnQoY3RybENhY2hlc1JlZFtpXVswXSwgY3RybENhY2hlc1JlZFtpXVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlc2V0Q2FjaGVzUmV0RGF0YSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVNoZW5xaSgpO1xuXG4gICAgICAgIGxldCBXaWRnZXQgPSB0aGlzLnByb21wdF9jb250YWluZXIuZ2V0Q29tcG9uZW50KGNjLldpZGdldClcbiAgICAgICAgaWYgKHRoaXMudGFza190aXBzX3BhbmVsID09IG51bGwpIHtcbiAgICAgICAgICAgIFdpZGdldC5ib3R0b20gPSAxNDRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFdpZGdldC5ib3R0b20gPSAzMzQuMjg7XG4gICAgICAgIH1cbiAgICAgICAgV2lkZ2V0LnVwZGF0ZUFsaWdubWVudCgpXG4gICAgfSxcblxuICAgIC8v56We5Zmo5Lu75YqhXG4gICAgdXBkYXRlU2hlbnFpOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCB0YXNrX2NvbnRhaW5lciA9IHRoaXMuaGlkZV9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJ0YXNrX2NvbnRhaW5lclwiKTtcbiAgICAgICAgLy8gbGV0IGhhbGxvd3Nfc3RhdHVzID0gcmVxdWlyZShcImhhbGxvd3NfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2hlY2tJc0hhdmVBbGxIYWxsb3dzKCk7XG4gICAgICAgIC8vIGxldCBsaW1pdF9kdW4gPSBDb25maWcuZnVuY3Rpb25fZGF0YS5kYXRhX2Jhc2VbN10uYWN0aXZhdGVbMF1bMV07XG4gICAgICAgIGxldCBsaW1pdF9sZXYgPSA2O1xuICAgICAgICBpZiAoQ29uZmlnLnF1ZXN0X2RhdGEuZGF0YV9jb25zdCkge1xuICAgICAgICAgICAgbGltaXRfbGV2ID0gQ29uZmlnLnF1ZXN0X2RhdGEuZGF0YV9jb25zdC50YXNrX29wZW4udmFsWzFdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgaWYgKHRoaXMudGFza190aXBzX3BhbmVsID09IG51bGwgJiYgcm9sZV92by5sZXYgPj0gbGltaXRfbGV2KSB7XG4gICAgICAgICAgICBsZXQgVGFza1RpcHNQYW5lbCA9IHJlcXVpcmUoXCJ0YXNrX3RpcHNfcGFuZWxcIik7XG4gICAgICAgICAgICB0aGlzLnRhc2tfdGlwc19wYW5lbCA9IG5ldyBUYXNrVGlwc1BhbmVsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy50YXNrX3RpcHNfcGFuZWwuc2V0UGFyZW50KHRhc2tfY29udGFpbmVyKTtcbiAgICAgICAgICAgIHRoaXMudGFza190aXBzX3BhbmVsLnNob3coKTtcbiAgICAgICAgICAgIGxldCBXaWRnZXQgPSB0aGlzLnByb21wdF9jb250YWluZXIuZ2V0Q29tcG9uZW50KGNjLldpZGdldClcbiAgICAgICAgICAgIFdpZGdldC5ib3R0b20gPSAzMzQuMjg7XG4gICAgICAgICAgICBXaWRnZXQudXBkYXRlQWxpZ25tZW50KClcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZGVsZXRlVGFza1RpcCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGFza190aXBzX3BhbmVsKSB7XG4gICAgICAgICAgICB0aGlzLnRhc2tfdGlwc19wYW5lbC5kZWxldGVNZSgpXG4gICAgICAgICAgICB0aGlzLnRhc2tfdGlwc19wYW5lbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFdpZGdldCA9IHRoaXMucHJvbXB0X2NvbnRhaW5lci5nZXRDb21wb25lbnQoY2MuV2lkZ2V0KVxuICAgICAgICBXaWRnZXQuYm90dG9tID0gMTQ0XG4gICAgICAgIFdpZGdldC51cGRhdGVBbGlnbm1lbnQoKVxuICAgIH0sXG4gICAgZ2V0VGFza1RpcHNQYW5lbDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrX3RpcHNfcGFuZWwucm9vdF93bmQ7XG4gICAgfSxcblxuICAgIC8vIOWIm+W7uuaMkeaImOWKqOeUu1xuICAgIGNyZWF0ZUNoYWxsZW5nZUVmZmVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYnRuX29iamVjdCA9IHRoaXMuYm90dG9tX2J0bl9saXN0W01haW5VaUNvbnN0LmJ0bl9pbmRleC5kcmFtYV9zY2VuZV07XG4gICAgICAgIGlmIChidG5fb2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhcInNwaW5lL0U1MTEzMC9hY3Rpb24uYXRsYXNcIiwgKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgIGJ0bl9vYmplY3Quc2tlbGV0b24uc2tlbGV0b25EYXRhID0gcmVzO1xuICAgICAgICAgICAgYnRuX29iamVjdC5za2VsZXRvbi5zZXRBbmltYXRpb24oMCwgXCJhY3Rpb24xXCIsIHRydWUpO1xuICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgIH0sXG5cbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJvbXB0X3RpcHNfYnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xpY2tQcm9tcHRUaXBzKClcbiAgICAgICAgfSwgdGhpcylcbiAgICAgICAgdGhpcy5oZWFkX2NvbnRhaW5lci5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuUm9sZUluZm9WaWV3KHRydWUpO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb2luX3RvdWNoLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBFeGNoYW5nZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRXhjaGFuZ2VNYWluVmlldyh0cnVlKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIHRoaXMuZ29sZF90b3VjaC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzX2hlcm9fcGFuZWwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlKFwidmlwX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuVmlwTWFpbldpbmRvdyh0cnVlLCBWSVBUQUJDT05TVC5DSEFSR0UpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgICAgICBCYWNrcGFja0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuVGlwc1NvdXJjZSh0cnVlLCBVdGlscy5nZXRJdGVtQ29uZmlnKDIyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB0aGlzLmhhbmRsZV9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hyaW5rQnRuQ29udGFpbmVyKCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8g6IGK5aSpXG4gICAgICAgIHRoaXMuY2hhdF9uZXdtc2dfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuQ0hBVF9ORVdNU0dfRkxBRywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgUmVkTWdyLmdldEluc3RhbmNlKCkuYWRkQ2FsSGFuZGxlcih0aGlzLnVwZGF0ZUNoYXRNc2dOdW0uYmluZCh0aGlzKSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy/ngrnph5HnuqLngrlcbiAgICAgICAgdGhpcy5jb2luX3RvdWNoX3JlZHBvaW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChFeGNoYW5nZUV2ZW50LkV4dHJhX1Jld2FyZCwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuY29pbl9yZWRwb2ludC5hY3RpdmUgPSBFeGNoYW5nZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpLmdldFJlZFN0YXR1cygpO1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIHRoaXMucm9sZV92by5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCAoZnVuY3Rpb24gKGtleSwgdmFsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwb3dlclwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJvbGVQb3dlcigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibGV2XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUm9sZUxldigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVW5Mb2NrU3RhdHVzQnlMZXYodmFsKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJvbGVOYW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb2luXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUm9sZUNvaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImdvbGRcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb2xlR29sZCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZmFjZV9pZFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXllcl9oZWFkLnNldEhlYWRSZXModmFsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImF2YXRhcl9iYXNlX2lkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyX2hlYWQuc2V0RnJhbWVSZXModmFsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInZpcF9sZXZcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb2xlVmlwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJleHBcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb2xlRXhwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJleHBfbWF4XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUm9sZUV4cCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiaGVyb19leHBcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVIZXJvRXhwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSwgdGhpcyk7XG5cbiAgICAgICAgLy/ns7vnu5/mj5DnpLrlop7liqBcbiAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZV9wcm9tcHRfdGlwcykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVfcHJvbXB0X3RpcHMgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKFByb21wdEV2ZW50LkFERF9QUk9NUFRfREFUQSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyAtLSDkuLvln47mraPlnKjmmL7npLrkuJTkuI3lnKjogYrlpKnnlYzpnaLmiY3mmL7npLrmsJTms6FcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc19vcGVuICYmICFDaGF0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmlzQ2hhdE9wZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcm9tcHRCdWJibGUoZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGVsID0gUHJvbXB0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKClcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3QgPSBtb2RlbC5nZXRQcm9tcHRMaXN0KClcbiAgICAgICAgICAgICAgICAgICAgaWYgKFV0aWxzLmdldEFyckxlbihsaXN0KSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1Byb21wdFRpcHModHJ1ZSwgbGlzdClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgICAgICAvL+ezu+e7n+aPkOekuuenu+mZpFxuICAgICAgICBpZiAoIXRoaXMucmVtb3ZlX3Byb21wdF90aXBzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZV9wcm9tcHRfdGlwcyA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoUHJvbXB0RXZlbnQuUkVNT1ZFX1BST01QVF9EQVRBLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1vZGVsID0gUHJvbXB0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKClcbiAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IG1vZGVsLmdldFByb21wdExpc3QoKVxuICAgICAgICAgICAgICAgIGlmIChVdGlscy5nZXRBcnJMZW4obGlzdCkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1Byb21wdFRpcHModHJ1ZSwgbGlzdClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcm9tcHRUaXBzKGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb21wdF9tYXNrLm9uKCd0b3VjaGVuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X21hc2suYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX2xheW91dC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSwgdGhpcylcbiAgICB9LFxuXG4gICAgb3BlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5yb290X3duZCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVIaWRlQ29udGFpbmVyKHRydWUpXG4gICAgICAgICAgICB0aGlzLmNoZWNrU2hvd05ld1Byb21wdEJ1YmJsZSgpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5omT5byA5pi+56S655qE5pe25YCZ5LiN6ZyA6KaB6ams5LiK5pi+56S65Ye65p2lLOWboOS4uuWPr+iDveS7juS4gOS4queVjOmdouWIh+aNouWIsOWPpuWkluS4gOS4queVjOmdoiDov5nkuKrml7blgJnkuI3pnIDopoHmmL7npLpcbiAgICBoYW5kbGVIaWRlQ29udGFpbmVyOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuaGlkZV9jb250YWluZXJfc3RhdHVzID0gc3RhdHVzXG4gICAgICAgIGlmICh0aGlzLndhaXRfdXBkYXRlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMud2FpdF91cGRhdGUgPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWRlX2NvbnRhaW5lcl9zdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzX29wZW4gPSB0aGlzLmhpZGVfY29udGFpbmVyX3N0YXR1c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVfY29udGFpbmVyLmFjdGl2ZSA9IHRoaXMuaXNfb3BlblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bmN0aW9uVXBkYXRlTGlzdCgpO1xuICAgICAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy53YWl0X3VwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdF91cGRhdGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDIwMCwgLTEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEhpZGVDb250YWluZXJTdGF0dXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlkZV9jb250YWluZXJfc3RhdHVzO1xuICAgIH0sXG5cbiAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5oaWRlX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5pc19vcGVuID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuaGlkZV9jb250YWluZXJfc3RhdHVzID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuaGlkZV9jb250YWluZXIuYWN0aXZlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICAvLyBpZih0aGlzLmZ1bmN0aW9uX3RpbWVfdGlja2V0KXtcbiAgICAgICAgLy8gZ2NvcmUuVGltZXIuZGVsKHRoaXMuZnVuY3Rpb25fdGltZV90aWNrZXQpO1xuICAgICAgICAvLyB0aGlzLmZ1bmN0aW9uX3RpbWVfdGlja2V0ID0gbnVsbDtcbiAgICAgICAgLy8gfVxuICAgIH0sXG5cbiAgICAvLyDliIfmjaLkuLt1aeeahOeKtuaAgVxuICAgIGNoYW5nZU1haW5VaVN0YXR1czogZnVuY3Rpb24gKGluZGV4LCBzdWJfdHlwZSwgZXh0ZW5kX2RhdGEpIHtcbiAgICAgICAgdmFyIGJ0bl9vYmplY3QgPSB0aGlzLmJvdHRvbV9idG5fbGlzdFtpbmRleF07XG4gICAgICAgIGlmIChidG5fb2JqZWN0ID09IG51bGwgfHwgIWJ0bl9vYmplY3QuaXNfdW5sb2NrKSB7XG4gICAgICAgICAgICBtZXNzYWdlKGJ0bl9vYmplY3QuY29uZmlnLmRlc2MpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyDliIfno4vkuK3nmoTml7blgJks5LiN6ZyA6KaB5YiH5o2iXG4gICAgICAgIGlmICh0aGlzLmNoZWNrRmlnaHRDbGlja1N0YXR1cygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8g5aaC5p6c5b6F6YCJ5Lit55qE5piv5ZCM5LiA5LiqXG4gICAgICAgIGlmICgodGhpcy5jdXJfc2VsZWN0X2luZGV4ID09IGluZGV4KSAmJiAoaW5kZXggIT0gTWFpblVpQ29uc3QuYnRuX2luZGV4Lm1haW5fc2NlbmUpKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmRyYW1hX3NjZW5lKSB7XG4gICAgICAgICAgICAgICAgVXRpbHMuY2xvc2VBbGxXaW5kb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE1haXVpQnRuU3RhdHVzKGluZGV4KTtcblxuICAgICAgICAvLyDlhbPpl63miYDmnInnqpfkvZNcbiAgICAgICAgVXRpbHMuY2xvc2VBbGxXaW5kb3coKTtcblxuICAgICAgICAvLyDlj6ropoHkuI3mmK/liafmg4Xlia/mnKws6YO95YiH5Ye65oiY5paXXG4gICAgICAgIGlmIChpbmRleCAhPSBNYWluVWlDb25zdC5idG5faW5kZXguRGFybWEpIHtcbiAgICAgICAgICAgIHRoaXMuYmF0dGxlX2NvbnRyb2xsZXIucmVxdWVzdEN1dE91dEJhdHRsZSgpXG4gICAgICAgICAgICB0aGlzLmJhdHRsZV9jb250cm9sbGVyLmdldE1vZGVsKCkuY2xlYXJCYXR0bGVTY2VuZSgpO1xuICAgICAgICAgICAgLy8gY2xlYXJCYXR0bGVTY2VuZVxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VCYWNrZ3JvdW5kTXVzaWMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA9PSBNYWluVWlDb25zdC5idG5faW5kZXgubWFpbl9zY2VuZSkge1xuICAgICAgICAgICAgdmFyIG1haW5TY2VuZUN0cmwgPSByZXF1aXJlKFwibWFpbnNjZW5lX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgIG1haW5TY2VuZUN0cmwuZW50ZXJNYWluU2NlbmUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LnBhcnRuZXIpIHtcbiAgICAgICAgICAgIHZhciBoZXJvX2NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgICAgICBoZXJvX2NvbnRyb2xsZXIub3Blbkhlcm9CYWdXaW5kb3codHJ1ZSwgc3ViX3R5cGUpXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmJhY2twYWNrKSB7XG4gICAgICAgICAgICB2YXIgY29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKClcbiAgICAgICAgICAgIGNvbnRyb2xsZXIub3Blbk1haW5XaW5kb3codHJ1ZSwgc3ViX3R5cGUpXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmRyYW1hX3NjZW5lKSB7XG4gICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuRGFybWEpXG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4LmVzZWNzaWNlKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiZXNlY3NpY2VfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5Fc2Vjc2ljZVZpZXcodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4Lmd1aWxkKSB7XG4gICAgICAgICAgICByZXF1aXJlKFwiZ3VpbGRfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmNoZWNrT3Blbkd1aWxkV2luZG93KClcbiAgICAgICAgICAgIC8vICDmuIXmpZrkuLvnlYzpnaLkuIrpnaLnmoTnuqLngrlcbiAgICAgICAgICAgIHZhciBHdWlsZHNraWxsQ29udHJvbGxlciA9IHJlcXVpcmUoXCJndWlsZHNraWxsX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBHdWlsZHNraWxsQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuY2xlYXJHdWlsZFNraWxsSWNvblJlZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IE1haW5VaUNvbnN0LmJ0bl9pbmRleC5oYWxsb3dzKSB7XG4gICAgICAgICAgICB2YXIgY29udHJvbGxlciA9IHJlcXVpcmUoXCJoYWxsb3dzX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgIGlmIChleHRlbmRfZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBoYWxsb3dzX2lkID0gZXh0ZW5kX2RhdGFbMF07XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZXh0ZW5kX2RhdGFbMV07XG4gICAgICAgICAgICAgICAgdmFyIG1hZ2ljX2lkID0gZXh0ZW5kX2RhdGFbMl07XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vcGVuSGFsbG93c01haW5XaW5kb3codHJ1ZSwgaGFsbG93c19pZCwgaW5kZXgsIG1hZ2ljX2lkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vcGVuSGFsbG93c01haW5XaW5kb3codHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvQ2hhbmdlQnlTdWJUeXBlKGluZGV4LCBzdWJfdHlwZSwgZXh0ZW5kX2RhdGEpO1xuICAgIH0sXG5cbiAgICAvLyDlj6ropoHkuI3mmK/liafmg4XmiJjmlpcs6YO95YiH5YiA5oyH5a6a6Z+z5LmQXG4gICAgY2hhbmdlQmFja2dyb3VuZE11c2ljOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFV0aWxzLnBsYXlNdXNpYyhBVURJT19UWVBFLlNDRU5FLCBcInNfMDAyXCIsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvL+i3s+i9rOWkhOeQhlxuICAgIGRvQ2hhbmdlQnlTdWJUeXBlOiBmdW5jdGlvbiAobWFpbl90eXBlLCBzdWJfdHlwZSwgZXh0ZW5kX2RhdGEpIHtcbiAgICAgICAgaWYgKG1haW5fdHlwZSA9PSBudWxsIHx8IHN1Yl90eXBlID09IG51bGwpIHJldHVyblxuICAgICAgICB0aGlzLnN1Yl90eXBlID0gc3ViX3R5cGU7XG4gICAgICAgIGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJfdHlwZSAmJiB0aGlzLnN1Yl90eXBlICE9IHN1Yl90eXBlKSByZXR1cm5cbiAgICAgICAgICAgIGlmIChtYWluX3R5cGUgPT0gTWFpblVpQ29uc3QuYnRuX2luZGV4Lm1haW5fc2NlbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuYXJlbmFfY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgU2NlbmVDb25zdCA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEFyZW5hQ29uc3QgPSByZXF1aXJlKFwiYXJlbmFfY29uc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJtYWluc2NlbmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5CdWlsZChTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuYXJlbmEsIEFyZW5hQ29uc3QuYXJlbmFfdHlwZS5sb29wKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuY2hhbXBpb25fY2FsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgU2NlbmVDb25zdCA9IHJlcXVpcmUoXCJzY2VuZV9jb25zdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEFyZW5hQ29uc3QgPSByZXF1aXJlKFwiYXJlbmFfY29uc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJtYWluc2NlbmVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5CdWlsZChTY2VuZUNvbnN0LkNlbnRlclNjZW5lQnVpbGQuYXJlbmEsIEFyZW5hQ29uc3QuYXJlbmFfdHlwZS5yYW5rKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZ3VpbGRfYm9zcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICYmIHRoaXMucm9sZV92by5naWQgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuaCqOaaguaXtui/mOayoeacieWKoOWFpeWFrOS8mlwiKSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5HdWlsZER1bilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuc3RhcnRvd2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5TdGFyVG93ZXIpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJfdHlwZSA9PSBNYWluVWlDb25zdC5zdWJfdHlwZS5wYXJ0bmVyc3VtbW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJwYXJ0bmVyc3VtbW9uX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuUGFydG5lclN1bW1vbldpbmRvdyh0cnVlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZXNjb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5Fc2NvcnQsIGV4dGVuZF9kYXRhKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUud29uZGVyZnVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGV4dGVuZF9kYXRhKSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgQWN0aW9uQ29uc3QgPSByZXF1aXJlKFwiYWN0aW9uX2NvbnN0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcImFjdGlvbl9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkFjdGlvbk1haW5QYW5lbCh0cnVlLCBBY3Rpb25Db25zdC5BY3Rpb25UeXBlLldvbmRlcmZ1bCwgZXh0ZW5kX2RhdGEpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yl90eXBlID09IE1haW5VaUNvbnN0LnN1Yl90eXBlLmdvZGJhdHRsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuR29kYmF0dGxlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUud29ybGRfYm9zcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuV29ybGRCb3NzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZnVuY3Rpb25faWNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLmljb25DbGlja0hhbmRsZShleHRlbmRfZGF0YSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yl90eXBlID09IE1haW5VaUNvbnN0LnN1Yl90eXBlLmd1aWxkd2FyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5HdWlsZFdhcilcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yl90eXBlID09IE1haW5VaUNvbnN0LnN1Yl90eXBlLmxhZGRlcndhcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLnJlcXVlc3RPcGVuQmF0dGxlUmVsZXZhbmNlV2luZG93KEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuTGFkZGVyV2FyKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUucHJpbXVzd2FyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5QcmltdXNXYXIpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJfdHlwZSA9PSBNYWluVWlDb25zdC5zdWJfdHlwZS5leHBlZGl0X2ZpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5FeHBlZGl0RmlnaHQpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJfdHlwZSA9PSBNYWluVWlDb25zdC5zdWJfdHlwZS5lbmRsZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5FbmRsZXNzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZHVuZ2VvbnN0b25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbnVpX2NvbnRyb2xsZXIucmVxdWVzdE9wZW5CYXR0bGVSZWxldmFuY2VXaW5kb3coQmF0dGxlQ29uc3QuRmlnaHRfVHlwZS5EdW5nZW9uU3RvbmUsIGV4dGVuZF9kYXRhKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuc2VlcnBhbGFjZSkgeyAvLyAtLSDlhYjnn6Xmrr9cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuZF9kYXRhICYmIHR5cGVvZiAoZXh0ZW5kX2RhdGEpID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJzZWVycGFsYWNlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuU2VlcnBhbGFjZU1haW5XaW5kb3codHJ1ZSwgZXh0ZW5kX2RhdGEpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKFwic2VlcnBhbGFjZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblNlZXJwYWxhY2VNYWluV2luZG93KHRydWUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1Yl90eXBlID09IE1haW5VaUNvbnN0LnN1Yl90eXBlLmFkdmVudHVyZSkgeyAvLyAtLSDot7PovaznpZ7nlYzlhpLpmalcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcImFkdmVudHVyZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkucmVxdWVzdEVudGVyQWR2ZW50dXJlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJfdHlwZSA9PSBNYWluVWlDb25zdC5zdWJfdHlwZS5mb3JnZV9ob3VzZSkgey8v6ZS76YCg5bGLXG4gICAgICAgICAgICAgICAgICAgIGlmIChleHRlbmRfZGF0YSAmJiB0eXBlb2YgKGV4dGVuZF9kYXRhKSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlKFwiZm9yZ2Vob3VzZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkZvcmdlSG91c2VWaWV3KHRydWUsIGV4dGVuZF9kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoXCJmb3JnZWhvdXNlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5vcGVuRm9yZ2VIb3VzZVZpZXcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1haW5fdHlwZSA9PSBNYWluVWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3ViX3R5cGUgPT0gTWFpblVpQ29uc3Quc3ViX3R5cGUuZHVuZ2Vvbl9hdXRvKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiYXR0bGVfZHJhbWFfbW9kZWwgPSBCYXR0bGVEcmFtYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpXG4gICAgICAgICAgICAgICAgICAgIHZhciBkcmFtYV9kYXRhID0gYmF0dGxlX2RyYW1hX21vZGVsLmdldERyYW1hRGF0YSgpXG4gICAgICAgICAgICAgICAgICAgIGlmIChiYXR0bGVfZHJhbWFfbW9kZWwgJiYgZHJhbWFfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBiYXR0bGVfZHJhbWFfbW9kZWwuZ2V0U2luZ2xlQm9zc0RhdGEoZHJhbWFfZGF0YS5tYXhfZHVuX2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgQmF0dGxlRHJhbWFDb250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkRyYW1Cb3NzSW5mb1ZpZXcodHJ1ZSwgZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyMDAsIDEpXG4gICAgfSxcblxuICAgIC8vIOaYr+WQpuWcqOinguaImOaIluiAheWIh+ejiyzov5nkuKrml7blgJnlh7rkuoznuqfmj5DnpLos6YCA5Ye6XG4gICAgY2hlY2tGaWdodENsaWNrU3RhdHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBCYXR0bGVDb250cm9sbGVyID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpO1xuICAgICAgICB2YXIgaXNfY2xpY2tfc3RhdHVzID0gQmF0dGxlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldElzQ2xpY2tTdGF0dXMoKTtcbiAgICAgICAgdmFyIGNvbWJhdF90eXBlID0gQmF0dGxlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0Q29tYmF0VHlwZSgpO1xuICAgICAgICBpZiAoaXNfY2xpY2tfc3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xuICAgICAgICAgICAgdmFyIHN0ciA9IFV0aWxzLlRJMThOKFwi5q2j5Zyo6KeC55yL5b2V5YOP5oiW5YiH56OL5Lit77yM5piv5ZCm6YCA5Ye6P1wiKVxuICAgICAgICAgICAgaWYgKGNvbWJhdF90eXBlID09IEJhdHRsZUNvbnN0LkZpZ2h0X1R5cGUuSGVyb1Rlc3RXYXIpIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBVdGlscy5USTE4TihcIuato+WcqOingueci+aImOaWl+a8lOekuu+8jOaYr+WQpuWIh+aNoueVjOmdoj9cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjb21maXJlX2Z1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBCYXR0bGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuY3NGaWdodEV4aXQoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbiAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3coc3RyLCBcIuehruWumlwiLCBjb21maXJlX2Z1biwgXCLlj5bmtohcIik7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNfY2xpY2tfc3RhdHVzO1xuICAgIH0sXG5cbiAgICAvLyDmlLnlj5jmjInpkq7nirbmgIFcbiAgICBzZXRNYWl1aUJ0blN0YXR1czogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RfaW5kZXggPT0gaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJfc2VsZWN0X2J0bikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3NlbGVjdF9pbmRleCA9PSBNYWluVWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJfc2VsZWN0X2J0bi5za2VsZXRvbiAmJiB0aGlzLmN1cl9zZWxlY3RfYnRuLnNrZWxldG9uLnNrZWxldG9uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cl9zZWxlY3RfYnRuLnNrZWxldG9uLnNldEFuaW1hdGlvbigwLCBcImFjdGlvbjFcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cl9zZWxlY3RfYnRuLm5vcm1hbC5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJfc2VsZWN0X2J0bi5zZWxlY3RlZC5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuY3VyX3NlbGVjdF9idG4uYnRuLnNldFBvc2l0aW9uKHRoaXMuY3VyX3NlbGVjdF9idG4uaW5pdF94LCB0aGlzLmN1cl9zZWxlY3RfYnRuLmluaXRfeSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cl9zZWxlY3RfaW5kZXggPSBpbmRleDtcbiAgICAgICAgdmFyIGJ0bl9vYmplY3QgPSB0aGlzLmJvdHRvbV9idG5fbGlzdFtpbmRleF07XG4gICAgICAgIHRoaXMuY3VyX3NlbGVjdF9idG4gPSBidG5fb2JqZWN0XG4gICAgICAgIGlmIChidG5fb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfc2VsZWN0X2luZGV4ID09IE1haW5VaUNvbnN0LmJ0bl9pbmRleC5kcmFtYV9zY2VuZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RfYnRuLnNrZWxldG9uICYmIHRoaXMuY3VyX3NlbGVjdF9idG4uc2tlbGV0b24uc2tlbGV0b25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VyX3NlbGVjdF9idG4uc2tlbGV0b24uc2V0QW5pbWF0aW9uKDAsIFwiYWN0aW9uMlwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ0bl9vYmplY3Qubm9ybWFsLmFjdGl2ZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgYnRuX29iamVjdC5zZWxlY3RlZC5hY3RpdmUgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnRuX29iamVjdC5idG4uc2V0UG9zaXRpb24oYnRuX29iamVjdC5pbml0X3gsIGJ0bl9vYmplY3QuaW5pdF95ICsgMTApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDorr7nva7pgInkuK3nmoR1aeaImOaWl+exu+Weiyzov5nph4zmmK/pnIDopoHorrDlvZXnmoQu6KaB5LiN54S25Y+v6IO95oiY5paX5ZKMdWnlr7nkuI3kuIpcbiAgICAgICAgdmFyIGZpZ2h0X3R5cGUgPSB0aGlzLmdldFVJRmlnaHRCeUluZGV4KGluZGV4KTtcbiAgICAgICAgdGhpcy5tYWludWlfY29udHJvbGxlci5zZXRVSUZpZ2h0VHlwZShmaWdodF90eXBlKTtcbiAgICB9LFxuXG4gICAgLy8g5qC55o2u5Li7dWnkuIvpnaLnmoTmoIfor4Ys6K6+572u5b2T5YmNdWnnmoTmiJjmlpfnsbvlnotcbiAgICBnZXRVSUZpZ2h0QnlJbmRleDogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgICAgICAgIGNhc2UgTWFpblVpQ29uc3QuYnRuX2luZGV4Lm1haW5fc2NlbmU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1haW5VaUNvbnN0LnVpX2ZpZ2h0X3R5cGUubWFpbl9zY2VuZTtcbiAgICAgICAgICAgIGNhc2UgTWFpblVpQ29uc3QuYnRuX2luZGV4LnBhcnRuZXI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1haW5VaUNvbnN0LnVpX2ZpZ2h0X3R5cGUucGFydG5lcjtcbiAgICAgICAgICAgIGNhc2UgTWFpblVpQ29uc3QuYnRuX2luZGV4LmJhY2twYWNrOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYWluVWlDb25zdC51aV9maWdodF90eXBlLmJhY2twYWNrO1xuICAgICAgICAgICAgY2FzZSBNYWluVWlDb25zdC5idG5faW5kZXguZHJhbWFfc2NlbmU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1haW5VaUNvbnN0LnVpX2ZpZ2h0X3R5cGUuZHJhbWFfc2NlbmU7XG4gICAgICAgICAgICBjYXNlIE1haW5VaUNvbnN0LmJ0bl9pbmRleC5lc2Vjc2ljZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFpblVpQ29uc3QudWlfZmlnaHRfdHlwZS5lc2Vjc2ljZTtcbiAgICAgICAgICAgIGNhc2UgTWFpblVpQ29uc3QuYnRuX2luZGV4Lmd1aWxkOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYWluVWlDb25zdC51aV9maWdodF90eXBlLmd1aWxkO1xuICAgICAgICAgICAgY2FzZSBNYWluVWlDb25zdC5idG5faW5kZXguaGFsbG93czpcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFpblVpQ29uc3QudWlfZmlnaHRfdHlwZS5oYWxsb3dzO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFpblVpQ29uc3QudWlfZmlnaHRfdHlwZS5tYWluX3NjZW5lO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOW9k+WJjeaJgOWkhOeahOS4u+WfjuS4u+aMiemSruagh+etvlxuICAgIGdldE1haW5VSUluZGV4OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cl9zZWxlY3RfaW5kZXg7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsOiBiuWkqW51bVxuICAgIHVwZGF0ZUNoYXRNc2dOdW06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNoYXRfbW9kZWwgPSBDaGF0Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCk7XG4gICAgICAgIHZhciByZWRfbnVtID0gY2hhdF9tb2RlbC5nZXRVbnJlYWROdW0oKTtcbiAgICAgICAgaWYgKHJlZF9udW0gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRfcmVkX2JnLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAocmVkX251bSA+IDk5KVxuICAgICAgICAgICAgICAgIHJlZF9udW0gPSBcIis5OVwiO1xuICAgICAgICAgICAgdGhpcy5jaGF0X3JlZF9udW0uc3RyaW5nID0gcmVkX251bTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hhdF9yZWRfYmcuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5pu05paw6KeS6Imy5pWw5o2uXG4gICAgdXBkYXRlUm9sZURhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVSb2xlTmFtZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvbGVMZXYoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSb2xlQ29pbigpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvbGVHb2xkKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm9sZVBvd2VyKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm9sZUhlYWQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSb2xlVmlwKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm9sZUV4cCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvbGVIZWFkRnJhbWUoKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUm9sZU5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5uYW1lX2xhYmVsLnN0cmluZyA9IHRoaXMucm9sZV92by5uYW1lO1xuICAgIH0sXG5cbiAgICB1cGRhdGVSb2xlTGV2OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubGV2X2xhYmVsLnN0cmluZyA9IHRoaXMucm9sZV92by5sZXY7XG4gICAgfSxcblxuICAgIHVwZGF0ZVJvbGVDb2luOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29pbl9sYWJlbC5zdHJpbmcgPSBVdGlscy5nZXRNb25leVN0cmluZyh0aGlzLnJvbGVfdm8uY29pbik7XG4gICAgfSxcblxuICAgIHVwZGF0ZVJvbGVHb2xkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc19oZXJvX3BhbmVsKVxuICAgICAgICAgICAgdGhpcy5nb2xkX2xhYmVsLnN0cmluZyA9IFV0aWxzLmdldE1vbmV5U3RyaW5nKHRoaXMucm9sZV92by5nb2xkKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUm9sZVBvd2VyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZmlnaHRfbGFiZWwuc3RyaW5nID0gdGhpcy5yb2xlX3ZvLnBvd2VyO1xuICAgIH0sXG5cbiAgICB1cGRhdGVSb2xlSGVhZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBsYXllcl9oZWFkLnNldEhlYWRSZXModGhpcy5yb2xlX3ZvLmZhY2VfaWQpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVSb2xlSGVhZEZyYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGxheWVyX2hlYWQuc2V0RnJhbWVSZXModGhpcy5yb2xlX3ZvLmF2YXRhcl9iYXNlX2lkKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUm9sZUV4cDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvID09IG51bGwgfHwgdGhpcy5yb2xlX3ZvLmV4cCA9PSBudWxsIHx8IHRoaXMucm9sZV92by5leHBfbWF4ID09IG51bGwpIHJldHVyblxuICAgICAgICB2YXIgcHJvID0gdGhpcy5yb2xlX3ZvLmV4cCAvIHRoaXMucm9sZV92by5leHBfbWF4O1xuICAgICAgICB0aGlzLmV4cF9iYXIuc2NhbGVYID0gcHJvO1xuICAgIH0sXG5cbiAgICAvLyDliafmg4Xnq6DoioLlj5jljJbnmoTml7blgJks5byA5ZCv5LiL6Z2i5Zu+5qCHXG4gICAgY2hlY2tVbkxvY2tTdGF0dXM6IGZ1bmN0aW9uIChtYXhfZHVuX2lkKSB7XG4gICAgICAgIGlmIChtYXhfZHVuX2lkID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdGhpcy5tYXhfZHVuX2lkID0gbWF4X2R1bl9pZDtcbiAgICAgICAgbGV0IGlzX3VubG9jayA9IGZhbHNlXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhpcy5ib3R0b21fYnRuX2xpc3QubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgIGxldCBidG4gPSB0aGlzLmJvdHRvbV9idG5fbGlzdFtrXVxuICAgICAgICAgICAgaWYgKGJ0bi5jb25maWcgJiYgYnRuLmNvbmZpZy5hY3RpdmF0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBhY3RpdmF0ZSA9IGJ0bi5jb25maWcuYWN0aXZhdGVbMF1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZhdGVbMF0gPT0gXCJkdW5cIikge1xuICAgICAgICAgICAgICAgICAgICBpc191bmxvY2sgPSAobWF4X2R1bl9pZCA+PSBhY3RpdmF0ZVsxXSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3VubG9jayAhPSBidG4uaXNfdW5sb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidG4uaXNfdW5sb2NrID0gaXNfdW5sb2NrXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnRuLm5vdGljZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5ub3RpY2UuYWN0aXZlID0gKCFpc191bmxvY2spXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihpc191bmxvY2sgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNldENoaWxkVW5FbmFibGVkKHRydWUsIGJ0bilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNldENoaWxkVW5FbmFibGVkKGZhbHNlLCBidG4pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTaGVucWkoKTtcbiAgICB9LFxuICAgIC8v5Y2H57qn55qE5pe25YCZ5Yik5pat562J57qn5byA5ZCvXG4gICAgY2hlY2tVbkxvY2tTdGF0dXNCeUxldihsZXYpIHtcbiAgICAgICAgaWYgKHRoaXMucm9sZV92byA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGxldCBpc191bmxvY2sgPSBmYWxzZVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMuYm90dG9tX2J0bl9saXN0Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICBsZXQgYnRuID0gdGhpcy5ib3R0b21fYnRuX2xpc3Rba11cbiAgICAgICAgICAgIGlmIChidG4uY29uZmlnICYmIGJ0bi5jb25maWcuYWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZhdGUgPSBidG4uY29uZmlnLmFjdGl2YXRlWzBdXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2YXRlWzBdID09IFwibGV2XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNfdW5sb2NrID0gKHRoaXMucm9sZV92by5sZXYgPj0gYWN0aXZhdGVbMV0pXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc191bmxvY2sgIT0gYnRuLmlzX3VubG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnRuLmlzX3VubG9jayA9IGlzX3VubG9ja1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ0bi5ub3RpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG4ubm90aWNlLmFjdGl2ZSA9ICghaXNfdW5sb2NrKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYoaXNfdW5sb2NrID09IGZhbHNlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzZXRDaGlsZFVuRW5hYmxlZCh0cnVlLCBidG4pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzZXRDaGlsZFVuRW5hYmxlZChmYWxzZSwgYnRuKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRhc2tfdGlwc19wYW5lbCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNoZW5xaSgpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g5Zu+5qCH6YOo5YiGIHN0YXJ0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLVxuICAgIC8v5Yid5aeL5YyW5oqA6IO95Zu+5qCH5YiX6KGoXG4gICAgYWRkSWNvbkxpc3Q6IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIGlmIChsaXN0ID09IG51bGwgfHwgVXRpbHMubmV4dChsaXN0KSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGsgaW4gbGlzdCkge1xuICAgICAgICAgICAgdmFyIHZvID0gbGlzdFtrXTtcbiAgICAgICAgICAgIGlmICh2byAhPSBudWxsICYmIHZvLmNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSWNvbkluKHZvLmNvbmZpZy5pZCkpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcl9saXN0X2RpY1t2by5jb25maWcuaWRdID0gdm87XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyX2xpc3QucHVzaCh2byk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8v6L+Z6YeM5YWI5YGa5LiA5Liq5o6S5bqPXG4gICAgICAgIGlmICh0aGlzLnJlbmRlcl9saXN0ICE9IG51bGwgJiYgVXRpbHMubmV4dCh0aGlzLnJlbmRlcl9saXN0ICE9IG51bGwpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9saXN0LnNvcnQoVXRpbHMudGFibGVMb3dlclNvcnRlcihbXCJwb3NcIiwgXCJzb3J0XCJdKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL+W8gOWQr+iuoeaXtuWZqO+8jOWHhuWkh+WIm+W7uuWbvuihqGZcbiAgICAgICAgaWYgKHRoaXMuYWRkX2Z1bmN0aW9uX3RpbWVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkX2Z1bmN0aW9uX3RpbWVyID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZ1bmN0aW9uSWNvbigpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCAyIC8gNjAsIC0xKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5Yqo5oCB5re75Yqg5LiA5Liq5Zu+5qCHXG4gICAgYWRkSWNvbjogZnVuY3Rpb24gKHZvKSB7XG4gICAgICAgIGlmICh2byA9PSBudWxsIHx8IHZvLmNvbmZpZyA9PSBudWxsIHx8IHRoaXMuY2hlY2tJY29uSW4odm8uY29uZmlnLmlkKSkgcmV0dXJuXG4gICAgICAgIHRoaXMucmVuZGVyX2xpc3RfZGljW3ZvLmNvbmZpZy5pZF0gPSB2bztcbiAgICAgICAgdGhpcy5yZW5kZXJfbGlzdC5wdXNoKHZvKTtcbiAgICAgICAgdGhpcy5yZW5kZXJfbGlzdC5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wicG9zXCIsIFwic29ydFwiXSkpO1xuXG4gICAgICAgIC8v5byA5ZCv6K6h5pe25ZmoLOWHhuWkh+WIm+W7uuWbvuagh1xuICAgICAgICBpZiAodGhpcy5hZGRfZnVuY3Rpb25fdGltZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5hZGRfZnVuY3Rpb25fdGltZXIgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRnVuY3Rpb25JY29uKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIDIgLyA2MCwgLTEpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/nm5HmtYvkuIDkuKrlm77moIfmmK/lkKblrZjlnKhcbiAgICBjaGVja0ljb25JbjogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdICE9IG51bGwgfHwgdGhpcy5yZW5kZXJfbGlzdF9kaWNbaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIC8v5Yqo5oCB56e76Zmk5LiA5Liq5Zu+5qCHXG4gICAgcmVtb3ZlSWNvbjogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImZ1bmN0aW9uX2RhdGFcIiwgXCJkYXRhX2luZm9cIiwgW2lkXSk7XG4gICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3RbaWRdLmRlbGV0ZU1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0W2lkXS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25fbGlzdFtpZF0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5yZW5kZXJfbGlzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyX2xpc3RbaV0uY29uZmlnLmlkID09IGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJfbGlzdC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcl9saXN0X2RpY1tpZF0gPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5sYXlvdXRfbGlzdCA9PSBudWxsIHx8IHRoaXMubGF5b3V0X2xpc3RbY29uZmlnLnR5cGVdID09IG51bGwpIHJldHVyblxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMubGF5b3V0X2xpc3RbY29uZmlnLnR5cGVdKSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMubGF5b3V0X2xpc3RbY29uZmlnLnR5cGVdW2ldO1xuICAgICAgICAgICAgaWYgKHYgJiYgdi5jb25maWcuaWQgPT0gaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dF9saXN0W2NvbmZpZy50eXBlXS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUljb25MYXlvdXQoY29uZmlnLnR5cGUpO1xuICAgIH0sXG5cbiAgICAvL+WIm+W7uuS4gOS4quWbvuagh1xuICAgIGNyZWF0ZUZ1bmN0aW9uSWNvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMucm9vdF93bmQpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyX2xpc3QgPT0gbnVsbCB8fCBVdGlscy5uZXh0KHRoaXMucmVuZGVyX2xpc3QpID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZF9mdW5jdGlvbl90aW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMuYWRkX2Z1bmN0aW9uX3RpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZF9mdW5jdGlvbl90aW1lciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyB2YXIgZGF0YSA9IHRoaXMucmVuZGVyX2xpc3Quc2hpZnQoKTtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLnJlbmRlcl9saXN0LnNwbGljZSgwLCAxKVswXTtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuXG4gICAgICAgIHRoaXMucmVuZGVyX2xpc3RfZGljW2RhdGEuY29uZmlnLmlkXSA9IG51bGw7XG4gICAgICAgIC8v6L+Z57G75Zu+5qCH5LiN6ZyA6KaB5Zyo5Li755WM6Z2i5pi+56S6XG4gICAgICAgIGlmIChkYXRhLmNvbmZpZyAmJiBkYXRhLmNvbmZpZy5pc19zaG93ID09IDApIHJldHVyblxuICAgICAgICB0aGlzLmFkZEl0ZW1Ub1RhYkFycmF5KGRhdGEpO1xuICAgIH0sXG5cbiAgICAvL+WwhuWbvuagh+a3u+WKoOWIsOeItuiKgueCueWuueWZqFxuICAgIGFkZEl0ZW1Ub1RhYkFycmF5OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEuY29uZmlnID09IG51bGwpIHJldHVyblxuICAgICAgICBpZiAodGhpcy5sYXlvdXRfbGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dF9saXN0ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0X2xpc3RbZGF0YS5jb25maWcudHlwZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRfbGlzdFtkYXRhLmNvbmZpZy50eXBlXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc19uZXcgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubGF5b3V0X2xpc3RbZGF0YS5jb25maWcudHlwZV0pIHtcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5sYXlvdXRfbGlzdFtkYXRhLmNvbmZpZy50eXBlXVtrXTtcbiAgICAgICAgICAgIGlmICh2LmNvbmZpZy5pZCA9PSBkYXRhLmNvbmZpZy5pZCkge1xuICAgICAgICAgICAgICAgIHYgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGlzX25ldyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5pc19uZXcgPSBpc19uZXc7XG4gICAgICAgIHRoaXMubGF5b3V0X2xpc3RbZGF0YS5jb25maWcudHlwZV0ucHVzaChkYXRhKTtcbiAgICAgICAgdGhpcy5sYXlvdXRfbGlzdFtkYXRhLmNvbmZpZy50eXBlXS5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wic29ydFwiXSkpO1xuICAgICAgICB0aGlzLnVwZGF0ZUljb25MYXlvdXQoZGF0YS5jb25maWcudHlwZSk7XG4gICAgfSxcblxuICAgIC8v5pu05paw5Zu+5qCH5L2N572uXG4gICAgdXBkYXRlSWNvbkxheW91dDogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0X2xpc3QgPT0gbnVsbCB8fCB0aGlzLmxheW91dF9saXN0W3R5cGVdID09IG51bGwgfHwgVXRpbHMubmV4dCh0aGlzLmxheW91dF9saXN0W3R5cGVdKSA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgdmFyIGxheW91dCA9IHRoaXMuZ2V0Q29udGFpbmVyQnlUeXBlKHR5cGUpO1xuICAgICAgICBpZiAobGF5b3V0ID09IG51bGwpIHJldHVyblxuICAgICAgICB2YXIgbGVuID0gVXRpbHMuZ2V0QXJyTGVuKHRoaXMubGF5b3V0X2xpc3RbdHlwZV0pO1xuICAgICAgICB2YXIgaWNvbiA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5sYXlvdXRfbGlzdFt0eXBlXVtpXTtcbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZnVuY3Rpb25fbGlzdFtkYXRhLmNvbmZpZy5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5pc19uZXcgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pc19uZXcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBGdW5jdGlvbkljb24gPSByZXF1aXJlKFwiZnVuY3Rpb25faWNvbl9wYW5lbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb24gPSBuZXcgRnVuY3Rpb25JY29uKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uLnNldFBhcmVudChsYXlvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW5jdGlvbl9saXN0W2RhdGEuY29uZmlnLmlkXSA9IGljb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWNvbiA9IHRoaXMuZnVuY3Rpb25fbGlzdFtkYXRhLmNvbmZpZy5pZF07XG4gICAgICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEljb25Qb3NpdGlvbihpY29uLCBpLCBsYXlvdXQsIHR5cGUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJvb3Rfd25kKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhhbmRsZUJ0blNob3dTdGF0dXMoKVxuICAgICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVIYW5kbGVCdG5TaG93U3RhdHVzKCkge1xuICAgICAgICBsZXQgcmlnaHRfYm90dG9tXzEgPSB0aGlzLmxheW91dF9saXN0W0Z1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfYm90dG9tXzFdXG4gICAgICAgIGxldCByaWdodF9ib3R0b21fMiA9IHRoaXMubGF5b3V0X2xpc3RbRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF9ib3R0b21fMl1cbiAgICAgICAgaWYgKHJpZ2h0X2JvdHRvbV8xIHx8IHJpZ2h0X2JvdHRvbV8yKSB7XG4gICAgICAgICAgICBpZiAoKHJpZ2h0X2JvdHRvbV8xICYmIHJpZ2h0X2JvdHRvbV8xLmxlbmd0aCkgfHwgKHJpZ2h0X2JvdHRvbV8yICYmIHJpZ2h0X2JvdHRvbV8yLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZV9idG4uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlX2J0bi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy/moLnmja7kvY3nva7ojrflj5blm77moIfniLboioLngrnkv6Hmga9cbiAgICBnZXRDb250YWluZXJCeVR5cGU6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLmljb25fY29udGFpbmVyX2xpc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWNvbl9jb250YWluZXJfbGlzdFt0eXBlXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iuvue9ruWbvuagh+eahOS9jee9rlxuICAgIHNldEljb25Qb3NpdGlvbjogZnVuY3Rpb24gKGljb24sIGluZGV4LCBsYXlvdXQsIHR5cGUpIHtcbiAgICAgICAgdmFyIHNpemUgPSBsYXlvdXQuZ2V0Q29udGVudFNpemUoKTtcbiAgICAgICAgdmFyIF94ID0gMDtcbiAgICAgICAgdmFyIF95ID0gMDtcbiAgICAgICAgdmFyIG9mZl9oZWlnaHQgPSAxMDtcbiAgICAgICAgaWYgKHR5cGUgPT0gRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF90b3BfMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5Y+z5LiKLOS7juWPs+W+gOW3plxuICAgICAgICAgICAgX3ggPSAtaWNvbi53aWR0aCAqIDAuNSAtIChpbmRleCAlIHRoaXMubGVmdF9tYXhfc3VtKSAqICh0aGlzLmxlZnRfb2ZmICsgaWNvbi53aWR0aCk7XG4gICAgICAgICAgICBfeSA9IC1pY29uLmhlaWdodCAqIDAuNSAtIE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLmxlZnRfbWF4X3N1bSkgKiAob2ZmX2hlaWdodCArIGljb24uaGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZ1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfYm90dG9tXzEpIHsgICAgICAgICAgICAgICAgLy8g5Y+z5LiLLOS7juWPs+W+gOW3plxuICAgICAgICAgICAgX3ggPSAtaWNvbi53aWR0aCAqIDAuNSAtIChpbmRleCAlIHRoaXMubGVmdF9tYXhfc3VtKSAqICh0aGlzLmxlZnRfb2ZmICsgaWNvbi53aWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X2JvdHRvbV8yKSB7ICAgICAgICAgICAgICAgIC8vIOWPs+S4iyzku47kuIvlvoDkuIpcbiAgICAgICAgICAgIF95ID0gaWNvbi5oZWlnaHQgKiAwLjUgKyBpbmRleCAqIChpY29uLmhlaWdodCArIHRoaXMucmlnaHRfb2ZmKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZ1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfdG9wXzIpIHsgICAgICAgICAgICAgICAgICAgLy8g5Y+z5LiKLOS7juS4iuW+gOS4i1xuICAgICAgICAgICAgX3ggPSAtaWNvbi53aWR0aCAqIDAuNTtcbiAgICAgICAgICAgIF95ID0gLWljb24uaGVpZ2h0ICogMC41IC0gaW5kZXggKiAoaWNvbi5oZWlnaHQgKyBvZmZfaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaWNvbi5vcmlnaW5hbCA9PSBudWxsIHx8IFV0aWxzLmdldE5vcktleShpY29uLm9yaWdpbmFsLngsIGljb24ub3JpZ2luYWwueSkgIT0gVXRpbHMuZ2V0Tm9yS2V5KF94LCBfeSkpIHtcbiAgICAgICAgICAgIGljb24uc2V0UG9zaXRpb24oX3gsIF95KTtcbiAgICAgICAgICAgIGljb24ub3JpZ2luYWwgPSBjYy52MihfeCwgX3kpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/liqjmgIHosIPmlbQgcmlnaHRfdG9wXzIg55qE5L2N572uXG4gICAgICAgIHZhciBvZmZfeSA9IDA7XG4gICAgICAgIGlmICh0eXBlID09IEZ1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfdG9wXzEpIHtcbiAgICAgICAgICAgIG9mZl95ID0gTWF0aC5hYnMoX3kgLSBvZmZfaGVpZ2h0IC0gaWNvbi5oZWlnaHQgKiAwLjUpOyAgICAgICAgICAgICAvLyDnrpflh7rmgLvpq5jluqZcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZ1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfdG9wXzIpIHtcbiAgICAgICAgICAgIHZhciBsYXlvdXRfbGlzdCA9IHRoaXMubGF5b3V0X2xpc3RbRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF90b3BfMV07XG4gICAgICAgICAgICBpZiAobGF5b3V0X2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGVuID0gVXRpbHMuZ2V0QXJyTGVuKGxheW91dF9saXN0KTtcbiAgICAgICAgICAgICAgICB2YXIgdGVtcF95ID0gaWNvbi5oZWlnaHQgKiAwLjUgLSBNYXRoLmNlaWwobGVuIC8gdGhpcy5sZWZ0X21heF9zdW0pICogKG9mZl9oZWlnaHQgKyBpY29uLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgb2ZmX3kgPSBNYXRoLmFicyh0ZW1wX3kgLSBvZmZfaGVpZ2h0IC0gaWNvbi5oZWlnaHQgKiAwLjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvZmZfeSAhPSAwICYmIHRoaXMudG9wXzJfb2ZmX3kgIT0gb2ZmX3kpIHtcbiAgICAgICAgICAgIHRoaXMudG9wXzJfb2ZmX3kgPSBvZmZfeTtcbiAgICAgICAgICAgIHZhciB0b3BfMSA9IHRoaXMuaWNvbl9jb250YWluZXJfbGlzdFtGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X3RvcF8xXTtcbiAgICAgICAgICAgIHZhciB0b3BfMiA9IHRoaXMuaWNvbl9jb250YWluZXJfbGlzdFtGdW5jdGlvbkljb25Wby50eXBlLnJpZ2h0X3RvcF8yXTtcbiAgICAgICAgICAgIGlmICh0b3BfMSAmJiB0b3BfMikge1xuICAgICAgICAgICAgICAgIHRvcF8yLnkgPSB0b3BfMS55IC0gb2ZmX3k7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/lrprml7blmajnmoTnu5/kuIDlgJLorqHml7ZcbiAgICBmdW5jdGlvblRpbWVUaWNrZXRMaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uX2xpc3QgJiYgVXRpbHMubmV4dCh0aGlzLmZ1bmN0aW9uX2xpc3QpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5mdW5jdGlvbl9saXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGljb24gPSB0aGlzLmZ1bmN0aW9uX2xpc3Rba107XG4gICAgICAgICAgICAgICAgaWYgKGljb24gJiYgaWNvbi5kYXRhICYmIGljb24uZGF0YS5lbmRfdGltZSAmJiBpY29uLmRhdGEuZW5kX3RpbWUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpY29uLnVwZGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb24udXBkYXRlVGltZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGlvbl9saXN0ICYmIFV0aWxzLm5leHQodGhpcy5hY3Rpb25fbGlzdCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmFjdGlvbl9saXN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGljb24gPSB0aGlzLmFjdGlvbl9saXN0W2ldXG4gICAgICAgICAgICAgICAgaWYgKGljb24gJiYgaWNvbi51cGRhdGVUaW1lICYmIGljb24ucmVtYWluX3NlYyAmJiBpY29uLnJlbWFpbl9zZWMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGljb24udXBkYXRlVGltZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pu05pawaWNvbuWIl+ihqFxuICAgIGZ1bmN0aW9uVXBkYXRlTGlzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5mdW5jdGlvbl9saXN0ICYmIFV0aWxzLm5leHQodGhpcy5mdW5jdGlvbl9saXN0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZnVuY3Rpb25fbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBpY29uID0gdGhpcy5mdW5jdGlvbl9saXN0W2tdO1xuICAgICAgICAgICAgICAgIGlmIChpY29uICYmIGljb24udXBkYXRlSWNvblJlcykge1xuICAgICAgICAgICAgICAgICAgICBpY29uLnVwZGF0ZUljb25SZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0Qm90dG9tU3RhdHVzOiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLmJvdHRvbV9jb250YWluZXIpXG4gICAgICAgICAgICB0aGlzLmJvdHRvbV9jb250YWluZXIuYWN0aXZlID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICBzZXRUb3BTdGF0dXM6IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgICAgICAgaWYgKHRoaXMudG9wX2NvbnRhaW5lcilcbiAgICAgICAgICAgIHRoaXMudG9wX2NvbnRhaW5lci5hY3RpdmUgPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIHVwZGF0ZVJvbGVWaXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52aXBfbGFiZWwuc2V0TnVtKHRoaXMucm9sZV92by52aXBfbGV2KTtcbiAgICB9LFxuXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIC8vIC0tQGlkOuS4i+mdouaMiemSruW6j+WPt1xuICAgIC8vIC0tQGRhdGE6ZGF0YSDlj6/ku6XmmK/ljZXnuq9ib29s5YC877yM5oiW6ICF5pivdGFibGXlvaLlvI97WzFdPXtpZD14eHgsc3RhdHVzPWZhbHNlfX1cbiAgICAvLyAtLUByZXR1cm4gXG4gICAgLy8gLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLVxuICAgIHVwZGF0ZUJ0blRpcHNQb2ludDogZnVuY3Rpb24gKGlkLCBkYXRhKSB7XG4gICAgICAgIGlmICghdGhpcy5ib3R0b21fYnRuX2xpc3RbaWRdKSByZXR1cm47XG4gICAgICAgIGlmIChkYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYnRuX2NhY2hlX3RpcHNbaWRdID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGRhdGEpICE9IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXSA9IGRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnRuX2NhY2hlX3RpcHNbaWRdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmJpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnRuX2NhY2hlX3RpcHNbaWRdW2RhdGEuYmlkXSA9IGRhdGEuc3RhdHVzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFbaV0uYmlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXVtkYXRhW2ldLmJpZF0gPSBkYXRhW2ldLnN0YXR1cztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBib29sID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5idG5fY2FjaGVfdGlwc1tpZF0pID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuYnRuX2NhY2hlX3RpcHNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ0bl9jYWNoZV90aXBzW2lkXVtpXSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib29sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBib29sID0gdGhpcy5idG5fY2FjaGVfdGlwc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ0bl9vYmplY3QgPSB0aGlzLmJvdHRvbV9idG5fbGlzdFtpZF07XG4gICAgICAgIGlmIChidG5fb2JqZWN0ICYmIGJ0bl9vYmplY3QudGlwc19zdGF0dXMgIT0gYm9vbCkge1xuICAgICAgICAgICAgYnRuX29iamVjdC50aXBzX3N0YXR1cyA9IGJvb2w7XG4gICAgICAgICAgICBpZiAoYnRuX29iamVjdC50aXBzX3BvaW50KSB7XG4gICAgICAgICAgICAgICAgYnRuX29iamVjdC50aXBzX3BvaW50LmFjdGl2ZSA9IGJvb2w7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0Um9vdFduZDogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHRoaXMucm9vdF93bmRfY2IgPSBjYjtcbiAgICAgICAgaWYgKHRoaXMucm9vdF93bmQpXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kX2NiKHRoaXMucm9vdF93bmQpO1xuICAgIH0sXG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIOWbvuagh+mDqOWIhiBlbmQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tXG4gICAgLy/mlLbnvKnlj7PkuIvop5LnmoTlm77moIdcbiAgICBzaHJpbmtCdG5Db250YWluZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNfaW5fc2hyaW5rID09IHRydWUpIHJldHVyblxuICAgICAgICB0aGlzLmlzX2luX3NocmluayA9IHRydWU7XG5cbiAgICAgICAgdmFyIGxheW91dF8xID0gdGhpcy5pY29uX2NvbnRhaW5lcl9saXN0W0Z1bmN0aW9uSWNvblZvLnR5cGUucmlnaHRfYm90dG9tXzFdO1xuICAgICAgICB2YXIgbGF5b3V0XzIgPSB0aGlzLmljb25fY29udGFpbmVyX2xpc3RbRnVuY3Rpb25JY29uVm8udHlwZS5yaWdodF9ib3R0b21fMl07XG4gICAgICAgIHRoaXMuaXNfc2hyaW5rID0gIXRoaXMuaXNfc2hyaW5rO1xuXG4gICAgICAgIGxheW91dF8xLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIGxheW91dF8yLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgdmFyIGxlbiA9IDEwMDtcbiAgICAgICAgdmFyIG1vdmVfYnlfMSA9IG51bGw7XG4gICAgICAgIHZhciBtb3ZlX2J5XzIgPSBudWxsO1xuICAgICAgICB2YXIgZmFkZV8xID0gbnVsbDtcbiAgICAgICAgdmFyIGZhZGVfMiA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNfc2hyaW5rID09IHRydWUpIHtcbiAgICAgICAgICAgIG1vdmVfYnlfMSA9IGNjLm1vdmVCeSgwLjEsIGNjLnYyKGxlbiwgMCkpO1xuICAgICAgICAgICAgbW92ZV9ieV8yID0gY2MubW92ZUJ5KDAuMSwgY2MudjIoMCwgLWxlbikpO1xuICAgICAgICAgICAgZmFkZV8xID0gY2MuZmFkZU91dCgwLjEpO1xuICAgICAgICAgICAgZmFkZV8yID0gY2MuZmFkZU91dCgwLjEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW92ZV9ieV8xID0gY2MubW92ZUJ5KDAuMSwgY2MudjIoLWxlbiwgMCkpO1xuICAgICAgICAgICAgbW92ZV9ieV8yID0gY2MubW92ZUJ5KDAuMSwgY2MudjIoMCwgbGVuKSk7XG4gICAgICAgICAgICBmYWRlXzEgPSBjYy5mYWRlSW4oMC4xKTtcbiAgICAgICAgICAgIGZhZGVfMiA9IGNjLmZhZGVJbigwLjEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhbGxfZnVuXzEgPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmlzX2luX3NocmluayA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNfc2hyaW5rID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXRfMS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB2YXIgY2FsbF9mdW5fMiA9IGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzX3NocmluayA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0XzIuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgbGF5b3V0XzEucnVuQWN0aW9uKGNjLnNlcXVlbmNlKGNjLnNwYXduKG1vdmVfYnlfMSwgZmFkZV8xKSwgY2FsbF9mdW5fMSkpO1xuICAgICAgICBsYXlvdXRfMi5ydW5BY3Rpb24oY2Muc2VxdWVuY2UoY2Muc3Bhd24obW92ZV9ieV8yLCBmYWRlXzIpLCBjYWxsX2Z1bl8yKSk7XG4gICAgfSxcblxuXG4gICAgc2hvd1Bvd2VyOiBmdW5jdGlvbiAocG93ZXJfYWRkLCBsYXN0X3Bvd2VyKSB7XG4gICAgICAgIGlmICghcG93ZXJfYWRkIHx8ICFsYXN0X3Bvd2VyKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnBvd2VyX3Nob3dfbmQgPT0gbnVsbCkge1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcIm1haW51aVwiLCBcInBvd2VyX3Nob3dcIiksIGZ1bmN0aW9uIChQcmVmYWIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wb3dlcl9zaG93X25kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuUG93ZXJBY3Rpb24ocG93ZXJfYWRkLCBsYXN0X3Bvd2VyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZCA9IFByZWZhYjtcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvU2NlbmVOb2RlKHRoaXMucG93ZXJfc2hvd19uZCwgU0NFTkVfVEFHLmRpYWxvZ3VlKVxuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5zZXRQb3NpdGlvbigtU0NSRUVOX1dJRFRIICogMC41LCAtU0NSRUVOX0hFSUdIVCAqIDAuNSlcbiAgICAgICAgICAgICAgICBsZXQgcG93ZXJfc2hvd19uZCA9IHRoaXMucG93ZXJfc2hvd19uZC5nZXRDaGlsZEJ5TmFtZShcImNvbnRhaW5lclwiKVxuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5wb3dlcl9zayA9IHBvd2VyX3Nob3dfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJhbmlfY29uXCIpLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbilcbiAgICAgICAgICAgICAgICBsZXQgdGV4X2Nvbl9uZCA9IHBvd2VyX3Nob3dfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJ0eHRfY29uXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5vbGRfcG93ZXJfcmIgPSB0ZXhfY29uX25kLmdldENoaWxkQnlOYW1lKFwib2xkX3Bvd2VyXCIpLmdldENvbXBvbmVudChjYy5SaWNoVGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGNjLnN5cy5icm93c2VyVHlwZSA9PSBjYy5zeXMuQlJPV1NFUl9UWVBFX0lFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5vbGRfcG93ZXJfcmIubGluZUhlaWdodCA9IDYwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQuYWRkX3Bvd2VyX2xiID0gdGV4X2Nvbl9uZC5nZXRDaGlsZEJ5TmFtZShcImFkZF9wb3dlclwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICAgICAgICAgIHZhciBhbmltYV9yZXMgPSBQYXRoVG9vbC5nZXRFZmZlY3RSZXMoMTc5KTtcbiAgICAgICAgICAgICAgICB2YXIgYW5pbWFfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChhbmltYV9yZXMpO1xuICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKGFuaW1hX3BhdGgsIGZ1bmN0aW9uIChwb3dlcl9zZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQucG93ZXJfc2suc2tlbGV0b25EYXRhID0gcG93ZXJfc2Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuUG93ZXJBY3Rpb24ocG93ZXJfYWRkLCBsYXN0X3Bvd2VyKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJ1blBvd2VyQWN0aW9uKHBvd2VyX2FkZCwgbGFzdF9wb3dlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzLnBvd2VyX3Nob3dfbmQgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwicG93ZXJfc2hvd1wiKTtcbiAgICAgICAgLy8gdGhpcy5wb3dlcl9zayA9IHRoaXMucG93ZXJfc2hvd19uZC5nZXRDaGlsZEJ5TmFtZShcImFuaV9jb25cIikuZ2V0Q29tcG9uZW50KHNwLlNrZWxldG9uKTtcbiAgICAgICAgLy8gdmFyIHRleF9jb25fbmQgPSB0aGlzLnBvd2VyX3Nob3dfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJ0eHRfY29uXCIpO1xuICAgICAgICAvLyB0aGlzLm9sZF9wb3dlcl9yYiA9IHRleF9jb25fbmQuZ2V0Q2hpbGRCeU5hbWUoXCJvbGRfcG93ZXJcIikuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KTtcbiAgICAgICAgLy8gdGhpcy5hZGRfcG93ZXJfbGIgPSB0ZXhfY29uX25kLmdldENoaWxkQnlOYW1lKFwiYWRkX3Bvd2VyXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIC8vIGlmICh0aGlzLnBvd2VyX3NrLnNrZWxldG9uRGF0YSkge1xuICAgICAgICAvLyAgICAgdGhpcy5ydW5Qb3dlckFjdGlvbihwb3dlcl9hZGQsIGxhc3RfcG93ZXIpO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgdmFyIGFuaW1hX3JlcyA9IFBhdGhUb29sLmdldEVmZmVjdFJlcygxNzkpO1xuICAgICAgICAvLyAgICAgdmFyIGFuaW1hX3BhdGggPSBQYXRoVG9vbC5nZXRTcGluZVBhdGgoYW5pbWFfcmVzKTtcbiAgICAgICAgLy8gICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKGFuaW1hX3BhdGgsIGZ1bmN0aW9uKHBvd2VyX3NkKSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5wb3dlcl9zay5za2VsZXRvbkRhdGEgPSBwb3dlcl9zZDtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnJ1blBvd2VyQWN0aW9uKHBvd2VyX2FkZCwgbGFzdF9wb3dlcik7XG4gICAgICAgIC8vICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgcnVuUG93ZXJBY3Rpb246IGZ1bmN0aW9uIChwb3dlcl9hZGQsIGxhc3RfcG93ZXIpIHtcbiAgICAgICAgdGhpcy5wb3dlcl9zaG93X25kLnBvd2VyX3NrLnNldEFuaW1hdGlvbigwLCBcImFjdGlvblwiLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWRkX3RpbWVyKSB7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5hZGRfdGltZXIpO1xuICAgICAgICAgICAgdGhpcy5hZGRfdGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5zdG9wQWxsQWN0aW9ucygpO1xuXG4gICAgICAgIHZhciBsYXN0X3Bvd2VyX3N0ciA9IGxhc3RfcG93ZXIgKyBcIlwiO1xuICAgICAgICB2YXIgbGFzdF9wb3dlcl9kcyA9IFwiXCI7XG4gICAgICAgIGlmKGNjLnN5cy5icm93c2VyVHlwZSA9PSBjYy5zeXMuQlJPV1NFUl9UWVBFX0lFKXtcbiAgICAgICAgICAgIGxhc3RfcG93ZXJfZHMgPSBsYXN0X3Bvd2VyX3N0cjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBmb3IgKHZhciBpdGVtX2kgaW4gbGFzdF9wb3dlcl9zdHIpIHtcbiAgICAgICAgICAgICAgICBsYXN0X3Bvd2VyX2RzICs9IFwiPGltZyBzcmM9J3R5cGUyM19cIiArIGxhc3RfcG93ZXJfc3RyW2l0ZW1faV0gKyBcIicvPlwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxjdV9udW0gPSAwO1xuICAgICAgICB0aGlzLmFkZF90aW1lciA9IGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbiAocG93ZXJfYWRkKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1X251bSArPSAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VfbnVtIDwgNSkge1xuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5hZGRfcG93ZXJfbGIuc3RyaW5nID0gXCIrXCIgKyBNYXRoLmNlaWwodGhpcy5jYWxjdV9udW0gKiAwLjIgKiBwb3dlcl9hZGQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQuYWRkX3Bvd2VyX2xiLnN0cmluZyA9IFwiK1wiICsgcG93ZXJfYWRkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcywgcG93ZXJfYWRkKSwgMjAwLCA1KVxuXG5cbiAgICAgICAgdGhpcy5wb3dlcl9zaG93X25kLm9sZF9wb3dlcl9yYi5zdHJpbmcgPSBsYXN0X3Bvd2VyX2RzO1xuICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQub3BhY2l0eSA9IDI1NTtcblxuICAgICAgICBjb25zb2xlLmxvZyhcIui+k+WHuuWtl+espuS4slwiLCB0aGlzLnBvd2VyX3Nob3dfbmQub2xkX3Bvd2VyX3JiLnN0cmluZyk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi6L6T5Ye65a2X56ym5LiyXCIsIGxhc3RfcG93ZXJfZHMpO1xuXG4gICAgICAgIHZhciBkZWxheV90aW1lID0gbmV3IGNjLmRlbGF5VGltZSgxKTtcbiAgICAgICAgdmFyIGFjdGlvbiA9IG5ldyBjYy5mYWRlT3V0KDEpO1xuICAgICAgICB2YXIgZmluaXNoX2NiID0gbmV3IGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFkZF90aW1lcikge1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLmFkZF90aW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRfdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucG93ZXJfc2hvd19uZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucG93ZXJfc2hvd19uZC5kZXN0cm95KClcbiAgICAgICAgICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB2YXIgcG93ZXJfYWN0ID0gY2Muc2VxdWVuY2UoZGVsYXlfdGltZSwgYWN0aW9uLCBmaW5pc2hfY2IpO1xuICAgICAgICB0aGlzLnBvd2VyX3Nob3dfbmQucnVuQWN0aW9uKHBvd2VyX2FjdCk7XG4gICAgfSxcblxuICAgIHVwZGF0ZUhlcm9FeHA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNfaGVyb19wYW5lbClcbiAgICAgICAgICAgIHRoaXMuZ29sZF9sYWJlbC5zdHJpbmcgPSBVdGlscy5nZXRNb25leVN0cmluZyh0aGlzLnJvbGVfdm8uaGVyb19leHApO1xuICAgIH0sXG5cbiAgICBjaGFuZ2VIZXJvU3RhdHVzOiBmdW5jdGlvbiAoaXNfaGVybykge1xuICAgICAgICB0aGlzLmlzX2hlcm9fcGFuZWwgPSBpc19oZXJvO1xuICAgICAgICBpZiAoaXNfaGVybykge1xuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoUGF0aFRvb2wuZ2V0SXRlbVJlcyhcIjIyXCIpLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nb2xkX3NwLnNwcml0ZUZyYW1lID0gcmVzO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgdGhpcy5nb2xkX2xhYmVsLnN0cmluZyA9IFV0aWxzLmdldE1vbmV5U3RyaW5nKHRoaXMucm9sZV92by5oZXJvX2V4cCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBMb2FkZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkubG9hZFJlcyhQYXRoVG9vbC5nZXRJdGVtUmVzKFwiM1wiKSwgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZ29sZF9zcC5zcHJpdGVGcmFtZSA9IHJlc1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgdGhpcy5nb2xkX2xhYmVsLnN0cmluZyA9IFV0aWxzLmdldE1vbmV5U3RyaW5nKHRoaXMucm9sZV92by5nb2xkKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgY3JlYXRvckNoYXRCdG4oKSB7XG4gICAgICAgIHRoaXMuY2hhdF9idG5fbmQgPSBuZXcgY2MuTm9kZShcImNoYXRfYnRuXCIpO1xuICAgICAgICBsZXQgd2lkZ2V0ID0gdGhpcy5jaGF0X2J0bl9uZC5hZGRDb21wb25lbnQoY2MuV2lkZ2V0KVxuICAgICAgICB3aWRnZXQuaXNBbGlnbkJvdHRvbSA9IHRydWVcbiAgICAgICAgd2lkZ2V0LmJvdHRvbSA9IDM2NztcbiAgICAgICAgdGhpcy5jaGF0X2J0bl9uZC54ID0gMzE3XG4gICAgICAgIFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9TY2VuZU5vZGUodGhpcy5jaGF0X2J0bl9uZCwgU0NFTkVfVEFHLnRvcCk7XG4gICAgICAgIGxldCBidG4gPSB0aGlzLmNoYXRfYnRuX25kLmFkZENvbXBvbmVudChjYy5CdXR0b24pO1xuICAgICAgICBidG4udHJhbnNpdGlvbiA9IGNjLkJ1dHRvbi5UcmFuc2l0aW9uLlNDQUxFO1xuICAgICAgICBidG4uem9vbVNjYWxlID0gMC45O1xuICAgICAgICBidG4uZHVyYXRpb24gPSAwLjE7XG4gICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJtYWludWlcIiwgXCJtYWludWlfY2hhdF9tYWluX2ljb25cIiksIChmdW5jdGlvbiAocmVzX29iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5jaGF0X2J0bl9uZC5hZGRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLmNoYXRfcmVkX2JnID0gbmV3IGNjLk5vZGUoXCJjaGF0X3JlZF9iZ1wiKTtcbiAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMoUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcIm1haW51aVwiLCBcIm1haW51aV8xMDM0XCIpLCAoZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhdF9yZWRfYmcuYWRkQ29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0O1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jaGF0X2J0bl9uZC5hZGRDaGlsZCh0aGlzLmNoYXRfcmVkX2JnKTtcbiAgICAgICAgdGhpcy5jaGF0X3JlZF9iZy5zZXRQb3NpdGlvbigyMywgMjUpO1xuICAgICAgICB0aGlzLmNoYXRfcmVkX2JnLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNoYXRfcmVkX251bSA9IG5ldyBjYy5Ob2RlKFwiY2hhdF9yZWRfbnVtXCIpLmFkZENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuY2hhdF9yZWRfbnVtLmZvbnRTaXplID0gMTg7XG4gICAgICAgIHRoaXMuY2hhdF9yZWRfbnVtLmxpbmVIZWlnaHQgPSAxODtcbiAgICAgICAgdGhpcy5jaGF0X3JlZF9udW0uaG9yaXpvbnRhbEFsaWduID0gY2MubWFjcm8uVGV4dEFsaWdubWVudC5DRU5URVI7XG4gICAgICAgIHRoaXMuY2hhdF9yZWRfbnVtLnZlcnRpY2FsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkNFTlRFUjtcbiAgICAgICAgdGhpcy5jaGF0X3JlZF9iZy5hZGRDaGlsZCh0aGlzLmNoYXRfcmVkX251bS5ub2RlKVxuICAgICAgICBsZXQgdG91Y2hfYmVnYW4gPSBjYy52MigpXG4gICAgICAgIGxldCBpc19tb3ZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhdF9idG5fbmQub24oXCJ0b3VjaHN0YXJ0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaXNfbW92ZSA9IGZhbHNlXG4gICAgICAgICAgICB0b3VjaF9iZWdhbiA9IGV2ZW50LmdldExvY2F0aW9uKClcbiAgICAgICAgfSwgdGhpcylcbiAgICAgICAgdGhpcy5jaGF0X2J0bl9uZC5vbihcInRvdWNobW92ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBldmVudC5nZXRMb2NhdGlvbigpXG4gICAgICAgICAgICBpZiAoIWlzX21vdmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgaXNfY2xpY2sgPSBNYXRoLmFicyhwb3MueCAtIHRvdWNoX2JlZ2FuLngpIDw9IDMwICYmIE1hdGguYWJzKHBvcy55IC0gdG91Y2hfYmVnYW4ueSkgPD0gMzBcbiAgICAgICAgICAgICAgICBpZiAoaXNfY2xpY2sgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNfbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzX21vdmUpIHtcbiAgICAgICAgICAgICAgICBwb3MgPSBWaWV3TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFNjZW5lTm9kZShTQ0VORV9UQUcudG9wKS5jb252ZXJ0VG9Ob2RlU3BhY2VBUihwb3MpXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrUG9zSW5SZWN0KHBvcykpIHJldHVyblxuICAgICAgICAgICAgICAgIHRoaXMuY2hhdF9idG5fbmQuc2V0UG9zaXRpb24ocG9zKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKVxuICAgICAgICB0aGlzLmNoYXRfYnRuX25kLm9uKFwidG91Y2hlbmRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoaXNfbW92ZSA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKVxuICAgICAgICAgICAgICAgIHZhciBDaGF0Q3RybCA9IHJlcXVpcmUoXCJjaGF0X2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICAgICAgQ2hhdEN0cmwuZ2V0SW5zdGFuY2UoKS5vcGVuQ2hhdFBhbmVsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhdEJ0bihmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcylcbiAgICAgICAgbGV0IEd1aWRlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJndWlkZV9jb250cm9sbGVyXCIpXG4gICAgICAgIGlmIChHdWlkZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5pc0luR3VpZGUoKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzKGZhbHNlKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRNYWluVUlDaGF0QnViYmxlU3RhdHVzKHN0YXR1cykge1xuICAgICAgICB0aGlzLmNoYXRfYnViYmxlX3N0YXR1cyA9IHN0YXR1c1xuICAgICAgICB0aGlzLmNoYXRfYnRuX25kLnN0b3BBbGxBY3Rpb25zKClcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgdGhpcy5yb290X3duZC5ydW5BY3Rpb24oY2Muc2VxdWVuY2UoY2MuZGVsYXlUaW1lKDAuMiksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGF0X2J1YmJsZV9zdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGF0QnRuKHRoaXMuY2hhdF9idWJibGVfc3RhdHVzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRoaXMpKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NoYXRCdG4odGhpcy5jaGF0X2J1YmJsZV9zdGF0dXMpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNoZWNrUG9zSW5SZWN0KHBvcykge1xuICAgICAgICAvLyBsZXQgd2lkdGggPSBjYy53aW5TaXplLndpZHRoID4gU0NSRUVOX1dJRFRIID8gU0NSRUVOX1dJRFRIIDogY2Mud2luU2l6ZS53aWR0aDtcbiAgICAgICAgLy8gbGV0IHNpemUgPSBjYy5zaXplKHdpZHRoLGNjLndpblNpemUuaGVpZ2h0KVxuICAgICAgICBsZXQgc2l6ZSA9IHRoaXMucm9vdF93bmQuZ2V0Q29udGVudFNpemUoKVxuICAgICAgICBsZXQgbGVmdF94ID0gLShzaXplLndpZHRoIC8gMikgKyA0MFxuICAgICAgICBsZXQgcmlnaHRfeCA9IHNpemUud2lkdGggLyAyIC0gNDBcbiAgICAgICAgbGV0IHRvcF95ID0gc2l6ZS5oZWlnaHQgLyAyIC0gKHRoaXMudG9wX2NvbnRhaW5lci5oZWlnaHQgKyA2MClcbiAgICAgICAgbGV0IGJvdHRvbV95ID0gLShzaXplLmhlaWdodCAvIDIpICsgKHRoaXMuYm90dG9tX2NvbnRhaW5lci5oZWlnaHQgKyA2MClcbiAgICAgICAgaWYgKHBvcy54IDwgbGVmdF94KSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHBvcy55IDwgYm90dG9tX3kpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAocG9zLnggPiByaWdodF94KSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHBvcy55ID4gdG9wX3kpIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sXG4gICAgc2hvd0NoYXRCdG4oc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXRfYnRuX25kKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRfYnRuX25kLmFjdGl2ZSA9IHN0YXR1c1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyDmo4DmtYvmmK/lkKbmnInmlrDnmoTmsJTms6Hmj5DnpLpcbiAgICBjaGVja1Nob3dOZXdQcm9tcHRCdWJibGUoKSB7XG4gICAgICAgIGxldCBtb2RlbCA9IFByb21wdENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpXG4gICAgICAgIGxldCBkYXRhID0gbW9kZWwuZ2V0Tm90QnViYmxlUHJvbXB0KClcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1Byb21wdEJ1YmJsZShkYXRhKVxuICAgICAgICB9XG4gICAgICAgIGxldCBsaXN0ID0gbW9kZWwuZ2V0UHJvbXB0TGlzdCgpXG4gICAgICAgIGlmIChVdGlscy5nZXRBcnJMZW4obGlzdCkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQcm9tcHRUaXBzKHRydWUsIGxpc3QpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tIOaYvuekuuezu+e7n+aPkOekuuawlOazoVxuICAgIHNob3dQcm9tcHRCdWJibGUoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZGF0YS5zZXRTaG93QnViYmxlU3RhdHVzKHRydWUpXG4gICAgICAgICAgICB0aGlzLnByb21wdF9idWJibGVfbGF5b3V0LnN0b3BBbGxBY3Rpb25zKClcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfYnRuLmFjdGl2ZSA9ICh0cnVlKVxuICAgICAgICAgICAgdGhpcy5wcm9tcHRfYnViYmxlX2xheW91dC5hY3RpdmUgPSAodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X2Rlc2Muc3RyaW5nID0gKGRhdGEubmFtZSlcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X2Rlc2MuX3VwZGF0ZVJlbmRlckRhdGEodHJ1ZSlcbiAgICAgICAgICAgIGxldCBzaXplID0gdGhpcy5wcm9tcHRfZGVzYy5ub2RlLmdldENvbnRlbnRTaXplKClcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X2J1YmJsZS5zZXRDb250ZW50U2l6ZShjYy5zaXplKHNpemUud2lkdGggKyA2MCwgdGhpcy5wcm9tcHRfYnViYmxlX3NpemUuaGVpZ2h0KSlcblxuICAgICAgICAgICAgbGV0IGZhZGVpbiA9IGNjLmZhZGVJbigwLjcpXG4gICAgICAgICAgICBsZXQgZmFkZW91dCA9IGNjLmZhZGVPdXQoMC43KVxuICAgICAgICAgICAgdGhpcy5wcm9tcHRfYnViYmxlX2xheW91dC5ydW5BY3Rpb24oY2Muc2VxdWVuY2UoZmFkZWluLCBmYWRlb3V0KSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gLS0g5pi+56S657O757uf5o+Q56S6XG4gICAgc2hvd1Byb21wdFRpcHMoc3RhdHVzLCBsaXN0KSB7XG4gICAgICAgIGNjLmxvZyhzdGF0dXMsIGxpc3QsIFwic2hvd1Byb21wdFRpcHNcIilcbiAgICAgICAgaWYgKHN0YXR1cyA9PSB0cnVlICYmIGxpc3QgJiYgVXRpbHMubmV4dChsaXN0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX2J0bi5hY3RpdmUgPSAodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsLmRlc3Ryb3lBbGxDaGlsZHJlbigpXG4gICAgICAgICAgICBsZXQgbWF4X3dpZHRoID0gMFxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaXN0Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSBsaXN0W2tdXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudF9zaXplX2xhYmVsLnN0cmluZyA9ICh2Lm5hbWUpXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudF9zaXplX2xhYmVsLl91cGRhdGVSZW5kZXJEYXRhKHRydWUpXG4gICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0aGlzLmNvdW50X3NpemVfbGFiZWwubm9kZS5nZXRDb250ZW50U2l6ZSgpXG4gICAgICAgICAgICAgICAgaWYgKG1heF93aWR0aCA8IHNpemUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4X3dpZHRoID0gc2l6ZS53aWR0aFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXhfd2lkdGggPCAxNjgpIHtcbiAgICAgICAgICAgICAgICBtYXhfd2lkdGggPSAxNjggLy/ljp/mnKznmoTlpKflsI9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC0t5a2X55qE5a695bqm5ZKM5oyJ6ZKu55qE5a695bqm55u45beuMjBcbiAgICAgICAgICAgIG1heF93aWR0aCA9IG1heF93aWR0aCArIDIwXG5cbiAgICAgICAgICAgIGxldCBsZW4gPSBVdGlscy5nZXRBcnJMZW4obGlzdClcbiAgICAgICAgICAgIGxldCBidXR0b25faGVpZ2h0ID0gNDlcbiAgICAgICAgICAgIGxldCBidXR0b25faGVpZ2h0X3NwYWNlID0gMTJcbiAgICAgICAgICAgIGxldCByZXMgPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwibWFpbnVpXCIsIFwibWFpbnVpX3RpcHNfYmcxXCIpXG4gICAgICAgICAgICBsZXQgbWF4X2hlaWdodCA9IE1hdGgubWF4KHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsX3NpemUuaGVpZ2h0LCBsZW4gKiAoYnV0dG9uX2hlaWdodF9zcGFjZSArIGJ1dHRvbl9oZWlnaHQpKVxuICAgICAgICAgICAgbGV0IHNjcm9sbF9oZWlnaHQgPSBNYXRoLm1pbihsZW4gKiAoYnV0dG9uX2hlaWdodF9zcGFjZSArIGJ1dHRvbl9oZWlnaHQpLCAxNjApXG5cbiAgICAgICAgICAgIC8vIC0t5qC55o2u5aSn5bCP6LCD5pW05LiLc2Nyb2xs5ZKM6IOM5pmv5aSn5bCPXG4gICAgICAgICAgICBsZXQgdGlwc19zY3JvbGxfd2lkdGggPSBtYXhfd2lkdGggKyA0XG4gICAgICAgICAgICBsZXQgdGlwc19iZ193aWR0aCA9IHRpcHNfc2Nyb2xsX3dpZHRoICsgKHRoaXMucHJvbXB0X3RpcHNfYmdfc2l6ZS53aWR0aCAtIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsX3NpemUud2lkdGgpXG4gICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX3Njcm9sbC5zZXRDb250ZW50U2l6ZShjYy5zaXplKHRpcHNfc2Nyb2xsX3dpZHRoLCBzY3JvbGxfaGVpZ2h0KSlcbiAgICAgICAgICAgIC8vIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsOnNldElubmVyQ29udGFpbmVyU2l6ZShjYy5zaXplKHRpcHNfc2Nyb2xsX3dpZHRoLCBzY3JvbGxfaGVpZ2h0KSlcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfYmcuc2V0Q29udGVudFNpemUoY2Muc2l6ZSh0aXBzX2JnX3dpZHRoLCBzY3JvbGxfaGVpZ2h0ICsgNjApKVxuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsX2hlaWdodCA+IDE2MCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfc2Nyb2xsLnNldENvbnRlbnRTaXplKGNjLnNpemUodGlwc19zY3JvbGxfd2lkdGgsIG1heF9oZWlnaHQpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHYgPSBsaXN0W2ldXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBuZXcgY2MuTm9kZSgpXG4gICAgICAgICAgICAgICAgbGV0IGltYWdlID0gaXRlbS5hZGRDb21wb25lbnQoY2MuU3ByaXRlKVxuICAgICAgICAgICAgICAgIGltYWdlLnR5cGUgPSBjYy5TcHJpdGUuVHlwZS5TTElDRUQ7XG4gICAgICAgICAgICAgICAgaW1hZ2Uuc2l6ZU1vZGUgPSBjYy5TcHJpdGUuU2l6ZU1vZGUuQ1VTVE9NO1xuICAgICAgICAgICAgICAgIGl0ZW0uc2V0UG9zaXRpb24odGlwc19zY3JvbGxfd2lkdGggLyAyLCA1ICsgKGJ1dHRvbl9oZWlnaHRfc3BhY2UgKyBidXR0b25faGVpZ2h0KSAqIGkpXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRDb250ZW50U2l6ZShjYy5zaXplKG1heF93aWR0aCwgYnV0dG9uX2hlaWdodCkpXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRBbmNob3JQb2ludCgwLjUsIDApXG4gICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoU3ByaXRlRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc3ByaXRlRnJhbWUgPSBTcHJpdGVGcmFtZTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19zY3JvbGwuYWRkQ2hpbGQoaXRlbSlcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBuZXcgY2MuTm9kZSgpLmFkZENvbXBvbmVudChjYy5MYWJlbClcbiAgICAgICAgICAgICAgICBsYWJlbC5ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKCkuZnJvbUhFWChDb25maWcuY29sb3JfZGF0YS5kYXRhX2NvbG9yMTZbMTc1XSlcbiAgICAgICAgICAgICAgICBsYWJlbC5zdHJpbmcgPSB2Lm5hbWU7XG4gICAgICAgICAgICAgICAgbGFiZWwuZm9udFNpemUgPSAyMjtcbiAgICAgICAgICAgICAgICBsYWJlbC5saW5lSGVpZ2h0ID0gMjY7XG4gICAgICAgICAgICAgICAgbGFiZWwubm9kZS55ID0gYnV0dG9uX2hlaWdodCAvIDJcbiAgICAgICAgICAgICAgICBpdGVtLmFkZENoaWxkKGxhYmVsLm5vZGUpXG4gICAgICAgICAgICAgICAgbGV0IGJ0biA9IGl0ZW0uYWRkQ29tcG9uZW50KGNjLkJ1dHRvbilcbiAgICAgICAgICAgICAgICBidG4udHJhbnNpdGlvbiA9IGNjLkJ1dHRvbi5UcmFuc2l0aW9uLlNDQUxFO1xuICAgICAgICAgICAgICAgIGJ0bi5kdXJhdGlvbiA9IDAuMTtcbiAgICAgICAgICAgICAgICBidG4uem9vbVNjYWxlID0gMC45O1xuICAgICAgICAgICAgICAgIGl0ZW0ub24oJ3RvdWNoZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21wdF9tYXNrLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haW51aV9jb250cm9sbGVyLm9uQ2xpY2tQcm9tcHRUaXBzSXRlbSh2KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX2xheW91dC5hY3RpdmUgPSAoZmFsc2UpXG4gICAgICAgICAgICAgICAgfSwgdGhpcylcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19idG4uYWN0aXZlID0gKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5wcm9tcHRfdGlwc19sYXlvdXQuYWN0aXZlID0gKGZhbHNlKVxuICAgICAgICAgICAgaWYgKHRoaXMucHJvbXB0X21hc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb21wdF9tYXNrLmFjdGl2ZSA9IChmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgX29uQ2xpY2tQcm9tcHRUaXBzKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9tcHRfdGlwc19sYXlvdXQuYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLnByb21wdF90aXBzX2xheW91dC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb21wdF9tYXNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9tcHRfbWFzay5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvbXB0X3RpcHNfbGF5b3V0LmFjdGl2ZSA9ICh0cnVlKVxuICAgICAgICAgICAgaWYgKHRoaXMucHJvbXB0X21hc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb21wdF9tYXNrLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8v5Yib5bu65rex5rW35bCP56iL5bqP5a6i5pyN5rWu5qCHXG4gICAgY3JlYXRvckN1c3RvbWVyU2VydmljZUJ0bjogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21lcl9zZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbWVyX3NlcnZpY2UuZGVsZXRlTWUoKTtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tZXJfc2VydmljZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXN0b21lcl9zZXJ2aWNlID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJjdXN0b21lcl9zZXJ2aWNlX3dpbmRvd1wiKTtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHJlcXVpcmUoXCJ2aWV3bWFuYWdlclwiKS5nZXRJbnN0YW5jZSgpLmdldFNjZW5lTm9kZShTQ0VORV9UQUcubG9hZGluZyk7XG5cbiAgICAgICAgdGhpcy5jdXN0b21lcl9zZXJ2aWNlLnNldFBhcmVudChjb250YWluZXIpO1xuICAgICAgICB0aGlzLmN1c3RvbWVyX3NlcnZpY2Uuc2hvdygpO1xuICAgIH0sXG5cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpblVJVmlldzsiXX0=