difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/battle/view/battle_fail_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, '0cf8dcyU05AfbuGwMPgWoCW', 'battle_fail_window');
// Scripts/mod/battle/view/battle_fail_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-03-28 15:01:58
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var RoleController = require("role_controller");
 
var BattleController = require("battle_controller");
 
var BattleDramaController = require("battle_drama_controller");
 
var BattleConst = require("battle_const");
 
var BattleEvent = require("battle_event");
 
var Battle_failWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("battle", "battle_fail_view");
    this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Mini; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.is_full_screen = false;
    this.fight_type = arguments[0];
    this.result = arguments[1];
    this.data = arguments[2];
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.role_vo = RoleController.getInstance().getRoleVo();
    this.ctrl = BattleController.getInstance();
    this.model = this.ctrl.getModel();
    this.drama_ctrl = BattleDramaController.getInstance();
    this.jump_ctrl = require("jump_controller").getInstance();
    this.is_running = false;
    this.effect_list = {};
    this.x = 100;
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    // local sound_id = "b_lose"
    // if sound_id ~= "" then
    //     AudioManager:getInstance():playMusic(AudioManager.AUDIO_TYPE.BATTLE, sound_id, false)
    // end
    this.source_container = this.seekChild("container");
    this.title_container = this.seekChild("title_container");
    this.title_width = this.title_container.getContentSize().width;
    this.title_height = this.title_container.getContentSize().height;
    this.btn = this.seekChild(this.source_container, "btn");
    this.special_sk = this.seekChild("title_container", sp.Skeleton);
    this.background = this.root_wnd.getChildByName("background");
    this.background.scale = FIT_SCALE;
 
    var func = function () {
      this.createButton();
      this.is_running = false;
    }.bind(this);
 
    this.source_container.runAction(cc.sequence(cc.fadeIn(0, 2), cc.callFunc(func)));
    this.comfirm_btn = this.seekChild("comfirm_btn");
    this.help_btn = this.seekChild("help_btn");
    this.time_label_rt = this.seekChild("time_label", cc.RichText);
    this.harm_btn = this.seekChild("harm_btn");
 
    if (this.data && this.data.hurt_statistics) {
      this.harm_btn.active = true;
    } else {
      this.harm_btn.active = false;
    }
 
    this.handleEffect(true);
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.comfirm_btn, function () {
      this.ctrl.openFailFinishView(false, this.fight_type);
    }.bind(this), 1);
    Utils.onTouchEnd(this.harm_btn, function () {
      if (this.data && Utils.next(this.data) != null) {
        this.ctrl.openBattleHarmInfoView(true, this.data);
      }
    }.bind(this), 1);
    Utils.onTouchEnd(this.help_btn, function () {
      this.ctrl.openFailFinishView(false, this.fight_type);
      this.jump_ctrl.jumpViewByEvtData([16]);
    }.bind(this), 1);
  },
  createButton: function createButton() {
    var btn_list = [];
    var base_data = this.drama_ctrl.getModel().getDramaData();
    var config = Config.battle_act_data.data_get_fail_data;
 
    if (config && base_data) {
      var max_dun_id = base_data.max_dun_id;
 
      for (var i in config) {
        var v = config[i];
 
        if (v.open_dungeon <= max_dun_id) {
          btn_list.push(v);
        }
      }
    }
 
    if (this.items_list == null) {
      this.items_list = {};
    }
 
    this.clearItems();
    var length = Math.min(4, btn_list.length);
 
    var func = function (go_btn, config) {
      go_btn.on(cc.Node.EventType.TOUCH_END, function () {
        this.openPanelByConfig(config);
        this.ctrl.openFailFinishView(false, this.fight_type);
      }, this);
    }.bind(this);
 
    for (var i = 0; i < length; i++) {
      var config = btn_list[i];
 
      if (config) {
        var obj = {};
        obj.btn = this.seekChild("btn_" + config.val_key);
        obj.img = obj.btn.getComponent(cc.Sprite);
        obj.label = this.seekChild(obj.btn, "label", cc.Label);
        this.loadRes(PathTool.getUIIconPath("battlefail", config.icon), function (bg_sf) {
          obj.img.spriteFrame = bg_sf;
        }.bind(this));
        obj.label.string = config.icon_name;
        this.items_list[i] = obj;
      }
 
      var go_btn = this.items_list[i].btn;
      var btn_label = this.items_list[i].label;
 
      if (go_btn) {
        go_btn.active = true;
        ;
        func(go_btn, config);
      }
 
      if (btn_label) {
        btn_label.string = config.icon_name;
      }
    }
 
    this.updateTimer();
  },
  updateTimer: function updateTimer() {
    var time = 5;
 
    var call_back = function () {
      time = time - 1;
      var new_time = Math.ceil(time);
      var str = new_time + Utils.TI18N("秒后关闭");
 
      if (this.time_label_rt) {
        this.time_label_rt.string = str;
      }
 
      if (new_time <= 0) {
        gcore.Timer.del("fail_result_timer");
        this.ctrl.openFailFinishView(false, this.fight_type);
      }
    }.bind(this);
 
    gcore.Timer.set(call_back, 1000, -1, "fail_result_timer");
  },
  handleEffect: function handleEffect(status) {
    if (status == false) {
      if (this.special_sk) {
        this.special_sk.setToSetupPose();
        this.special_sk.clearTracks();
        this.special_sk.node.active = false;
      }
    } else {
      if (this.special_sk) {
        this.special_sk.node.active = true;
        var res = cc.js.formatStr("spine/%s/action.atlas", PathTool.getEffectRes(104));
        this.loadRes(res, function (res_object) {
          this.special_sk.skeletonData = res_object;
          this.special_sk.setAnimation(1, PlayerAction.action, false);
        }.bind(this));
      }
    }
  },
  clearItems: function clearItems() {
    if (this.items_list) {
      for (var k in this.items_list) {
        var v = this.items_list[k];
 
        if (v.btn) {
          v.btn.active = false;
        }
      }
    }
  },
  openPanelByConfig: function openPanelByConfig(config) {
    if (config.val_key == BattleConst.JumpType.Summon) this.jump_ctrl.jumpViewByEvtData([1]);else if (config.val_key == BattleConst.JumpType.HeroBag) this.jump_ctrl.jumpViewByEvtData([19]);else if (config.val_key == BattleConst.JumpType.Forge) this.jump_ctrl.jumpViewByEvtData([26]);else if (config.val_key == BattleConst.JumpType.Hallows) this.jump_ctrl.jumpViewByEvtData([20]);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {},
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    // //联盟战战败有奖励需要展示
    // if (this.fight_type == BattleConst.Fight_Type.GuildWar && this.data && this.data.item_rewards) {
    //     var items = {};
    //     for (var i in this.data.item_rewards) {
    //         var v = this.data.item_rewards[i];
    //         items[i] = {};
    //         items[i].bid = v.bid;
    //         items[i].num = v.num;
    //     }
    //     require("mainui_controller").getInstance().openGetItemView(true, items, 0, { is_backpack: true });
    // }
    gcore.Timer.del("fail_result_timer");
    this.handleEffect(false);
 
    if (this.model.getBattleScene() && this.ctrl.getIsSameBattleType(this.fight_type)) {
      var data = {
        combat_type: this.fight_type,
        result: this.result
      };
      this.model.result(data, null);
    }
 
    this.ctrl.openFailFinishView(false, this.fight_type);
    gcore.GlobalEvent.fire(BattleEvent.CLOSE_RESULT_VIEW, this.fight_type);
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXHZpZXdcXGJhdHRsZV9mYWlsX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkJhdHRsZUNvbnRyb2xsZXIiLCJCYXR0bGVEcmFtYUNvbnRyb2xsZXIiLCJCYXR0bGVDb25zdCIsIkJhdHRsZUV2ZW50IiwiQmF0dGxlX2ZhaWxXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwiZGlhbG9ndWUiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJNaW5pIiwiaXNfZnVsbF9zY3JlZW4iLCJmaWdodF90eXBlIiwiYXJndW1lbnRzIiwicmVzdWx0IiwiZGF0YSIsImluaXRDb25maWciLCJyb2xlX3ZvIiwiZ2V0SW5zdGFuY2UiLCJnZXRSb2xlVm8iLCJjdHJsIiwibW9kZWwiLCJnZXRNb2RlbCIsImRyYW1hX2N0cmwiLCJqdW1wX2N0cmwiLCJpc19ydW5uaW5nIiwiZWZmZWN0X2xpc3QiLCJ4Iiwib3BlbkNhbGxCYWNrIiwic291cmNlX2NvbnRhaW5lciIsInNlZWtDaGlsZCIsInRpdGxlX2NvbnRhaW5lciIsInRpdGxlX3dpZHRoIiwiZ2V0Q29udGVudFNpemUiLCJ3aWR0aCIsInRpdGxlX2hlaWdodCIsImhlaWdodCIsImJ0biIsInNwZWNpYWxfc2siLCJzcCIsIlNrZWxldG9uIiwiYmFja2dyb3VuZCIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsImZ1bmMiLCJjcmVhdGVCdXR0b24iLCJiaW5kIiwicnVuQWN0aW9uIiwic2VxdWVuY2UiLCJmYWRlSW4iLCJjYWxsRnVuYyIsImNvbWZpcm1fYnRuIiwiaGVscF9idG4iLCJ0aW1lX2xhYmVsX3J0IiwiUmljaFRleHQiLCJoYXJtX2J0biIsImh1cnRfc3RhdGlzdGljcyIsImFjdGl2ZSIsImhhbmRsZUVmZmVjdCIsInJlZ2lzdGVyRXZlbnQiLCJVdGlscyIsIm9uVG91Y2hFbmQiLCJvcGVuRmFpbEZpbmlzaFZpZXciLCJuZXh0Iiwib3BlbkJhdHRsZUhhcm1JbmZvVmlldyIsImp1bXBWaWV3QnlFdnREYXRhIiwiYnRuX2xpc3QiLCJiYXNlX2RhdGEiLCJnZXREcmFtYURhdGEiLCJjb25maWciLCJDb25maWciLCJiYXR0bGVfYWN0X2RhdGEiLCJkYXRhX2dldF9mYWlsX2RhdGEiLCJtYXhfZHVuX2lkIiwiaSIsInYiLCJvcGVuX2R1bmdlb24iLCJwdXNoIiwiaXRlbXNfbGlzdCIsImNsZWFySXRlbXMiLCJsZW5ndGgiLCJNYXRoIiwibWluIiwiZ29fYnRuIiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwib3BlblBhbmVsQnlDb25maWciLCJvYmoiLCJ2YWxfa2V5IiwiaW1nIiwiZ2V0Q29tcG9uZW50IiwiU3ByaXRlIiwibGFiZWwiLCJMYWJlbCIsImxvYWRSZXMiLCJnZXRVSUljb25QYXRoIiwiaWNvbiIsImJnX3NmIiwic3ByaXRlRnJhbWUiLCJzdHJpbmciLCJpY29uX25hbWUiLCJidG5fbGFiZWwiLCJ1cGRhdGVUaW1lciIsInRpbWUiLCJjYWxsX2JhY2siLCJuZXdfdGltZSIsImNlaWwiLCJzdHIiLCJUSTE4TiIsImdjb3JlIiwiVGltZXIiLCJkZWwiLCJzZXQiLCJzdGF0dXMiLCJzZXRUb1NldHVwUG9zZSIsImNsZWFyVHJhY2tzIiwibm9kZSIsInJlcyIsImpzIiwiZm9ybWF0U3RyIiwiZ2V0RWZmZWN0UmVzIiwicmVzX29iamVjdCIsInNrZWxldG9uRGF0YSIsInNldEFuaW1hdGlvbiIsIlBsYXllckFjdGlvbiIsImFjdGlvbiIsImsiLCJKdW1wVHlwZSIsIlN1bW1vbiIsIkhlcm9CYWciLCJGb3JnZSIsIkhhbGxvd3MiLCJvcGVuUm9vdFduZCIsInBhcmFtcyIsImNsb3NlQ2FsbEJhY2siLCJnZXRCYXR0bGVTY2VuZSIsImdldElzU2FtZUJhdHRsZVR5cGUiLCJjb21iYXRfdHlwZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIkNMT1NFX1JFU1VMVF9WSUVXIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsY0FBYyxHQUFHRCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUUsZ0JBQWdCLEdBQUdGLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJRyxxQkFBcUIsR0FBR0gsT0FBTyxDQUFDLHlCQUFELENBQW5DOztBQUNBLElBQUlJLFdBQVcsR0FBR0osT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBQ0EsSUFBSUssV0FBVyxHQUFHTCxPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFFQSxJQUFJTSxpQkFBaUIsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDN0IsYUFBU0MsUUFEb0I7QUFFN0JDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFNBQUtDLFVBQUwsR0FBa0JaLFFBQVEsQ0FBQ2EsYUFBVCxDQUF1QixRQUF2QixFQUFpQyxrQkFBakMsQ0FBbEI7QUFDQSxTQUFLQyxPQUFMLEdBQWVDLFNBQVMsQ0FBQ0MsUUFBekIsQ0FGYyxDQUVvQzs7QUFDbEQsU0FBS0MsUUFBTCxHQUFnQkMsT0FBTyxDQUFDQyxJQUF4QixDQUhjLENBRzhCOztBQUM1QyxTQUFLQyxjQUFMLEdBQXNCLEtBQXRCO0FBRUEsU0FBS0MsVUFBTCxHQUFrQkMsU0FBUyxDQUFDLENBQUQsQ0FBM0I7QUFDQSxTQUFLQyxNQUFMLEdBQWNELFNBQVMsQ0FBQyxDQUFELENBQXZCO0FBQ0EsU0FBS0UsSUFBTCxHQUFZRixTQUFTLENBQUMsQ0FBRCxDQUFyQjtBQUNILEdBWDRCO0FBYTdCO0FBQ0FHLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixTQUFLQyxPQUFMLEdBQWV4Qixj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QUFrQmhHLFdBQVcsQ0FBQ3VJLFFBQVosQ0FBcUJJLE9BQTNDLEVBQ0QsS0FBSy9HLFNBQUwsQ0FBZTJDLGlCQUFmLENBQWlDLENBQUMsRUFBRCxDQUFqQztBQUNQLEdBMUw0QjtBQTRMN0I7QUFDQXFFLEVBQUFBLFdBQVcsRUFBRSxxQkFBVUMsTUFBVixFQUFrQixDQUU5QixDQS9MNEI7QUFpTTdCO0FBQ0FDLEVBQUFBLGFBQWEsRUFBRSx5QkFBWTtBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUF6QixJQUFBQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsR0FBWixDQUFnQixtQkFBaEI7QUFDQSxTQUFLdkQsWUFBTCxDQUFrQixLQUFsQjs7QUFFQSxRQUFJLEtBQUt2QyxLQUFMLENBQVdzSCxjQUFYLE1BQStCLEtBQUt2SCxJQUFMLENBQVV3SCxtQkFBVixDQUE4QixLQUFLaEksVUFBbkMsQ0FBbkMsRUFBbUY7QUFDL0UsVUFBSUcsSUFBSSxHQUFHO0FBQUU4SCxRQUFBQSxXQUFXLEVBQUUsS0FBS2pJLFVBQXBCO0FBQWdDRSxRQUFBQSxNQUFNLEVBQUUsS0FBS0E7QUFBN0MsT0FBWDtBQUNBLFdBQUtPLEtBQUwsQ0FBV1AsTUFBWCxDQUFrQkMsSUFBbEIsRUFBd0IsSUFBeEI7QUFDSDs7QUFDRCxTQUFLSyxJQUFMLENBQVU0QyxrQkFBVixDQUE2QixLQUE3QixFQUFvQyxLQUFLcEQsVUFBekM7QUFDQXFHLElBQUFBLEtBQUssQ0FBQzZCLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCbEosV0FBVyxDQUFDbUosaUJBQW5DLEVBQXNELEtBQUtwSSxVQUEzRDtBQUVIO0FBMU40QixDQUFULENBQXhCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6L+Z6YeM5piv5o+P6L+w6L+Z5Liq56qX5L2T55qE5L2c55So55qEXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMy0yOCAxNTowMTo1OFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBSb2xlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJyb2xlX2NvbnRyb2xsZXJcIik7XG52YXIgQmF0dGxlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKTtcbnZhciBCYXR0bGVEcmFtYUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmF0dGxlX2RyYW1hX2NvbnRyb2xsZXJcIik7XG52YXIgQmF0dGxlQ29uc3QgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnN0XCIpO1xudmFyIEJhdHRsZUV2ZW50ID0gcmVxdWlyZShcImJhdHRsZV9ldmVudFwiKTtcblxudmFyIEJhdHRsZV9mYWlsV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImJhdHRsZVwiLCBcImJhdHRsZV9mYWlsX3ZpZXdcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy5kaWFsb2d1ZTsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLk1pbmk7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgICAgIHRoaXMuaXNfZnVsbF9zY3JlZW4gPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmZpZ2h0X3R5cGUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgIHRoaXMucmVzdWx0ID0gYXJndW1lbnRzWzFdO1xuICAgICAgICB0aGlzLmRhdGEgPSBhcmd1bWVudHNbMl07XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgIHRoaXMuY3RybCA9IEJhdHRsZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgICAgICB0aGlzLmRyYW1hX2N0cmwgPSBCYXR0bGVEcmFtYUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgdGhpcy5qdW1wX2N0cmwgPSByZXF1aXJlKFwianVtcF9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG5cbiAgICAgICAgdGhpcy5pc19ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZWZmZWN0X2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy54ID0gMTAwO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGxvY2FsIHNvdW5kX2lkID0gXCJiX2xvc2VcIlxuICAgICAgICAvLyBpZiBzb3VuZF9pZCB+PSBcIlwiIHRoZW5cbiAgICAgICAgLy8gICAgIEF1ZGlvTWFuYWdlcjpnZXRJbnN0YW5jZSgpOnBsYXlNdXNpYyhBdWRpb01hbmFnZXIuQVVESU9fVFlQRS5CQVRUTEUsIHNvdW5kX2lkLCBmYWxzZSlcbiAgICAgICAgLy8gZW5kXG4gICAgICAgIHRoaXMuc291cmNlX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKFwiY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLnRpdGxlX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKFwidGl0bGVfY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLnRpdGxlX3dpZHRoID0gdGhpcy50aXRsZV9jb250YWluZXIuZ2V0Q29udGVudFNpemUoKS53aWR0aDtcbiAgICAgICAgdGhpcy50aXRsZV9oZWlnaHQgPSB0aGlzLnRpdGxlX2NvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpLmhlaWdodDtcbiAgICAgICAgdGhpcy5idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNvdXJjZV9jb250YWluZXIsIFwiYnRuXCIpO1xuICAgICAgICB0aGlzLnNwZWNpYWxfc2sgPSB0aGlzLnNlZWtDaGlsZChcInRpdGxlX2NvbnRhaW5lclwiLCBzcC5Ta2VsZXRvbik7XG5cbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcImJhY2tncm91bmRcIik7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcblxuICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQnV0dG9uKClcbiAgICAgICAgICAgIHRoaXMuaXNfcnVubmluZyA9IGZhbHNlO1xuICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5zb3VyY2VfY29udGFpbmVyLnJ1bkFjdGlvbihjYy5zZXF1ZW5jZShjYy5mYWRlSW4oMCwgMiksIGNjLmNhbGxGdW5jKGZ1bmMpKSlcblxuICAgICAgICB0aGlzLmNvbWZpcm1fYnRuID0gdGhpcy5zZWVrQ2hpbGQoXCJjb21maXJtX2J0blwiKVxuICAgICAgICB0aGlzLmhlbHBfYnRuID0gdGhpcy5zZWVrQ2hpbGQoXCJoZWxwX2J0blwiKVxuXG4gICAgICAgIHRoaXMudGltZV9sYWJlbF9ydCA9IHRoaXMuc2Vla0NoaWxkKFwidGltZV9sYWJlbFwiLCBjYy5SaWNoVGV4dCk7XG4gICAgICAgIHRoaXMuaGFybV9idG4gPSB0aGlzLnNlZWtDaGlsZChcImhhcm1fYnRuXCIpO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmh1cnRfc3RhdGlzdGljcykge1xuICAgICAgICAgICAgdGhpcy5oYXJtX2J0bi5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYXJtX2J0bi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KHRydWUpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuY29tZmlybV9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuRmFpbEZpbmlzaFZpZXcoZmFsc2UsIHRoaXMuZmlnaHRfdHlwZSlcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuaGFybV9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgVXRpbHMubmV4dCh0aGlzLmRhdGEpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3BlbkJhdHRsZUhhcm1JbmZvVmlldyh0cnVlLCB0aGlzLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5oZWxwX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5GYWlsRmluaXNoVmlldyhmYWxzZSwgdGhpcy5maWdodF90eXBlKVxuICAgICAgICAgICAgdGhpcy5qdW1wX2N0cmwuanVtcFZpZXdCeUV2dERhdGEoWzE2XSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSlcbiAgICB9LFxuXG4gICAgY3JlYXRlQnV0dG9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBidG5fbGlzdCA9IFtdO1xuICAgICAgICB2YXIgYmFzZV9kYXRhID0gdGhpcy5kcmFtYV9jdHJsLmdldE1vZGVsKCkuZ2V0RHJhbWFEYXRhKCk7XG5cbiAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5iYXR0bGVfYWN0X2RhdGEuZGF0YV9nZXRfZmFpbF9kYXRhO1xuICAgICAgICBpZiAoY29uZmlnICYmIGJhc2VfZGF0YSkge1xuICAgICAgICAgICAgdmFyIG1heF9kdW5faWQgPSBiYXNlX2RhdGEubWF4X2R1bl9pZDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBjb25maWdbaV07XG4gICAgICAgICAgICAgICAgaWYgKHYub3Blbl9kdW5nZW9uIDw9IG1heF9kdW5faWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnRuX2xpc3QucHVzaCh2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXRlbXNfbGlzdCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zX2xpc3QgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFySXRlbXMoKTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IE1hdGgubWluKDQsIGJ0bl9saXN0Lmxlbmd0aCk7XG4gICAgICAgIHZhciBmdW5jID0gZnVuY3Rpb24gKGdvX2J0biwgY29uZmlnKSB7XG4gICAgICAgICAgICBnb19idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuUGFuZWxCeUNvbmZpZyhjb25maWcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuRmFpbEZpbmlzaFZpZXcoZmFsc2UsIHRoaXMuZmlnaHRfdHlwZSk7XG4gICAgICAgICAgICB9LCB0aGlzKVxuICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGJ0bl9saXN0W2ldO1xuICAgICAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgICAgIHZhciBvYmogPSB7fTtcbiAgICAgICAgICAgICAgICBvYmouYnRuID0gdGhpcy5zZWVrQ2hpbGQoXCJidG5fXCIgKyBjb25maWcudmFsX2tleSk7XG4gICAgICAgICAgICAgICAgb2JqLmltZyA9IG9iai5idG4uZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgICAgICAgICAgb2JqLmxhYmVsID0gdGhpcy5zZWVrQ2hpbGQob2JqLmJ0biwgXCJsYWJlbFwiLCBjYy5MYWJlbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJiYXR0bGVmYWlsXCIsIGNvbmZpZy5pY29uKSwgZnVuY3Rpb24gKGJnX3NmKSB7XG4gICAgICAgICAgICAgICAgICAgIG9iai5pbWcuc3ByaXRlRnJhbWUgPSBiZ19zZjtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIG9iai5sYWJlbC5zdHJpbmcgPSBjb25maWcuaWNvbl9uYW1lO1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNfbGlzdFtpXSA9IG9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBnb19idG4gPSB0aGlzLml0ZW1zX2xpc3RbaV0uYnRuO1xuICAgICAgICAgICAgdmFyIGJ0bl9sYWJlbCA9IHRoaXMuaXRlbXNfbGlzdFtpXS5sYWJlbDtcbiAgICAgICAgICAgIGlmIChnb19idG4pIHtcbiAgICAgICAgICAgICAgICBnb19idG4uYWN0aXZlID0gdHJ1ZTs7XG4gICAgICAgICAgICAgICAgZnVuYyhnb19idG4sIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnRuX2xhYmVsKSB7XG4gICAgICAgICAgICAgICAgYnRuX2xhYmVsLnN0cmluZyA9IGNvbmZpZy5pY29uX25hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVUaW1lcigpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVUaW1lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGltZSA9IDU7XG4gICAgICAgIHZhciBjYWxsX2JhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aW1lID0gdGltZSAtIDFcbiAgICAgICAgICAgIHZhciBuZXdfdGltZSA9IE1hdGguY2VpbCh0aW1lKTtcbiAgICAgICAgICAgIHZhciBzdHIgPSBuZXdfdGltZSArIFV0aWxzLlRJMThOKFwi56eS5ZCO5YWz6ZetXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZV9sYWJlbF9ydCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZV9sYWJlbF9ydC5zdHJpbmcgPSBzdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV3X3RpbWUgPD0gMCkge1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbChcImZhaWxfcmVzdWx0X3RpbWVyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuRmFpbEZpbmlzaFZpZXcoZmFsc2UsIHRoaXMuZmlnaHRfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICBnY29yZS5UaW1lci5zZXQoY2FsbF9iYWNrLCAxMDAwLCAtMSwgXCJmYWlsX3Jlc3VsdF90aW1lclwiKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlRWZmZWN0OiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNwZWNpYWxfc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxfc2suc2V0VG9TZXR1cFBvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxfc2suY2xlYXJUcmFja3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxfc2subm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNwZWNpYWxfc2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxfc2subm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciByZXMgPSBjYy5qcy5mb3JtYXRTdHIoXCJzcGluZS8lcy9hY3Rpb24uYXRsYXNcIiwgUGF0aFRvb2wuZ2V0RWZmZWN0UmVzKDEwNCkpXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHJlc19vYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsX3NrLnNrZWxldG9uRGF0YSA9IHJlc19vYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbF9zay5zZXRBbmltYXRpb24oMSwgUGxheWVyQWN0aW9uLmFjdGlvbiwgZmFsc2UpXG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFySXRlbXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNfbGlzdCkge1xuICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLml0ZW1zX2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMuaXRlbXNfbGlzdFtrXTtcbiAgICAgICAgICAgICAgICBpZiAodi5idG4pIHtcbiAgICAgICAgICAgICAgICAgICAgdi5idG4uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9wZW5QYW5lbEJ5Q29uZmlnOiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcudmFsX2tleSA9PSBCYXR0bGVDb25zdC5KdW1wVHlwZS5TdW1tb24pXG4gICAgICAgICAgICB0aGlzLmp1bXBfY3RybC5qdW1wVmlld0J5RXZ0RGF0YShbMV0pXG4gICAgICAgIGVsc2UgaWYgKGNvbmZpZy52YWxfa2V5ID09IEJhdHRsZUNvbnN0Lkp1bXBUeXBlLkhlcm9CYWcpXG4gICAgICAgICAgICB0aGlzLmp1bXBfY3RybC5qdW1wVmlld0J5RXZ0RGF0YShbMTldKVxuICAgICAgICBlbHNlIGlmIChjb25maWcudmFsX2tleSA9PSBCYXR0bGVDb25zdC5KdW1wVHlwZS5Gb3JnZSlcbiAgICAgICAgICAgIHRoaXMuanVtcF9jdHJsLmp1bXBWaWV3QnlFdnREYXRhKFsyNl0pXG4gICAgICAgIGVsc2UgaWYgKGNvbmZpZy52YWxfa2V5ID09IEJhdHRsZUNvbnN0Lkp1bXBUeXBlLkhhbGxvd3MpXG4gICAgICAgICAgICB0aGlzLmp1bXBfY3RybC5qdW1wVmlld0J5RXZ0RGF0YShbMjBdKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKHBhcmFtcykge1xuXG4gICAgfSxcblxuICAgIC8vIOWFs+mXreeql+S9k+WbnuiwgyzpnIDopoHlnKjov5nph4zosIPnlKjor6XnqpfkvZPmiYDlsZ5jb250cm9sbGVy55qEY2xvc2Xmlrnms5XmsqHnlKjkuo7nva7nqbror6XnqpfkvZPlrp7kvovlr7nosaFcbiAgICBjbG9zZUNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgLy8gLy/ogZTnm5/miJjmiJjotKXmnInlpZblirHpnIDopoHlsZXnpLpcbiAgICAgICAgLy8gaWYgKHRoaXMuZmlnaHRfdHlwZSA9PSBCYXR0bGVDb25zdC5GaWdodF9UeXBlLkd1aWxkV2FyICYmIHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuaXRlbV9yZXdhcmRzKSB7XG4gICAgICAgIC8vICAgICB2YXIgaXRlbXMgPSB7fTtcbiAgICAgICAgLy8gICAgIGZvciAodmFyIGkgaW4gdGhpcy5kYXRhLml0ZW1fcmV3YXJkcykge1xuICAgICAgICAvLyAgICAgICAgIHZhciB2ID0gdGhpcy5kYXRhLml0ZW1fcmV3YXJkc1tpXTtcbiAgICAgICAgLy8gICAgICAgICBpdGVtc1tpXSA9IHt9O1xuICAgICAgICAvLyAgICAgICAgIGl0ZW1zW2ldLmJpZCA9IHYuYmlkO1xuICAgICAgICAvLyAgICAgICAgIGl0ZW1zW2ldLm51bSA9IHYubnVtO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkdldEl0ZW1WaWV3KHRydWUsIGl0ZW1zLCAwLCB7IGlzX2JhY2twYWNrOiB0cnVlIH0pO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgZ2NvcmUuVGltZXIuZGVsKFwiZmFpbF9yZXN1bHRfdGltZXJcIik7XG4gICAgICAgIHRoaXMuaGFuZGxlRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmdldEJhdHRsZVNjZW5lKCkgJiYgdGhpcy5jdHJsLmdldElzU2FtZUJhdHRsZVR5cGUodGhpcy5maWdodF90eXBlKSkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB7IGNvbWJhdF90eXBlOiB0aGlzLmZpZ2h0X3R5cGUsIHJlc3VsdDogdGhpcy5yZXN1bHQgfTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwucmVzdWx0KGRhdGEsIG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdHJsLm9wZW5GYWlsRmluaXNoVmlldyhmYWxzZSwgdGhpcy5maWdodF90eXBlKTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShCYXR0bGVFdmVudC5DTE9TRV9SRVNVTFRfVklFVywgdGhpcy5maWdodF90eXBlKVxuXG4gICAgfSxcbn0pIl19