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
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/ladder/view/ladder_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, 'e7e11Sjh5FGaaMKEg8kuLGU', 'ladder_main_window');
// Scripts/mod/ladder/view/ladder_main_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     跨服天梯mainview
// <br/>Create: 2019-07-24 16:56:38
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var RoleController = require("role_controller");
 
var LadderController = require("ladder_controller");
 
var LadderRoleItem = require("ladder_role_item");
 
var TimeTool = require("timetool");
 
var MainuiController = require("mainui_controller");
 
var CommonAlert = require("commonalert");
 
var LadderConst = require("ladder_const");
 
var LadderEvent = require("ladder_event");
 
var Ladder_mainWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("ladder", "ladder_main_window"); // this.viewTag = SCENE_TAG.ui;                //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
    // this.win_type = WinType.Full;               //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.role_vo = RoleController.getInstance().getRoleVo();
    this.role_panels = {};
    this.role_items = {};
    this.ctrl = LadderController.getInstance();
    this.model = this.ctrl.getModel();
    this.white_color = new cc.Color(255, 255, 255, 255);
    this.color_1 = new cc.Color(71, 132, 37, 255);
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    var background = this.seekChild("background");
    background.scale = FIT_SCALE;
    this.loadRes(PathTool.getBigBg("bigbg_58"), function (sp) {
      background.getComponent(cc.Sprite).spriteFrame = sp;
    }.bind(this));
    this.main_container = this.seekChild("main_container");
    this.top_panel = this.seekChild(this.main_container, "top_panel");
    var win_title = this.seekChild(this.top_panel, "win_title", cc.Label);
    win_title.string = Utils.TI18N("天梯争霸");
    this.btn_rule = this.seekChild(this.top_panel, "btn_rule");
    this.btn_role = this.seekChild(this.top_panel, "btn_role");
    this.btn_log = this.seekChild(this.top_panel, "btn_log");
    this.btn_rank = this.seekChild(this.top_panel, "btn_rank");
    this.btn_award = this.seekChild(this.top_panel, "btn_award");
    this.btn_shop = this.seekChild(this.top_panel, "btn_shop");
    this.bottom_panel = this.seekChild(this.main_container, "bottom_panel");
    var black_bg = this.seekChild(this.bottom_panel, "black_bg");
    var count_title = this.seekChild(this.bottom_panel, "count_title", cc.Label);
    count_title.string = Utils.TI18N("挑战次数:");
    this.count_label_lb = this.seekChild(this.bottom_panel, "count_label", cc.Label);
    var tips_label = this.seekChild(this.main_container, "tips_label", cc.Label);
    tips_label.string = Utils.TI18N("快速挑战排名不变");
    this.time_title_lb = this.seekChild(this.bottom_panel, "time_title", cc.Label);
    this.time_title_lb.string = Utils.TI18N("距离结束:");
    this.time_label_lb = this.seekChild(this.bottom_panel, "time_label", cc.Label);
    var score_bg = this.seekChild(this.main_container, "score_bg");
    this.score_label_lb = this.seekChild(score_bg, "score_label", cc.Label);
    this.score_label_lb.string = this.role_vo.sky_coin;
    var rank_bg = this.seekChild(this.main_container, "rank_bg");
    var rank_title = this.seekChild(rank_bg, "rank_title", cc.Label);
    rank_title.string = Utils.TI18N("排名:");
    this.rank_label_lb = this.seekChild(rank_bg, "rank_label", cc.Label);
    this.close_btn = this.seekChild(this.main_container, "close_btn");
    this.refresh_btn = this.seekChild(this.main_container, "refresh_btn");
    this.refresh_btn._can_touch = true;
    this.refresh_btn_label_lb = this.seekChild(this.refresh_btn, "label", cc.Label);
    this.refresh_btn_label_lo = this.seekChild(this.refresh_btn, "label", cc.LabelOutline);
    this.refresh_btn_label_lb.string = Utils.TI18N("刷新");
    this.challenge_btn = this.seekChild(this.main_container, "challenge_btn");
    this.challenge_btn_label_lb = this.seekChild(this.challenge_btn, "label", cc.Label);
    this.challenge_btn_label_lb.string = Utils.TI18N("一键挑战");
    this.add_btn = this.seekChild(this.bottom_panel, "add_btn");
 
    for (var i = 1; i <= 5; i++) {
      var role_panel = this.seekChild(this.main_container, "role_pos_" + i);
      this.role_panels[i] = role_panel;
    }
 
    this.role_panel_size = this.role_panels[1].getContentSize();
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    Utils.onTouchEnd(this.close_btn, function () {
      this.ctrl.openMainWindow(false);
    }.bind(this), 1);
    Utils.onTouchEnd(this.btn_rule, function () {
      MainuiController.getInstance().openCommonExplainView(true, Config.sky_ladder_data.data_explain);
    }.bind(this), 1);
    Utils.onTouchEnd(this.btn_role, function () {
      this.ctrl.openLadderTopThreeWindow(true);
    }.bind(this), 1);
    Utils.onTouchEnd(this.btn_log, function () {
      this.ctrl.openLadderLogWindow(true);
    }.bind(this), 1);
    Utils.onTouchEnd(this.btn_rank, function () {
      this.ctrl.openLadderRankWindow(true);
    }.bind(this), 1);
    Utils.onTouchEnd(this.btn_award, function () {
      this.ctrl.openLadderAwardWindow(true);
    }.bind(this), 1);
    Utils.onTouchEnd(this.btn_shop, function () {
      this.ctrl.openLadderShopWindow(true);
    }.bind(this), 1); //添加挑战次数
 
    Utils.onTouchEnd(this.add_btn, function () {
      var is_open = this.model.getLadderIsOpen();
 
      if (!is_open) {
        var txt_cfg = Config.sky_ladder_data.data_const["close_text"];
 
        if (txt_cfg) {
          message(cc.js.formatStr(Utils.TI18N("每%s天梯争霸"), txt_cfg.desc));
        }
      }
 
      if (this.myBaseInfo) {
        var buy_combat_num = this.myBaseInfo.buy_combat_num || 0;
        var cost_config = Config.sky_ladder_data.data_buy_num[buy_combat_num + 1];
 
        if (cost_config) {
          if (this.role_vo.vip_lev >= cost_config.vip) {
            var res = PathTool.getItemRes(Config.ItemData.data_assets_label2id.gold);
            var msg = cc.js.formatStr(Utils.TI18N("确定消耗<img src='%s'/>%s增加一次挑战次数吗?"), Config.ItemData.data_assets_label2id.gold, cost_config.cost);
            CommonAlert.show(msg, Utils.TI18N("确定"), function () {
              this.ctrl.requestBuyChallengeCount();
            }.bind(this), Utils.TI18N("取消"), null, 2, null, {
              resArr: [res]
            });
          } else {
            message(Utils.TI18N("提升VIP等级可增加购买次数"));
          }
        } else {
          message(Utils.TI18N("当前已经购买达到上限"));
        }
      }
    }.bind(this), 1);
    Utils.onTouchEnd(this.refresh_btn, function () {
      var is_open = this.model.getLadderIsOpen();
 
      if (is_open) {
        this.ctrl.requestRefreshEnemyList();
      } else {
        var txt_cfg = Config.sky_ladder_data.data_const["clost_text"];
 
        if (txt_cfg) {
          message(cc.js.formatStr(Utils.TI18N("每%s天梯争霸"), txt_cfg.desc));
        }
      }
    }.bind(this), 1);
    Utils.onTouchEnd(this.challenge_btn, function () {
      var is_open = this.model.getLadderIsOpen();
 
      if (!is_open) {
        var txt_cfg = Config.sky_ladder_data.data_const["close_text"];
 
        if (txt_cfg) {
          message(cc.js.formatStr(Utils.TI18N("每%s天梯争霸"), txt_cfg.desc));
        }
 
        return;
      }
 
      var fun = function () {
        this.ctrl.checkJoinLadderBattle(null, null, true);
      }.bind(this);
 
      var str = Utils.TI18N("一键挑战将直接获得奖励,是否继续?\n\n\n                          <size=22>(消耗一次挑战次数)</size>");
      CommonAlert.show(str, Utils.TI18N("确定"), fun, Utils.TI18N("取消"), null, 2, null);
    }.bind(this), 1); //个人数据更新
 
    this.addGlobalEvent(LadderEvent.UpdateLadderMyBaseInfo, function () {
      this.refreshMyBaseInfo();
    }, this); //更新所有对手列表
 
    this.addGlobalEvent(LadderEvent.UpdateAllLadderEnemyList, function () {
      this.refreshRoleList();
    }, this); //积分更新
 
    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 == "sky_coin") {
            this.score_label_lb.string = value;
          }
        }.bind(this));
      }
    } //活动开启/关闭
 
 
    this.addGlobalEvent(LadderEvent.UpdateLadderOpenStatus, function () {
      this.refreshMyBaseInfo();
    }, this); //红点
 
    this.addGlobalEvent(LadderEvent.UpdateLadderRedStatus, function () {
      this.refrehsBtnRedStatus(bid, status);
    }, this);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    this.ctrl.requestLadderMyBaseInfo();
    this.ctrl.requestLadderEnemyListData();
    this.refrehsBtnRedStatus();
  },
  refreshRoleList: function refreshRoleList() {
    var enemy_datas = this.model.getLadderEnemyListData();
    cc.log("enemy_datas==", enemy_datas);
 
    var sortFunc = function sortFunc(objA, objB) {
      if (objA.rank != 0 && objB.rank != 0) {
        return objA.rank - objB.rank;
      } else if (objA.rank == 0 && objB.rank != 0) {
        return 1;
      } else if (objA.rank != 0 && objB.rank == 0) {
        return -1;
      } else {
        return 1;
      }
    }; // enemy_datas.sort(sortFunc);
    //循环
 
 
    this.list_index = 1;
    this.startUpdate(5, function () {
      var index = this.list_index;
      var role_item = this.role_items[index];
 
      if (!role_item) {
        role_item = new LadderRoleItem();
        var role_panel = this.role_panels[index];
        role_item.setPosition(cc.v2(this.role_panel_size.width / 2, this.role_panel_size.height - 140));
        role_item.setParent(role_panel);
        this.role_items[index] = role_item;
      }
 
      var enemy_data = enemy_datas[index];
 
      if (enemy_data && Utils.next(enemy_data) != null) {
        role_item.setData(enemy_data);
        role_item.setVisible(true);
      } else {
        role_item.setVisible(false);
      }
 
      this.list_index += 1;
    }.bind(this), 1000 / 5);
  },
  //刷新个人信息数据
  refreshMyBaseInfo: function refreshMyBaseInfo() {
    this.myBaseInfo = this.model.getLadderMyBaseInfo();
    var is_open = this.model.getLadderIsOpen();
    this.count_label_lb.string = this.myBaseInfo.can_combat_num || 0; //今日剩余购买次数
 
    if (!this.left_buy_count) {
      this.left_buy_count = Utils.createRichLabel(20, this.white_color, cc.v2(0.5, 0.5), cc.v2(590, 10));
      this.left_buy_count.setParent(this.bottom_panel);
    }
 
    var left_count = this.model.getTodayLeftBuyCount();
    this.left_buy_count.string = cc.js.formatStr(Utils.TI18N("<color=#fff8bf><outline=2 color=#000000>(剩余购买次数:</outline></c><color=#39e522><outline=2 color=#000000>%d</outline></c><color=#fff8bf><outline=2 color=#000000>)</outline></c>", left_count));
 
    if (!is_open || !this.myBaseInfo.rank || this.myBaseInfo.rank == 0) {
      this.rank_label_lb.string = Utils.TI18N("暂无");
    } else {
      this.rank_label_lb.string = this.myBaseInfo.rank;
    }
 
    this.ref_time = this.myBaseInfo.ref_time || 0; //下次可刷新时间
 
    this.combat_time = this.myBaseInfo.combat_time || 0; //结束时间
 
    var cur_time = gcore.SmartSocket.getTime();
    var com_left_time = this.combat_time - cur_time;
 
    if (com_left_time < 0) {
      com_left_time = 0;
    } //活动开启显示剩余时间、活动未开启显示参赛条件
 
 
    if (!is_open) {
      this.time_label_lb.node.active = false;
      this.time_title_lb.node.active = false;
 
      if (!this.join_text) {
        this.join_text = Utils.createRichLabel(22, this.white_color, cc.v2(0.5, 0.5), cc.v2(346, 38.5));
        this.join_text.setParent(this.bottom_panel);
      }
 
      this.join_text.node.active = true;
      var rank_cfg = Config.sky_ladder_data.data_const["arena_rank"];
 
      if (rank_cfg) {
        this.join_text.string = cc.js.formatStr(Utils.TI18N("color=#fff8bf><outline=2 color=#000000>参赛条件:竞技场排名前</outline></c>color=#39e522><outline=2 color=#000000>%d</outline></c>color=#fff8bf><outline=2 color=#000000>名</outline></c>", rank_cfg.val));
      }
    } else {
      this.time_label_lb.node.active = true;
      this.time_title_lb.node.active = true;
      this.time_label_lb.string = TimeTool.getTimeFormat(com_left_time);
 
      if (this.join_text) {
        this.join_text.node.active = false;
      }
 
      this.openLadderTimer(true);
    }
 
    var ref_left_time = this.ref_time - cur_time;
 
    if (ref_left_time <= 0 && this.refresh_btn._can_touch == false) {
      // setChildUnEnabled(true, self.refresh_btn)
      this.refresh_btn._can_touch = true;
      this.refresh_btn_label_lb.string = Utils.TI18N("刷新"); // this.refresh_btn_label_lo.color = this.color_1;
 
      this.refresh_btn_label_lo.enabled = true;
    } else if (ref_left_time > 0 && this.refresh_btn._can_touch == true) {
      // setChildUnEnabled(true, self.refresh_btn)
      this.refresh_btn._can_touch = false;
      this.refresh_btn_label_lb.string = cc.js.formatStr(Utils.TI18N("%s秒"), ref_left_time);
      this.refresh_btn_label_lo.enabled = false;
    }
  },
  //计时器
  openLadderTimer: function openLadderTimer(status) {
    if (status == true) {
      if (this.ladder_timer == null) {
        this.ladder_timer = gcore.Timer.set(function () {
          var cur_time = gcore.SmartSocket.getTime();
          var com_left_time = this.combat_time - cur_time;
          var ref_left_time = this.ref_time - cur_time;
 
          if (com_left_time <= 0 && ref_left_time <= 0) {
            gcore.Timer.del(this.ladder_timer);
            this.ladder_timer = null;
          }
 
          if (com_left_time < 0) {
            com_left_time = 0;
          }
 
          if (com_left_time <= 0) {
            this.time_label_lb.node.active = false;
            this.time_title_lb.node.active = false;
 
            if (this.join_text) {
              this.join_text.node.active = true;
            }
          } else {
            this.time_label_lb.node.active = true;
            this.time_title_lb.node.active = true;
            this.time_label_lb.string = TimeTool.getTimeFormat(com_left_time);
          }
 
          if (ref_left_time <= 0) {
            if (this.refresh_btn._can_touch == false) {
              this.refresh_btn._can_touch = true; // this.refresh_btn_label_lo.color = this.color_1;
              // setChildUnEnabled(true, self.refresh_btn)
            }
 
            this.refresh_btn_label_lb.string = Utils.TI18N("刷新");
          } else if (ref_left_time > 0) {
            if (this.refresh_btn._can_touch == true) {
              // setChildUnEnabled(true, self.refresh_btn)
              this.refresh_btn._can_touch = false;
              this.refresh_btn_label_lo.enabled = false;
            }
 
            this.refresh_btn_label_lb.string = cc.js.formatStr(Utils.TI18N("%s秒"), ref_left_time);
          }
        }.bind(this), 1000, 1);
      }
    } else {
      if (this.ladder_timer != null) {
        gcore.Timer.del(this.ladder_timer);
        this.ladder_timer = null;
      }
    }
  },
  //红点
  refrehsBtnRedStatus: function refrehsBtnRedStatus(bid, status) {
    if (bid == LadderConst.RedType.TopThree) {
      Utils.addRedPointToNodeByStatus(this.btn_role, status);
    } else if (bid == LadderConst.RedType.BattleLog) {
      Utils.addRedPointToNodeByStatus(this.btn_log, status);
    } else {
      var top_three_status = this.model.checkRedIsShowByRedType(LadderConst.RedType.TopThree);
      Utils.addRedPointToNodeByStatus(this.btn_role, top_three_status);
      var log_status = this.model.checkRedIsShowByRedType(LadderConst.RedType.BattleLog);
      Utils.addRedPointToNodeByStatus(this.btn_log, log_status);
    }
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.role_vo) {
      if (this.role_assets_event) {
        this.role_vo.unbind(this.role_assets_event);
        this.role_assets_event = null;
      }
 
      this.role_vo = null;
    }
 
    for (var k in this.role_items) {
      var item = this.role_items[k];
 
      if (item) {
        item.deleteMe();
        item = null;
      }
    }
 
    this.role_items = null;
    this.openLadderTimer(false);
    this.ctrl.openMainWindow(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxsYWRkZXJcXHZpZXdcXGxhZGRlcl9tYWluX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkxhZGRlckNvbnRyb2xsZXIiLCJMYWRkZXJSb2xlSXRlbSIsIlRpbWVUb29sIiwiTWFpbnVpQ29udHJvbGxlciIsIkNvbW1vbkFsZXJ0IiwiTGFkZGVyQ29uc3QiLCJMYWRkZXJFdmVudCIsIkxhZGRlcl9tYWluV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwiaW5pdENvbmZpZyIsInJvbGVfdm8iLCJnZXRJbnN0YW5jZSIsImdldFJvbGVWbyIsInJvbGVfcGFuZWxzIiwicm9sZV9pdGVtcyIsImN0cmwiLCJtb2RlbCIsImdldE1vZGVsIiwid2hpdGVfY29sb3IiLCJDb2xvciIsImNvbG9yXzEiLCJvcGVuQ2FsbEJhY2siLCJiYWNrZ3JvdW5kIiwic2Vla0NoaWxkIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJsb2FkUmVzIiwiZ2V0QmlnQmciLCJzcCIsImdldENvbXBvbmVudCIsIlNwcml0ZSIsInNwcml0ZUZyYW1lIiwiYmluZCIsIm1haW5fY29udGFpbmVyIiwidG9wX3BhbmVsIiwid2luX3RpdGxlIiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwiYnRuX3J1bGUiLCJidG5fcm9sZSIsImJ0bl9sb2ciLCJidG5fcmFuayIsImJ0bl9hd2FyZCIsImJ0bl9zaG9wIiwiYm90dG9tX3BhbmVsIiwiYmxhY2tfYmciLCJjb3VudF90aXRsZSIsImNvdW50X2xhYmVsX2xiIiwidGlwc19sYWJlbCIsInRpbWVfdGl0bGVfbGIiLCJ0aW1lX2xhYmVsX2xiIiwic2NvcmVfYmciLCJzY29yZV9sYWJlbF9sYiIsInNreV9jb2luIiwicmFua19iZyIsInJhbmtfdGl0bGUiLCJyYW5rX2xhYmVsX2xiIiwiY2xvc2VfYnRuIiwicmVmcmVzaF9idG4iLCJfY2FuX3RvdWNoIiwicmVmcmVzaF9idG5fbGFiZWxfbGIiLCJyZWZyZXNoX2J0bl9sYWJlbF9sbyIsIkxhYmVsT3V0bGluZSIsImNoYWxsZW5nZV9idG4iLCJjaGFsbGVuZ2VfYnRuX2xhYmVsX2xiIiwiYWRkX2J0biIsImkiLCJyb2xlX3BhbmVsIiwicm9sZV9wYW5lbF9zaXplIiwiZ2V0Q29udGVudFNpemUiLCJyZWdpc3RlckV2ZW50Iiwib25Ub3VjaEVuZCIsIm9wZW5NYWluV2luZG93Iiwib3BlbkNvbW1vbkV4cGxhaW5WaWV3IiwiQ29uZmlnIiwic2t5X2xhZGRlcl9kYXRhIiwiZGF0YV9leHBsYWluIiwib3BlbkxhZGRlclRvcFRocmVlV2luZG93Iiwib3BlbkxhZGRlckxvZ1dpbmRvdyIsIm9wZW5MYWRkZXJSYW5rV2luZG93Iiwib3BlbkxhZGRlckF3YXJkV2luZG93Iiwib3BlbkxhZGRlclNob3BXaW5kb3ciLCJpc19vcGVuIiwiZ2V0TGFkZGVySXNPcGVuIiwidHh0X2NmZyIsImRhdGFfY29uc3QiLCJtZXNzYWdlIiwianMiLCJmb3JtYXRTdHIiLCJkZXNjIiwibXlCYXNlSW5mbyIsImJ1eV9jb21iYXRfbnVtIiwiY29zdF9jb25maWciLCJkYXRhX2J1eV9udW0iLCJ2aXBfbGV2IiwidmlwIiwicmVzIiwiZ2V0SXRlbVJlcyIsIkl0ZW1EYXRhIiwiZGF0YV9hc3NldHNfbGFiZWwyaWQiLCJnb2xkIiwibXNnIiwiY29zdCIsInNob3ciLCJyZXF1ZXN0QnV5Q2hhbGxlbmdlQ291bnQiLCJyZXNBcnIiLCJyZXF1ZXN0UmVmcmVzaEVuZW15TGlzdCIsImZ1biIsImNoZWNrSm9pbkxhZGRlckJhdHRsZSIsInN0ciIsImFkZEdsb2JhbEV2ZW50IiwiVXBkYXRlTGFkZGVyTXlCYXNlSW5mbyIsInJlZnJlc2hNeUJhc2VJbmZvIiwiVXBkYXRlQWxsTGFkZGVyRW5lbXlMaXN0IiwicmVmcmVzaFJvbGVMaXN0Iiwicm9sZV9hc3NldHNfZXZlbnQiLCJFdmVudElkIiwiVVBEQVRFX1JPTEVfQVRUUklCVVRFIiwia2V5IiwidmFsdWUiLCJVcGRhdGVMYWRkZXJPcGVuU3RhdHVzIiwiVXBkYXRlTGFkZGVyUmVkU3RhdHVzIiwicmVmcmVoc0J0blJlZFN0YXR1cyIsImJpZCIsInN0YXR1cyIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwicmVxdWVzdExhZGRlck15QmFzZUluZm8iLCJyZXF1ZXN0TGFkZGVyRW5lbXlMaXN0RGF0YSIsImVuZW15X2RhdGFzIiwiZ2V0TGFkZGVyRW5lbXlMaXN0RGF0YSIsImxvZyIsInNvcnRGdW5jIiwib2JqQSIsIm9iakIiLCJyYW5rIiwibGlzdF9pbmRleCIsInN0YXJ0VXBkYXRlIiwiaW5kZXgiLCJyb2xlX2l0ZW0iLCJzZXRQb3NpdGlvbiIsInYyIiwid2lkdGgiLCJoZWlnaHQiLCJzZXRQYXJlbnQiLCJlbmVteV9kYXRhIiwibmV4dCIsInNldERhdGEiLCJzZXRWaXNpYmxlIiwiZ2V0TGFkZGVyTXlCYXNlSW5mbyIsImNhbl9jb21iYXRfbnVtIiwibGVmdF9idXlfY291bnQiLCJjcmVhdGVSaWNoTGFiZWwiLCJsZWZ0X2NvdW50IiwiZ2V0VG9kYXlMZWZ0QnV5Q291bnQiLCJyZWZfdGltZSIsImNvbWJhdF90aW1lIiwiY3VyX3RpbWUiLCJnY29yZSIsIlNtYXJ0U29ja2V0IiwiZ2V0VGltZSIsImNvbV9sZWZ0X3RpbWUiLCJub2RlIiwiYWN0aXZlIiwiam9pbl90ZXh0IiwicmFua19jZmciLCJ2YWwiLCJnZXRUaW1lRm9ybWF0Iiwib3BlbkxhZGRlclRpbWVyIiwicmVmX2xlZnRfdGltZSIsImVuYWJsZWQiLCJsYWRkZXJfdGltZXIiLCJUaW1lciIsInNldCIsImRlbCIsIlJlZFR5cGUiLCJUb3BUaHJlZSIsImFkZFJlZFBvaW50VG9Ob2RlQnlTdGF0dXMiLCJCYXR0bGVMb2ciLCJ0b3BfdGhyZWVfc3RhdHVzIiwiY2hlY2tSZWRJc1Nob3dCeVJlZFR5cGUiLCJsb2dfc3RhdHVzIiwiY2xvc2VDYWxsQmFjayIs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QUFDQUMsRUFBQUEsYUFBYSxFQUFFLHlCQUFZO0FBQ3ZCLFFBQUksS0FBSzlLLE9BQVQsRUFBa0I7QUFDZCxVQUFJLEtBQUsyRyxpQkFBVCxFQUE0QjtBQUN4QixhQUFLM0csT0FBTCxDQUFhK0ssTUFBYixDQUFvQixLQUFLcEUsaUJBQXpCO0FBQ0EsYUFBS0EsaUJBQUwsR0FBeUIsSUFBekI7QUFDSDs7QUFDRCxXQUFLM0csT0FBTCxHQUFlLElBQWY7QUFDSDs7QUFDRCxTQUFLLElBQUlnTCxDQUFULElBQWMsS0FBSzVLLFVBQW5CLEVBQStCO0FBQzNCLFVBQUk2SyxJQUFJLEdBQUcsS0FBSzdLLFVBQUwsQ0FBZ0I0SyxDQUFoQixDQUFYOztBQUNBLFVBQUlDLElBQUosRUFBVTtBQUNOQSxRQUFBQSxJQUFJLENBQUNDLFFBQUw7QUFDQUQsUUFBQUEsSUFBSSxHQUFHLElBQVA7QUFDSDtBQUNKOztBQUNELFNBQUs3SyxVQUFMLEdBQWtCLElBQWxCO0FBQ0EsU0FBSzRKLGVBQUwsQ0FBcUIsS0FBckI7QUFDQSxTQUFLM0osSUFBTCxDQUFVMkQsY0FBVixDQUF5QixLQUF6QjtBQUNIO0FBclk0QixDQUFULENBQXhCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg6Leo5pyN5aSp5qKvbWFpbnZpZXdcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA3LTI0IDE2OjU2OjM4XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBMYWRkZXJDb250cm9sbGVyID0gcmVxdWlyZShcImxhZGRlcl9jb250cm9sbGVyXCIpO1xudmFyIExhZGRlclJvbGVJdGVtID0gcmVxdWlyZShcImxhZGRlcl9yb2xlX2l0ZW1cIik7XG52YXIgVGltZVRvb2wgPSByZXF1aXJlKFwidGltZXRvb2xcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbnZhciBMYWRkZXJDb25zdCA9IHJlcXVpcmUoXCJsYWRkZXJfY29uc3RcIik7XG52YXIgTGFkZGVyRXZlbnQgPSByZXF1aXJlKFwibGFkZGVyX2V2ZW50XCIpO1xuXG52YXIgTGFkZGVyX21haW5XaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwibGFkZGVyXCIsIFwibGFkZGVyX21haW5fd2luZG93XCIpO1xuICAgICAgICAvLyB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICAvLyB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICB0aGlzLnJvbGVfcGFuZWxzID0ge307XG4gICAgICAgIHRoaXMucm9sZV9pdGVtcyA9IHt9O1xuICAgICAgICB0aGlzLmN0cmwgPSBMYWRkZXJDb250cm9sbGVyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcblxuICAgICAgICB0aGlzLndoaXRlX2NvbG9yID0gbmV3IGNjLkNvbG9yKDI1NSwgMjU1LCAyNTUsIDI1NSk7XG4gICAgICAgIHRoaXMuY29sb3JfMSA9IG5ldyBjYy5Db2xvcig3MSwgMTMyLCAzNywgMjU1KTtcbiAgICB9LFxuXG4gICAgLy8g6aKE5Yi25L2T5Yqg6L295a6M5oiQ5LmL5ZCO55qE5Zue6LCDLOWPr+S7peWcqOi/memHjOaNleiOt+ebuOWFs+iKgueCueaIluiAhee7hOS7tlxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwiYmlnYmdfNThcIiksIGZ1bmN0aW9uIChzcCkge1xuICAgICAgICAgICAgYmFja2dyb3VuZC5nZXRDb21wb25lbnQoY2MuU3ByaXRlKS5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKFwibWFpbl9jb250YWluZXJcIik7XG5cbiAgICAgICAgdGhpcy50b3BfcGFuZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInRvcF9wYW5lbFwiKTtcblxuICAgICAgICBsZXQgd2luX3RpdGxlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy50b3BfcGFuZWwsIFwid2luX3RpdGxlXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgd2luX3RpdGxlLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5aSp5qKv5LqJ6Zy4XCIpO1xuICAgICAgICB0aGlzLmJ0bl9ydWxlID0gdGhpcy5zZWVrQ2hpbGQodGhpcy50b3BfcGFuZWwsIFwiYnRuX3J1bGVcIik7XG4gICAgICAgIHRoaXMuYnRuX3JvbGUgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnRvcF9wYW5lbCwgXCJidG5fcm9sZVwiKTtcbiAgICAgICAgdGhpcy5idG5fbG9nID0gdGhpcy5zZWVrQ2hpbGQodGhpcy50b3BfcGFuZWwsIFwiYnRuX2xvZ1wiKTtcbiAgICAgICAgdGhpcy5idG5fcmFuayA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcImJ0bl9yYW5rXCIpO1xuICAgICAgICB0aGlzLmJ0bl9hd2FyZCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcImJ0bl9hd2FyZFwiKTtcbiAgICAgICAgdGhpcy5idG5fc2hvcCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcImJ0bl9zaG9wXCIpO1xuXG4gICAgICAgIHRoaXMuYm90dG9tX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJib3R0b21fcGFuZWxcIik7XG4gICAgICAgIGxldCBibGFja19iZyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImJsYWNrX2JnXCIpO1xuICAgICAgICBsZXQgY291bnRfdGl0bGUgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJjb3VudF90aXRsZVwiLCBjYy5MYWJlbCk7XG4gICAgICAgIGNvdW50X3RpdGxlLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5oyR5oiY5qyh5pWwOlwiKTtcbiAgICAgICAgdGhpcy5jb3VudF9sYWJlbF9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImNvdW50X2xhYmVsXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgbGV0IHRpcHNfbGFiZWwgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInRpcHNfbGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aXBzX2xhYmVsLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5b+r6YCf5oyR5oiY5o6S5ZCN5LiN5Y+YXCIpO1xuICAgICAgICB0aGlzLnRpbWVfdGl0bGVfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJ0aW1lX3RpdGxlXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy50aW1lX3RpdGxlX2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi6Led56a757uT5p2f77yaXCIpO1xuICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmJvdHRvbV9wYW5lbCwgXCJ0aW1lX2xhYmVsXCIsIGNjLkxhYmVsKTtcblxuICAgICAgICBsZXQgc2NvcmVfYmcgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInNjb3JlX2JnXCIpO1xuICAgICAgICB0aGlzLnNjb3JlX2xhYmVsX2xiID0gdGhpcy5zZWVrQ2hpbGQoc2NvcmVfYmcsIFwic2NvcmVfbGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLnNjb3JlX2xhYmVsX2xiLnN0cmluZyA9IHRoaXMucm9sZV92by5za3lfY29pbjtcbiAgICAgICAgbGV0IHJhbmtfYmcgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcInJhbmtfYmdcIik7XG4gICAgICAgIGxldCByYW5rX3RpdGxlID0gdGhpcy5zZWVrQ2hpbGQocmFua19iZywgXCJyYW5rX3RpdGxlXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgcmFua190aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaOkuWQjTpcIik7XG4gICAgICAgIHRoaXMucmFua19sYWJlbF9sYiA9IHRoaXMuc2Vla0NoaWxkKHJhbmtfYmcsIFwicmFua19sYWJlbFwiLCBjYy5MYWJlbCk7XG5cbiAgICAgICAgdGhpcy5jbG9zZV9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcImNsb3NlX2J0blwiKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwicmVmcmVzaF9idG5cIik7XG4gICAgICAgIHRoaXMucmVmcmVzaF9idG4uX2Nhbl90b3VjaCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVmcmVzaF9idG5fbGFiZWxfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJlZnJlc2hfYnRuLCBcImxhYmVsXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sbyA9IHRoaXMuc2Vla0NoaWxkKHRoaXMucmVmcmVzaF9idG4sIFwibGFiZWxcIiwgY2MuTGFiZWxPdXRsaW5lKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWIt+aWsFwiKTtcbiAgICAgICAgdGhpcy5jaGFsbGVuZ2VfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJjaGFsbGVuZ2VfYnRuXCIpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG5fbGFiZWxfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmNoYWxsZW5nZV9idG4sIFwibGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZV9idG5fbGFiZWxfbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLkuIDplK7mjJHmiJhcIik7XG4gICAgICAgIHRoaXMuYWRkX2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYm90dG9tX3BhbmVsLCBcImFkZF9idG5cIik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcm9sZV9wYW5lbCA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubWFpbl9jb250YWluZXIsIFwicm9sZV9wb3NfXCIgKyBpKTtcbiAgICAgICAgICAgIHRoaXMucm9sZV9wYW5lbHNbaV0gPSByb2xlX3BhbmVsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZV9wYW5lbF9zaXplID0gdGhpcy5yb2xlX3BhbmVsc1sxXS5nZXRDb250ZW50U2l6ZSgpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuY2xvc2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3Blbk1haW5XaW5kb3coZmFsc2UpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmJ0bl9ydWxlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkub3BlbkNvbW1vbkV4cGxhaW5WaWV3KHRydWUsIENvbmZpZy5za3lfbGFkZGVyX2RhdGEuZGF0YV9leHBsYWluKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fcm9sZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MYWRkZXJUb3BUaHJlZVdpbmRvdyh0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fbG9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlbkxhZGRlckxvZ1dpbmRvdyh0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fcmFuaywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MYWRkZXJSYW5rV2luZG93KHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmJ0bl9hd2FyZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MYWRkZXJBd2FyZFdpbmRvdyh0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5idG5fc2hvcCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5MYWRkZXJTaG9wV2luZG93KHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/mt7vliqDmjJHmiJjmrKHmlbBcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmFkZF9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBpc19vcGVuID0gdGhpcy5tb2RlbC5nZXRMYWRkZXJJc09wZW4oKTtcbiAgICAgICAgICAgIGlmICghaXNfb3Blbikge1xuICAgICAgICAgICAgICAgIGxldCB0eHRfY2ZnID0gQ29uZmlnLnNreV9sYWRkZXJfZGF0YS5kYXRhX2NvbnN0W1wiY2xvc2VfdGV4dFwiXTtcbiAgICAgICAgICAgICAgICBpZiAodHh0X2NmZykge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuavjyVz5aSp5qKv5LqJ6Zy4XCIpLCB0eHRfY2ZnLmRlc2MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5teUJhc2VJbmZvKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJ1eV9jb21iYXRfbnVtID0gdGhpcy5teUJhc2VJbmZvLmJ1eV9jb21iYXRfbnVtIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IGNvc3RfY29uZmlnID0gQ29uZmlnLnNreV9sYWRkZXJfZGF0YS5kYXRhX2J1eV9udW1bYnV5X2NvbWJhdF9udW0gKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY29zdF9jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9sZV92by52aXBfbGV2ID49IGNvc3RfY29uZmlnLnZpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcyA9IFBhdGhUb29sLmdldEl0ZW1SZXMoQ29uZmlnLkl0ZW1EYXRhLmRhdGFfYXNzZXRzX2xhYmVsMmlkLmdvbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi56Gu5a6a5raI6ICXPGltZyBzcmM9JyVzJy8+JXPlop7liqDkuIDmrKHmjJHmiJjmrKHmlbDlkJfvvJ9cIiksIENvbmZpZy5JdGVtRGF0YS5kYXRhX2Fzc2V0c19sYWJlbDJpZC5nb2xkLCBjb3N0X2NvbmZpZy5jb3N0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3cobXNnLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5yZXF1ZXN0QnV5Q2hhbGxlbmdlQ291bnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgVXRpbHMuVEkxOE4oXCLlj5bmtohcIiksIG51bGwsIDIsIG51bGwsIHsgcmVzQXJyOiBbcmVzXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLmj5DljYdWSVDnrYnnuqflj6/lop7liqDotK3kubDmrKHmlbBcIikpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5b2T5YmN5bey57uP6LSt5Lmw6L6+5Yiw5LiK6ZmQXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5yZWZyZXNoX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IGlzX29wZW4gPSB0aGlzLm1vZGVsLmdldExhZGRlcklzT3BlbigpO1xuICAgICAgICAgICAgaWYgKGlzX29wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdFJlZnJlc2hFbmVteUxpc3QoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHR4dF9jZmcgPSBDb25maWcuc2t5X2xhZGRlcl9kYXRhLmRhdGFfY29uc3RbXCJjbG9zdF90ZXh0XCJdO1xuICAgICAgICAgICAgICAgIGlmICh0eHRfY2ZnKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UoY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5q+PJXPlpKnmoq/kuonpnLhcIiksIHR4dF9jZmcuZGVzYykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5jaGFsbGVuZ2VfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgaXNfb3BlbiA9IHRoaXMubW9kZWwuZ2V0TGFkZGVySXNPcGVuKCk7XG4gICAgICAgICAgICBpZiAoIWlzX29wZW4pIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0X2NmZyA9IENvbmZpZy5za3lfbGFkZGVyX2RhdGEuZGF0YV9jb25zdFtcImNsb3NlX3RleHRcIl07XG4gICAgICAgICAgICAgICAgaWYgKHR4dF9jZmcpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZShjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLmr48lc+Wkqeair+S6iemcuFwiKSwgdHh0X2NmZy5kZXNjKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGZ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwuY2hlY2tKb2luTGFkZGVyQmF0dGxlKG51bGwsIG51bGwsIHRydWUpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICBsZXQgc3RyID0gVXRpbHMuVEkxOE4oXCLkuIDplK7mjJHmiJjlsIbnm7TmjqXojrflvpflpZblirHvvIzmmK/lkKbnu6fnu63vvJ9cXG5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaXplPTIyPijmtojogJfkuIDmrKHmjJHmiJjmrKHmlbApPC9zaXplPlwiKTtcbiAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3coc3RyLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuLCBVdGlscy5USTE4TihcIuWPlua2iFwiKSwgbnVsbCwgMiwgbnVsbCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSlcblxuICAgICAgICAvL+S4quS6uuaVsOaNruabtOaWsFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KExhZGRlckV2ZW50LlVwZGF0ZUxhZGRlck15QmFzZUluZm8sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE15QmFzZUluZm8oKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICAvL+abtOaWsOaJgOacieWvueaJi+WIl+ihqFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KExhZGRlckV2ZW50LlVwZGF0ZUFsbExhZGRlckVuZW15TGlzdCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoUm9sZUxpc3QoKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICAvL+enr+WIhuabtOaWsFxuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGVfYXNzZXRzX2V2ZW50ID0gdGhpcy5yb2xlX3ZvLmJpbmQoRXZlbnRJZC5VUERBVEVfUk9MRV9BVFRSSUJVVEUsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gXCJza3lfY29pblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3JlX2xhYmVsX2xiLnN0cmluZyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/mtLvliqjlvIDlkK8v5YWz6ZetXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoTGFkZGVyRXZlbnQuVXBkYXRlTGFkZGVyT3BlblN0YXR1cywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTXlCYXNlSW5mbygpO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIC8v57qi54K5XG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoTGFkZGVyRXZlbnQuVXBkYXRlTGFkZGVyUmVkU3RhdHVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlaHNCdG5SZWRTdGF0dXMoYmlkLCBzdGF0dXMpO1xuICAgICAgICB9LCB0aGlzKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB0aGlzLmN0cmwucmVxdWVzdExhZGRlck15QmFzZUluZm8oKTtcbiAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RMYWRkZXJFbmVteUxpc3REYXRhKCk7XG4gICAgICAgIHRoaXMucmVmcmVoc0J0blJlZFN0YXR1cygpO1xuICAgIH0sXG5cbiAgICByZWZyZXNoUm9sZUxpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGVuZW15X2RhdGFzID0gdGhpcy5tb2RlbC5nZXRMYWRkZXJFbmVteUxpc3REYXRhKCk7XG4gICAgICAgIGNjLmxvZyhcImVuZW15X2RhdGFzPT1cIiwgZW5lbXlfZGF0YXMpXG4gICAgICAgIGxldCBzb3J0RnVuYyA9IGZ1bmN0aW9uIChvYmpBLCBvYmpCKSB7XG4gICAgICAgICAgICBpZiAob2JqQS5yYW5rICE9IDAgJiYgb2JqQi5yYW5rICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqQS5yYW5rIC0gb2JqQi5yYW5rXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9iakEucmFuayA9PSAwICYmIG9iakIucmFuayAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqQS5yYW5rICE9IDAgJiYgb2JqQi5yYW5rID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBlbmVteV9kYXRhcy5zb3J0KHNvcnRGdW5jKTtcbiAgICAgICAgLy/lvqrnjq9cbiAgICAgICAgdGhpcy5saXN0X2luZGV4ID0gMTtcbiAgICAgICAgdGhpcy5zdGFydFVwZGF0ZSg1LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmxpc3RfaW5kZXg7XG4gICAgICAgICAgICBsZXQgcm9sZV9pdGVtID0gdGhpcy5yb2xlX2l0ZW1zW2luZGV4XTtcbiAgICAgICAgICAgIGlmICghcm9sZV9pdGVtKSB7XG4gICAgICAgICAgICAgICAgcm9sZV9pdGVtID0gbmV3IExhZGRlclJvbGVJdGVtKCk7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVfcGFuZWwgPSB0aGlzLnJvbGVfcGFuZWxzW2luZGV4XTtcbiAgICAgICAgICAgICAgICByb2xlX2l0ZW0uc2V0UG9zaXRpb24oY2MudjIodGhpcy5yb2xlX3BhbmVsX3NpemUud2lkdGggLyAyLCB0aGlzLnJvbGVfcGFuZWxfc2l6ZS5oZWlnaHQgLSAxNDApKTtcbiAgICAgICAgICAgICAgICByb2xlX2l0ZW0uc2V0UGFyZW50KHJvbGVfcGFuZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMucm9sZV9pdGVtc1tpbmRleF0gPSByb2xlX2l0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZW5lbXlfZGF0YSA9IGVuZW15X2RhdGFzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbmVteV9kYXRhICYmIFV0aWxzLm5leHQoZW5lbXlfZGF0YSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJvbGVfaXRlbS5zZXREYXRhKGVuZW15X2RhdGEpO1xuICAgICAgICAgICAgICAgIHJvbGVfaXRlbS5zZXRWaXNpYmxlKHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByb2xlX2l0ZW0uc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxpc3RfaW5kZXggKz0gMTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwIC8gNSlcbiAgICB9LFxuXG4gICAgLy/liLfmlrDkuKrkurrkv6Hmga/mlbDmja5cbiAgICByZWZyZXNoTXlCYXNlSW5mbzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm15QmFzZUluZm8gPSB0aGlzLm1vZGVsLmdldExhZGRlck15QmFzZUluZm8oKTtcbiAgICAgICAgbGV0IGlzX29wZW4gPSB0aGlzLm1vZGVsLmdldExhZGRlcklzT3BlbigpO1xuICAgICAgICB0aGlzLmNvdW50X2xhYmVsX2xiLnN0cmluZyA9IHRoaXMubXlCYXNlSW5mby5jYW5fY29tYmF0X251bSB8fCAwO1xuICAgICAgICAvL+S7iuaXpeWJqeS9mei0reS5sOasoeaVsFxuICAgICAgICBpZiAoIXRoaXMubGVmdF9idXlfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubGVmdF9idXlfY291bnQgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjAsIHRoaXMud2hpdGVfY29sb3IsIGNjLnYyKDAuNSwgMC41KSwgY2MudjIoNTkwLCAxMCkpO1xuICAgICAgICAgICAgdGhpcy5sZWZ0X2J1eV9jb3VudC5zZXRQYXJlbnQodGhpcy5ib3R0b21fcGFuZWwpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsZWZ0X2NvdW50ID0gdGhpcy5tb2RlbC5nZXRUb2RheUxlZnRCdXlDb3VudCgpO1xuICAgICAgICB0aGlzLmxlZnRfYnV5X2NvdW50LnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIjxjb2xvcj0jZmZmOGJmPjxvdXRsaW5lPTIgY29sb3I9IzAwMDAwMD4o5Ymp5L2Z6LSt5Lmw5qyh5pWwOjwvb3V0bGluZT48L2M+PGNvbG9yPSMzOWU1MjI+PG91dGxpbmU9MiBjb2xvcj0jMDAwMDAwPiVkPC9vdXRsaW5lPjwvYz48Y29sb3I9I2ZmZjhiZj48b3V0bGluZT0yIGNvbG9yPSMwMDAwMDA+KTwvb3V0bGluZT48L2M+XCIsIGxlZnRfY291bnQpKTtcblxuICAgICAgICBpZiAoIWlzX29wZW4gfHwgIXRoaXMubXlCYXNlSW5mby5yYW5rIHx8IHRoaXMubXlCYXNlSW5mby5yYW5rID09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmFua19sYWJlbF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaaguaXoFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFua19sYWJlbF9sYi5zdHJpbmcgPSB0aGlzLm15QmFzZUluZm8ucmFuaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZl90aW1lID0gdGhpcy5teUJhc2VJbmZvLnJlZl90aW1lIHx8IDA7ICAgICAgLy/kuIvmrKHlj6/liLfmlrDml7bpl7RcbiAgICAgICAgdGhpcy5jb21iYXRfdGltZSA9IHRoaXMubXlCYXNlSW5mby5jb21iYXRfdGltZSB8fCAwOy8v57uT5p2f5pe26Ze0XG5cbiAgICAgICAgbGV0IGN1cl90aW1lID0gZ2NvcmUuU21hcnRTb2NrZXQuZ2V0VGltZSgpO1xuICAgICAgICBsZXQgY29tX2xlZnRfdGltZSA9IHRoaXMuY29tYmF0X3RpbWUgLSBjdXJfdGltZTtcbiAgICAgICAgaWYgKGNvbV9sZWZ0X3RpbWUgPCAwKSB7XG4gICAgICAgICAgICBjb21fbGVmdF90aW1lID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvL+a0u+WKqOW8gOWQr+aYvuekuuWJqeS9meaXtumXtOOAgea0u+WKqOacquW8gOWQr+aYvuekuuWPgui1m+adoeS7tlxuICAgICAgICBpZiAoIWlzX29wZW4pIHtcbiAgICAgICAgICAgIHRoaXMudGltZV9sYWJlbF9sYi5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50aW1lX3RpdGxlX2xiLm5vZGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuam9pbl90ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qb2luX3RleHQgPSBVdGlscy5jcmVhdGVSaWNoTGFiZWwoMjIsIHRoaXMud2hpdGVfY29sb3IsIGNjLnYyKDAuNSwgMC41KSwgY2MudjIoMzQ2LCAzOC41KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5qb2luX3RleHQuc2V0UGFyZW50KHRoaXMuYm90dG9tX3BhbmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuam9pbl90ZXh0Lm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCByYW5rX2NmZyA9IENvbmZpZy5za3lfbGFkZGVyX2RhdGEuZGF0YV9jb25zdFtcImFyZW5hX3JhbmtcIl07XG4gICAgICAgICAgICBpZiAocmFua19jZmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmpvaW5fdGV4dC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCJjb2xvcj0jZmZmOGJmPjxvdXRsaW5lPTIgY29sb3I9IzAwMDAwMD7lj4LotZvmnaHku7Y656ue5oqA5Zy65o6S5ZCN5YmNPC9vdXRsaW5lPjwvYz5jb2xvcj0jMzllNTIyPjxvdXRsaW5lPTIgY29sb3I9IzAwMDAwMD4lZDwvb3V0bGluZT48L2M+Y29sb3I9I2ZmZjhiZj48b3V0bGluZT0yIGNvbG9yPSMwMDAwMDA+5ZCNPC9vdXRsaW5lPjwvYz5cIiwgcmFua19jZmcudmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50aW1lX3RpdGxlX2xiLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudGltZV9sYWJlbF9sYi5zdHJpbmcgPSBUaW1lVG9vbC5nZXRUaW1lRm9ybWF0KGNvbV9sZWZ0X3RpbWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuam9pbl90ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qb2luX3RleHQubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3BlbkxhZGRlclRpbWVyKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlZl9sZWZ0X3RpbWUgPSB0aGlzLnJlZl90aW1lIC0gY3VyX3RpbWU7XG4gICAgICAgIGlmIChyZWZfbGVmdF90aW1lIDw9IDAgJiYgdGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBzZXRDaGlsZFVuRW5hYmxlZCh0cnVlLCBzZWxmLnJlZnJlc2hfYnRuKVxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5fbGFiZWxfbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLliLfmlrBcIik7XG4gICAgICAgICAgICAvLyB0aGlzLnJlZnJlc2hfYnRuX2xhYmVsX2xvLmNvbG9yID0gdGhpcy5jb2xvcl8xO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sby5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWZfbGVmdF90aW1lID4gMCAmJiB0aGlzLnJlZnJlc2hfYnRuLl9jYW5fdG91Y2ggPT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gc2V0Q2hpbGRVbkVuYWJsZWQodHJ1ZSwgc2VsZi5yZWZyZXNoX2J0bilcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG4uX2Nhbl90b3VjaCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sYi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc+enklwiKSwgcmVmX2xlZnRfdGltZSk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2xhYmVsX2xvLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iuoeaXtuWZqFxuICAgIG9wZW5MYWRkZXJUaW1lcjogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoc3RhdHVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhZGRlcl90aW1lciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWRkZXJfdGltZXIgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyX3RpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21fbGVmdF90aW1lID0gdGhpcy5jb21iYXRfdGltZSAtIGN1cl90aW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmX2xlZnRfdGltZSA9IHRoaXMucmVmX3RpbWUgLSBjdXJfdGltZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbV9sZWZ0X3RpbWUgPD0gMCAmJiByZWZfbGVmdF90aW1lIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLmxhZGRlcl90aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhZGRlcl90aW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbV9sZWZ0X3RpbWUgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21fbGVmdF90aW1lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tX2xlZnRfdGltZSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIubm9kZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZV90aXRsZV9sYi5ub2RlLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuam9pbl90ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qb2luX3RleHQubm9kZS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lX2xhYmVsX2xiLm5vZGUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZV90aXRsZV9sYi5ub2RlLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIuc3RyaW5nID0gVGltZVRvb2wuZ2V0VGltZUZvcm1hdChjb21fbGVmdF90aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVmX2xlZnRfdGltZSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnJlZnJlc2hfYnRuX2xhYmVsX2xvLmNvbG9yID0gdGhpcy5jb2xvcl8xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldENoaWxkVW5FbmFibGVkKHRydWUsIHNlbGYucmVmcmVzaF9idG4pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hfYnRuX2xhYmVsX2xiLnN0cmluZyA9IFV0aWxzLlRJMThOKFwi5Yi35pawXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZl9sZWZ0X3RpbWUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWZyZXNoX2J0bi5fY2FuX3RvdWNoID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXRDaGlsZFVuRW5hYmxlZCh0cnVlLCBzZWxmLnJlZnJlc2hfYnRuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG4uX2Nhbl90b3VjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaF9idG5fbGFiZWxfbG8uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoX2J0bl9sYWJlbF9sYi5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCIlc+enklwiKSwgcmVmX2xlZnRfdGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIDEwMDAsIDEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYWRkZXJfdGltZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLmxhZGRlcl90aW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy5sYWRkZXJfdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v57qi54K5XG4gICAgcmVmcmVoc0J0blJlZFN0YXR1czogZnVuY3Rpb24gKGJpZCwgc3RhdHVzKSB7XG4gICAgICAgIGlmIChiaWQgPT0gTGFkZGVyQ29uc3QuUmVkVHlwZS5Ub3BUaHJlZSkge1xuICAgICAgICAgICAgVXRpbHMuYWRkUmVkUG9pbnRUb05vZGVCeVN0YXR1cyh0aGlzLmJ0bl9yb2xlLCBzdGF0dXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGJpZCA9PSBMYWRkZXJDb25zdC5SZWRUeXBlLkJhdHRsZUxvZykge1xuICAgICAgICAgICAgVXRpbHMuYWRkUmVkUG9pbnRUb05vZGVCeVN0YXR1cyh0aGlzLmJ0bl9sb2csIHN0YXR1cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdG9wX3RocmVlX3N0YXR1cyA9IHRoaXMubW9kZWwuY2hlY2tSZWRJc1Nob3dCeVJlZFR5cGUoTGFkZGVyQ29uc3QuUmVkVHlwZS5Ub3BUaHJlZSk7XG4gICAgICAgICAgICBVdGlscy5hZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzKHRoaXMuYnRuX3JvbGUsIHRvcF90aHJlZV9zdGF0dXMpO1xuICAgICAgICAgICAgbGV0IGxvZ19zdGF0dXMgPSB0aGlzLm1vZGVsLmNoZWNrUmVkSXNTaG93QnlSZWRUeXBlKExhZGRlckNvbnN0LlJlZFR5cGUuQmF0dGxlTG9nKTtcbiAgICAgICAgICAgIFV0aWxzLmFkZFJlZFBvaW50VG9Ob2RlQnlTdGF0dXModGhpcy5idG5fbG9nLCBsb2dfc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb2xlX2Fzc2V0c19ldmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMucm9sZV92by51bmJpbmQodGhpcy5yb2xlX2Fzc2V0c19ldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX2Fzc2V0c19ldmVudCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvbGVfdm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGsgaW4gdGhpcy5yb2xlX2l0ZW1zKSB7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMucm9sZV9pdGVtc1trXTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgICAgIGl0ZW0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZV9pdGVtcyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlbkxhZGRlclRpbWVyKGZhbHNlKTtcbiAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWluV2luZG93KGZhbHNlKTtcbiAgICB9LFxufSkiXX0=