|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/guildboss/view/guildboss_main_window.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, '15aedZLqDpA/rPxanyKewrG', 'guildboss_main_window');
|
// Scripts/mod/guildboss/view/guildboss_main_window.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: shiraho@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 公会boss主窗体
|
// <br/>Create: new Date().toISOString()
|
// --------------------------------------------------------------------
|
var PathTool = require("pathtool");
|
|
var GuildBossController = require("guildboss_controller");
|
|
var GuildEvent = require("guild_event");
|
|
var PlayerHead = require("playerhead");
|
|
var BackpackController = require("backpack_controller");
|
|
var TimeTool = require("timetool");
|
|
var RoleController = require("role_controller");
|
|
var GuildbossEvent = require("guildboss_event");
|
|
var GuildBossConst = require("guildboss_const");
|
|
var BaseRole = require("baserole");
|
|
var HeroController = require("hero_controller");
|
|
var PartnerConst = require("partner_const");
|
|
var ActivityController = require("activity_controller");
|
|
var GuideEvent = require("guide_event");
|
|
var GuildBossMainWindow = cc.Class({
|
"extends": BaseView,
|
ctor: function ctor() {
|
this.prefabPath = PathTool.getPrefabPath("guildboss", "guildboss_main_window");
|
this.win_type = WinType.Big;
|
this.viewTag = SCENE_TAG.dialogue;
|
this.ctrl = GuildBossController.getInstance();
|
this.model = this.ctrl.getModel();
|
this._doubleRewardList = {};
|
this._currentPassNum = {};
|
this._doublePassNum = {};
|
this.item_pool = [];
|
this.item_list = [];
|
this.item_list_1 = {};
|
this.item_list_2 = {};
|
this.rank_list = {};
|
},
|
openCallBack: function openCallBack() {
|
this.background = this.seekChild("background");
|
this.background.scale = FIT_SCALE;
|
var main_panel = this.seekChild("main_panel");
|
this.close_btn = this.seekChild(main_panel, "close_btn");
|
this.explain_btn = this.seekChild(main_panel, "explain_btn");
|
this.add_btn = this.seekChild(main_panel, "add_btn");
|
this.rank_btn = this.seekChild(main_panel, "rank_btn");
|
this.challenge_btn = this.seekChild(main_panel, "challenge_btn");
|
this.mopup_btn = this.seekChild(main_panel, "mopup_btn", cc.Button);
|
this.challenge_btn_label = this.seekChild(this.challenge_btn, "label", cc.Label);
|
this.challenge_btn_lo = this.seekChild(this.challenge_btn, "label", cc.LabelOutline);
|
this.mopup_btn_label = this.seekChild(this.mopup_btn.node, "label", cc.Label);
|
this.mopup_btn_lo = this.seekChild(this.mopup_btn.node, "label", cc.LabelOutline);
|
this.challenge_btn_label.string = Utils.TI18N("挑战");
|
this.mopup_btn_label.string = Utils.TI18N("扫荡"); //集结
|
|
this.muster_btn = this.seekChild(main_panel, "muster_btn");
|
this.muster_btn_tips = this.seekChild(this.muster_btn, "label", cc.Label);
|
this.muster_btn_tips.string = "";
|
this.musterImage = this.seekChild(main_panel, "musterImage"); // this.musterImage.x = this.muster_btn.x - 43;
|
|
this.musterImage.active = false;
|
this.muster_btn_label = this.seekChild(this.musterImage, "label", cc.Label);
|
this._doubleReward = this.seekChild(main_panel, "doubleReward");
|
this._doubleReward.active = false;
|
this.reset_time_value = this.seekChild(main_panel, "reset_time_value", cc.RichText);
|
this.challenge_times_value = this.seekChild(main_panel, "challenge_times_value", cc.Label);
|
this.chapter_name = this.seekChild(main_panel, "chapter_name", cc.Label);
|
this.chapter_boss_container = this.seekChild(main_panel, "chapter_boss_container");
|
|
var Preview = require("guildboss_preview_window");
|
|
this.guild_boss_view = new Preview();
|
this.guild_boss_view.setParent(this.chapter_boss_container);
|
this.guild_boss_view.show();
|
this.buff_container = this.seekChild(main_panel, "buff_container");
|
this.buff_name = this.seekChild(this.buff_container, "buff_name", cc.Label);
|
this.buff_name.string = "";
|
this.buff_icon = this.seekChild(this.buff_container, "buff_icon", cc.Sprite);
|
this.buff_acitive_label = this.seekChild(this.buff_container, "buff_acitive_label", cc.RichText);
|
this.remain_buy_lb = this.seekChild(main_panel, "remain_buy", cc.Label);
|
this.rank_container = this.seekChild(main_panel, "rank_container");
|
this.rank_info_btn = this.seekChild(this.rank_container, "rank_btn");
|
this.rank_btn_label = this.seekChild(this.rank_btn, "label", cc.Label);
|
this.bg = this.seekChild(main_panel, "bg", cc.Sprite);
|
var object = {};
|
object.container = this.seekChild(main_panel, "monster_container_1");
|
object.model = this.seekChild(object.container, "monster_model");
|
object.pass_icon = this.seekChild(object.container, "pass_icon");
|
object.monster_name = this.seekChild(object.container, "monster_name", cc.Label);
|
object.progress_container = this.seekChild(object.container, "progress_container");
|
object.progress = this.seekChild(object.progress_container, "progress", cc.ProgressBar);
|
object.hp_value = this.seekChild(object.progress_container, "hp_value", cc.Label);
|
object.boss_icon = new PlayerHead();
|
this.boss_icon = object.boss_icon;
|
object.boss_icon.show();
|
object.boss_icon.setPosition(-105, 133);
|
object.boss_icon.setScale(0.55);
|
object.boss_icon.setParent(object.container);
|
this.monster_container = object;
|
this.main_panel = main_panel;
|
},
|
registerEvent: function registerEvent() {
|
this.role_vo = RoleController.getInstance().getRoleVo();
|
|
if (this.role_vo != null) {
|
if (this.role_assets_event == null) {
|
this.role_assets_event = this.role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, value) {
|
if (key == "position") {}
|
}, this);
|
}
|
}
|
|
this.muster_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
if (this.role_vo.position == 1 || this.role_vo.position == 2) {
|
var str = Utils.TI18N("发出集结后将会提醒所有会友,且有1小时内不可再发出集结(全会),是否确定发出集结?");
|
|
var fun = function () {
|
this.ctrl.send21323();
|
}.bind(this);
|
|
var CommonAlert = require("commonalert");
|
|
CommonAlert.show(str, Utils.TI18N("确定"), fun, Utils.TI18N("取消"), null, 1, null, null, 24);
|
} else {
|
message(Utils.TI18N("只有会长、副会长可发出集结"));
|
}
|
}, this);
|
this.close_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.openMainWindow(false);
|
}, this);
|
this.addGlobalEvent(GuildbossEvent.MusterCoolTime, function (data) {
|
if (this.role_vo.position == 1 || this.role_vo.position == 2) {
|
this.musterCoolCountTime(data);
|
} else {
|
this.muster_btn_tips.string = Utils.TI18N("集结号角");
|
}
|
}, this);
|
this.addGlobalEvent(GuildbossEvent.BossActivityDoubleTime, function (data) {
|
this.doubleTimeAction(data);
|
}, this);
|
this.buff_container.on(cc.Node.EventType.TOUCH_END, function () {
|
this.checkBuff();
|
}, this);
|
this.background.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.openMainWindow(false);
|
}, this);
|
this.explain_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
|
Utils.playButtonSound(1);
|
var pos = event.touch.getLocation();
|
|
require("tips_controller").getInstance().showCommonTips(Config.guild_dun_data.data_const.game_rule.desc, pos);
|
}, this);
|
this.add_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
this.ctrl.requestBuyChallengeTimes(0);
|
}, this);
|
this.rank_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
var select_item;
|
|
if (this.guild_boss_view) {
|
select_item = this.guild_boss_view.getCurSelect();
|
}
|
|
if (select_item && select_item.data) {
|
this.ctrl.openGuildBossRankWindow(true, select_item.data);
|
}
|
}, this);
|
this.rank_info_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
var data = null;
|
|
if (this.guild_boss_view) {
|
data = this.guild_boss_view.getCurSelect();
|
}
|
|
require("rank_controller").getInstance().openRankView(true, require("rank_constant").RankType.union_boss, null, data);
|
}, this);
|
this.challenge_btn.on(cc.Node.EventType.TOUCH_END, function () {
|
if (this.cur_selected_object && this.cur_selected_object.config && this.base_info) {
|
if (this.base_info.count > 0) {
|
HeroController.getInstance().openFormGoFightPanel(true, PartnerConst.Fun_Form.GuildDun_AD, {
|
boss_id: this.cur_selected_object.config.boss_id
|
});
|
} else {
|
this.ctrl.requestBuyChallengeTimes(1);
|
}
|
}
|
|
gcore.GlobalEvent.fire(GuideEvent.TaskNextStep, "challenge_btn");
|
}, this);
|
this.mopup_btn.node.on("click", function () {
|
if (this.cur_selected_object && this.cur_selected_object.config && this.base_info) {
|
this.requestMopupMonster();
|
}
|
}, this); //更新面板基础信息
|
|
this.addGlobalEvent(GuildbossEvent.UpdateGuildDunBaseInfo, function () {
|
if (this.guild_boss_view) {
|
this.guild_boss_view.updateScrollViewList();
|
}
|
|
this.updateDunBaseInfo();
|
}, this);
|
this.addGlobalEvent(GuildbossEvent.UpdateChangeStatus, function (data) {
|
this.updateChangeStatus(data);
|
}, this);
|
this.addGlobalEvent(GuildbossEvent.UpdateGuildDunRank, function () {
|
var rank_list = this.ctrl.getModel().getRaknRoleTopThreeList();
|
|
if (rank_list && Utils.next(rank_list || {}) != null) {
|
for (var i in rank_list) {
|
var v = rank_list[i];
|
|
if (!this.rank_list[i]) {
|
var item = this.createSingleRankItem(i, v);
|
this.rank_list[i] = item;
|
}
|
|
var item = this.rank_list[i];
|
|
if (item) {
|
item.label.string = v.name;
|
|
if (v.all_dps) {
|
item.value.string = "[" + Utils.getMoneyString(v.all_dps, false) + Utils.TI18N("伤害") + "]";
|
} else {
|
item.value.string = "";
|
}
|
}
|
}
|
}
|
}, this); //更新当前剩余挑战次数
|
|
this.addGlobalEvent(GuildbossEvent.UpdateGuildBossChallengeTimes, function (buy_type) {
|
if (this.base_info != null) {
|
this.challenge_times_value.string = this.base_info.count;
|
this.remainBuyCount(this.base_info.buy_count);
|
} else {
|
var base_info = this.model.getBaseInfo();
|
|
if (base_info != null) {
|
this.remainBuyCount(base_info.buy_count);
|
this.challenge_times_value.string = base_info.count;
|
}
|
} //挑战购买的时候自动打开挑战界面
|
|
|
if (buy_type == 1) {
|
this.autoOpenChallengeWindow();
|
}
|
}, this);
|
this.addGlobalEvent(GuildEvent.UpdateGuildRedStatus, function (type, status) {
|
this.updateSomeRedStatus(type, status);
|
}, this);
|
},
|
checkBuff: function checkBuff() {
|
if (this.base_info) {
|
var item = gdata("guild_dun_data", "data_const", "buff_item").val;
|
var num = BackpackController.getInstance().getModel().getBackPackItemNumByBid(item);
|
var cost = gdata("guild_dun_data", "data_const", "buff_cost").val;
|
var item_icon = Utils.getItemConfig(item).icon;
|
var index_lev = Math.min(this.base_info.buff_lev + 1, Config.guild_dun_data.data_buff_data_length);
|
var desc = gdata("guild_dun_data", "data_buff_data", [index_lev]).desc;
|
var str = "";
|
var str_ = "";
|
var str_end = cc.js.formatStr(Utils.TI18N("<color=#764519>(激活后效果为</c><color=#289b14 ><size= 24>%s</></c><color=#764519>)</c>"), desc);
|
var res = null;
|
|
if (num > 0) {
|
//如果存在道具
|
if (this.base_info.buff_lev == 0) {
|
//表示没buff
|
str = cc.js.formatStr(Utils.TI18N("是否消耗<img src='%s' visible=true scale=0.5 /><color=#289b14 ><size= 24>%s</></c><color=#764519>(拥有:</c><color=#289b14><size=24>%s</></c><color=#764519>)激活全公会伤害提升Buff\n</c>"), item_icon, 1, num);
|
str_ = str + str_end;
|
res = PathTool.getItemRes(item_icon);
|
} else {
|
str = cc.js.formatStr(Utils.TI18N("是否消耗<img src='%s' visible=true scale=0.5 /><color=#289b14 ><size= 24>%s</></c><color=#764519>(拥有:</c><color=#289b14><size=24>%s</></c><color=#764519>)激活全公会伤害提升Buff\n</c>"), item_icon, 1, num);
|
str_ = str + str_end;
|
res = PathTool.getItemRes(item_icon);
|
}
|
} else {
|
if (this.base_info.buff_lev == 0) {
|
//表示没buff
|
str = cc.js.formatStr(Utils.TI18N("是否消耗<img src='%s' visible=true scale=0.5 /><color=#289b14 ><size= 24>%s</></c><color=#764519>激活全公会伤害提升Buff\n</c>"), Config.item_data.data_assets_label2id.gold, cost);
|
str_ = str + str_end;
|
res = PathTool.getItemRes(Config.item_data.data_assets_label2id.gold);
|
} else {
|
str = cc.js.formatStr(Utils.TI18N("是否消耗<img src='%s' visible=true scale=0.5 /><color=#289b14 ><size= 24>%s</></c><color=#764519>激活全公会伤害提升Buff\n</c>"), Config.item_data.data_assets_label2id.gold, cost);
|
str_ = str + str_end;
|
res = PathTool.getItemRes(Config.item_data.data_assets_label2id.gold);
|
}
|
}
|
|
var fun = function () {
|
this.ctrl.send21305();
|
}.bind(this);
|
|
var CommonAlert = new require("commonalert");
|
CommonAlert.show(str_, Utils.TI18N('确认'), fun, Utils.TI18N('取消'), null, 2, null, {
|
resArr: [res]
|
});
|
}
|
},
|
updateMusterCoolTimeTicket: function updateMusterCoolTimeTicket() {
|
this.remainTime = this.remainTime - 1;
|
|
if (this.remainTime <= 0) {
|
this.musterImage.active = false;
|
this.muster_btn_tips.active = true;
|
this.muster_btn_label.node.stopAllActions();
|
}
|
|
this.muster_btn_label.string = cc.js.formatStr(Utils.TI18N("%s\n后可集结"), TimeTool.getTimeFormat(this.remainTime));
|
},
|
musterCoolCountTime: function musterCoolCountTime(less_time) {
|
if (!this.muster_btn_label) return;
|
this.remainTime = less_time;
|
this.muster_btn_label.node.stopAllActions();
|
|
if (this.remainTime > 0) {
|
this.musterImage.active = true;
|
var self = this;
|
this.muster_btn_label.node.runAction(cc.repeatForever(cc.sequence(cc.delayTime(1), cc.callFunc(function () {
|
self.remainTime = self.remainTime - 1;
|
|
if (self.remainTime <= 0) {
|
self.musterImage.active = false;
|
self.muster_btn_tips.active = true;
|
self.muster_btn_label.node.stopAllActions();
|
} else {
|
self.musterImage.active = true;
|
self.muster_btn_tips.active = false;
|
self.muster_btn_label.string = cc.js.formatStr(Utils.TI18N("%s\n后可集结"), TimeTool.getTimeFormat(self.remainTime));
|
}
|
}))));
|
this.updateMusterCoolTimeTicket();
|
} else {
|
this.musterImage.active = false;
|
this.muster_btn_label.node.stopAllActions();
|
this.muster_btn_tips.string = Utils.TI18N("集结号角");
|
}
|
},
|
//切换Boss的时候
|
updateChangeStatus: function updateChangeStatus(data) {
|
if (!data) return;
|
var fid = 0;
|
var base_info = this.model.getBaseInfo();
|
var object = this.monster_container;
|
var hp_info = null;
|
|
if (data.status == 0) {
|
fid = base_info.fid;
|
|
if (base_info != null && base_info.info != null) {
|
//储存容器里面相关的boss模型
|
for (var i in base_info.info) {
|
var v = base_info.info[i];
|
var boss_config = gdata("guild_dun_data", "data_guildboss_list", [v.boss_id]);
|
|
if (boss_config) {
|
if (object != null) {
|
object.config = boss_config;
|
hp_info = v;
|
}
|
}
|
}
|
|
if (base_info.combat_info) {
|
for (var i in base_info.combat_info) {
|
var v = base_info.combat_info[i];
|
|
if (object && object.config && v.boss_id == object.config.boss_id) {
|
object.dps = v.dps;
|
}
|
}
|
}
|
}
|
|
this.buff_container.active = true;
|
} else {
|
fid = data.config.id;
|
object.config = data.config;
|
hp_info = {
|
boss_id: data.config.boss_id,
|
hp: 0
|
};
|
object.dps = 0;
|
this.buff_container.active = false;
|
}
|
|
if (fid) {
|
var chatpter_config = gdata("guild_dun_data", "data_chapter_reward", [fid]);
|
var config = gdata("guild_dun_data", "data_guildboss_list", [chatpter_config.show_id]);
|
|
if (chatpter_config != null) {
|
this.chapter_name.string = chatpter_config.chapter_name + " " + chatpter_config.chapter_desc;
|
}
|
|
this.updateBg(config.bg_res);
|
}
|
|
if (hp_info) {
|
this.updateMonsterHPStatus(object, hp_info);
|
}
|
|
if (object) {
|
this.updateMonsterInfo(object); //更新模型
|
|
this.updateSelectedBtnStatus();
|
}
|
},
|
createSingleRankItem: function createSingleRankItem(i, data) {
|
var container = {};
|
var node = this.seekChild(this.rank_container, "rank_" + (Number(i) + 1));
|
var label = this.seekChild(node, "label", cc.Label);
|
var value = this.seekChild(node, "value", cc.Label);
|
var sp = this.seekChild(node, "sp");
|
container.node = node;
|
container.label = label;
|
container.value = value;
|
container.sp = sp;
|
return container;
|
},
|
requestMopupMonster: function requestMopupMonster() {
|
if (this.base_info == null) return;
|
var base_info = this.base_info;
|
|
if (base_info.count > 0) {
|
var msg = cc.js.formatStr(Utils.TI18N("确定按照上次挑战的伤害量<color=#249003>%s</c>扫荡一次吗?"), this.cur_selected_object.dps);
|
|
var CommonAlert = require("commonalert");
|
|
CommonAlert.show(msg, Utils.TI18N("确定"), function () {
|
this.ctrl.requestMopupMonster(this.cur_selected_object.config.boss_id);
|
}.bind(this), Utils.TI18N("取消"), null, 2);
|
} else {
|
var buy_next_num = base_info.buy_count + 1;
|
var buy_config = gdata("guild_dun_data", "data_buy_count", [buy_next_num]);
|
|
if (buy_config == null) {
|
message(Utils.TI18N("当前没有扫荡次数,且购买次数已到达本日上限!"));
|
} else {
|
var role_vo = RoleController.getInstance().getRoleVo();
|
|
if (role_vo) {
|
if (role_vo.vip_lev < buy_config.vip_lev) {
|
var msg = cc.js.formatStr(Utils.TI18N("挑战次数不足,提升至<color='#289b14'>vip%s</c>,可增加<color='#289b14'>1</c>点次数购买上限!"), buy_config.vip_lev);
|
|
var CommonAlert = require("commonalert");
|
|
CommonAlert.show(msg, Utils.TI18N("我要提升"), function () {
|
require("vip_controller").getInstance().openVipMainWindow(true, VIPTABCONST.CHARGE);
|
}.bind(this), Utils.TI18N("取消"), null, 2);
|
} else {
|
var cost = buy_config.expend;
|
if (cost == null || cost.length < 2) return;
|
var item_config = Utils.getItemConfig(cost[0]);
|
|
if (item_config) {
|
var msg = cc.js.formatStr(Utils.TI18N("挑战次数不足,是否花费 <img src='%s' scale=0.5 /> %s 购买<color=#289b14>1</c>点挑战次数并扫荡?\n(扫荡根据上次的伤害量<color=#249003>%s</c>进行结算)"), item_config.icon, cost[1], this.cur_selected_object.dps);
|
var res = PathTool.getItemRes(item_config.icon);
|
|
var CommonAlert = require("commonalert");
|
|
CommonAlert.show(msg, Utils.TI18N("确定"), function () {
|
this.ctrl.requestMopupMonster(this.cur_selected_object.config.boss_id);
|
}.bind(this), Utils.TI18N("取消"), null, 2, null, {
|
resArr: [res]
|
});
|
}
|
}
|
}
|
}
|
}
|
},
|
openRootWnd: function openRootWnd() {
|
//基础信息,服务端要求没次打开面板的时候都请求一下
|
this.ctrl.requestGuildDunBaseInfo();
|
ActivityController.getInstance().setFirstComeGuild(false); //设置初始红点
|
|
this.updateSomeRedStatus();
|
|
if (ActivityController.getInstance().getBossActivityDoubleTime() == true) {
|
this._doubleReward.active = true;
|
}
|
},
|
//设置buff倒计时
|
updateBuffTime: function updateBuffTime(time) {
|
if (time && time) {
|
this.buff_second = time;
|
|
if (this.buff_second <= 0) {
|
this.clearBuffTimeTicket();
|
} else {
|
if (this.buff_time_ticket == null) {
|
this.buff_time_ticket = gcore.Timer.set(function () {
|
this.updateBuffTimeTicket();
|
}.bind(this), 1000, -1);
|
}
|
}
|
}
|
},
|
clearBuffTimeTicket: function clearBuffTimeTicket() {
|
if (this.buff_time_ticket != null) {
|
gcore.Timer.del(this.buff_time_ticket);
|
this.buff_time_ticket = null;
|
}
|
},
|
updateBuffTimeTicket: function updateBuffTimeTicket() {
|
this.buff_second = this.buff_second - 1;
|
|
if (this.buff_second <= 0) {
|
this.clearBuffTimeTicket();
|
}
|
|
this.buff_acitive_label.string = cc.js.formatStr(Utils.TI18N("<color=#35ff14>(%s后失效)</c>"), TimeTool.getTimeFormat(this.buff_second));
|
},
|
//挑战购买次数的时候自动打开面板
|
autoOpenChallengeWindow: function autoOpenChallengeWindow() {
|
if (this.cur_selected_object && this.cur_selected_object.config && this.base_info) {
|
if (this.base_info.count > 0) {
|
HeroController.getInstance().openFormGoFightPanel(true, PartnerConst.Fun_Form.GuildDun_AD, {
|
boss_id: this.cur_selected_object.config.boss_id
|
});
|
}
|
}
|
},
|
//协议返回用于更新基础信息
|
updateDunBaseInfo: function updateDunBaseInfo() {
|
this.base_info = this.model.getBaseInfo();
|
var base_info = this.base_info;
|
|
if (base_info != null && base_info.info != null) {
|
this.remainBuyCount(base_info.buy_count); //储存容器里面相关的boss模型
|
|
for (var i in base_info.info) {
|
var v = base_info.info[i];
|
var boss_config = gdata("guild_dun_data", "data_guildboss_list", [v.boss_id]);
|
|
if (boss_config) {
|
var object = this.monster_container;
|
|
if (object != null) {
|
object.config = boss_config; //更新血量
|
|
this.updateMonsterHPStatus(object, v);
|
}
|
}
|
} //存储dps
|
|
|
if (base_info.combat_info) {
|
for (var i in this.base_info.combat_info) {
|
var v = this.base_info.combat_info[i];
|
|
if (this.monster_container && this.monster_container.config && v.boss_id == this.monster_container.config.boss_id) {
|
this.monster_container.dps = v.dps;
|
}
|
}
|
} //设置基础信息显示
|
|
|
this.challenge_times_value.string = base_info.count;
|
|
if (this.cur_fid != base_info.fid) {
|
this.cur_fid = base_info.fid;
|
var chatpter_config = gdata("guild_dun_data", "data_chapter_reward", [base_info.fid]);
|
|
if (chatpter_config != null) {
|
if (this.monster_container && this.monster_container.boss_icon) {
|
var config = gdata("guild_dun_data", "data_guildboss_list", [chatpter_config.show_id]);
|
|
if (config) {
|
this.monster_container.boss_icon.setHeadRes(config.head_icon);
|
this.updateBg(config.bg_res);
|
}
|
}
|
|
this.chapter_name.string = chatpter_config.chapter_name + " " + chatpter_config.chapter_desc; //这里设置挑战奖励吧
|
|
this.updateFillRewardsItems(chatpter_config.dps_awrard, chatpter_config.award, chatpter_config.guild_exp);
|
}
|
} //延迟创建模型
|
|
|
gcore.Timer.set(function () {
|
this.updateMonsterInfo(this.monster_container);
|
}.bind(this), 8 / 60, 1);
|
this.selecetMonsterContainer();
|
|
if (base_info != null && base_info.buff_end_time != 0) {
|
var buff_config = gdata("guild_dun_data", "data_buff_data", [base_info.buff_lev]);
|
|
if (buff_config) {
|
this.buff_name.string = buff_config.desc; // this.buff_acitive_label.node.x = this.buff_name.node.width + this.buff_name.node.x + 10;
|
}
|
|
this.buff_icon.setState(cc.Sprite.State.NORMAL);
|
this.buff_name.node.color = new cc.Color(137, 237, 255, 255);
|
this.updateBuffTime(base_info.buff_end_time);
|
this.buff_container.active = true;
|
} else {
|
this.buff_icon.setState(cc.Sprite.State.GRAY);
|
this.buff_name.node.color = new cc.Color(cc.Color.WHITE);
|
this.buff_name.string = gdata("guild_dun_data", "data_const", ["des_nobuff"]).desc; // this.buff_acitive_label.node.x = this.buff_name.node.width + this.buff_name.node.x + 10;
|
|
this.buff_acitive_label.string = Utils.TI18N("<color=#ff5858>(未激活)</c>");
|
}
|
}
|
},
|
//剩余购买次数
|
remainBuyCount: function remainBuyCount(count) {
|
count = count || 0;
|
var num = 0;
|
var length = Config.guild_dun_data.data_buy_count_length;
|
var buy_config = Config.guild_dun_data.data_buy_count[length];
|
|
if (buy_config) {
|
num = buy_config.count - count;
|
}
|
|
this.remain_buy_lb.string = num;
|
},
|
updateBg: function updateBg(image) {
|
var res_id = PathTool.getBigBg(image, null, "guildboss");
|
|
if (this.res_id != res_id) {
|
this.res_id = res_id;
|
this.loadRes(this.res_id, function (sf_obj) {
|
this.bg.spriteFrame = sf_obj;
|
}.bind(this));
|
}
|
},
|
//创建模型,根据config
|
updateMonsterInfo: function updateMonsterInfo(object) {
|
if (object == null || object.config == null) return;
|
var config = object.config; //怪物模型方面,只有id不同才做处理
|
|
if (object.boss_id != config.boss_id) {
|
object.boss_id = config.boss_id;
|
object.monster_name.string = config.item_name; //清除掉之前的模型
|
|
if (object.spine) {
|
// object.spine.deleteMe();
|
// object.spine = null;
|
object.spine.setData(BaseRole.type.unit, config.combat_id, PlayerAction.show, true);
|
} else {
|
object.spine = new BaseRole();
|
object.spine.setParent(object.model);
|
object.spine.setData(BaseRole.type.unit, config.combat_id, PlayerAction.show, true);
|
}
|
}
|
},
|
//选中指定的怪物节点
|
selecetMonsterContainer: function selecetMonsterContainer(type) {
|
this.cur_selected_object = this.monster_container; // var protocal = {
|
// boss_id: this.cur_selected_object.config.boss_id,
|
// start_num: 1,
|
// end_num: 3
|
// }
|
// this.ctrl.requestGuildDunRank(GuildBossConst.rank.role, protocal)
|
|
this.updateSelectedBtnStatus();
|
},
|
//更新选中对象的按钮状态
|
updateSelectedBtnStatus: function updateSelectedBtnStatus() {
|
if (this.cur_selected_object == null) return;
|
if (this.cur_selected_object.hp == null || this.cur_selected_object.dps == null) return;
|
|
if (this.cur_selected_object.hp == 0) {
|
//已经被击杀了
|
Utils.setGreyButton(this.challenge_btn, true);
|
Utils.setGreyButton(this.mopup_btn, true);
|
this.challenge_btn_lo.enabled = false;
|
this.mopup_btn_lo.enabled = false;
|
} else {
|
if (this.cur_selected_object.dps == 0) {
|
//没有挑战过,不可以扫荡
|
Utils.setGreyButton(this.mopup_btn, true);
|
Utils.setGreyButton(this.challenge_btn, false);
|
this.challenge_btn_lo.enabled = true;
|
this.mopup_btn_lo.enabled = false;
|
} else {
|
Utils.setGreyButton(this.challenge_btn, false);
|
Utils.setGreyButton(this.mopup_btn, false);
|
this.challenge_btn_lo.enabled = true;
|
this.mopup_btn_lo.enabled = true;
|
}
|
}
|
},
|
//更新血条
|
updateMonsterHPStatus: function updateMonsterHPStatus(object, info) {
|
if (object == null || info == null || object.config == null) return;
|
|
if (info.hp <= 0) {
|
this.doubleTimeAction(false);
|
} else {
|
if (ActivityController.getInstance().getBossActivityDoubleTime() == true) this.doubleTimeAction(true);
|
} //设置血量
|
|
|
var config = object.config;
|
var percent = Math.ceil(100 * info.hp / config.hp);
|
object.hp_value.string = percent + "%";
|
object.progress.progress = percent / 100;
|
object.hp = info.hp;
|
object.pass_icon.active = info.hp == 0;
|
object.boss_icon.setVisible(info.hp != 0);
|
object.monster_name.node.active = info.hp != 0;
|
object.progress_container.active = info.hp != 0;
|
},
|
doubleTimeAction: function doubleTimeAction(bool) {
|
if (bool == false) {
|
this._doubleReward.stopAllActions();
|
|
if (Utils.next(this._doubleRewardList) != null) {
|
for (var i in this._doubleReward) {
|
var v = this._doubleReward[i]; // v.setSpecialColor();
|
// v.setSpecialNum(this._currentPassNum[i]);
|
// v.setDoubleIcon(false);
|
}
|
}
|
}
|
|
this._doubleReward.active = bool;
|
var seq = cc.sequence(cc.fadeOut(1.0), cc.fadeIn(1.0), cc.delayTime(0.3));
|
|
this._doubleReward.runAction(cc.repeatForever(seq));
|
|
if (Utils.next(this._doubleRewardList) != null) {
|
for (var i in this._doubleRewardList) {
|
var v = this._doubleRewardList[i]; // v.setSpecialColor(true);
|
// v.setSpecialNum(this._doublePassNum[i]);
|
// v.setDoubleIcon(true);
|
}
|
}
|
},
|
//设置物品奖励
|
//dps_award:伤害奖励列表
|
//fixed_award:固定奖励列表
|
//guild_award:公会贡献特殊
|
updateFillRewardsItems: function updateFillRewardsItems(dps_award, fixed_award, guild_award) {
|
dps_award = dps_award || {};
|
_fixed_award = fixed_award || [];
|
|
var _fixed_award = Utils.deepCopy(fixed_award);
|
|
guild_award = guild_award || 0;
|
|
_fixed_award.push([gdata("item_data", "data_assets_label2id", "guild_exp"), guild_award]); // for (var i in this.item_list) {
|
// var item = this.item_list[i];
|
// item.setVisible(false);
|
// this.item_pool.push(item);
|
// }
|
// this.item_list = [];
|
|
|
for (var i in this.item_list_1) {
|
var item = this.item_list_1[i];
|
|
if (item) {
|
item.setVisible(false);
|
}
|
}
|
|
for (var i in this.item_list_2) {
|
var item = this.item_list_2[i];
|
|
if (item) {
|
item.setVisible(false);
|
}
|
}
|
|
var item_config = null;
|
var index = 1; // var backpack_item = null;
|
|
var _x = 0;
|
|
var _y = -339;
|
|
var scale = 0.8;
|
var desc = null; //设置伤害奖励
|
|
for (var i in dps_award) {
|
var v = dps_award[i];
|
|
if (this.item_list_1[index] == null) {
|
var _backpack_item = ItemsPool.getInstance().getItem("backpack_item");
|
|
_backpack_item.initConfig(false, scale, false, true);
|
|
_backpack_item.setParent(this.main_panel);
|
|
_backpack_item.show();
|
|
this.item_list_1[index] = _backpack_item;
|
}
|
|
var backpack_item = this.item_list_1[index]; // backpack_item = this.item_pool.shift();
|
|
backpack_item.setVisible(true);
|
_x = 100 + (index - 1) * (BackPackItem.Width * scale + 14) + BackPackItem.Width * scale * 0.5 - 335; // backpack_item.setDefaultTip();
|
|
backpack_item.setPosition(_x, _y);
|
backpack_item.setData({
|
bid: v[0],
|
num: v[1]
|
});
|
|
if (v[1] >= 1000) {
|
desc = cc.js.formatStr("%sK", Math.floor(v[1] * 0.001));
|
} else {
|
desc = v[1];
|
}
|
|
if (v[2]) {
|
desc = desc;
|
} // backpack_item.setSpecialNum(desc);
|
// backpack_item.setSpecialColor();
|
|
|
this._currentPassNum[i] = desc;
|
|
if (!this._doubleRewardList[i]) {
|
this._doubleRewardList[i] = backpack_item;
|
var doubleDesc = null;
|
|
if (v[1] * 2 >= 1000) {
|
doubleDesc = cc.js.formatStr("%sK", Math.floor(v[1] * 2 * 0.001));
|
} else {
|
doubleDesc = v[1] * 2;
|
}
|
|
if (v[2]) {
|
doubleDesc = doubleDesc;
|
}
|
|
this._doublePassNum[i] = doubleDesc;
|
} // this.item_list.push(backpack_item);
|
|
|
index = index + 1;
|
}
|
|
if (ActivityController.getInstance().getBossActivityDoubleTime() == true) {
|
this.doubleTimeAction(true);
|
} //设置击杀奖励
|
|
|
index = 1; // backpack_item = null;
|
|
for (var i in _fixed_award) {
|
var v = _fixed_award[i];
|
|
if (v instanceof Array && v[0] && v[1]) {
|
if (this.item_list_2[index] == null) {
|
var _backpack_item2 = ItemsPool.getInstance().getItem("backpack_item");
|
|
_backpack_item2.initConfig(false, scale, false, true);
|
|
_backpack_item2.setParent(this.main_panel);
|
|
_backpack_item2.show();
|
|
this.item_list_2[index] = _backpack_item2;
|
}
|
|
var backpack_item = this.item_list_2[index]; // backpack_item = this.item_pool.shift();
|
|
backpack_item.setVisible(true);
|
_x = 100 + (index - 1) * (BackPackItem.Width * scale + 14) + BackPackItem.Width * scale * 0.5 - 23; // backpack_item.setDefaultTip();
|
|
backpack_item.setPosition(_x, _y);
|
backpack_item.setData({
|
bid: v[0],
|
num: v[1]
|
});
|
this.item_list.push(backpack_item);
|
index = index + 1;
|
}
|
}
|
},
|
//更新红点
|
updateSomeRedStatus: function updateSomeRedStatus(type, status) {},
|
getType: function getType(index) {
|
if (index == 1) {
|
return GuildBossConst.type.physics;
|
} else {
|
return GuildBossConst.type.magic;
|
}
|
},
|
closeCallBack: function closeCallBack() {
|
if (this.boss_icon) {
|
this.boss_icon.deleteMe();
|
this.boss_icon = null;
|
}
|
|
if (this._doubleRewardList) {
|
for (var i in this._doubleRewardList) {
|
var v = this._doubleRewardList[i];
|
|
if (v.deleteMe) {
|
v.deleteMe();
|
v = null;
|
}
|
}
|
|
this._doubleRewardList = null;
|
} // this.clearTimeTicket();
|
|
|
this.clearBuffTimeTicket();
|
|
if (this.monster_list) {
|
for (var i in this.monster_list) {
|
var v = this.monster_list[i];
|
|
if (v.spine) {
|
v.spine.deleteMe();
|
v.spine = null;
|
}
|
}
|
|
this.monster_list = null;
|
} // if (this.item_list) {
|
// for (var i in this.item_list) {
|
// var v = this.item_list[i];
|
// if (v.deleteMe) {
|
// v.deleteMe();
|
// v = null;
|
// }
|
// }
|
// this.item_list = null;
|
// }
|
// for (var i in this.item_pool) {
|
// this.item_pool[i].deleteMe();
|
// this.item_pool[i] = null;
|
// }
|
// this.item_pool = null;
|
|
|
if (this.item_list_2) {
|
for (var i in this.item_list_2) {
|
if (this.item_list_2[i]) {
|
this.item_list_2[i].deleteMe();
|
this.item_list_2[i] = null;
|
}
|
}
|
|
this.item_list_2 = null;
|
} // if (this.item_list_1) {
|
// for (var i in this.item_list_1) {
|
// if (this.item_list_1[i]) {
|
// this.item_list_1[i].deleteMe();
|
// this.item_list_1[i] = null;
|
// }
|
// }
|
// this.item_list_1 = null;
|
// }
|
|
|
this.muster_btn_label.node.stopAllActions();
|
|
if (this.guild_boss_view) {
|
this.guild_boss_view.deleteMe();
|
this.guild_boss_view = null;
|
}
|
|
if (this.role_vo != null) {
|
if (this.role_assets_event != null) {
|
this.role_vo.unbind(this.role_assets_event);
|
this.role_assets_event = null;
|
}
|
|
this.role_vo = null;
|
}
|
|
this.ctrl.openMainWindow(false);
|
}
|
});
|
module.exports = GuildBossMainWindow;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZGJvc3NcXHZpZXdcXGd1aWxkYm9zc19tYWluX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJHdWlsZEJvc3NDb250cm9sbGVyIiwiR3VpbGRFdmVudCIsIlBsYXllckhlYWQiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJUaW1lVG9vbCIsIlJvbGVDb250cm9sbGVyIiwiR3VpbGRib3NzRXZlbnQiLCJHdWlsZEJvc3NDb25zdCIsIkJhc2VSb2xlIiwiSGVyb0NvbnRyb2xsZXIiLCJQYXJ0bmVyQ29uc3QiLCJBY3Rpdml0eUNvbnRyb2xsZXIiLCJHdWlkZUV2ZW50IiwiR3VpbGRCb3NzTWFpbldpbmRvdyIsImNjIiwiQ2xhc3MiLCJCYXNlVmlldyIsImN0b3IiLCJwcmVmYWJQYXRoIiwiZ2V0UHJlZmFiUGF0aCIsIndpbl90eXBlIiwiV2luVHlwZSIsIkJpZyIsInZpZXdUYWciLCJTQ0VORV9UQUciLCJkaWFsb2d1ZSIsImN0cmwiLCJnZXRJbnN0YW5jZSIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJfZG91YmxlUmV3YXJkTGlzdCIsIl9jdXJyZW50UGFzc051bSIsIl9kb3VibGVQYXNzTnVtIiwiaXRlbV9wb29sIiwiaXRlbV9saXN0IiwiaXRlbV9saXN0XzEiLCJpdGVtX2xpc3RfMiIsInJhbmtfbGlzdCIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsIm1haW5fcGFuZWwiLCJjbG9zZV9idG4iLCJleHBsYWluX2J0biIsImFkZF9idG4iLCJyYW5rX2J0biIsImNoYWxsZW5nZV9idG4iLCJtb3B1cF9idG4iLCJCdXR0b24iLCJjaGFsbGVuZ2VfYnRuX2xhYmVsIiwiTGFiZWwiLCJjaGFsbGVuZ2VfYnRuX2xvIiwiTGFiZWxPdXRsaW5lIiwibW9wdXBfYnRuX2xhYmVsIiwibm9kZSIsIm1vcHVwX2J0bl9sbyIsInN0cmluZyIsIlV0aWxzIiwiVEkxOE4iLCJtdXN0ZXJfYnRuIiwibXVzdGVyX2J0bl90aXBzIiwibXVzdGVySW1hZ2UiLCJhY3RpdmUiLCJtdXN0ZXJfYnRuX2xhYmVsIiwiX2RvdWJsZVJld2FyZCIsInJlc2V0X3RpbWVfdmFsdWUiLCJSaWNoVGV4dCIsImNoYWxsZW5nZV90aW1lc192YWx1ZSIsImNoYXB0ZXJfbmFtZSIsImNoYXB0ZXJfYm9zc19jb250YWluZXIiLCJQcmV2aWV3IiwiZ3VpbGRfYm9zc192aWV3Iiwic2V0UGFyZW50Iiwic2hvdyIsImJ1ZmZfY29udGFpbmVyIiwiYnVmZl9uYW1lIiwiYnVmZl9pY29uIiwiU3ByaXRlIiwiYnVmZl9hY2l0aXZlX2xhYmVsIiwicmVtYWluX2J1eV9sYiIsInJhbmtfY29udGFpbmVyIiwicmFua19pbmZvX2J0biIsInJhbmtfYnRuX2xhYmVsIiwiYmciLCJvYmplY3QiLCJjb250YWluZXIiLCJwYXNzX2ljb24iLCJtb25zdGVyX25hbWUiLCJwcm9ncmVzc19jb250YWluZXIiLCJwcm9ncmVzcyIsIlByb2dyZXNzQmFyIiwiaHBfdmFsdWUiLCJib3NzX2ljb24iLCJzZXRQb3NpdGlvbiIsInNldFNjYWxlIiwibW9uc3Rlcl9jb250YWluZXIiLCJyZWdpc3RlckV2ZW50Iiwicm9sZV92byIsImdldFJvbGVWbyIsInJvbGVfYXNzZXRzX2V2ZW50IiwiYmluZCIsIkV2ZW50SWQiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWx1ZSIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsInBvc2l0aW9uIiwic3RyIiwiZnVuIiwic2VuZDIxMzIzIiwiQ29tbW9uQWxlcnQiLCJtZXNzYWdlIiwib3Blbk1haW5XaW5kb3ciLCJhZGRHbG9iYWxFdmVudCIsIk11c3RlckNvb2xUaW1lIiwiZGF0YSIsIm11c3RlckNvb2xDb3VudFRpbWUiLCJCb3NzQWN0aXZpdHlEb3VibGVUaW1lIiwiZG91YmxlVGltZUFjdGlvbiIsImNoZWNrQnVmZiIsImV2ZW50IiwicGxheUJ1dHRvblNvdW5kIiwicG9zIiwidG91Y2giLCJnZXRMb2NhdGlvbiIsInNob3dDb21tb25UaXBzIiwiQ29uZmlnIiwiZ3VpbGRfZHVuX2RhdGEiLCJkYXRhX2NvbnN0IiwiZ2FtZV9ydWxlIiwiZGVzYyIsInJlcXVlc3RCdXlDaGFsbGVuZ2VUaW1lcyIsInNlbGVjdF9pdGVtIiwiZ2V0Q3VyU2VsZWN0Iiwib3Blbkd1aWxkQm9zc1JhbmtXaW5kb3ciLCJvcGVuUmFua1ZpZXciLCJSYW5rVHlwZSIsInVuaW9uX2Jvc3MiLCJjdXJfc2VsZWN0ZWRfb2JqZWN0IiwiY29uZmlnIiwiYmFzZV9pbmZvIiwiY291bnQiLCJvcGVuRm9ybUdvRmlnaHRQYW5lbCIsIkZ1bl9Gb3JtIiwiR3VpbGREdW5fQUQiLCJib3NzX2lkIiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImZpcmUiLCJUYXNrTmV4dFN0ZXAiLCJyZXF1ZXN0TW9wdXBNb25zdGVyIiwiVXBkYXRlR3VpbGREdW5CYXNlSW5mbyIsInVwZGF0ZVNjcm9sbFZpZXdMaXN0IiwidXBkYXRlRHVuQmFzZUluZm8iLCJVcGRhdGVDaGFuZ2VTdGF0dXMiLCJ1cGRhdGVDaGFuZ2VTdGF0dXMiLCJVcGRhdGVHdWlsZER1blJhbmsiLCJnZXRSYWtuUm9sZVRvcFRocmVlTGlzdCIsIm5leHQiLCJpIiwidiIsIml0ZW0iLCJjcmVhdGVTaW5nbGVSYW5rSXRlbSIsImxhYmVsIiwibmFtZSIsImFsbF9kcHMiLCJnZXRNb25leVN0cmluZyIsIlVwZGF0ZUd1aWxkQm9zc0NoYWxsZW5nZVRpbWVzIiwiYnV5X3R5cGUiLCJyZW1haW5CdXlDb3VudCIsImJ1eV9jb3VudCIsImdldEJhc2VJbmZvIiwiYXV0b09wZW5DaGFsbGVuZ2VXaW5kb3ciLCJVcGRhdGVHdWlsZFJlZFN0YXR1cyIsInR5cGUiLCJzdGF0dXMiLCJ1cGRhdGVTb21lUmVkU3RhdHVzIiwiZ2RhdGEiLCJ2YWwiLCJudW0iLCJnZXRCYWNrUGFja0l0ZW1OdW1CeUJpZCIsImNvc3QiLCJpdGVtX2ljb24iLCJnZXRJdGVtQ29uZmlnIiwiaWNvbiIsImluZGV4X2xldiIsIk1hdGgiLCJtaW4iLCJidWZmX2xldiIsImRhdGFfYnVmZl9kYXRhX2xlbmd0aCIsInN0cl8iLCJzdHJfZW5kIiwianMiLCJmb3JtYXRTdHIiLCJyZXMiLCJnZXRJdGVtUmVzIiwiaXRlbV9kYXRhIiwiZGF0YV9hc3NldHNfbGFiZWwyaWQiLCJnb2xkIiwic2VuZDIxMzA1IiwicmVzQXJyIiwidXBkYXRlTXVzdGVyQ29vbFRpbWVUaWNrZXQiLCJyZW1haW5UaW1lIiwic3RvcEFsbEFjdGlvbnMiLCJnZXRUaW1lRm9ybWF0IiwibGVzc190aW1lIiwic2VsZiIsInJ1bkFjdGlvbiIsInJlcGVhdEZvcmV2ZXIiLCJzZXF1ZW5jZSIsImRlbGF5VGltZSIsImNhbGxGdW5jIiwiZmlkIiwiaHBfaW5mbyIsImluZm8iLCJib3NzX2NvbmZpZyIsImNvbWJhdF9pbmZvIiwiZHBzIiwiaWQiLCJocCIsImNoYXRwdGVyX2NvbmZpZyIsInNob3dfaWQiLCJjaGFwdGVyX2Rlc2MiLCJ1cGRhdGVCZyIsImJnX3JlcyIsInVwZGF0ZU1vbnN0ZXJIUFN0YXR1cyIsInVwZGF0ZU1vbnN0ZXJJbmZvIiwidXBkYXRlU2VsZWN0ZWRCdG5TdGF0dXMiLCJOdW1iZXIiLCJzcCIsIm1zZyIsImJ1eV9uZXh0X251bSIsImJ1eV9jb25maWciLCJ2aXBfbGV2Iiwib3BlblZpcE1haW5XaW5kb3ciLCJWSVBUQUJDT05TVCIsIkNIQVJHRSIsImV4cGVuZCIsImxlbmd0aCIsIml0ZW1fY29uZmlnIiwib3BlblJvb3RXbmQiLCJyZXF1ZXN0R3VpbGREdW5CYXNlSW5mbyIsInNldEZpcnN0Q29tZUd1aWxkIiwiZ2V0Qm9zc0FjdGl2aXR5RG91YmxlVGltZSIsInVwZGF0ZUJ1ZmZUaW1lIiwidGltZSIsImJ1ZmZfc2Vjb25kIiwiY2xlYXJCdWZmVGltZVRpY2tldCIsImJ1ZmZfdGltZV90aWNrZXQiLCJUaW1lciIsInNldCIsInVwZGF0ZUJ1ZmZUaW1lVGlja2V0IiwiZGVsIiwiY3VyX2ZpZCIsInNldEhlYWRSZXMiLCJoZWFkX2ljb24iLCJ1cGRhdGVGaWxsUmV3YXJkc0l0ZW1zIiwiZHBzX2F3cmFyZCIsImF3YXJkIiwiZ3VpbGRfZXhwIiwic2VsZWNldE1vbnN0ZXJDb250YWluZXIiLCJidWZmX2VuZF90aW1lIiwiYnVmZl9jb25maWciLCJzZXRTdGF0ZSIsIlN0YXRlIiwiTk9STUFMIiwiY29sb3IiLCJDb2xvciIsIkdSQVkiLCJXSElURSIsImRhdGFfYnV5X2NvdW50X2xlbmd0aCIsImRhdGFfYnV5X2NvdW50IiwiaW1hZ2UiLCJyZXNfaWQiLCJnZXRCaWdCZyIsImxvYWRSZXMiLCJzZl9vYmoiLCJzcHJpdGVGcmFtZSIsIml0ZW1fbmFtZSIsInNwaW5lIiwic2V0RGF0YSIsInVuaXQiLCJjb21iYXRfaWQiLCJQbGF5ZXJBY3Rpb24iLCJzZXRHcmV5QnV0dG9uIiwiZW5hYmxlZCIsInBlcmNlbnQiLCJjZWlsIiwic2V0VmlzaWJsZSIsImJvb2wiLCJzZXEiLCJmYWRlT3V0IiwiZmFkZUluIiwiZHBzX2F3YXJkIiwiZml4ZWRfYXdhcmQiLCJndWlsZF9hd2FyZCIsIl9maXhlZF9hd2FyZCIsImRlZXBDb3B5IiwicHVzaCIsImluZGV4IiwiX3giLCJfeSIsImJhY2twYWNrX2l0ZW0iLCJJdGVtc1Bvb2wiLCJnZXRJdGVtIiwiaW5pdENvbmZpZyIsIkJhY2tQYWNrSXRlbSIsIldpZHRoIiwiYmlkIiwiZmxvb3IiLCJkb3VibGVEZXNjIiwiQXJyYXkiLCJnZXRUeXBlIiwicGh5c2ljcyIsIm1hZ2ljIiwiY2xvc2VDYWxsQmFjayIsImRlbGV0ZU1lIiwibW9uc3Rlcl9saXN0IiwidW5iaW5kIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFJQSxRQUFRLEdBQUdDLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlDLG1CQUFtQixHQUFHRCxPQUFPLENBQUMsc0JB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QUt6RSxJQUFMLENBQVUyRixjQUFWLENBQXlCLEtBQXpCO0FBQ0g7QUEvM0I4QixDQUFULENBQTFCO0FBbTRCQStNLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnhULG1CQUFqQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxyXG4vLyBAZGVzY3JpcHRpb246XHJcbi8vICAgICAg5YWs5LyaYm9zc+S4u+eql+S9k1xyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XHJcbnZhciBHdWlsZEJvc3NDb250cm9sbGVyID0gcmVxdWlyZShcImd1aWxkYm9zc19jb250cm9sbGVyXCIpO1xyXG52YXIgR3VpbGRFdmVudCA9IHJlcXVpcmUoXCJndWlsZF9ldmVudFwiKTtcclxudmFyIFBsYXllckhlYWQgPSByZXF1aXJlKFwicGxheWVyaGVhZFwiKTtcclxudmFyIEJhY2twYWNrQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYWNrcGFja19jb250cm9sbGVyXCIpO1xyXG52YXIgVGltZVRvb2wgPSByZXF1aXJlKFwidGltZXRvb2xcIik7XHJcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XHJcbnZhciBHdWlsZGJvc3NFdmVudCA9IHJlcXVpcmUoXCJndWlsZGJvc3NfZXZlbnRcIik7XHJcbnZhciBHdWlsZEJvc3NDb25zdCA9IHJlcXVpcmUoXCJndWlsZGJvc3NfY29uc3RcIik7XHJcbnZhciBCYXNlUm9sZSA9IHJlcXVpcmUoXCJiYXNlcm9sZVwiKTtcclxudmFyIEhlcm9Db250cm9sbGVyID0gcmVxdWlyZShcImhlcm9fY29udHJvbGxlclwiKTtcclxudmFyIFBhcnRuZXJDb25zdCA9IHJlcXVpcmUoXCJwYXJ0bmVyX2NvbnN0XCIpO1xyXG52YXIgQWN0aXZpdHlDb250cm9sbGVyID0gcmVxdWlyZShcImFjdGl2aXR5X2NvbnRyb2xsZXJcIik7XHJcbnZhciBHdWlkZUV2ZW50ID0gcmVxdWlyZShcImd1aWRlX2V2ZW50XCIpO1xyXG5cclxudmFyIEd1aWxkQm9zc01haW5XaW5kb3cgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcclxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiZ3VpbGRib3NzXCIsIFwiZ3VpbGRib3NzX21haW5fd2luZG93XCIpO1xyXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkJpZztcclxuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcuZGlhbG9ndWU7XHJcbiAgICAgICAgdGhpcy5jdHJsID0gR3VpbGRCb3NzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZG91YmxlUmV3YXJkTGlzdCA9IHt9XHJcbiAgICAgICAgdGhpcy5fY3VycmVudFBhc3NOdW0gPSB7fVxyXG4gICAgICAgIHRoaXMuX2RvdWJsZVBhc3NOdW0gPSB7fVxyXG4gICAgICAgIHRoaXMuaXRlbV9wb29sID0gW11cclxuICAgICAgICB0aGlzLml0ZW1fbGlzdCA9IFtdXHJcbiAgICAgICAgdGhpcy5pdGVtX2xpc3RfMSA9IHt9O1xyXG4gICAgICAgIHRoaXMuaXRlbV9saXN0XzIgPSB7fTtcclxuICAgICAgICB0aGlzLnJhbmtfbGlzdCA9IHt9XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICBvcGVuQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB0aGlzLnNlZWtDaGlsZChcImJhY2tncm91bmRcIik7XHJcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xyXG4gICAgICAgIHZhciBtYWluX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQoXCJtYWluX3BhbmVsXCIpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJjbG9zZV9idG5cIik7XHJcbiAgICAgICAgdGhpcy5leHBsYWluX2J0biA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiZXhwbGFpbl9idG5cIik7XHJcbiAgICAgICAgdGhpcy5hZGRfYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJhZGRfYnRuXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnJhbmtfYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJyYW5rX2J0blwiKTtcclxuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG4gPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImNoYWxsZW5nZV9idG5cIik7XHJcbiAgICAgICAgdGhpcy5tb3B1cF9idG4gPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcIm1vcHVwX2J0blwiLCBjYy5CdXR0b24pO1xyXG4gICAgICAgIHRoaXMuY2hhbGxlbmdlX2J0bl9sYWJlbCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuY2hhbGxlbmdlX2J0biwgXCJsYWJlbFwiLCBjYy5MYWJlbCk7XHJcbiAgICAgICAgdGhpcy5jaGFsbGVuZ2VfYnRuX2xvID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5jaGFsbGVuZ2VfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsT3V0bGluZSk7XHJcbiAgICAgICAgdGhpcy5tb3B1cF9idG5fbGFiZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1vcHVwX2J0bi5ub2RlLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLm1vcHVwX2J0bl9sbyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubW9wdXBfYnRuLm5vZGUsIFwibGFiZWxcIiwgY2MuTGFiZWxPdXRsaW5lKTtcclxuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG5fbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmjJHmiJhcIik7XHJcbiAgICAgICAgdGhpcy5tb3B1cF9idG5fbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmiavojaFcIik7XHJcblxyXG4gICAgICAgIC8v6ZuG57uTXHJcbiAgICAgICAgdGhpcy5tdXN0ZXJfYnRuID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJtdXN0ZXJfYnRuXCIpO1xyXG4gICAgICAgIHRoaXMubXVzdGVyX2J0bl90aXBzID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tdXN0ZXJfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLm11c3Rlcl9idG5fdGlwcy5zdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgICAgICB0aGlzLm11c3RlckltYWdlID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJtdXN0ZXJJbWFnZVwiKTtcclxuICAgICAgICAvLyB0aGlzLm11c3RlckltYWdlLnggPSB0aGlzLm11c3Rlcl9idG4ueCAtIDQzO1xyXG4gICAgICAgIHRoaXMubXVzdGVySW1hZ2UuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tdXN0ZXJJbWFnZSwgXCJsYWJlbFwiLCBjYy5MYWJlbCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RvdWJsZVJld2FyZCA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiZG91YmxlUmV3YXJkXCIpO1xyXG4gICAgICAgIHRoaXMuX2RvdWJsZVJld2FyZC5hY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNldF90aW1lX3ZhbHVlID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJyZXNldF90aW1lX3ZhbHVlXCIsIGNjLlJpY2hUZXh0KTtcclxuICAgICAgICB0aGlzLmNoYWxsZW5nZV90aW1lc192YWx1ZSA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiY2hhbGxlbmdlX3RpbWVzX3ZhbHVlXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmNoYXB0ZXJfbmFtZSA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwiY2hhcHRlcl9uYW1lXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmNoYXB0ZXJfYm9zc19jb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImNoYXB0ZXJfYm9zc19jb250YWluZXJcIik7XHJcbiAgICAgICAgdmFyIFByZXZpZXcgPSByZXF1aXJlKFwiZ3VpbGRib3NzX3ByZXZpZXdfd2luZG93XCIpO1xyXG4gICAgICAgIHRoaXMuZ3VpbGRfYm9zc192aWV3ID0gbmV3IFByZXZpZXcoKTtcclxuICAgICAgICB0aGlzLmd1aWxkX2Jvc3Nfdmlldy5zZXRQYXJlbnQodGhpcy5jaGFwdGVyX2Jvc3NfY29udGFpbmVyKTtcclxuICAgICAgICB0aGlzLmd1aWxkX2Jvc3Nfdmlldy5zaG93KCk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVmZl9jb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcImJ1ZmZfY29udGFpbmVyXCIpO1xyXG4gICAgICAgIHRoaXMuYnVmZl9uYW1lID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5idWZmX2NvbnRhaW5lciwgXCJidWZmX25hbWVcIiwgY2MuTGFiZWwpO1xyXG4gICAgICAgIHRoaXMuYnVmZl9uYW1lLnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5idWZmX2ljb24gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJ1ZmZfY29udGFpbmVyLCBcImJ1ZmZfaWNvblwiLCBjYy5TcHJpdGUpO1xyXG4gICAgICAgIHRoaXMuYnVmZl9hY2l0aXZlX2xhYmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5idWZmX2NvbnRhaW5lciwgXCJidWZmX2FjaXRpdmVfbGFiZWxcIiwgY2MuUmljaFRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbWFpbl9idXlfbGIgPSB0aGlzLnNlZWtDaGlsZChtYWluX3BhbmVsLCBcInJlbWFpbl9idXlcIiwgY2MuTGFiZWwpO1xyXG5cclxuICAgICAgICB0aGlzLnJhbmtfY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJyYW5rX2NvbnRhaW5lclwiKTtcclxuICAgICAgICB0aGlzLnJhbmtfaW5mb19idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJhbmtfY29udGFpbmVyLCBcInJhbmtfYnRuXCIpO1xyXG4gICAgICAgIHRoaXMucmFua19idG5fbGFiZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJhbmtfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB0aGlzLmJnID0gdGhpcy5zZWVrQ2hpbGQobWFpbl9wYW5lbCwgXCJiZ1wiLCBjYy5TcHJpdGUpO1xyXG5cclxuICAgICAgICB2YXIgb2JqZWN0ID0ge307XHJcbiAgICAgICAgb2JqZWN0LmNvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKG1haW5fcGFuZWwsIFwibW9uc3Rlcl9jb250YWluZXJfMVwiKTtcclxuICAgICAgICBvYmplY3QubW9kZWwgPSB0aGlzLnNlZWtDaGlsZChvYmplY3QuY29udGFpbmVyLCBcIm1vbnN0ZXJfbW9kZWxcIik7XHJcbiAgICAgICAgb2JqZWN0LnBhc3NfaWNvbiA9IHRoaXMuc2Vla0NoaWxkKG9iamVjdC5jb250YWluZXIsIFwicGFzc19pY29uXCIpO1xyXG4gICAgICAgIG9iamVjdC5tb25zdGVyX25hbWUgPSB0aGlzLnNlZWtDaGlsZChvYmplY3QuY29udGFpbmVyLCBcIm1vbnN0ZXJfbmFtZVwiLCBjYy5MYWJlbCk7XHJcbiAgICAgICAgb2JqZWN0LnByb2dyZXNzX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKG9iamVjdC5jb250YWluZXIsIFwicHJvZ3Jlc3NfY29udGFpbmVyXCIpO1xyXG4gICAgICAgIG9iamVjdC5wcm9ncmVzcyA9IHRoaXMuc2Vla0NoaWxkKG9iamVjdC5wcm9ncmVzc19jb250YWluZXIsIFwicHJvZ3Jlc3NcIiwgY2MuUHJvZ3Jlc3NCYXIpO1xyXG4gICAgICAgIG9iamVjdC5ocF92YWx1ZSA9IHRoaXMuc2Vla0NoaWxkKG9iamVjdC5wcm9ncmVzc19jb250YWluZXIsIFwiaHBfdmFsdWVcIiwgY2MuTGFiZWwpO1xyXG4gICAgICAgIG9iamVjdC5ib3NzX2ljb24gPSBuZXcgUGxheWVySGVhZCgpO1xyXG4gICAgICAgIHRoaXMuYm9zc19pY29uID0gb2JqZWN0LmJvc3NfaWNvbjtcclxuICAgICAgICBvYmplY3QuYm9zc19pY29uLnNob3coKVxyXG4gICAgICAgIG9iamVjdC5ib3NzX2ljb24uc2V0UG9zaXRpb24oLTEwNSwgMTMzKTtcclxuICAgICAgICBvYmplY3QuYm9zc19pY29uLnNldFNjYWxlKDAuNTUpO1xyXG4gICAgICAgIG9iamVjdC5ib3NzX2ljb24uc2V0UGFyZW50KG9iamVjdC5jb250YWluZXIpO1xyXG4gICAgICAgIHRoaXMubW9uc3Rlcl9jb250YWluZXIgPSBvYmplY3Q7XHJcblxyXG4gICAgICAgIHRoaXMubWFpbl9wYW5lbCA9IG1haW5fcGFuZWw7XHJcbiAgICB9LFxyXG5cclxuXHJcblxyXG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucm9sZV92byAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSB0aGlzLnJvbGVfdm8uYmluZChFdmVudElkLlVQREFURV9ST0xFX0FUVFJJQlVURSwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwicG9zaXRpb25cIikge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCB0aGlzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm11c3Rlcl9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfdm8ucG9zaXRpb24gPT0gMSB8fCB0aGlzLnJvbGVfdm8ucG9zaXRpb24gPT0gMikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IFV0aWxzLlRJMThOKFwi5Y+R5Ye66ZuG57uT5ZCO5bCG5Lya5o+Q6YaS5omA5pyJ5Lya5Y+L77yM5LiU5pyJMeWwj+aXtuWGheS4jeWPr+WGjeWPkeWHuumbhue7k++8iOWFqOS8mu+8ie+8jOaYr+WQpuehruWumuWPkeWHuumbhue7k++8n1wiKTtcclxuICAgICAgICAgICAgICAgIHZhciBmdW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmQyMTMyMygpO1xyXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XHJcbiAgICAgICAgICAgICAgICBDb21tb25BbGVydC5zaG93KHN0ciwgVXRpbHMuVEkxOE4oXCLnoa7lrppcIiksIGZ1biwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIDEsIG51bGwsIG51bGwsIDI0KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuWPquacieS8mumVv+OAgeWJr+S8mumVv+WPr+WPkeWHuumbhue7k1wiKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN0cmwub3Blbk1haW5XaW5kb3coZmFsc2UpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG5cclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkYm9zc0V2ZW50Lk11c3RlckNvb2xUaW1lLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX3ZvLnBvc2l0aW9uID09IDEgfHwgdGhpcy5yb2xlX3ZvLnBvc2l0aW9uID09IDIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubXVzdGVyQ29vbENvdW50VGltZShkYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubXVzdGVyX2J0bl90aXBzLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6ZuG57uT5Y+36KeSXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZGJvc3NFdmVudC5Cb3NzQWN0aXZpdHlEb3VibGVUaW1lLCBmdW5jdGlvbiAoZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmRvdWJsZVRpbWVBY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5idWZmX2NvbnRhaW5lci5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja0J1ZmYoKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLmJhY2tncm91bmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuTWFpbldpbmRvdyhmYWxzZSk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5leHBsYWluX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoMSk7XHJcbiAgICAgICAgICAgIHZhciBwb3MgPSBldmVudC50b3VjaC5nZXRMb2NhdGlvbigpO1xyXG4gICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoQ29uZmlnLmd1aWxkX2R1bl9kYXRhLmRhdGFfY29uc3QuZ2FtZV9ydWxlLmRlc2MsIHBvcyk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5hZGRfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdEJ1eUNoYWxsZW5nZVRpbWVzKDApO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIHRoaXMucmFua19idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RfaXRlbTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpbGRfYm9zc192aWV3KSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RfaXRlbSA9IHRoaXMuZ3VpbGRfYm9zc192aWV3LmdldEN1clNlbGVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RfaXRlbSAmJiBzZWxlY3RfaXRlbS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3Blbkd1aWxkQm9zc1JhbmtXaW5kb3codHJ1ZSwgc2VsZWN0X2l0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLnJhbmtfaW5mb19idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3VpbGRfYm9zc192aWV3KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5ndWlsZF9ib3NzX3ZpZXcuZ2V0Q3VyU2VsZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVxdWlyZShcInJhbmtfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLm9wZW5SYW5rVmlldyh0cnVlLCByZXF1aXJlKFwicmFua19jb25zdGFudFwiKS5SYW5rVHlwZS51bmlvbl9ib3NzLCBudWxsLCBkYXRhKTtcclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QgJiYgdGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0LmNvbmZpZyAmJiB0aGlzLmJhc2VfaW5mbykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFzZV9pbmZvLmNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkZvcm1Hb0ZpZ2h0UGFuZWwodHJ1ZSwgUGFydG5lckNvbnN0LkZ1bl9Gb3JtLkd1aWxkRHVuX0FELCB7IGJvc3NfaWQ6IHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5jb25maWcuYm9zc19pZCB9KVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdEJ1eUNoYWxsZW5nZVRpbWVzKDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpZGVFdmVudC5UYXNrTmV4dFN0ZXAsXCJjaGFsbGVuZ2VfYnRuXCIpXHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5tb3B1cF9idG4ubm9kZS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdCAmJiB0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuY29uZmlnICYmIHRoaXMuYmFzZV9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RNb3B1cE1vbnN0ZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIC8v5pu05paw6Z2i5p2/5Z+656GA5L+h5oGvXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZGJvc3NFdmVudC5VcGRhdGVHdWlsZER1bkJhc2VJbmZvLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmd1aWxkX2Jvc3Nfdmlldykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ndWlsZF9ib3NzX3ZpZXcudXBkYXRlU2Nyb2xsVmlld0xpc3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUR1bkJhc2VJbmZvKCk7XHJcbiAgICAgICAgfSwgdGhpcylcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZGJvc3NFdmVudC5VcGRhdGVDaGFuZ2VTdGF0dXMsIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhbmdlU3RhdHVzKGRhdGEpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcblxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpbGRib3NzRXZlbnQuVXBkYXRlR3VpbGREdW5SYW5rLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByYW5rX2xpc3QgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKS5nZXRSYWtuUm9sZVRvcFRocmVlTGlzdCgpO1xyXG4gICAgICAgICAgICBpZiAocmFua19saXN0ICYmIFV0aWxzLm5leHQocmFua19saXN0IHx8IHt9KSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHJhbmtfbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gcmFua19saXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yYW5rX2xpc3RbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZVNpbmdsZVJhbmtJdGVtKGksIHYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmtfbGlzdFtpXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5yYW5rX2xpc3RbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5sYWJlbC5zdHJpbmcgPSB2Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmFsbF9kcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUuc3RyaW5nID0gXCJbXCIgKyBVdGlscy5nZXRNb25leVN0cmluZyh2LmFsbF9kcHMsIGZhbHNlKSArIFV0aWxzLlRJMThOKFwi5Lyk5a6zXCIpICsgXCJdXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnZhbHVlLnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0aGlzKVxyXG5cclxuICAgICAgICAvL+abtOaWsOW9k+WJjeWJqeS9meaMkeaImOasoeaVsFxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpbGRib3NzRXZlbnQuVXBkYXRlR3VpbGRCb3NzQ2hhbGxlbmdlVGltZXMsIGZ1bmN0aW9uIChidXlfdHlwZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5iYXNlX2luZm8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFsbGVuZ2VfdGltZXNfdmFsdWUuc3RyaW5nID0gdGhpcy5iYXNlX2luZm8uY291bnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbWFpbkJ1eUNvdW50KHRoaXMuYmFzZV9pbmZvLmJ1eV9jb3VudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYmFzZV9pbmZvID0gdGhpcy5tb2RlbC5nZXRCYXNlSW5mbygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJhc2VfaW5mbyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1haW5CdXlDb3VudChiYXNlX2luZm8uYnV5X2NvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYWxsZW5nZV90aW1lc192YWx1ZS5zdHJpbmcgPSBiYXNlX2luZm8uY291bnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy/mjJHmiJjotK3kubDnmoTml7blgJnoh6rliqjmiZPlvIDmjJHmiJjnlYzpnaJcclxuICAgICAgICAgICAgaWYgKGJ1eV90eXBlID09IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXV0b09wZW5DaGFsbGVuZ2VXaW5kb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRoaXMpO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZEV2ZW50LlVwZGF0ZUd1aWxkUmVkU3RhdHVzLCBmdW5jdGlvbiAodHlwZSwgc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU29tZVJlZFN0YXR1cyh0eXBlLCBzdGF0dXMpO1xyXG4gICAgICAgIH0sIHRoaXMpXHJcbiAgICB9LFxyXG5cclxuICAgIGNoZWNrQnVmZjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhc2VfaW5mbykge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IGdkYXRhKFwiZ3VpbGRfZHVuX2RhdGFcIiwgXCJkYXRhX2NvbnN0XCIsIFwiYnVmZl9pdGVtXCIpLnZhbDtcclxuICAgICAgICAgICAgdmFyIG51bSA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0QmFja1BhY2tJdGVtTnVtQnlCaWQoaXRlbSk7XHJcbiAgICAgICAgICAgIHZhciBjb3N0ID0gZ2RhdGEoXCJndWlsZF9kdW5fZGF0YVwiLCBcImRhdGFfY29uc3RcIiwgXCJidWZmX2Nvc3RcIikudmFsO1xyXG4gICAgICAgICAgICB2YXIgaXRlbV9pY29uID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhpdGVtKS5pY29uO1xyXG4gICAgICAgICAgICB2YXIgaW5kZXhfbGV2ID0gTWF0aC5taW4odGhpcy5iYXNlX2luZm8uYnVmZl9sZXYgKyAxLCBDb25maWcuZ3VpbGRfZHVuX2RhdGEuZGF0YV9idWZmX2RhdGFfbGVuZ3RoKTtcclxuICAgICAgICAgICAgdmFyIGRlc2MgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9idWZmX2RhdGFcIiwgW2luZGV4X2xldl0pLmRlc2M7XHJcbiAgICAgICAgICAgIHZhciBzdHIgPSBcIlwiO1xyXG4gICAgICAgICAgICB2YXIgc3RyXyA9IFwiXCI7XHJcbiAgICAgICAgICAgIHZhciBzdHJfZW5kID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiPGNvbG9yPSM3NjQ1MTk+KOa/gOa0u+WQjuaViOaenOS4ujwvYz48Y29sb3I9IzI4OWIxNCA+PHNpemU9IDI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pik8L2M+XCIpLCBkZXNjKTtcclxuICAgICAgICAgICAgdmFyIHJlcyA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmIChudW0gPiAwKSB7IC8v5aaC5p6c5a2Y5Zyo6YGT5YW3XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5iYXNlX2luZm8uYnVmZl9sZXYgPT0gMCkgeyAvL+ihqOekuuayoWJ1ZmZcclxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmmK/lkKbmtojogJc8aW1nIHNyYz0nJXMnIHZpc2libGU9dHJ1ZSBzY2FsZT0wLjUgLz48Y29sb3I9IzI4OWIxNCA+PHNpemU9IDI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pijmi6XmnIk6PC9jPjxjb2xvcj0jMjg5YjE0PjxzaXplPTI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pinmv4DmtLvlhajlhazkvJrkvKTlrrPmj5DljYdCdWZmXFxuPC9jPlwiKSwgaXRlbV9pY29uLCAxLCBudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cl8gPSBzdHIgKyBzdHJfZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9pY29uKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmmK/lkKbmtojogJc8aW1nIHNyYz0nJXMnIHZpc2libGU9dHJ1ZSBzY2FsZT0wLjUgLz48Y29sb3I9IzI4OWIxNCA+PHNpemU9IDI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pijmi6XmnIk6PC9jPjxjb2xvcj0jMjg5YjE0PjxzaXplPTI0PiVzPC8+PC9jPjxjb2xvcj0jNzY0NTE5Pinmv4DmtLvlhajlhazkvJrkvKTlrrPmj5DljYdCdWZmXFxuPC9jPlwiKSwgaXRlbV9pY29uLCAxLCBudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cl8gPSBzdHIgKyBzdHJfZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9pY29uKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFzZV9pbmZvLmJ1ZmZfbGV2ID09IDApIHsgLy/ooajnpLrmsqFidWZmXHJcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5piv5ZCm5raI6ICXPGltZyBzcmM9JyVzJyB2aXNpYmxlPXRydWUgc2NhbGU9MC41IC8+PGNvbG9yPSMyODliMTQgPjxzaXplPSAyND4lczwvPjwvYz48Y29sb3I9Izc2NDUxOT7mv4DmtLvlhajlhazkvJrkvKTlrrPmj5DljYdCdWZmXFxuPC9jPlwiKSwgQ29uZmlnLml0ZW1fZGF0YS5kYXRhX2Fzc2V0c19sYWJlbDJpZC5nb2xkLCBjb3N0KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJfID0gc3RyICsgc3RyX2VuZDtcclxuICAgICAgICAgICAgICAgICAgICByZXMgPSBQYXRoVG9vbC5nZXRJdGVtUmVzKENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfbGFiZWwyaWQuZ29sZClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5piv5ZCm5raI6ICXPGltZyBzcmM9JyVzJyB2aXNpYmxlPXRydWUgc2NhbGU9MC41IC8+PGNvbG9yPSMyODliMTQgPjxzaXplPSAyND4lczwvPjwvYz48Y29sb3I9Izc2NDUxOT7mv4DmtLvlhajlhazkvJrkvKTlrrPmj5DljYdCdWZmXFxuPC9jPlwiKSwgQ29uZmlnLml0ZW1fZGF0YS5kYXRhX2Fzc2V0c19sYWJlbDJpZC5nb2xkLCBjb3N0KTtcclxuICAgICAgICAgICAgICAgICAgICBzdHJfID0gc3RyICsgc3RyX2VuZDtcclxuICAgICAgICAgICAgICAgICAgICByZXMgPSBQYXRoVG9vbC5nZXRJdGVtUmVzKENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfbGFiZWwyaWQuZ29sZClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgZnVuID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmQyMTMwNSgpO1xyXG4gICAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gbmV3IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcclxuICAgICAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhzdHJfLCBVdGlscy5USTE4Tign56Gu6K6kJyksIGZ1biwgVXRpbHMuVEkxOE4oJ+WPlua2iCcpLCBudWxsLCAyLCBudWxsLCB7IHJlc0FycjogW3Jlc10gfSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZU11c3RlckNvb2xUaW1lVGlja2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5yZW1haW5UaW1lID0gdGhpcy5yZW1haW5UaW1lIC0gMTtcclxuICAgICAgICBpZiAodGhpcy5yZW1haW5UaW1lIDw9IDApIHtcclxuICAgICAgICAgICAgdGhpcy5tdXN0ZXJJbWFnZS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX3RpcHMuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX2xhYmVsLm5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIiVzXFxu5ZCO5Y+v6ZuG57uTXCIpLCBUaW1lVG9vbC5nZXRUaW1lRm9ybWF0KHRoaXMucmVtYWluVGltZSkpO1xyXG4gICAgfSxcclxuXHJcbiAgICBtdXN0ZXJDb29sQ291bnRUaW1lOiBmdW5jdGlvbiAobGVzc190aW1lKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm11c3Rlcl9idG5fbGFiZWwpIHJldHVyblxyXG4gICAgICAgIHRoaXMucmVtYWluVGltZSA9IGxlc3NfdGltZTtcclxuICAgICAgICB0aGlzLm11c3Rlcl9idG5fbGFiZWwubm9kZS5zdG9wQWxsQWN0aW9ucygpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlbWFpblRpbWUgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXVzdGVySW1hZ2UuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLm11c3Rlcl9idG5fbGFiZWwubm9kZS5ydW5BY3Rpb24oY2MucmVwZWF0Rm9yZXZlcihjYy5zZXF1ZW5jZShjYy5kZWxheVRpbWUoMSksIGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVtYWluVGltZSA9IHNlbGYucmVtYWluVGltZSAtIDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5yZW1haW5UaW1lIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLm11c3RlckltYWdlLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubXVzdGVyX2J0bl90aXBzLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5tdXN0ZXJfYnRuX2xhYmVsLm5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5tdXN0ZXJJbWFnZS5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubXVzdGVyX2J0bl90aXBzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGYubXVzdGVyX2J0bl9sYWJlbC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc1xcbuWQjuWPr+mbhue7k1wiKSwgVGltZVRvb2wuZ2V0VGltZUZvcm1hdChzZWxmLnJlbWFpblRpbWUpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpKSlcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVNdXN0ZXJDb29sVGltZVRpY2tldCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubXVzdGVySW1hZ2UuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubXVzdGVyX2J0bl9sYWJlbC5ub2RlLnN0b3BBbGxBY3Rpb25zKCk7XHJcbiAgICAgICAgICAgIHRoaXMubXVzdGVyX2J0bl90aXBzLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6ZuG57uT5Y+36KeSXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/liIfmjaJCb3Nz55qE5pe25YCZXHJcbiAgICB1cGRhdGVDaGFuZ2VTdGF0dXM6IGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm5cclxuICAgICAgICB2YXIgZmlkID0gMDtcclxuICAgICAgICB2YXIgYmFzZV9pbmZvID0gdGhpcy5tb2RlbC5nZXRCYXNlSW5mbygpO1xyXG4gICAgICAgIHZhciBvYmplY3QgPSB0aGlzLm1vbnN0ZXJfY29udGFpbmVyO1xyXG4gICAgICAgIHZhciBocF9pbmZvID0gbnVsbDtcclxuICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT0gMCkge1xyXG4gICAgICAgICAgICBmaWQgPSBiYXNlX2luZm8uZmlkO1xyXG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvICE9IG51bGwgJiYgYmFzZV9pbmZvLmluZm8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy/lgqjlrZjlrrnlmajph4zpnaLnm7jlhbPnmoRib3Nz5qih5Z6LXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGJhc2VfaW5mby5pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBiYXNlX2luZm8uaW5mb1tpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYm9zc19jb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9ndWlsZGJvc3NfbGlzdFwiLCBbdi5ib3NzX2lkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvc3NfY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmNvbmZpZyA9IGJvc3NfY29uZmlnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHBfaW5mbyA9IHY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYmFzZV9pbmZvLmNvbWJhdF9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBiYXNlX2luZm8uY29tYmF0X2luZm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBiYXNlX2luZm8uY29tYmF0X2luZm9baV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgJiYgb2JqZWN0LmNvbmZpZyAmJiB2LmJvc3NfaWQgPT0gb2JqZWN0LmNvbmZpZy5ib3NzX2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZHBzID0gdi5kcHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5idWZmX2NvbnRhaW5lci5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZpZCA9IGRhdGEuY29uZmlnLmlkO1xyXG4gICAgICAgICAgICBvYmplY3QuY29uZmlnID0gZGF0YS5jb25maWc7XHJcbiAgICAgICAgICAgIGhwX2luZm8gPSB7IGJvc3NfaWQ6IGRhdGEuY29uZmlnLmJvc3NfaWQsIGhwOiAwIH07XHJcbiAgICAgICAgICAgIG9iamVjdC5kcHMgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZmZfY29udGFpbmVyLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlkKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGF0cHRlcl9jb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9jaGFwdGVyX3Jld2FyZFwiLCBbZmlkXSk7XHJcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9ndWlsZGJvc3NfbGlzdFwiLCBbY2hhdHB0ZXJfY29uZmlnLnNob3dfaWRdKTtcclxuICAgICAgICAgICAgaWYgKGNoYXRwdGVyX2NvbmZpZyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXB0ZXJfbmFtZS5zdHJpbmcgPSBjaGF0cHRlcl9jb25maWcuY2hhcHRlcl9uYW1lICsgXCIgXCIgKyBjaGF0cHRlcl9jb25maWcuY2hhcHRlcl9kZXNjO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmcoY29uZmlnLmJnX3Jlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChocF9pbmZvKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTW9uc3RlckhQU3RhdHVzKG9iamVjdCwgaHBfaW5mbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvYmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVNb25zdGVySW5mbyhvYmplY3QpOy8v5pu05paw5qih5Z6LXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRCdG5TdGF0dXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNyZWF0ZVNpbmdsZVJhbmtJdGVtOiBmdW5jdGlvbiAoaSwgZGF0YSkge1xyXG4gICAgICAgIHZhciBjb250YWluZXIgPSB7fVxyXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5yYW5rX2NvbnRhaW5lciwgXCJyYW5rX1wiICsgKE51bWJlcihpKSArIDEpKTtcclxuICAgICAgICB2YXIgbGFiZWwgPSB0aGlzLnNlZWtDaGlsZChub2RlLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnNlZWtDaGlsZChub2RlLCBcInZhbHVlXCIsIGNjLkxhYmVsKTtcclxuICAgICAgICB2YXIgc3AgPSB0aGlzLnNlZWtDaGlsZChub2RlLCBcInNwXCIpO1xyXG4gICAgICAgIGNvbnRhaW5lci5ub2RlID0gbm9kZTtcclxuICAgICAgICBjb250YWluZXIubGFiZWwgPSBsYWJlbDtcclxuICAgICAgICBjb250YWluZXIudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICBjb250YWluZXIuc3AgPSBzcDtcclxuICAgICAgICByZXR1cm4gY29udGFpbmVyXHJcbiAgICB9LFxyXG5cclxuICAgIHJlcXVlc3RNb3B1cE1vbnN0ZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5iYXNlX2luZm8gPT0gbnVsbCkgcmV0dXJuXHJcbiAgICAgICAgdmFyIGJhc2VfaW5mbyA9IHRoaXMuYmFzZV9pbmZvO1xyXG4gICAgICAgIGlmIChiYXNlX2luZm8uY291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBtc2cgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLnoa7lrprmjInnhafkuIrmrKHmjJHmiJjnmoTkvKTlrrPph488Y29sb3I9IzI0OTAwMz4lczwvYz7miavojaHkuIDmrKHlkJfvvJ9cIiksIHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5kcHMpO1xyXG4gICAgICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XHJcbiAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3cobXNnLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RNb3B1cE1vbnN0ZXIodGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0LmNvbmZpZy5ib3NzX2lkKVxyXG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIFV0aWxzLlRJMThOKFwi5Y+W5raIXCIpLCBudWxsLCAyKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBidXlfbmV4dF9udW0gPSBiYXNlX2luZm8uYnV5X2NvdW50ICsgMTtcclxuICAgICAgICAgICAgdmFyIGJ1eV9jb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9idXlfY291bnRcIiwgW2J1eV9uZXh0X251bV0pO1xyXG4gICAgICAgICAgICBpZiAoYnV5X2NvbmZpZyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5b2T5YmN5rKh5pyJ5omr6I2h5qyh5pWw77yM5LiU6LSt5Lmw5qyh5pWw5bey5Yiw6L6+5pys5pel5LiK6ZmQ77yBXCIpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgICAgICAgICAgICAgIGlmIChyb2xlX3ZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVfdm8udmlwX2xldiA8IGJ1eV9jb25maWcudmlwX2xldikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5oyR5oiY5qyh5pWw5LiN6Laz77yM5o+Q5Y2H6IezPGNvbG9yPScjMjg5YjE0Jz52aXAlczwvYz7vvIzlj6/lop7liqA8Y29sb3I9JyMyODliMTQnPjE8L2M+54K55qyh5pWw6LSt5Lmw5LiK6ZmQ77yBXCIpLCBidXlfY29uZmlnLnZpcF9sZXYpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ29tbW9uQWxlcnQgPSByZXF1aXJlKFwiY29tbW9uYWxlcnRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3cobXNnLCBVdGlscy5USTE4TihcIuaIkeimgeaPkOWNh1wiKSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZShcInZpcF9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlblZpcE1haW5XaW5kb3codHJ1ZSwgVklQVEFCQ09OU1QuQ0hBUkdFKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIFV0aWxzLlRJMThOKFwi5Y+W5raIXCIpLCBudWxsLCAyKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3N0ID0gYnV5X2NvbmZpZy5leHBlbmQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3N0ID09IG51bGwgfHwgY29zdC5sZW5ndGggPCAyKSByZXR1cm5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gVXRpbHMuZ2V0SXRlbUNvbmZpZyhjb3N0WzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1fY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNnID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5oyR5oiY5qyh5pWw5LiN6Laz77yM5piv5ZCm6Iqx6LS5IDxpbWcgc3JjPSclcycgc2NhbGU9MC41IC8+ICVzIOi0reS5sDxjb2xvcj0jMjg5YjE0PjE8L2M+54K55oyR5oiY5qyh5pWw5bm25omr6I2h77yfXFxuKOaJq+iNoeagueaNruS4iuasoeeahOS8pOWus+mHjzxjb2xvcj0jMjQ5MDAzPiVzPC9jPui/m+ihjOe7k+eulylcIiksIGl0ZW1fY29uZmlnLmljb24sIGNvc3RbMV0sIHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5kcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0SXRlbVJlcyhpdGVtX2NvbmZpZy5pY29uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIENvbW1vbkFsZXJ0ID0gcmVxdWlyZShcImNvbW1vbmFsZXJ0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uQWxlcnQuc2hvdyhtc2csIFV0aWxzLlRJMThOKFwi56Gu5a6aXCIpLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RNb3B1cE1vbnN0ZXIodGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0LmNvbmZpZy5ib3NzX2lkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIDIsIG51bGwsIHsgcmVzQXJyOiBbcmVzXSB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8v5Z+656GA5L+h5oGv77yM5pyN5Yqh56uv6KaB5rGC5rKh5qyh5omT5byA6Z2i5p2/55qE5pe25YCZ6YO96K+35rGC5LiA5LiLXHJcbiAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RHdWlsZER1bkJhc2VJbmZvKCk7XHJcbiAgICAgICAgQWN0aXZpdHlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0Rmlyc3RDb21lR3VpbGQoZmFsc2UpXHJcbiAgICAgICAgLy/orr7nva7liJ3lp4vnuqLngrlcclxuICAgICAgICB0aGlzLnVwZGF0ZVNvbWVSZWRTdGF0dXMoKTtcclxuICAgICAgICBpZiAoQWN0aXZpdHlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Qm9zc0FjdGl2aXR5RG91YmxlVGltZSgpID09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZG91YmxlUmV3YXJkLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+iuvue9rmJ1ZmblgJLorqHml7ZcclxuICAgIHVwZGF0ZUJ1ZmZUaW1lOiBmdW5jdGlvbiAodGltZSkge1xyXG4gICAgICAgIGlmICh0aW1lICYmIHRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5idWZmX3NlY29uZCA9IHRpbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZfc2Vjb25kIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJCdWZmVGltZVRpY2tldCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVmZl90aW1lX3RpY2tldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmX3RpbWVfdGlja2V0ID0gZ2NvcmUuVGltZXIuc2V0KChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQnVmZlRpbWVUaWNrZXQoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcyksIDEwMDAsIC0xKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgY2xlYXJCdWZmVGltZVRpY2tldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmJ1ZmZfdGltZV90aWNrZXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5idWZmX3RpbWVfdGlja2V0KTtcclxuICAgICAgICAgICAgdGhpcy5idWZmX3RpbWVfdGlja2V0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHVwZGF0ZUJ1ZmZUaW1lVGlja2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5idWZmX3NlY29uZCA9IHRoaXMuYnVmZl9zZWNvbmQgLSAxO1xyXG4gICAgICAgIGlmICh0aGlzLmJ1ZmZfc2Vjb25kIDw9IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhckJ1ZmZUaW1lVGlja2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYnVmZl9hY2l0aXZlX2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxjb2xvcj0jMzVmZjE0Piglc+WQjuWkseaViCk8L2M+XCIpLCBUaW1lVG9vbC5nZXRUaW1lRm9ybWF0KHRoaXMuYnVmZl9zZWNvbmQpKTtcclxuICAgIH0sXHJcblxyXG4gICAgLy/mjJHmiJjotK3kubDmrKHmlbDnmoTml7blgJnoh6rliqjmiZPlvIDpnaLmnb9cclxuICAgIGF1dG9PcGVuQ2hhbGxlbmdlV2luZG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdCAmJiB0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuY29uZmlnICYmIHRoaXMuYmFzZV9pbmZvKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhc2VfaW5mby5jb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkZvcm1Hb0ZpZ2h0UGFuZWwodHJ1ZSwgUGFydG5lckNvbnN0LkZ1bl9Gb3JtLkd1aWxkRHVuX0FELCB7IGJvc3NfaWQ6IHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5jb25maWcuYm9zc19pZCB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+WNj+iurui/lOWbnueUqOS6juabtOaWsOWfuuehgOS/oeaBr1xyXG4gICAgdXBkYXRlRHVuQmFzZUluZm86IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmJhc2VfaW5mbyA9IHRoaXMubW9kZWwuZ2V0QmFzZUluZm8oKTtcclxuICAgICAgICB2YXIgYmFzZV9pbmZvID0gdGhpcy5iYXNlX2luZm87XHJcbiAgICAgICAgaWYgKGJhc2VfaW5mbyAhPSBudWxsICYmIGJhc2VfaW5mby5pbmZvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1haW5CdXlDb3VudChiYXNlX2luZm8uYnV5X2NvdW50KTtcclxuICAgICAgICAgICAgLy/lgqjlrZjlrrnlmajph4zpnaLnm7jlhbPnmoRib3Nz5qih5Z6LXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gYmFzZV9pbmZvLmluZm8pIHtcclxuICAgICAgICAgICAgICAgIHZhciB2ID0gYmFzZV9pbmZvLmluZm9baV07XHJcbiAgICAgICAgICAgICAgICB2YXIgYm9zc19jb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9ndWlsZGJvc3NfbGlzdFwiLCBbdi5ib3NzX2lkXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9zc19jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5tb25zdGVyX2NvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmNvbmZpZyA9IGJvc3NfY29uZmlnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL+abtOaWsOihgOmHj1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vbnN0ZXJIUFN0YXR1cyhvYmplY3QsIHYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL+WtmOWCqGRwc1xyXG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvLmNvbWJhdF9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuYmFzZV9pbmZvLmNvbWJhdF9pbmZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmJhc2VfaW5mby5jb21iYXRfaW5mb1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tb25zdGVyX2NvbnRhaW5lciAmJiB0aGlzLm1vbnN0ZXJfY29udGFpbmVyLmNvbmZpZyAmJiB2LmJvc3NfaWQgPT0gdGhpcy5tb25zdGVyX2NvbnRhaW5lci5jb25maWcuYm9zc19pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnN0ZXJfY29udGFpbmVyLmRwcyA9IHYuZHBzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/orr7nva7ln7rnoYDkv6Hmga/mmL7npLpcclxuICAgICAgICAgICAgdGhpcy5jaGFsbGVuZ2VfdGltZXNfdmFsdWUuc3RyaW5nID0gYmFzZV9pbmZvLmNvdW50O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfZmlkICE9IGJhc2VfaW5mby5maWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VyX2ZpZCA9IGJhc2VfaW5mby5maWQ7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hhdHB0ZXJfY29uZmlnID0gZ2RhdGEoXCJndWlsZF9kdW5fZGF0YVwiLCBcImRhdGFfY2hhcHRlcl9yZXdhcmRcIiwgW2Jhc2VfaW5mby5maWRdKTtcclxuICAgICAgICAgICAgICAgIGlmIChjaGF0cHRlcl9jb25maWcgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vbnN0ZXJfY29udGFpbmVyICYmIHRoaXMubW9uc3Rlcl9jb250YWluZXIuYm9zc19pY29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9ndWlsZGJvc3NfbGlzdFwiLCBbY2hhdHB0ZXJfY29uZmlnLnNob3dfaWRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb25zdGVyX2NvbnRhaW5lci5ib3NzX2ljb24uc2V0SGVhZFJlcyhjb25maWcuaGVhZF9pY29uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQmcoY29uZmlnLmJnX3Jlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFwdGVyX25hbWUuc3RyaW5nID0gY2hhdHB0ZXJfY29uZmlnLmNoYXB0ZXJfbmFtZSArIFwiIFwiICsgY2hhdHB0ZXJfY29uZmlnLmNoYXB0ZXJfZGVzYztcclxuICAgICAgICAgICAgICAgICAgICAvL+i/memHjOiuvue9ruaMkeaImOWlluWKseWQp1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsbFJld2FyZHNJdGVtcyhjaGF0cHRlcl9jb25maWcuZHBzX2F3cmFyZCwgY2hhdHB0ZXJfY29uZmlnLmF3YXJkLCBjaGF0cHRlcl9jb25maWcuZ3VpbGRfZXhwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/lu7bov5/liJvlu7rmqKHlnotcclxuICAgICAgICAgICAgZ2NvcmUuVGltZXIuc2V0KChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vbnN0ZXJJbmZvKHRoaXMubW9uc3Rlcl9jb250YWluZXIpO1xyXG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpLCA4IC8gNjAsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjZXRNb25zdGVyQ29udGFpbmVyKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvICE9IG51bGwgJiYgYmFzZV9pbmZvLmJ1ZmZfZW5kX3RpbWUgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZfY29uZmlnID0gZ2RhdGEoXCJndWlsZF9kdW5fZGF0YVwiLCBcImRhdGFfYnVmZl9kYXRhXCIsIFtiYXNlX2luZm8uYnVmZl9sZXZdKTtcclxuICAgICAgICAgICAgICAgIGlmIChidWZmX2NvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9uYW1lLnN0cmluZyA9IGJ1ZmZfY29uZmlnLmRlc2M7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5idWZmX2FjaXRpdmVfbGFiZWwubm9kZS54ID0gdGhpcy5idWZmX25hbWUubm9kZS53aWR0aCArIHRoaXMuYnVmZl9uYW1lLm5vZGUueCArIDEwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmX2ljb24uc2V0U3RhdGUoY2MuU3ByaXRlLlN0YXRlLk5PUk1BTCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbmFtZS5ub2RlLmNvbG9yID0gbmV3IGNjLkNvbG9yKDEzNywgMjM3LCAyNTUsIDI1NSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1ZmZUaW1lKGJhc2VfaW5mby5idWZmX2VuZF90aW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9jb250YWluZXIuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9pY29uLnNldFN0YXRlKGNjLlNwcml0ZS5TdGF0ZS5HUkFZKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmX25hbWUubm9kZS5jb2xvciA9IG5ldyBjYy5Db2xvcihjYy5Db2xvci5XSElURSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfbmFtZS5zdHJpbmcgPSBnZGF0YShcImd1aWxkX2R1bl9kYXRhXCIsIFwiZGF0YV9jb25zdFwiLCBbXCJkZXNfbm9idWZmXCJdKS5kZXNjO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5idWZmX2FjaXRpdmVfbGFiZWwubm9kZS54ID0gdGhpcy5idWZmX25hbWUubm9kZS53aWR0aCArIHRoaXMuYnVmZl9uYW1lLm5vZGUueCArIDEwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idWZmX2FjaXRpdmVfbGFiZWwuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCI8Y29sb3I9I2ZmNTg1OD4o5pyq5r+A5rS7KTwvYz5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5Ymp5L2Z6LSt5Lmw5qyh5pWwXHJcbiAgICByZW1haW5CdXlDb3VudDogZnVuY3Rpb24gKGNvdW50KSB7XHJcbiAgICAgICAgY291bnQgPSBjb3VudCB8fCAwO1xyXG4gICAgICAgIHZhciBudW0gPSAwO1xyXG4gICAgICAgIHZhciBsZW5ndGggPSBDb25maWcuZ3VpbGRfZHVuX2RhdGEuZGF0YV9idXlfY291bnRfbGVuZ3RoO1xyXG4gICAgICAgIHZhciBidXlfY29uZmlnID0gQ29uZmlnLmd1aWxkX2R1bl9kYXRhLmRhdGFfYnV5X2NvdW50W2xlbmd0aF07XHJcbiAgICAgICAgaWYgKGJ1eV9jb25maWcpIHtcclxuICAgICAgICAgICAgbnVtID0gYnV5X2NvbmZpZy5jb3VudCAtIGNvdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlbWFpbl9idXlfbGIuc3RyaW5nID0gbnVtO1xyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVCZzogZnVuY3Rpb24gKGltYWdlKSB7XHJcbiAgICAgICAgdmFyIHJlc19pZCA9IFBhdGhUb29sLmdldEJpZ0JnKGltYWdlLCBudWxsLCBcImd1aWxkYm9zc1wiKTtcclxuICAgICAgICBpZiAodGhpcy5yZXNfaWQgIT0gcmVzX2lkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzX2lkID0gcmVzX2lkO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRSZXModGhpcy5yZXNfaWQsIGZ1bmN0aW9uIChzZl9vYmopIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmcuc3ByaXRlRnJhbWUgPSBzZl9vYmo7XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5Yib5bu65qih5Z6LLOagueaNrmNvbmZpZ1xyXG4gICAgdXBkYXRlTW9uc3RlckluZm86IGZ1bmN0aW9uIChvYmplY3QpIHtcclxuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmNvbmZpZyA9PSBudWxsKSByZXR1cm5cclxuICAgICAgICB2YXIgY29uZmlnID0gb2JqZWN0LmNvbmZpZztcclxuICAgICAgICAvL+aAqueJqeaooeWei+aWuemdou+8jOWPquaciWlk5LiN5ZCM5omN5YGa5aSE55CGXHJcbiAgICAgICAgaWYgKG9iamVjdC5ib3NzX2lkICE9IGNvbmZpZy5ib3NzX2lkKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5ib3NzX2lkID0gY29uZmlnLmJvc3NfaWQ7XHJcbiAgICAgICAgICAgIG9iamVjdC5tb25zdGVyX25hbWUuc3RyaW5nID0gY29uZmlnLml0ZW1fbmFtZTtcclxuICAgICAgICAgICAgLy/muIXpmaTmjonkuYvliY3nmoTmqKHlnotcclxuICAgICAgICAgICAgaWYgKG9iamVjdC5zcGluZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0LnNwaW5lLmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBvYmplY3Quc3BpbmUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgb2JqZWN0LnNwaW5lLnNldERhdGEoQmFzZVJvbGUudHlwZS51bml0LCBjb25maWcuY29tYmF0X2lkLCBQbGF5ZXJBY3Rpb24uc2hvdywgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3Quc3BpbmUgPSBuZXcgQmFzZVJvbGUoKTtcclxuICAgICAgICAgICAgICAgIG9iamVjdC5zcGluZS5zZXRQYXJlbnQob2JqZWN0Lm1vZGVsKTtcclxuICAgICAgICAgICAgICAgIG9iamVjdC5zcGluZS5zZXREYXRhKEJhc2VSb2xlLnR5cGUudW5pdCwgY29uZmlnLmNvbWJhdF9pZCwgUGxheWVyQWN0aW9uLnNob3csIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+mAieS4reaMh+WumueahOaAqueJqeiKgueCuVxyXG4gICAgc2VsZWNldE1vbnN0ZXJDb250YWluZXI6IGZ1bmN0aW9uICh0eXBlKSB7XHJcbiAgICAgICAgdGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0ID0gdGhpcy5tb25zdGVyX2NvbnRhaW5lcjtcclxuICAgICAgICAvLyB2YXIgcHJvdG9jYWwgPSB7XHJcbiAgICAgICAgLy8gICAgIGJvc3NfaWQ6IHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5jb25maWcuYm9zc19pZCxcclxuICAgICAgICAvLyAgICAgc3RhcnRfbnVtOiAxLFxyXG4gICAgICAgIC8vICAgICBlbmRfbnVtOiAzXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMuY3RybC5yZXF1ZXN0R3VpbGREdW5SYW5rKEd1aWxkQm9zc0NvbnN0LnJhbmsucm9sZSwgcHJvdG9jYWwpXHJcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEJ0blN0YXR1cygpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvL+abtOaWsOmAieS4reWvueixoeeahOaMiemSrueKtuaAgVxyXG4gICAgdXBkYXRlU2VsZWN0ZWRCdG5TdGF0dXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJfc2VsZWN0ZWRfb2JqZWN0ID09IG51bGwpIHJldHVyblxyXG4gICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuaHAgPT0gbnVsbCB8fCB0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuZHBzID09IG51bGwpIHJldHVyblxyXG4gICAgICAgIGlmICh0aGlzLmN1cl9zZWxlY3RlZF9vYmplY3QuaHAgPT0gMCkgeyAvL+W3sue7j+iiq+WHu+adgOS6hlxyXG4gICAgICAgICAgICBVdGlscy5zZXRHcmV5QnV0dG9uKHRoaXMuY2hhbGxlbmdlX2J0biwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIFV0aWxzLnNldEdyZXlCdXR0b24odGhpcy5tb3B1cF9idG4sIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG5fbG8uZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm1vcHVwX2J0bl9sby5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3NlbGVjdGVkX29iamVjdC5kcHMgPT0gMCkgeyAgICAvL+ayoeacieaMkeaImOi/h++8jOS4jeWPr+S7peaJq+iNoVxyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLm1vcHVwX2J0biwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBVdGlscy5zZXRHcmV5QnV0dG9uKHRoaXMuY2hhbGxlbmdlX2J0biwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFsbGVuZ2VfYnRuX2xvLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3B1cF9idG5fbG8uZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0R3JleUJ1dHRvbih0aGlzLmNoYWxsZW5nZV9idG4sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIFV0aWxzLnNldEdyZXlCdXR0b24odGhpcy5tb3B1cF9idG4sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbGxlbmdlX2J0bl9sby5lbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9wdXBfYnRuX2xvLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+abtOaWsOihgOadoVxyXG4gICAgdXBkYXRlTW9uc3RlckhQU3RhdHVzOiBmdW5jdGlvbiAob2JqZWN0LCBpbmZvKSB7XHJcbiAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsIHx8IGluZm8gPT0gbnVsbCB8fCBvYmplY3QuY29uZmlnID09IG51bGwpIHJldHVyblxyXG4gICAgICAgIGlmIChpbmZvLmhwIDw9IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kb3VibGVUaW1lQWN0aW9uKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoQWN0aXZpdHlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Qm9zc0FjdGl2aXR5RG91YmxlVGltZSgpID09IHRydWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZVRpbWVBY3Rpb24odHJ1ZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/orr7nva7ooYDph49cclxuICAgICAgICB2YXIgY29uZmlnID0gb2JqZWN0LmNvbmZpZztcclxuICAgICAgICB2YXIgcGVyY2VudCA9IE1hdGguY2VpbCgxMDAgKiBpbmZvLmhwIC8gY29uZmlnLmhwKTtcclxuICAgICAgICBvYmplY3QuaHBfdmFsdWUuc3RyaW5nID0gcGVyY2VudCArIFwiJVwiO1xyXG4gICAgICAgIG9iamVjdC5wcm9ncmVzcy5wcm9ncmVzcyA9IHBlcmNlbnQgLyAxMDA7XHJcbiAgICAgICAgb2JqZWN0LmhwID0gaW5mby5ocDtcclxuICAgICAgICBvYmplY3QucGFzc19pY29uLmFjdGl2ZSA9IGluZm8uaHAgPT0gMDtcclxuICAgICAgICBvYmplY3QuYm9zc19pY29uLnNldFZpc2libGUoaW5mby5ocCAhPSAwKTtcclxuICAgICAgICBvYmplY3QubW9uc3Rlcl9uYW1lLm5vZGUuYWN0aXZlID0gaW5mby5ocCAhPSAwO1xyXG4gICAgICAgIG9iamVjdC5wcm9ncmVzc19jb250YWluZXIuYWN0aXZlID0gaW5mby5ocCAhPSAwO1xyXG4gICAgfSxcclxuXHJcbiAgICBkb3VibGVUaW1lQWN0aW9uOiBmdW5jdGlvbiAoYm9vbCkge1xyXG4gICAgICAgIGlmIChib29sID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvdWJsZVJld2FyZC5zdG9wQWxsQWN0aW9ucygpO1xyXG4gICAgICAgICAgICBpZiAoVXRpbHMubmV4dCh0aGlzLl9kb3VibGVSZXdhcmRMaXN0KSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuX2RvdWJsZVJld2FyZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5fZG91YmxlUmV3YXJkW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHYuc2V0U3BlY2lhbENvbG9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdi5zZXRTcGVjaWFsTnVtKHRoaXMuX2N1cnJlbnRQYXNzTnVtW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB2LnNldERvdWJsZUljb24oZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RvdWJsZVJld2FyZC5hY3RpdmUgPSBib29sO1xyXG4gICAgICAgIHZhciBzZXEgPSBjYy5zZXF1ZW5jZShjYy5mYWRlT3V0KDEuMCksIGNjLmZhZGVJbigxLjApLCBjYy5kZWxheVRpbWUoMC4zKSk7XHJcbiAgICAgICAgdGhpcy5fZG91YmxlUmV3YXJkLnJ1bkFjdGlvbihjYy5yZXBlYXRGb3JldmVyKHNlcSkpO1xyXG5cclxuICAgICAgICBpZiAoVXRpbHMubmV4dCh0aGlzLl9kb3VibGVSZXdhcmRMaXN0KSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fZG91YmxlUmV3YXJkTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLl9kb3VibGVSZXdhcmRMaXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgLy8gdi5zZXRTcGVjaWFsQ29sb3IodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2LnNldFNwZWNpYWxOdW0odGhpcy5fZG91YmxlUGFzc051bVtpXSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2LnNldERvdWJsZUljb24odHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8v6K6+572u54mp5ZOB5aWW5YqxXHJcbiAgICAvL2Rwc19hd2FyZDrkvKTlrrPlpZblirHliJfooahcclxuICAgIC8vZml4ZWRfYXdhcmQ65Zu65a6a5aWW5Yqx5YiX6KGoXHJcbiAgICAvL2d1aWxkX2F3YXJkOuWFrOS8mui0oeeMrueJueauilxyXG4gICAgdXBkYXRlRmlsbFJld2FyZHNJdGVtczogZnVuY3Rpb24gKGRwc19hd2FyZCwgZml4ZWRfYXdhcmQsIGd1aWxkX2F3YXJkKSB7XHJcbiAgICAgICAgZHBzX2F3YXJkID0gZHBzX2F3YXJkIHx8IHt9O1xyXG4gICAgICAgIF9maXhlZF9hd2FyZCA9IGZpeGVkX2F3YXJkIHx8IFtdO1xyXG4gICAgICAgIHZhciBfZml4ZWRfYXdhcmQgPSBVdGlscy5kZWVwQ29weShmaXhlZF9hd2FyZCk7XHJcbiAgICAgICAgZ3VpbGRfYXdhcmQgPSBndWlsZF9hd2FyZCB8fCAwO1xyXG4gICAgICAgIF9maXhlZF9hd2FyZC5wdXNoKFtnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfYXNzZXRzX2xhYmVsMmlkXCIsIFwiZ3VpbGRfZXhwXCIpLCBndWlsZF9hd2FyZF0pO1xyXG4gICAgICAgIC8vIGZvciAodmFyIGkgaW4gdGhpcy5pdGVtX2xpc3QpIHtcclxuICAgICAgICAvLyAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1fbGlzdFtpXTtcclxuICAgICAgICAvLyAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5pdGVtX3Bvb2wucHVzaChpdGVtKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy5pdGVtX2xpc3QgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0XzEpIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1fbGlzdF8xW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0XzIpIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1fbGlzdF8yW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGl0ZW1fY29uZmlnID0gbnVsbDtcclxuICAgICAgICB2YXIgaW5kZXggPSAxO1xyXG4gICAgICAgIC8vIHZhciBiYWNrcGFja19pdGVtID0gbnVsbDtcclxuICAgICAgICB2YXIgX3ggPSAwO1xyXG4gICAgICAgIHZhciBfeSA9IC0zMzk7XHJcbiAgICAgICAgdmFyIHNjYWxlID0gMC44O1xyXG4gICAgICAgIHZhciBkZXNjID0gbnVsbDtcclxuICAgICAgICAvL+iuvue9ruS8pOWus+WlluWKsVxyXG4gICAgICAgIGZvciAodmFyIGkgaW4gZHBzX2F3YXJkKSB7XHJcbiAgICAgICAgICAgIHZhciB2ID0gZHBzX2F3YXJkW2ldO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtX2xpc3RfMVtpbmRleF0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFja3BhY2tfaXRlbSA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xyXG4gICAgICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5pbml0Q29uZmlnKGZhbHNlLCBzY2FsZSwgZmFsc2UsIHRydWUpXHJcbiAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtLnNldFBhcmVudCh0aGlzLm1haW5fcGFuZWwpO1xyXG4gICAgICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fbGlzdF8xW2luZGV4XSA9IGJhY2twYWNrX2l0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGJhY2twYWNrX2l0ZW0gPSB0aGlzLml0ZW1fbGlzdF8xW2luZGV4XVxyXG4gICAgICAgICAgICAvLyBiYWNrcGFja19pdGVtID0gdGhpcy5pdGVtX3Bvb2wuc2hpZnQoKTtcclxuICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5zZXRWaXNpYmxlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgX3ggPSAxMDAgKyAoaW5kZXggLSAxKSAqIChCYWNrUGFja0l0ZW0uV2lkdGggKiBzY2FsZSArIDE0KSArIEJhY2tQYWNrSXRlbS5XaWR0aCAqIHNjYWxlICogMC41IC0gMzM1O1xyXG4gICAgICAgICAgICAvLyBiYWNrcGFja19pdGVtLnNldERlZmF1bHRUaXAoKTtcclxuXHJcbiAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0UG9zaXRpb24oX3gsIF95KTtcclxuICAgICAgICAgICAgYmFja3BhY2tfaXRlbS5zZXREYXRhKHsgYmlkOiB2WzBdLCBudW06IHZbMV0gfSk7XHJcbiAgICAgICAgICAgIGlmICh2WzFdID49IDEwMDApIHtcclxuICAgICAgICAgICAgICAgIGRlc2MgPSBjYy5qcy5mb3JtYXRTdHIoXCIlc0tcIiwgTWF0aC5mbG9vcih2WzFdICogMC4wMDEpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRlc2MgPSB2WzFdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2WzJdKSB7XHJcbiAgICAgICAgICAgICAgICBkZXNjID0gZGVzYztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBiYWNrcGFja19pdGVtLnNldFNwZWNpYWxOdW0oZGVzYyk7XHJcbiAgICAgICAgICAgIC8vIGJhY2twYWNrX2l0ZW0uc2V0U3BlY2lhbENvbG9yKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRQYXNzTnVtW2ldID0gZGVzYztcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fZG91YmxlUmV3YXJkTGlzdFtpXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZG91YmxlUmV3YXJkTGlzdFtpXSA9IGJhY2twYWNrX2l0ZW07XHJcbiAgICAgICAgICAgICAgICB2YXIgZG91YmxlRGVzYyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodlsxXSAqIDIgPj0gMTAwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvdWJsZURlc2MgPSBjYy5qcy5mb3JtYXRTdHIoXCIlc0tcIiwgTWF0aC5mbG9vcih2WzFdICogMiAqIDAuMDAxKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRvdWJsZURlc2MgPSB2WzFdICogMjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh2WzJdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG91YmxlRGVzYyA9IGRvdWJsZURlc2M7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kb3VibGVQYXNzTnVtW2ldID0gZG91YmxlRGVzYztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB0aGlzLml0ZW1fbGlzdC5wdXNoKGJhY2twYWNrX2l0ZW0pO1xyXG4gICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFjdGl2aXR5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldEJvc3NBY3Rpdml0eURvdWJsZVRpbWUoKSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZG91YmxlVGltZUFjdGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/orr7nva7lh7vmnYDlpZblirFcclxuICAgICAgICBpbmRleCA9IDE7XHJcbiAgICAgICAgLy8gYmFja3BhY2tfaXRlbSA9IG51bGw7XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiBfZml4ZWRfYXdhcmQpIHtcclxuICAgICAgICAgICAgdmFyIHYgPSBfZml4ZWRfYXdhcmRbaV07XHJcbiAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgQXJyYXkgJiYgdlswXSAmJiB2WzFdKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtX2xpc3RfMltpbmRleF0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhY2twYWNrX2l0ZW0gPSBJdGVtc1Bvb2wuZ2V0SW5zdGFuY2UoKS5nZXRJdGVtKFwiYmFja3BhY2tfaXRlbVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtLmluaXRDb25maWcoZmFsc2UsIHNjYWxlLCBmYWxzZSwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICBiYWNrcGFja19pdGVtLnNldFBhcmVudCh0aGlzLm1haW5fcGFuZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0XzJbaW5kZXhdID0gYmFja3BhY2tfaXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciBiYWNrcGFja19pdGVtID0gdGhpcy5pdGVtX2xpc3RfMltpbmRleF07XHJcbiAgICAgICAgICAgICAgICAvLyBiYWNrcGFja19pdGVtID0gdGhpcy5pdGVtX3Bvb2wuc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0VmlzaWJsZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfeCA9IDEwMCArIChpbmRleCAtIDEpICogKEJhY2tQYWNrSXRlbS5XaWR0aCAqIHNjYWxlICsgMTQpICsgQmFja1BhY2tJdGVtLldpZHRoICogc2NhbGUgKiAwLjUgLSAyMztcclxuICAgICAgICAgICAgICAgIC8vIGJhY2twYWNrX2l0ZW0uc2V0RGVmYXVsdFRpcCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0UG9zaXRpb24oX3gsIF95KTtcclxuICAgICAgICAgICAgICAgIGJhY2twYWNrX2l0ZW0uc2V0RGF0YSh7IGJpZDogdlswXSwgbnVtOiB2WzFdIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3QucHVzaChiYWNrcGFja19pdGVtKTtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+abtOaWsOe6oueCuVxyXG4gICAgdXBkYXRlU29tZVJlZFN0YXR1czogZnVuY3Rpb24gKHR5cGUsIHN0YXR1cykge1xyXG5cclxuICAgIH0sXHJcblxyXG4gICAgZ2V0VHlwZTogZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgaWYgKGluZGV4ID09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEd1aWxkQm9zc0NvbnN0LnR5cGUucGh5c2ljcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRCb3NzQ29uc3QudHlwZS5tYWdpYztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuXHJcbiAgICBjbG9zZUNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYm9zc19pY29uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYm9zc19pY29uLmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYm9zc19pY29uID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RvdWJsZVJld2FyZExpc3QpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl9kb3VibGVSZXdhcmRMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuX2RvdWJsZVJld2FyZExpc3RbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAodi5kZWxldGVNZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHYuZGVsZXRlTWUoKTtcclxuICAgICAgICAgICAgICAgICAgICB2ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9kb3VibGVSZXdhcmRMaXN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHRoaXMuY2xlYXJUaW1lVGlja2V0KCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckJ1ZmZUaW1lVGlja2V0KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vbnN0ZXJfbGlzdCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMubW9uc3Rlcl9saXN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMubW9uc3Rlcl9saXN0W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHYuc3BpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2LnNwaW5lLmRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdi5zcGluZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tb25zdGVyX2xpc3QgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuaXRlbV9saXN0KSB7XHJcbiAgICAgICAgLy8gICAgIGZvciAodmFyIGkgaW4gdGhpcy5pdGVtX2xpc3QpIHtcclxuICAgICAgICAvLyAgICAgICAgIHZhciB2ID0gdGhpcy5pdGVtX2xpc3RbaV07XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodi5kZWxldGVNZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHYuZGVsZXRlTWUoKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB2ID0gbnVsbDtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vICAgICB0aGlzLml0ZW1fbGlzdCA9IG51bGw7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGZvciAodmFyIGkgaW4gdGhpcy5pdGVtX3Bvb2wpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5pdGVtX3Bvb2xbaV0uZGVsZXRlTWUoKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5pdGVtX3Bvb2xbaV0gPSBudWxsO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyB0aGlzLml0ZW1fcG9vbCA9IG51bGw7XHJcblxyXG5cclxuICAgICAgICBpZiAodGhpcy5pdGVtX2xpc3RfMikge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0XzIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1fbGlzdF8yW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3RfMltpXS5kZWxldGVNZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0XzJbaV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0XzIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiAodGhpcy5pdGVtX2xpc3RfMSkge1xyXG4gICAgICAgIC8vICAgICBmb3IgKHZhciBpIGluIHRoaXMuaXRlbV9saXN0XzEpIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLml0ZW1fbGlzdF8xW2ldKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5pdGVtX2xpc3RfMVtpXS5kZWxldGVNZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaXRlbV9saXN0XzFbaV0gPSBudWxsO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIHRoaXMuaXRlbV9saXN0XzEgPSBudWxsO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgdGhpcy5tdXN0ZXJfYnRuX2xhYmVsLm5vZGUuc3RvcEFsbEFjdGlvbnMoKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5ndWlsZF9ib3NzX3ZpZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5ndWlsZF9ib3NzX3ZpZXcuZGVsZXRlTWUoKTtcclxuICAgICAgICAgICAgdGhpcy5ndWlsZF9ib3NzX3ZpZXcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucm9sZV92byAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZV92by51bmJpbmQodGhpcy5yb2xlX2Fzc2V0c19ldmVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJvbGVfdm8gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWluV2luZG93KGZhbHNlKVxyXG4gICAgfVxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEd1aWxkQm9zc01haW5XaW5kb3c7Il19
|