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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/friend/view/friend_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, '206f7ai3axIgJQSSPY0yn2p', 'friend_window');
// Scripts/mod/friend/view/friend_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      好友主界面
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var FriendController = require("friend_controller");
 
var RoleController = require("role_controller");
 
var CommonScrollView = require("common_scrollview");
 
var FriendListItem = require("friend_list_item");
 
var FriendConst = require("friend_const");
 
var FriendEvent = require("friend_event");
 
var FriendAwardPanel = require("friend_award_panel");
 
var FriendApplyPanel = require("friend_apply_panel");
 
var FriendBlackPanel = require("friend_black_panel");
 
var FriendListPanel = require("friend_list_panel");
 
var MainuiConst = require("mainui_const");
 
var FriendWindow = cc.Class({
  "extends": CommonWindowTab,
  ctor: function ctor() {
    this.ctrl = FriendController.getInstance();
    this.win_type = WinType.Full;
    this.viewTag = SCENE_TAG.ui;
    this.tab_info_list = [{
      label: Utils.TI18N("我的好友"),
      index: FriendConst.Type.MyFriend,
      status: true
    }, {
      label: Utils.TI18N("领取礼物"),
      index: FriendConst.Type.Award,
      status: true
    }, {
      label: Utils.TI18N("申请列表"),
      index: FriendConst.Type.ApplyList,
      status: true
    }, {
      label: Utils.TI18N("黑名单"),
      index: FriendConst.Type.BlackList,
      status: true
    }];
    this.title_str = Utils.TI18N("好友");
    this.view_list = {};
    this.friend_list = {};
    this.scroll_width = 630;
    this.scroll_height = 614;
    this.rend_list = {};
    this.cache_lit = {};
    this.role_vo = RoleController.getInstance().getRoleVo();
  },
  initPanel: function initPanel() {
    var scroll_view_size = cc.size(this.scroll_width, this.scroll_height);
    var setting = {
      item_class: FriendListItem,
      // 单元类
      start_x: 7.5,
      // 第一个单元的X起点
      space_x: 0,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: 2,
      // y方向的间隔
      item_width: 624,
      // 单元的尺寸width
      item_height: 114,
      // 单元的尺寸height
      row: 0,
      // 行数,作用于水平滚动类型
      col: 1,
      // 列数,作用于垂直滚动类型
      once_num: 1,
      need_dynamic: true
    };
    this.item_scrollview = new CommonScrollView();
    this.item_scrollview.createScroll(this.scroll_con, cc.v2(0, 65), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
  },
  registerEvent: function registerEvent() {
    //申请好友列表返回
    this.addGlobalEvent(FriendEvent.FRIEND_APPLY, function () {
      if (this.cur_type != FriendConst.Type.ApplyList) return;
      this.updateFriendList(false);
    }.bind(this)); //赠送返回
 
    this.addGlobalEvent(FriendEvent.STRENGTH_UPDATE, function (data) {
      if (this.cur_type != FriendConst.Type.Award && this.cur_type != FriendConst.Type.MyFriend) return;
      var list = data.list || {};
      var id_list = {};
 
      for (var i in list) {
        var v = list[i];
        id_list[v.rid + "_" + v.srv_id] = v;
      }
 
      var item_list = this.item_scrollview.getItemList();
 
      if (item_list) {
        for (var k in item_list) {
          var v = item_list[k];
          var vo = v.getData();
 
          if (vo && id_list[vo.rid + "_" + vo.srv_id]) {
            v.setData(id_list[vo.rid + "_" + vo.srv_id]);
          }
        }
      }
    }.bind(this)); //删除好友返回
 
    this.addGlobalEvent(FriendEvent.FRIEND_DELETE, function () {
      if (this.cur_type != FriendConst.Type.MyFriend && this.cur_type != FriendConst.Type.BlackList) return;
      this.updateFriendList(false, true);
      this.changeFriendBtn(true);
    }.bind(this)); //增加好友
 
    this.addGlobalEvent(FriendEvent.UPDATE_APPLY, function () {
      if (this.cur_type != FriendConst.Type.MyFriend) {
        this.setTabTips(true, FriendConst.Type.MyFriend);
 
        if (this.cur_type == FriendConst.Type.ApplyList) {
          this.updateFriendList(false);
        }
      } else {
        this.updateFriendList(false);
      }
 
      this.showRedPoint();
    }.bind(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 == "friend_point") {
            if (this.cur_type == FriendConst.Type.MyFriend || this.cur_type == FriendConst.Type.Award) {
              if (this.pre_panel && this.pre_panel.setFriendPoint) this.pre_panel.setFriendPoint();
            }
          }
        }.bind(this));
      }
    }
 
    this.addGlobalEvent(FriendEvent.UPDATE_COUNT, function () {
      this.updateFriendList(false);
      this.showRedPoint();
    }.bind(this)); //被删好友
 
    this.addGlobalEvent(FriendEvent.UPDATE_GROUP_COUNT, function () {
      this.updateFriendList(false, true);
      this.showRedPoint();
    }.bind(this)); //有人来礼物
 
    this.addGlobalEvent(FriendEvent.FRIEND_LIST, function () {
      this.updateFriendList(false);
      this.showRedPoint();
    }.bind(this)); //更新红点用
 
    this.addGlobalEvent(FriendEvent.Update_Red_Point, function () {
      this.showRedPoint();
    }.bind(this));
  },
  openRootWnd: function openRootWnd(type) {
    type = type || FriendConst.Type.MyFriend;
    this.setSelecteTab(type, true);
    this.showRedPoint();
  },
  //切换标签页
  selectedTabCallBack: function selectedTabCallBack(type) {
    type = type || FriendConst.Type.MyFriend;
    if (this.cur_type == type) return;
    this.changeFriendBtn(false); // //切换到好友列表就把红点清掉
 
    this.setTabTips(false, FriendConst.Type.MyFriend);
    this.cur_type = type;
 
    if (this.pre_panel != null) {
      if (this.pre_panel.setVisibleStatus) this.pre_panel.setVisibleStatus(false);
    }
 
    this.pre_panel = this.createSubPanel(this.cur_type);
 
    if (this.pre_panel != null) {
      if (this.pre_panel.setVisibleStatus) this.pre_panel.setVisibleStatus(true);
    }
 
    if (this.cur_type == FriendConst.Type.MyFriend) {
      this.scroll_con.y = 433;
      this.scroll_con.setContentSize(cc.size(this.scroll_width, this.scroll_height));
      this.item_scrollview.resetSize(cc.size(this.scroll_width, this.scroll_height));
    } else if (this.cur_type == FriendConst.Type.Award) {
      this.scroll_con.y = 375;
      this.scroll_con.setContentSize(cc.size(this.scroll_width, 600));
      this.item_scrollview.resetSize(cc.size(this.scroll_width, 674));
    } else {
      this.scroll_con.y = 323;
      this.scroll_con.setContentSize(cc.size(this.scroll_width, 724));
      this.item_scrollview.resetSize(cc.size(this.scroll_width, 724));
    } // //更新列表数据
 
 
    this.updateFriendList(true);
  },
  createSubPanel: function createSubPanel(index) {
    var panel = this.view_list[index];
 
    if (panel == null) {
      if (index == FriendConst.Type.MyFriend) {
        panel = new FriendListPanel();
      } else if (index == FriendConst.Type.ApplyList) {
        panel = new FriendApplyPanel(this.container);
      } else if (index == FriendConst.Type.Award) {
        panel = new FriendAwardPanel();
      } else if (index == FriendConst.Type.BlackList) {
        panel = new FriendBlackPanel();
      }
 
      panel.show();
      var size = this.container.getContentSize(); // panel.setPosition(cc.v2(size.width / 2, 405));
 
      panel.setParent(this.container);
      this.view_list[index] = panel;
    }
 
    if (panel && panel.setCallFun) {
      panel.setCallFun(function (is_del) {
        if (index == FriendConst.Type.MyFriend) {
          is_del = is_del || false;
          this.changeFriendBtn(is_del);
        }
      }.bind(this));
    }
 
    return panel;
  },
  //变更好友子项的按钮作用,true变为删除好友,false还原为私聊
  changeFriendBtn: function changeFriendBtn(bool) {
    this.del_friend_status = bool;
 
    for (var i = 0; i < this.rend_list.length; ++i) {
      this.rend_list[i].del_status = bool;
    }
 
    this.item_scrollview.resetAddPosition(this.rend_list, null, this.cur_type); // var item_list = this.item_scrollview.getItemList();
    // if (item_list) {
    //     for (var k in item_list) {
    //         item_list[k].setDelStatus(bool)
    //     }
    // }
  },
  updateFriendList: function updateFriendList(change_index, is_del) {
    change_index = change_index || false;
    this.rend_list = [];
    var list = [];
 
    if (this.cur_type == FriendConst.Type.MyFriend) {
      list = this.ctrl.getModel().getArray() || [];
    } else if (this.cur_type == FriendConst.Type.ApplyList) {
      if (change_index == true) {
        this.ctrl.apply();
        return;
      } else {
        var array = [];
        var apply_list = this.ctrl.getModel().getApplyList() || {};
 
        for (var i in apply_list) {
          array.push(apply_list[i]);
        }
 
        list = array;
      }
 
      this.updateApplyNum();
    } else if (this.cur_type == FriendConst.Type.Award) {
      var array = this.ctrl.getModel().getArray() || [];
      var award_array = [];
 
      for (var i = 0; i < array.length; i++) {
        var vo = array[i];
 
        if (vo && vo.is_draw == 1) {
          award_array.push(vo);
        }
      }
 
      list = award_array;
    } else if (this.cur_type == FriendConst.Type.BlackList) {
      list = this.ctrl.getModel().getBlackArray() || [];
    }
 
    if (list) {
      for (var k in list) {
        if (list[k]) {
          this.rend_list.push(list[k]);
        }
      }
    }
 
    this.showEmptyIcon(false);
 
    if (this.rend_list.length <= 0) {
      this.showEmptyIcon(true);
    }
 
    this.pre_panel.setData(this.rend_list);
    if (is_del == true && change_index == false && Utils.next(this.rend_list) != null) this.item_scrollview.setData(this.rend_list, null);else {
      this.item_scrollview.setData(this.rend_list, null, this.cur_type);
    }
  },
  //更新申请数
  updateApplyNum: function updateApplyNum() {
    if (this.pre_panel && this.pre_panel.setApplyNum) {
      var num = this.ctrl.getModel().getApplyNum() || 0;
      this.pre_panel.setApplyNum(num);
    }
  },
  //红点处理
  showRedPoint: function showRedPoint() {
    var award_num = this.ctrl.getModel().getAwardNum() || 0;
    this.setTabTipsII(award_num, FriendConst.Type.Award);
    var appl_num = this.ctrl.getModel().getApplyNum() || 0;
    this.setTabTipsII(appl_num, FriendConst.Type.ApplyList);
    var list = [{
      bid: 1,
      num: award_num
    }, {
      bid: 2,
      num: appl_num
    }];
 
    require("mainui_controller").getInstance().setFunctionTipsStatus(MainuiConst.icon.friend, list);
  },
  //显示空白
  showEmptyIcon: function showEmptyIcon(bool) {
    if (!this.empty_con && bool == false) return;
    var str = "暂无好友";
 
    if (this.cur_type == FriendConst.Type.Award) {
      str = "暂无好友赠送";
    } else if (this.cur_type == FriendConst.Type.ApplyList) {
      str = "暂无好友申请";
    } else if (this.cur_type == FriendConst.Type.BlackList) {
      str = "暂无拉黑名单";
    }
 
    this.empty_label.string = str;
    this.empty_con.active = bool;
  },
  closeCallBack: function closeCallBack() {
    this.ctrl.openFriendWindow(false);
 
    if (this.item_scrollview) {
      this.item_scrollview.DeleteMe();
      this.item_scrollview = null;
    }
 
    for (var i in this.view_list) {
      var v = this.view_list[i];
 
      if (v && v.deleteMe) {
        v.deleteMe();
        v = null;
      }
    }
 
    this.view_list = null;
 
    if (this.role_vo != null) {
      if (this.role_assets_event != null) {
        this.role_vo.unbind(this.role_assets_event);
        this.role_assets_event = null;
      }
    }
  }
});
module.exports = FriendWindow;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxmcmllbmRcXHZpZXdcXGZyaWVuZF93aW5kb3cuanMiXSwibmFtZXMiOlsiRnJpZW5kQ29udHJvbGxlciIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIkNvbW1vblNjcm9sbFZpZXciLCJGcmllbmRMaXN0SXRlbSIsIkZyaWVuZENvbnN0IiwiRnJpZW5kRXZlbnQiLCJGcmllbmRBd2FyZFBhbmVsIiwiRnJpZW5kQXBwbHlQYW5lbCIsIkZyaWVuZEJsYWNrUGFuZWwiLCJGcmllbmRMaXN0UGFuZWwiLCJNYWludWlDb25zdCIsIkZyaWVuZFdpbmRvdyIsImNjIiwiQ2xhc3MiLCJDb21tb25XaW5kb3dUYWIiLCJjdG9yIiwiY3RybCIsImdldEluc3RhbmNlIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsInZpZXdUYWciLCJTQ0VORV9UQUciLCJ1aSIsInRhYl9pbmZvX2xpc3QiLCJsYWJlbCIsIlV0aWxzIiwiVEkxOE4iLCJpbmRleCIsIlR5cGUiLCJNeUZyaWVuZCIsInN0YXR1cyIsIkF3YXJkIiwiQXBwbHlMaXN0IiwiQmxhY2tMaXN0IiwidGl0bGVfc3RyIiwidmlld19saXN0IiwiZnJpZW5kX2xpc3QiLCJzY3JvbGxfd2lkdGgiLCJzY3JvbGxfaGVpZ2h0IiwicmVuZF9saXN0IiwiY2FjaGVfbGl0Iiwicm9sZV92byIsImdldFJvbGVWbyIsImluaXRQYW5lbCIsInNjcm9sbF92aWV3X3NpemUiLCJzaXplIiwic2V0dGluZyIsIml0ZW1fY2xhc3MiLCJzdGFydF94Iiwic3BhY2VfeCIsInN0YXJ0X3kiLCJzcGFjZV95IiwiaXRlbV93aWR0aCIsIml0ZW1faGVpZ2h0Iiwicm93IiwiY29sIiwib25jZV9udW0iLCJuZWVkX2R5bmFtaWMiLCJpdGVtX3Njcm9sbHZpZXciLCJjcmVhdGVTY3JvbGwiLCJzY3JvbGxfY29uIiwidjIiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJGUklFTkRfQVBQTFkiLCJjdXJfdHlwZSIsInVwZGF0ZUZyaWVuZExpc3QiLCJiaW5kIiwiU1RSRU5HVEhfVVBEQVRFIiwiZGF0YSIsImxpc3QiLCJpZF9saXN0IiwiaSIsInYiLCJyaWQiLCJzcnZfaWQiLCJpdGVtX2xpc3QiLCJnZXRJdGVtTGlzdCIsImsiLCJ2byIsImdldERhdGEiLCJzZXREYXRhIiwiRlJJRU5EX0RFTEVURSIsImNoYW5nZUZyaWVuZEJ0biIsIlVQREFURV9BUFBMWSIsInNldFRhYlRpcHMiLCJzaG93UmVkUG9pbnQiLCJyb2xlX2Fzc2V0c19ldmVudCIsIkV2ZW50SWQiLCJVUERBVEVfUk9MRV9BVFRSSUJVVEUiLCJrZXkiLCJ2YWx1ZSIsInByZV9wYW5lbCIsInNldEZyaWVuZFBvaW50IiwiVVBEQVRFX0NPVU5UIiwiVVBEQVRFX0dST1VQX0NPVU5UIiwiRlJJRU5EX0xJU1QiLCJVcGRhdGVfUmVkX1BvaW50Iiwib3BlblJvb3RXbmQiLCJ0eXBlIiwic2V0U2VsZWN0ZVRhYiIsInNlbGVjdGVkVGFiQ2FsbEJhY2siLCJzZXRWaXNpYmxlU3RhdHVzIiwiY3JlYXRlU3ViUGFuZWwiLCJ5Iiwic2V0Q29udGVudFNpemUiLCJyZXNldFNpemUiLCJwYW5lbCIsImNvbnRhaW5lciIsInNob3ciLCJnZXRDb250ZW50U2l6ZSIsInNldFBhcmVudCIsInNldENhbGxGdW4iLCJpc19kZWwiLCJib29sIiwiZGVsX2ZyaWVuZF9zdGF0dXMiLCJsZW5ndGgiLCJkZWxfc3RhdHVzIiwicmVzZXRBZGRQb3NpdGlvbiIsImNoYW5nZV9pbmRleCIsImdldE1vZGVsIiwiZ2V0QXJyYXkiLCJhcHBseSIsImFycmF5IiwiYXBwbHlfbGlzdCIsImdldEFwcGx5TGlzdCIsInB1c2giLCJ1cGRhdGVBcHBseU51bSIsImF3YXJkX2FycmF5IiwiaXNfZHJhdyIsImdldEJsYWNrQXJyYXkiLCJzaG93RW1wdHlJY29uIiwibmV4dCIsInNldEFwcGx5TnVtIiwibnVtIiwiZ2V0QXBwbHlOdW0iLCJhd2FyZF9udW0iLCJnZXRBd2FyZE51bSIsInNldFRhYlRpcHNJSSIsImFwcGxfbnVtIiwiYmlkIiwic2V0RnVuY3Rpb25UaXBzU3RhdHVzIiwiaWNvbiIsImZyaWVuZCIsImVtcHR5X2NvbiIsInN0ciIsImVtcHR5X2xhYmVsIiwic3RyaW5nIiwiYWN0aXZlIiwiY2xvc2VDYWxsQmFjayIsIm9wZW5GcmllbmRXaW5kb3ciLCJEZWxldGVNZSIsImRlbGV0ZU1lIiwidW5iaW5kIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxnQkFBZ0IsR0FBR0MsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlDLGNBQWMsR0FBR0QsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlFLGdCQUFnQixHQUFHRixPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUcsY0FBYyxHQUFHSCxPQUFPLENBQUMsa0JBQUQsQ0FBNUI7O0FBQ0EsSUFBSUksV0FBVyxHQUFHSixPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxJQUFJSyxXQUFXLEdBQUdMLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlNLGdCQUFnQixHQUFHTixPQUFPLENBQUMsb0JBQUQsQ0FBOUI7O0FBQ0EsSUFBSU8sZ0JBQWdCLEdBQUdQLE9BQU8sQ0FBQyxvQkFBRCxDQUE5Qjs7QUFDQSxJQUFJUSxnQkFBZ0IsR0FBR1IsT0FBTyxDQUFDLG9CQUFELENBQTlCOztBQUNBLElBQUlTLGVBQWUsR0FBR1QsT0FBTyxDQUFDLG1CQUFELENBQTdCOztBQUNBLElBQUlVLFdBQVcsR0FBR1YsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBRUEsSUFBSVcsWUFBWSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUN4QixhQUFTQyxlQURlO0FBRXhCQyxFQUFB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SUFBZ0IsSUFBcEIsRUFBMEI7QUFDdEIsVUFBSSxLQUFLa0QsaUJBQUwsSUFBMEIsSUFBOUIsRUFBb0M7QUFDaEMsYUFBS2xELE9BQUwsQ0FBYW9ILE1BQWIsQ0FBb0IsS0FBS2xFLGlCQUF6QjtBQUNBLGFBQUtBLGlCQUFMLEdBQXlCLElBQXpCO0FBQ0g7QUFDSjtBQUVKO0FBN1V1QixDQUFULENBQW5CO0FBa1ZBbUUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCckosWUFBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8vIEBhdXRob3I6IHNoaXJhaG9Ac3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcclxuLy8gQGRlc2NyaXB0aW9uOlxyXG4vLyAgICAgIOWlveWPi+S4u+eVjOmdolxyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbnZhciBGcmllbmRDb250cm9sbGVyID0gcmVxdWlyZShcImZyaWVuZF9jb250cm9sbGVyXCIpO1xyXG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xyXG52YXIgQ29tbW9uU2Nyb2xsVmlldyA9IHJlcXVpcmUoXCJjb21tb25fc2Nyb2xsdmlld1wiKTtcclxudmFyIEZyaWVuZExpc3RJdGVtID0gcmVxdWlyZShcImZyaWVuZF9saXN0X2l0ZW1cIik7XHJcbnZhciBGcmllbmRDb25zdCA9IHJlcXVpcmUoXCJmcmllbmRfY29uc3RcIik7XHJcbnZhciBGcmllbmRFdmVudCA9IHJlcXVpcmUoXCJmcmllbmRfZXZlbnRcIik7XHJcbnZhciBGcmllbmRBd2FyZFBhbmVsID0gcmVxdWlyZShcImZyaWVuZF9hd2FyZF9wYW5lbFwiKTtcclxudmFyIEZyaWVuZEFwcGx5UGFuZWwgPSByZXF1aXJlKFwiZnJpZW5kX2FwcGx5X3BhbmVsXCIpO1xyXG52YXIgRnJpZW5kQmxhY2tQYW5lbCA9IHJlcXVpcmUoXCJmcmllbmRfYmxhY2tfcGFuZWxcIik7XHJcbnZhciBGcmllbmRMaXN0UGFuZWwgPSByZXF1aXJlKFwiZnJpZW5kX2xpc3RfcGFuZWxcIik7XHJcbnZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XHJcblxyXG52YXIgRnJpZW5kV2luZG93ID0gY2MuQ2xhc3Moe1xyXG4gICAgZXh0ZW5kczogQ29tbW9uV2luZG93VGFiLFxyXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3RybCA9IEZyaWVuZENvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTtcclxuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsO1xyXG4gICAgICAgIHRoaXMudmlld1RhZyA9IFNDRU5FX1RBRy51aTsgXHJcbiAgICAgICAgdGhpcy50YWJfaW5mb19saXN0ID0gW1xyXG4gICAgICAgICAgICB7IGxhYmVsOiBVdGlscy5USTE4TihcIuaIkeeahOWlveWPi1wiKSwgaW5kZXg6IEZyaWVuZENvbnN0LlR5cGUuTXlGcmllbmQsIHN0YXR1czogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IGxhYmVsOiBVdGlscy5USTE4TihcIumihuWPluekvOeJqVwiKSwgaW5kZXg6IEZyaWVuZENvbnN0LlR5cGUuQXdhcmQsIHN0YXR1czogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7IGxhYmVsOiBVdGlscy5USTE4TihcIueUs+ivt+WIl+ihqFwiKSwgaW5kZXg6IEZyaWVuZENvbnN0LlR5cGUuQXBwbHlMaXN0LCBzdGF0dXM6IHRydWUgfSxcclxuICAgICAgICAgICAgeyBsYWJlbDogVXRpbHMuVEkxOE4oXCLpu5HlkI3ljZVcIiksIGluZGV4OiBGcmllbmRDb25zdC5UeXBlLkJsYWNrTGlzdCwgc3RhdHVzOiB0cnVlIH1cclxuICAgICAgICBdO1xyXG4gICAgICAgIHRoaXMudGl0bGVfc3RyID0gVXRpbHMuVEkxOE4oXCLlpb3lj4tcIik7XHJcbiAgICAgICAgdGhpcy52aWV3X2xpc3QgPSB7fTtcclxuICAgICAgICB0aGlzLmZyaWVuZF9saXN0ID0ge307XHJcbiAgICAgICAgdGhpcy5zY3JvbGxfd2lkdGggPSA2MzA7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxfaGVpZ2h0ID0gNjE0O1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRfbGlzdCA9IHt9O1xyXG4gICAgICAgIHRoaXMuY2FjaGVfbGl0ID0ge307XHJcbiAgICAgICAgdGhpcy5yb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcclxuICAgIH0sXHJcblxyXG4gICAgaW5pdFBhbmVsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHNjcm9sbF92aWV3X3NpemUgPSBjYy5zaXplKHRoaXMuc2Nyb2xsX3dpZHRoLCB0aGlzLnNjcm9sbF9oZWlnaHQpXHJcbiAgICAgICAgdmFyIHNldHRpbmcgPSB7XHJcbiAgICAgICAgICAgIGl0ZW1fY2xhc3M6IEZyaWVuZExpc3RJdGVtLCAgICAgIC8vIOWNleWFg+exu1xyXG4gICAgICAgICAgICBzdGFydF94OiA3LjUsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRY6LW354K5XHJcbiAgICAgICAgICAgIHNwYWNlX3g6IDAsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXHJcbiAgICAgICAgICAgIHN0YXJ0X3k6IDAsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XHJcbiAgICAgICAgICAgIHNwYWNlX3k6IDIsICAgICAgICAgICAgICAgICAgIC8vIHnmlrnlkJHnmoTpl7TpmpRcclxuICAgICAgICAgICAgaXRlbV93aWR0aDogNjI0LCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXHJcbiAgICAgICAgICAgIGl0ZW1faGVpZ2h0OiAxMTQsICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlsLrlr7hoZWlnaHRcclxuICAgICAgICAgICAgcm93OiAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOihjOaVsO+8jOS9nOeUqOS6juawtOW5s+a7muWKqOexu+Wei1xyXG4gICAgICAgICAgICBjb2w6IDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXHJcbiAgICAgICAgICAgIG9uY2VfbnVtOiAxLFxyXG4gICAgICAgICAgICBuZWVkX2R5bmFtaWM6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcgPSBuZXcgQ29tbW9uU2Nyb2xsVmlldygpXHJcbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuY3JlYXRlU2Nyb2xsKHRoaXMuc2Nyb2xsX2NvbiwgY2MudjIoMCwgNjUpLCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCBzY3JvbGxfdmlld19zaXplLCBzZXR0aW5nLCBjYy52MigwLjUsIDAuNSkpXHJcbiAgICB9LFxyXG5cclxuICAgIHJlZ2lzdGVyRXZlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvL+eUs+ivt+WlveWPi+WIl+ihqOi/lOWbnlxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRnJpZW5kRXZlbnQuRlJJRU5EX0FQUExZLCAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfdHlwZSAhPSBGcmllbmRDb25zdC5UeXBlLkFwcGx5TGlzdClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZyaWVuZExpc3QoZmFsc2UpO1xyXG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICAvL+i1oOmAgei/lOWbnlxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRnJpZW5kRXZlbnQuU1RSRU5HVEhfVVBEQVRFLCAoZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3R5cGUgIT0gRnJpZW5kQ29uc3QuVHlwZS5Bd2FyZCAmJiB0aGlzLmN1cl90eXBlICE9IEZyaWVuZENvbnN0LlR5cGUuTXlGcmllbmQpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuXHJcbiAgICAgICAgICAgIHZhciBsaXN0ID0gZGF0YS5saXN0IHx8IHt9O1xyXG4gICAgICAgICAgICB2YXIgaWRfbGlzdCA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIGxpc3QpIHtcclxuICAgICAgICAgICAgICAgIHZhciB2ID0gbGlzdFtpXTtcclxuICAgICAgICAgICAgICAgIGlkX2xpc3Rbdi5yaWQgKyBcIl9cIiArIHYuc3J2X2lkXSA9IHZcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgaXRlbV9saXN0ID0gdGhpcy5pdGVtX3Njcm9sbHZpZXcuZ2V0SXRlbUxpc3QoKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1fbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBpdGVtX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGl0ZW1fbGlzdFtrXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdm8gPSB2LmdldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodm8gJiYgaWRfbGlzdFt2by5yaWQgKyBcIl9cIiArIHZvLnNydl9pZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdi5zZXREYXRhKGlkX2xpc3Rbdm8ucmlkICsgXCJfXCIgKyB2by5zcnZfaWRdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS5iaW5kKHRoaXMpKVxyXG5cclxuICAgICAgICAvL+WIoOmZpOWlveWPi+i/lOWbnlxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRnJpZW5kRXZlbnQuRlJJRU5EX0RFTEVURSwgKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3R5cGUgIT0gRnJpZW5kQ29uc3QuVHlwZS5NeUZyaWVuZCAmJiB0aGlzLmN1cl90eXBlICE9IEZyaWVuZENvbnN0LlR5cGUuQmxhY2tMaXN0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRnJpZW5kTGlzdChmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRnJpZW5kQnRuKHRydWUpXHJcbiAgICAgICAgfSkuYmluZCh0aGlzKSlcclxuXHJcbiAgICAgICAgLy/lop7liqDlpb3lj4tcclxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEZyaWVuZEV2ZW50LlVQREFURV9BUFBMWSwgKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3R5cGUgIT0gRnJpZW5kQ29uc3QuVHlwZS5NeUZyaWVuZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUYWJUaXBzKHRydWUsIEZyaWVuZENvbnN0LlR5cGUuTXlGcmllbmQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3R5cGUgPT0gRnJpZW5kQ29uc3QuVHlwZS5BcHBseUxpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyaWVuZExpc3QoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGcmllbmRMaXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNob3dSZWRQb2ludCgpXHJcbiAgICAgICAgfSkuYmluZCh0aGlzKSlcclxuXHJcbiAgICAgICAgLy/lj4vmg4Xngrnlj5jljJbmm7TmlrBcclxuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX2Fzc2V0c19ldmVudCA9IHRoaXMucm9sZV92by5iaW5kKEV2ZW50SWQuVVBEQVRFX1JPTEVfQVRUUklCVVRFLCAoZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IFwiZnJpZW5kX3BvaW50XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VyX3R5cGUgPT0gRnJpZW5kQ29uc3QuVHlwZS5NeUZyaWVuZCB8fCB0aGlzLmN1cl90eXBlID09IEZyaWVuZENvbnN0LlR5cGUuQXdhcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZV9wYW5lbCAmJiB0aGlzLnByZV9wYW5lbC5zZXRGcmllbmRQb2ludClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZV9wYW5lbC5zZXRGcmllbmRQb2ludCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChGcmllbmRFdmVudC5VUERBVEVfQ09VTlQsIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRnJpZW5kTGlzdChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd1JlZFBvaW50KCk7XHJcbiAgICAgICAgfSkuYmluZCh0aGlzKSlcclxuXHJcbiAgICAgICAgLy/ooqvliKDlpb3lj4tcclxuXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChGcmllbmRFdmVudC5VUERBVEVfR1JPVVBfQ09VTlQsIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRnJpZW5kTGlzdChmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd1JlZFBvaW50KCk7XHJcbiAgICAgICAgfSkuYmluZCh0aGlzKSlcclxuXHJcblxyXG4gICAgICAgIC8v5pyJ5Lq65p2l56S854mpXHJcbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChGcmllbmRFdmVudC5GUklFTkRfTElTVCwgKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGcmllbmRMaXN0KGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93UmVkUG9pbnQoKTtcclxuICAgICAgICB9KS5iaW5kKHRoaXMpKVxyXG5cclxuICAgICAgICAvL+abtOaWsOe6oueCueeUqFxyXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRnJpZW5kRXZlbnQuVXBkYXRlX1JlZF9Qb2ludCwgKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93UmVkUG9pbnQoKTtcclxuICAgICAgICB9KS5iaW5kKHRoaXMpKVxyXG4gICAgfSxcclxuXHJcbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKHR5cGUpIHtcclxuICAgICAgICB0eXBlID0gdHlwZSB8fCBGcmllbmRDb25zdC5UeXBlLk15RnJpZW5kO1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZVRhYih0eXBlLCB0cnVlKTtcclxuICAgICAgICB0aGlzLnNob3dSZWRQb2ludCgpO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy/liIfmjaLmoIfnrb7pobVcclxuICAgIHNlbGVjdGVkVGFiQ2FsbEJhY2s6IGZ1bmN0aW9uICh0eXBlKSB7XHJcbiAgICAgICAgdHlwZSA9IHR5cGUgfHwgRnJpZW5kQ29uc3QuVHlwZS5NeUZyaWVuZDtcclxuICAgICAgICBpZiAodGhpcy5jdXJfdHlwZSA9PSB0eXBlKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB0aGlzLmNoYW5nZUZyaWVuZEJ0bihmYWxzZSk7XHJcbiAgICAgICAgLy8gLy/liIfmjaLliLDlpb3lj4vliJfooajlsLHmiornuqLngrnmuIXmjolcclxuICAgICAgICB0aGlzLnNldFRhYlRpcHMoZmFsc2UsIEZyaWVuZENvbnN0LlR5cGUuTXlGcmllbmQpO1xyXG5cclxuICAgICAgICB0aGlzLmN1cl90eXBlID0gdHlwZTtcclxuICAgICAgICBpZiAodGhpcy5wcmVfcGFuZWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVfcGFuZWwuc2V0VmlzaWJsZVN0YXR1cylcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlX3BhbmVsLnNldFZpc2libGVTdGF0dXMoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmVfcGFuZWwgPSB0aGlzLmNyZWF0ZVN1YlBhbmVsKHRoaXMuY3VyX3R5cGUpO1xyXG4gICAgICAgIGlmICh0aGlzLnByZV9wYW5lbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZV9wYW5lbC5zZXRWaXNpYmxlU3RhdHVzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVfcGFuZWwuc2V0VmlzaWJsZVN0YXR1cyh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJfdHlwZSA9PSBGcmllbmRDb25zdC5UeXBlLk15RnJpZW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX2Nvbi55ID0gNDMzO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF9jb24uc2V0Q29udGVudFNpemUoY2Muc2l6ZSh0aGlzLnNjcm9sbF93aWR0aCwgdGhpcy5zY3JvbGxfaGVpZ2h0KSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnJlc2V0U2l6ZShjYy5zaXplKHRoaXMuc2Nyb2xsX3dpZHRoLCB0aGlzLnNjcm9sbF9oZWlnaHQpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VyX3R5cGUgPT0gRnJpZW5kQ29uc3QuVHlwZS5Bd2FyZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbF9jb24ueSA9IDM3NTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfY29uLnNldENvbnRlbnRTaXplKGNjLnNpemUodGhpcy5zY3JvbGxfd2lkdGgsIDYwMCkpO1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5yZXNldFNpemUoY2Muc2l6ZSh0aGlzLnNjcm9sbF93aWR0aCwgNjc0KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfY29uLnkgPSAzMjM7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsX2Nvbi5zZXRDb250ZW50U2l6ZShjYy5zaXplKHRoaXMuc2Nyb2xsX3dpZHRoLCA3MjQpKTtcclxuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcucmVzZXRTaXplKGNjLnNpemUodGhpcy5zY3JvbGxfd2lkdGgsIDcyNCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyAvL+abtOaWsOWIl+ihqOaVsOaNrlxyXG4gICAgICAgIHRoaXMudXBkYXRlRnJpZW5kTGlzdCh0cnVlKTtcclxuICAgIH0sXHJcblxyXG5cclxuICAgIGNyZWF0ZVN1YlBhbmVsOiBmdW5jdGlvbiAoaW5kZXgpIHtcclxuICAgICAgICB2YXIgcGFuZWwgPSB0aGlzLnZpZXdfbGlzdFtpbmRleF07XHJcbiAgICAgICAgaWYgKHBhbmVsID09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID09IEZyaWVuZENvbnN0LlR5cGUuTXlGcmllbmQpIHtcclxuICAgICAgICAgICAgICAgIHBhbmVsID0gbmV3IEZyaWVuZExpc3RQYW5lbCgpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IEZyaWVuZENvbnN0LlR5cGUuQXBwbHlMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBwYW5lbCA9IG5ldyBGcmllbmRBcHBseVBhbmVsKHRoaXMuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSBGcmllbmRDb25zdC5UeXBlLkF3YXJkKSB7XHJcbiAgICAgICAgICAgICAgICBwYW5lbCA9IG5ldyBGcmllbmRBd2FyZFBhbmVsKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gRnJpZW5kQ29uc3QuVHlwZS5CbGFja0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIHBhbmVsID0gbmV3IEZyaWVuZEJsYWNrUGFuZWwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYW5lbC5zaG93KClcclxuICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLmNvbnRhaW5lci5nZXRDb250ZW50U2l6ZSgpO1xyXG4gICAgICAgICAgICAvLyBwYW5lbC5zZXRQb3NpdGlvbihjYy52MihzaXplLndpZHRoIC8gMiwgNDA1KSk7XHJcbiAgICAgICAgICAgIHBhbmVsLnNldFBhcmVudCh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMudmlld19saXN0W2luZGV4XSA9IHBhbmVsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhbmVsICYmIHBhbmVsLnNldENhbGxGdW4pIHtcclxuICAgICAgICAgICAgcGFuZWwuc2V0Q2FsbEZ1bigoZnVuY3Rpb24gKGlzX2RlbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IEZyaWVuZENvbnN0LlR5cGUuTXlGcmllbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpc19kZWwgPSBpc19kZWwgfHwgZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VGcmllbmRCdG4oaXNfZGVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBhbmVsXHJcbiAgICB9LFxyXG5cclxuICAgIC8v5Y+Y5pu05aW95Y+L5a2Q6aG555qE5oyJ6ZKu5L2c55So77yMdHJ1ZeWPmOS4uuWIoOmZpOWlveWPi++8jGZhbHNl6L+Y5Y6f5Li656eB6IGKXHJcbiAgICBjaGFuZ2VGcmllbmRCdG46IGZ1bmN0aW9uIChib29sKSB7XHJcbiAgICAgICAgdGhpcy5kZWxfZnJpZW5kX3N0YXR1cyA9IGJvb2w7XHJcbiAgICAgICAgZm9yKGxldCBpPTA7aTx0aGlzLnJlbmRfbGlzdC5sZW5ndGg7KytpKXtcclxuICAgICAgICAgICAgdGhpcy5yZW5kX2xpc3RbaV0uZGVsX3N0YXR1cyA9IGJvb2xcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcucmVzZXRBZGRQb3NpdGlvbih0aGlzLnJlbmRfbGlzdCwgbnVsbCwgdGhpcy5jdXJfdHlwZSk7XHJcbiAgICAgICAgLy8gdmFyIGl0ZW1fbGlzdCA9IHRoaXMuaXRlbV9zY3JvbGx2aWV3LmdldEl0ZW1MaXN0KCk7XHJcbiAgICAgICAgLy8gaWYgKGl0ZW1fbGlzdCkge1xyXG4gICAgICAgIC8vICAgICBmb3IgKHZhciBrIGluIGl0ZW1fbGlzdCkge1xyXG4gICAgICAgIC8vICAgICAgICAgaXRlbV9saXN0W2tdLnNldERlbFN0YXR1cyhib29sKVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVGcmllbmRMaXN0OiBmdW5jdGlvbiAoY2hhbmdlX2luZGV4LCBpc19kZWwpIHtcclxuICAgICAgICBjaGFuZ2VfaW5kZXggPSBjaGFuZ2VfaW5kZXggfHwgZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZW5kX2xpc3QgPSBbXTtcclxuICAgICAgICB2YXIgbGlzdCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cl90eXBlID09IEZyaWVuZENvbnN0LlR5cGUuTXlGcmllbmQpIHtcclxuICAgICAgICAgICAgbGlzdCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpLmdldEFycmF5KCkgfHwgW107XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cl90eXBlID09IEZyaWVuZENvbnN0LlR5cGUuQXBwbHlMaXN0KSB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VfaW5kZXggPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLmFwcGx5KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFwcGx5X2xpc3QgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKS5nZXRBcHBseUxpc3QoKSB8fCB7fTtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gYXBwbHlfbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goYXBwbHlfbGlzdFtpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsaXN0ID0gYXJyYXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVBcHBseU51bSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJfdHlwZSA9PSBGcmllbmRDb25zdC5UeXBlLkF3YXJkKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJheSA9IHRoaXMuY3RybC5nZXRNb2RlbCgpLmdldEFycmF5KCkgfHwgW107XHJcbiAgICAgICAgICAgIHZhciBhd2FyZF9hcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdm8gPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgICAgIGlmICh2byAmJiB2by5pc19kcmF3ID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FyZF9hcnJheS5wdXNoKHZvKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaXN0ID0gYXdhcmRfYXJyYXk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cl90eXBlID09IEZyaWVuZENvbnN0LlR5cGUuQmxhY2tMaXN0KSB7XHJcbiAgICAgICAgICAgIGxpc3QgPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKS5nZXRCbGFja0FycmF5KCkgfHwgW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsaXN0KSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3Rba10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRfbGlzdC5wdXNoKGxpc3Rba10pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNob3dFbXB0eUljb24oZmFsc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlbmRfbGlzdC5sZW5ndGggPD0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dFbXB0eUljb24odHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJlX3BhbmVsLnNldERhdGEodGhpcy5yZW5kX2xpc3QpO1xyXG4gICAgICAgIGlmIChpc19kZWwgPT0gdHJ1ZSAmJiBjaGFuZ2VfaW5kZXggPT0gZmFsc2UgJiYgVXRpbHMubmV4dCh0aGlzLnJlbmRfbGlzdCkgIT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuc2V0RGF0YSh0aGlzLnJlbmRfbGlzdCwgbnVsbCk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldERhdGEodGhpcy5yZW5kX2xpc3QsIG51bGwsIHRoaXMuY3VyX3R5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgLy/mm7TmlrDnlLPor7fmlbBcclxuICAgIHVwZGF0ZUFwcGx5TnVtOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJlX3BhbmVsICYmIHRoaXMucHJlX3BhbmVsLnNldEFwcGx5TnVtKSB7XHJcbiAgICAgICAgICAgIHZhciBudW0gPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKS5nZXRBcHBseU51bSgpIHx8IDA7XHJcbiAgICAgICAgICAgIHRoaXMucHJlX3BhbmVsLnNldEFwcGx5TnVtKG51bSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcblxyXG4gICAgLy/nuqLngrnlpITnkIZcclxuICAgIHNob3dSZWRQb2ludDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBhd2FyZF9udW0gPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKS5nZXRBd2FyZE51bSgpIHx8IDA7XHJcbiAgICAgICAgdGhpcy5zZXRUYWJUaXBzSUkoYXdhcmRfbnVtLCBGcmllbmRDb25zdC5UeXBlLkF3YXJkKTtcclxuICAgICAgICB2YXIgYXBwbF9udW0gPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKS5nZXRBcHBseU51bSgpIHx8IDA7XHJcbiAgICAgICAgdGhpcy5zZXRUYWJUaXBzSUkoYXBwbF9udW0sIEZyaWVuZENvbnN0LlR5cGUuQXBwbHlMaXN0KTtcclxuICAgICAgICB2YXIgbGlzdCA9IFt7IGJpZDogMSwgbnVtOiBhd2FyZF9udW0gfSwgeyBiaWQ6IDIsIG51bTogYXBwbF9udW0gfV07XHJcbiAgICAgICAgcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKE1haW51aUNvbnN0Lmljb24uZnJpZW5kLCBsaXN0KVxyXG4gICAgfSxcclxuXHJcbiAgICAvL+aYvuekuuepuueZvVxyXG4gICAgc2hvd0VtcHR5SWNvbjogZnVuY3Rpb24gKGJvb2wpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZW1wdHlfY29uICYmIGJvb2wgPT0gZmFsc2UpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG5cclxuICAgICAgICB2YXIgc3RyID0gXCLmmoLml6Dlpb3lj4tcIjtcclxuICAgICAgICBpZiAodGhpcy5jdXJfdHlwZSA9PSBGcmllbmRDb25zdC5UeXBlLkF3YXJkKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IFwi5pqC5peg5aW95Y+L6LWg6YCBXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cl90eXBlID09IEZyaWVuZENvbnN0LlR5cGUuQXBwbHlMaXN0KSB7XHJcbiAgICAgICAgICAgIHN0ciA9IFwi5pqC5peg5aW95Y+L55Sz6K+3XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cl90eXBlID09IEZyaWVuZENvbnN0LlR5cGUuQmxhY2tMaXN0KSB7XHJcbiAgICAgICAgICAgIHN0ciA9IFwi5pqC5peg5ouJ6buR5ZCN5Y2VXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1wdHlfbGFiZWwuc3RyaW5nID0gc3RyO1xyXG4gICAgICAgIHRoaXMuZW1wdHlfY29uLmFjdGl2ZSA9IGJvb2w7XHJcbiAgICB9LFxyXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3RybC5vcGVuRnJpZW5kV2luZG93KGZhbHNlKTtcclxuICAgICAgICBpZiAodGhpcy5pdGVtX3Njcm9sbHZpZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuRGVsZXRlTWUoKTtcclxuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMudmlld19saXN0KSB7XHJcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy52aWV3X2xpc3RbaV07XHJcbiAgICAgICAgICAgIGlmICh2ICYmIHYuZGVsZXRlTWUpIHtcclxuICAgICAgICAgICAgICAgIHYuZGVsZXRlTWUoKTtcclxuICAgICAgICAgICAgICAgIHYgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld19saXN0ID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5yb2xlX3ZvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucm9sZV9hc3NldHNfZXZlbnQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb2xlX3ZvLnVuYmluZCh0aGlzLnJvbGVfYXNzZXRzX2V2ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucm9sZV9hc3NldHNfZXZlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRnJpZW5kV2luZG93OyJdfQ==