(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/heroexpedit/view/heroexpedit_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, '93d9aNnNEhEVpVXXZpmV+Mk', 'heroexpedit_window'); // Scripts/mod/heroexpedit/view/heroexpedit_window.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里是描述这个窗体的作用的 //
Create: 2019-03-11 14:16:46 // -------------------------------------------------------------------- var PathTool = require("pathtool"); var MallController = require("mall_controller"); var MallConst = require("mall_const"); var HeroExpeditEvent = require("heroexpedit_event"); var HeroexpeditWindow = cc.Class({ "extends": BaseView, ctor: function ctor() { this.prefabPath = PathTool.getPrefabPath("heroexpedit", "hero_expedit_window"); this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意 this.win_type = WinType.Full; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips this.ctrl = arguments[0]; this.model = this.ctrl.getModel(); }, // 初始化一些配置数据,可以用于声明一些变量之类的 initConfig: function initConfig() { this.map_center = 360; //地图移动的中心点 this.sign_info = Config.expedition_data.data_sign_info; this.point_num = Config.expedition_data.data_sign_info_length; //个数(宝箱和点) this.box_num = 5; //宝箱个数 this.box_index = 0; this.box_list = {}; //宝箱 this.point_list = {}; //点 this.facial_list = {}; //表情包 this.point_img_list = {}; //点图片 this.play_effect = {}; this.mouseDown = false; //添加变量判断用户当前鼠标是不是处于按下状态 }, // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件 openCallBack: function openCallBack() { this.main_container = this.root_wnd.getChildByName("main_container"); this.bigBg = this.root_wnd.getChildByName("bigBg"); this.bigBg.scale = FIT_SCALE; this.expedit_bg = this.bigBg.getChildByName("bg"); this.expedit_bg_sp = this.bigBg.getChildByName("bg").getComponent(cc.Sprite); this.close_btn = this.main_container.getChildByName("btn_return"); this.map_layer = this.bigBg.getChildByName("map_layer"); this.btn_employ = this.main_container.getChildByName("btn_employ"); var text_1 = this.btn_employ.getChildByName("Text_1").getComponent(cc.Label); text_1.string = Utils.TI18N("好友助阵"); this.btn_shop = this.main_container.getChildByName("btn_shop"); var text_1_0 = this.btn_shop.getChildByName("Text_1_0").getComponent(cc.Label); text_1_0.string = Utils.TI18N("远征商店"); this.btn_rule = this.main_container.getChildByName("btn_rule"); this.get_reward_bg = this.main_container.getChildByName("get_reward_bg"); var text_2 = this.get_reward_bg.getChildByName("Image_2").getChildByName("Text_2").getComponent(cc.Label); text_2.string = Utils.TI18N("今日已获取奖励:"); this.expedit_img_1 = this.get_reward_bg.getChildByName("expedit_img_1").getComponent(cc.Sprite); this.expedit_img_2 = this.get_reward_bg.getChildByName("expedit_img_2").getComponent(cc.Sprite); this.expedit_reward = []; var pos = [72, 33]; for (var i = 0; i < 2; i++) { this.expedit_reward[i] = Utils.createRichLabel(24, new cc.Color(0xff, 0xf6, 0xc7, 0xff), cc.v2(0, 0.5), cc.v2(0, 0), 30, 250); this.expedit_reward[i].horizontalAlign = cc.macro.TextAlignment.LEFT; this.get_reward_bg.addChild(this.expedit_reward[i].node); this.expedit_reward[i].node.setPosition(60, pos[i]); } }, // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent registerEvent: function registerEvent() { // 我的支援成功返回 this.addGlobalEvent(HeroExpeditEvent.HeroExpeditViewEvent, function (data) { if (!data) return; for (var i in data.rewards) { var item_config = Utils.getItemConfig(data.rewards[i].bid); var res = PathTool.getItemRes(item_config.icon); var str = cc.js.formatStr("%d", data.rewards[i].num); this.expedit_reward[i].string = str; if (i == 0 && this.expedit_img_1) { this.loadRes(res, function (sf_obj) { this.expedit_img_1.spriteFrame = sf_obj; }.bind(this)); } else if (i == 1 && this.expedit_img_2) { this.loadRes(res, function (sf_obj) { this.expedit_img_2.spriteFrame = sf_obj; }.bind(this)); } } if (this.point_list[data.guard_id]) { this.point_img_list[data.guard_id].setState(cc.Sprite.State.NORMAL); var num = data.guard_id; var box = this.model.getExpeditBoxData(); var status = false; // 胜利关卡的下一关是否是宝箱的位置 for (var j in box) { if (box[j] == data.guard_id - 1) { status = true; break; } } if (status == true) { num = num - 2; } else { num = num - 1; } if (num <= 0) { num = 1; } if (!this.facial_list[data.guard_id]) { this.point_list[data.guard_id].setContentSize(cc.size(38, 100)); this.facial_list[data.guard_id] = Utils.createImage(this.point_list[data.guard_id], null, -19, 40, cc.v2(0, 0), false); var res = PathTool.getUIIconPath("heroexpedit", "heroexpedit_8"); this.loadRes(res, function (sf_obj) { this.facial_list[data.guard_id].spriteFrame = sf_obj; }.bind(this)); } else { var res = PathTool.getUIIconPath("heroexpedit", "heroexpedit_8"); this.loadRes(res, function (sf_obj) { this.facial_list[data.guard_id].spriteFrame = sf_obj; }.bind(this)); } if (this.facial_list[num]) { var res = PathTool.getUIIconPath("heroexpedit", "heroexpedit_7"); this.loadRes(res, function (sf_obj) { this.facial_list[num].spriteFrame = sf_obj; }.bind(this)); } // 最后一关时 if (data.guard_id == this.point_num - 1) { var res = PathTool.getUIIconPath("heroexpedit", "heroexpedit_8"); this.loadRes(res, function (sf_obj) { this.facial_list[data.guard_id].spriteFrame = sf_obj; }.bind(this)); } } if (data.guard_id > this.point_num) { if (this.facial_list[this.point_num - 1]) { var res = PathTool.getUIIconPath("heroexpedit", "heroexpedit_7"); this.loadRes(res, function (sf_obj) { this.facial_list[this.point_num - 1].spriteFrame = sf_obj; }.bind(this)); } } var box_data = this.model.getExpeditBoxData(); var pos_status = 0; for (var i in box_data) { if (box_data[i] == data.guard_id - 1) { pos_status = 1; for (var j in data.reward) { if (data.reward[j].reward_id == data.guard_id - 1) { pos_status = 2; break; } } } } this.boxInfo = { pos_status: pos_status, guard_id: data.guard_id - 1 }; this.checkBoxStatus(pos_status, data.guard_id - 1); }.bind(this)); this.addGlobalEvent(HeroExpeditEvent.Get_Box_Event, function (box_id) { this.checkBoxStatus(2, box_id); }.bind(this)); this.addGlobalEvent(HeroExpeditEvent.EmploySendEvent, function (data) { var status = this.model.getHeroSendRedPoint(); Utils.addRedPointToNodeByStatus(this.btn_employ, status); }.bind(this)); Utils.onTouchEnd(this.close_btn, function () { this.ctrl.openHeroExpeditView(false); }.bind(this), 2); Utils.onTouchEnd(this.btn_employ, function () { this.ctrl.openEmpolyPanelView(true); }.bind(this), 1); Utils.onTouchEnd(this.btn_shop, function () { MallController.getInstance().openMallPanel(true, MallConst.MallType.ScoreShop); }.bind(this), 1); this.btn_rule.on(cc.Node.EventType.TOUCH_END, function (event) { Utils.playButtonSound(1); var config = Config.expedition_data.data_const.game_rule; var pos = event.touch.getLocation(); require("tips_controller").getInstance().showCommonTips(config.desc, pos, null, null, 500); }, this); }, // 宝箱的状态 checkBoxStatus: function checkBoxStatus(status, box_num) { if (box_num <= 0) return; var box_data = this.model.getExpeditBoxData(); var num = 0; for (var i in box_data) { if (box_data[i] == box_num) { num = parseInt(i) + 1; break; } } this.updateTaskList(status, num); }, setBorder: function setBorder(x) { var pos_x = this.expedit_bg.x + x; if (pos_x >= this.move_pos) { pos_x = this.move_pos; } if (pos_x <= -this.expedit_bg.width * FIT_SCALE + this.map_center * 2 * FIT_SCALE) { pos_x = -this.expedit_bg.width * FIT_SCALE + this.map_center * 2 * FIT_SCALE; } return pos_x; }, setVisible: function setVisible(status) { this._super(status); if (status) { if (this.boxInfo && this.boxInfo.pos_status != null && this.boxInfo.guard_id != null) { this.checkBoxStatus(this.boxInfo.pos_status, this.boxInfo.guard_id); this.boxInfo = null; } } }, updateTaskList: function updateTaskList(box_data, box_num) { var action = PlayerAction.action_2; if (box_data == 0) { action = PlayerAction.action_1; } else if (box_data == 1) { action = PlayerAction.action_2; } else if (box_data == 2) { action = PlayerAction.action_3; } if (this.play_effect[box_num]) { this.play_effect[box_num].setToSetupPose(); this.play_effect[box_num].clearTracks(); this.play_effect[box_num] = null; } if (this.box_list[box_num] && this.play_effect[box_num] == null) { var node = new cc.Node(); node.setContentSize(cc.size(62, 44)); node.setAnchorPoint(0.5, 0.5); node.setPosition(this.box_list[box_num].x, this.box_list[box_num].y); this.expedit_bg.addChild(node, 0); this.play_effect[box_num] = node.addComponent(sp.Skeleton); var anima_path = PathTool.getSpinePath("E51087", "action"); this.loadRes(anima_path, function (ske_data) { this.play_effect[box_num].skeletonData = ske_data; this.play_effect[box_num].setAnimation(0, action, true); }.bind(this)); } }, register_event: function register_event() { //当用户点击的时候记录鼠标点击状态 this.map_layer.on(cc.Node.EventType.TOUCH_START, function (event) { this.touch_point = null; this.expedit_bg.stopAllActions(); this.mouseDown = true; }, this); //只有当用户鼠标按下才能拖拽 this.map_layer.on(cc.Node.EventType.TOUCH_MOVE, function (event) { if (!this.mouseDown) return; var touches = event.getTouches(); this.touch_point = touches[0].getDelta(); var pos_x = this.setBorder(this.touch_point.x); this.expedit_bg.x = pos_x; }, this); //当鼠标抬起的时候恢复状态 this.map_layer.on(cc.Node.EventType.TOUCH_END, function (event) { this.mouseDown = false; }, this); }, // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了 openRootWnd: function openRootWnd(params) { var expeditData = this.model.getExpeditData(); if (expeditData || Utils.next(expeditData) != null) { this.loadRes(PathTool.getBigBg("heroexpedit_bg", null, "heroexpedit"), function (resObject) { this.expedit_bg_sp.spriteFrame = resObject; this.move_pos = 0; expeditData.guard_id = expeditData.guard_id || 1; if (expeditData.guard_id <= 3) { this.expedit_bg.x = this.move_pos; } }.bind(this)); } var status = this.model.getHeroSendRedPoint(); Utils.addRedPointToNodeByStatus(this.btn_employ, status); this.register_event(); this.createBoxOrPoint(); }, // 创建宝箱和点 createBoxOrPoint: function createBoxOrPoint() { var data = [0, 0, 0, 0, 0, 0, 0]; var box_data = this.model.getExpeditBoxData(); var expeditData = this.model.getExpeditData(); if (!expeditData || Utils.next(expeditData) == null) return; if (Utils.next(expeditData) != null) { for (var i in box_data) { if (expeditData.guard_id >= box_data[i]) { data[i] = 1; } for (var j in expeditData.reward) { if (box_data[i] == expeditData.reward[j].reward_id) { data[i] = 2; } } } } for (var k = 1; k <= this.point_num; k++) { gcore.Timer.set(function (k) { if (this.sign_info[k].type == 1) { this.point_list[k] = new cc.Node(); this.point_list[k].setAnchorPoint(0.5, 0); this.point_list[k].setPosition(this.sign_info[k].pos[0][0], this.sign_info[k].pos[0][1]); this.expedit_bg.addChild(this.point_list[k]); var btn = this.point_list[k].addComponent(cc.Button); btn.transition = cc.Button.Transition.SCALE; btn.zoomScale = 0.9; this.point_img_list[k] = Utils.createImage(this.point_list[k], null, -19, 0, cc.v2(0, 0), false); var res = PathTool.getUIIconPath("heroexpedit", "heroexpedit_6"); this.loadRes(res, function (sf_obj) { this.point_img_list[k].spriteFrame = sf_obj; }.bind(this)); if (k == expeditData.guard_id) { if (!this.facial_list[k]) { this.point_list[k].setContentSize(cc.size(38, 100)); this.facial_list[k] = Utils.createImage(this.point_list[k], null, -19, 40, cc.v2(0, 0), false); var res = PathTool.getUIIconPath("heroexpedit", "heroexpedit_8"); this.loadRes(res, function (sf_obj) { this.facial_list[k].spriteFrame = sf_obj; }.bind(this)); } } else if (k < expeditData.guard_id) { if (!this.facial_list[k]) { this.point_list[k].setContentSize(cc.size(38, 100)); this.facial_list[k] = Utils.createImage(this.point_list[k], null, -19, 40, cc.v2(0, 0), false); var res = PathTool.getUIIconPath("heroexpedit", "heroexpedit_7"); this.loadRes(res, function (sf_obj) { this.facial_list[k].spriteFrame = sf_obj; }.bind(this)); } } else { this.point_img_list[k].setState(cc.Sprite.State.GRAY); this.point_list[k].setContentSize(cc.size(38, 40)); } Utils.onTouchEnd(this.point_list[k], function (k) { this.ctrl.sender24401(k); }.bind(this, k), 1); } else if (this.sign_info[k].type == 2) { this.box_index = this.box_index + 1; this.box_list[this.box_index] = new cc.Node(); Utils.onTouchEnd(this.box_list[this.box_index], function (k) { if (this.ctrl.getGrardID() >= k) { this.ctrl.sender24402(k); } else { this.ctrl.sender24401(k); } }.bind(this, k), 1); this.box_list[this.box_index].setContentSize(cc.size(100, 100)); this.box_list[this.box_index].setAnchorPoint(0.5, 0.5); this.box_list[this.box_index].setPosition(this.sign_info[k].pos[0][0], this.sign_info[k].pos[0][1]); this.expedit_bg.addChild(this.box_list[this.box_index]); this.updateTaskList(data[this.box_index - 1], this.box_index); } }.bind(this, k), k * 2 / 60, 1); } this.ctrl.sender24400(); }, // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象 closeCallBack: function closeCallBack() { if (this.play_effect && Utils.next(this.play_effect || []) != null) { for (var i = 1; i <= this.box_num; i++) { if (this.play_effect[i]) { this.play_effect[i].setToSetupPose(); this.play_effect[i].clearTracks(); this.play_effect[i] = null; } } } this.map_center = null; this.sign_info = null; this.point_num = null; this.box_num = null; this.box_index = null; this.box_list = null; this.point_list = null; this.facial_list = null; this.point_img_list = null; this.play_effect = null; this.mouseDown = null; this.ctrl.openHeroExpeditView(false); } }); 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvZXhwZWRpdFxcdmlld1xcaGVyb2V4cGVkaXRfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIk1hbGxDb250cm9sbGVyIiwiTWFsbENvbnN0IiwiSGVyb0V4cGVkaXRFdmVudCIsIkhlcm9leHBlZGl0V2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsInVpIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImN0cmwiLCJhcmd1bWVudHMiLCJtb2RlbCIsImdldE1vZGVsIiwiaW5pdENvbmZpZyIsIm1hcF9jZW50ZXIiLCJzaWduX2luZm8iLCJDb25maWciLCJleHBlZGl0aW9uX2RhdGEiLCJkYXRhX3NpZ25faW5mbyIsInBvaW50X251bSIsImRhdGFfc2lnbl9pbmZvX2xlbmd0aCIsImJveF9udW0iLCJib3hfaW5kZXgiLCJib3hfbGlzdCIsInBvaW50X2xpc3QiLCJmYWNpYWxfbGlzdCIsInBvaW50X2ltZ19saXN0IiwicGxheV9lZmZlY3QiLCJtb3VzZURvd24iLCJvcGVuQ2FsbEJhY2siLCJtYWluX2NvbnRhaW5lciIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJiaWdCZyIsInNjYWxlIiwiRklUX1NDQUxFIiwiZXhwZWRpdF9iZyIsImV4cGVkaXRfYmdfc3AiLCJnZXRDb21wb25lbnQiLCJTcHJpdGUiLCJjbG9zZV9idG4iLCJtYXBfbGF5ZXIiLCJidG5fZW1wbG95IiwidGV4dF8xIiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwiYnRuX3Nob3AiLCJ0ZXh0XzFfMCIsImJ0bl9ydWxlIiwiZ2V0X3Jld2FyZF9iZyIsInRleHRfMiIsImV4cGVkaXRfaW1nXzEiLCJleHBlZGl0X2ltZ18yIiwiZXhwZWRpdF9yZXdhcmQiLCJwb3MiLCJpIiwiY3JlYXRlUmljaExhYmVsIiwiQ29sb3IiLCJ2MiIsImhvcml6b250YWxBbGlnbiIsIm1hY3JvIiwiVGV4dEFsaWdubWVudCIsIkxFRlQiLCJhZGRDaGlsZCIsIm5vZGUiLCJzZXRQb3NpdGlvbiIsInJlZ2lzdGVyRXZlbnQiLCJhZGRHbG9iYWxFdmVudCIsIkhlcm9FeHBlZGl0Vmlld0V2ZW50IiwiZGF0YSIsInJld2FyZHMiLCJpdGVtX2NvbmZpZyIsImdldEl0ZW1Db25maWciLCJiaWQiLCJyZXMiLCJnZXRJdGVtUmVzIiwiaWNvbiIsInN0ciIsImpzIiwiZm9ybWF0U3RyIiwibnVtIiwibG9hZFJlcyIsInNmX29iaiIsInNwcml0ZUZyYW1lIiwiYmluZCIsImd1YXJkX2lkIiwic2V0U3RhdGUiLCJTdGF0ZSIsIk5PUk1BTCIsImJveCIsImdldEV4cGVkaXRCb3hEYXRhIiwic3RhdHVzIiwiaiIsInNldENvbnRlbnRTaXplIiwic2l6ZSIsImNyZWF0ZUltYWdlIiwiZ2V0VUlJY29uUGF0aCIsImJveF9kYXRhIiwicG9zX3N0YXR1cyIsInJld2FyZCIsInJld2FyZF9pZCIsImJveEluZm8iLCJjaGVja0JveFN0YXR1cyIsIkdldF9Cb3hfRXZlbnQiLCJib3hfaWQiLCJFbXBsb3lTZW5kRXZlbnQiLCJnZXRIZXJvU2VuZFJlZFBvaW50IiwiYWRkUmVkUG9pbnRUb05vZGVCeVN0YXR1cyIsIm9uVG91Y2hFbmQiLCJvcGVuSGVyb0V4cGVkaXRWaWV3Iiwib3BlbkVtcG9seVBhbmVsVmlldyIsImdldEluc3RhbmNlIiwib3Blbk1hbGxQYW5lbCIsIk1hbGxUeXBlIiwiU2NvcmVTaG9wIiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJwbGF5QnV0dG9uU291bmQiLCJjb25maWciLCJkYXRhX2NvbnN0IiwiZ2FtZV9ydWxlIiwidG91Y2giLCJnZXRMb2NhdGlvbiIsInNob3dDb21tb25UaXBzIiwiZGVzYyIsInBhcnNlSW50IiwidXBkYXRlVGFza0xpc3QiLCJzZXRCb3JkZXIiLCJ4IiwicG9zX3giLCJtb3ZlX3BvcyIsIndpZHRoIiwic2V0VmlzaWJsZSIsIl9zdXBlciIsImFjdGlvbiIsIlBsYXllckFjdGlvbiIsImFjdGlvbl8yIiwiYWN0aW9uXzEiLCJhY3Rpb25fMyIsInNldFRvU2V0dXBQb3NlIiwiY2xlYXJUcmFja3MiLCJzZXRBbmNob3JQb2ludCIsInkiLCJhZGRDb21wb25lbnQiLCJzcCIsIlNrZWxldG9uIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsInNrZV9kYXRhIiwic2tlbGV0b25EYXRhIiwic2V0QW5pbWF0aW9uIiwicmVnaXN0ZXJfZXZlbnQiLCJUT1VDSF9TVEFSVCIsInRvdWNoX3BvaW50Iiwic3RvcEFsbEFjdGlvbnMiLCJUT1VDSF9NT1ZFIiwidG91Y2hlcyIsImdldFRvdWNoZXMiLCJnZXREZWx0YSIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwiZXhwZWRpdERhdGEiLCJnZXRFeHBlZGl0RGF0YSIsIm5leHQiLCJnZXRCaWdCZyIsInJlc09iamVjdCIsImNyZWF0ZUJveE9yUG9pbnQiLCJrIiwiZ2NvcmUiLCJUaW1lciIsInNldCIsInR5cGUiLCJidG4iLCJCdXR0b24iLCJ0cmFuc2l0aW9uIiwiVHJhbnNpdGlvbiIsIlNDQUxFIiwiem9vbVNjYWxlIiwiR1JBWSIsInNlbmRlcjI0NDAxIiwiZ2V0R3JhcmRJRCIsInNlbmRlcjI0NDAyIiwic2VuZGVyMjQ0MDAiLCJjbG9zZUNhbGxCYWNrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUUsU0FBUyxHQUFHRixPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBR0gsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUVBLElBQUlJ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VUFBTCxHQUFrQixJQUFsQjtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxTQUFLQyxjQUFMLEdBQXNCLElBQXRCO0FBQ0EsU0FBS0MsV0FBTCxHQUFtQixJQUFuQjtBQUNBLFNBQUtDLFNBQUwsR0FBaUIsSUFBakI7QUFFQSxTQUFLbkIsSUFBTCxDQUFVc0csbUJBQVYsQ0FBOEIsS0FBOUI7QUFDSDtBQXZhNEIsQ0FBVCxDQUF4QiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOi/memHjOaYr+aPj+i/sOi/meS4queql+S9k+eahOS9nOeUqOeahFxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDMtMTEgMTQ6MTY6NDZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgUGF0aFRvb2wgPSByZXF1aXJlKFwicGF0aHRvb2xcIik7XG52YXIgTWFsbENvbnRyb2xsZXIgPSByZXF1aXJlKFwibWFsbF9jb250cm9sbGVyXCIpO1xudmFyIE1hbGxDb25zdCA9IHJlcXVpcmUoXCJtYWxsX2NvbnN0XCIpO1xudmFyIEhlcm9FeHBlZGl0RXZlbnQgPSByZXF1aXJlKFwiaGVyb2V4cGVkaXRfZXZlbnRcIik7XG5cbnZhciBIZXJvZXhwZWRpdFdpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJoZXJvZXhwZWRpdFwiLCBcImhlcm9fZXhwZWRpdF93aW5kb3dcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy51aTsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLm1hcF9jZW50ZXIgPSAzNjAgIC8v5Zyw5Zu+56e75Yqo55qE5Lit5b+D54K5XG4gICAgICAgIHRoaXMuc2lnbl9pbmZvID0gQ29uZmlnLmV4cGVkaXRpb25fZGF0YS5kYXRhX3NpZ25faW5mb1xuICAgICAgICB0aGlzLnBvaW50X251bSA9IENvbmZpZy5leHBlZGl0aW9uX2RhdGEuZGF0YV9zaWduX2luZm9fbGVuZ3RoIC8v5Liq5pWwKOWuneeuseWSjOeCuSlcbiAgICAgICAgdGhpcy5ib3hfbnVtID0gNSAvL+WuneeuseS4quaVsFxuXG4gICAgICAgIHRoaXMuYm94X2luZGV4ID0gMFxuICAgICAgICB0aGlzLmJveF9saXN0ID0ge30gLy/lrp3nrrFcbiAgICAgICAgdGhpcy5wb2ludF9saXN0ID0ge30gLy/ngrlcbiAgICAgICAgdGhpcy5mYWNpYWxfbGlzdCA9IHt9IC8v6KGo5oOF5YyFXG4gICAgICAgIHRoaXMucG9pbnRfaW1nX2xpc3QgPSB7fSAvL+eCueWbvueJh1xuICAgICAgICB0aGlzLnBsYXlfZWZmZWN0ID0ge31cbiAgICAgICAgdGhpcy5tb3VzZURvd24gPSBmYWxzZTsvL+a3u+WKoOWPmOmHj+WIpOaWreeUqOaIt+W9k+WJjem8oOagh+aYr+S4jeaYr+WkhOS6juaMieS4i+eKtuaAgVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMubWFpbl9jb250YWluZXIgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwibWFpbl9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMuYmlnQmcgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwiYmlnQmdcIik7XG4gICAgICAgIHRoaXMuYmlnQmcuc2NhbGUgPSBGSVRfU0NBTEU7XG4gICAgICAgIHRoaXMuZXhwZWRpdF9iZyA9IHRoaXMuYmlnQmcuZ2V0Q2hpbGRCeU5hbWUoXCJiZ1wiKTtcbiAgICAgICAgdGhpcy5leHBlZGl0X2JnX3NwID0gdGhpcy5iaWdCZy5nZXRDaGlsZEJ5TmFtZShcImJnXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgIFxuICAgICAgICB0aGlzLmNsb3NlX2J0biA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJidG5fcmV0dXJuXCIpO1xuICAgICAgICB0aGlzLm1hcF9sYXllciA9IHRoaXMuYmlnQmcuZ2V0Q2hpbGRCeU5hbWUoXCJtYXBfbGF5ZXJcIik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmJ0bl9lbXBsb3kgPSB0aGlzLm1haW5fY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwiYnRuX2VtcGxveVwiKTtcbiAgICAgICAgdmFyIHRleHRfMSA9IHRoaXMuYnRuX2VtcGxveS5nZXRDaGlsZEJ5TmFtZShcIlRleHRfMVwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0ZXh0XzEuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLlpb3lj4vliqnpmLVcIik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmJ0bl9zaG9wID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImJ0bl9zaG9wXCIpO1xuICAgICAgICB2YXIgdGV4dF8xXzAgPSB0aGlzLmJ0bl9zaG9wLmdldENoaWxkQnlOYW1lKFwiVGV4dF8xXzBcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGV4dF8xXzAuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLov5zlvoHllYblupdcIik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmJ0bl9ydWxlID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcImJ0bl9ydWxlXCIpXG4gICAgXG4gICAgICAgIHRoaXMuZ2V0X3Jld2FyZF9iZyA9IHRoaXMubWFpbl9jb250YWluZXIuZ2V0Q2hpbGRCeU5hbWUoXCJnZXRfcmV3YXJkX2JnXCIpO1xuICAgICAgICB2YXIgdGV4dF8yID0gdGhpcy5nZXRfcmV3YXJkX2JnLmdldENoaWxkQnlOYW1lKFwiSW1hZ2VfMlwiKS5nZXRDaGlsZEJ5TmFtZShcIlRleHRfMlwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xuICAgICAgICB0ZXh0XzIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLku4rml6Xlt7Lojrflj5blpZblirHvvJpcIik7XG4gICAgICAgIHRoaXMuZXhwZWRpdF9pbWdfMSA9IHRoaXMuZ2V0X3Jld2FyZF9iZy5nZXRDaGlsZEJ5TmFtZShcImV4cGVkaXRfaW1nXzFcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMuZXhwZWRpdF9pbWdfMiA9IHRoaXMuZ2V0X3Jld2FyZF9iZy5nZXRDaGlsZEJ5TmFtZShcImV4cGVkaXRfaW1nXzJcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMuZXhwZWRpdF9yZXdhcmQgPSBbXTtcbiAgICAgICAgdmFyIHBvcyA9IFs3MiwzM107XG4gICAgICAgIGZvcih2YXIgaSA9IDA7aTwyO2krKyl7XG4gICAgICAgICAgICB0aGlzLmV4cGVkaXRfcmV3YXJkW2ldID0gVXRpbHMuY3JlYXRlUmljaExhYmVsKDI0LCBuZXcgY2MuQ29sb3IoMHhmZiwweGY2LDB4YzcsMHhmZiksIGNjLnYyKDAsIDAuNSksIGNjLnYyKDAsMCksIDMwLCAyNTApO1xuICAgICAgICAgICAgdGhpcy5leHBlZGl0X3Jld2FyZFtpXS5ob3Jpem9udGFsQWxpZ24gPSBjYy5tYWNyby5UZXh0QWxpZ25tZW50LkxFRlQ7XG4gICAgICAgICAgICB0aGlzLmdldF9yZXdhcmRfYmcuYWRkQ2hpbGQodGhpcy5leHBlZGl0X3Jld2FyZFtpXS5ub2RlKTtcbiAgICAgICAgICAgIHRoaXMuZXhwZWRpdF9yZXdhcmRbaV0ubm9kZS5zZXRQb3NpdGlvbig2MCxwb3NbaV0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OmZ1bmN0aW9uKCl7XG4gICAgICAgIC8vIOaIkeeahOaUr+aPtOaIkOWKn+i/lOWbnlxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhlcm9FeHBlZGl0RXZlbnQuSGVyb0V4cGVkaXRWaWV3RXZlbnQsIGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgIGlmKCFkYXRhKXJldHVybjtcbiAgICAgICAgICAgIGZvcih2YXIgaSBpbiBkYXRhLnJld2FyZHMpe1xuICAgICAgICAgICAgICAgIHZhciBpdGVtX2NvbmZpZyA9IFV0aWxzLmdldEl0ZW1Db25maWcoZGF0YS5yZXdhcmRzW2ldLmJpZCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoaXRlbV9jb25maWcuaWNvbik7XG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IGNjLmpzLmZvcm1hdFN0cihcIiVkXCIsZGF0YS5yZXdhcmRzW2ldLm51bSlcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVkaXRfcmV3YXJkW2ldLnN0cmluZyA9IHN0cjtcbiAgICAgICAgICAgICAgICBpZihpPT0wICYmIHRoaXMuZXhwZWRpdF9pbWdfMSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWRpdF9pbWdfMS5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGk9PTEgJiYgdGhpcy5leHBlZGl0X2ltZ18yKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlZGl0X2ltZ18yLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5wb2ludF9saXN0W2RhdGEuZ3VhcmRfaWRdKXtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50X2ltZ19saXN0W2RhdGEuZ3VhcmRfaWRdLnNldFN0YXRlKGNjLlNwcml0ZS5TdGF0ZS5OT1JNQUwpO1xuICAgICAgICAgICAgICAgIHZhciBudW0gPSBkYXRhLmd1YXJkX2lkO1xuICAgICAgICAgICAgICAgIHZhciBib3ggPSB0aGlzLm1vZGVsLmdldEV4cGVkaXRCb3hEYXRhKCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIOiDnOWIqeWFs+WNoeeahOS4i+S4gOWFs+aYr+WQpuaYr+WuneeuseeahOS9jee9rlxuICAgICAgICAgICAgICAgIGZvcih2YXIgaiBpbiBib3gpe1xuICAgICAgICAgICAgICAgICAgICBpZihib3hbal0gPT0gKGRhdGEuZ3VhcmRfaWQtMSkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZVxuXHRcdFx0XHRcdCAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHN0YXR1cyA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICAgICAgbnVtID0gbnVtIC0gMjtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgbnVtID0gbnVtIC0gMTsgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKG51bSA8PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgbnVtID0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuZmFjaWFsX2xpc3RbZGF0YS5ndWFyZF9pZF0pe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50X2xpc3RbZGF0YS5ndWFyZF9pZF0uc2V0Q29udGVudFNpemUoY2Muc2l6ZSgzOCwxMDApKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWNpYWxfbGlzdFtkYXRhLmd1YXJkX2lkXSA9IFV0aWxzLmNyZWF0ZUltYWdlKHRoaXMucG9pbnRfbGlzdFtkYXRhLmd1YXJkX2lkXSwgbnVsbCwgLTE5LCA0MCwgY2MudjIoMCwgMCksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJoZXJvZXhwZWRpdFwiLFwiaGVyb2V4cGVkaXRfOFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWNpYWxfbGlzdFtkYXRhLmd1YXJkX2lkXS5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImhlcm9leHBlZGl0XCIsXCJoZXJvZXhwZWRpdF84XCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2lhbF9saXN0W2RhdGEuZ3VhcmRfaWRdLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYodGhpcy5mYWNpYWxfbGlzdFtudW1dKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJoZXJvZXhwZWRpdFwiLFwiaGVyb2V4cGVkaXRfN1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWNpYWxfbGlzdFtudW1dLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOacgOWQjuS4gOWFs+aXtlxuICAgICAgICAgICAgICAgIGlmKGRhdGEuZ3VhcmRfaWQgPT0gKHRoaXMucG9pbnRfbnVtLTEpKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJoZXJvZXhwZWRpdFwiLFwiaGVyb2V4cGVkaXRfOFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWNpYWxfbGlzdFtkYXRhLmd1YXJkX2lkXS5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYoZGF0YS5ndWFyZF9pZCA+IHRoaXMucG9pbnRfbnVtKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmZhY2lhbF9saXN0W3RoaXMucG9pbnRfbnVtLTFdKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJoZXJvZXhwZWRpdFwiLFwiaGVyb2V4cGVkaXRfN1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWNpYWxfbGlzdFt0aGlzLnBvaW50X251bS0xXS5zcHJpdGVGcmFtZSA9IHNmX29iajtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBib3hfZGF0YSA9IHRoaXMubW9kZWwuZ2V0RXhwZWRpdEJveERhdGEoKTtcbiAgICAgICAgICAgIHZhciBwb3Nfc3RhdHVzID0gMDtcbiAgICAgICAgICAgIGZvcih2YXIgaSBpbiBib3hfZGF0YSl7XG4gICAgICAgICAgICAgICAgaWYoYm94X2RhdGFbaV0gPT0gZGF0YS5ndWFyZF9pZC0xKXtcbiAgICAgICAgICAgICAgICAgICAgcG9zX3N0YXR1cyA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaiBpbiBkYXRhLnJld2FyZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLnJld2FyZFtqXS5yZXdhcmRfaWQgPT0gZGF0YS5ndWFyZF9pZC0xKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3Nfc3RhdHVzID0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJveEluZm8gPSB7cG9zX3N0YXR1czpwb3Nfc3RhdHVzLGd1YXJkX2lkOmRhdGEuZ3VhcmRfaWQtMX1cbiAgICAgICAgICAgIHRoaXMuY2hlY2tCb3hTdGF0dXMocG9zX3N0YXR1cywgZGF0YS5ndWFyZF9pZC0xKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKSBcbiAgICBcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIZXJvRXhwZWRpdEV2ZW50LkdldF9Cb3hfRXZlbnQsIGZ1bmN0aW9uKGJveF9pZCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0JveFN0YXR1cygyLCBib3hfaWQpO1xuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChIZXJvRXhwZWRpdEV2ZW50LkVtcGxveVNlbmRFdmVudCwgZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMubW9kZWwuZ2V0SGVyb1NlbmRSZWRQb2ludCgpO1xuXHRcdCAgICBVdGlscy5hZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzKHRoaXMuYnRuX2VtcGxveSwgc3RhdHVzKVxuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5jbG9zZV9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGVyb0V4cGVkaXRWaWV3KGZhbHNlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyKTtcblxuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuYnRuX2VtcGxveSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5FbXBvbHlQYW5lbFZpZXcodHJ1ZSlcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKTtcbiAgICAgICAgXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fc2hvcCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgTWFsbENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTWFsbFBhbmVsKHRydWUsIE1hbGxDb25zdC5NYWxsVHlwZS5TY29yZVNob3ApO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpO1xuXG4gICAgICAgIHRoaXMuYnRuX3J1bGUub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZCgxKTtcbiAgICAgICAgICAgIHZhciBjb25maWcgPSBDb25maWcuZXhwZWRpdGlvbl9kYXRhLmRhdGFfY29uc3QuZ2FtZV9ydWxlO1xuICAgICAgICAgICAgdmFyIHBvcyA9IGV2ZW50LnRvdWNoLmdldExvY2F0aW9uKCk7XG4gICAgICAgICAgICByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2hvd0NvbW1vblRpcHMoY29uZmlnLmRlc2MsIHBvcyxudWxsLG51bGwsNTAwKTsgICAgICAgICAgICBcbiAgICAgICAgfSwgdGhpcylcbiBcbiAgICB9LFxuXG4gICAgLy8g5a6d566x55qE54q25oCBXG4gICAgY2hlY2tCb3hTdGF0dXM6ZnVuY3Rpb24oc3RhdHVzLGJveF9udW0pe1xuICAgICAgICBpZihib3hfbnVtIDw9IDApcmV0dXJuO1xuICAgICAgICB2YXIgYm94X2RhdGEgPSB0aGlzLm1vZGVsLmdldEV4cGVkaXRCb3hEYXRhKCk7XG4gICAgICAgIHZhciBudW0gPSAwO1xuICAgICAgICBmb3IodmFyIGkgaW4gYm94X2RhdGEpe1xuICAgICAgICAgICAgaWYoYm94X2RhdGFbaV0gPT0gYm94X251bSl7XG4gICAgICAgICAgICAgICAgbnVtID0gcGFyc2VJbnQoaSkrMTtcblx0XHRcdCAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVRhc2tMaXN0KHN0YXR1cywgbnVtKTtcbiAgICB9LFxuXG4gICAgc2V0Qm9yZGVyOmZ1bmN0aW9uKHgpe1xuICAgICAgICB2YXIgcG9zX3ggPSB0aGlzLmV4cGVkaXRfYmcueCArIHg7XG4gICAgICAgIGlmKHBvc194ID49IHRoaXMubW92ZV9wb3Mpe1xuICAgICAgICAgICAgcG9zX3ggPSB0aGlzLm1vdmVfcG9zO1xuICAgICAgICB9XG4gICAgICAgIGlmKHBvc194IDw9IC10aGlzLmV4cGVkaXRfYmcud2lkdGgqRklUX1NDQUxFK3RoaXMubWFwX2NlbnRlcioyKkZJVF9TQ0FMRSl7XG4gICAgICAgICAgICBwb3NfeCA9IC10aGlzLmV4cGVkaXRfYmcud2lkdGgqRklUX1NDQUxFK3RoaXMubWFwX2NlbnRlcioyKkZJVF9TQ0FMRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zX3g7XG4gICAgfSxcblxuICAgIHNldFZpc2libGU6ZnVuY3Rpb24oc3RhdHVzKXtcbiAgICAgICAgdGhpcy5fc3VwZXIoc3RhdHVzKTtcbiAgICAgICAgXG4gICAgICAgIGlmKHN0YXR1cyl7XG4gICAgICAgICAgICBpZih0aGlzLmJveEluZm8gJiYgdGhpcy5ib3hJbmZvLnBvc19zdGF0dXMgIT0gbnVsbCAmJiB0aGlzLmJveEluZm8uZ3VhcmRfaWQhPW51bGwpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tCb3hTdGF0dXModGhpcy5ib3hJbmZvLnBvc19zdGF0dXMsdGhpcy5ib3hJbmZvLmd1YXJkX2lkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJveEluZm8gPSBudWxsO1xuICAgICAgICAgICAgfSAgXG4gICAgICAgIH1cbiAgICB9LFxuXG5cbiAgICB1cGRhdGVUYXNrTGlzdDpmdW5jdGlvbihib3hfZGF0YSwgYm94X251bSl7XG5cbiAgICAgICAgdmFyIGFjdGlvbiA9IFBsYXllckFjdGlvbi5hY3Rpb25fMjtcbiAgICAgICAgaWYoYm94X2RhdGEgPT0gMCl7XG4gICAgICAgICAgICBhY3Rpb24gPSBQbGF5ZXJBY3Rpb24uYWN0aW9uXzE7XG4gICAgICAgIH1lbHNlIGlmKGJveF9kYXRhID09IDEpe1xuICAgICAgICAgICAgYWN0aW9uID0gUGxheWVyQWN0aW9uLmFjdGlvbl8yXG4gICAgICAgIH1lbHNlIGlmKGJveF9kYXRhID09IDIpe1xuICAgICAgICAgICAgYWN0aW9uID0gUGxheWVyQWN0aW9uLmFjdGlvbl8zXG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5wbGF5X2VmZmVjdFtib3hfbnVtXSl7XG4gICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0W2JveF9udW1dLnNldFRvU2V0dXBQb3NlKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0W2JveF9udW1dLmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0W2JveF9udW1dID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMuYm94X2xpc3RbYm94X251bV0gJiYgdGhpcy5wbGF5X2VmZmVjdFtib3hfbnVtXSA9PSBudWxsKXtcbiAgICAgICAgICAgIHZhciBub2RlID0gbmV3IGNjLk5vZGUoKTtcbiAgICAgICAgICAgIG5vZGUuc2V0Q29udGVudFNpemUoY2Muc2l6ZSg2Miw0NCkpXG4gICAgICAgICAgICBub2RlLnNldEFuY2hvclBvaW50KDAuNSwwLjUpXG4gICAgICAgICAgICBub2RlLnNldFBvc2l0aW9uKHRoaXMuYm94X2xpc3RbYm94X251bV0ueCwgdGhpcy5ib3hfbGlzdFtib3hfbnVtXS55KTtcbiAgICAgICAgICAgIHRoaXMuZXhwZWRpdF9iZy5hZGRDaGlsZChub2RlLDApO1xuICAgICAgICAgICAgdGhpcy5wbGF5X2VmZmVjdFtib3hfbnVtXSA9IG5vZGUuYWRkQ29tcG9uZW50KHNwLlNrZWxldG9uKTtcbiAgICAgICAgICAgIFxuXG4gICAgICAgICAgICB2YXIgYW5pbWFfcGF0aCA9IFBhdGhUb29sLmdldFNwaW5lUGF0aChcIkU1MTA4N1wiLCBcImFjdGlvblwiKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFJlcyhhbmltYV9wYXRoLCBmdW5jdGlvbihza2VfZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheV9lZmZlY3RbYm94X251bV0uc2tlbGV0b25EYXRhID0gc2tlX2RhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5X2VmZmVjdFtib3hfbnVtXS5zZXRBbmltYXRpb24oMCwgYWN0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFxuICAgIHJlZ2lzdGVyX2V2ZW50OmZ1bmN0aW9uKCl7XG5cbiAgICAgICAgLy/lvZPnlKjmiLfngrnlh7vnmoTml7blgJnorrDlvZXpvKDmoIfngrnlh7vnirbmgIFcbiAgICAgICAgdGhpcy5tYXBfbGF5ZXIub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfU1RBUlQsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgIHRoaXMudG91Y2hfcG9pbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5leHBlZGl0X2JnLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICB0aGlzLm1vdXNlRG93biA9IHRydWU7XG4gICAgICAgIH0sdGhpcyk7XG5cbiAgICAgICAgLy/lj6rmnInlvZPnlKjmiLfpvKDmoIfmjInkuIvmiY3og73mi5bmi71cbiAgICAgICAgdGhpcy5tYXBfbGF5ZXIub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfTU9WRSwgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgaWYoIXRoaXMubW91c2VEb3duKSByZXR1cm47XG4gICAgICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmdldFRvdWNoZXMoKTtcbiAgICAgICAgICAgIHRoaXMudG91Y2hfcG9pbnQgPSB0b3VjaGVzWzBdLmdldERlbHRhKCk7XG4gICAgICAgICAgICB2YXIgcG9zX3ggPSB0aGlzLnNldEJvcmRlcih0aGlzLnRvdWNoX3BvaW50LngpO1xuICAgICAgICAgICAgdGhpcy5leHBlZGl0X2JnLnggPSBwb3NfeDtcbiAgICAgICAgfSx0aGlzKTtcblxuXG4gICAgICAgIC8v5b2T6byg5qCH5oqs6LW355qE5pe25YCZ5oGi5aSN54q25oCBXG4gICAgICAgIHRoaXMubWFwX2xheWVyLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgdGhpcy5tb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgfSx0aGlzKTtcblxuICAgIFxuICAgIH0sXHRcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjizmt7vliqDliLDlr7nlupTkuLvoioLngrnkuYvlkI7nmoTlm57osIMs5Lmf5bCx5piv5LiA5Liq56qX5L2T55qE5q2j5byP5YWl5Y+jLOWPr+S7peiuvue9ruS4gOS6m+aVsOaNruS6hlxuICAgIG9wZW5Sb290V25kOmZ1bmN0aW9uKHBhcmFtcyl7XG4gICAgICAgIHZhciBleHBlZGl0RGF0YSA9IHRoaXMubW9kZWwuZ2V0RXhwZWRpdERhdGEoKTtcbiAgICAgICAgaWYoZXhwZWRpdERhdGEgfHwgVXRpbHMubmV4dChleHBlZGl0RGF0YSkhPW51bGwpe1xuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwiaGVyb2V4cGVkaXRfYmdcIixudWxsLFwiaGVyb2V4cGVkaXRcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWRpdF9iZ19zcC5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVfcG9zID0gMFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGV4cGVkaXREYXRhLmd1YXJkX2lkID0gZXhwZWRpdERhdGEuZ3VhcmRfaWQgfHwgMTtcbiAgICAgICAgICAgICAgICBpZihleHBlZGl0RGF0YS5ndWFyZF9pZCA8PSAzKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlZGl0X2JnLnggPSB0aGlzLm1vdmVfcG9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMubW9kZWwuZ2V0SGVyb1NlbmRSZWRQb2ludCgpO1xuICAgICAgICBVdGlscy5hZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzKHRoaXMuYnRuX2VtcGxveSwgc3RhdHVzKVxuICAgIFxuICAgICAgICB0aGlzLnJlZ2lzdGVyX2V2ZW50KClcbiAgICAgICAgdGhpcy5jcmVhdGVCb3hPclBvaW50KClcbiAgICB9LFxuXG4gICAgLy8g5Yib5bu65a6d566x5ZKM54K5XG4gICAgY3JlYXRlQm94T3JQb2ludDpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgZGF0YSA9IFswLDAsMCwwLDAsMCwwXTtcbiAgICAgICAgdmFyIGJveF9kYXRhID0gdGhpcy5tb2RlbC5nZXRFeHBlZGl0Qm94RGF0YSgpO1xuICAgICAgICB2YXIgZXhwZWRpdERhdGEgPSB0aGlzLm1vZGVsLmdldEV4cGVkaXREYXRhKCk7XG4gICAgICAgIGlmKCFleHBlZGl0RGF0YSB8fCBVdGlscy5uZXh0KGV4cGVkaXREYXRhKSA9PSBudWxsKXJldHVybjtcbiAgICAgICAgaWYoVXRpbHMubmV4dChleHBlZGl0RGF0YSkhPW51bGwpe1xuICAgICAgICAgICAgZm9yKHZhciBpIGluIGJveF9kYXRhKXtcbiAgICAgICAgICAgICAgICBpZihleHBlZGl0RGF0YS5ndWFyZF9pZCA+PSBib3hfZGF0YVtpXSl7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbaV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IodmFyIGogaW4gZXhwZWRpdERhdGEucmV3YXJkKXtcbiAgICAgICAgICAgICAgICAgICAgaWYoYm94X2RhdGFbaV0gPT0gZXhwZWRpdERhdGEucmV3YXJkW2pdLnJld2FyZF9pZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2ldID0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGsgPSAxO2s8PXRoaXMucG9pbnRfbnVtO2srKyl7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnNpZ25faW5mb1trXS50eXBlID09IDEpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50X2xpc3Rba10gPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50X2xpc3Rba10uc2V0QW5jaG9yUG9pbnQoMC41LDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50X2xpc3Rba10uc2V0UG9zaXRpb24odGhpcy5zaWduX2luZm9ba10ucG9zWzBdWzBdLCB0aGlzLnNpZ25faW5mb1trXS5wb3NbMF1bMV0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWRpdF9iZy5hZGRDaGlsZCh0aGlzLnBvaW50X2xpc3Rba10pO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBidG4gPSB0aGlzLnBvaW50X2xpc3Rba10uYWRkQ29tcG9uZW50KGNjLkJ1dHRvbik7XG4gICAgICAgICAgICAgICAgICAgIGJ0bi50cmFuc2l0aW9uID0gY2MuQnV0dG9uLlRyYW5zaXRpb24uU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgIGJ0bi56b29tU2NhbGUgPSAwLjk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludF9pbWdfbGlzdFtrXSA9IFV0aWxzLmNyZWF0ZUltYWdlKHRoaXMucG9pbnRfbGlzdFtrXSwgbnVsbCwgLTE5LCAwLCBjYy52MigwLCAwKSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiaGVyb2V4cGVkaXRcIixcImhlcm9leHBlZGl0XzZcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFJlcyhyZXMsIGZ1bmN0aW9uIChzZl9vYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRfaW1nX2xpc3Rba10uc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICAgICAgICAgICAgICBpZihrID09IGV4cGVkaXREYXRhLmd1YXJkX2lkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmZhY2lhbF9saXN0W2tdKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50X2xpc3Rba10uc2V0Q29udGVudFNpemUoY2Muc2l6ZSgzOCwxMDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2lhbF9saXN0W2tdID0gVXRpbHMuY3JlYXRlSW1hZ2UodGhpcy5wb2ludF9saXN0W2tdLCBudWxsLCAtMTksIDQwLCBjYy52MigwLCAwKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRVSUljb25QYXRoKFwiaGVyb2V4cGVkaXRcIixcImhlcm9leHBlZGl0XzhcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhY2lhbF9saXN0W2tdLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoayA8IGV4cGVkaXREYXRhLmd1YXJkX2lkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmZhY2lhbF9saXN0W2tdKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50X2xpc3Rba10uc2V0Q29udGVudFNpemUoY2Muc2l6ZSgzOCwxMDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFjaWFsX2xpc3Rba10gPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLnBvaW50X2xpc3Rba10sIG51bGwsIC0xOSwgNDAsIGNjLnYyKDAsIDApLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcyA9IFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJoZXJvZXhwZWRpdFwiLFwiaGVyb2V4cGVkaXRfN1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZXMocmVzLCBmdW5jdGlvbiAoc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFjaWFsX2xpc3Rba10uc3ByaXRlRnJhbWUgPSBzZl9vYmo7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRfaW1nX2xpc3Rba10uc2V0U3RhdGUoY2MuU3ByaXRlLlN0YXRlLkdSQVkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludF9saXN0W2tdLnNldENvbnRlbnRTaXplKGNjLnNpemUoMzgsNDApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMucG9pbnRfbGlzdFtrXSwgZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5zZW5kZXIyNDQwMShrKTtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsayksIDEpO1xuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0aGlzLnNpZ25faW5mb1trXS50eXBlID09IDIpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJveF9pbmRleCA9IHRoaXMuYm94X2luZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ib3hfbGlzdFt0aGlzLmJveF9pbmRleF0gPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuYm94X2xpc3RbdGhpcy5ib3hfaW5kZXhdLCBmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5jdHJsLmdldEdyYXJkSUQoKSA+PSBrKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMjQ0MDIoayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMjQ0MDEoayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLGspLCAxKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJveF9saXN0W3RoaXMuYm94X2luZGV4XS5zZXRDb250ZW50U2l6ZShjYy5zaXplKDEwMCwxMDApKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJveF9saXN0W3RoaXMuYm94X2luZGV4XS5zZXRBbmNob3JQb2ludCgwLjUsMC41KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJveF9saXN0W3RoaXMuYm94X2luZGV4XS5zZXRQb3NpdGlvbih0aGlzLnNpZ25faW5mb1trXS5wb3NbMF1bMF0sIHRoaXMuc2lnbl9pbmZvW2tdLnBvc1swXVsxXSlcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWRpdF9iZy5hZGRDaGlsZCh0aGlzLmJveF9saXN0W3RoaXMuYm94X2luZGV4XSlcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGFza0xpc3QoZGF0YVt0aGlzLmJveF9pbmRleC0xXSwgdGhpcy5ib3hfaW5kZXgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LmJpbmQodGhpcyxrKSxrKjIgLyA2MCwgMSk7XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN0cmwuc2VuZGVyMjQ0MDAoKTtcbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYodGhpcy5wbGF5X2VmZmVjdCAmJiBVdGlscy5uZXh0KHRoaXMucGxheV9lZmZlY3QgfHxbXSkhPW51bGwpe1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMTtpPD10aGlzLmJveF9udW07aSsrKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnBsYXlfZWZmZWN0W2ldKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5X2VmZmVjdFtpXS5zZXRUb1NldHVwUG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlfZWZmZWN0W2ldLmNsZWFyVHJhY2tzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheV9lZmZlY3RbaV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5tYXBfY2VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5zaWduX2luZm8gPSBudWxsO1xuICAgICAgICB0aGlzLnBvaW50X251bSA9IG51bGw7XG4gICAgICAgIHRoaXMuYm94X251bSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5ib3hfaW5kZXggPSBudWxsO1xuICAgICAgICB0aGlzLmJveF9saXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb2ludF9saXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mYWNpYWxfbGlzdCA9IG51bGw7XG4gICAgICAgIHRoaXMucG9pbnRfaW1nX2xpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLnBsYXlfZWZmZWN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3VzZURvd24gPSBudWxsO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5IZXJvRXhwZWRpdFZpZXcoZmFsc2UpO1xuICAgIH0sXG59KSJdfQ==