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
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guildwar/view/guildwar_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, 'e53d8rVP7dGsI6SOA8CagO+', 'guildwar_main_window');
// Scripts/mod/guildwar/view/guildwar_main_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     联盟战主界面
// <br/>Create: 2019-05-06 17:57:44
// --------------------------------------------------------------------
var GuildConst = require("guild_const");
 
var GuildwarConst = require("guildwar_const");
 
var GuildwarEvent = require("guildwar_event");
 
var PathTool = require("pathtool");
 
var TimeTool = require("timetool");
 
var GuildwarPositionItem = require("guildwar_position_item");
 
var Guildwar_mainWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("guildwar", "guildwar_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.ctrl = require("guildwar_controller").getInstance();
    this.model = this.ctrl.getModel();
    this.cur_position_type = GuildwarConst.positions.others; // 当前阵地类型
 
    this.position_vo_data = {}; // 据点数据
 
    this.position_stack = []; // 创建的据点
 
    this.position_pool = []; // 缓存池中的据点
 
    this.position_pos = {}; // 正在显示中的据点
 
    this.map_bgs = []; // 地图资源
 
    this.top3_item_list = {};
    this.color_1 = new cc.Color(0x89, 0xed, 0xff, 0xff);
    this.free_size = cc.size(720, 1280);
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.seekChild("background");
    this.background.scale = FIT_SCALE;
    this.main_container = this.seekChild("main_container");
    this.map_layer = this.seekChild(this.main_container, "map_layer");
    this.show_panel = this.seekChild(this.main_container, "show_panel");
    this.state_panel = this.seekChild(this.main_container, "state_panel");
    this.state_panel.getChildByName("background").scale = FIT_SCALE;
    this.top_panel = this.seekChild(this.main_container, "top_panel");
    this.myguild_container = this.seekChild(this.show_panel, "myguild_container");
    this.enemyguild_container = this.seekChild(this.show_panel, "enemyguild_container");
    this.rank_container = this.seekChild(this.show_panel, "rank_container");
    this.title_container = this.seekChild(this.show_panel, "title_container");
    this.buff_container = this.seekChild(this.show_panel, "buff_container");
    this.battle_list_btn = this.seekChild(this.show_panel, "battle_list_btn");
    this.attk_check_btn = this.seekChild(this.show_panel, "attk_check_btn");
    this.ally_atk_btn = this.seekChild(this.show_panel, "ally_atk_btn");
    this.look_award_btn = this.seekChild(this.show_panel, "look_award_btn");
    this.change_scene_btn = this.seekChild(this.show_panel, "change_scene_btn");
    this.change_scene_btn_lb = this.seekChild(this.change_scene_btn, "label", cc.Label);
    this.change_scene_btn_lb.string = Utils.TI18N("敌方阵地");
    this.award_box_btn = this.seekChild(this.show_panel, "award_box_btn");
    this.clash_list_btn = this.seekChild(this.state_panel, "clash_list_btn");
    this.look_box_btn = this.seekChild(this.state_panel, "look_box_btn");
    this.rank_btn = this.seekChild(this.rank_container, "rank_btn");
    this.close_btn = this.seekChild(this.top_panel, "close_btn");
    this.explain_btn = this.seekChild(this.top_panel, "explain_btn");
    this.time_label_lb = this.seekChild(this.title_container, "time_label", cc.Label);
    this.challenge_label_lb = this.seekChild(this.title_container, "challenge_label", cc.Label);
    this.state_tips_label_lb = this.seekChild(this.state_panel, "state_tips_label", cc.Label);
    this.buff_lv_label_lb = this.seekChild(this.buff_container, "buff_lv_label", cc.Label);
    this.buff_icon_sp = this.seekChild(this.buff_container, "buff_icon", cc.Sprite);
    this.loadRes(PathTool.getIconPath("bufficon", "2"), function (sp) {
      this.buff_icon_sp.spriteFrame = sp;
    }.bind(this));
    this.my_guild_name_lb = this.seekChild(this.myguild_container, "guild_name_label_1", cc.Label);
    this.my_guild_star_lb = this.seekChild(this.myguild_container, "star_label_1", cc.Label);
    this.my_guild_win_nd = this.seekChild(this.myguild_container, "image_win_1");
    this.my_guild_dogfall_nd = this.seekChild(this.myguild_container, "image_dogfall_1");
    this.enemy_guild_name_lb = this.seekChild(this.enemyguild_container, "guild_name_label_2", cc.Label);
    this.enemy_guild_star_lb = this.seekChild(this.enemyguild_container, "star_label_2", cc.Label);
    this.enemy_guild_win_nd = this.seekChild(this.enemyguild_container, "image_win_2");
    this.enemy_guild_dogfall_nd = this.seekChild(this.enemyguild_container, "image_dogfall_2");
    this.map_layer_posX = -360;
    this.map_layer_posY = -640 - 30;
    this.map_size = cc.size(720, 1280 * 6);
    this.map_layer.setContentSize(this.map_size);
    this.map_layer.setPosition(cc.v2(this.map_layer_posX, this.free_size.height - this.map_size.height + this.map_layer_posY));
    this.addMapImage();
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    //联盟战状态变化
    this.addGlobalEvent(GuildwarEvent.UpdateGuildWarStatusEvent, function (status, flag) {
      //状态从开战前到开战后,这时请求数据
      if (this.guildwar_status <= 3 && status > 3 && flag == 1) {
        this.ctrl.requestGuildWarData();
      }
 
      if (status <= 3) {
        //状态变更为开战前的界面时,关闭只有开战时才能打开的界面
        this.ctrl.openAttkLookWindow(false);
        this.ctrl.openAttkPositionWindow(false);
        this.ctrl.openGuildWarAwardWindow(false);
        this.ctrl.openBattleLogWindow(false);
        this.ctrl.openDefendLookWindow(false);
        this.ctrl.openGuildWarRankView(false);
      }
 
      this.refreshGuildWarStatus();
    }, this); //详细数据
 
    this.addGlobalEvent(GuildwarEvent.GuildWarEnemyPositionDataInitEvent, function () {
      this.refreshChallengeCount();
      this.refreshStarAndBuffInfo();
      this.refreshTopThreeRank();
      this.refreshGuildWarPosition();
    }, this); //挑战次数更新
 
    this.addGlobalEvent(GuildwarEvent.UpdateGuildwarChallengeCountEvent, function () {
      this.refreshChallengeCount();
    }, this); //基础数据更新
 
    this.addGlobalEvent(GuildwarEvent.UpdateGuildWarBaseInfoEvent, function () {
      this.refreshTopThreeRank();
      this.refreshStarAndBuffInfo();
    }, this); //收到我方据点数据
 
    this.addGlobalEvent(GuildwarEvent.GetGuildWarMyPositionDataEvent, function () {
      this.refreshGuildWarPosition();
    }, this); //红点更新
 
    this.addGlobalEvent(GuildwarEvent.UpdateGuildWarRedStatusEvent, function (redtype, status) {
      this.updateMainRedStatus(redtype, status);
    }, this);
    Utils.onTouchEnd(this.close_btn, function () {
      this.ctrl.openMainWindow(false);
    }.bind(this), 2);
    Utils.onTouchEnd(this.explain_btn, function () {
      require("mainui_controller").getInstance().openCommonExplainView(true, Config.guild_war_data.data_explain);
    }.bind(this), 1); //进攻一览
 
    Utils.onTouchEnd(this.attk_check_btn, function () {
      this.ctrl.openAttkLookWindow(true);
    }.bind(this), 1); //对阵列表
 
    Utils.onTouchEnd(this.battle_list_btn, function () {
      this.ctrl.openBattleListWindow(true);
    }.bind(this), 1); //对阵列表(匹配成功展示界面)
 
    Utils.onTouchEnd(this.clash_list_btn, function () {
      this.ctrl.openBattleListWindow(true);
      this.model.updateGuildWarRedStatus(GuildConst.red_index.guildwar_match, false);
    }.bind(this), 1); //进攻日志
 
    Utils.onTouchEnd(this.ally_atk_btn, function () {
      this.ctrl.openBattleLogWindow(true);
      this.model.updateGuildWarRedStatus(GuildConst.red_index.guildwar_log, false);
    }.bind(this), 1); //战绩奖励
 
    Utils.onTouchEnd(this.look_award_btn, function () {
      this.ctrl.openGuildWarAwardWindow(true);
    }.bind(this), 1); //详细排名
 
    Utils.onTouchEnd(this.rank_btn, function () {
      this.ctrl.openGuildWarRankView(true);
    }.bind(this), 1); //切换阵地
 
    Utils.onTouchEnd(this.change_scene_btn, function () {
      this.changeGuildwarPositionType();
    }.bind(this), 1); //宝箱按钮
 
    Utils.onTouchEnd(this.award_box_btn, function () {
      this.ctrl.openAwardBoxWindow(true);
    }.bind(this), 1); //宝箱按钮
 
    Utils.onTouchEnd(this.look_box_btn, function () {
      this.ctrl.openAwardBoxWindow(true);
    }.bind(this), 1);
    this.map_layer.on(cc.Node.EventType.TOUCH_START, function (event) {
      this.last_point = null;
      this.is_move_map_layer = true;
      return true;
    }, this);
    this.map_layer.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
      var touches = event.getTouches();
      this.last_point = touches[0].getDelta();
      this.moveMapLayer(this.last_point.x, this.last_point.y);
      this.dynamicShowGuildWarPosition();
      this.dynamicAddMapImage();
    }, this);
    this.map_layer.on(cc.Node.EventType.TOUCH_END, function (event) {
      this.is_move_map_layer = false;
    }, this);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd() {
    var flag = this.model.getGuildWarEnemyFlag();
    var status = this.model.getGuildWarStatus();
    this.refreshGuildWarStatus();
    this.updateMainRedStatus(); //打开界面时判断,如果有匹配到对手且状态为开战中或结算,但无缓存数据,则请求数据
 
    if (flag == 1 && status > GuildwarConst.status.showing && !this.model.checkIsHaveEnemyCacheData()) {
      this.ctrl.requestGuildWarData();
    } else {
      this.refreshGuildWarPosition();
      this.refreshStarAndBuffInfo();
      this.refreshTopThreeRank();
      this.refreshChallengeCount();
    }
  },
  //状态刷新
  refreshGuildWarStatus: function refreshGuildWarStatus() {
    var status = this.model.getGuildWarStatus();
    var isShowTips = false;
    var tips_str = "";
    this.clash_list_btn.active = false;
    var flag = this.model.getGuildWarEnemyFlag();
 
    if (status == GuildwarConst.status.close) {
      isShowTips = true;
      tips_str = Utils.TI18N("公会战暂未开始,请在每周一、周三、周六12:00-20:00准时参加哦!(゚∀゚)つ"); //所有据点都放入缓存池中
 
      for (var i = this.position_stack.length; i > 0; i--) {
        var item = this.position_stack.pop();
        var pos = item.getPositionPos();
        item.setVisible(false);
        item.suspendAllActions();
        this.position_pool.push(item);
        this.position_pos[pos] = null;
      }
    } else if (status == GuildwarConst.status.matching) {
      isShowTips = true;
      tips_str = Utils.TI18N("正在匹配,请耐心等待");
    } else if (status == GuildwarConst.status.showing) {
      if (flag == 1) {
        tips_str = Utils.TI18N("公会战暂未开始,请在每周一、周三、周六12:00-20:00准时参加哦!(゚∀゚)つ");
      } else {
        tips_str = Utils.TI18N("很遗憾,您的公会在此次公会战中匹配轮空或活跃人数未达标,请期待下次!(つд∩)");
      }
 
      this.clash_list_btn.active = true;
      isShowTips = true;
    } else if (status == GuildwarConst.status.processing) {
      if (flag == 1) {
        isShowTips = false;
      } else {
        tips_str = Utils.TI18N("很遗憾,您的公会在此次公会战中匹配轮空或活跃人数未达标,请期待下次!(つд∩)");
        isShowTips = true;
        this.clash_list_btn.active = true;
      }
    } else if (status == GuildwarConst.status.settlement) {
      if (flag == 1) {
        isShowTips = false;
      } else {
        tips_str = Utils.TI18N("很遗憾,您的公会在此次公会战中匹配轮空或活跃人数未达标,请期待下次!(つд∩)");
        isShowTips = true;
        this.clash_list_btn.active = true;
      }
    }
 
    this.guildwar_status = status;
 
    if (isShowTips) {
      this.state_tips_label_lb.string = tips_str;
    }
 
    this.show_panel.active = !isShowTips;
    this.state_panel.active = isShowTips;
    this.refreshSurplusTime();
    this.refreshChallengeCount();
  },
  //加载阵地地图资源(只创建3张,动态调整位置重复使用)
  addMapImage: function addMapImage() {
    for (var i = 1; i < 4; i++) {
      var pos_y = (6 - i) * 1280;
      var map_bg = Utils.createImage(this.map_layer, null, 0, pos_y, cc.v2(0, 0));
      this.loadImage(map_bg, PathTool.getUIIconPath("bigbg/guildwar", "guildwar_1"));
      this.map_bgs.push(map_bg);
    }
 
    this.dynamicAddMapImage();
  },
  loadImage: function loadImage(image, res) {
    this.loadRes(res, function (sp) {
      image.spriteFrame = sp;
    }.bind(this));
  },
  getTopOrBottomMapBgPosY: function getTopOrBottomMapBgPosY(flag) {
    var value = null;
 
    for (var k in this.map_bgs) {
      var mapbg = this.map_bgs[k];
      var pos_y = mapbg.node.y;
      value = value || pos_y;
 
      if (flag == 1 && pos_y > value) {
        value = pos_y;
      } else if (flag == 2 && pos_y < value) {
        value = pos_y;
      }
    }
 
    return value;
  },
  //动态调整地图位置
  dynamicAddMapImage: function dynamicAddMapImage() {
    var map_pos_y = this.map_layer.y;
    map_pos_y = Math.abs(map_pos_y);
    var offset_y = 640;
 
    for (var k in this.map_bgs) {
      var mapbg = this.map_bgs[k];
      var bg_pos_y = mapbg.node.y;
 
      if (bg_pos_y + offset_y < map_pos_y - 1280) {
        mapbg.node.y = this.getTopOrBottomMapBgPosY(1) + 1280;
      } else if (bg_pos_y - offset_y > map_pos_y + 1280) {
        mapbg.node.y = this.getTopOrBottomMapBgPosY(2) - 1280;
      }
    }
  },
  moveMapLayer: function moveMapLayer(x, y) {
    x = this.map_layer.x + x;
    y = this.map_layer.y + y;
    var return_pos = this.checkMapLayerPoint(x, y);
    this.map_layer.setPosition(return_pos.x, return_pos.y);
  },
  checkMapLayerPoint: function checkMapLayerPoint(_x, _y) {
    var return_pos = cc.v2(_x, _y);
 
    if (_x > this.map_layer_posX) {
      return_pos.x = this.map_layer_posX;
    } else if (_x < this.free_size.width - this.map_size.width + this.map_layer_posX) {
      return_pos.x = this.free_size.width - this.map_size.width + this.map_layer_posX;
    }
 
    if (_y < this.free_size.height - this.map_size.height + this.map_layer_posY) {
      return_pos.y = this.free_size.height - this.map_size.height + this.map_layer_posY;
    } else if (return_pos.y >= this.map_layer_posY) {
      return_pos.y = this.map_layer_posY;
    }
 
    return return_pos;
  },
  //剩余时间显示
  refreshSurplusTime: function refreshSurplusTime() {
    this.surplusTime = this.model.getGuildWarSurplusTime();
 
    if (this.surplusTime < 0) {
      this.surplusTime = 0;
    }
 
    this.time_label_lb.string = TimeTool.getTimeFormatDayIIIIIIII(this.surplusTime);
    this.openGuildWarSurplusTimer(true);
  },
  //活动剩余时间倒计时
  openGuildWarSurplusTimer: function openGuildWarSurplusTimer(status) {
    if (status == true) {
      if (this.guildwar_timer == null) {
        this.guildwar_timer = gcore.Timer.set(function () {
          this.surplusTime = this.surplusTime - 1;
 
          if (this.surplusTime >= 0) {
            this.time_label_lb.string = TimeTool.getTimeFormatDayIIIIIIII(this.surplusTime);
          } else {
            this.surplusTime = 0;
            gcore.Timer.del(this.guildwar_timer);
            this.guildwar_timer = null;
          }
        }.bind(this), 1000, -1);
      }
    } else {
      if (this.guildwar_timer != null) {
        gcore.Timer.del(this.guildwar_timer);
        this.guildwar_timer = null;
      }
    }
  },
  //剩余次数刷新
  refreshChallengeCount: function refreshChallengeCount() {
    if (this.guildwar_status == GuildwarConst.status.settlement) {
      this.challenge_label_lb.string = Utils.TI18N("后关闭");
    } else {
      var count = this.model.getGuildWarChallengeCount();
      var max_count = Config.guild_war_data.data_const.challange_time_limit.val;
      this.challenge_label_lb.string = cc.js.formatStr(Utils.TI18N("挑战次数:%s/%s"), max_count - count, max_count);
    }
  },
  //刷新双方星数、结果和buff信息
  refreshStarAndBuffInfo: function refreshStarAndBuffInfo() {
    var myGuildData = this.model.getMyGuildWarBaseInfo();
    cc.log(myGuildData);
    this.my_guild_name_lb.string = myGuildData.gname || "";
    this.my_guild_star_lb.string = myGuildData.hp || 0;
    var buff_lev = myGuildData.buff_lev || 0;
    var max_level = Config.guild_war_data.data_buff_length;
    this.buff_lv_label_lb.string = cc.js.formatStr(Utils.TI18N("%s/%s级"), buff_lev, max_level);
    var enemyGuildData = this.model.getEnemyGuildWarBaseInfo();
    this.enemy_guild_name_lb.string = enemyGuildData.gname || "";
    this.enemy_guild_star_lb.string = enemyGuildData.hp || 0;
    var result = this.model.getGuildWarResult();
    this.my_guild_win_nd.active = result == GuildwarConst.result.win;
    this.my_guild_dogfall_nd.active = result == GuildwarConst.result.dogfall;
    this.enemy_guild_win_nd.active = result == GuildwarConst.result.lose;
    this.enemy_guild_dogfall_nd.active = result == GuildwarConst.result.dogfall;
  },
  //刷新前三排名数据
  refreshTopThreeRank: function refreshTopThreeRank() {
    var rank_list = this.model.getGuildWarTopThreeRank();
    if (rank_list == null || Utils.next(rank_list) == null) return;
 
    for (var i in rank_list) {
      var v = rank_list[i];
 
      if (!this.top3_item_list[v.rank]) {
        var item = this.createSingleRankItem(v.rank);
        item.container.setParent(this.rank_container);
        this.top3_item_list[v.rank] = item;
      }
 
      var item = this.top3_item_list[v.rank];
 
      if (item) {
        item.container.setPosition(-10, -60 - (v.rank - 1) * item.container.getContentSize().height);
        item.label.string = v.name;
      }
    }
  },
  createSingleRankItem: function createSingleRankItem(i) {
    var obj = {};
    var container = new cc.Node();
    obj.container = container;
    container.setAnchorPoint(cc.v2(0, 1));
    container.setContentSize(cc.size(180, 40));
    var sp = Utils.createImage(container, null, 0, 0, cc.v2(0, 1));
    this.loadImage(sp, PathTool.getUIIconPath("common", "common_300" + i));
    sp.node.scale = 0.5;
    sp.node.x = 10;
    sp.node.y = 20;
    obj.sp = sp;
    var label = Utils.createLabel(20, this.color_1, null, 60, 20, "", container);
    label.node.setAnchorPoint(0, 1);
    obj.label = label;
    return obj;
  },
  //据点
  refreshGuildWarPosition: function refreshGuildWarPosition() {
    this.position_vo_data = {};
 
    if (this.guildwar_status == GuildwarConst.status.processing || this.guildwar_status == GuildwarConst.status.settlement) {
      if (this.cur_position_type == GuildwarConst.positions.myself) {
        this.position_vo_data = this.model.getMyGuildWarPositionList();
      } else if (this.cur_position_type == GuildwarConst.positions.others) {
        this.position_vo_data = this.model.getEnemyGuildWarPositionList();
      }
    }
 
    this.dynamicShowGuildWarPosition();
  },
  //动态加载据点显示
  dynamicShowGuildWarPosition: function dynamicShowGuildWarPosition() {
    this.checkPositionMoveToPool();
 
    for (var k in this.position_vo_data) {
      var position_vo = this.position_vo_data[k];
      var pos_data = Config.guild_war_data.data_position[position_vo.pos];
 
      if (pos_data && !this.position_pos[position_vo.pos] && this.checkPositionIsInDisplayRect(pos_data.pos_x, pos_data.pos_y)) {
        var position_item = this.position_pool.shift();
 
        if (position_item == null) {
          position_item = new GuildwarPositionItem();
          position_item.show();
          position_item.setParent(this.map_layer);
        }
 
        position_item.setVisible(true);
        position_item.setData(position_vo, this.cur_position_type);
        position_item.setPosition(pos_data.pos_x, pos_data.pos_y);
        this.position_stack.push(position_item);
        this.position_pos[position_vo.pos] = true;
      }
    }
  },
  //检测已创建的据点是否需要放入缓存池
  checkPositionMoveToPool: function checkPositionMoveToPool() {
    for (var i = 0; i < this.position_stack.length; i++) {
      var item = this.position_stack[i];
      var pos = item.getPosition();
 
      if (!this.checkPositionIsInDisplayRect(pos.x, pos.y)) {
        var pos_ = item.getPositionPos();
        item.setVisible(false);
        item.suspendAllActions();
        this.position_pool.push(item);
        this.position_stack.splice(i, 1);
        this.position_pos[pos_] = null;
      }
    }
  },
  //根据据点位置计算是否在显示区域之内
  checkPositionIsInDisplayRect: function checkPositionIsInDisplayRect(pos_x, pos_y) {
    var isIn = true;
    var item_width = 190;
    var item_height = 226;
    var map_pos = this.map_layer.getPosition();
    var map_pos_x = Math.abs(map_pos.x);
    var map_pos_y = Math.abs(map_pos.y);
 
    if (pos_x + item_width / 2 < map_pos_x - 360 || pos_x - item_width / 2 > map_pos_x + this.free_size.width - 360 || pos_y + item_height < map_pos_y - 640 || pos_y > map_pos_y - 640 + 1280) {
      isIn = false;
    }
 
    return isIn;
  },
  //切换阵地
  changeGuildwarPositionType: function changeGuildwarPositionType() {
    this.map_layer.setPosition(cc.v2(this.map_layer_posX, this.free_size.height - this.map_size.height + this.map_layer_posY));
 
    for (var i = 1; i < 4; i++) {
      var pos_y = (6 - i) * 1280;
      var map_bg = this.map_bgs[i];
 
      if (map_bg) {
        map_bg.node.setPosition(cc.v2(0, pos_y));
      }
    } //所有据点都放入缓存池中
 
 
    for (var i = this.position_stack.length; i > 0; i--) {
      var item = this.position_stack.pop();
      var pos = item.getPositionPos();
      item.setVisible(false);
      item.suspendAllActions();
      this.position_pool.push(item);
      this.position_pos[pos] = null;
    }
 
    if (this.cur_position_type == GuildwarConst.positions.myself) {
      this.cur_position_type = GuildwarConst.positions.others;
      this.refreshGuildWarPosition();
      this.change_scene_btn_lb.string = Utils.TI18N("敌方阵地");
    } else {
      this.cur_position_type = GuildwarConst.positions.myself;
      this.change_scene_btn_lb.string = Utils.TI18N("我方阵地");
      var myPositionData = this.model.getMyGuildWarPositionList();
 
      if (Utils.next(myPositionData) == null) {
        this.ctrl.requestMyGuildPositionData();
      } else {
        this.refreshGuildWarPosition();
      }
    }
  },
  updateMainRedStatus: function updateMainRedStatus(redtype, status) {
    if (redtype == GuildConst.red_index.guildwar_match) {
      Utils.addRedPointToNodeByStatus(this.clash_list_btn, status);
    } else if (redtype == GuildConst.red_index.guildwar_log) {
      Utils.addRedPointToNodeByStatus(this.ally_atk_btn, status);
    } else if (redtype == GuildConst.red_index.guildwar_box) {
      Utils.addRedPointToNodeByStatus(this.award_box_btn, status);
      Utils.addRedPointToNodeByStatus(this.look_box_btn, status);
    } else {
      var match_btn_status = this.model.checkRedIsShowByRedType(GuildConst.red_index.guildwar_match);
      Utils.addRedPointToNodeByStatus(this.clash_list_btn, match_btn_status);
      var atk_btn_status = this.model.checkRedIsShowByRedType(GuildConst.red_index.guildwar_log);
      Utils.addRedPointToNodeByStatus(this.ally_atk_btn, atk_btn_status);
      var box_btn_status = this.model.checkRedIsShowByRedType(GuildConst.red_index.guildwar_box);
      Utils.addRedPointToNodeByStatus(this.award_box_btn, box_btn_status);
      Utils.addRedPointToNodeByStatus(this.look_box_btn, box_btn_status);
    }
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    for (var k in this.position_stack) {
      if (this.position_stack[k]) {
        this.position_stack[k].deleteMe();
        this.position_stack[k] = null;
      }
    }
 
    this.position_stack = null;
 
    for (var k in this.position_pool) {
      if (this.position_pool[k]) {
        this.position_pool[k].deleteMe();
        this.position_pool[k] = null;
      }
    }
 
    this.position_pool = null;
    this.openGuildWarSurplusTimer(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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZHdhclxcdmlld1xcZ3VpbGR3YXJfbWFpbl93aW5kb3cuanMiXSwibmFtZXMiOlsiR3VpbGRDb25zdCIsInJlcXVpcmUiLCJHdWlsZHdhckNvbnN0IiwiR3VpbGR3YXJFdmVudCIsIlBhdGhUb29sIiwiVGltZVRvb2wiLCJHdWlsZHdhclBvc2l0aW9uSXRlbSIsIkd1aWxkd2FyX21haW5XaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwidWkiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJGdWxsIiwiaW5pdENvbmZpZyIsImN0cmwiLCJnZXRJbnN0YW5jZSIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJjdXJfcG9zaXRpb25fdHlwZSIsInBvc2l0aW9ucyIsIm90aGVycyIsInBvc2l0aW9uX3ZvX2RhdGEiLCJwb3NpdGlvbl9zdGFjayIsInBvc2l0aW9uX3Bvb2wiLCJwb3NpdGlvbl9wb3MiLCJtYXBfYmdzIiwidG9wM19pdGVtX2xpc3QiLCJjb2xvcl8xIiwiQ29sb3IiLCJmcmVlX3NpemUiLCJzaXplIiwib3BlbkNhbGxCYWNrIiwiYmFja2dyb3VuZCIsInNlZWtDaGlsZCIsInNjYWxlIiwiRklUX1NDQUxFIiwibWFpbl9jb250YWluZXIiLCJtYXBfbGF5ZXIiLCJzaG93X3BhbmVsIiwic3RhdGVfcGFuZWwiLCJnZXRDaGlsZEJ5TmFtZSIsInRvcF9wYW5lbCIsIm15Z3VpbGRfY29udGFpbmVyIiwiZW5lbXlndWlsZF9jb250YWluZXIiLCJyYW5rX2NvbnRhaW5lciIsInRpdGxlX2NvbnRhaW5lciIsImJ1ZmZfY29udGFpbmVyIiwiYmF0dGxlX2xpc3RfYnRuIiwiYXR0a19jaGVja19idG4iLCJhbGx5X2F0a19idG4iLCJsb29rX2F3YXJkX2J0biIsImNoYW5nZV9zY2VuZV9idG4iLCJjaGFuZ2Vfc2NlbmVfYnRuX2xiIiwiTGFiZWwiLCJzdHJpbmciLCJVdGlscyIsIlRJMThOIiwiYXdhcmRfYm94X2J0biIsImNsYXNoX2xpc3RfYnRuIiwibG9va19ib3hfYnRuIiwicmFua19idG4iLCJjbG9zZV9idG4iLCJleHBsYWluX2J0biIsInRpbWVfbGFiZWxfbGIiLCJjaGFsbGVuZ2VfbGFiZWxfbGIiLCJzdGF0ZV90aXBzX2xhYmVsX2xiIiwiYnVmZl9sdl9sYWJlbF9sYiIsImJ1ZmZfaWNvbl9zcCIsIlNwcml0ZSIsImxvYWRSZXMiLCJnZXRJY29uUGF0aCIsInNwIiwic3ByaXRlRnJhbWUiLCJiaW5kIiwibXlfZ3VpbGRfbmFtZV9sYiIsIm15X2d1aWxkX3N0YXJfbGIiLCJteV9ndWlsZF93aW5fbmQiLCJteV9ndWlsZF9kb2dmYWxsX25kIiwiZW5lbXlfZ3VpbGRfbmFtZV9sYiIsImVuZW15X2d1aWxkX3N0YXJfbGIiLCJlbmVteV9ndWlsZF93aW5fbmQiLCJlbmVteV9ndWlsZF9kb2dmYWxsX25kIiwibWFwX2xheWVyX3Bvc1giLCJtYXBfbGF5ZXJfcG9zWSIsIm1hcF9zaXplIiwic2V0Q29udGVudFNpemUiLCJzZXRQb3NpdGlvbiIsInYyIiwiaGVpZ2h0IiwiYWRkTWFwSW1hZ2UiLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJVcGRhdGVHdWlsZFdhclN0YXR1c0V2ZW50Iiwic3RhdHVzIiwiZmxhZyIsImd1aWxkd2FyX3N0YXR1cyIsInJlcXVlc3RHdWlsZFdhckRhdGEiLCJvcGVuQXR0a0xvb2tXaW5kb3ciLCJvcGVuQXR0a1Bvc2l0aW9uV2luZG93Iiwib3Blbkd1aWxkV2FyQXdhcmRXaW5kb3ciLCJvcGVuQmF0dGxlTG9nV2luZG93Iiwib3BlbkRlZmVuZExvb2tXaW5kb3ciLCJvcGVuR3VpbGRXYXJSYW5rVmlldyIsInJlZnJlc2hHdWlsZFdhclN0YXR1cyIsIkd1aWxkV2FyRW5lbXlQb3NpdGlvbkRhdGFJbml0RXZlbnQiLCJyZWZyZXNoQ2hhbGxlbmdlQ291bnQiLCJyZWZyZXNoU3RhckFuZEJ1ZmZJbmZvIiwicmVmcmVzaFRvcFRocmVlUmFuayIsInJlZnJlc2hHdWlsZFdhclBvc2l0aW9uIiwiVXBkYXRlR3VpbGR3YXJDaGFsbGVuZ2VDb3VudEV2ZW50IiwiVXBkYXRlR3VpbGRXYXJCYXNlSW5mb0V2ZW50IiwiR2V0R3VpbGRXYXJNeVBvc2l0aW9uRGF0YUV2ZW50IiwiVXBkYXRlR3VpbGRXYXJSZWRTdGF0dXNFdmVudCIsInJlZHR5cGUiLCJ1cGRhdGVNYWluUmVkU3RhdHVzIiwib25Ub3VjaEVuZCIsIm9wZW5NYWluV2luZG93Iiwib3BlbkNvbW1vbkV4cGxhaW5WaWV3IiwiQ29uZmlnIiwiZ3VpbGRfd2FyX2RhdGEiLCJkYXRhX2V4cGxhaW4iLCJvcGVuQmF0dGxlTGlzdFdpbmRvdyIsInVwZGF0ZUd1aWxkV2FyUmVkU3RhdHVzIiwicmVkX2luZGV4IiwiZ3VpbGR3YXJfbWF0Y2giLCJndWlsZHdhcl9sb2ciLCJjaGFuZ2VHdWlsZHdhclBvc2l0aW9uVHlwZSIsIm9wZW5Bd2FyZEJveFdpbmRvdyIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX1NUQVJUIiwiZXZlbnQiLCJsYXN0X3BvaW50IiwiaXNfbW92ZV9tYXBfbGF5ZXIiLCJUT1VDSF9NT1ZFIiwidG91Y2hlcyIsImdldFRvdWNoZXMiLCJnZXREZWx0YSIsIm1vdmVNYXBMYXllciIsIngiLCJ5IiwiZHluYW1pY1Nob3dHdWlsZFdhclBvc2l0aW9uIiwiZHluYW1pY0FkZE1hcEltYWdlIiwiVE9VQ0hfRU5EIiwib3BlblJvb3RXbmQiLCJnZXRHdWlsZFdhckVuZW15RmxhZyIsImdldEd1aWxkV2FyU3RhdHVzIiwic2hvd2luZyIsImNoZWNrSXNIYXZlRW5lbXlDYWNoZURhdGEiLCJpc1Nob3dUaXBzIiwidGlwc19zdHIiLCJhY3RpdmUiLCJjbG9zZSIsImkiLCJsZW5ndGgiLCJpdGVtIiwicG9wIiwicG9zIiwiZ2V0UG9zaXRpb25Qb3MiLCJzZXRWaXNpYmxlIiwic3VzcGVuZEFsbEFjdGlvbnMiLCJwdXNoIiwibWF0Y2hpbmciLCJwcm9jZXNzaW5nIiwic2V0dGxlbWVudCIsInJlZnJlc2hTdXJwbHVzVGltZSIsInBvc195IiwibWFwX2JnIiwiY3JlYXRlSW1hZ2UiLCJsb2FkSW1hZ2UiLCJnZXRVSUljb25QYXRoIiwiaW1hZ2UiLCJyZXMiLCJnZXRUb3BPckJvdHRvbU1hcEJnUG9zWSIsInZhbHVlIiwiayIsIm1hcGJnIiwibm9kZSIsIm1hcF9wb3NfeSIsIk1hdGgiLCJhYnMiLCJvZmZzZXRfeSIsImJnX3Bvc195IiwicmV0dXJuX3BvcyIsImNoZWNrTWFwTGF5ZXJQb2ludCIsIl94IiwiX3kiLCJ3aWR0aCIsInN1cnBsdXNUaW1lIiwiZ2V0R3VpbGRXYXJTdXJwbHVzVGltZSIsImdldFRpbWVGb3JtYXREYXlJSUlJSUlJSSIsIm9wZW5HdWlsZFdhclN1cnBsdXNUaW1lciIsImd1aWxkd2FyX3RpbWVyIiwiZ2NvcmUiLCJUaW1lciIsInNldCIsImRlbCIsImNvdW50IiwiZ2V0R3VpbGRXYXJDaGFsbGVuZ2VDb3VudCIsIm1heF9jb3VudCIsImRhdGFfY29uc3QiLCJjaGFsbGFuZ2VfdGltZV9saW1pdCIsInZhbCIsImpzIiwiZm9ybWF0U3RyIiwibXlHdWlsZERhdGEiLCJnZXRNeUd1aWxkV2FyQmFzZUluZm8iLCJsb2ciLCJnbmFtZSIsImhwIiwiYnVmZl9sZXYiLCJtYXhfbGV2ZWwiLCJkYXRhX2J1ZmZfbGVuZ3RoIiwiZW5lbXlHdWlsZERhdGEiLCJnZXRFbmVteUd1aWxkV2FyQmFzZUluZm8iLCJyZXN1bHQiLCJnZXRHdWlsZFdhclJlc3VsdCIsIndpbiIsImRvZ2ZhbGwiLCJsb3NlIiwicmFua19saXN0IiwiZ2V0R3VpbGRXYXJUb3BUaHJlZVJhbmsiLCJuZXh0IiwidiIsInJhbmsiLCJjcmVhdGVTaW5nbGVSYW5rSXRlbSIsImNvbnRhaW5lciIsInNldFBhcmVudCIsImdldENvbnRlbnRTaXplIiwibGFiZWwiLCJuYW1lIiwib2JqIiwic2V0QW5jaG9yUG9pbnQiLCJjcmVhdGVMYWJlbCIsIm15c2VsZiIsImdldE15R3VpbGRXYXJQb3NpdGlvbkxpc3QiLCJnZXRFbmVteUd1aWxkV2FyUG9zaXRpb25MaXN0IiwiY2hlY2tQb3NpdGlvbk1vdmVUb1Bvb2wiLCJwb3NpdGlvbl92byIsInBvc19kYXRhIiwiZGF0YV9wb3NpdGlvbiIsImNoZWNrUG9zaXRpb25Jc0luRGlzcGxheVJlY3QiLCJwb3NfeCIsInBvc2l0aW9uX2l0ZW0iLCJzaGlmdCIsInNob3ciLCJzZXREYXRhIiwiZ2V0UG9zaXRpb24iLCJwb3NfIiwic3BsaWNlIiwiaXNJbiIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsIm1hcF9wb3MiLCJtYXBfcG9zX3giLCJteVBvc2l0aW9uRGF0YSIsInJlcXVlc3RNeUd1aWxkUG9zaXRpb25EYXRhIiwiYWRkUmVkUG9pbnRUb05vZGVCeVN0YXR1cyIsImd1aWxkd2FyX2JveCIsIm1hdGNoX2J0bl9zdGF0dXMiLCJjaGVja1JlZElzU2hvd0J5UmVkVHlwZSIsImF0a19idG5fc3RhdHVzIiwiYm94X2J0bl9zdGF0dXMiLCJjbG9zZUNhbGxCYWNrIiwiZGVsZXRlTWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUEsVUFBVSxHQUFHQyxPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFDQSxJQUFJQyxhQUFhLEdBQUdELE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJRSxhQUFhLEdBQUdGLE9BQU8sQ0FBQyxnQkFBRCxDQUEzQjs7QUFDQSxJQUFJRyxRQUFRLEdBQUdILE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLElBQUlJLFFBQVEsR0FBR0osT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUssb0JBQW9CLEdBQUdMLE9BQU8sQ0FBQyx3QkFBRCxDQUFsQzs7QUFFQSxJQUFJTSxtQkFBbUIsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDL0IsYUFBU0MsUUFEc0I7QUFFL0JDLEVBQUFBLElB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RSx5QkFBWTtBQUN2QixTQUFLLElBQUl4RixDQUFULElBQWMsS0FBSzFKLGNBQW5CLEVBQW1DO0FBQy9CLFVBQUksS0FBS0EsY0FBTCxDQUFvQjBKLENBQXBCLENBQUosRUFBNEI7QUFDeEIsYUFBSzFKLGNBQUwsQ0FBb0IwSixDQUFwQixFQUF1QnlGLFFBQXZCO0FBQ0EsYUFBS25QLGNBQUwsQ0FBb0IwSixDQUFwQixJQUF5QixJQUF6QjtBQUNIO0FBQ0o7O0FBQ0QsU0FBSzFKLGNBQUwsR0FBc0IsSUFBdEI7O0FBRUEsU0FBSyxJQUFJMEosQ0FBVCxJQUFjLEtBQUt6SixhQUFuQixFQUFrQztBQUM5QixVQUFJLEtBQUtBLGFBQUwsQ0FBbUJ5SixDQUFuQixDQUFKLEVBQTJCO0FBQ3ZCLGFBQUt6SixhQUFMLENBQW1CeUosQ0FBbkIsRUFBc0J5RixRQUF0QjtBQUNBLGFBQUtsUCxhQUFMLENBQW1CeUosQ0FBbkIsSUFBd0IsSUFBeEI7QUFDSDtBQUNKOztBQUNELFNBQUt6SixhQUFMLEdBQXFCLElBQXJCO0FBRUEsU0FBS3lLLHdCQUFMLENBQThCLEtBQTlCO0FBQ0EsU0FBS2xMLElBQUwsQ0FBVXNHLGNBQVYsQ0FBeUIsS0FBekI7QUFDSDtBQTVsQjhCLENBQVQsQ0FBMUIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICDogZTnm5/miJjkuLvnlYzpnaJcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTA1LTA2IDE3OjU3OjQ0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEd1aWxkQ29uc3QgPSByZXF1aXJlKFwiZ3VpbGRfY29uc3RcIik7XG52YXIgR3VpbGR3YXJDb25zdCA9IHJlcXVpcmUoXCJndWlsZHdhcl9jb25zdFwiKTtcbnZhciBHdWlsZHdhckV2ZW50ID0gcmVxdWlyZShcImd1aWxkd2FyX2V2ZW50XCIpO1xudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIFRpbWVUb29sID0gcmVxdWlyZShcInRpbWV0b29sXCIpO1xudmFyIEd1aWxkd2FyUG9zaXRpb25JdGVtID0gcmVxdWlyZShcImd1aWxkd2FyX3Bvc2l0aW9uX2l0ZW1cIik7XG5cbnZhciBHdWlsZHdhcl9tYWluV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImd1aWxkd2FyXCIsIFwiZ3VpbGR3YXJfbWFpbl93aW5kb3dcIik7XG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy51aTsgICAgICAgICAgICAgICAgLy/or6XnqpfkvZPmiYDlsZ51aeWxgue6pyzlhajlsY91aemcgOimgeWcqHVp5bGCLOmdnuWFqOWxj3Vp5ZyoZGlhbG9ndWXlsYIs6L+Z5Liq6KaB5rOo5oSPXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMluS4gOS6m+mFjee9ruaVsOaNrizlj6/ku6XnlKjkuo7lo7DmmI7kuIDkupvlj5jph4/kuYvnsbvnmoRcbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3RybCA9IHJlcXVpcmUoXCJndWlsZHdhcl9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHRoaXMubW9kZWwgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKTtcbiAgICAgICAgdGhpcy5jdXJfcG9zaXRpb25fdHlwZSA9IEd1aWxkd2FyQ29uc3QucG9zaXRpb25zLm90aGVyczsgLy8g5b2T5YmN6Zi15Zyw57G75Z6LXG4gICAgICAgIHRoaXMucG9zaXRpb25fdm9fZGF0YSA9IHt9OyAvLyDmja7ngrnmlbDmja5cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9zdGFjayA9IFtdOyAgLy8g5Yib5bu655qE5o2u54K5XG4gICAgICAgIHRoaXMucG9zaXRpb25fcG9vbCA9IFtdOyAgICAvLyDnvJPlrZjmsaDkuK3nmoTmja7ngrlcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9wb3MgPSB7fTsgICAgLy8g5q2j5Zyo5pi+56S65Lit55qE5o2u54K5XG4gICAgICAgIHRoaXMubWFwX2JncyA9IFtdOyAgICAgICAvLyDlnLDlm77otYTmupBcbiAgICAgICAgdGhpcy50b3AzX2l0ZW1fbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLmNvbG9yXzEgPSBuZXcgY2MuQ29sb3IoMHg4OSwgMHhlZCwgMHhmZiwgMHhmZik7XG4gICAgICAgIHRoaXMuZnJlZV9zaXplID0gY2Muc2l6ZSg3MjAsIDEyODApO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xuICAgICAgICB0aGlzLm1haW5fY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQoXCJtYWluX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5tYXBfbGF5ZXIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm1haW5fY29udGFpbmVyLCBcIm1hcF9sYXllclwiKTtcbiAgICAgICAgdGhpcy5zaG93X3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJzaG93X3BhbmVsXCIpO1xuICAgICAgICB0aGlzLnN0YXRlX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJzdGF0ZV9wYW5lbFwiKTtcbiAgICAgICAgdGhpcy5zdGF0ZV9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImJhY2tncm91bmRcIikuc2NhbGUgPSBGSVRfU0NBTEU7XG4gICAgICAgIHRoaXMudG9wX3BhbmVsID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5tYWluX2NvbnRhaW5lciwgXCJ0b3BfcGFuZWxcIik7XG5cbiAgICAgICAgdGhpcy5teWd1aWxkX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuc2hvd19wYW5lbCwgXCJteWd1aWxkX2NvbnRhaW5lclwiKTtcbiAgICAgICAgdGhpcy5lbmVteWd1aWxkX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuc2hvd19wYW5lbCwgXCJlbmVteWd1aWxkX2NvbnRhaW5lclwiKTtcblxuICAgICAgICB0aGlzLnJhbmtfY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5zaG93X3BhbmVsLCBcInJhbmtfY29udGFpbmVyXCIpO1xuICAgICAgICB0aGlzLnRpdGxlX2NvbnRhaW5lciA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuc2hvd19wYW5lbCwgXCJ0aXRsZV9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMuYnVmZl9jb250YWluZXIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNob3dfcGFuZWwsIFwiYnVmZl9jb250YWluZXJcIik7XG5cbiAgICAgICAgdGhpcy5iYXR0bGVfbGlzdF9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNob3dfcGFuZWwsIFwiYmF0dGxlX2xpc3RfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMuYXR0a19jaGVja19idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNob3dfcGFuZWwsIFwiYXR0a19jaGVja19idG5cIik7XG5cbiAgICAgICAgdGhpcy5hbGx5X2F0a19idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNob3dfcGFuZWwsIFwiYWxseV9hdGtfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMubG9va19hd2FyZF9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNob3dfcGFuZWwsIFwibG9va19hd2FyZF9idG5cIik7XG5cbiAgICAgICAgdGhpcy5jaGFuZ2Vfc2NlbmVfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5zaG93X3BhbmVsLCBcImNoYW5nZV9zY2VuZV9idG5cIik7XG4gICAgICAgIHRoaXMuY2hhbmdlX3NjZW5lX2J0bl9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuY2hhbmdlX3NjZW5lX2J0biwgXCJsYWJlbFwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuY2hhbmdlX3NjZW5lX2J0bl9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaVjOaWuemYteWcsFwiKTtcblxuICAgICAgICB0aGlzLmF3YXJkX2JveF9idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnNob3dfcGFuZWwsIFwiYXdhcmRfYm94X2J0blwiKTtcblxuICAgICAgICB0aGlzLmNsYXNoX2xpc3RfYnRuID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5zdGF0ZV9wYW5lbCwgXCJjbGFzaF9saXN0X2J0blwiKTtcblxuICAgICAgICB0aGlzLmxvb2tfYm94X2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuc3RhdGVfcGFuZWwsIFwibG9va19ib3hfYnRuXCIpO1xuXG4gICAgICAgIHRoaXMucmFua19idG4gPSB0aGlzLnNlZWtDaGlsZCh0aGlzLnJhbmtfY29udGFpbmVyLCBcInJhbmtfYnRuXCIpO1xuICAgICAgICB0aGlzLmNsb3NlX2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcImNsb3NlX2J0blwiKTtcbiAgICAgICAgdGhpcy5leHBsYWluX2J0biA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudG9wX3BhbmVsLCBcImV4cGxhaW5fYnRuXCIpO1xuXG4gICAgICAgIHRoaXMudGltZV9sYWJlbF9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudGl0bGVfY29udGFpbmVyLCBcInRpbWVfbGFiZWxcIiwgY2MuTGFiZWwpO1xuICAgICAgICB0aGlzLmNoYWxsZW5nZV9sYWJlbF9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMudGl0bGVfY29udGFpbmVyLCBcImNoYWxsZW5nZV9sYWJlbFwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuc3RhdGVfdGlwc19sYWJlbF9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuc3RhdGVfcGFuZWwsIFwic3RhdGVfdGlwc19sYWJlbFwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuYnVmZl9sdl9sYWJlbF9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuYnVmZl9jb250YWluZXIsIFwiYnVmZl9sdl9sYWJlbFwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuYnVmZl9pY29uX3NwID0gdGhpcy5zZWVrQ2hpbGQodGhpcy5idWZmX2NvbnRhaW5lciwgXCJidWZmX2ljb25cIiwgY2MuU3ByaXRlKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEljb25QYXRoKFwiYnVmZmljb25cIiwgXCIyXCIpLCBmdW5jdGlvbiAoc3ApIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZl9pY29uX3NwLnNwcml0ZUZyYW1lID0gc3A7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICB0aGlzLm15X2d1aWxkX25hbWVfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm15Z3VpbGRfY29udGFpbmVyLCBcImd1aWxkX25hbWVfbGFiZWxfMVwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMubXlfZ3VpbGRfc3Rhcl9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMubXlndWlsZF9jb250YWluZXIsIFwic3Rhcl9sYWJlbF8xXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5teV9ndWlsZF93aW5fbmQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm15Z3VpbGRfY29udGFpbmVyLCBcImltYWdlX3dpbl8xXCIpO1xuICAgICAgICB0aGlzLm15X2d1aWxkX2RvZ2ZhbGxfbmQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLm15Z3VpbGRfY29udGFpbmVyLCBcImltYWdlX2RvZ2ZhbGxfMVwiKTtcblxuICAgICAgICB0aGlzLmVuZW15X2d1aWxkX25hbWVfbGIgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmVuZW15Z3VpbGRfY29udGFpbmVyLCBcImd1aWxkX25hbWVfbGFiZWxfMlwiLCBjYy5MYWJlbCk7XG4gICAgICAgIHRoaXMuZW5lbXlfZ3VpbGRfc3Rhcl9sYiA9IHRoaXMuc2Vla0NoaWxkKHRoaXMuZW5lbXlndWlsZF9jb250YWluZXIsIFwic3Rhcl9sYWJlbF8yXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5lbmVteV9ndWlsZF93aW5fbmQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmVuZW15Z3VpbGRfY29udGFpbmVyLCBcImltYWdlX3dpbl8yXCIpO1xuICAgICAgICB0aGlzLmVuZW15X2d1aWxkX2RvZ2ZhbGxfbmQgPSB0aGlzLnNlZWtDaGlsZCh0aGlzLmVuZW15Z3VpbGRfY29udGFpbmVyLCBcImltYWdlX2RvZ2ZhbGxfMlwiKTtcblxuICAgICAgICB0aGlzLm1hcF9sYXllcl9wb3NYID0gLTM2MDtcbiAgICAgICAgdGhpcy5tYXBfbGF5ZXJfcG9zWSA9IC02NDAgLSAzMDtcbiAgICAgICAgdGhpcy5tYXBfc2l6ZSA9IGNjLnNpemUoNzIwLCAxMjgwICogNik7XG4gICAgICAgIHRoaXMubWFwX2xheWVyLnNldENvbnRlbnRTaXplKHRoaXMubWFwX3NpemUpO1xuICAgICAgICB0aGlzLm1hcF9sYXllci5zZXRQb3NpdGlvbihjYy52Mih0aGlzLm1hcF9sYXllcl9wb3NYLCB0aGlzLmZyZWVfc2l6ZS5oZWlnaHQgLSB0aGlzLm1hcF9zaXplLmhlaWdodCArIHRoaXMubWFwX2xheWVyX3Bvc1kpKTtcbiAgICAgICAgdGhpcy5hZGRNYXBJbWFnZSgpO1xuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICAvL+iBlOebn+aImOeKtuaAgeWPmOWMllxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkd2FyRXZlbnQuVXBkYXRlR3VpbGRXYXJTdGF0dXNFdmVudCwgZnVuY3Rpb24gKHN0YXR1cywgZmxhZykge1xuICAgICAgICAgICAgLy/nirbmgIHku47lvIDmiJjliY3liLDlvIDmiJjlkI7vvIzov5nml7bor7fmsYLmlbDmja5cbiAgICAgICAgICAgIGlmICh0aGlzLmd1aWxkd2FyX3N0YXR1cyA8PSAzICYmIHN0YXR1cyA+IDMgJiYgZmxhZyA9PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RHdWlsZFdhckRhdGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0dXMgPD0gMykgeyAgICAgICAgLy/nirbmgIHlj5jmm7TkuLrlvIDmiJjliY3nmoTnlYzpnaLml7bvvIzlhbPpl63lj6rmnInlvIDmiJjml7bmiY3og73miZPlvIDnmoTnlYzpnaJcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3BlbkF0dGtMb29rV2luZG93KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3BlbkF0dGtQb3NpdGlvbldpbmRvdyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5HdWlsZFdhckF3YXJkV2luZG93KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3BlbkJhdHRsZUxvZ1dpbmRvdyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5EZWZlbmRMb29rV2luZG93KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN0cmwub3Blbkd1aWxkV2FyUmFua1ZpZXcoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3VpbGRXYXJTdGF0dXMoKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICAvL+ivpue7huaVsOaNrlxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkd2FyRXZlbnQuR3VpbGRXYXJFbmVteVBvc2l0aW9uRGF0YUluaXRFdmVudCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2hhbGxlbmdlQ291bnQoKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFN0YXJBbmRCdWZmSW5mbygpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9wVGhyZWVSYW5rKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hHdWlsZFdhclBvc2l0aW9uKCk7XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgLy/mjJHmiJjmrKHmlbDmm7TmlrBcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChHdWlsZHdhckV2ZW50LlVwZGF0ZUd1aWxkd2FyQ2hhbGxlbmdlQ291bnRFdmVudCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2hhbGxlbmdlQ291bnQoKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICAvL+WfuuehgOaVsOaNruabtOaWsFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkd2FyRXZlbnQuVXBkYXRlR3VpbGRXYXJCYXNlSW5mb0V2ZW50LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb3BUaHJlZVJhbmsoKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFN0YXJBbmRCdWZmSW5mbygpO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIC8v5pS25Yiw5oiR5pa55o2u54K55pWw5o2uXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoR3VpbGR3YXJFdmVudC5HZXRHdWlsZFdhck15UG9zaXRpb25EYXRhRXZlbnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEd1aWxkV2FyUG9zaXRpb24oKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICAvL+e6oueCueabtOaWsFxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEd1aWxkd2FyRXZlbnQuVXBkYXRlR3VpbGRXYXJSZWRTdGF0dXNFdmVudCwgZnVuY3Rpb24gKHJlZHR5cGUsIHN0YXR1cykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVNYWluUmVkU3RhdHVzKHJlZHR5cGUsIHN0YXR1cyk7XG4gICAgICAgIH0sIHRoaXMpXG5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmNsb3NlX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5NYWluV2luZG93KGZhbHNlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAyKVxuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5leHBsYWluX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkNvbW1vbkV4cGxhaW5WaWV3KHRydWUsIENvbmZpZy5ndWlsZF93YXJfZGF0YS5kYXRhX2V4cGxhaW4pO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/ov5vmlLvkuIDop4hcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmF0dGtfY2hlY2tfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlbkF0dGtMb29rV2luZG93KHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/lr7npmLXliJfooahcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmJhdHRsZV9saXN0X2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5CYXR0bGVMaXN0V2luZG93KHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/lr7npmLXliJfooajvvIjljLnphY3miJDlip/lsZXnpLrnlYzpnaLvvIlcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmNsYXNoX2xpc3RfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlbkJhdHRsZUxpc3RXaW5kb3codHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUd1aWxkV2FyUmVkU3RhdHVzKEd1aWxkQ29uc3QucmVkX2luZGV4Lmd1aWxkd2FyX21hdGNoLCBmYWxzZSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSlcblxuICAgICAgICAvL+i/m+aUu+aXpeW/l1xuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMuYWxseV9hdGtfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlbkJhdHRsZUxvZ1dpbmRvdyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlR3VpbGRXYXJSZWRTdGF0dXMoR3VpbGRDb25zdC5yZWRfaW5kZXguZ3VpbGR3YXJfbG9nLCBmYWxzZSk7XG4gICAgICAgIH0uYmluZCh0aGlzKSwgMSlcblxuICAgICAgICAvL+aImOe7qeWlluWKsVxuICAgICAgICBVdGlscy5vblRvdWNoRW5kKHRoaXMubG9va19hd2FyZF9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuR3VpbGRXYXJBd2FyZFdpbmRvdyh0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIC8v6K+m57uG5o6S5ZCNXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5yYW5rX2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5HdWlsZFdhclJhbmtWaWV3KHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/liIfmjaLpmLXlnLBcbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmNoYW5nZV9zY2VuZV9idG4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlR3VpbGR3YXJQb3NpdGlvblR5cGUoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIC8v5a6d566x5oyJ6ZKuXG4gICAgICAgIFV0aWxzLm9uVG91Y2hFbmQodGhpcy5hd2FyZF9ib3hfYnRuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwub3BlbkF3YXJkQm94V2luZG93KHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcyksIDEpXG5cbiAgICAgICAgLy/lrp3nrrHmjInpkq5cbiAgICAgICAgVXRpbHMub25Ub3VjaEVuZCh0aGlzLmxvb2tfYm94X2J0biwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5Bd2FyZEJveFdpbmRvdyh0cnVlKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxKVxuXG4gICAgICAgIHRoaXMubWFwX2xheWVyLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX1NUQVJULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF9wb2ludCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmlzX21vdmVfbWFwX2xheWVyID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMubWFwX2xheWVyLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX01PVkUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudC5nZXRUb3VjaGVzKCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RfcG9pbnQgPSB0b3VjaGVzWzBdLmdldERlbHRhKCk7XG4gICAgICAgICAgICB0aGlzLm1vdmVNYXBMYXllcih0aGlzLmxhc3RfcG9pbnQueCwgdGhpcy5sYXN0X3BvaW50LnkpO1xuICAgICAgICAgICAgdGhpcy5keW5hbWljU2hvd0d1aWxkV2FyUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0FkZE1hcEltYWdlKCk7XG4gICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMubWFwX2xheWVyLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmlzX21vdmVfbWFwX2xheWVyID0gZmFsc2U7XG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZmxhZyA9IHRoaXMubW9kZWwuZ2V0R3VpbGRXYXJFbmVteUZsYWcoKTtcbiAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMubW9kZWwuZ2V0R3VpbGRXYXJTdGF0dXMoKTtcblxuICAgICAgICB0aGlzLnJlZnJlc2hHdWlsZFdhclN0YXR1cygpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1haW5SZWRTdGF0dXMoKTtcblxuICAgICAgICAvL+aJk+W8gOeVjOmdouaXtuWIpOaWre+8jOWmguaenOacieWMuemFjeWIsOWvueaJi+S4lOeKtuaAgeS4uuW8gOaImOS4reaIlue7k+eul++8jOS9huaXoOe8k+WtmOaVsOaNru+8jOWImeivt+axguaVsOaNrlxuICAgICAgICBpZiAoZmxhZyA9PSAxICYmIHN0YXR1cyA+IEd1aWxkd2FyQ29uc3Quc3RhdHVzLnNob3dpbmcgJiYgIXRoaXMubW9kZWwuY2hlY2tJc0hhdmVFbmVteUNhY2hlRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdEd1aWxkV2FyRGF0YSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3VpbGRXYXJQb3NpdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU3RhckFuZEJ1ZmZJbmZvKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb3BUaHJlZVJhbmsoKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENoYWxsZW5nZUNvdW50KCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/nirbmgIHliLfmlrBcbiAgICByZWZyZXNoR3VpbGRXYXJTdGF0dXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXR1cyA9IHRoaXMubW9kZWwuZ2V0R3VpbGRXYXJTdGF0dXMoKTtcbiAgICAgICAgdmFyIGlzU2hvd1RpcHMgPSBmYWxzZTtcbiAgICAgICAgdmFyIHRpcHNfc3RyID0gXCJcIjtcbiAgICAgICAgdGhpcy5jbGFzaF9saXN0X2J0bi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdmFyIGZsYWcgPSB0aGlzLm1vZGVsLmdldEd1aWxkV2FyRW5lbXlGbGFnKCk7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gR3VpbGR3YXJDb25zdC5zdGF0dXMuY2xvc2UpIHtcbiAgICAgICAgICAgIGlzU2hvd1RpcHMgPSB0cnVlO1xuICAgICAgICAgICAgdGlwc19zdHIgPSBVdGlscy5USTE4TihcIuWFrOS8muaImOaaguacquW8gOWni++8jOivt+WcqOavj+WRqOS4gOOAgeWRqOS4ieOAgeWRqOWFrTEyOjAwLTIwOjAw5YeG5pe25Y+C5Yqg5ZOm77yB77yI776f4oiA776f77yJ44GkXCIpXG4gICAgICAgICAgICAvL+aJgOacieaNrueCuemDveaUvuWFpee8k+WtmOaxoOS4rVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMucG9zaXRpb25fc3RhY2subGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLnBvc2l0aW9uX3N0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHZhciBwb3MgPSBpdGVtLmdldFBvc2l0aW9uUG9zKCk7XG4gICAgICAgICAgICAgICAgaXRlbS5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpdGVtLnN1c3BlbmRBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9wb29sLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9wb3NbcG9zXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEd1aWxkd2FyQ29uc3Quc3RhdHVzLm1hdGNoaW5nKSB7XG4gICAgICAgICAgICBpc1Nob3dUaXBzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRpcHNfc3RyID0gVXRpbHMuVEkxOE4oXCLmraPlnKjljLnphY3vvIzor7fogJDlv4PnrYnlvoVcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEd1aWxkd2FyQ29uc3Quc3RhdHVzLnNob3dpbmcpIHtcbiAgICAgICAgICAgIGlmIChmbGFnID09IDEpIHtcbiAgICAgICAgICAgICAgICB0aXBzX3N0ciA9IFV0aWxzLlRJMThOKFwi5YWs5Lya5oiY5pqC5pyq5byA5aeL77yM6K+35Zyo5q+P5ZGo5LiA44CB5ZGo5LiJ44CB5ZGo5YWtMTI6MDAtMjA6MDDlh4bml7blj4LliqDlk6bvvIHvvIjvvp/iiIDvvp/vvInjgaRcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpcHNfc3RyID0gVXRpbHMuVEkxOE4oXCLlvojpgZfmhr7vvIzmgqjnmoTlhazkvJrlnKjmraTmrKHlhazkvJrmiJjkuK3ljLnphY3ova7nqbrmiJbmtLvot4PkurrmlbDmnKrovr7moIfvvIzor7fmnJ/lvoXkuIvmrKHvvIEo44Gk0LTiiKkpXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNsYXNoX2xpc3RfYnRuLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICBpc1Nob3dUaXBzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gR3VpbGR3YXJDb25zdC5zdGF0dXMucHJvY2Vzc2luZykge1xuICAgICAgICAgICAgaWYgKGZsYWcgPT0gMSkge1xuICAgICAgICAgICAgICAgIGlzU2hvd1RpcHMgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGlwc19zdHIgPSBVdGlscy5USTE4TihcIuW+iOmBl+aGvu+8jOaCqOeahOWFrOS8muWcqOatpOasoeWFrOS8muaImOS4reWMuemFjei9ruepuuaIlua0u+i3g+S6uuaVsOacqui+vuagh++8jOivt+acn+W+heS4i+asoe+8gSjjgaTQtOKIqSlcIik7XG4gICAgICAgICAgICAgICAgaXNTaG93VGlwcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzaF9saXN0X2J0bi5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBHdWlsZHdhckNvbnN0LnN0YXR1cy5zZXR0bGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZmxhZyA9PSAxKSB7XG4gICAgICAgICAgICAgICAgaXNTaG93VGlwcyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aXBzX3N0ciA9IFV0aWxzLlRJMThOKFwi5b6I6YGX5oa+77yM5oKo55qE5YWs5Lya5Zyo5q2k5qyh5YWs5Lya5oiY5Lit5Yy56YWN6L2u56m65oiW5rS76LeD5Lq65pWw5pyq6L6+5qCH77yM6K+35pyf5b6F5LiL5qyh77yBKOOBpNC04oipKVwiKTtcbiAgICAgICAgICAgICAgICBpc1Nob3dUaXBzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsYXNoX2xpc3RfYnRuLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmd1aWxkd2FyX3N0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgaWYgKGlzU2hvd1RpcHMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVfdGlwc19sYWJlbF9sYi5zdHJpbmcgPSB0aXBzX3N0cjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dfcGFuZWwuYWN0aXZlID0gIWlzU2hvd1RpcHM7XG4gICAgICAgIHRoaXMuc3RhdGVfcGFuZWwuYWN0aXZlID0gaXNTaG93VGlwcztcbiAgICAgICAgdGhpcy5yZWZyZXNoU3VycGx1c1RpbWUoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2hhbGxlbmdlQ291bnQoKTtcbiAgICB9LFxuXG4gICAgLy/liqDovb3pmLXlnLDlnLDlm77otYTmupAo5Y+q5Yib5bu6M+W8oO+8jOWKqOaAgeiwg+aVtOS9jee9rumHjeWkjeS9v+eUqClcbiAgICBhZGRNYXBJbWFnZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvc195ID0gKDYgLSBpKSAqIDEyODA7XG4gICAgICAgICAgICB2YXIgbWFwX2JnID0gVXRpbHMuY3JlYXRlSW1hZ2UodGhpcy5tYXBfbGF5ZXIsIG51bGwsIDAsIHBvc195LCBjYy52MigwLCAwKSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRJbWFnZShtYXBfYmcsIFBhdGhUb29sLmdldFVJSWNvblBhdGgoXCJiaWdiZy9ndWlsZHdhclwiLCBcImd1aWxkd2FyXzFcIikpXG4gICAgICAgICAgICB0aGlzLm1hcF9iZ3MucHVzaChtYXBfYmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHluYW1pY0FkZE1hcEltYWdlKCk7XG4gICAgfSxcblxuICAgIGxvYWRJbWFnZTogZnVuY3Rpb24gKGltYWdlLCByZXMpIHtcbiAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNwKSB7XG4gICAgICAgICAgICBpbWFnZS5zcHJpdGVGcmFtZSA9IHNwO1xuICAgICAgICB9LmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIGdldFRvcE9yQm90dG9tTWFwQmdQb3NZOiBmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMubWFwX2Jncykge1xuICAgICAgICAgICAgdmFyIG1hcGJnID0gdGhpcy5tYXBfYmdzW2tdO1xuICAgICAgICAgICAgdmFyIHBvc195ID0gbWFwYmcubm9kZS55O1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSB8fCBwb3NfeTtcbiAgICAgICAgICAgIGlmIChmbGFnID09IDEgJiYgcG9zX3kgPiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcG9zX3k7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWcgPT0gMiAmJiBwb3NfeSA8IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBwb3NfeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgLy/liqjmgIHosIPmlbTlnLDlm77kvY3nva5cbiAgICBkeW5hbWljQWRkTWFwSW1hZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hcF9wb3NfeSA9IHRoaXMubWFwX2xheWVyLnk7XG4gICAgICAgIG1hcF9wb3NfeSA9IE1hdGguYWJzKG1hcF9wb3NfeSk7XG4gICAgICAgIHZhciBvZmZzZXRfeSA9IDY0MDtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLm1hcF9iZ3MpIHtcbiAgICAgICAgICAgIHZhciBtYXBiZyA9IHRoaXMubWFwX2Jnc1trXTtcbiAgICAgICAgICAgIHZhciBiZ19wb3NfeSA9IG1hcGJnLm5vZGUueTtcbiAgICAgICAgICAgIGlmICgoYmdfcG9zX3kgKyBvZmZzZXRfeSkgPCAobWFwX3Bvc195IC0gMTI4MCkpIHtcbiAgICAgICAgICAgICAgICBtYXBiZy5ub2RlLnkgPSB0aGlzLmdldFRvcE9yQm90dG9tTWFwQmdQb3NZKDEpICsgMTI4MDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJnX3Bvc195IC0gb2Zmc2V0X3kpID4gKG1hcF9wb3NfeSArIDEyODApKSB7XG4gICAgICAgICAgICAgICAgbWFwYmcubm9kZS55ID0gdGhpcy5nZXRUb3BPckJvdHRvbU1hcEJnUG9zWSgyKSAtIDEyODA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbW92ZU1hcExheWVyOiBmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICB4ID0gdGhpcy5tYXBfbGF5ZXIueCArIHg7XG4gICAgICAgIHkgPSB0aGlzLm1hcF9sYXllci55ICsgeTtcbiAgICAgICAgdmFyIHJldHVybl9wb3MgPSB0aGlzLmNoZWNrTWFwTGF5ZXJQb2ludCh4LCB5KTtcbiAgICAgICAgdGhpcy5tYXBfbGF5ZXIuc2V0UG9zaXRpb24ocmV0dXJuX3Bvcy54LCByZXR1cm5fcG9zLnkpO1xuICAgIH0sXG5cbiAgICBjaGVja01hcExheWVyUG9pbnQ6IGZ1bmN0aW9uIChfeCwgX3kpIHtcbiAgICAgICAgdmFyIHJldHVybl9wb3MgPSBjYy52MihfeCwgX3kpO1xuICAgICAgICBpZiAoX3ggPiB0aGlzLm1hcF9sYXllcl9wb3NYKSB7XG4gICAgICAgICAgICByZXR1cm5fcG9zLnggPSB0aGlzLm1hcF9sYXllcl9wb3NYO1xuICAgICAgICB9IGVsc2UgaWYgKF94IDwgKHRoaXMuZnJlZV9zaXplLndpZHRoIC0gdGhpcy5tYXBfc2l6ZS53aWR0aCArIHRoaXMubWFwX2xheWVyX3Bvc1gpKSB7XG4gICAgICAgICAgICByZXR1cm5fcG9zLnggPSB0aGlzLmZyZWVfc2l6ZS53aWR0aCAtIHRoaXMubWFwX3NpemUud2lkdGggKyB0aGlzLm1hcF9sYXllcl9wb3NYO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfeSA8ICh0aGlzLmZyZWVfc2l6ZS5oZWlnaHQgLSB0aGlzLm1hcF9zaXplLmhlaWdodCArIHRoaXMubWFwX2xheWVyX3Bvc1kpKSB7XG4gICAgICAgICAgICByZXR1cm5fcG9zLnkgPSB0aGlzLmZyZWVfc2l6ZS5oZWlnaHQgLSB0aGlzLm1hcF9zaXplLmhlaWdodCArIHRoaXMubWFwX2xheWVyX3Bvc1k7XG4gICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3Bvcy55ID49IHRoaXMubWFwX2xheWVyX3Bvc1kpIHtcbiAgICAgICAgICAgIHJldHVybl9wb3MueSA9IHRoaXMubWFwX2xheWVyX3Bvc1k7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVybl9wb3NcbiAgICB9LFxuXG4gICAgLy/liankvZnml7bpl7TmmL7npLpcbiAgICByZWZyZXNoU3VycGx1c1RpbWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zdXJwbHVzVGltZSA9IHRoaXMubW9kZWwuZ2V0R3VpbGRXYXJTdXJwbHVzVGltZSgpO1xuICAgICAgICBpZiAodGhpcy5zdXJwbHVzVGltZSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3VycGx1c1RpbWUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZV9sYWJlbF9sYi5zdHJpbmcgPSBUaW1lVG9vbC5nZXRUaW1lRm9ybWF0RGF5SUlJSUlJSUkodGhpcy5zdXJwbHVzVGltZSk7XG4gICAgICAgIHRoaXMub3Blbkd1aWxkV2FyU3VycGx1c1RpbWVyKHRydWUpO1xuICAgIH0sXG5cbiAgICAvL+a0u+WKqOWJqeS9meaXtumXtOWAkuiuoeaXtlxuICAgIG9wZW5HdWlsZFdhclN1cnBsdXNUaW1lcjogZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAoc3RhdHVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmd1aWxkd2FyX3RpbWVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWxkd2FyX3RpbWVyID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJwbHVzVGltZSA9IHRoaXMuc3VycGx1c1RpbWUgLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXJwbHVzVGltZSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVfbGFiZWxfbGIuc3RyaW5nID0gVGltZVRvb2wuZ2V0VGltZUZvcm1hdERheUlJSUlJSUlJKHRoaXMuc3VycGx1c1RpbWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJwbHVzVGltZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy5ndWlsZHdhcl90aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmd1aWxkd2FyX3RpbWVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgMTAwMCwgLTEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ndWlsZHdhcl90aW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMuZ3VpbGR3YXJfdGltZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VpbGR3YXJfdGltZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5Ymp5L2Z5qyh5pWw5Yi35pawXG4gICAgcmVmcmVzaENoYWxsZW5nZUNvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmd1aWxkd2FyX3N0YXR1cyA9PSBHdWlsZHdhckNvbnN0LnN0YXR1cy5zZXR0bGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNoYWxsZW5nZV9sYWJlbF9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWQjuWFs+mXrVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMubW9kZWwuZ2V0R3VpbGRXYXJDaGFsbGVuZ2VDb3VudCgpO1xuICAgICAgICAgICAgdmFyIG1heF9jb3VudCA9IENvbmZpZy5ndWlsZF93YXJfZGF0YS5kYXRhX2NvbnN0LmNoYWxsYW5nZV90aW1lX2xpbWl0LnZhbDtcbiAgICAgICAgICAgIHRoaXMuY2hhbGxlbmdlX2xhYmVsX2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuaMkeaImOasoeaVsDolcy8lc1wiKSwgKG1heF9jb3VudCAtIGNvdW50KSwgbWF4X2NvdW50KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WIt+aWsOWPjOaWueaYn+aVsOOAgee7k+aenOWSjGJ1Zmbkv6Hmga9cbiAgICByZWZyZXNoU3RhckFuZEJ1ZmZJbmZvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBteUd1aWxkRGF0YSA9IHRoaXMubW9kZWwuZ2V0TXlHdWlsZFdhckJhc2VJbmZvKCk7XG4gICAgICAgIGNjLmxvZyhteUd1aWxkRGF0YSlcbiAgICAgICAgdGhpcy5teV9ndWlsZF9uYW1lX2xiLnN0cmluZyA9IG15R3VpbGREYXRhLmduYW1lIHx8IFwiXCI7XG4gICAgICAgIHRoaXMubXlfZ3VpbGRfc3Rhcl9sYi5zdHJpbmcgPSBteUd1aWxkRGF0YS5ocCB8fCAwO1xuXG4gICAgICAgIHZhciBidWZmX2xldiA9IG15R3VpbGREYXRhLmJ1ZmZfbGV2IHx8IDA7XG4gICAgICAgIHZhciBtYXhfbGV2ZWwgPSBDb25maWcuZ3VpbGRfd2FyX2RhdGEuZGF0YV9idWZmX2xlbmd0aDtcbiAgICAgICAgdGhpcy5idWZmX2x2X2xhYmVsX2xiLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIiVzLyVz57qnXCIpLCBidWZmX2xldiwgbWF4X2xldmVsKTtcblxuICAgICAgICB2YXIgZW5lbXlHdWlsZERhdGEgPSB0aGlzLm1vZGVsLmdldEVuZW15R3VpbGRXYXJCYXNlSW5mbygpO1xuICAgICAgICB0aGlzLmVuZW15X2d1aWxkX25hbWVfbGIuc3RyaW5nID0gZW5lbXlHdWlsZERhdGEuZ25hbWUgfHwgXCJcIjtcbiAgICAgICAgdGhpcy5lbmVteV9ndWlsZF9zdGFyX2xiLnN0cmluZyA9IGVuZW15R3VpbGREYXRhLmhwIHx8IDA7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMubW9kZWwuZ2V0R3VpbGRXYXJSZXN1bHQoKTtcbiAgICAgICAgdGhpcy5teV9ndWlsZF93aW5fbmQuYWN0aXZlID0gcmVzdWx0ID09IEd1aWxkd2FyQ29uc3QucmVzdWx0LndpbjtcbiAgICAgICAgdGhpcy5teV9ndWlsZF9kb2dmYWxsX25kLmFjdGl2ZSA9IHJlc3VsdCA9PSBHdWlsZHdhckNvbnN0LnJlc3VsdC5kb2dmYWxsO1xuICAgICAgICB0aGlzLmVuZW15X2d1aWxkX3dpbl9uZC5hY3RpdmUgPSByZXN1bHQgPT0gR3VpbGR3YXJDb25zdC5yZXN1bHQubG9zZTtcbiAgICAgICAgdGhpcy5lbmVteV9ndWlsZF9kb2dmYWxsX25kLmFjdGl2ZSA9IHJlc3VsdCA9PSBHdWlsZHdhckNvbnN0LnJlc3VsdC5kb2dmYWxsO1xuICAgIH0sXG5cbiAgICAvL+WIt+aWsOWJjeS4ieaOkuWQjeaVsOaNrlxuICAgIHJlZnJlc2hUb3BUaHJlZVJhbms6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJhbmtfbGlzdCA9IHRoaXMubW9kZWwuZ2V0R3VpbGRXYXJUb3BUaHJlZVJhbmsoKTtcbiAgICAgICAgaWYgKHJhbmtfbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQocmFua19saXN0KSA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgZm9yICh2YXIgaSBpbiByYW5rX2xpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gcmFua19saXN0W2ldO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRvcDNfaXRlbV9saXN0W3YucmFua10pIHtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuY3JlYXRlU2luZ2xlUmFua0l0ZW0odi5yYW5rKTtcbiAgICAgICAgICAgICAgICBpdGVtLmNvbnRhaW5lci5zZXRQYXJlbnQodGhpcy5yYW5rX2NvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgdGhpcy50b3AzX2l0ZW1fbGlzdFt2LnJhbmtdID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy50b3AzX2l0ZW1fbGlzdFt2LnJhbmtdO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpdGVtLmNvbnRhaW5lci5zZXRQb3NpdGlvbigtMTAsIC02MCAtICh2LnJhbmsgLSAxKSAqIGl0ZW0uY29udGFpbmVyLmdldENvbnRlbnRTaXplKCkuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICBpdGVtLmxhYmVsLnN0cmluZyA9IHYubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGVTaW5nbGVSYW5rSXRlbTogZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIG9iaiA9IHt9XG4gICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICBvYmouY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgICAgICBjb250YWluZXIuc2V0QW5jaG9yUG9pbnQoY2MudjIoMCwgMSkpO1xuICAgICAgICBjb250YWluZXIuc2V0Q29udGVudFNpemUoY2Muc2l6ZSgxODAsIDQwKSk7XG4gICAgICAgIHZhciBzcCA9IFV0aWxzLmNyZWF0ZUltYWdlKGNvbnRhaW5lciwgbnVsbCwgMCwgMCwgY2MudjIoMCwgMSkpO1xuICAgICAgICB0aGlzLmxvYWRJbWFnZShzcCwgUGF0aFRvb2wuZ2V0VUlJY29uUGF0aChcImNvbW1vblwiLCBcImNvbW1vbl8zMDBcIiArIGkpKVxuICAgICAgICBzcC5ub2RlLnNjYWxlID0gMC41O1xuICAgICAgICBzcC5ub2RlLnggPSAxMDtcbiAgICAgICAgc3Aubm9kZS55ID0gMjA7XG4gICAgICAgIG9iai5zcCA9IHNwO1xuICAgICAgICB2YXIgbGFiZWwgPSBVdGlscy5jcmVhdGVMYWJlbCgyMCwgdGhpcy5jb2xvcl8xLCBudWxsLCA2MCwgMjAsIFwiXCIsIGNvbnRhaW5lcik7XG4gICAgICAgIGxhYmVsLm5vZGUuc2V0QW5jaG9yUG9pbnQoMCwgMSk7XG4gICAgICAgIG9iai5sYWJlbCA9IGxhYmVsO1xuICAgICAgICByZXR1cm4gb2JqXG4gICAgfSxcblxuICAgIC8v5o2u54K5XG4gICAgcmVmcmVzaEd1aWxkV2FyUG9zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl92b19kYXRhID0ge307XG4gICAgICAgIGlmICh0aGlzLmd1aWxkd2FyX3N0YXR1cyA9PSBHdWlsZHdhckNvbnN0LnN0YXR1cy5wcm9jZXNzaW5nIHx8IHRoaXMuZ3VpbGR3YXJfc3RhdHVzID09IEd1aWxkd2FyQ29uc3Quc3RhdHVzLnNldHRsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cl9wb3NpdGlvbl90eXBlID09IEd1aWxkd2FyQ29uc3QucG9zaXRpb25zLm15c2VsZikge1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fdm9fZGF0YSA9IHRoaXMubW9kZWwuZ2V0TXlHdWlsZFdhclBvc2l0aW9uTGlzdCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cl9wb3NpdGlvbl90eXBlID09IEd1aWxkd2FyQ29uc3QucG9zaXRpb25zLm90aGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fdm9fZGF0YSA9IHRoaXMubW9kZWwuZ2V0RW5lbXlHdWlsZFdhclBvc2l0aW9uTGlzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHluYW1pY1Nob3dHdWlsZFdhclBvc2l0aW9uKCk7XG4gICAgfSxcblxuICAgIC8v5Yqo5oCB5Yqg6L295o2u54K55pi+56S6XG4gICAgZHluYW1pY1Nob3dHdWlsZFdhclBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tQb3NpdGlvbk1vdmVUb1Bvb2woKTtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLnBvc2l0aW9uX3ZvX2RhdGEpIHtcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbl92byA9IHRoaXMucG9zaXRpb25fdm9fZGF0YVtrXTtcbiAgICAgICAgICAgIHZhciBwb3NfZGF0YSA9IENvbmZpZy5ndWlsZF93YXJfZGF0YS5kYXRhX3Bvc2l0aW9uW3Bvc2l0aW9uX3ZvLnBvc107XG4gICAgICAgICAgICBpZiAocG9zX2RhdGEgJiYgIXRoaXMucG9zaXRpb25fcG9zW3Bvc2l0aW9uX3ZvLnBvc10gJiYgdGhpcy5jaGVja1Bvc2l0aW9uSXNJbkRpc3BsYXlSZWN0KHBvc19kYXRhLnBvc194LCBwb3NfZGF0YS5wb3NfeSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb25faXRlbSA9IHRoaXMucG9zaXRpb25fcG9vbC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbl9pdGVtID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25faXRlbSA9IG5ldyBHdWlsZHdhclBvc2l0aW9uSXRlbSgpO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbl9pdGVtLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25faXRlbS5zZXRQYXJlbnQodGhpcy5tYXBfbGF5ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3NpdGlvbl9pdGVtLnNldFZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25faXRlbS5zZXREYXRhKHBvc2l0aW9uX3ZvLCB0aGlzLmN1cl9wb3NpdGlvbl90eXBlKTtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbl9pdGVtLnNldFBvc2l0aW9uKHBvc19kYXRhLnBvc194LCBwb3NfZGF0YS5wb3NfeSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9zdGFjay5wdXNoKHBvc2l0aW9uX2l0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fcG9zW3Bvc2l0aW9uX3ZvLnBvc10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5qOA5rWL5bey5Yib5bu655qE5o2u54K55piv5ZCm6ZyA6KaB5pS+5YWl57yT5a2Y5rGgXG4gICAgY2hlY2tQb3NpdGlvbk1vdmVUb1Bvb2w6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBvc2l0aW9uX3N0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMucG9zaXRpb25fc3RhY2tbaV07XG4gICAgICAgICAgICB2YXIgcG9zID0gaXRlbS5nZXRQb3NpdGlvbigpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrUG9zaXRpb25Jc0luRGlzcGxheVJlY3QocG9zLngsIHBvcy55KSkge1xuICAgICAgICAgICAgICAgIHZhciBwb3NfID0gaXRlbS5nZXRQb3NpdGlvblBvcygpO1xuICAgICAgICAgICAgICAgIGl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgaXRlbS5zdXNwZW5kQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fcG9vbC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fc3RhY2suc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fcG9zW3Bvc19dID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+agueaNruaNrueCueS9jee9ruiuoeeul+aYr+WQpuWcqOaYvuekuuWMuuWfn+S5i+WGhVxuICAgIGNoZWNrUG9zaXRpb25Jc0luRGlzcGxheVJlY3Q6IGZ1bmN0aW9uIChwb3NfeCwgcG9zX3kpIHtcbiAgICAgICAgdmFyIGlzSW4gPSB0cnVlO1xuICAgICAgICB2YXIgaXRlbV93aWR0aCA9IDE5MDtcbiAgICAgICAgdmFyIGl0ZW1faGVpZ2h0ID0gMjI2O1xuICAgICAgICB2YXIgbWFwX3BvcyA9IHRoaXMubWFwX2xheWVyLmdldFBvc2l0aW9uKCk7XG4gICAgICAgIHZhciBtYXBfcG9zX3ggPSBNYXRoLmFicyhtYXBfcG9zLngpO1xuICAgICAgICB2YXIgbWFwX3Bvc195ID0gTWF0aC5hYnMobWFwX3Bvcy55KTtcbiAgICAgICAgaWYgKChwb3NfeCArIGl0ZW1fd2lkdGggLyAyKSA8IG1hcF9wb3NfeCAtIDM2MCB8fCAocG9zX3ggLSBpdGVtX3dpZHRoIC8gMikgPiAobWFwX3Bvc194ICsgdGhpcy5mcmVlX3NpemUud2lkdGgtMzYwKSB8fCAocG9zX3kgKyBpdGVtX2hlaWdodCkgPCBtYXBfcG9zX3kgLSA2NDAgfHwgcG9zX3kgPiAobWFwX3Bvc195IC0gNjQwICsgMTI4MCkpIHtcbiAgICAgICAgICAgIGlzSW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNJblxuICAgIH0sXG5cbiAgICAvL+WIh+aNoumYteWcsFxuICAgIGNoYW5nZUd1aWxkd2FyUG9zaXRpb25UeXBlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFwX2xheWVyLnNldFBvc2l0aW9uKGNjLnYyKHRoaXMubWFwX2xheWVyX3Bvc1gsICh0aGlzLmZyZWVfc2l6ZS5oZWlnaHQgLSB0aGlzLm1hcF9zaXplLmhlaWdodCArIHRoaXMubWFwX2xheWVyX3Bvc1kpKSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zX3kgPSAoNiAtIGkpICogMTI4MDtcbiAgICAgICAgICAgIHZhciBtYXBfYmcgPSB0aGlzLm1hcF9iZ3NbaV07XG4gICAgICAgICAgICBpZiAobWFwX2JnKSB7XG4gICAgICAgICAgICAgICAgbWFwX2JnLm5vZGUuc2V0UG9zaXRpb24oY2MudjIoMCwgcG9zX3kpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL+aJgOacieaNrueCuemDveaUvuWFpee8k+WtmOaxoOS4rVxuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5wb3NpdGlvbl9zdGFjay5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5wb3NpdGlvbl9zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHZhciBwb3MgPSBpdGVtLmdldFBvc2l0aW9uUG9zKCk7XG4gICAgICAgICAgICBpdGVtLnNldFZpc2libGUoZmFsc2UpO1xuICAgICAgICAgICAgaXRlbS5zdXNwZW5kQWxsQWN0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9wb29sLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX3Bvc1twb3NdID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN1cl9wb3NpdGlvbl90eXBlID09IEd1aWxkd2FyQ29uc3QucG9zaXRpb25zLm15c2VsZikge1xuICAgICAgICAgICAgdGhpcy5jdXJfcG9zaXRpb25fdHlwZSA9IEd1aWxkd2FyQ29uc3QucG9zaXRpb25zLm90aGVycztcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaEd1aWxkV2FyUG9zaXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlX3NjZW5lX2J0bl9sYi5zdHJpbmcgPSBVdGlscy5USTE4TihcIuaVjOaWuemYteWcsFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VyX3Bvc2l0aW9uX3R5cGUgPSBHdWlsZHdhckNvbnN0LnBvc2l0aW9ucy5teXNlbGY7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZV9zY2VuZV9idG5fbGIuc3RyaW5nID0gVXRpbHMuVEkxOE4oXCLmiJHmlrnpmLXlnLBcIik7XG4gICAgICAgICAgICB2YXIgbXlQb3NpdGlvbkRhdGEgPSB0aGlzLm1vZGVsLmdldE15R3VpbGRXYXJQb3NpdGlvbkxpc3QoKTtcbiAgICAgICAgICAgIGlmIChVdGlscy5uZXh0KG15UG9zaXRpb25EYXRhKSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnJlcXVlc3RNeUd1aWxkUG9zaXRpb25EYXRhKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaEd1aWxkV2FyUG9zaXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGRhdGVNYWluUmVkU3RhdHVzOiBmdW5jdGlvbiAocmVkdHlwZSwgc3RhdHVzKSB7XG4gICAgICAgIGlmIChyZWR0eXBlID09IEd1aWxkQ29uc3QucmVkX2luZGV4Lmd1aWxkd2FyX21hdGNoKSB7XG4gICAgICAgICAgICBVdGlscy5hZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzKHRoaXMuY2xhc2hfbGlzdF9idG4sIHN0YXR1cyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVkdHlwZSA9PSBHdWlsZENvbnN0LnJlZF9pbmRleC5ndWlsZHdhcl9sb2cpIHtcbiAgICAgICAgICAgIFV0aWxzLmFkZFJlZFBvaW50VG9Ob2RlQnlTdGF0dXModGhpcy5hbGx5X2F0a19idG4sIHN0YXR1cyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVkdHlwZSA9PSBHdWlsZENvbnN0LnJlZF9pbmRleC5ndWlsZHdhcl9ib3gpIHtcbiAgICAgICAgICAgIFV0aWxzLmFkZFJlZFBvaW50VG9Ob2RlQnlTdGF0dXModGhpcy5hd2FyZF9ib3hfYnRuLCBzdGF0dXMpO1xuICAgICAgICAgICAgVXRpbHMuYWRkUmVkUG9pbnRUb05vZGVCeVN0YXR1cyh0aGlzLmxvb2tfYm94X2J0biwgc3RhdHVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBtYXRjaF9idG5fc3RhdHVzID0gdGhpcy5tb2RlbC5jaGVja1JlZElzU2hvd0J5UmVkVHlwZShHdWlsZENvbnN0LnJlZF9pbmRleC5ndWlsZHdhcl9tYXRjaCk7XG4gICAgICAgICAgICBVdGlscy5hZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzKHRoaXMuY2xhc2hfbGlzdF9idG4sIG1hdGNoX2J0bl9zdGF0dXMpO1xuXG4gICAgICAgICAgICB2YXIgYXRrX2J0bl9zdGF0dXMgPSB0aGlzLm1vZGVsLmNoZWNrUmVkSXNTaG93QnlSZWRUeXBlKEd1aWxkQ29uc3QucmVkX2luZGV4Lmd1aWxkd2FyX2xvZyk7XG4gICAgICAgICAgICBVdGlscy5hZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzKHRoaXMuYWxseV9hdGtfYnRuLCBhdGtfYnRuX3N0YXR1cyk7XG5cbiAgICAgICAgICAgIHZhciBib3hfYnRuX3N0YXR1cyA9IHRoaXMubW9kZWwuY2hlY2tSZWRJc1Nob3dCeVJlZFR5cGUoR3VpbGRDb25zdC5yZWRfaW5kZXguZ3VpbGR3YXJfYm94KTtcbiAgICAgICAgICAgIFV0aWxzLmFkZFJlZFBvaW50VG9Ob2RlQnlTdGF0dXModGhpcy5hd2FyZF9ib3hfYnRuLCBib3hfYnRuX3N0YXR1cyk7XG4gICAgICAgICAgICBVdGlscy5hZGRSZWRQb2ludFRvTm9kZUJ5U3RhdHVzKHRoaXMubG9va19ib3hfYnRuLCBib3hfYnRuX3N0YXR1cyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5YWz6Zet56qX5L2T5Zue6LCDLOmcgOimgeWcqOi/memHjOiwg+eUqOivpeeql+S9k+aJgOWxnmNvbnRyb2xsZXLnmoRjbG9zZeaWueazleayoeeUqOS6jue9ruepuuivpeeql+S9k+WunuS+i+WvueixoVxuICAgIGNsb3NlQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLnBvc2l0aW9uX3N0YWNrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbl9zdGFja1trXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fc3RhY2tba10uZGVsZXRlTWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uX3N0YWNrW2tdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvc2l0aW9uX3N0YWNrID0gbnVsbDtcblxuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMucG9zaXRpb25fcG9vbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25fcG9vbFtrXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fcG9vbFtrXS5kZWxldGVNZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fcG9vbFtrXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9wb29sID0gbnVsbDtcblxuICAgICAgICB0aGlzLm9wZW5HdWlsZFdhclN1cnBsdXNUaW1lcihmYWxzZSk7XG4gICAgICAgIHRoaXMuY3RybC5vcGVuTWFpbldpbmRvdyhmYWxzZSk7XG4gICAgfSxcbn0pIl19