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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/common/loadermanager.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, 'd22c81wFEpPQq3vcJUA0bsW', 'loadermanager');
// Scripts/common/loadermanager.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      加载资源控制器,到时候直接修改这边就好了
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var FileInfo = require("fileinfo");
 
var ZipLoader = require("ZipLoader");
 
var PathTool = require("pathtool");
 
var DownloadManager = require("downloadmanager");
 
var SpineLoadingItem = require("spine_loading_item");
 
window.LoaderManager = cc.Class({
  properties: {
    // 当前拥有资源管理
    resources_list: {
      "default": {}
    },
    //当前已加载数据
    data_list: {
      "default": {}
    },
    // 界面资源管理
    reference_key_counter: {
      // 界面资源计数
      "default": {}
    },
    skeleton_counter: {
      // 动画计数
      "default": {}
    },
    spine_counter: {
      "default": {}
    },
    release_sqe: {
      "default": {}
    },
    loading_spines: {
      "default": {}
    },
    _sprite_frame_cache: {
      "default": {}
    },
    _prefab_time: 0,
    is_loading: false
  },
  ctor: function ctor() {
    this.mainloop_timer = gcore.Timer.set(function () {
      this.update(1);
    }.bind(this), 1000, -1);
  },
  statics: {
    instance: null
  },
  update: function update(dt) {
    this._prefab_time += 1;
 
    if (this._prefab_time >= 60) {
      if (!this.is_loading) {
        cc.log("开始释放没用的预设资源");
        this.clearRes();
        this._prefab_time = 0;
      }
    } // for (var resi in this.release_sqe) {
    //     this.release_sqe[resi] -= dt;
    //     if (this.release_sqe[resi] < 0) {
    //         this.releseSpienRes(resi);
    //         delete this.release_sqe[resi];
    //     }
    // }
 
  },
  // 加载资源,比如预制体类的,带上路径后缀,例如:预设体就是.prefab,图集就是.plist,图片就是.png或者.jpg等
  loadRes: function loadRes(path, callback) {
    if (path == null) {
      return;
    }
 
    var loadInfo = this.getResInfo(path);
 
    switch (loadInfo.load_type) {
      case cc.Prefab:
        this.loadPrefab(loadInfo.str_key, callback);
        break;
 
      case cc.SpriteAtlas:
        this.loadAtlas(loadInfo.str_key, callback);
        break;
 
      case sp.SkeletonData:
        this.loadSpine(loadInfo.str_key, callback);
        break;
 
      default:
        {
          this.loadUsuallyRes(loadInfo.str_key, callback, loadInfo.load_type);
        }
    }
  },
  releaseRes: function releaseRes(path) {
    if (path == null) {
      return;
    }
 
    var loadInfo = this.getResInfo(path);
 
    switch (loadInfo.load_type) {
      case cc.Prefab:
        this.releasePrefab(loadInfo.str_key);
        break;
 
      case cc.SpriteAtlas:
        this.releaseAtlas(loadInfo.str_key);
        break;
 
      case sp.SkeletonData:
        this.releaseSpine(loadInfo.str_key);
        break;
 
      default:
        {
          this.releaseUsuallyRes(loadInfo.str_key, loadInfo.load_type);
        }
    }
  },
  loadUsuallyRes: function loadUsuallyRes(path, callback, load_type) {
    // 动态加载界面资源
    // gcore.Timer.set(function(path, callback, load_type) {
    if (path.indexOf("ui_res") > -1) {
      this.is_loading = true;
      cc.loader.loadRes(path, load_type, function (path, errorMessage, resObject) {
        if (!errorMessage && resObject) {
          var deps = cc.loader.getDependsRecursively(resObject);
 
          for (var dep_i in deps) {
            this.countReference(deps[dep_i]);
          }
 
          callback(resObject);
        } else {
          cc.error(errorMessage, "load usuallyRes faild--->" + path);
        }
 
        this.is_loading = false;
      }.bind(this, path));
      return;
    }
 
    if (this._sprite_frame_cache[path]) {
      callback(this._sprite_frame_cache[path]);
      return;
    }
 
    if (this.resources_list[path] && this.resources_list[path]["obj"]) {
      this.resources_list[path]["count"]++;
      callback(this.resources_list[path]["obj"]);
      return;
    }
 
    cc.loader.loadRes(path, load_type, function (path, errorMessage, resObject) {
      if (!errorMessage) {
        if (!this.resources_list[path]) {
          this.resources_list[path] = {};
          this.resources_list[path]["obj"] = resObject;
          this.resources_list[path]["count"] = 0;
        }
 
        this.resources_list[path]["count"]++;
        callback(resObject);
      } else {
        cc.error(errorMessage, "load usuallyRes faild--->" + path);
      }
    }.bind(this, path)); // }.bind(this, path, callback, load_type), 50, 1)
  },
  releaseUsuallyRes: function releaseUsuallyRes(path, res_type) {
    if (this._sprite_frame_cache[path]) {
      return;
    }
 
    if (path.indexOf("ui_res") > -1) {
      // var res_obj = cc.loader.getRes(path, res_type);
      // if (res_obj) {
      //     var deps = cc.loader.getDependsRecursively(res_obj);
      //     for (var dep_i in deps) {
      //         this.countReference(deps[dep_i], -1);
      //     }
      // }
      return;
    }
 
    if (this.resources_list[path]) {
      --this.resources_list[path]["count"]; // if (this.resources_list[path]["count"] <= 0) {
      //     var releay_res = cc.loader.getDependsRecursively(this.resources_list[path]["obj"]);
      //     cc.loader.release(releay_res);
      //     delete this.resources_list[path];
      // }
    }
  },
  // 资源图集可以被加载很多次,但释放只需要一次就可以释放
  loadAtlas: function loadAtlas(path, callback) {
    var atlasObj = cc.loader.getRes(path, cc.SpriteAtlas);
 
    if (atlasObj) {
      this.countReference(atlasObj);
      callback(atlasObj);
      return;
    }
 
    cc.loader.loadRes(path, cc.SpriteAtlas, function (path, err, atlsObj) {
      if (path) {
        for (var path_i in cacheAtlas) {
          if (cacheAtlas[path_i] == path) {
            var spriteFramas = atlsObj.getSpriteFrames();
 
            for (var item_i in spriteFramas) {
              var spriteFrame = spriteFramas[item_i];
              var itemn_path = "res/item/" + spriteFrame.name;
              this._sprite_frame_cache[itemn_path] = spriteFrame;
            }
 
            break;
          }
        }
      }
 
      if (!err && callback) {
        this.countReference(atlsObj);
        callback(atlsObj);
      } else {
        cc.error(err, "load preafa faild--->" + path);
      }
    }.bind(this, path));
  },
  releaseAtlas: function releaseAtlas(path) {
    var atlasObj = cc.loader.getRes(path);
 
    if (atlasObj) {
      this.countReference(atlasObj, -1);
    }
  },
  // 加载spine资源
  loadSpine: function loadSpine(spinePath, callback) {
    if (!spinePath) return;
 
    if (window.OUT_SPINE) {
      var spine_infos = spinePath.split("/");
      var action = spine_infos.pop();
      var anima_id = spine_infos.pop();
      var loadItem = new SpineLoadingItem(anima_id, action, callback);
    } else {
      if (this.release_sqe[spinePath]) {
        delete this.release_sqe[spinePath];
        this.spine_counter[spinePath] = 0;
      }
 
      if (!this.loading_spines[spinePath]) this.loading_spines[spinePath] = true;
      cc.loader.loadRes(spinePath, sp.SkeletonData, function (spinePath, error, resObject) {
        if (!error) {
          if (this.spine_counter[spinePath] > 0) {
            this.spine_counter[spinePath] += 1;
          } else {
            this.spine_counter[spinePath] = 1;
          }
 
          callback(resObject);
          if (this.loading_spines[spinePath]) delete this.loading_spines[spinePath];
        } else {
          callback();
          cc.error(error, "load spine faild--->" + spinePath);
        }
      }.bind(this, spinePath));
    }
  },
  // 释放spine资源
  releaseSpine: function releaseSpine(spinePath) {
    return;
    if (!spinePath) return;
 
    if (this.spine_counter[spinePath] === undefined) {
      return;
    }
 
    if (this.spine_counter[spinePath] > 0) --this.spine_counter[spinePath];
    if (this.spine_counter[spinePath] > 0) return;
    this.releseSpienRes(spinePath);
  },
  delteSpine: function delteSpine(spinePath) {
    this.releseSpienRes(spinePath);
  },
  releseSpienRes: function releseSpienRes(spinePath) {
    if (!this.loading_spines[spinePath]) {
      var skeleton_data = cc.loader.getRes(spinePath, sp.SkeletonData);
      var atlas_data = cc.loader.getRes(spinePath, cc.SpriteAtlas);
 
      if (skeleton_data) {
        var deps = cc.loader.getDependsRecursively(skeleton_data);
 
        for (var deps_i in deps) {
          var depsData = cc.loader.getRes(deps[deps_i]);
          cc.loader.release(depsData);
        }
 
        cc.loader.release(skeleton_data);
      }
    }
  },
 
  /**
   * 基于参考key的引用计数
   * @author zhanghuxing 2018-12-20
   * @param  asset 资源对象
   * @param  count 数量
   * @return {[type]}
   */
  countReference: function countReference(assetOrKey, count) {
    if (!assetOrKey) return;
    count = count === undefined ? 1 : count;
    var referenceKey; // if (assetOrKey instanceof cc.Asset) {
    //     referenceKey = cc.loader._getReferenceKey(assetOrKey);
    //     if (assetOrKey instanceof cc.SpriteAtlas) {
    //         var dependes = cc.loader.getDependsRecursively(assetOrKey);
    //         for (var keyIndex in dependes) {
    //             this.countReference(dependes[keyIndex], count);
    //         }
    //     }
    // } else {
 
    referenceKey = assetOrKey; // }
 
    if (!this.reference_key_counter[referenceKey]) this.reference_key_counter[referenceKey] = 0;
    this.reference_key_counter[referenceKey] += count; // if (this.reference_key_counter[referenceKey] <= 0) {
    //     // 释放png资源
    //     cc.loader.release(referenceKey);
    // }
  },
  clearRes: function clearRes() {
    for (var res_key in this.reference_key_counter) {
      if (!this.reference_key_counter[res_key]) this.reference_key_counter[res_key] = 0;
 
      if (this.reference_key_counter[res_key] <= 0) {
        // 释放png资源
        cc.loader.release(res_key);
        delete this.reference_key_counter[res_key];
      }
    }
 
    for (var res_i in this.resources_list) {
      if (this.resources_list[res_i]["count"] <= 0) {
        var releay_res = cc.loader.getDependsRecursively(this.resources_list[res_i]["obj"]);
        cc.loader.release(releay_res);
        delete this.resources_list[res_i];
      }
    }
  },
  releaseByReferenceKey: function releaseByReferenceKey(referenceKey) {},
  // 加载预制资源
  loadPrefab: function loadPrefab(path, callback) {
    if (!window.PREFAB_BUILD) {
      CC_SUPPORT_JIT = false;
      this.is_loading = true;
      cc.loader.loadRes(path, cc.Prefab, function (err, prefab) {
        CC_SUPPORT_JIT = true;
 
        if (!err) {
          if (callback && !game.preload_loading || path == "prefab/drama/guide_main_view") {
            var deps = cc.loader.getDependsRecursively(prefab);
 
            for (var resIndex in deps) {
              // var testAsset = cc.loader.getRes(deps[resIndex]);
              this.countReference(deps[resIndex]);
            }
 
            callback(cc.instantiate(prefab));
          }
        } else {
          if (callback) callback();
          cc.error(err, "load preafa faild--->" + path);
        }
 
        this.is_loading = false;
      }.bind(this));
    } else {
      var preafab_info = path.split("/");
      var prefab_name = preafab_info.pop() + "_p";
      var total_name = preafab_info.pop() + "_" + prefab_name;
      cc.loader.loadRes("prefabjs/" + total_name, cc.JsonAsset, function (total_name, err, text_data) {
        var testJS = require(total_name);
 
        var testObj = new testJS(text_data.json); // testObj.node.x = this.rootNd.width * 0.5;
        // testObj.node.y = this.rootNd.height * 0.5;
 
        callback(testObj.node);
      }.bind(this, total_name));
    }
  },
  // 释放预制资源
  releasePrefab: function releasePrefab(path) {
    var testAsset = cc.loader.getRes(path);
    var deps = cc.loader.getDependsRecursively(testAsset);
 
    for (var resIndex in deps) {
      var testAsset = cc.loader.getRes(deps[resIndex]);
      this.countReference(deps[resIndex], -1);
    }
  },
  // 释放资源
  deleteRes: function deleteRes(path) {
    this.releaseRes(path); // if (this.resources_list[path]) {
    //     var fileInfo = this.resources_list[path];
    //     fileInfo.decrementLoadNum();
    //     var loadNum = fileInfo.getLoadNum();
    //     if (loadNum <= 0){
    //         cc.loader.releaseRes(fileInfo.url);
    //         fileInfo.deleteMe();
    //         this.resources_list[path] = null;
    //     }
    // }
  },
  getResInfo: function getResInfo(path) {
    // 资源类型的起始位置下表
    var type_index = path.indexOf("."); // 字符串总长度
 
    var total_num = path.length; // 剔除字符串类型的路径
 
    var str_key = path.substring(0, type_index); // 资源纹理格式
 
    var assets_type = path.substring(type_index, total_num); // 需要加载的资源格式
 
    var load_type = this.getAssetsTypeSuffix(assets_type); // 后续这里要加上版本信息以及url路径处理
 
    var resulet = {};
    resulet.str_key = str_key;
    resulet.load_type = load_type;
    return resulet;
  },
  getAssetsTypeSuffix: function getAssetsTypeSuffix(suffix) {
    switch (suffix) {
      case ".jpg":
      case ".png":
        return cc.SpriteFrame;
 
      case ".plist":
        return cc.SpriteAtlas;
 
      case ".mp3":
        return cc.AudioClip;
 
      case ".atlas":
        return sp.SkeletonData;
 
      case ".prefab":
        return cc.Prefab;
    }
  },
  initConfigs: function initConfigs(callback) {
    // var config_zip_url = DATA_URL + "data.zip" + "?" + DATA_VER;
    // 微信小游戏不使用二进制文件
    if (window.DEBUG_Data) {
      var ModuleInfo = require("modulelist");
 
      var time = gcore.SmartSocket.getTime();
      var data_url = "https://dev-h5-sszg.shiyuegame.com/data/";
      var total_num = 0;
 
      for (var cfg_i = 0; cfg_i < ModuleInfo.data_list.length; cfg_i++) {
        var totoal_url = data_url + ModuleInfo.data_list[cfg_i] + ".json" + "?time=" + time;
        cc.loader.load(totoal_url, function (name, err, json_data) {
          total_num++;
 
          if (!err) {
            Config[name] = json_data;
          }
 
          if (total_num == ModuleInfo.data_list.length) {
            callback();
          } else {
            callback(total_num / ModuleInfo.data_list.length);
          }
        }.bind(this, ModuleInfo.data_list[cfg_i]));
      }
    } else {
      if (PLATFORM_TYPR == "WX_SDK" || PLATFORM_TYPR == "SH_SDK" || PLATFORM_TYPR == "QQ_SDK") {
        var ModuleInfo = require("modulelist");
 
        var totalNum = ModuleInfo.data_list.length;
        var finishNum = 0;
 
        for (var cfg_i = 0; cfg_i < ModuleInfo.data_list.length; cfg_i++) {
          var data_path = "data/" + ModuleInfo.data_list[cfg_i];
          gcore.Timer.set(function (data_path, cfg_i) {
            cc.loader.loadRes(data_path, cc.JsonAsset, function (name, err, jsonData) {
              Config[name] = jsonData.json;
              finishNum++;
              cc.log(Config);
 
              if (finishNum == totalNum) {
                callback();
              } else {
                callback(finishNum / totalNum);
              }
            }.bind(this, ModuleInfo.data_list[cfg_i]));
          }.bind(this, data_path, cfg_i), 20 * cfg_i, 1);
        }
      } else {
        ZipLoader.RegisterZipLoader();
        var data_path = cc.url.raw("resources/data/data.zip");
        cc.loader.load(data_path, function (err, zipData) {
          var JSZip = require("jszip");
 
          zipData = new JSZip(zipData, {
            checkCRC32: false
          });
 
          if (zipData) {
            var total_num = 0;
            var cur_num = 0;
 
            for (var data_i in zipData.files) {
              total_num++;
              gcore.Timer.set(function (data_i, cur_num) {
                var data = JSON.parse(zipData.files[data_i].asText());
                var file_name = data_i.substring(0, data_i.length - 5);
                Config[file_name] = data;
                var progress = cur_num / 66;
                callback(progress);
 
                if (cur_num >= total_num && cur_num > 0) {
                  if (callback) callback();
                }
              }.bind(this, data_i, total_num), 20 * total_num, 1);
            }
          }
        }.bind(this));
      }
    }
  },
  initConfigScript: function initConfigScript(finish_cb) {
    // 发布版本,需要加载合并后json后的JS文件
    if (window.USE_MERGE_JSON) {
      var data_path = "src/merge_json" + (window.PACKAGE_VERSION || "") + ".js"; // var data_path = "src/merge_json" + ".js";            
 
      console.log("___json==>", data_path);
      cc.loader.load(data_path, function (err, data) {
        if (data) {
          console.log("加载merge成功"); // console.log(window.ImportConfigs)
        }
 
        if (err) {
          console.log("加载merge_json失败");
          console.log(err);
        }
      });
    }
  }
});
 
LoaderManager.getInstance = function () {
  if (!LoaderManager.instance) {
    LoaderManager.instance = new LoaderManager();
  }
 
  return LoaderManager.instance;
};
 
module.exports = LoaderManager;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFxsb2FkZXJtYW5hZ2VyLmpzIl0sIm5hbWVzIjpbIkZpbGVJbmZvIiwicmVxdWlyZSIsIlppcExvYWRlciIsIlBhdGhUb29sIiwiRG93bmxvYWRNYW5hZ2VyIiwiU3BpbmVMb2FkaW5nSXRlbSIsIndpbmRvdyIsIkxvYWRlck1hbmFnZXIiLCJjYyIsIkNsYXNzIiwicHJvcGVydGllcyIsInJlc291cmNlc19saXN0IiwiZGF0YV9saXN0IiwicmVmZXJlbmNlX2tleV9jb3VudGVyIiwic2tlbGV0b25fY291bnRlciIsInNwaW5lX2NvdW50ZXIiLCJyZWxlYXNlX3NxZSIsImxvYWRpbmdfc3BpbmVzIiwiX3Nwcml0ZV9mcmFtZV9jYWNoZSIsIl9wcmVmYWJfdGltZSIsImlzX2xvYWRpbmciLCJjdG9yIiwibWFpbmxvb3BfdGltZXIiLCJnY29yZSIsIlRpbWVyIiwic2V0IiwidXBkYXRlIiwiYmluZCIsInN0YXRpY3MiLCJpbnN0YW5jZSIsImR0IiwibG9nIiwiY2xlYXJSZXMiLCJsb2FkUmVzIiwicGF0aCIsImNhbGxiYWNrIiwibG9hZEluZm8iLCJnZXRSZXNJbmZvIiwibG9hZF90eXBlIiwiUHJlZmFiIiwibG9hZFByZWZhYiIsInN0cl9rZXkiLCJTcHJpdGVBdGxhcyIsImxvYWRBdGxhcyIsInNwIiwiU2tlbGV0b25EYXRhIiwibG9hZFNwaW5lIiwibG9hZFVzdWFsbHlSZXMiLCJyZWxlYXNlUmVzIiwicmVsZWFzZVByZWZhYiIsInJlbGVhc2VBdGxhcyIsInJlbGVhc2VTcGluZSIsInJlbGVhc2VVc3VhbGx5UmVzIiwiaW5kZXhPZiIsImxvYWRlciIsImVycm9yTWVzc2FnZSIsInJlc09iamVjdCIsImRlcHMiLCJnZXREZXBlbmRzUmVjdXJzaXZlbHkiLCJkZXBfaSIsImNvdW50UmVmZXJlbmNlIiwiZXJyb3IiLCJyZXNfdHlwZSIsImF0bGFzT2JqIiwiZ2V0UmVzIiwiZXJyIiwiYXRsc09iaiIsInBhdGhfaSIsImNhY2hlQXRsYXMiLCJzcHJpdGVGcmFtYXMiLCJnZXRTcHJpdGVGcmFtZXMiLCJpdGVtX2kiLCJzcHJpdGVGcmFtZSIsIml0ZW1uX3BhdGgiLCJuYW1lIiwic3BpbmVQYXRoIiwiT1VUX1NQSU5FIiwic3BpbmVfaW5mb3MiLCJzcGxpdCIsImFjdGlvbiIsInBvcCIsImFuaW1hX2lkIiwibG9hZEl0ZW0iLCJ1bmRlZmluZWQiLCJyZWxlc2VTcGllblJlcyIsImRlbHRlU3BpbmUiLCJza2VsZXRvbl9kYXRhIiwiYXRsYXNfZGF0YSIsImRlcHNfaSIsImRlcHNEYXRhIiwicmVsZWFzZSIsImFzc2V0T3JLZXkiLCJjb3VudCIsInJlZmVyZW5jZUtleSIsInJlc19rZXkiLCJyZXNfaSIsInJlbGVheV9yZXMiLCJyZWxlYXNlQnlSZWZlcmVuY2VLZXkiLCJQUkVGQUJfQlVJTEQiLCJDQ19TVVBQT1JUX0pJVCIsInByZWZhYiIsImdhbWUiLCJwcmVsb2FkX2xvYWRpbmciLCJyZXNJbmRleCIsImluc3RhbnRpYXRlIiwicHJlYWZhYl9pbmZvIiwicHJlZmFiX25hbWUiLCJ0b3RhbF9uYW1lIiwiSnNvbkFzc2V0IiwidGV4dF9kYXRhIiwidGVzdEpTIiwidGVzdE9iaiIsImpzb24iLCJub2RlIiwidGVzdEFzc2V0IiwiZGVsZXRlUmVzIiwidHlwZV9pbmRleCIsInRvdGFsX251bSIsImxlbmd0aCIsInN1YnN0cmluZyIsImFzc2V0c190eXBlIiwiZ2V0QXNzZXRzVHlwZVN1ZmZpeCIsInJlc3VsZXQiLCJzdWZmaXgiLCJTcHJpdGVGcmFtZSIsIkF1ZGlvQ2xpcCIsImluaXRDb25maWdzIiwiREVCVUdfRGF0YSIsIk1vZHVsZUluZm8iLCJ0aW1lIiwiU21hcnRTb2NrZXQiLCJnZXRUaW1lIiwiZGF0YV91cmwiLCJjZmdfaSIsInRvdG9hbF91cmwiLCJsb2FkIiwianNvbl9kYXRhIiwiQ29uZmlnIiwiUExBVEZPUk1fVFlQUiIsInRvdGFsTnVtIiwiZmluaXNoTnVtIiwiZGF0YV9wYXRoIiwianNvbkRhdGEiLCJSZWdpc3RlclppcExvYWRlciIsInVybCIsInJhdyIsInppcERhdGEiLCJKU1ppcCIsImNoZWNrQ1JDMzIiLCJjdXJfbnVtIiwiZGF0YV9pIiwiZmlsZXMiLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwiYXNUZXh0IiwiZmlsZV9uYW1lIiwicHJvZ3Jlc3MiLCJpbml0Q29uZmlnU2NyaXB0IiwiZmluaXNoX2NiIiwiVVNFX01FUkdFX0pTT04iLCJQQUNLQUdFX1ZFUlNJT04iLCJjb25zb2xlIiwiZ2V0SW5zdGFuY2UiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBV0MsT0FBTyxDQUFDLFVBQUQsQ0FBOUI7O0FBQ0EsSUFBSUMsU0FBUyxHQUFVRCxPQUFPLENBQUMsV0FBRCxDQUE5Qjs7QUFDQSxJQUFJRSxRQUFRLEdBQVdGLE9BQU8sQ0FBQyxVQUFELENBQTlCOztBQUNBLElBQUlHLGVBQWUsR0FBSUgsT0FBTyxDQUFDLGlCQUFELENBQTlCOztBQUNBLElBQUlJLGdCQUFnQixHQUFHSixPQUFPLENBQUMsb0JBQUQsQ0FBOUI7O0FBRUFLLE1BQU0sQ0FBQ0MsYUFBUCxHQUF1QkMsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFFNUJDLEVBQUFBLFVBQVUsRUFBRTtBQUNSO0FBQ0FDLElBQUFBLGNBQWMsRUFBRTtBQUNaLGlCQUFTO0FBREcsS0FGUjtBQUtSO0FBQ0FDLElBQUFBLFNBQVMsRUFBRTtBQUNQLGlCQUFTO0FBREYsS0FOSDtBQVNSO0FBQ0FDLElBQUFBLHFCQUFxQixFQUFFO0FBQUs7QUFDeEIsaUJBQVM7QUFEVSxLQVZmO0FBYVJDLElBQUFBLGdCQUFnQixFQUFFO0FBQVU7QUFDeEIsaUJBQVM7QUFESyxLQWJWO0FBZ0JSQyxJQUFBQSxhQUFhLEVBQUU7QUFDWCxpQkFBUztBQURFLEtBaEJQO0FBbUJSQyxJQUFBQSxXQUFXLEVBQUU7QUFDVCxpQkFBUztBQURBLEtBbkJM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RUFBRSwwQkFBU0MsU0FBVCxFQUFvQjtBQUNsQztBQUNBLFFBQUl6SixNQUFNLENBQUMwSixjQUFYLEVBQTJCO0FBQ3ZCLFVBQUluQixTQUFTLEdBQUUsb0JBQW9CdkksTUFBTSxDQUFDMkosZUFBUCxJQUEwQixFQUE5QyxJQUFxRCxLQUFwRSxDQUR1QixDQUV2Qjs7QUFDQUMsTUFBQUEsT0FBTyxDQUFDbkksR0FBUixDQUFZLFlBQVosRUFBeUI4RyxTQUF6QjtBQUNBckksTUFBQUEsRUFBRSxDQUFDOEMsTUFBSCxDQUFVaUYsSUFBVixDQUFlTSxTQUFmLEVBQTBCLFVBQVM1RSxHQUFULEVBQWN1RixJQUFkLEVBQW9CO0FBQzFDLFlBQUlBLElBQUosRUFBVTtBQUNOVSxVQUFBQSxPQUFPLENBQUNuSSxHQUFSLENBQVksV0FBWixFQURNLENBRU47QUFDSDs7QUFFRCxZQUFJa0MsR0FBSixFQUFTO0FBQ0xpRyxVQUFBQSxPQUFPLENBQUNuSSxHQUFSLENBQVksZ0JBQVo7QUFDQW1JLFVBQUFBLE9BQU8sQ0FBQ25JLEdBQVIsQ0FBWWtDLEdBQVo7QUFDSDtBQUVKLE9BWEQ7QUFZSDtBQUNKO0FBcGlCMkIsQ0FBVCxDQUF2Qjs7QUF1aUJBMUQsYUFBYSxDQUFDNEosV0FBZCxHQUE0QixZQUFZO0FBQ3BDLE1BQUksQ0FBQzVKLGFBQWEsQ0FBQ3NCLFFBQW5CLEVBQTZCO0FBQ3pCdEIsSUFBQUEsYUFBYSxDQUFDc0IsUUFBZCxHQUF5QixJQUFJdEIsYUFBSixFQUF6QjtBQUNIOztBQUNELFNBQU9BLGFBQWEsQ0FBQ3NCLFFBQXJCO0FBQ0gsQ0FMRDs7QUFPQXVJLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjlKLGFBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDliqDovb3otYTmupDmjqfliLblmags5Yiw5pe25YCZ55u05o6l5L+u5pS56L+Z6L655bCx5aW95LqGXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEZpbGVJbmZvICAgICAgICAgPSByZXF1aXJlKFwiZmlsZWluZm9cIik7XG52YXIgWmlwTG9hZGVyICAgICAgICA9IHJlcXVpcmUoXCJaaXBMb2FkZXJcIik7XG52YXIgUGF0aFRvb2wgICAgICAgICA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBEb3dubG9hZE1hbmFnZXIgID0gcmVxdWlyZShcImRvd25sb2FkbWFuYWdlclwiKTtcbnZhciBTcGluZUxvYWRpbmdJdGVtID0gcmVxdWlyZShcInNwaW5lX2xvYWRpbmdfaXRlbVwiKTtcblxud2luZG93LkxvYWRlck1hbmFnZXIgPSBjYy5DbGFzcyh7XG5cbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC8vIOW9k+WJjeaLpeaciei1hOa6kOeuoeeQhlxuICAgICAgICByZXNvdXJjZXNfbGlzdDoge1xuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgLy/lvZPliY3lt7LliqDovb3mlbDmja5cbiAgICAgICAgZGF0YV9saXN0OiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LFxuICAgICAgICAvLyDnlYzpnaLotYTmupDnrqHnkIZcbiAgICAgICAgcmVmZXJlbmNlX2tleV9jb3VudGVyOiB7ICAgIC8vIOeVjOmdoui1hOa6kOiuoeaVsFxuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgc2tlbGV0b25fY291bnRlcjogeyAgICAgICAgIC8vIOWKqOeUu+iuoeaVsFxuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgc3BpbmVfY291bnRlcjoge1xuICAgICAgICAgICAgZGVmYXVsdDoge31cbiAgICAgICAgfSxcbiAgICAgICAgcmVsZWFzZV9zcWU6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIGxvYWRpbmdfc3BpbmVzOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LFxuICAgICAgICBfc3ByaXRlX2ZyYW1lX2NhY2hlOiB7XG4gICAgICAgICAgICBkZWZhdWx0OiB7fVxuICAgICAgICB9LFxuICAgICAgICBfcHJlZmFiX3RpbWU6IDAsXG4gICAgICAgIGlzX2xvYWRpbmc6IGZhbHNlLFxuICAgIH0sXG5cbiAgICBjdG9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5tYWlubG9vcF90aW1lciA9IGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgxKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCAxMDAwLCAtMSk7XG4gICAgfSxcblxuICAgIHN0YXRpY3M6IHtcbiAgICAgICAgaW5zdGFuY2U6IG51bGwsXG4gICAgfSxcblxuICAgIHVwZGF0ZTogZnVuY3Rpb24oZHQpIHtcbiAgICAgICAgdGhpcy5fcHJlZmFiX3RpbWUgKz0gMTtcbiAgICAgICAgaWYgKHRoaXMuX3ByZWZhYl90aW1lID49IDYwKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNfbG9hZGluZykge1xuICAgICAgICAgICAgICAgIGNjLmxvZyhcIuW8gOWni+mHiuaUvuayoeeUqOeahOmihOiuvui1hOa6kFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyUmVzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJlZmFiX3RpbWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZvciAodmFyIHJlc2kgaW4gdGhpcy5yZWxlYXNlX3NxZSkge1xuICAgICAgICAvLyAgICAgdGhpcy5yZWxlYXNlX3NxZVtyZXNpXSAtPSBkdDtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLnJlbGVhc2Vfc3FlW3Jlc2ldIDwgMCkge1xuICAgICAgICAvLyAgICAgICAgIHRoaXMucmVsZXNlU3BpZW5SZXMocmVzaSk7XG4gICAgICAgIC8vICAgICAgICAgZGVsZXRlIHRoaXMucmVsZWFzZV9zcWVbcmVzaV07XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgLy8g5Yqg6L296LWE5rqQLOavlOWmgumihOWItuS9k+exu+eahCzluKbkuIrot6/lvoTlkI7nvIAs5L6L5aaCOumihOiuvuS9k+WwseaYry5wcmVmYWIs5Zu+6ZuG5bCx5pivLnBsaXN0LOWbvueJh+WwseaYry5wbmfmiJbogIUuanBn562JXG4gICAgbG9hZFJlczogZnVuY3Rpb24gKHBhdGgsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChwYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHZhciBsb2FkSW5mbyA9IHRoaXMuZ2V0UmVzSW5mbyhwYXRoKTtcblxuICAgICAgICBzd2l0Y2ggKGxvYWRJbmZvLmxvYWRfdHlwZSkge1xuICAgICAgICAgICAgY2FzZSBjYy5QcmVmYWI6XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUHJlZmFiKGxvYWRJbmZvLnN0cl9rZXksIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIGNjLlNwcml0ZUF0bGFzOlxuICAgICAgICAgICAgICAgIHRoaXMubG9hZEF0bGFzKGxvYWRJbmZvLnN0cl9rZXksIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIHNwLlNrZWxldG9uRGF0YTpcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRTcGluZShsb2FkSW5mby5zdHJfa2V5LCBjYWxsYmFjayk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFVzdWFsbHlSZXMobG9hZEluZm8uc3RyX2tleSwgY2FsbGJhY2ssIGxvYWRJbmZvLmxvYWRfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVsZWFzZVJlczogZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB2YXIgbG9hZEluZm8gPSB0aGlzLmdldFJlc0luZm8ocGF0aCk7XG5cbiAgICAgICAgc3dpdGNoIChsb2FkSW5mby5sb2FkX3R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgY2MuUHJlZmFiOlxuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZVByZWZhYihsb2FkSW5mby5zdHJfa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIGNjLlNwcml0ZUF0bGFzOlxuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZUF0bGFzKGxvYWRJbmZvLnN0cl9rZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2Ugc3AuU2tlbGV0b25EYXRhOlxuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZVNwaW5lKGxvYWRJbmZvLnN0cl9rZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGVhc2VVc3VhbGx5UmVzKGxvYWRJbmZvLnN0cl9rZXksIGxvYWRJbmZvLmxvYWRfdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9hZFVzdWFsbHlSZXM6IGZ1bmN0aW9uKHBhdGgsIGNhbGxiYWNrLCBsb2FkX3R5cGUpIHtcbiAgICAgICAgLy8g5Yqo5oCB5Yqg6L2955WM6Z2i6LWE5rqQXG4gICAgICAgIC8vIGdjb3JlLlRpbWVyLnNldChmdW5jdGlvbihwYXRoLCBjYWxsYmFjaywgbG9hZF90eXBlKSB7XG4gICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKFwidWlfcmVzXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzX2xvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkUmVzKHBhdGgsIGxvYWRfdHlwZSwgZnVuY3Rpb24gKHBhdGgsIGVycm9yTWVzc2FnZSwgcmVzT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JNZXNzYWdlICYmIHJlc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlcHMgPSBjYy5sb2FkZXIuZ2V0RGVwZW5kc1JlY3Vyc2l2ZWx5KHJlc09iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkZXBfaSBpbiBkZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShkZXBzW2RlcF9pXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2MuZXJyb3IoZXJyb3JNZXNzYWdlLCBcImxvYWQgdXN1YWxseVJlcyBmYWlsZC0tLT5cIiArIHBhdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc19sb2FkaW5nID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgcGF0aCkpXG5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX3Nwcml0ZV9mcmFtZV9jYWNoZVtwYXRoXSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMuX3Nwcml0ZV9mcmFtZV9jYWNoZVtwYXRoXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZXNfbGlzdFtwYXRoXSAmJiB0aGlzLnJlc291cmNlc19saXN0W3BhdGhdW1wib2JqXCJdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNfbGlzdFtwYXRoXVtcImNvdW50XCJdICsrO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJvYmpcIl0pO1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2MubG9hZGVyLmxvYWRSZXMocGF0aCwgbG9hZF90eXBlLCBmdW5jdGlvbiAocGF0aCwgZXJyb3JNZXNzYWdlLCByZXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJvYmpcIl0gPSByZXNPYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlc19saXN0W3BhdGhdW1wiY291bnRcIl0gPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJjb3VudFwiXSsrO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNPYmplY3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNjLmVycm9yKGVycm9yTWVzc2FnZSwgXCJsb2FkIHVzdWFsbHlSZXMgZmFpbGQtLS0+XCIgKyBwYXRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzLCBwYXRoKSlcbiAgICAgICAgLy8gfS5iaW5kKHRoaXMsIHBhdGgsIGNhbGxiYWNrLCBsb2FkX3R5cGUpLCA1MCwgMSlcbiAgICB9LFxuXG4gICAgcmVsZWFzZVVzdWFsbHlSZXM6IGZ1bmN0aW9uKHBhdGgsIHJlc190eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zcHJpdGVfZnJhbWVfY2FjaGVbcGF0aF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLmluZGV4T2YoXCJ1aV9yZXNcIikgPiAtMSkge1xuICAgICAgICAgICAgLy8gdmFyIHJlc19vYmogPSBjYy5sb2FkZXIuZ2V0UmVzKHBhdGgsIHJlc190eXBlKTtcblxuICAgICAgICAgICAgLy8gaWYgKHJlc19vYmopIHtcbiAgICAgICAgICAgIC8vICAgICB2YXIgZGVwcyA9IGNjLmxvYWRlci5nZXREZXBlbmRzUmVjdXJzaXZlbHkocmVzX29iaik7XG4gICAgICAgICAgICAvLyAgICAgZm9yICh2YXIgZGVwX2kgaW4gZGVwcykge1xuICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLmNvdW50UmVmZXJlbmNlKGRlcHNbZGVwX2ldLCAtMSk7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZXNvdXJjZXNfbGlzdFtwYXRoXSkge1xuICAgICAgICAgICAgLS0gdGhpcy5yZXNvdXJjZXNfbGlzdFtwYXRoXVtcImNvdW50XCJdO1xuICAgICAgICAgICAgLy8gaWYgKHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJjb3VudFwiXSA8PSAwKSB7XG4gICAgICAgICAgICAvLyAgICAgdmFyIHJlbGVheV9yZXMgPSBjYy5sb2FkZXIuZ2V0RGVwZW5kc1JlY3Vyc2l2ZWx5KHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF1bXCJvYmpcIl0pO1xuICAgICAgICAgICAgLy8gICAgIGNjLmxvYWRlci5yZWxlYXNlKHJlbGVheV9yZXMpO1xuICAgICAgICAgICAgLy8gICAgIGRlbGV0ZSB0aGlzLnJlc291cmNlc19saXN0W3BhdGhdO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOi1hOa6kOWbvumbhuWPr+S7peiiq+WKoOi9veW+iOWkmuasoe+8jOS9humHiuaUvuWPqumcgOimgeS4gOasoeWwseWPr+S7pemHiuaUvlxuICAgIGxvYWRBdGxhczogZnVuY3Rpb24ocGF0aCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGF0bGFzT2JqID0gY2MubG9hZGVyLmdldFJlcyhwYXRoLCBjYy5TcHJpdGVBdGxhcyk7XG4gICAgICAgIGlmIChhdGxhc09iaikge1xuICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShhdGxhc09iaik7XG4gICAgICAgICAgICBjYWxsYmFjayhhdGxhc09iaik7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjYy5sb2FkZXIubG9hZFJlcyhwYXRoLCBjYy5TcHJpdGVBdGxhcywgZnVuY3Rpb24ocGF0aCwgZXJyLCBhdGxzT2JqKSB7XG4gICAgICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHBhdGhfaSBpbiBjYWNoZUF0bGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZUF0bGFzW3BhdGhfaV0gPT0gcGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwcml0ZUZyYW1hcyA9IGF0bHNPYmouZ2V0U3ByaXRlRnJhbWVzKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGl0ZW1faSBpbiBzcHJpdGVGcmFtYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ByaXRlRnJhbWUgPSBzcHJpdGVGcmFtYXNbaXRlbV9pXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbW5fcGF0aCA9IFwicmVzL2l0ZW0vXCIgKyBzcHJpdGVGcmFtZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nwcml0ZV9mcmFtZV9jYWNoZVtpdGVtbl9wYXRoXSA9IHNwcml0ZUZyYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZXJyICYmIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShhdGxzT2JqKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhhdGxzT2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2MuZXJyb3IoZXJyLCBcImxvYWQgcHJlYWZhIGZhaWxkLS0tPlwiICsgcGF0aCk7ICAgICAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfS5iaW5kKHRoaXMsIHBhdGgpKTtcbiAgICB9LFxuXG4gICAgcmVsZWFzZUF0bGFzOiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHZhciBhdGxhc09iaiA9IGNjLmxvYWRlci5nZXRSZXMocGF0aCk7XG4gICAgICAgIGlmIChhdGxhc09iaikge1xuICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShhdGxhc09iaiwgLTEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWKoOi9vXNwaW5l6LWE5rqQXG4gICAgbG9hZFNwaW5lOiBmdW5jdGlvbihzcGluZVBhdGgsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghc3BpbmVQYXRoKSByZXR1cm47XG4gICAgICAgIGlmICh3aW5kb3cuT1VUX1NQSU5FKSB7XG4gICAgICAgICAgICB2YXIgc3BpbmVfaW5mb3MgPSBzcGluZVBhdGguc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHNwaW5lX2luZm9zLnBvcCgpO1xuICAgICAgICAgICAgdmFyIGFuaW1hX2lkID0gc3BpbmVfaW5mb3MucG9wKCk7XG4gICAgICAgICAgICB2YXIgbG9hZEl0ZW0gPSBuZXcgU3BpbmVMb2FkaW5nSXRlbShhbmltYV9pZCwgYWN0aW9uLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWxlYXNlX3NxZVtzcGluZVBhdGhdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVsZWFzZV9zcWVbc3BpbmVQYXRoXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5lX2NvdW50ZXJbc3BpbmVQYXRoXSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkaW5nX3NwaW5lc1tzcGluZVBhdGhdKVxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ19zcGluZXNbc3BpbmVQYXRoXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkUmVzKHNwaW5lUGF0aCwgc3AuU2tlbGV0b25EYXRhLCBmdW5jdGlvbiAoc3BpbmVQYXRoLCBlcnJvciwgcmVzT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zcGluZV9jb3VudGVyW3NwaW5lUGF0aF0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwaW5lX2NvdW50ZXJbc3BpbmVQYXRoXSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGluZV9jb3VudGVyW3NwaW5lUGF0aF0gPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc09iamVjdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubG9hZGluZ19zcGluZXNbc3BpbmVQYXRoXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdfc3BpbmVzW3NwaW5lUGF0aF1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICBjYy5lcnJvcihlcnJvciwgXCJsb2FkIHNwaW5lIGZhaWxkLS0tPlwiICsgc3BpbmVQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcywgc3BpbmVQYXRoKSlcbiAgICAgICAgfVxuXG5cbiAgICB9LFxuXG4gICAgLy8g6YeK5pS+c3BpbmXotYTmupBcbiAgICByZWxlYXNlU3BpbmU6IGZ1bmN0aW9uKHNwaW5lUGF0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgICAgaWYgKCFzcGluZVBhdGgpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc3BpbmVfY291bnRlcltzcGluZVBhdGhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNwaW5lX2NvdW50ZXJbc3BpbmVQYXRoXSA+IDApXG4gICAgICAgICAgICAtLSB0aGlzLnNwaW5lX2NvdW50ZXJbc3BpbmVQYXRoXTtcblxuICAgICAgICBpZiAodGhpcy5zcGluZV9jb3VudGVyW3NwaW5lUGF0aF0gPiAwKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVsZXNlU3BpZW5SZXMoc3BpbmVQYXRoKTtcbiAgICB9LFxuXG4gICAgZGVsdGVTcGluZTogZnVuY3Rpb24oc3BpbmVQYXRoKSB7XG4gICAgICAgIHRoaXMucmVsZXNlU3BpZW5SZXMoc3BpbmVQYXRoKVxuICAgIH0sXG5cbiAgICByZWxlc2VTcGllblJlczogZnVuY3Rpb24oc3BpbmVQYXRoKSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkaW5nX3NwaW5lc1tzcGluZVBhdGhdKSB7XG4gICAgICAgICAgICB2YXIgc2tlbGV0b25fZGF0YSA9IGNjLmxvYWRlci5nZXRSZXMoc3BpbmVQYXRoLCBzcC5Ta2VsZXRvbkRhdGEpO1xuICAgICAgICAgICAgdmFyIGF0bGFzX2RhdGEgPSBjYy5sb2FkZXIuZ2V0UmVzKHNwaW5lUGF0aCwgY2MuU3ByaXRlQXRsYXMpO1xuXG4gICAgICAgICAgICBpZiAoc2tlbGV0b25fZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBkZXBzID0gY2MubG9hZGVyLmdldERlcGVuZHNSZWN1cnNpdmVseShza2VsZXRvbl9kYXRhKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBkZXBzX2kgaW4gZGVwcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVwc0RhdGEgID0gY2MubG9hZGVyLmdldFJlcyhkZXBzW2RlcHNfaV0pO1xuICAgICAgICAgICAgICAgICAgICBjYy5sb2FkZXIucmVsZWFzZShkZXBzRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNjLmxvYWRlci5yZWxlYXNlKHNrZWxldG9uX2RhdGEpOyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDln7rkuo7lj4LogINrZXnnmoTlvJXnlKjorqHmlbBcbiAgICAgKiBAYXV0aG9yIHpoYW5naHV4aW5nIDIwMTgtMTItMjBcbiAgICAgKiBAcGFyYW0gIGFzc2V0IOi1hOa6kOWvueixoVxuICAgICAqIEBwYXJhbSAgY291bnQg5pWw6YePXG4gICAgICogQHJldHVybiB7W3R5cGVdfVxuICAgICAqL1xuICAgIGNvdW50UmVmZXJlbmNlOiBmdW5jdGlvbihhc3NldE9yS2V5LCBjb3VudCkge1xuICAgICAgICBpZiAoIWFzc2V0T3JLZXkpIHJldHVybjtcbiAgICAgICAgY291bnQgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IGNvdW50O1xuICAgICAgICB2YXIgcmVmZXJlbmNlS2V5O1xuICAgICAgICAvLyBpZiAoYXNzZXRPcktleSBpbnN0YW5jZW9mIGNjLkFzc2V0KSB7XG4gICAgICAgIC8vICAgICByZWZlcmVuY2VLZXkgPSBjYy5sb2FkZXIuX2dldFJlZmVyZW5jZUtleShhc3NldE9yS2V5KTtcbiAgICAgICAgLy8gICAgIGlmIChhc3NldE9yS2V5IGluc3RhbmNlb2YgY2MuU3ByaXRlQXRsYXMpIHtcbiAgICAgICAgLy8gICAgICAgICB2YXIgZGVwZW5kZXMgPSBjYy5sb2FkZXIuZ2V0RGVwZW5kc1JlY3Vyc2l2ZWx5KGFzc2V0T3JLZXkpO1xuICAgICAgICAvLyAgICAgICAgIGZvciAodmFyIGtleUluZGV4IGluIGRlcGVuZGVzKSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuY291bnRSZWZlcmVuY2UoZGVwZW5kZXNba2V5SW5kZXhdLCBjb3VudCk7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgcmVmZXJlbmNlS2V5ID0gYXNzZXRPcktleTtcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyW3JlZmVyZW5jZUtleV0pXG4gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZV9rZXlfY291bnRlcltyZWZlcmVuY2VLZXldID0gMDtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2Vfa2V5X2NvdW50ZXJbcmVmZXJlbmNlS2V5XSArPSBjb3VudDtcblxuICAgICAgICAvLyBpZiAodGhpcy5yZWZlcmVuY2Vfa2V5X2NvdW50ZXJbcmVmZXJlbmNlS2V5XSA8PSAwKSB7XG4gICAgICAgIC8vICAgICAvLyDph4rmlL5wbmfotYTmupBcbiAgICAgICAgLy8gICAgIGNjLmxvYWRlci5yZWxlYXNlKHJlZmVyZW5jZUtleSk7XG4gICAgICAgIC8vIH1cbiAgICB9LFxuXG4gICAgY2xlYXJSZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciByZXNfa2V5IGluIHRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyW3Jlc19rZXldKVxuICAgICAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyW3Jlc19rZXldID0gMDtcblxuICAgICAgICAgICAgaWYgKHRoaXMucmVmZXJlbmNlX2tleV9jb3VudGVyW3Jlc19rZXldIDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyDph4rmlL5wbmfotYTmupBcbiAgICAgICAgICAgICAgICBjYy5sb2FkZXIucmVsZWFzZShyZXNfa2V5KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5yZWZlcmVuY2Vfa2V5X2NvdW50ZXJbcmVzX2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHJlc19pIGluIHRoaXMucmVzb3VyY2VzX2xpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlc19saXN0W3Jlc19pXVtcImNvdW50XCJdIDw9IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVsZWF5X3JlcyA9IGNjLmxvYWRlci5nZXREZXBlbmRzUmVjdXJzaXZlbHkodGhpcy5yZXNvdXJjZXNfbGlzdFtyZXNfaV1bXCJvYmpcIl0pO1xuICAgICAgICAgICAgICAgIGNjLmxvYWRlci5yZWxlYXNlKHJlbGVheV9yZXMpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlc291cmNlc19saXN0W3Jlc19pXTtcbiAgICAgICAgICAgIH0gICAgICAgICAgICBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZWxlYXNlQnlSZWZlcmVuY2VLZXk6IGZ1bmN0aW9uKHJlZmVyZW5jZUtleSkge1xuXG4gICAgfSxcblxuICAgIC8vIOWKoOi9vemihOWItui1hOa6kFxuICAgIGxvYWRQcmVmYWI6IGZ1bmN0aW9uKHBhdGgsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghd2luZG93LlBSRUZBQl9CVUlMRCkge1xuICAgICAgICAgICAgQ0NfU1VQUE9SVF9KSVQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNfbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICBjYy5sb2FkZXIubG9hZFJlcyhwYXRoLCBjYy5QcmVmYWIsIGZ1bmN0aW9uKGVyciwgcHJlZmFiKSB7XG4gICAgICAgICAgICAgICAgQ0NfU1VQUE9SVF9KSVQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2sgJiYgIWdhbWUucHJlbG9hZF9sb2FkaW5nKSB8fCBwYXRoID09IFwicHJlZmFiL2RyYW1hL2d1aWRlX21haW5fdmlld1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVwcyA9IGNjLmxvYWRlci5nZXREZXBlbmRzUmVjdXJzaXZlbHkocHJlZmFiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHJlc0luZGV4IGluIGRlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXIgdGVzdEFzc2V0ID0gY2MubG9hZGVyLmdldFJlcyhkZXBzW3Jlc0luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudFJlZmVyZW5jZShkZXBzW3Jlc0luZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhjYy5pbnN0YW50aWF0ZShwcmVmYWIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIGNjLmVycm9yKGVyciwgXCJsb2FkIHByZWFmYSBmYWlsZC0tLT5cIiArIHBhdGgpOyAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmlzX2xvYWRpbmcgPSBmYWxzZTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHByZWFmYWJfaW5mbyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgdmFyIHByZWZhYl9uYW1lID0gcHJlYWZhYl9pbmZvLnBvcCgpICsgXCJfcFwiO1xuICAgICAgICAgICAgdmFyIHRvdGFsX25hbWUgPSBwcmVhZmFiX2luZm8ucG9wKCkgKyBcIl9cIiArIHByZWZhYl9uYW1lO1xuICAgICAgICAgICAgY2MubG9hZGVyLmxvYWRSZXMoXCJwcmVmYWJqcy9cIiArIHRvdGFsX25hbWUsIGNjLkpzb25Bc3NldCwgZnVuY3Rpb24odG90YWxfbmFtZSwgZXJyLCB0ZXh0X2RhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGVzdEpTID0gcmVxdWlyZSh0b3RhbF9uYW1lKVxuICAgICAgICAgICAgICAgIHZhciB0ZXN0T2JqID0gbmV3IHRlc3RKUyh0ZXh0X2RhdGEuanNvbik7XG4gICAgICAgICAgICAgICAgLy8gdGVzdE9iai5ub2RlLnggPSB0aGlzLnJvb3ROZC53aWR0aCAqIDAuNTtcbiAgICAgICAgICAgICAgICAvLyB0ZXN0T2JqLm5vZGUueSA9IHRoaXMucm9vdE5kLmhlaWdodCAqIDAuNTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0ZXN0T2JqLm5vZGUpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMsIHRvdGFsX25hbWUpKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOmHiuaUvumihOWItui1hOa6kFxuICAgIHJlbGVhc2VQcmVmYWI6IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgdmFyIHRlc3RBc3NldCA9IGNjLmxvYWRlci5nZXRSZXMocGF0aCk7XG4gICAgICAgIHZhciBkZXBzID0gY2MubG9hZGVyLmdldERlcGVuZHNSZWN1cnNpdmVseSh0ZXN0QXNzZXQpO1xuXG4gICAgICAgIGZvciAodmFyIHJlc0luZGV4IGluIGRlcHMpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0QXNzZXQgPSBjYy5sb2FkZXIuZ2V0UmVzKGRlcHNbcmVzSW5kZXhdKTtcbiAgICAgICAgICAgIHRoaXMuY291bnRSZWZlcmVuY2UoZGVwc1tyZXNJbmRleF0sIC0xKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDph4rmlL7otYTmupBcbiAgICBkZWxldGVSZXM6IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIHRoaXMucmVsZWFzZVJlcyhwYXRoKTtcbiAgICAgICAgLy8gaWYgKHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF0pIHtcbiAgICAgICAgLy8gICAgIHZhciBmaWxlSW5mbyA9IHRoaXMucmVzb3VyY2VzX2xpc3RbcGF0aF07XG4gICAgICAgIC8vICAgICBmaWxlSW5mby5kZWNyZW1lbnRMb2FkTnVtKCk7XG4gICAgICAgIC8vICAgICB2YXIgbG9hZE51bSA9IGZpbGVJbmZvLmdldExvYWROdW0oKTtcbiAgICAgICAgLy8gICAgIGlmIChsb2FkTnVtIDw9IDApe1xuICAgICAgICAvLyAgICAgICAgIGNjLmxvYWRlci5yZWxlYXNlUmVzKGZpbGVJbmZvLnVybCk7XG4gICAgICAgIC8vICAgICAgICAgZmlsZUluZm8uZGVsZXRlTWUoKTtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnJlc291cmNlc19saXN0W3BhdGhdID0gbnVsbDtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgIH0sXG5cbiAgICBnZXRSZXNJbmZvOiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIC8vIOi1hOa6kOexu+Wei+eahOi1t+Wni+S9jee9ruS4i+ihqFxuICAgICAgICB2YXIgdHlwZV9pbmRleCA9IHBhdGguaW5kZXhPZihcIi5cIilcbiAgICAgICAgLy8g5a2X56ym5Liy5oC76ZW/5bqmXG4gICAgICAgIHZhciB0b3RhbF9udW0gPSBwYXRoLmxlbmd0aDtcbiAgICAgICAgLy8g5YmU6Zmk5a2X56ym5Liy57G75Z6L55qE6Lev5b6EXG4gICAgICAgIHZhciBzdHJfa2V5ID0gcGF0aC5zdWJzdHJpbmcoMCwgdHlwZV9pbmRleCk7XG4gICAgICAgIC8vIOi1hOa6kOe6ueeQhuagvOW8j1xuICAgICAgICB2YXIgYXNzZXRzX3R5cGUgPSBwYXRoLnN1YnN0cmluZyh0eXBlX2luZGV4LCB0b3RhbF9udW0pO1xuICAgICAgICAvLyDpnIDopoHliqDovb3nmoTotYTmupDmoLzlvI9cbiAgICAgICAgdmFyIGxvYWRfdHlwZSA9IHRoaXMuZ2V0QXNzZXRzVHlwZVN1ZmZpeChhc3NldHNfdHlwZSk7XG4gICAgICAgIC8vIOWQjue7rei/memHjOimgeWKoOS4iueJiOacrOS/oeaBr+S7peWPinVybOi3r+W+hOWkhOeQhlxuICAgICAgICBcbiAgICAgICAgdmFyIHJlc3VsZXQgPSB7fVxuICAgICAgICByZXN1bGV0LnN0cl9rZXkgPSBzdHJfa2V5O1xuICAgICAgICByZXN1bGV0LmxvYWRfdHlwZSA9IGxvYWRfdHlwZTtcblxuICAgICAgICByZXR1cm4gcmVzdWxldFxuICAgIH0sXG5cbiAgICBnZXRBc3NldHNUeXBlU3VmZml4OiBmdW5jdGlvbiAoc3VmZml4KXtcbiAgICAgICAgc3dpdGNoIChzdWZmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgXCIuanBnXCI6XG4gICAgICAgICAgICBjYXNlIFwiLnBuZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjYy5TcHJpdGVGcmFtZTtcbiAgICAgICAgICAgIGNhc2UgXCIucGxpc3RcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY2MuU3ByaXRlQXRsYXM7XG4gICAgICAgICAgICBjYXNlIFwiLm1wM1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBjYy5BdWRpb0NsaXA7XG4gICAgICAgICAgICBjYXNlIFwiLmF0bGFzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwLlNrZWxldG9uRGF0YTtcbiAgICAgICAgICAgIGNhc2UgXCIucHJlZmFiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNjLlByZWZhYjtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnczogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgLy8gdmFyIGNvbmZpZ196aXBfdXJsID0gREFUQV9VUkwgKyBcImRhdGEuemlwXCIgKyBcIj9cIiArIERBVEFfVkVSO1xuICAgICAgICAvLyDlvq7kv6HlsI/muLjmiI/kuI3kvb/nlKjkuozov5vliLbmlofku7ZcbiAgICAgICAgaWYgKHdpbmRvdy5ERUJVR19EYXRhKSB7XG4gICAgICAgICAgICB2YXIgTW9kdWxlSW5mbyA9IHJlcXVpcmUoXCJtb2R1bGVsaXN0XCIpO1xuICAgICAgICAgICAgdmFyIHRpbWUgPSBnY29yZS5TbWFydFNvY2tldC5nZXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgZGF0YV91cmwgPSBcImh0dHBzOi8vZGV2LWg1LXNzemcuc2hpeXVlZ2FtZS5jb20vZGF0YS9cIjtcbiAgICAgICAgICAgIHZhciB0b3RhbF9udW0gPSAwO1xuICAgICAgICAgICAgZm9yICh2YXIgY2ZnX2kgPSAwOyBjZmdfaSA8ICBNb2R1bGVJbmZvLmRhdGFfbGlzdC5sZW5ndGg7IGNmZ19pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdG90b2FsX3VybCA9IGRhdGFfdXJsICsgTW9kdWxlSW5mby5kYXRhX2xpc3RbY2ZnX2ldICsgXCIuanNvblwiICsgXCI/dGltZT1cIiArIHRpbWU7XG4gICAgICAgICAgICAgICAgY2MubG9hZGVyLmxvYWQodG90b2FsX3VybCwgZnVuY3Rpb24obmFtZSwgZXJyLCBqc29uX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxfbnVtICsrXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWdbbmFtZV0gPSBqc29uX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsX251bSA9PSBNb2R1bGVJbmZvLmRhdGFfbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh0b3RhbF9udW0vTW9kdWxlSW5mby5kYXRhX2xpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCBNb2R1bGVJbmZvLmRhdGFfbGlzdFtjZmdfaV0pKVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFBMQVRGT1JNX1RZUFIgPT0gXCJXWF9TREtcIiB8fCBQTEFURk9STV9UWVBSID09IFwiU0hfU0RLXCIgfHwgUExBVEZPUk1fVFlQUiA9PSBcIlFRX1NES1wiKSB7XG4gICAgICAgICAgICAgICAgdmFyIE1vZHVsZUluZm8gPSByZXF1aXJlKFwibW9kdWxlbGlzdFwiKTtcbiAgICAgICAgICAgICAgICB2YXIgdG90YWxOdW0gPSBNb2R1bGVJbmZvLmRhdGFfbGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmlzaE51bSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgY2ZnX2kgPSAwOyBjZmdfaSA8ICBNb2R1bGVJbmZvLmRhdGFfbGlzdC5sZW5ndGg7IGNmZ19pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFfcGF0aCA9IFwiZGF0YS9cIiArIE1vZHVsZUluZm8uZGF0YV9saXN0W2NmZ19pXTtcbiAgICAgICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uKGRhdGFfcGF0aCwgY2ZnX2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkUmVzKGRhdGFfcGF0aCwgY2MuSnNvbkFzc2V0LCBmdW5jdGlvbihuYW1lLCBlcnIsIGpzb25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnW25hbWVdID0ganNvbkRhdGEuanNvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hOdW0gKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5sb2coQ29uZmlnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hOdW0gPT0gdG90YWxOdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhmaW5pc2hOdW0vdG90YWxOdW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCBNb2R1bGVJbmZvLmRhdGFfbGlzdFtjZmdfaV0pKVxuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgZGF0YV9wYXRoLCBjZmdfaSksIDIwICogY2ZnX2ksIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBaaXBMb2FkZXIuUmVnaXN0ZXJaaXBMb2FkZXIoKTtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YV9wYXRoID1jYy51cmwucmF3KFwicmVzb3VyY2VzL2RhdGEvZGF0YS56aXBcIilcbiAgICAgICAgICAgICAgICBjYy5sb2FkZXIubG9hZChkYXRhX3BhdGgsIGZ1bmN0aW9uKGVyciwgemlwRGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBKU1ppcCA9IHJlcXVpcmUoXCJqc3ppcFwiKTtcbiAgICAgICAgICAgICAgICAgIHppcERhdGEgPSBuZXcgSlNaaXAoemlwRGF0YSwge2NoZWNrQ1JDMzI6ZmFsc2V9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHppcERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3RhbF9udW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cl9udW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZGF0YV9pIGluIHppcERhdGEuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9udW0gKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uKGRhdGFfaSwgY3VyX251bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9ICBKU09OLnBhcnNlKHppcERhdGEuZmlsZXNbZGF0YV9pXS5hc1RleHQoKSk7ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVfbmFtZSA9IGRhdGFfaS5zdWJzdHJpbmcoMCwgZGF0YV9pLmxlbmd0aCAtIDUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ1tmaWxlX25hbWVdID0gZGF0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBjdXJfbnVtIC8gNjY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cl9udW0gPj0gdG90YWxfbnVtICYmIGN1cl9udW0gPjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGRhdGFfaSwgdG90YWxfbnVtKSwgMjAgKiB0b3RhbF9udW0sIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcykpICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnU2NyaXB0OiBmdW5jdGlvbihmaW5pc2hfY2IpIHtcbiAgICAgICAgLy8g5Y+R5biD54mI5pys77yM6ZyA6KaB5Yqg6L295ZCI5bm25ZCOanNvbuWQjueahEpT5paH5Lu2XG4gICAgICAgIGlmICh3aW5kb3cuVVNFX01FUkdFX0pTT04pIHtcbiAgICAgICAgICAgIHZhciBkYXRhX3BhdGggPVwic3JjL21lcmdlX2pzb25cIiArICh3aW5kb3cuUEFDS0FHRV9WRVJTSU9OIHx8IFwiXCIpICsgIFwiLmpzXCI7XG4gICAgICAgICAgICAvLyB2YXIgZGF0YV9wYXRoID0gXCJzcmMvbWVyZ2VfanNvblwiICsgXCIuanNcIjsgICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiX19fanNvbj09PlwiLGRhdGFfcGF0aClcbiAgICAgICAgICAgIGNjLmxvYWRlci5sb2FkKGRhdGFfcGF0aCwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliqDovb1tZXJnZeaIkOWKn1wiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cod2luZG93LkltcG9ydENvbmZpZ3MpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWKoOi9vW1lcmdlX2pzb27lpLHotKVcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG59KTtcblxuTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUxvYWRlck1hbmFnZXIuaW5zdGFuY2UpIHtcbiAgICAgICAgTG9hZGVyTWFuYWdlci5pbnN0YW5jZSA9IG5ldyBMb2FkZXJNYW5hZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBMb2FkZXJNYW5hZ2VyLmluc3RhbmNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExvYWRlck1hbmFnZXI7Il19