@yibozhang/pro-table 16.1.5 → 16.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/page-public/antd-form.mjs +319 -8
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/yibozhang-pro-table.mjs +318 -7
- package/fesm2022/yibozhang-pro-table.mjs.map +1 -1
- package/lib/page-public/antd-form.d.ts +26 -2
- package/lib/page-public/antd-form.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -1
- package/public-api.d.ts.map +1 -1
- package/src/lib/styles/custom-antd.less +0 -8
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Injectable } from "@angular/core";
|
|
2
|
-
import { UntypedFormGroup, } from "@angular/forms";
|
|
2
|
+
import { UntypedFormArray, UntypedFormGroup, } from "@angular/forms";
|
|
3
3
|
import { debounceTime, distinctUntilChanged } from "rxjs/operators";
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import * as i1 from "@angular/forms";
|
|
@@ -15,6 +15,9 @@ export class AntdFormService {
|
|
|
15
15
|
labelAlign = "right";
|
|
16
16
|
labelObservers = {};
|
|
17
17
|
errorMessageStore = {};
|
|
18
|
+
arrayEditingRows = {};
|
|
19
|
+
arrayRowSnapshots = {};
|
|
20
|
+
arrayItemConfigs = {};
|
|
18
21
|
classPrefix = "ant-form-";
|
|
19
22
|
defaultErrorMessages = {
|
|
20
23
|
required: "该字段为必填项",
|
|
@@ -35,6 +38,40 @@ export class AntdFormService {
|
|
|
35
38
|
"type" in config &&
|
|
36
39
|
config.type === "group");
|
|
37
40
|
}
|
|
41
|
+
// 判断是否为 FormArray 配置
|
|
42
|
+
isFormArrayConfig(config) {
|
|
43
|
+
return (typeof config === "object" &&
|
|
44
|
+
config !== null &&
|
|
45
|
+
"type" in config &&
|
|
46
|
+
config.type === "array");
|
|
47
|
+
}
|
|
48
|
+
// 根据路径获取嵌套的 FormArray
|
|
49
|
+
getNestedFormArray(formGroup, path) {
|
|
50
|
+
if (!path || path.trim() === "") {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const pathParts = path.split(".").filter((p) => p.trim() !== "");
|
|
54
|
+
let current = formGroup;
|
|
55
|
+
for (let i = 0; i < pathParts.length; i++) {
|
|
56
|
+
if (!current)
|
|
57
|
+
return null;
|
|
58
|
+
const part = pathParts[i];
|
|
59
|
+
if (i === pathParts.length - 1) {
|
|
60
|
+
const target = current.get
|
|
61
|
+
? current.get(part)
|
|
62
|
+
: null;
|
|
63
|
+
return target instanceof UntypedFormArray ? target : null;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
current = current instanceof UntypedFormGroup ? current.get(part) : null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
// 根据 itemConfig 创建 FormArray 的单行 FormGroup
|
|
72
|
+
createArrayRowGroup(itemConfig, disabled) {
|
|
73
|
+
return this.createNestedFormGroup(itemConfig, disabled);
|
|
74
|
+
}
|
|
38
75
|
// 递归创建嵌套 FormGroup
|
|
39
76
|
createNestedFormGroup(fields, disabled) {
|
|
40
77
|
const groupConfig = {};
|
|
@@ -43,6 +80,15 @@ export class AntdFormService {
|
|
|
43
80
|
// 递归创建嵌套的 FormGroup
|
|
44
81
|
groupConfig[key] = this.createNestedFormGroup(fieldConfig.fields, fieldConfig.disabled ?? disabled);
|
|
45
82
|
}
|
|
83
|
+
else if (this.isFormArrayConfig(fieldConfig)) {
|
|
84
|
+
// 创建 FormArray
|
|
85
|
+
const rows = [];
|
|
86
|
+
const rowCount = fieldConfig.initialRows ?? 0;
|
|
87
|
+
for (let i = 0; i < rowCount; i++) {
|
|
88
|
+
rows.push(this.createArrayRowGroup(fieldConfig.itemConfig, fieldConfig.disabled ?? disabled));
|
|
89
|
+
}
|
|
90
|
+
groupConfig[key] = this.fb.array(rows, fieldConfig.validators?.() ?? []);
|
|
91
|
+
}
|
|
46
92
|
else {
|
|
47
93
|
// 创建普通 FormControl
|
|
48
94
|
groupConfig[key] = [
|
|
@@ -70,6 +116,16 @@ export class AntdFormService {
|
|
|
70
116
|
this.errorMessageStore[name][key] = fieldConfig.errorMessages;
|
|
71
117
|
}
|
|
72
118
|
}
|
|
119
|
+
else if (this.isFormArrayConfig(fieldConfig)) {
|
|
120
|
+
// 处理 FormArray
|
|
121
|
+
const rows = [];
|
|
122
|
+
const rowCount = fieldConfig.initialRows ?? 0;
|
|
123
|
+
for (let i = 0; i < rowCount; i++) {
|
|
124
|
+
rows.push(this.createArrayRowGroup(fieldConfig.itemConfig, fieldConfig.disabled));
|
|
125
|
+
}
|
|
126
|
+
groupConfig[key] = this.fb.array(rows, fieldConfig.validators?.() ?? []);
|
|
127
|
+
this._ensureArrayItemConfig(name, key, fieldConfig.itemConfig);
|
|
128
|
+
}
|
|
73
129
|
else {
|
|
74
130
|
// 处理普通字段
|
|
75
131
|
groupConfig[key] = [
|
|
@@ -107,18 +163,30 @@ export class AntdFormService {
|
|
|
107
163
|
// 销毁对应的表单
|
|
108
164
|
destory(names) {
|
|
109
165
|
names.forEach((name) => {
|
|
110
|
-
//
|
|
166
|
+
// 清理错误消息存储
|
|
111
167
|
if (this.errorMessageStore[name]) {
|
|
112
168
|
delete this.errorMessageStore[name];
|
|
113
169
|
}
|
|
114
|
-
//
|
|
170
|
+
// 清理表单注册标记
|
|
115
171
|
if (this.formRegisterStore[name]) {
|
|
116
172
|
delete this.formRegisterStore[name];
|
|
117
173
|
}
|
|
118
|
-
//
|
|
174
|
+
// 清理表单组(Angular 会自动处理 FormGroup 的清理)
|
|
119
175
|
if (this.formStore[name]) {
|
|
120
176
|
delete this.formStore[name];
|
|
121
177
|
}
|
|
178
|
+
// 清理 FormArray 编辑状态
|
|
179
|
+
if (this.arrayEditingRows[name]) {
|
|
180
|
+
delete this.arrayEditingRows[name];
|
|
181
|
+
}
|
|
182
|
+
// 清理 FormArray 行快照
|
|
183
|
+
if (this.arrayRowSnapshots[name]) {
|
|
184
|
+
delete this.arrayRowSnapshots[name];
|
|
185
|
+
}
|
|
186
|
+
// 清理 FormArray itemConfig 缓存
|
|
187
|
+
if (this.arrayItemConfigs[name]) {
|
|
188
|
+
delete this.arrayItemConfigs[name];
|
|
189
|
+
}
|
|
122
190
|
});
|
|
123
191
|
}
|
|
124
192
|
// 根据路径获取嵌套的 FormGroup
|
|
@@ -214,6 +282,16 @@ export class AntdFormService {
|
|
|
214
282
|
errorMessagesToAdd[errorMessageKey] = fieldConfig.errorMessages;
|
|
215
283
|
}
|
|
216
284
|
}
|
|
285
|
+
else if (this.isFormArrayConfig(fieldConfig)) {
|
|
286
|
+
// 创建 FormArray
|
|
287
|
+
const rows = [];
|
|
288
|
+
const rowCount = fieldConfig.initialRows ?? 0;
|
|
289
|
+
for (let i = 0; i < rowCount; i++) {
|
|
290
|
+
rows.push(this.createArrayRowGroup(fieldConfig.itemConfig, fieldConfig.disabled));
|
|
291
|
+
}
|
|
292
|
+
control = this.fb.array(rows, fieldConfig.validators?.() ?? []);
|
|
293
|
+
this._ensureArrayItemConfig(formName, fieldName, fieldConfig.itemConfig);
|
|
294
|
+
}
|
|
217
295
|
else {
|
|
218
296
|
// 创建普通 FormControl
|
|
219
297
|
const controlOptions = {
|
|
@@ -337,16 +415,58 @@ export class AntdFormService {
|
|
|
337
415
|
result.success = result.failed.length === 0;
|
|
338
416
|
return result;
|
|
339
417
|
}
|
|
340
|
-
//
|
|
418
|
+
// 局部赋值(支持 FormArray 回填:自动重建行结构)
|
|
341
419
|
patchFormValues(name, values, options) {
|
|
342
420
|
const formGroup = this.formStore[name];
|
|
343
421
|
if (!formGroup) {
|
|
344
422
|
console.warn(`[AntdFormService] patchFormValues: form "${name}" not found.`);
|
|
345
423
|
return;
|
|
346
424
|
}
|
|
347
|
-
|
|
348
|
-
|
|
425
|
+
const arrayValues = {};
|
|
426
|
+
const plainValues = {};
|
|
427
|
+
// 区分 FormArray 字段和普通字段
|
|
428
|
+
Object.entries(values).forEach(([key, val]) => {
|
|
429
|
+
const ctrl = formGroup.get(key);
|
|
430
|
+
if (ctrl instanceof UntypedFormArray && Array.isArray(val)) {
|
|
431
|
+
arrayValues[key] = val;
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
plainValues[key] = val;
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
// 处理 FormArray 回填:清空旧行,按 itemConfig 重建
|
|
438
|
+
Object.entries(arrayValues).forEach(([key, rows]) => {
|
|
439
|
+
const formArray = formGroup.get(key);
|
|
440
|
+
const itemConfig = this.arrayItemConfigs[name]?.[key];
|
|
441
|
+
// 清空现有行
|
|
442
|
+
while (formArray.length > 0) {
|
|
443
|
+
formArray.removeAt(0, { emitEvent: false });
|
|
444
|
+
}
|
|
445
|
+
// 清理该数组的编辑状态和快照
|
|
446
|
+
this._ensureArrayState(name, key);
|
|
447
|
+
this.arrayEditingRows[name][key] = new Set();
|
|
448
|
+
this.arrayRowSnapshots[name][key] = new Map();
|
|
449
|
+
// 按 itemConfig 创建行并回填
|
|
450
|
+
rows.forEach((rowData) => {
|
|
451
|
+
const newRow = itemConfig
|
|
452
|
+
? this.createArrayRowGroup(itemConfig)
|
|
453
|
+
: this.fb.group({});
|
|
454
|
+
if (itemConfig) {
|
|
455
|
+
newRow.patchValue(rowData, { emitEvent: false });
|
|
456
|
+
}
|
|
457
|
+
formArray.push(newRow, { emitEvent: false });
|
|
458
|
+
});
|
|
459
|
+
// 统一触发一次 valueChanges
|
|
460
|
+
if (options?.emitEvent !== false) {
|
|
461
|
+
formArray.updateValueAndValidity({ emitEvent: true });
|
|
462
|
+
}
|
|
349
463
|
});
|
|
464
|
+
// 处理普通字段(含嵌套 FormGroup)
|
|
465
|
+
if (Object.keys(plainValues).length > 0) {
|
|
466
|
+
formGroup.patchValue(plainValues, {
|
|
467
|
+
emitEvent: options?.emitEvent ?? true,
|
|
468
|
+
});
|
|
469
|
+
}
|
|
350
470
|
}
|
|
351
471
|
// 表单校验(自动过滤内部字段)
|
|
352
472
|
validateForm(name, options) {
|
|
@@ -375,6 +495,12 @@ export class AntdFormService {
|
|
|
375
495
|
this.markAllControlsAsDirty(childControl, emitEvent, onlySelf);
|
|
376
496
|
});
|
|
377
497
|
}
|
|
498
|
+
// 如果是 FormArray,递归处理所有行
|
|
499
|
+
if (control instanceof UntypedFormArray) {
|
|
500
|
+
control.controls.forEach((childControl) => {
|
|
501
|
+
this.markAllControlsAsDirty(childControl, emitEvent, onlySelf);
|
|
502
|
+
});
|
|
503
|
+
}
|
|
378
504
|
}
|
|
379
505
|
// ==================== 错误消息相关 ====================
|
|
380
506
|
// 获取字段首条错误提示
|
|
@@ -431,6 +557,191 @@ export class AntdFormService {
|
|
|
431
557
|
}
|
|
432
558
|
return this.setupValueChangeSubscription(control, handler, options);
|
|
433
559
|
}
|
|
560
|
+
// ==================== FormArray 操作 ====================
|
|
561
|
+
// 获取指定路径的 FormArray 实例(供模板 ngFor 使用)
|
|
562
|
+
getFormArray(formName, arrayPath) {
|
|
563
|
+
const formGroup = this.formStore[formName];
|
|
564
|
+
if (!formGroup) {
|
|
565
|
+
console.warn(`[AntdFormService] getFormArray: form "${formName}" not found.`);
|
|
566
|
+
return null;
|
|
567
|
+
}
|
|
568
|
+
const formArray = this.getNestedFormArray(formGroup, arrayPath);
|
|
569
|
+
if (!formArray) {
|
|
570
|
+
console.warn(`[AntdFormService] getFormArray: FormArray at path "${arrayPath}" not found in form "${formName}".`);
|
|
571
|
+
}
|
|
572
|
+
return formArray;
|
|
573
|
+
}
|
|
574
|
+
// 向 FormArray 新增一行(自动进入编辑状态,无快照)
|
|
575
|
+
addArrayRow(formName, arrayPath) {
|
|
576
|
+
const formGroup = this.formStore[formName];
|
|
577
|
+
if (!formGroup) {
|
|
578
|
+
console.warn(`[AntdFormService] addArrayRow: form "${formName}" not found.`);
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
const formArray = this.getNestedFormArray(formGroup, arrayPath);
|
|
582
|
+
if (!formArray) {
|
|
583
|
+
console.warn(`[AntdFormService] addArrayRow: FormArray at path "${arrayPath}" not found in form "${formName}".`);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
// 取第一行的结构作为模板,若无行则无法推断 itemConfig
|
|
587
|
+
// 新行默认为空 FormGroup(调用方应通过 itemConfig 传入具体结构)
|
|
588
|
+
// 实际行创建通过 _addArrayRowWithConfig 完成,此处保留空行兜底
|
|
589
|
+
const newRow = this.fb.group({});
|
|
590
|
+
formArray.push(newRow);
|
|
591
|
+
const newIndex = formArray.length - 1;
|
|
592
|
+
this._ensureArrayState(formName, arrayPath);
|
|
593
|
+
// 新增行无历史快照,cancelRowEdit 时直接删除
|
|
594
|
+
this.arrayEditingRows[formName][arrayPath].add(newIndex);
|
|
595
|
+
}
|
|
596
|
+
// 向 FormArray 新增一行(指定 itemConfig)
|
|
597
|
+
addArrayRowWithConfig(formName, arrayPath, itemConfig) {
|
|
598
|
+
const formGroup = this.formStore[formName];
|
|
599
|
+
if (!formGroup) {
|
|
600
|
+
console.warn(`[AntdFormService] addArrayRowWithConfig: form "${formName}" not found.`);
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
const formArray = this.getNestedFormArray(formGroup, arrayPath);
|
|
604
|
+
if (!formArray) {
|
|
605
|
+
console.warn(`[AntdFormService] addArrayRowWithConfig: FormArray at path "${arrayPath}" not found in form "${formName}".`);
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
const newRow = this.createArrayRowGroup(itemConfig);
|
|
609
|
+
formArray.push(newRow);
|
|
610
|
+
const newIndex = formArray.length - 1;
|
|
611
|
+
this._ensureArrayState(formName, arrayPath);
|
|
612
|
+
// 新增行无历史快照,cancelRowEdit 时直接删除
|
|
613
|
+
this.arrayEditingRows[formName][arrayPath].add(newIndex);
|
|
614
|
+
}
|
|
615
|
+
// 删除 FormArray 中指定行(同时清理编辑状态和快照,并重对齐索引)
|
|
616
|
+
removeArrayRow(formName, arrayPath, index) {
|
|
617
|
+
const formGroup = this.formStore[formName];
|
|
618
|
+
if (!formGroup) {
|
|
619
|
+
console.warn(`[AntdFormService] removeArrayRow: form "${formName}" not found.`);
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
622
|
+
const formArray = this.getNestedFormArray(formGroup, arrayPath);
|
|
623
|
+
if (!formArray) {
|
|
624
|
+
console.warn(`[AntdFormService] removeArrayRow: FormArray at path "${arrayPath}" not found in form "${formName}".`);
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
if (index < 0 || index >= formArray.length) {
|
|
628
|
+
console.warn(`[AntdFormService] removeArrayRow: index ${index} out of range.`);
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
formArray.removeAt(index);
|
|
632
|
+
this._ensureArrayState(formName, arrayPath);
|
|
633
|
+
// 清理被删行的快照
|
|
634
|
+
const snapshotMap = this.arrayRowSnapshots[formName][arrayPath];
|
|
635
|
+
snapshotMap.delete(index);
|
|
636
|
+
// 重对齐:快照中 > index 的键全部 -1
|
|
637
|
+
const newSnapshotMap = new Map();
|
|
638
|
+
snapshotMap.forEach((value, key) => {
|
|
639
|
+
newSnapshotMap.set(key > index ? key - 1 : key, value);
|
|
640
|
+
});
|
|
641
|
+
this.arrayRowSnapshots[formName][arrayPath] = newSnapshotMap;
|
|
642
|
+
// 重对齐:editingRows 中 > index 的索引全部 -1
|
|
643
|
+
const editingSet = this.arrayEditingRows[formName][arrayPath];
|
|
644
|
+
const newEditingSet = new Set();
|
|
645
|
+
editingSet.forEach((i) => {
|
|
646
|
+
if (i !== index) {
|
|
647
|
+
newEditingSet.add(i > index ? i - 1 : i);
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
this.arrayEditingRows[formName][arrayPath] = newEditingSet;
|
|
651
|
+
}
|
|
652
|
+
// 存储 FormArray 的 itemConfig(用于回填时重建行结构)
|
|
653
|
+
_ensureArrayItemConfig(formName, arrayPath, itemConfig) {
|
|
654
|
+
if (!this.arrayItemConfigs[formName]) {
|
|
655
|
+
this.arrayItemConfigs[formName] = {};
|
|
656
|
+
}
|
|
657
|
+
this.arrayItemConfigs[formName][arrayPath] = itemConfig;
|
|
658
|
+
}
|
|
659
|
+
// 初始化 arrayEditingRows 和 arrayRowSnapshots 对应路径(若不存在则创建)
|
|
660
|
+
_ensureArrayState(formName, arrayPath) {
|
|
661
|
+
if (!this.arrayEditingRows[formName]) {
|
|
662
|
+
this.arrayEditingRows[formName] = {};
|
|
663
|
+
}
|
|
664
|
+
if (!this.arrayEditingRows[formName][arrayPath]) {
|
|
665
|
+
this.arrayEditingRows[formName][arrayPath] = new Set();
|
|
666
|
+
}
|
|
667
|
+
if (!this.arrayRowSnapshots[formName]) {
|
|
668
|
+
this.arrayRowSnapshots[formName] = {};
|
|
669
|
+
}
|
|
670
|
+
if (!this.arrayRowSnapshots[formName][arrayPath]) {
|
|
671
|
+
this.arrayRowSnapshots[formName][arrayPath] = new Map();
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
// ==================== FormArray 行级编辑 ====================
|
|
675
|
+
// 开启指定行的编辑模式(保存当前值为快照)
|
|
676
|
+
startRowEdit(formName, arrayPath, index) {
|
|
677
|
+
const formArray = this.getFormArray(formName, arrayPath);
|
|
678
|
+
if (!formArray)
|
|
679
|
+
return;
|
|
680
|
+
const rowControl = formArray.at(index);
|
|
681
|
+
if (!rowControl) {
|
|
682
|
+
console.warn(`[AntdFormService] startRowEdit: row ${index} not found in "${arrayPath}".`);
|
|
683
|
+
return;
|
|
684
|
+
}
|
|
685
|
+
this._ensureArrayState(formName, arrayPath);
|
|
686
|
+
// 保存快照(仅当快照不存在时,避免重复编辑覆盖原始值)
|
|
687
|
+
const snapshotMap = this.arrayRowSnapshots[formName][arrayPath];
|
|
688
|
+
if (!snapshotMap.has(index)) {
|
|
689
|
+
snapshotMap.set(index, JSON.parse(JSON.stringify(rowControl.getRawValue())));
|
|
690
|
+
}
|
|
691
|
+
this.arrayEditingRows[formName][arrayPath].add(index);
|
|
692
|
+
}
|
|
693
|
+
// 确认保存指定行(验证通过则清除快照并退出编辑状态,返回行数据;否则返回 false)
|
|
694
|
+
confirmRowEdit(formName, arrayPath, index) {
|
|
695
|
+
const formArray = this.getFormArray(formName, arrayPath);
|
|
696
|
+
if (!formArray)
|
|
697
|
+
return false;
|
|
698
|
+
const rowControl = formArray.at(index);
|
|
699
|
+
if (!rowControl) {
|
|
700
|
+
console.warn(`[AntdFormService] confirmRowEdit: row ${index} not found in "${arrayPath}".`);
|
|
701
|
+
return false;
|
|
702
|
+
}
|
|
703
|
+
if (rowControl.invalid) {
|
|
704
|
+
this.markAllControlsAsDirty(rowControl, true, false);
|
|
705
|
+
return false;
|
|
706
|
+
}
|
|
707
|
+
this._ensureArrayState(formName, arrayPath);
|
|
708
|
+
this.arrayRowSnapshots[formName][arrayPath].delete(index);
|
|
709
|
+
this.arrayEditingRows[formName][arrayPath].delete(index);
|
|
710
|
+
return this.excludeInternalFields(rowControl.getRawValue());
|
|
711
|
+
}
|
|
712
|
+
// 取消编辑指定行(从快照恢复值;若无快照则说明是新增行,直接删除该行)
|
|
713
|
+
cancelRowEdit(formName, arrayPath, index) {
|
|
714
|
+
const formArray = this.getFormArray(formName, arrayPath);
|
|
715
|
+
if (!formArray)
|
|
716
|
+
return;
|
|
717
|
+
this._ensureArrayState(formName, arrayPath);
|
|
718
|
+
const snapshotMap = this.arrayRowSnapshots[formName][arrayPath];
|
|
719
|
+
if (snapshotMap.has(index)) {
|
|
720
|
+
// 已有行:从快照恢复值
|
|
721
|
+
const snapshot = snapshotMap.get(index);
|
|
722
|
+
const rowControl = formArray.at(index);
|
|
723
|
+
if (rowControl) {
|
|
724
|
+
rowControl.patchValue(snapshot);
|
|
725
|
+
rowControl.markAsPristine();
|
|
726
|
+
rowControl.markAsUntouched();
|
|
727
|
+
}
|
|
728
|
+
snapshotMap.delete(index);
|
|
729
|
+
this.arrayEditingRows[formName][arrayPath].delete(index);
|
|
730
|
+
}
|
|
731
|
+
else {
|
|
732
|
+
// 新增行:直接删除
|
|
733
|
+
this.removeArrayRow(formName, arrayPath, index);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
// 查询指定行是否处于编辑状态
|
|
737
|
+
isRowEditing(formName, arrayPath, index) {
|
|
738
|
+
return (this.arrayEditingRows[formName]?.[arrayPath]?.has(index) ?? false);
|
|
739
|
+
}
|
|
740
|
+
// 获取所有正在编辑的行索引列表
|
|
741
|
+
getEditingRowIndices(formName, arrayPath) {
|
|
742
|
+
const editingSet = this.arrayEditingRows[formName]?.[arrayPath];
|
|
743
|
+
return editingSet ? Array.from(editingSet).sort((a, b) => a - b) : [];
|
|
744
|
+
}
|
|
434
745
|
// ==================== 工具方法 ====================
|
|
435
746
|
// 获取表单类名
|
|
436
747
|
getFormClassName(name) {
|
|
@@ -508,4 +819,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
508
819
|
type: Injectable,
|
|
509
820
|
args: [{ providedIn: "root" }]
|
|
510
821
|
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }]; } });
|
|
511
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50ZC1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvLXRhYmxlL3NyYy9saWIvcGFnZS1wdWJsaWMvYW50ZC1mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUlMLGdCQUFnQixHQUVqQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBMEVwRSxnREFBZ0Q7QUFHaEQsTUFBTSxPQUFPLGVBQWU7SUF3Qk47SUF2QnBCLGlEQUFpRDtJQUNqRCxTQUFTLEdBQXFDLEVBQUUsQ0FBQztJQUNqRCxjQUFjLEdBQW1CLFFBQVEsQ0FBQztJQUUxQyxpREFBaUQ7SUFDekMsaUJBQWlCLEdBQTRCLEVBQUUsQ0FBQztJQUNoRCxVQUFVLEdBQVcsT0FBTyxDQUFDO0lBQzdCLFVBQVUsR0FBVyxPQUFPLENBQUM7SUFDN0IsY0FBYyxHQUFxQyxFQUFFLENBQUM7SUFDdEQsaUJBQWlCLEdBR3JCLEVBQUUsQ0FBQztJQUNDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakIsb0JBQW9CLEdBQXVCO1FBQzFELFFBQVEsRUFBRSxTQUFTO1FBQ25CLFNBQVMsRUFBRSxRQUFRO1FBQ25CLFNBQVMsRUFBRSxRQUFRO1FBQ25CLEtBQUssRUFBRSxZQUFZO1FBQ25CLE9BQU8sRUFBRSxTQUFTO0tBQ25CLENBQUM7SUFFRixpREFBaUQ7SUFDakQsWUFBb0IsRUFBc0I7UUFBdEIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7SUFBRyxDQUFDO0lBRTlDLHFEQUFxRDtJQUVyRCx1QkFBdUI7SUFDZixpQkFBaUIsQ0FDdkIsTUFBcUM7UUFFckMsT0FBTyxDQUNMLE9BQU8sTUFBTSxLQUFLLFFBQVE7WUFDMUIsTUFBTSxLQUFLLElBQUk7WUFDZixNQUFNLElBQUksTUFB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RUFBRTtZQUMzQyxpQkFBaUI7WUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxVQUFVO0lBQ0YsNEJBQTRCLENBQ2xDLE1BQXlDLEVBQ3pDLE9BQTJCLEVBQzNCLE9BQXNCO1FBRXRCLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFFeEMsSUFBSSxPQUFPLEVBQUUsUUFBUSxJQUFJLElBQUksRUFBRTtZQUM3QixhQUFhLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFFRCxJQUFJLE9BQU8sRUFBRSxvQkFBb0IsS0FBSyxLQUFLLEVBQUU7WUFDM0MsYUFBYSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxPQUFPLEVBQUUsV0FBVyxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkI7UUFFRCxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsQ0FBQzt3R0F6b0JVLGVBQWU7NEdBQWYsZUFBZSxjQURGLE1BQU07OzRGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBBYnN0cmFjdENvbnRyb2xPcHRpb25zLFxyXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcclxuICBVbnR5cGVkRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvckZuLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PSDnsbvlnovlrprkuYkgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbi8vIOWtl+autemUmeivr+a2iOaBr+exu+Wei++8iOWtl+espuS4suaIluWHveaVsO+8iVxyXG5leHBvcnQgdHlwZSBGaWVsZEVycm9yTWVzc2FnZSA9XHJcbiAgfCBzdHJpbmdcclxuICB8ICgoY29udGV4dDogeyBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w7IGNvbnRyb2xOYW1lOiBzdHJpbmcgfSkgPT4gc3RyaW5nKTtcclxuXHJcbi8vIOWtl+autemUmeivr+a2iOaBr+mbhuWQiFxyXG5leHBvcnQgdHlwZSBGaWVsZEVycm9yTWVzc2FnZXMgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZEVycm9yTWVzc2FnZT47XHJcblxyXG4vLyDlrZfmrrXphY3nva5cclxuZXhwb3J0IHR5cGUgRmllbGRDb25maWcgPSB7XHJcbiAgdmFsdWU6IGFueTtcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgdmFsaWRhdG9ycz86ICgpID0+IFZhbGlkYXRvckZuW107XHJcbiAgZXJyb3JNZXNzYWdlcz86IEZpZWxkRXJyb3JNZXNzYWdlcztcclxufTtcclxuXHJcbi8vIOW1jOWllyBGb3JtR3JvdXAg6YWN572uXHJcbmV4cG9ydCB0eXBlIEZvcm1Hcm91cENvbmZpZyA9IHtcclxuICB0eXBlOiBcImdyb3VwXCI7XHJcbiAgZmllbGRzOiBGb3JtQ29uZmlnO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB2YWxpZGF0b3JzPzogKCkgPT4gVmFsaWRhdG9yRm5bXTtcclxuICBlcnJvck1lc3NhZ2VzPzogRmllbGRFcnJvck1lc3NhZ2VzO1xyXG59O1xyXG5cclxuLy8g6KGo5Y2V5L+u5pS557G75Z6LXHJcbmV4cG9ydCB0eXBlIEZvcm1Nb2RpZnlUeXBlID0gXCJjcmVhdGVcIiB8IFwidXBkYXRlXCI7XHJcblxyXG4vLyDooajljZXphY3nva7vvIjmlK/mjIHmma7pgJrlrZfmrrXlkozltYzlpZcgRm9ybUdyb3Vw77yJXHJcbmV4cG9ydCB0eXBlIEZvcm1Db25maWcgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZENvbmZpZyB8IEZvcm1Hcm91cENvbmZpZz47XHJcblxyXG4vLyDnm5HlkKzpgInpoblcclxuZXhwb3J0IHR5cGUgV2F0Y2hPcHRpb25zID0ge1xyXG4gIGRlYm91bmNlPzogbnVtYmVyO1xyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkPzogYm9vbGVhbjtcclxuICBlbWl0SW5pdGlhbD86IGJvb2xlYW47XHJcbn07XHJcblxyXG4vLyDmibnph4/mt7vliqDlrZfmrrXphY3nva7pgInpoblcclxuZXhwb3J0IHR5cGUgQWRkRmllbGRzQ29uZmlnT3B0aW9ucyA9IHtcclxuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xyXG4gIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHk/OiBib29sZWFuO1xyXG4gIG9uRmllbGRBZGRlZD86IChmaWVsZE5hbWU6IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgZXJyb3I/OiBzdHJpbmcpID0+IHZvaWQ7IC8vIOavj+S4quWtl+autea3u+WKoOeahOWbnuiwg1xyXG4gIHRhcmdldFBhdGg/OiBzdHJpbmc7IC8vIOebruagh+i3r+W+hO+8jOeUqOS6juWcqOW1jOWllyBGb3JtR3JvdXAg5YaF6YOo5re75Yqg5a2X5q6177yM5L6L5aaCOiBcImNhcmRCYXNlSW5mb1wiIOaIliBcInVzZXJJbmZvLmFkZHJlc3NJbmZvXCJcclxufTtcclxuXHJcbi8vIOaJuemHj+a3u+WKoOWtl+autemFjee9rue7k+aenFxyXG5leHBvcnQgdHlwZSBBZGRGaWVsZHNDb25maWdSZXN1bHQgPSB7XHJcbiAgc3VjY2VzczogYm9vbGVhbjtcclxuICBhZGRlZDogc3RyaW5nW107IC8vIOaIkOWKn+a3u+WKoOeahOWtl+auteWQjeWIl+ihqFxyXG4gIGZhaWxlZDogQXJyYXk8eyBmaWVsZE5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjsgLy8g5aSx6LSl55qE5a2X5q615Y+K6ZSZ6K+v5L+h5oGvXHJcbn07XHJcblxyXG4vLyDmibnph4/liKDpmaTlrZfmrrXphY3nva7pgInpoblcclxuZXhwb3J0IHR5cGUgUmVtb3ZlRmllbGRzQ29uZmlnT3B0aW9ucyA9IHtcclxuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xyXG4gIG9uRmllbGRSZW1vdmVkPzogKFxyXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXHJcbiAgICBzdWNjZXNzOiBib29sZWFuLFxyXG4gICAgZXJyb3I/OiBzdHJpbmdcclxuICApID0+IHZvaWQ7IC8vIOavj+S4quWtl+auteWIoOmZpOeahOWbnuiwg1xyXG59O1xyXG5cclxuLy8g5om56YeP5Yig6Zmk5a2X5q616YWN572u57uT5p6cXHJcbmV4cG9ydCB0eXBlIFJlbW92ZUZpZWxkc0NvbmZpZ1Jlc3VsdCA9IHtcclxuICBzdWNjZXNzOiBib29sZWFuO1xyXG4gIHJlbW92ZWQ6IHN0cmluZ1tdOyAvLyDmiJDlip/liKDpmaTnmoTlrZfmrrXlkI3liJfooahcclxuICBmYWlsZWQ6IEFycmF5PHsgZmllbGROYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47IC8vIOWksei0peeahOWtl+auteWPiumUmeivr+S/oeaBr1xyXG59O1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT0g5pyN5Yqh57G7ID09PT09PT09PT09PT09PT09PT09XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXHJcbmV4cG9ydCBjbGFzcyBBbnRkRm9ybVNlcnZpY2Uge1xyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOWFrOWFseWxnuaApyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGZvcm1TdG9yZTogUmVjb3JkPHN0cmluZywgVW50eXBlZEZvcm1Hcm91cD4gPSB7fTtcclxuICBmb3JtTW9kaWZ5VHlwZTogRm9ybU1vZGlmeVR5cGUgPSBcImNyZWF0ZVwiO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDnp4HmnInlsZ7mgKcgPT09PT09PT09PT09PT09PT09PT1cclxuICBwcml2YXRlIGZvcm1SZWdpc3RlclN0b3JlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gIHByaXZhdGUgbGFiZWxXaWR0aDogc3RyaW5nID0gXCIxMjBweFwiO1xyXG4gIHByaXZhdGUgbGFiZWxBbGlnbjogc3RyaW5nID0gXCJyaWdodFwiO1xyXG4gIHByaXZhdGUgbGFiZWxPYnNlcnZlcnM6IFJlY29yZDxzdHJpbmcsIE11dGF0aW9uT2JzZXJ2ZXI+ID0ge307XHJcbiAgcHJpdmF0ZSBlcnJvck1lc3NhZ2VTdG9yZTogUmVjb3JkPFxyXG4gICAgc3RyaW5nLFxyXG4gICAgUmVjb3JkPHN0cmluZywgRmllbGRFcnJvck1lc3NhZ2VzPlxyXG4gID4gPSB7fTtcclxuICBwcml2YXRlIGNsYXNzUHJlZml4ID0gXCJhbnQtZm9ybS1cIjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRFcnJvck1lc3NhZ2VzOiBGaWVsZEVycm9yTWVzc2FnZXMgPSB7XHJcbiAgICByZXF1aXJlZDogXCLor6XlrZfmrrXkuLrlv4XloavpoblcIixcclxuICAgIG1pbmxlbmd0aDogXCLovpPlhaXplb/luqbkuI3otrNcIixcclxuICAgIG1heGxlbmd0aDogXCLovpPlhaXplb/luqbotoXpmZBcIixcclxuICAgIGVtYWlsOiBcIuivt+i+k+WFpeWQiOazleeahOmCrueuseWcsOWdgFwiLFxyXG4gICAgcGF0dGVybjogXCLovpPlhaXmoLzlvI/kuI3mraPnoa5cIixcclxuICB9O1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDmnoTpgKDlh73mlbAgPT09PT09PT09PT09PT09PT09PT1cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIpIHt9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOihqOWNleWIm+W7uuWSjOWIneWni+WMliA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDliKTmlq3mmK/lkKbkuLrltYzlpZcgRm9ybUdyb3VwIOmFjee9rlxyXG4gIHByaXZhdGUgaXNGb3JtR3JvdXBDb25maWcoXHJcbiAgICBjb25maWc6IEZpZWxkQ29uZmlnIHwgRm9ybUdyb3VwQ29uZmlnXHJcbiAgKTogY29uZmlnIGlzIEZvcm1Hcm91cENvbmZpZyB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0eXBlb2YgY29uZmlnID09PSBcIm9iamVjdFwiICYmXHJcbiAgICAgIGNvbmZpZyAhPT0gbnVsbCAmJlxyXG4gICAgICBcInR5cGVcIiBpbiBjb25maWcgJiZcclxuICAgICAgY29uZmlnLnR5cGUgPT09IFwiZ3JvdXBcIlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIOmAkuW9kuWIm+W7uuW1jOWllyBGb3JtR3JvdXBcclxuICBwcml2YXRlIGNyZWF0ZU5lc3RlZEZvcm1Hcm91cChcclxuICAgIGZpZWxkczogRm9ybUNvbmZpZyxcclxuICAgIGRpc2FibGVkPzogYm9vbGVhblxyXG4gICk6IFVudHlwZWRGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgZ3JvdXBDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuXHJcbiAgICBPYmplY3QuZW50cmllcyhmaWVsZHMpLmZvckVhY2goKFtrZXksIGZpZWxkQ29uZmlnXSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc0Zvcm1Hcm91cENvbmZpZyhmaWVsZENvbmZpZykpIHtcclxuICAgICAgICAvLyDpgJLlvZLliJvlu7rltYzlpZfnmoQgRm9ybUdyb3VwXHJcbiAgICAgICAgZ3JvdXBDb25maWdba2V5XSA9IHRoaXMuY3JlYXRlTmVzdGVkRm9ybUdyb3VwKFxyXG4gICAgICAgICAgZmllbGRDb25maWcuZmllbGRzLFxyXG4gICAgICAgICAgZmllbGRDb25maWcuZGlzYWJsZWQgPz8gZGlzYWJsZWRcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWIm+W7uuaZrumAmiBGb3JtQ29udHJvbFxyXG4gICAgICAgIGdyb3VwQ29uZmlnW2tleV0gPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBmaWVsZENvbmZpZy52YWx1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkQ29uZmlnLmRpc2FibGVkID8/IGRpc2FibGVkID8/IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGZpZWxkQ29uZmlnLnZhbGlkYXRvcnM/LigpID8/IFtdLFxyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKGdyb3VwQ29uZmlnKTtcclxuICB9XHJcblxyXG4gIC8vIOWIneWni+WMluihqOWNlVxyXG4gIGNyZWF0ZUZvcm1Hcm91cChcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGNvbmZpZzogRm9ybUNvbmZpZyxcclxuICAgIG9wdGlvbnM/OiB7IGxhYmVsV2lkdGg/OiBzdHJpbmc7IGxhYmVsQWxpZ24/OiBzdHJpbmcgfVxyXG4gICk6IFVudHlwZWRGb3JtR3JvdXAge1xyXG4gICAgY29uc3QgZ3JvdXBDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbbmFtZV0gPSB7fTtcclxuXHJcbiAgICBPYmplY3QuZW50cmllcyhjb25maWcpLmZvckVhY2goKFtrZXksIGZpZWxkQ29uZmlnXSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc0Zvcm1Hcm91cENvbmZpZyhmaWVsZENvbmZpZykpIHtcclxuICAgICAgICAvLyDlpITnkIbltYzlpZcgRm9ybUdyb3VwXHJcbiAgICAgICAgY29uc3QgbmVzdGVkR3JvdXAgPSB0aGlzLmNyZWF0ZU5lc3RlZEZvcm1Hcm91cChcclxuICAgICAgICAgIGZpZWxkQ29uZmlnLmZpZWxkcyxcclxuICAgICAgICAgIGZpZWxkQ29uZmlnLmRpc2FibGVkXHJcbiAgICAgICAgKTtcclxuICAgICAgICBncm91cENvbmZpZ1trZXldID0gbmVzdGVkR3JvdXA7XHJcblxyXG4gICAgICAgIC8vIOWtmOWCqOW1jOWllyBGb3JtR3JvdXAg55qE6ZSZ6K+v5raI5oGv77yI5aaC5p6c6ZyA6KaB77yJXHJcbiAgICAgICAgaWYgKGZpZWxkQ29uZmlnLmVycm9yTWVzc2FnZXMpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbbmFtZV1ba2V5XSA9IGZpZWxkQ29uZmlnLmVycm9yTWVzc2FnZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWkhOeQhuaZrumAmuWtl+autVxyXG4gICAgICAgIGdyb3VwQ29uZmlnW2tleV0gPSBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBmaWVsZENvbmZpZy52YWx1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkQ29uZmlnLmRpc2FibGVkID8/IGZhbHNlLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGZpZWxkQ29uZmlnLnZhbGlkYXRvcnM/LigpID8/IFtdLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgaWYgKGZpZWxkQ29uZmlnLmVycm9yTWVzc2FnZXMpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbbmFtZV1ba2V5XSA9IGZpZWxkQ29uZmlnLmVycm9yTWVzc2FnZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ubGFiZWxXaWR0aCkge1xyXG4gICAgICB0aGlzLmxhYmVsV2lkdGggPSBvcHRpb25zLmxhYmVsV2lkdGg7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucz8ubGFiZWxBbGlnbikge1xyXG4gICAgICB0aGlzLmxhYmVsQWxpZ24gPSBvcHRpb25zLmxhYmVsQWxpZ247XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvcm1TdG9yZVtuYW1lXSA9IHRoaXMuZmIuZ3JvdXAoZ3JvdXBDb25maWcpO1xyXG4gICAgdGhpcy5mb3JtUmVnaXN0ZXJTdG9yZVtuYW1lXSA9IHRydWU7XHJcbiAgICB0aGlzLnNldENTU1ZhcmlhYmxlc1RvVGFyZ2V0KG5hbWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVN0b3JlW25hbWVdO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0g6KGo5Y2V5pON5L2cID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8vIOmHjee9ruihqOWNlVxyXG4gIHJlc2V0Rm9ybUdyb3VwKG5hbWU6IHN0cmluZywgdmFsdWU/OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybVN0b3JlW25hbWVdPy5yZXNldCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvLyDmo4DmtYvooajljZXmmK/lkKblrozmiJDms6jlhoxcclxuICBpc0Zvcm1SZWdpc3RlcmVkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybVJlZ2lzdGVyU3RvcmVbbmFtZV0gPz8gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyDplIDmr4Hlr7nlupTnmoTooajljZVcclxuICBkZXN0b3J5KG5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgbmFtZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xyXG4gICAgICAvLyAyLiDmuIXnkIbplJnor6/mtojmga/lrZjlgqhcclxuICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbbmFtZV0pIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gMy4g5riF55CG6KGo5Y2V5rOo5YaM5qCH6K6wXHJcbiAgICAgIGlmICh0aGlzLmZvcm1SZWdpc3RlclN0b3JlW25hbWVdKSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZm9ybVJlZ2lzdGVyU3RvcmVbbmFtZV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIDQuIOa4heeQhuihqOWNlee7hO+8iEFuZ3VsYXIg5Lya6Ieq5Yqo5aSE55CGIEZvcm1Hcm91cCDnmoTmuIXnkIbvvIlcclxuICAgICAgaWYgKHRoaXMuZm9ybVN0b3JlW25hbWVdKSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZm9ybVN0b3JlW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOagueaNrui3r+W+hOiOt+WPluW1jOWll+eahCBGb3JtR3JvdXBcclxuICBwcml2YXRlIGdldE5lc3RlZEZvcm1Hcm91cChcclxuICAgIGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCxcclxuICAgIHBhdGg6IHN0cmluZ1xyXG4gICk6IFVudHlwZWRGb3JtR3JvdXAgfCBudWxsIHtcclxuICAgIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gZm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpLmZpbHRlcigocCkgPT4gcC50cmltKCkgIT09IFwiXCIpO1xyXG4gICAgbGV0IGN1cnJlbnRHcm91cDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IGZvcm1Hcm91cDtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aFBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudEdyb3VwIHx8ICEoY3VycmVudEdyb3VwIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50R3JvdXAgPSBjdXJyZW50R3JvdXAuZ2V0KHBhcnQpO1xyXG4gICAgICBpZiAoIWN1cnJlbnRHcm91cCB8fCAhKGN1cnJlbnRHcm91cCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudEdyb3VwIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCA/IGN1cnJlbnRHcm91cCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDmibnph4/mt7vliqDlrZfmrrXphY3nva5cclxuICBhZGRGaWVsZHNDb25maWcoXHJcbiAgICBmb3JtTmFtZTogc3RyaW5nLFxyXG4gICAgZmllbGRzQ29uZmlnOiBGb3JtQ29uZmlnLFxyXG4gICAgb3B0aW9ucz86IEFkZEZpZWxkc0NvbmZpZ09wdGlvbnNcclxuICApOiBBZGRGaWVsZHNDb25maWdSZXN1bHQge1xyXG4gICAgY29uc3QgcmVzdWx0OiBBZGRGaWVsZHNDb25maWdSZXN1bHQgPSB7XHJcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIGFkZGVkOiBbXSxcclxuICAgICAgZmFpbGVkOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gMS4g6aqM6K+B6KGo5Y2V5piv5ZCm5a2Y5ZyoXHJcbiAgICBjb25zdCByb290Rm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbZm9ybU5hbWVdO1xyXG4gICAgaWYgKCFyb290Rm9ybUdyb3VwKSB7XHJcbiAgICAgIC8vIOWmguaenOihqOWNleS4jeWtmOWcqO+8jOaJgOacieWtl+autemDveWksei0pVxyXG4gICAgICBPYmplY3Qua2V5cyhmaWVsZHNDb25maWcpLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZvcm0gXCIke2Zvcm1OYW1lfVwiIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4g6I635Y+W55uu5qCHIEZvcm1Hcm91cO+8iOaUr+aMgeW1jOWll+i3r+W+hO+8iVxyXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IG9wdGlvbnM/LnRhcmdldFBhdGg7XHJcbiAgICBjb25zdCB0YXJnZXRGb3JtR3JvdXAgPSB0YXJnZXRQYXRoXHJcbiAgICAgID8gdGhpcy5nZXROZXN0ZWRGb3JtR3JvdXAocm9vdEZvcm1Hcm91cCwgdGFyZ2V0UGF0aClcclxuICAgICAgOiByb290Rm9ybUdyb3VwO1xyXG5cclxuICAgIGlmICghdGFyZ2V0Rm9ybUdyb3VwKSB7XHJcbiAgICAgIC8vIOWmguaenOebruaghyBGb3JtR3JvdXAg5LiN5a2Y5Zyo77yM5omA5pyJ5a2X5q616YO95aSx6LSlXHJcbiAgICAgIE9iamVjdC5rZXlzKGZpZWxkc0NvbmZpZykuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0YXJnZXRQYXRoXHJcbiAgICAgICAgICA/IGBUYXJnZXQgRm9ybUdyb3VwIGF0IHBhdGggXCIke3RhcmdldFBhdGh9XCIgbm90IGZvdW5kYFxyXG4gICAgICAgICAgOiBgRm9ybUdyb3VwIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMy4g5Yid5aeL5YyWIGVycm9yTWVzc2FnZVN0b3Jl77yI5aaC5p6c5LiN5a2Y5Zyo77yJXHJcbiAgICBpZiAoIXRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4g5om56YeP5p6E5bu65o6n5Lu26YWN572uXHJcbiAgICBjb25zdCBjb250cm9sc1RvQWRkOiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdENvbnRyb2w+ID0ge307XHJcbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzVG9BZGQ6IFJlY29yZDxzdHJpbmcsIEZpZWxkRXJyb3JNZXNzYWdlcz4gPSB7fTtcclxuXHJcbiAgICAvLyA1LiDpgY3ljobmiYDmnInlrZfmrrXphY3nva7vvIzov5vooYzpqozor4HlkozmnoTlu7pcclxuICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkc0NvbmZpZykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRDb25maWddKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gNS4xIOajgOafpeWtl+auteaYr+WQpuW3suWtmOWcqFxyXG4gICAgICAgIGlmICh0YXJnZXRGb3JtR3JvdXAuZ2V0KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICAgIGNvbnN0IGVycm9yID0gYEZpZWxkIFwiJHtmaWVsZE5hbWV9XCIgYWxyZWFkeSBleGlzdHMke1xyXG4gICAgICAgICAgICB0YXJnZXRQYXRoID8gYCBpbiBcIiR7dGFyZ2V0UGF0aH1cImAgOiBcIlwiXHJcbiAgICAgICAgICB9YDtcclxuICAgICAgICAgIHJlc3VsdC5mYWlsZWQucHVzaCh7XHJcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIDUuMiDliJvlu7rmjqfku7ZcclxuICAgICAgICBsZXQgY29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Zvcm1Hcm91cENvbmZpZyhmaWVsZENvbmZpZykpIHtcclxuICAgICAgICAgIC8vIOWIm+W7uuW1jOWllyBGb3JtR3JvdXBcclxuICAgICAgICAgIGNvbnRyb2wgPSB0aGlzLmNyZWF0ZU5lc3RlZEZvcm1Hcm91cChcclxuICAgICAgICAgICAgZmllbGRDb25maWcuZmllbGRzLFxyXG4gICAgICAgICAgICBmaWVsZENvbmZpZy5kaXNhYmxlZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIC8vIOWtmOWCqOW1jOWllyBGb3JtR3JvdXAg55qE6ZSZ6K+v5raI5oGv77yI5aaC5p6c6ZyA6KaB77yJXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VLZXkgPSB0YXJnZXRQYXRoXHJcbiAgICAgICAgICAgICAgPyBgJHt0YXJnZXRQYXRofS4ke2ZpZWxkTmFtZX1gXHJcbiAgICAgICAgICAgICAgOiBmaWVsZE5hbWU7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZXNUb0FkZFtlcnJvck1lc3NhZ2VLZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5Yib5bu65pmu6YCaIEZvcm1Db250cm9sXHJcbiAgICAgICAgICBjb25zdCBjb250cm9sT3B0aW9uczogQWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgdmFsaWRhdG9yczogZmllbGRDb25maWcudmFsaWRhdG9ycz8uKCkgPz8gW10sXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY29udHJvbCA9IHRoaXMuZmIuY29udHJvbChmaWVsZENvbmZpZy52YWx1ZSwgY29udHJvbE9wdGlvbnMpO1xyXG4gICAgICAgICAgLy8g6K6+572uIGRpc2FibGVkIOeKtuaAgVxyXG4gICAgICAgICAgaWYgKGZpZWxkQ29uZmlnLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8g5a2Y5YKo6ZSZ6K+v5raI5oGvXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VLZXkgPSB0YXJnZXRQYXRoXHJcbiAgICAgICAgICAgICAgPyBgJHt0YXJnZXRQYXRofS4ke2ZpZWxkTmFtZX1gXHJcbiAgICAgICAgICAgICAgOiBmaWVsZE5hbWU7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZXNUb0FkZFtlcnJvck1lc3NhZ2VLZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnRyb2xzVG9BZGRbZmllbGROYW1lXSA9IGNvbnRyb2w7XHJcblxyXG4gICAgICAgIHJlc3VsdC5hZGRlZC5wdXNoKGZpZWxkTmFtZSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZEFkZGVkPy4oZmllbGROYW1lLCB0cnVlKTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XHJcbiAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8udG9TdHJpbmcoKSB8fCBcIlVua25vd24gZXJyb3JcIjtcclxuICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBvcHRpb25zPy5vbkZpZWxkQWRkZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvck1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyA2LiDmibnph4/mt7vliqDliLDnm67moIcgRm9ybUdyb3VwXHJcbiAgICBpZiAoT2JqZWN0LmtleXMoY29udHJvbHNUb0FkZCkubGVuZ3RoID4gMCkge1xyXG4gICAgICBPYmplY3QuZW50cmllcyhjb250cm9sc1RvQWRkKS5mb3JFYWNoKChbZmllbGROYW1lLCBjb250cm9sXSkgPT4ge1xyXG4gICAgICAgIHRhcmdldEZvcm1Hcm91cC5hZGRDb250cm9sKGZpZWxkTmFtZSwgY29udHJvbCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gNy4g5om56YeP5a2Y5YKo6ZSZ6K+v5raI5oGvXHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVycm9yTWVzc2FnZXNUb0FkZCkuZm9yRWFjaCgoW2tleSwgbWVzc2FnZXNdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtmb3JtTmFtZV1ba2V5XSA9IG1lc3NhZ2VzO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIDguIOabtOaWsOihqOWNlemqjOivgeeKtuaAgVxyXG4gICAgICBpZiAob3B0aW9ucz8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSkge1xyXG4gICAgICAgIHRhcmdldEZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtcclxuICAgICAgICAgIGVtaXRFdmVudDogb3B0aW9ucz8uZW1pdEV2ZW50ID8/IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA5LiDliKTmlq3mlbTkvZPmmK/lkKbmiJDlip9cclxuICAgIHJlc3VsdC5zdWNjZXNzID0gcmVzdWx0LmZhaWxlZC5sZW5ndGggPT09IDA7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIOaJuemHj+WIoOmZpOWtl+autemFjee9rlxyXG4gIHJlbW92ZUZpZWxkc0NvbmZpZyhcclxuICAgIGZvcm1OYW1lOiBzdHJpbmcsXHJcbiAgICBmaWVsZE5hbWVzOiBzdHJpbmdbXSxcclxuICAgIG9wdGlvbnM/OiBSZW1vdmVGaWVsZHNDb25maWdPcHRpb25zXHJcbiAgKTogUmVtb3ZlRmllbGRzQ29uZmlnUmVzdWx0IHtcclxuICAgIGNvbnN0IHJlc3VsdDogUmVtb3ZlRmllbGRzQ29uZmlnUmVzdWx0ID0ge1xyXG4gICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICByZW1vdmVkOiBbXSxcclxuICAgICAgZmFpbGVkOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gMS4g6aqM6K+B6KGo5Y2V5piv5ZCm5a2Y5ZyoXHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1TdG9yZVtmb3JtTmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBmaWVsZE5hbWVzLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZvcm0gXCIke2Zvcm1OYW1lfVwiIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRSZW1vdmVkPy4oZmllbGROYW1lLCBmYWxzZSwgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyLiDmibnph4/mlLbpm4bpnIDopoHmuIXnkIbnmoTkv6Hmga9cclxuICAgIGNvbnN0IGZpZWxkc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgIC8vIDMuIOmqjOivgeavj+S4quWtl+auteW5tuaUtumbhuS/oeaBr1xyXG4gICAgZmllbGROYW1lcy5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcclxuICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGROYW1lKTtcclxuXHJcbiAgICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZpZWxkIFwiJHtmaWVsZE5hbWV9XCIgbm90IGZvdW5kYDtcclxuICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZFJlbW92ZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvcik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDmlLbpm4bplJnor6/mtojmga/plK5cclxuICAgICAgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlLnB1c2goZmllbGROYW1lKTtcclxuICAgICAgZmllbGRzVG9SZW1vdmUucHVzaChmaWVsZE5hbWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNC4g5om56YeP5omn6KGM5Yig6Zmk5pON5L2cXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyA0LjEg5LuOIEZvcm1Hcm91cCDkuK3np7vpmaTmjqfku7ZcclxuICAgICAgZmllbGRzVG9SZW1vdmUuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woZmllbGROYW1lKTtcclxuICAgICAgICByZXN1bHQucmVtb3ZlZC5wdXNoKGZpZWxkTmFtZSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZFJlbW92ZWQ/LihmaWVsZE5hbWUsIHRydWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIDQuMiDmibnph4/liKDpmaTplJnor6/mtojmga9cclxuICAgICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdKSB7XHJcbiAgICAgICAgZXJyb3JNZXNzYWdlS2V5c1RvUmVtb3ZlLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdW2tleV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgLy8g5aaC5p6c5om56YeP5Yig6Zmk6L+H56iL5Lit5Ye66ZSZ77yM5qCH6K6w5Li65aSx6LSlXHJcbiAgICAgIGZpZWxkc1RvUmVtb3ZlLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGlmICghcmVzdWx0LnJlbW92ZWQuaW5jbHVkZXMoZmllbGROYW1lKSkge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cclxuICAgICAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3I/LnRvU3RyaW5nKCkgfHwgXCJGYWlsZWQgdG8gcmVtb3ZlIGZpZWxkXCI7XHJcbiAgICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgICBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIG9wdGlvbnM/Lm9uRmllbGRSZW1vdmVkPy4oZmllbGROYW1lLCBmYWxzZSwgZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDUuIOWIpOaWreaVtOS9k+aYr+WQpuaIkOWKn1xyXG4gICAgcmVzdWx0LnN1Y2Nlc3MgPSByZXN1bHQuZmFpbGVkLmxlbmd0aCA9PT0gMDtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8g5bGA6YOo6LWL5YC8XHJcbiAgcGF0Y2hGb3JtVmFsdWVzKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG4gICAgb3B0aW9ucz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1TdG9yZVtuYW1lXTtcclxuICAgIGlmICghZm9ybUdyb3VwKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gcGF0Y2hGb3JtVmFsdWVzOiBmb3JtIFwiJHtuYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtR3JvdXAucGF0Y2hWYWx1ZSh2YWx1ZXMsIHtcclxuICAgICAgZW1pdEV2ZW50OiBvcHRpb25zPy5lbWl0RXZlbnQgPz8gdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g6KGo5Y2V5qCh6aqM77yI6Ieq5Yqo6L+H5ruk5YaF6YOo5a2X5q6177yJXHJcbiAgdmFsaWRhdGVGb3JtKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgb3B0aW9ucz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbjsgb25seVNlbGY/OiBib29sZWFuIH1cclxuICApOiBib29sZWFuIHwgUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBpZiAodGhpcy5mb3JtU3RvcmVbbmFtZV0udmFsaWQpIHtcclxuICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLmZvcm1TdG9yZVtuYW1lXS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5leGNsdWRlSW50ZXJuYWxGaWVsZHMocmF3VmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g6YCS5b2S5qCh6aqM5omA5pyJ5o6n5Lu2XHJcbiAgICAgIHRoaXMubWFya0FsbENvbnRyb2xzQXNEaXJ0eShcclxuICAgICAgICB0aGlzLmZvcm1TdG9yZVtuYW1lXSxcclxuICAgICAgICBvcHRpb25zPy5lbWl0RXZlbnQgPz8gdHJ1ZSxcclxuICAgICAgICBvcHRpb25zPy5vbmx5U2VsZiA/PyBmYWxzZVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDpgJLlvZLmoIforrDmiYDmnInml6DmlYjmjqfku7bkuLogZGlydHlcclxuICBwcml2YXRlIG1hcmtBbGxDb250cm9sc0FzRGlydHkoXHJcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICBlbWl0RXZlbnQ6IGJvb2xlYW4sXHJcbiAgICBvbmx5U2VsZjogYm9vbGVhblxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKGNvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7XHJcbiAgICAgICAgZW1pdEV2ZW50LFxyXG4gICAgICAgIG9ubHlTZWxmLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzmmK8gRm9ybUdyb3Vw77yM6YCS5b2S5aSE55CG5omA5pyJ5a2Q5o6n5Lu2XHJcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApIHtcclxuICAgICAgT2JqZWN0LnZhbHVlcyhjb250cm9sLmNvbnRyb2xzKS5mb3JFYWNoKChjaGlsZENvbnRyb2wpID0+IHtcclxuICAgICAgICB0aGlzLm1hcmtBbGxDb250cm9sc0FzRGlydHkoY2hpbGRDb250cm9sLCBlbWl0RXZlbnQsIG9ubHlTZWxmKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDplJnor6/mtojmga/nm7jlhbMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g6I635Y+W5a2X5q616aaW5p2h6ZSZ6K+v5o+Q56S6XHJcbiAgZ2V0RmllbGRFcnJvck1lc3NhZ2UobmFtZTogc3RyaW5nLCBjb250cm9sTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybVN0b3JlW25hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSBnZXRGaWVsZEVycm9yTWVzc2FnZTogZm9ybSBcIiR7bmFtZX1cIiBub3QgZm91bmQuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIGdldEZpZWxkRXJyb3JNZXNzYWdlOiBjb250cm9sIFwiJHtjb250cm9sTmFtZX1cIiBub3QgZm91bmQgaW4gZm9ybSBcIiR7bmFtZX1cIi5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjb250cm9sLmVycm9ycykge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDku44gZXJyb3JNZXNzYWdlU3RvcmUg6I635Y+W6ZSZ6K+v5raI5oGv6YWN572uXHJcbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXT8uW2NvbnRyb2xOYW1lXTtcclxuICAgIGNvbnN0IG1lcmdlZE1lc3NhZ2VzID0ge1xyXG4gICAgICAuLi50aGlzLmRlZmF1bHRFcnJvck1lc3NhZ2VzLFxyXG4gICAgICAuLi4oZXJyb3JNZXNzYWdlcyA/PyB7fSksXHJcbiAgICB9O1xyXG5cclxuICAgIGZvciAoY29uc3QgZXJyb3JLZXkgb2YgT2JqZWN0LmtleXMoY29udHJvbC5lcnJvcnMpKSB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXJnZWRNZXNzYWdlc1tlcnJvcktleV07XHJcbiAgICAgIGlmIChtZXNzYWdlKSB7XHJcbiAgICAgICAgLy8g5LiN5YaN5pSv5oyB5Ye95pWw5b2i5byP77yM5Y+q6L+U5Zue5a2X56ym5LiyXHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IFwiXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0g55uR5ZCs55u45YWzID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8vIOebkeWQrOihqOWNleaJgOacieWtl+auteWPmOabtFxyXG4gIHdhdGNoRm9ybUNoYW5nZXM8VCA9IGFueT4oXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQsXHJcbiAgICBvcHRpb25zPzogV2F0Y2hPcHRpb25zXHJcbiAgKTogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybVN0b3JlW25hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSB3YXRjaEZvcm1DaGFuZ2VzOiBmb3JtIFwiJHtuYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2V0dXBWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbihmb3JtR3JvdXAsIGhhbmRsZXIsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy8g55uR5ZCs5oyH5a6a5a2X5q615Y+Y5pu0XHJcbiAgd2F0Y2hGaWVsZENoYW5nZXM8VCA9IGFueT4oXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBjb250cm9sTmFtZTogc3RyaW5nLFxyXG4gICAgaGFuZGxlcjogKHZhbHVlOiBUKSA9PiB2b2lkLFxyXG4gICAgb3B0aW9ucz86IFdhdGNoT3B0aW9uc1xyXG4gICk6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1TdG9yZVtuYW1lXTtcclxuICAgIGlmICghZm9ybUdyb3VwKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gd2F0Y2hGaWVsZENoYW5nZXM6IGZvcm0gXCIke25hbWV9XCIgbm90IGZvdW5kLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChjb250cm9sTmFtZSk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSB3YXRjaEZpZWxkQ2hhbmdlczogY29udHJvbCBcIiR7Y29udHJvbE5hbWV9XCIgbm90IGZvdW5kIGluIGZvcm0gXCIke25hbWV9XCIuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNldHVwVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24oY29udHJvbCwgaGFuZGxlciwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDlt6Xlhbfmlrnms5UgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g6I635Y+W6KGo5Y2V57G75ZCNXHJcbiAgZ2V0Rm9ybUNsYXNzTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuY2xhc3NQcmVmaXh9Y3VzdG9tLSR7bmFtZX0gYDtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9riBDU1Mg5Y+Y6YeP5Yiw55uu5qCH5YWD57Sg77yI5pSv5oyB5oyB5LmF5YyW55uR5ZCs5Yqo5oCB5re75Yqg55qE5YWD57Sg77yJXHJcbiAgc2V0Q1NTVmFyaWFibGVzVG9UYXJnZXQobmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb3JtQ29udGFpbmVyU2VsZWN0b3IgPSBgLiR7dGhpcy5nZXRGb3JtQ2xhc3NOYW1lKG5hbWUpfWA7XHJcbiAgICBjb25zdCBmb3JtQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgZm9ybUNvbnRhaW5lclNlbGVjdG9yXHJcbiAgICApIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8vIOWmguaenOWuueWZqOi/mOS4jeWtmOWcqO+8jOWPr+S7peeUqCBNdXRhdGlvbk9ic2VydmVyIOetieW+heWug+WHuueOsFxyXG4gICAgaWYgKCFmb3JtQ29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICBmb3JtQ29udGFpbmVyU2VsZWN0b3JcclxuICAgICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tbGFiZWwtd2lkdGhcIiwgdGhpcy5sYWJlbFdpZHRoKTtcclxuICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tbGFiZWwtYWxpZ25cIiwgdGhpcy5sYWJlbEFsaWduKTtcclxuICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7XHJcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxyXG4gICAgICAgIHN1YnRyZWU6IHRydWUsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gMTDnp5LlkI7oh6rliqjmlq3lvIDvvIzpgb/lhY3lhoXlrZjms4TmvI9cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCksIDEwMDAwKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWcqOWuueWZqOS4iuiuvue9riBDU1Mg5Y+Y6YePXHJcbiAgICBmb3JtQ29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1sYWJlbC13aWR0aFwiLCB0aGlzLmxhYmVsV2lkdGgpO1xyXG4gICAgZm9ybUNvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tbGFiZWwtYWxpZ25cIiwgdGhpcy5sYWJlbEFsaWduKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOengeacieaWueazlSA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDov4fmu6TlhoXpg6jlrZfmrrXvvIjpgJLlvZLlpITnkIblr7nosaHlkozmlbDnu4TvvIlcclxuICBwcml2YXRlIGV4Y2x1ZGVJbnRlcm5hbEZpZWxkcyh2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnibnmrorlpITnkIYgRGF0ZSDlr7nosaHvvIznm7TmjqXov5Tlm57kuI3lgZrovazmjaJcclxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLmV4Y2x1ZGVJbnRlcm5hbEZpZWxkcyhpdGVtKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmlsdGVyZWQ6IGFueSA9IHt9O1xyXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcclxuICAgICAgLy8g6L+H5ruk5LulIF9fIOW8gOWktOeahOWGhemDqOWtl+autVxyXG4gICAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwiX19cIikpIHtcclxuICAgICAgICBmaWx0ZXJlZFtrZXldID0gdGhpcy5leGNsdWRlSW50ZXJuYWxGaWVsZHModmFsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZmlsdGVyZWQ7XHJcbiAgfVxyXG5cclxuICAvLyDorr7nva7lgLzlj5jmm7TorqLpmIVcclxuICBwcml2YXRlIHNldHVwVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb248VD4oXHJcbiAgICB0YXJnZXQ6IHsgdmFsdWVDaGFuZ2VzOiBhbnk7IHZhbHVlOiBhbnkgfSxcclxuICAgIGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCxcclxuICAgIG9wdGlvbnM/OiBXYXRjaE9wdGlvbnNcclxuICApOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgbGV0IHZhbHVlQ2hhbmdlcyQgPSB0YXJnZXQudmFsdWVDaGFuZ2VzO1xyXG5cclxuICAgIGlmIChvcHRpb25zPy5kZWJvdW5jZSAhPSBudWxsKSB7XHJcbiAgICAgIHZhbHVlQ2hhbmdlcyQgPSB2YWx1ZUNoYW5nZXMkLnBpcGUoZGVib3VuY2VUaW1lKG9wdGlvbnMuZGVib3VuY2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9ucz8uZGlzdGluY3RVbnRpbENoYW5nZWQgIT09IGZhbHNlKSB7XHJcbiAgICAgIHZhbHVlQ2hhbmdlcyQgPSB2YWx1ZUNoYW5nZXMkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/LmVtaXRJbml0aWFsKSB7XHJcbiAgICAgIGhhbmRsZXIodGFyZ2V0LnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWVDaGFuZ2VzJC5zdWJzY3JpYmUoaGFuZGxlcik7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
822
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50ZC1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvLXRhYmxlL3NyYy9saWIvcGFnZS1wdWJsaWMvYW50ZC1mb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUdMLGdCQUFnQixFQUVoQixnQkFBZ0IsR0FFakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQW1GcEUsZ0RBQWdEO0FBR2hELE1BQU0sT0FBTyxlQUFlO0lBOEJOO0lBN0JwQixpREFBaUQ7SUFDakQsU0FBUyxHQUFxQyxFQUFFLENBQUM7SUFDakQsY0FBYyxHQUFtQixRQUFRLENBQUM7SUFFMUMsaURBQWlEO0lBQ3pDLGlCQUFpQixHQUE0QixFQUFFLENBQUM7SUFDaEQsVUFBVSxHQUFXLE9BQU8sQ0FBQztJQUM3QixVQUFVLEdBQVcsT0FBTyxDQUFDO0lBQzdCLGNBQWMsR0FBcUMsRUFBRSxDQUFDO0lBQ3RELGlCQUFpQixHQUdyQixFQUFFLENBQUM7SUFDQyxnQkFBZ0IsR0FBZ0QsRUFBRSxDQUFDO0lBQ25FLGlCQUFpQixHQUdyQixFQUFFLENBQUM7SUFDQyxnQkFBZ0IsR0FBK0MsRUFBRSxDQUFDO0lBQ2xFLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakIsb0JBQW9CLEdBQXVCO1FBQzFELFFBQVEsRUFBRSxTQUFTO1FBQ25CLFNBQVMsRUFBRSxRQUFRO1FBQ25CLFNBQVMsRUFBRSxRQUFRO1FBQ25CLEtBQUssRUFBRSxZQUFZO1FBQ25CLE9BQU8sRUFBRSxTQUFTO0tBQ25CLENBQUM7SUFFRixpREFBaUQ7SUFDakQsWUFBb0IsRUFBc0I7UUFBdEIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7SUFDMUMsQ0FBQztJQUVELHFEQUFxRDtJQUVyRCx1QkFBdUI7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LEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQzNDLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNqRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFVBQVU7SUFDRiw0QkFBNEIsQ0FDbEMsTUFBeUMsRUFDekMsT0FBMkIsRUFDM0IsT0FBc0I7UUFFdEIsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUV4QyxJQUFJLE9BQU8sRUFBRSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQzdCLGFBQWEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNwRTtRQUVELElBQUksT0FBTyxFQUFFLG9CQUFvQixLQUFLLEtBQUssRUFBRTtZQUMzQyxhQUFhLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7U0FDNUQ7UUFFRCxJQUFJLE9BQU8sRUFBRSxXQUFXLEVBQUU7WUFDeEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QjtRQUVELE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO3dHQXBpQ1UsZUFBZTs0R0FBZixlQUFlLGNBREYsTUFBTTs7NEZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgQWJzdHJhY3RDb250cm9sLFxyXG4gIEFic3RyYWN0Q29udHJvbE9wdGlvbnMsXHJcbiAgVW50eXBlZEZvcm1BcnJheSxcclxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgVW50eXBlZEZvcm1Hcm91cCxcclxuICBWYWxpZGF0b3JGbixcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT0g57G75Z6L5a6a5LmJID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4vLyDlrZfmrrXplJnor6/mtojmga/nsbvlnovvvIjlrZfnrKbkuLLmiJblh73mlbDvvIlcclxuZXhwb3J0IHR5cGUgRmllbGRFcnJvck1lc3NhZ2UgPVxyXG4gIHwgc3RyaW5nXHJcbiAgfCAoKGNvbnRleHQ6IHsgY29udHJvbDogQWJzdHJhY3RDb250cm9sOyBjb250cm9sTmFtZTogc3RyaW5nIH0pID0+IHN0cmluZyk7XHJcblxyXG4vLyDlrZfmrrXplJnor6/mtojmga/pm4blkIhcclxuZXhwb3J0IHR5cGUgRmllbGRFcnJvck1lc3NhZ2VzID0gUmVjb3JkPHN0cmluZywgRmllbGRFcnJvck1lc3NhZ2U+O1xyXG5cclxuLy8g5a2X5q616YWN572uXHJcbmV4cG9ydCB0eXBlIEZpZWxkQ29uZmlnID0ge1xyXG4gIHZhbHVlOiBhbnk7XHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIHZhbGlkYXRvcnM/OiAoKSA9PiBWYWxpZGF0b3JGbltdO1xyXG4gIGVycm9yTWVzc2FnZXM/OiBGaWVsZEVycm9yTWVzc2FnZXM7XHJcbn07XHJcblxyXG4vLyDltYzlpZcgRm9ybUdyb3VwIOmFjee9rlxyXG5leHBvcnQgdHlwZSBGb3JtR3JvdXBDb25maWcgPSB7XHJcbiAgdHlwZTogXCJncm91cFwiO1xyXG4gIGZpZWxkczogRm9ybUNvbmZpZztcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgdmFsaWRhdG9ycz86ICgpID0+IFZhbGlkYXRvckZuW107XHJcbiAgZXJyb3JNZXNzYWdlcz86IEZpZWxkRXJyb3JNZXNzYWdlcztcclxufTtcclxuXHJcbi8vIEZvcm1BcnJheSDphY3nva5cclxuZXhwb3J0IHR5cGUgRm9ybUFycmF5Q29uZmlnID0ge1xyXG4gIHR5cGU6IFwiYXJyYXlcIjtcclxuICBpdGVtQ29uZmlnOiBGb3JtQ29uZmlnO1xyXG4gIGluaXRpYWxSb3dzPzogbnVtYmVyO1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICB2YWxpZGF0b3JzPzogKCkgPT4gVmFsaWRhdG9yRm5bXTtcclxufTtcclxuXHJcbi8vIOihqOWNleS/ruaUueexu+Wei1xyXG5leHBvcnQgdHlwZSBGb3JtTW9kaWZ5VHlwZSA9IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiO1xyXG5cclxuLy8g6KGo5Y2V6YWN572u77yI5pSv5oyB5pmu6YCa5a2X5q6144CB5bWM5aWXIEZvcm1Hcm91cCDlkowgRm9ybUFycmF577yJXHJcbmV4cG9ydCB0eXBlIEZvcm1Db25maWcgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZENvbmZpZyB8IEZvcm1Hcm91cENvbmZpZyB8IEZvcm1BcnJheUNvbmZpZz47XHJcblxyXG4vLyDnm5HlkKzpgInpoblcclxuZXhwb3J0IHR5cGUgV2F0Y2hPcHRpb25zID0ge1xyXG4gIGRlYm91bmNlPzogbnVtYmVyO1xyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkPzogYm9vbGVhbjtcclxuICBlbWl0SW5pdGlhbD86IGJvb2xlYW47XHJcbn07XHJcblxyXG4vLyDmibnph4/mt7vliqDlrZfmrrXphY3nva7pgInpoblcclxuZXhwb3J0IHR5cGUgQWRkRmllbGRzQ29uZmlnT3B0aW9ucyA9IHtcclxuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xyXG4gIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHk/OiBib29sZWFuO1xyXG4gIG9uRmllbGRBZGRlZD86IChmaWVsZE5hbWU6IHN0cmluZywgc3VjY2VzczogYm9vbGVhbiwgZXJyb3I/OiBzdHJpbmcpID0+IHZvaWQ7IC8vIOavj+S4quWtl+autea3u+WKoOeahOWbnuiwg1xyXG4gIHRhcmdldFBhdGg/OiBzdHJpbmc7IC8vIOebruagh+i3r+W+hO+8jOeUqOS6juWcqOW1jOWllyBGb3JtR3JvdXAg5YaF6YOo5re75Yqg5a2X5q6177yM5L6L5aaCOiBcImNhcmRCYXNlSW5mb1wiIOaIliBcInVzZXJJbmZvLmFkZHJlc3NJbmZvXCJcclxufTtcclxuXHJcbi8vIOaJuemHj+a3u+WKoOWtl+autemFjee9rue7k+aenFxyXG5leHBvcnQgdHlwZSBBZGRGaWVsZHNDb25maWdSZXN1bHQgPSB7XHJcbiAgc3VjY2VzczogYm9vbGVhbjtcclxuICBhZGRlZDogc3RyaW5nW107IC8vIOaIkOWKn+a3u+WKoOeahOWtl+auteWQjeWIl+ihqFxyXG4gIGZhaWxlZDogQXJyYXk8eyBmaWVsZE5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjsgLy8g5aSx6LSl55qE5a2X5q615Y+K6ZSZ6K+v5L+h5oGvXHJcbn07XHJcblxyXG4vLyDmibnph4/liKDpmaTlrZfmrrXphY3nva7pgInpoblcclxuZXhwb3J0IHR5cGUgUmVtb3ZlRmllbGRzQ29uZmlnT3B0aW9ucyA9IHtcclxuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xyXG4gIG9uRmllbGRSZW1vdmVkPzogKFxyXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXHJcbiAgICBzdWNjZXNzOiBib29sZWFuLFxyXG4gICAgZXJyb3I/OiBzdHJpbmdcclxuICApID0+IHZvaWQ7IC8vIOavj+S4quWtl+auteWIoOmZpOeahOWbnuiwg1xyXG59O1xyXG5cclxuLy8g5om56YeP5Yig6Zmk5a2X5q616YWN572u57uT5p6cXHJcbmV4cG9ydCB0eXBlIFJlbW92ZUZpZWxkc0NvbmZpZ1Jlc3VsdCA9IHtcclxuICBzdWNjZXNzOiBib29sZWFuO1xyXG4gIHJlbW92ZWQ6IHN0cmluZ1tdOyAvLyDmiJDlip/liKDpmaTnmoTlrZfmrrXlkI3liJfooahcclxuICBmYWlsZWQ6IEFycmF5PHsgZmllbGROYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47IC8vIOWksei0peeahOWtl+auteWPiumUmeivr+S/oeaBr1xyXG59O1xyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT0g5pyN5Yqh57G7ID09PT09PT09PT09PT09PT09PT09XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXHJcbmV4cG9ydCBjbGFzcyBBbnRkRm9ybVNlcnZpY2Uge1xyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOWFrOWFseWxnuaApyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGZvcm1TdG9yZTogUmVjb3JkPHN0cmluZywgVW50eXBlZEZvcm1Hcm91cD4gPSB7fTtcclxuICBmb3JtTW9kaWZ5VHlwZTogRm9ybU1vZGlmeVR5cGUgPSBcImNyZWF0ZVwiO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDnp4HmnInlsZ7mgKcgPT09PT09PT09PT09PT09PT09PT1cclxuICBwcml2YXRlIGZvcm1SZWdpc3RlclN0b3JlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xyXG4gIHByaXZhdGUgbGFiZWxXaWR0aDogc3RyaW5nID0gXCIxMjBweFwiO1xyXG4gIHByaXZhdGUgbGFiZWxBbGlnbjogc3RyaW5nID0gXCJyaWdodFwiO1xyXG4gIHByaXZhdGUgbGFiZWxPYnNlcnZlcnM6IFJlY29yZDxzdHJpbmcsIE11dGF0aW9uT2JzZXJ2ZXI+ID0ge307XHJcbiAgcHJpdmF0ZSBlcnJvck1lc3NhZ2VTdG9yZTogUmVjb3JkPFxyXG4gICAgc3RyaW5nLFxyXG4gICAgUmVjb3JkPHN0cmluZywgRmllbGRFcnJvck1lc3NhZ2VzPlxyXG4gID4gPSB7fTtcclxuICBwcml2YXRlIGFycmF5RWRpdGluZ1Jvd3M6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFNldDxudW1iZXI+Pj4gPSB7fTtcclxuICBwcml2YXRlIGFycmF5Um93U25hcHNob3RzOiBSZWNvcmQ8XHJcbiAgICBzdHJpbmcsXHJcbiAgICBSZWNvcmQ8c3RyaW5nLCBNYXA8bnVtYmVyLCBhbnk+PlxyXG4gID4gPSB7fTtcclxuICBwcml2YXRlIGFycmF5SXRlbUNvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIEZvcm1Db25maWc+PiA9IHt9O1xyXG4gIHByaXZhdGUgY2xhc3NQcmVmaXggPSBcImFudC1mb3JtLVwiO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEVycm9yTWVzc2FnZXM6IEZpZWxkRXJyb3JNZXNzYWdlcyA9IHtcclxuICAgIHJlcXVpcmVkOiBcIuivpeWtl+auteS4uuW/heWhq+mhuVwiLFxyXG4gICAgbWlubGVuZ3RoOiBcIui+k+WFpemVv+W6puS4jei2s1wiLFxyXG4gICAgbWF4bGVuZ3RoOiBcIui+k+WFpemVv+W6pui2hemZkFwiLFxyXG4gICAgZW1haWw6IFwi6K+36L6T5YWl5ZCI5rOV55qE6YKu566x5Zyw5Z2AXCIsXHJcbiAgICBwYXR0ZXJuOiBcIui+k+WFpeagvOW8j+S4jeato+ehrlwiLFxyXG4gIH07XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOaehOmAoOWHveaVsCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcikge1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0g6KGo5Y2V5Yib5bu65ZKM5Yid5aeL5YyWID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8vIOWIpOaWreaYr+WQpuS4uuW1jOWllyBGb3JtR3JvdXAg6YWN572uXHJcbiAgcHJpdmF0ZSBpc0Zvcm1Hcm91cENvbmZpZyhcclxuICAgIGNvbmZpZzogRmllbGRDb25maWcgfCBGb3JtR3JvdXBDb25maWcgfCBGb3JtQXJyYXlDb25maWdcclxuICApOiBjb25maWcgaXMgRm9ybUdyb3VwQ29uZmlnIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHR5cGVvZiBjb25maWcgPT09IFwib2JqZWN0XCIgJiZcclxuICAgICAgY29uZmlnICE9PSBudWxsICYmXHJcbiAgICAgIFwidHlwZVwiIGluIGNvbmZpZyAmJlxyXG4gICAgICBjb25maWcudHlwZSA9PT0gXCJncm91cFwiXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5pat5piv5ZCm5Li6IEZvcm1BcnJheSDphY3nva5cclxuICBwcml2YXRlIGlzRm9ybUFycmF5Q29uZmlnKFxyXG4gICAgY29uZmlnOiBGaWVsZENvbmZpZyB8IEZvcm1Hcm91cENvbmZpZyB8IEZvcm1BcnJheUNvbmZpZ1xyXG4gICk6IGNvbmZpZyBpcyBGb3JtQXJyYXlDb25maWcge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdHlwZW9mIGNvbmZpZyA9PT0gXCJvYmplY3RcIiAmJlxyXG4gICAgICBjb25maWcgIT09IG51bGwgJiZcclxuICAgICAgXCJ0eXBlXCIgaW4gY29uZmlnICYmXHJcbiAgICAgIGNvbmZpZy50eXBlID09PSBcImFycmF5XCJcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyDmoLnmja7ot6/lvoTojrflj5bltYzlpZfnmoQgRm9ybUFycmF5XHJcbiAgcHJpdmF0ZSBnZXROZXN0ZWRGb3JtQXJyYXkoXHJcbiAgICBmb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXAsXHJcbiAgICBwYXRoOiBzdHJpbmdcclxuICApOiBVbnR5cGVkRm9ybUFycmF5IHwgbnVsbCB7XHJcbiAgICBpZiAoIXBhdGggfHwgcGF0aC50cmltKCkgPT09IFwiXCIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChcIi5cIikuZmlsdGVyKChwKSA9PiBwLnRyaW0oKSAhPT0gXCJcIik7XHJcbiAgICBsZXQgY3VycmVudDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IGZvcm1Hcm91cDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhQYXJ0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoIWN1cnJlbnQpIHJldHVybiBudWxsO1xyXG4gICAgICBjb25zdCBwYXJ0ID0gcGF0aFBhcnRzW2ldO1xyXG4gICAgICBpZiAoaSA9PT0gcGF0aFBhcnRzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSAoY3VycmVudCBhcyBVbnR5cGVkRm9ybUdyb3VwKS5nZXRcclxuICAgICAgICAgID8gY3VycmVudC5nZXQocGFydClcclxuICAgICAgICAgIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSA/IHRhcmdldCA6IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwID8gY3VycmVudC5nZXQocGFydCkgOiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDmoLnmja4gaXRlbUNvbmZpZyDliJvlu7ogRm9ybUFycmF5IOeahOWNleihjCBGb3JtR3JvdXBcclxuICBwcml2YXRlIGNyZWF0ZUFycmF5Um93R3JvdXAoXHJcbiAgICBpdGVtQ29uZmlnOiBGb3JtQ29uZmlnLFxyXG4gICAgZGlzYWJsZWQ/OiBib29sZWFuXHJcbiAgKTogVW50eXBlZEZvcm1Hcm91cCB7XHJcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXN0ZWRGb3JtR3JvdXAoaXRlbUNvbmZpZywgZGlzYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgLy8g6YCS5b2S5Yib5bu65bWM5aWXIEZvcm1Hcm91cFxyXG4gIHByaXZhdGUgY3JlYXRlTmVzdGVkRm9ybUdyb3VwKFxyXG4gICAgZmllbGRzOiBGb3JtQ29uZmlnLFxyXG4gICAgZGlzYWJsZWQ/OiBib29sZWFuXHJcbiAgKTogVW50eXBlZEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBncm91cENvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG5cclxuICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2tleSwgZmllbGRDb25maWddKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRm9ybUdyb3VwQ29uZmlnKGZpZWxkQ29uZmlnKSkge1xyXG4gICAgICAgIC8vIOmAkuW9kuWIm+W7uuW1jOWll+eahCBGb3JtR3JvdXBcclxuICAgICAgICBncm91cENvbmZpZ1trZXldID0gdGhpcy5jcmVhdGVOZXN0ZWRGb3JtR3JvdXAoXHJcbiAgICAgICAgICBmaWVsZENvbmZpZy5maWVsZHMsXHJcbiAgICAgICAgICBmaWVsZENvbmZpZy5kaXNhYmxlZCA/PyBkaXNhYmxlZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0Zvcm1BcnJheUNvbmZpZyhmaWVsZENvbmZpZykpIHtcclxuICAgICAgICAvLyDliJvlu7ogRm9ybUFycmF5XHJcbiAgICAgICAgY29uc3Qgcm93czogVW50eXBlZEZvcm1Hcm91cFtdID0gW107XHJcbiAgICAgICAgY29uc3Qgcm93Q291bnQgPSBmaWVsZENvbmZpZy5pbml0aWFsUm93cyA/PyAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICAgICAgcm93cy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFycmF5Um93R3JvdXAoXHJcbiAgICAgICAgICAgICAgZmllbGRDb25maWcuaXRlbUNvbmZpZyxcclxuICAgICAgICAgICAgICBmaWVsZENvbmZpZy5kaXNhYmxlZCA/PyBkaXNhYmxlZFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBncm91cENvbmZpZ1trZXldID0gdGhpcy5mYi5hcnJheShyb3dzLCBmaWVsZENvbmZpZy52YWxpZGF0b3JzPy4oKSA/PyBbXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8g5Yib5bu65pmu6YCaIEZvcm1Db250cm9sXHJcbiAgICAgICAgZ3JvdXBDb25maWdba2V5XSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWU6IGZpZWxkQ29uZmlnLnZhbHVlLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogZmllbGRDb25maWcuZGlzYWJsZWQgPz8gZGlzYWJsZWQgPz8gZmFsc2UsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZmllbGRDb25maWcudmFsaWRhdG9ycz8uKCkgPz8gW10sXHJcbiAgICAgICAgXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoZ3JvdXBDb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yid5aeL5YyW6KGo5Y2VXHJcbiAgY3JlYXRlRm9ybUdyb3VwKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgY29uZmlnOiBGb3JtQ29uZmlnLFxyXG4gICAgb3B0aW9ucz86IHsgbGFiZWxXaWR0aD86IHN0cmluZzsgbGFiZWxBbGlnbj86IHN0cmluZyB9XHJcbiAgKTogVW50eXBlZEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBncm91cENvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXSA9IHt9O1xyXG5cclxuICAgIE9iamVjdC5lbnRyaWVzKGNvbmZpZykuZm9yRWFjaCgoW2tleSwgZmllbGRDb25maWddKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmlzRm9ybUdyb3VwQ29uZmlnKGZpZWxkQ29uZmlnKSkge1xyXG4gICAgICAgIC8vIOWkhOeQhuW1jOWllyBGb3JtR3JvdXBcclxuICAgICAgICBjb25zdCBuZXN0ZWRHcm91cCA9IHRoaXMuY3JlYXRlTmVzdGVkRm9ybUdyb3VwKFxyXG4gICAgICAgICAgZmllbGRDb25maWcuZmllbGRzLFxyXG4gICAgICAgICAgZmllbGRDb25maWcuZGlzYWJsZWRcclxuICAgICAgICApO1xyXG4gICAgICAgIGdyb3VwQ29uZmlnW2tleV0gPSBuZXN0ZWRHcm91cDtcclxuXHJcbiAgICAgICAgLy8g5a2Y5YKo5bWM5aWXIEZvcm1Hcm91cCDnmoTplJnor6/mtojmga/vvIjlpoLmnpzpnIDopoHvvIlcclxuICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXVtrZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0Zvcm1BcnJheUNvbmZpZyhmaWVsZENvbmZpZykpIHtcclxuICAgICAgICAvLyDlpITnkIYgRm9ybUFycmF5XHJcbiAgICAgICAgY29uc3Qgcm93czogVW50eXBlZEZvcm1Hcm91cFtdID0gW107XHJcbiAgICAgICAgY29uc3Qgcm93Q291bnQgPSBmaWVsZENvbmZpZy5pbml0aWFsUm93cyA/PyAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICAgICAgcm93cy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFycmF5Um93R3JvdXAoZmllbGRDb25maWcuaXRlbUNvbmZpZywgZmllbGRDb25maWcuZGlzYWJsZWQpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBncm91cENvbmZpZ1trZXldID0gdGhpcy5mYi5hcnJheShyb3dzLCBmaWVsZENvbmZpZy52YWxpZGF0b3JzPy4oKSA/PyBbXSk7XHJcbiAgICAgICAgdGhpcy5fZW5zdXJlQXJyYXlJdGVtQ29uZmlnKG5hbWUsIGtleSwgZmllbGRDb25maWcuaXRlbUNvbmZpZyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8g5aSE55CG5pmu6YCa5a2X5q61XHJcbiAgICAgICAgZ3JvdXBDb25maWdba2V5XSA9IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWU6IGZpZWxkQ29uZmlnLnZhbHVlLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogZmllbGRDb25maWcuZGlzYWJsZWQgPz8gZmFsc2UsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZmllbGRDb25maWcudmFsaWRhdG9ycz8uKCkgPz8gW10sXHJcbiAgICAgICAgXTtcclxuICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXVtrZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChvcHRpb25zPy5sYWJlbFdpZHRoKSB7XHJcbiAgICAgIHRoaXMubGFiZWxXaWR0aCA9IG9wdGlvbnMubGFiZWxXaWR0aDtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zPy5sYWJlbEFsaWduKSB7XHJcbiAgICAgIHRoaXMubGFiZWxBbGlnbiA9IG9wdGlvbnMubGFiZWxBbGlnbjtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybVN0b3JlW25hbWVdID0gdGhpcy5mYi5ncm91cChncm91cENvbmZpZyk7XHJcbiAgICB0aGlzLmZvcm1SZWdpc3RlclN0b3JlW25hbWVdID0gdHJ1ZTtcclxuICAgIHRoaXMuc2V0Q1NTVmFyaWFibGVzVG9UYXJnZXQobmFtZSk7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDooajljZXmk43kvZwgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g6YeN572u6KGo5Y2VXHJcbiAgcmVzZXRGb3JtR3JvdXAobmFtZTogc3RyaW5nLCB2YWx1ZT86IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtU3RvcmVbbmFtZV0/LnJlc2V0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOa1i+ihqOWNleaYr+WQpuWujOaIkOazqOWGjFxyXG4gIGlzRm9ybVJlZ2lzdGVyZWQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtUmVnaXN0ZXJTdG9yZVtuYW1lXSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOmUgOavgeWvueW6lOeahOihqOWNlVxyXG4gIGRlc3RvcnkobmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XHJcbiAgICAgIC8vIOa4heeQhumUmeivr+a2iOaBr+WtmOWCqFxyXG4gICAgICBpZiAodGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtuYW1lXSkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmVycm9yTWVzc2FnZVN0b3JlW25hbWVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDmuIXnkIbooajljZXms6jlhozmoIforrBcclxuICAgICAgaWYgKHRoaXMuZm9ybVJlZ2lzdGVyU3RvcmVbbmFtZV0pIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5mb3JtUmVnaXN0ZXJTdG9yZVtuYW1lXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8g5riF55CG6KGo5Y2V57uE77yIQW5ndWxhciDkvJroh6rliqjlpITnkIYgRm9ybUdyb3VwIOeahOa4heeQhu+8iVxyXG4gICAgICBpZiAodGhpcy5mb3JtU3RvcmVbbmFtZV0pIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOa4heeQhiBGb3JtQXJyYXkg57yW6L6R54q25oCBXHJcbiAgICAgIGlmICh0aGlzLmFycmF5RWRpdGluZ1Jvd3NbbmFtZV0pIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5hcnJheUVkaXRpbmdSb3dzW25hbWVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDmuIXnkIYgRm9ybUFycmF5IOihjOW/q+eFp1xyXG4gICAgICBpZiAodGhpcy5hcnJheVJvd1NuYXBzaG90c1tuYW1lXSkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmFycmF5Um93U25hcHNob3RzW25hbWVdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDmuIXnkIYgRm9ybUFycmF5IGl0ZW1Db25maWcg57yT5a2YXHJcbiAgICAgIGlmICh0aGlzLmFycmF5SXRlbUNvbmZpZ3NbbmFtZV0pIHtcclxuICAgICAgICBkZWxldGUgdGhpcy5hcnJheUl0ZW1Db25maWdzW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOagueaNrui3r+W+hOiOt+WPluW1jOWll+eahCBGb3JtR3JvdXBcclxuICBwcml2YXRlIGdldE5lc3RlZEZvcm1Hcm91cChcclxuICAgIGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCxcclxuICAgIHBhdGg6IHN0cmluZ1xyXG4gICk6IFVudHlwZWRGb3JtR3JvdXAgfCBudWxsIHtcclxuICAgIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gZm9ybUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpLmZpbHRlcigocCkgPT4gcC50cmltKCkgIT09IFwiXCIpO1xyXG4gICAgbGV0IGN1cnJlbnRHcm91cDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IGZvcm1Hcm91cDtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aFBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudEdyb3VwIHx8ICEoY3VycmVudEdyb3VwIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50R3JvdXAgPSBjdXJyZW50R3JvdXAuZ2V0KHBhcnQpO1xyXG4gICAgICBpZiAoIWN1cnJlbnRHcm91cCB8fCAhKGN1cnJlbnRHcm91cCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3VycmVudEdyb3VwIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCA/IGN1cnJlbnRHcm91cCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDmibnph4/mt7vliqDlrZfmrrXphY3nva5cclxuICBhZGRGaWVsZHNDb25maWcoXHJcbiAgICBmb3JtTmFtZTogc3RyaW5nLFxyXG4gICAgZmllbGRzQ29uZmlnOiBGb3JtQ29uZmlnLFxyXG4gICAgb3B0aW9ucz86IEFkZEZpZWxkc0NvbmZpZ09wdGlvbnNcclxuICApOiBBZGRGaWVsZHNDb25maWdSZXN1bHQge1xyXG4gICAgY29uc3QgcmVzdWx0OiBBZGRGaWVsZHNDb25maWdSZXN1bHQgPSB7XHJcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIGFkZGVkOiBbXSxcclxuICAgICAgZmFpbGVkOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gMS4g6aqM6K+B6KGo5Y2V5piv5ZCm5a2Y5ZyoXHJcbiAgICBjb25zdCByb290Rm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbZm9ybU5hbWVdO1xyXG4gICAgaWYgKCFyb290Rm9ybUdyb3VwKSB7XHJcbiAgICAgIC8vIOWmguaenOihqOWNleS4jeWtmOWcqO+8jOaJgOacieWtl+autemDveWksei0pVxyXG4gICAgICBPYmplY3Qua2V5cyhmaWVsZHNDb25maWcpLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVycm9yID0gYEZvcm0gXCIke2Zvcm1OYW1lfVwiIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4g6I635Y+W55uu5qCHIEZvcm1Hcm91cO+8iOaUr+aMgeW1jOWll+i3r+W+hO+8iVxyXG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IG9wdGlvbnM/LnRhcmdldFBhdGg7XHJcbiAgICBjb25zdCB0YXJnZXRGb3JtR3JvdXAgPSB0YXJnZXRQYXRoXHJcbiAgICAgID8gdGhpcy5nZXROZXN0ZWRGb3JtR3JvdXAocm9vdEZvcm1Hcm91cCwgdGFyZ2V0UGF0aClcclxuICAgICAgOiByb290Rm9ybUdyb3VwO1xyXG5cclxuICAgIGlmICghdGFyZ2V0Rm9ybUdyb3VwKSB7XHJcbiAgICAgIC8vIOWmguaenOebruaghyBGb3JtR3JvdXAg5LiN5a2Y5Zyo77yM5omA5pyJ5a2X5q616YO95aSx6LSlXHJcbiAgICAgIE9iamVjdC5rZXlzKGZpZWxkc0NvbmZpZykuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0YXJnZXRQYXRoXHJcbiAgICAgICAgICA/IGBUYXJnZXQgRm9ybUdyb3VwIGF0IHBhdGggXCIke3RhcmdldFBhdGh9XCIgbm90IGZvdW5kYFxyXG4gICAgICAgICAgOiBgRm9ybUdyb3VwIG5vdCBmb3VuZGA7XHJcbiAgICAgICAgcmVzdWx0LmZhaWxlZC5wdXNoKHtcclxuICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMy4g5Yid5aeL5YyWIGVycm9yTWVzc2FnZVN0b3Jl77yI5aaC5p6c5LiN5a2Y5Zyo77yJXHJcbiAgICBpZiAoIXRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlU3RvcmVbZm9ybU5hbWVdID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4g5om56YeP5p6E5bu65o6n5Lu26YWN572uXHJcbiAgICBjb25zdCBjb250cm9sc1RvQWRkOiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdENvbnRyb2w+ID0ge307XHJcbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzVG9BZGQ6IFJlY29yZDxzdHJpbmcsIEZpZWxkRXJyb3JNZXNzYWdlcz4gPSB7fTtcclxuXHJcbiAgICAvLyA1LiDpgY3ljobmiYDmnInlrZfmrrXphY3nva7vvIzov5vooYzpqozor4HlkozmnoTlu7pcclxuICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkc0NvbmZpZykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRDb25maWddKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gNS4xIOajgOafpeWtl+auteaYr+WQpuW3suWtmOWcqFxyXG4gICAgICAgIGlmICh0YXJnZXRGb3JtR3JvdXAuZ2V0KGZpZWxkTmFtZSkpIHtcclxuICAgICAgICAgIGNvbnN0IGVycm9yID0gYEZpZWxkIFwiJHtmaWVsZE5hbWV9XCIgYWxyZWFkeSBleGlzdHMke1xyXG4gICAgICAgICAgICB0YXJnZXRQYXRoID8gYCBpbiBcIiR7dGFyZ2V0UGF0aH1cImAgOiBcIlwiXHJcbiAgICAgICAgICB9YDtcclxuICAgICAgICAgIHJlc3VsdC5mYWlsZWQucHVzaCh7XHJcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIDUuMiDliJvlu7rmjqfku7ZcclxuICAgICAgICBsZXQgY29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Zvcm1Hcm91cENvbmZpZyhmaWVsZENvbmZpZykpIHtcclxuICAgICAgICAgIC8vIOWIm+W7uuW1jOWllyBGb3JtR3JvdXBcclxuICAgICAgICAgIGNvbnRyb2wgPSB0aGlzLmNyZWF0ZU5lc3RlZEZvcm1Hcm91cChcclxuICAgICAgICAgICAgZmllbGRDb25maWcuZmllbGRzLFxyXG4gICAgICAgICAgICBmaWVsZENvbmZpZy5kaXNhYmxlZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIC8vIOWtmOWCqOW1jOWllyBGb3JtR3JvdXAg55qE6ZSZ6K+v5raI5oGv77yI5aaC5p6c6ZyA6KaB77yJXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VLZXkgPSB0YXJnZXRQYXRoXHJcbiAgICAgICAgICAgICAgPyBgJHt0YXJnZXRQYXRofS4ke2ZpZWxkTmFtZX1gXHJcbiAgICAgICAgICAgICAgOiBmaWVsZE5hbWU7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZXNUb0FkZFtlcnJvck1lc3NhZ2VLZXldID0gZmllbGRDb25maWcuZXJyb3JNZXNzYWdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNGb3JtQXJyYXlDb25maWcoZmllbGRDb25maWcpKSB7XHJcbiAgICAgICAgICAvLyDliJvlu7ogRm9ybUFycmF5XHJcbiAgICAgICAgICBjb25zdCByb3dzOiBVbnR5cGVkRm9ybUdyb3VwW10gPSBbXTtcclxuICAgICAgICAgIGNvbnN0IHJvd0NvdW50ID0gZmllbGRDb25maWcuaW5pdGlhbFJvd3MgPz8gMDtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByb3dzLnB1c2goXHJcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVBcnJheVJvd0dyb3VwKFxyXG4gICAgICAgICAgICAgICAgZmllbGRDb25maWcuaXRlbUNvbmZpZyxcclxuICAgICAgICAgICAgICAgIGZpZWxkQ29uZmlnLmRpc2FibGVkXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29udHJvbCA9IHRoaXMuZmIuYXJyYXkocm93cywgZmllbGRDb25maWcudmFsaWRhdG9ycz8uKCkgPz8gW10pO1xyXG4gICAgICAgICAgdGhpcy5fZW5zdXJlQXJyYXlJdGVtQ29uZmlnKGZvcm1OYW1lLCBmaWVsZE5hbWUsIGZpZWxkQ29uZmlnLml0ZW1Db25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDliJvlu7rmma7pgJogRm9ybUNvbnRyb2xcclxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xPcHRpb25zOiBBYnN0cmFjdENvbnRyb2xPcHRpb25zID0ge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzOiBmaWVsZENvbmZpZy52YWxpZGF0b3JzPy4oKSA/PyBbXSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBjb250cm9sID0gdGhpcy5mYi5jb250cm9sKGZpZWxkQ29uZmlnLnZhbHVlLCBjb250cm9sT3B0aW9ucyk7XHJcbiAgICAgICAgICAvLyDorr7nva4gZGlzYWJsZWQg54q25oCBXHJcbiAgICAgICAgICBpZiAoZmllbGRDb25maWcuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgY29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyDlrZjlgqjplJnor6/mtojmga9cclxuICAgICAgICAgIGlmIChmaWVsZENvbmZpZy5lcnJvck1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZUtleSA9IHRhcmdldFBhdGhcclxuICAgICAgICAgICAgICA/IGAke3RhcmdldFBhdGh9LiR7ZmllbGROYW1lfWBcclxuICAgICAgICAgICAgICA6IGZpZWxkTmFtZTtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlc1RvQWRkW2Vycm9yTWVzc2FnZUtleV0gPSBmaWVsZENvbmZpZy5lcnJvck1lc3NhZ2VzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29udHJvbHNUb0FkZFtmaWVsZE5hbWVdID0gY29udHJvbDtcclxuXHJcbiAgICAgICAgcmVzdWx0LmFkZGVkLnB1c2goZmllbGROYW1lKTtcclxuICAgICAgICBvcHRpb25zPy5vbkZpZWxkQWRkZWQ/LihmaWVsZE5hbWUsIHRydWUpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cclxuICAgICAgICAgIGVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy50b1N0cmluZygpIHx8IFwiVW5rbm93biBlcnJvclwiO1xyXG4gICAgICAgIHJlc3VsdC5mYWlsZWQucHVzaCh7XHJcbiAgICAgICAgICBmaWVsZE5hbWUsXHJcbiAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9wdGlvbnM/Lm9uRmllbGRBZGRlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIDYuIOaJuemHj+a3u+WKoOWIsOebruaghyBGb3JtR3JvdXBcclxuICAgIGlmIChPYmplY3Qua2V5cyhjb250cm9sc1RvQWRkKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIE9iamVjdC5lbnRyaWVzKGNvbnRyb2xzVG9BZGQpLmZvckVhY2goKFtmaWVsZE5hbWUsIGNvbnRyb2xdKSA9PiB7XHJcbiAgICAgICAgdGFyZ2V0Rm9ybUdyb3VwLmFkZENvbnRyb2woZmllbGROYW1lLCBjb250cm9sKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyA3LiDmibnph4/lrZjlgqjplJnor6/mtojmga9cclxuICAgICAgT2JqZWN0LmVudHJpZXMoZXJyb3JNZXNzYWdlc1RvQWRkKS5mb3JFYWNoKChba2V5LCBtZXNzYWdlc10pID0+IHtcclxuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZVN0b3JlW2Zvcm1OYW1lXVtrZXldID0gbWVzc2FnZXM7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gOC4g5pu05paw6KGo5Y2V6aqM6K+B54q25oCBXHJcbiAgICAgIGlmIChvcHRpb25zPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KSB7XHJcbiAgICAgICAgdGFyZ2V0Rm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe1xyXG4gICAgICAgICAgZW1pdEV2ZW50OiBvcHRpb25zPy5lbWl0RXZlbnQgPz8gdHJ1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIDkuIOWIpOaWreaVtOS9k+aYr+WQpuaIkOWKn1xyXG4gICAgcmVzdWx0LnN1Y2Nlc3MgPSByZXN1bHQuZmFpbGVkLmxlbmd0aCA9PT0gMDtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8g5om56YeP5Yig6Zmk5a2X5q616YWN572uXHJcbiAgcmVtb3ZlRmllbGRzQ29uZmlnKFxyXG4gICAgZm9ybU5hbWU6IHN0cmluZyxcclxuICAgIGZpZWxkTmFtZXM6IHN0cmluZ1tdLFxyXG4gICAgb3B0aW9ucz86IFJlbW92ZUZpZWxkc0NvbmZpZ09wdGlvbnNcclxuICApOiBSZW1vdmVGaWVsZHNDb25maWdSZXN1bHQge1xyXG4gICAgY29uc3QgcmVzdWx0OiBSZW1vdmVGaWVsZHNDb25maWdSZXN1bHQgPSB7XHJcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIHJlbW92ZWQ6IFtdLFxyXG4gICAgICBmYWlsZWQ6IFtdLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyAxLiDpqozor4HooajljZXmmK/lkKblrZjlnKhcclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybVN0b3JlW2Zvcm1OYW1lXTtcclxuICAgIGlmICghZm9ybUdyb3VwKSB7XHJcbiAgICAgIGZpZWxkTmFtZXMuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgRm9ybSBcIiR7Zm9ybU5hbWV9XCIgbm90IGZvdW5kYDtcclxuICAgICAgICByZXN1bHQuZmFpbGVkLnB1c2goe1xyXG4gICAgICAgICAgZmllbGROYW1lLFxyXG4gICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgb3B0aW9ucz8ub25GaWVsZFJlbW92ZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvcik7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIOaJuemHj+aUtumbhumcgOimgea4heeQhueahOS/oeaBr1xyXG4gICAgY29uc3QgZmllbGRzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBlcnJvck1lc3NhZ2VLZXlzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgLy8gMy4g6aqM6K+B5q+P5Liq5a2X5q615bm25pS26ZuG5L+h5oGvXHJcbiAgICBmaWVsZE5hbWVzLmZvckVhY2goKGZpZWxkTmFtZSkgPT4ge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZE5hbWUpO1xyXG5cclxuICAgICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgRmllbGQgXCIke2ZpZWxkTmFtZX1cIiBub3QgZm91bmRgO1xyXG4gICAgICAgIHJlc3VsdC5mYWlsZWQucHVzaCh7XHJcbiAgICAgICAgICBmaWVsZE5hbWUsXHJcbiAgICAgICAgICBlcnJvcixcclxuICAgICAgICB9KTtcclxuICAgICAgICBvcHRpb25zPy5vbkZpZWxkUmVtb3ZlZD8uKGZpZWxkTmFtZSwgZmFsc2UsIGVycm9yKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOaUtumbhumUmeivr+a2iOaBr+mUrlxyXG4gICAgICBlcnJvck1lc3NhZ2VLZXlzVG9SZW1vdmUucHVzaChmaWVsZE5hbWUpO1xyXG4gICAgICBmaWVsZHNUb1JlbW92ZS5wdXNoKGZpZWxkTmFtZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyA0LiDmibnph4/miafooYzliKDpmaTmk43kvZxcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIDQuMSDku44gRm9ybUdyb3VwIOS4reenu+mZpOaOp+S7tlxyXG4gICAgICBmaWVsZHNUb1JlbW92ZS5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcclxuICAgICAgICBmb3JtR3JvdXAucmVtb3ZlQ29udHJvbChmaWVsZE5hbWUpO1xyXG4gICAgICAgIHJlc3VsdC5yZW1vdmVkLnB1c2goZmllbGROYW1lKTtcclxuICAgICAgICBvcHRpb25zPy5vbkZpZWxkUmVtb3ZlZD8uKGZpZWxkTmFtZSwgdHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gNC4yIOaJuemHj+WIoOmZpOmUmeivr+a2iOaBr1xyXG4gICAgICBpZiAodGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtmb3JtTmFtZV0pIHtcclxuICAgICAgICBlcnJvck1lc3NhZ2VLZXlzVG9SZW1vdmUuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICBkZWxldGUgdGhpcy5lcnJvck1lc3NhZ2VTdG9yZVtmb3JtTmFtZV1ba2V5XTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAvLyDlpoLmnpzmibnph4/liKDpmaTov4fnqIvkuK3lh7rplJnvvIzmoIforrDkuLrlpLHotKVcclxuICAgICAgZmllbGRzVG9SZW1vdmUuZm9yRWFjaCgoZmllbGROYW1lKSA9PiB7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQucmVtb3ZlZC5pbmNsdWRlcyhmaWVsZE5hbWUpKSB7XHJcbiAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxyXG4gICAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8udG9TdHJpbmcoKSB8fCBcIkZhaWxlZCB0byByZW1vdmUgZmllbGRcIjtcclxuICAgICAgICAgIHJlc3VsdC5mYWlsZWQucHVzaCh7XHJcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcclxuICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgb3B0aW9ucz8ub25GaWVsZFJlbW92ZWQ/LihmaWVsZE5hbWUsIGZhbHNlLCBlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNS4g5Yik5pat5pW05L2T5piv5ZCm5oiQ5YqfXHJcbiAgICByZXN1bHQuc3VjY2VzcyA9IHJlc3VsdC5mYWlsZWQubGVuZ3RoID09PSAwO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyDlsYDpg6jotYvlgLzvvIjmlK/mjIEgRm9ybUFycmF5IOWbnuWhq++8muiHquWKqOmHjeW7uuihjOe7k+aehO+8iVxyXG4gIHBhdGNoRm9ybVZhbHVlcyhcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIHZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PixcclxuICAgIG9wdGlvbnM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfVxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIHBhdGNoRm9ybVZhbHVlczogZm9ybSBcIiR7bmFtZX1cIiBub3QgZm91bmQuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYXJyYXlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueVtdPiA9IHt9O1xyXG4gICAgY29uc3QgcGxhaW5WYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuXHJcbiAgICAvLyDljLrliIYgRm9ybUFycmF5IOWtl+auteWSjOaZrumAmuWtl+autVxyXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XHJcbiAgICAgIGNvbnN0IGN0cmwgPSBmb3JtR3JvdXAuZ2V0KGtleSk7XHJcbiAgICAgIGlmIChjdHJsIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSAmJiBBcnJheS5pc0FycmF5KHZhbCkpIHtcclxuICAgICAgICBhcnJheVZhbHVlc1trZXldID0gdmFsO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBsYWluVmFsdWVzW2tleV0gPSB2YWw7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOWkhOeQhiBGb3JtQXJyYXkg5Zue5aGr77ya5riF56m65pen6KGM77yM5oyJIGl0ZW1Db25maWcg6YeN5bu6XHJcbiAgICBPYmplY3QuZW50cmllcyhhcnJheVZhbHVlcykuZm9yRWFjaCgoW2tleSwgcm93c10pID0+IHtcclxuICAgICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybUdyb3VwLmdldChrZXkpIGFzIFVudHlwZWRGb3JtQXJyYXk7XHJcbiAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSB0aGlzLmFycmF5SXRlbUNvbmZpZ3NbbmFtZV0/LltrZXldO1xyXG5cclxuICAgICAgLy8g5riF56m6546w5pyJ6KGMXHJcbiAgICAgIHdoaWxlIChmb3JtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGZvcm1BcnJheS5yZW1vdmVBdCgwLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOa4heeQhuivpeaVsOe7hOeahOe8lui+keeKtuaAgeWSjOW/q+eFp1xyXG4gICAgICB0aGlzLl9lbnN1cmVBcnJheVN0YXRlKG5hbWUsIGtleSk7XHJcbiAgICAgIHRoaXMuYXJyYXlFZGl0aW5nUm93c1tuYW1lXVtrZXldID0gbmV3IFNldCgpO1xyXG4gICAgICB0aGlzLmFycmF5Um93U25hcHNob3RzW25hbWVdW2tleV0gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgICAvLyDmjIkgaXRlbUNvbmZpZyDliJvlu7rooYzlubblm57loatcclxuICAgICAgcm93cy5mb3JFYWNoKChyb3dEYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV3Um93ID0gaXRlbUNvbmZpZ1xyXG4gICAgICAgICAgPyB0aGlzLmNyZWF0ZUFycmF5Um93R3JvdXAoaXRlbUNvbmZpZylcclxuICAgICAgICAgIDogdGhpcy5mYi5ncm91cCh7fSk7XHJcbiAgICAgICAgaWYgKGl0ZW1Db25maWcpIHtcclxuICAgICAgICAgIG5ld1Jvdy5wYXRjaFZhbHVlKHJvd0RhdGEsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9ybUFycmF5LnB1c2gobmV3Um93LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8g57uf5LiA6Kem5Y+R5LiA5qyhIHZhbHVlQ2hhbmdlc1xyXG4gICAgICBpZiAob3B0aW9ucz8uZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xyXG4gICAgICAgIGZvcm1BcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDlpITnkIbmma7pgJrlrZfmrrXvvIjlkKvltYzlpZcgRm9ybUdyb3Vw77yJXHJcbiAgICBpZiAoT2JqZWN0LmtleXMocGxhaW5WYWx1ZXMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9ybUdyb3VwLnBhdGNoVmFsdWUocGxhaW5WYWx1ZXMsIHtcclxuICAgICAgICBlbWl0RXZlbnQ6IG9wdGlvbnM/LmVtaXRFdmVudCA/PyB0cnVlLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOihqOWNleagoemqjO+8iOiHquWKqOi/h+a7pOWGhemDqOWtl+aute+8iVxyXG4gIHZhbGlkYXRlRm9ybShcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIG9wdGlvbnM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW47IG9ubHlTZWxmPzogYm9vbGVhbiB9XHJcbiAgKTogYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgaWYgKHRoaXMuZm9ybVN0b3JlW25hbWVdLnZhbGlkKSB7XHJcbiAgICAgIGNvbnN0IHJhd1ZhbHVlID0gdGhpcy5mb3JtU3RvcmVbbmFtZV0uZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZXhjbHVkZUludGVybmFsRmllbGRzKHJhd1ZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOmAkuW9kuagoemqjOaJgOacieaOp+S7tlxyXG4gICAgICB0aGlzLm1hcmtBbGxDb250cm9sc0FzRGlydHkoXHJcbiAgICAgICAgdGhpcy5mb3JtU3RvcmVbbmFtZV0sXHJcbiAgICAgICAgb3B0aW9ucz8uZW1pdEV2ZW50ID8/IHRydWUsXHJcbiAgICAgICAgb3B0aW9ucz8ub25seVNlbGYgPz8gZmFsc2VcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6YCS5b2S5qCH6K6w5omA5pyJ5peg5pWI5o6n5Lu25Li6IGRpcnR5XHJcbiAgcHJpdmF0ZSBtYXJrQWxsQ29udHJvbHNBc0RpcnR5KFxyXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sLFxyXG4gICAgZW1pdEV2ZW50OiBib29sZWFuLFxyXG4gICAgb25seVNlbGY6IGJvb2xlYW5cclxuICApOiB2b2lkIHtcclxuICAgIGlmIChjb250cm9sLmludmFsaWQpIHtcclxuICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe1xyXG4gICAgICAgIGVtaXRFdmVudCxcclxuICAgICAgICBvbmx5U2VsZixcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5pivIEZvcm1Hcm91cO+8jOmAkuW9kuWkhOeQhuaJgOacieWtkOaOp+S7tlxyXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwKSB7XHJcbiAgICAgIE9iamVjdC52YWx1ZXMoY29udHJvbC5jb250cm9scykuZm9yRWFjaCgoY2hpbGRDb250cm9sKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tYXJrQWxsQ29udHJvbHNBc0RpcnR5KGNoaWxkQ29udHJvbCwgZW1pdEV2ZW50LCBvbmx5U2VsZik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOaYryBGb3JtQXJyYXnvvIzpgJLlvZLlpITnkIbmiYDmnInooYxcclxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xyXG4gICAgICBjb250cm9sLmNvbnRyb2xzLmZvckVhY2goKGNoaWxkQ29udHJvbCkgPT4ge1xyXG4gICAgICAgIHRoaXMubWFya0FsbENvbnRyb2xzQXNEaXJ0eShjaGlsZENvbnRyb2wsIGVtaXRFdmVudCwgb25seVNlbGYpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOmUmeivr+a2iOaBr+ebuOWFsyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDojrflj5blrZfmrrXpppbmnaHplJnor6/mj5DnpLpcclxuICBnZXRGaWVsZEVycm9yTWVzc2FnZShuYW1lOiBzdHJpbmcsIGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIGdldEZpZWxkRXJyb3JNZXNzYWdlOiBmb3JtIFwiJHtuYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29udHJvbCA9IGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWUpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gZ2V0RmllbGRFcnJvck1lc3NhZ2U6IGNvbnRyb2wgXCIke2NvbnRyb2xOYW1lfVwiIG5vdCBmb3VuZCBpbiBmb3JtIFwiJHtuYW1lfVwiLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoIWNvbnRyb2wuZXJyb3JzKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOS7jiBlcnJvck1lc3NhZ2VTdG9yZSDojrflj5bplJnor6/mtojmga/phY3nva5cclxuICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSB0aGlzLmVycm9yTWVzc2FnZVN0b3JlW25hbWVdPy5bY29udHJvbE5hbWVdO1xyXG4gICAgY29uc3QgbWVyZ2VkTWVzc2FnZXMgPSB7XHJcbiAgICAgIC4uLnRoaXMuZGVmYXVsdEVycm9yTWVzc2FnZXMsXHJcbiAgICAgIC4uLihlcnJvck1lc3NhZ2VzID8/IHt9KSxcclxuICAgIH07XHJcblxyXG4gICAgZm9yIChjb25zdCBlcnJvcktleSBvZiBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycykpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IG1lcmdlZE1lc3NhZ2VzW2Vycm9yS2V5XTtcclxuICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAvLyDkuI3lho3mlK/mjIHlh73mlbDlvaLlvI/vvIzlj6rov5Tlm57lrZfnrKbkuLJcclxuICAgICAgICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogXCJcIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSDnm5HlkKznm7jlhbMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g55uR5ZCs6KGo5Y2V5omA5pyJ5a2X5q615Y+Y5pu0XHJcbiAgd2F0Y2hGb3JtQ2hhbmdlczxUID0gYW55PihcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGhhbmRsZXI6ICh2YWx1ZTogVCkgPT4gdm9pZCxcclxuICAgIG9wdGlvbnM/OiBXYXRjaE9wdGlvbnNcclxuICApOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbbmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIHdhdGNoRm9ybUNoYW5nZXM6IGZvcm0gXCIke25hbWV9XCIgbm90IGZvdW5kLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zZXR1cFZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKGZvcm1Hcm91cCwgaGFuZGxlciwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvLyDnm5HlkKzmjIflrprlrZfmrrXlj5jmm7RcclxuICB3YXRjaEZpZWxkQ2hhbmdlczxUID0gYW55PihcclxuICAgIG5hbWU6IHN0cmluZyxcclxuICAgIGNvbnRyb2xOYW1lOiBzdHJpbmcsXHJcbiAgICBoYW5kbGVyOiAodmFsdWU6IFQpID0+IHZvaWQsXHJcbiAgICBvcHRpb25zPzogV2F0Y2hPcHRpb25zXHJcbiAgKTogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybVN0b3JlW25hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSB3YXRjaEZpZWxkQ2hhbmdlczogZm9ybSBcIiR7bmFtZX1cIiBub3QgZm91bmQuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIHdhdGNoRmllbGRDaGFuZ2VzOiBjb250cm9sIFwiJHtjb250cm9sTmFtZX1cIiBub3QgZm91bmQgaW4gZm9ybSBcIiR7bmFtZX1cIi5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2V0dXBWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbihjb250cm9sLCBoYW5kbGVyLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEZvcm1BcnJheSDmk43kvZwgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a6Lev5b6E55qEIEZvcm1BcnJheSDlrp7kvovvvIjkvpvmqKHmnb8gbmdGb3Ig5L2/55So77yJXHJcbiAgZ2V0Rm9ybUFycmF5KGZvcm1OYW1lOiBzdHJpbmcsIGFycmF5UGF0aDogc3RyaW5nKTogVW50eXBlZEZvcm1BcnJheSB8IG51bGwge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbZm9ybU5hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSBnZXRGb3JtQXJyYXk6IGZvcm0gXCIke2Zvcm1OYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXROZXN0ZWRGb3JtQXJyYXkoZm9ybUdyb3VwLCBhcnJheVBhdGgpO1xyXG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSBnZXRGb3JtQXJyYXk6IEZvcm1BcnJheSBhdCBwYXRoIFwiJHthcnJheVBhdGh9XCIgbm90IGZvdW5kIGluIGZvcm0gXCIke2Zvcm1OYW1lfVwiLmBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLyDlkJEgRm9ybUFycmF5IOaWsOWinuS4gOihjO+8iOiHquWKqOi/m+WFpee8lui+keeKtuaAge+8jOaXoOW/q+eFp++8iVxyXG4gIGFkZEFycmF5Um93KGZvcm1OYW1lOiBzdHJpbmcsIGFycmF5UGF0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1TdG9yZVtmb3JtTmFtZV07XHJcbiAgICBpZiAoIWZvcm1Hcm91cCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIGFkZEFycmF5Um93OiBmb3JtIFwiJHtmb3JtTmFtZX1cIiBub3QgZm91bmQuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmdldE5lc3RlZEZvcm1BcnJheShmb3JtR3JvdXAsIGFycmF5UGF0aCk7XHJcbiAgICBpZiAoIWZvcm1BcnJheSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIGFkZEFycmF5Um93OiBGb3JtQXJyYXkgYXQgcGF0aCBcIiR7YXJyYXlQYXRofVwiIG5vdCBmb3VuZCBpbiBmb3JtIFwiJHtmb3JtTmFtZX1cIi5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlj5bnrKzkuIDooYznmoTnu5PmnoTkvZzkuLrmqKHmnb/vvIzoi6Xml6DooYzliJnml6Dms5Xmjqjmlq0gaXRlbUNvbmZpZ1xyXG4gICAgLy8g5paw6KGM6buY6K6k5Li656m6IEZvcm1Hcm91cO+8iOiwg+eUqOaWueW6lOmAmui/hyBpdGVtQ29uZmlnIOS8oOWFpeWFt+S9k+e7k+aehO+8iVxyXG4gICAgLy8g5a6e6ZmF6KGM5Yib5bu66YCa6L+HIF9hZGRBcnJheVJvd1dpdGhDb25maWcg5a6M5oiQ77yM5q2k5aSE5L+d55WZ56m66KGM5YWc5bqVXHJcbiAgICBjb25zdCBuZXdSb3cgPSB0aGlzLmZiLmdyb3VwKHt9KTtcclxuICAgIGZvcm1BcnJheS5wdXNoKG5ld1Jvdyk7XHJcblxyXG4gICAgY29uc3QgbmV3SW5kZXggPSBmb3JtQXJyYXkubGVuZ3RoIC0gMTtcclxuICAgIHRoaXMuX2Vuc3VyZUFycmF5U3RhdGUoZm9ybU5hbWUsIGFycmF5UGF0aCk7XHJcbiAgICAvLyDmlrDlop7ooYzml6Dljoblj7Llv6vnhafvvIxjYW5jZWxSb3dFZGl0IOaXtuebtOaOpeWIoOmZpFxyXG4gICAgdGhpcy5hcnJheUVkaXRpbmdSb3dzW2Zvcm1OYW1lXVthcnJheVBhdGhdLmFkZChuZXdJbmRleCk7XHJcbiAgfVxyXG5cclxuICAvLyDlkJEgRm9ybUFycmF5IOaWsOWinuS4gOihjO+8iOaMh+WumiBpdGVtQ29uZmln77yJXHJcbiAgYWRkQXJyYXlSb3dXaXRoQ29uZmlnKFxyXG4gICAgZm9ybU5hbWU6IHN0cmluZyxcclxuICAgIGFycmF5UGF0aDogc3RyaW5nLFxyXG4gICAgaXRlbUNvbmZpZzogRm9ybUNvbmZpZ1xyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbZm9ybU5hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSBhZGRBcnJheVJvd1dpdGhDb25maWc6IGZvcm0gXCIke2Zvcm1OYW1lfVwiIG5vdCBmb3VuZC5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZ2V0TmVzdGVkRm9ybUFycmF5KGZvcm1Hcm91cCwgYXJyYXlQYXRoKTtcclxuICAgIGlmICghZm9ybUFycmF5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gYWRkQXJyYXlSb3dXaXRoQ29uZmlnOiBGb3JtQXJyYXkgYXQgcGF0aCBcIiR7YXJyYXlQYXRofVwiIG5vdCBmb3VuZCBpbiBmb3JtIFwiJHtmb3JtTmFtZX1cIi5gXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdSb3cgPSB0aGlzLmNyZWF0ZUFycmF5Um93R3JvdXAoaXRlbUNvbmZpZyk7XHJcbiAgICBmb3JtQXJyYXkucHVzaChuZXdSb3cpO1xyXG5cclxuICAgIGNvbnN0IG5ld0luZGV4ID0gZm9ybUFycmF5Lmxlbmd0aCAtIDE7XHJcbiAgICB0aGlzLl9lbnN1cmVBcnJheVN0YXRlKGZvcm1OYW1lLCBhcnJheVBhdGgpO1xyXG4gICAgLy8g5paw5aKe6KGM5peg5Y6G5Y+y5b+r54Wn77yMY2FuY2VsUm93RWRpdCDml7bnm7TmjqXliKDpmaRcclxuICAgIHRoaXMuYXJyYXlFZGl0aW5nUm93c1tmb3JtTmFtZV1bYXJyYXlQYXRoXS5hZGQobmV3SW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yig6ZmkIEZvcm1BcnJheSDkuK3mjIflrprooYzvvIjlkIzml7bmuIXnkIbnvJbovpHnirbmgIHlkozlv6vnhafvvIzlubbph43lr7npvZDntKLlvJXvvIlcclxuICByZW1vdmVBcnJheVJvdyhmb3JtTmFtZTogc3RyaW5nLCBhcnJheVBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtU3RvcmVbZm9ybU5hbWVdO1xyXG4gICAgaWYgKCFmb3JtR3JvdXApIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSByZW1vdmVBcnJheVJvdzogZm9ybSBcIiR7Zm9ybU5hbWV9XCIgbm90IGZvdW5kLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXROZXN0ZWRGb3JtQXJyYXkoZm9ybUdyb3VwLCBhcnJheVBhdGgpO1xyXG4gICAgaWYgKCFmb3JtQXJyYXkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSByZW1vdmVBcnJheVJvdzogRm9ybUFycmF5IGF0IHBhdGggXCIke2FycmF5UGF0aH1cIiBub3QgZm91bmQgaW4gZm9ybSBcIiR7Zm9ybU5hbWV9XCIuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZvcm1BcnJheS5sZW5ndGgpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbQW50ZEZvcm1TZXJ2aWNlXSByZW1vdmVBcnJheVJvdzogaW5kZXggJHtpbmRleH0gb3V0IG9mIHJhbmdlLmBcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgICB0aGlzLl9lbnN1cmVBcnJheVN0YXRlKGZvcm1OYW1lLCBhcnJheVBhdGgpO1xyXG5cclxuICAgIC8vIOa4heeQhuiiq+WIoOihjOeahOW/q+eFp1xyXG4gICAgY29uc3Qgc25hcHNob3RNYXAgPSB0aGlzLmFycmF5Um93U25hcHNob3RzW2Zvcm1OYW1lXVthcnJheVBhdGhdO1xyXG4gICAgc25hcHNob3RNYXAuZGVsZXRlKGluZGV4KTtcclxuXHJcbiAgICAvLyDph43lr7npvZDvvJrlv6vnhafkuK0gPiBpbmRleCDnmoTplK7lhajpg6ggLTFcclxuICAgIGNvbnN0IG5ld1NuYXBzaG90TWFwID0gbmV3IE1hcDxudW1iZXIsIGFueT4oKTtcclxuICAgIHNuYXBzaG90TWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcclxuICAgICAgbmV3U25hcHNob3RNYXAuc2V0KGtleSA+IGluZGV4ID8ga2V5IC0gMSA6IGtleSwgdmFsdWUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFycmF5Um93U25hcHNob3RzW2Zvcm1OYW1lXVthcnJheVBhdGhdID0gbmV3U25hcHNob3RNYXA7XHJcblxyXG4gICAgLy8g6YeN5a+56b2Q77yaZWRpdGluZ1Jvd3Mg5LitID4gaW5kZXgg55qE57Si5byV5YWo6YOoIC0xXHJcbiAgICBjb25zdCBlZGl0aW5nU2V0ID0gdGhpcy5hcnJheUVkaXRpbmdSb3dzW2Zvcm1OYW1lXVthcnJheVBhdGhdO1xyXG4gICAgY29uc3QgbmV3RWRpdGluZ1NldCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG4gICAgZWRpdGluZ1NldC5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGlmIChpICE9PSBpbmRleCkge1xyXG4gICAgICAgIG5ld0VkaXRpbmdTZXQuYWRkKGkgPiBpbmRleCA/IGkgLSAxIDogaSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5hcnJheUVkaXRpbmdSb3dzW2Zvcm1OYW1lXVthcnJheVBhdGhdID0gbmV3RWRpdGluZ1NldDtcclxuICB9XHJcblxyXG4gIC8vIOWtmOWCqCBGb3JtQXJyYXkg55qEIGl0ZW1Db25maWfvvIjnlKjkuo7lm57loavml7bph43lu7rooYznu5PmnoTvvIlcclxuICBwcml2YXRlIF9lbnN1cmVBcnJheUl0ZW1Db25maWcoXHJcbiAgICBmb3JtTmFtZTogc3RyaW5nLFxyXG4gICAgYXJyYXlQYXRoOiBzdHJpbmcsXHJcbiAgICBpdGVtQ29uZmlnOiBGb3JtQ29uZmlnXHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYXJyYXlJdGVtQ29uZmlnc1tmb3JtTmFtZV0pIHtcclxuICAgICAgdGhpcy5hcnJheUl0ZW1Db25maWdzW2Zvcm1OYW1lXSA9IHt9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5hcnJheUl0ZW1Db25maWdzW2Zvcm1OYW1lXVthcnJheVBhdGhdID0gaXRlbUNvbmZpZztcclxuICB9XHJcblxyXG4gIC8vIOWIneWni+WMliBhcnJheUVkaXRpbmdSb3dzIOWSjCBhcnJheVJvd1NuYXBzaG90cyDlr7nlupTot6/lvoTvvIjoi6XkuI3lrZjlnKjliJnliJvlu7rvvIlcclxuICBwcml2YXRlIF9lbnN1cmVBcnJheVN0YXRlKGZvcm1OYW1lOiBzdHJpbmcsIGFycmF5UGF0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYXJyYXlFZGl0aW5nUm93c1tmb3JtTmFtZV0pIHtcclxuICAgICAgdGhpcy5hcnJheUVkaXRpbmdSb3dzW2Zvcm1OYW1lXSA9IHt9O1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmFycmF5RWRpdGluZ1Jvd3NbZm9ybU5hbWVdW2FycmF5UGF0aF0pIHtcclxuICAgICAgdGhpcy5hcnJheUVkaXRpbmdSb3dzW2Zvcm1OYW1lXVthcnJheVBhdGhdID0gbmV3IFNldDxudW1iZXI+KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuYXJyYXlSb3dTbmFwc2hvdHNbZm9ybU5hbWVdKSB7XHJcbiAgICAgIHRoaXMuYXJyYXlSb3dTbmFwc2hvdHNbZm9ybU5hbWVdID0ge307XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuYXJyYXlSb3dTbmFwc2hvdHNbZm9ybU5hbWVdW2FycmF5UGF0aF0pIHtcclxuICAgICAgdGhpcy5hcnJheVJvd1NuYXBzaG90c1tmb3JtTmFtZV1bYXJyYXlQYXRoXSA9IG5ldyBNYXA8bnVtYmVyLCBhbnk+KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBGb3JtQXJyYXkg6KGM57qn57yW6L6RID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8vIOW8gOWQr+aMh+WumuihjOeahOe8lui+keaooeW8j++8iOS/neWtmOW9k+WJjeWAvOS4uuW/q+eFp++8iVxyXG4gIHN0YXJ0Um93RWRpdChmb3JtTmFtZTogc3RyaW5nLCBhcnJheVBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRGb3JtQXJyYXkoZm9ybU5hbWUsIGFycmF5UGF0aCk7XHJcbiAgICBpZiAoIWZvcm1BcnJheSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJvd0NvbnRyb2wgPSBmb3JtQXJyYXkuYXQoaW5kZXgpO1xyXG4gICAgaWYgKCFyb3dDb250cm9sKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgW0FudGRGb3JtU2VydmljZV0gc3RhcnRSb3dFZGl0OiByb3cgJHtpbmRleH0gbm90IGZvdW5kIGluIFwiJHthcnJheVBhdGh9XCIuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZW5zdXJlQXJyYXlTdGF0ZShmb3JtTmFtZSwgYXJyYXlQYXRoKTtcclxuXHJcbiAgICAvLyDkv53lrZjlv6vnhafvvIjku4XlvZPlv6vnhafkuI3lrZjlnKjml7bvvIzpgb/lhY3ph43lpI3nvJbovpHopobnm5bljp/lp4vlgLzvvIlcclxuICAgIGNvbnN0IHNuYXBzaG90TWFwID0gdGhpcy5hcnJheVJvd1NuYXBzaG90c1tmb3JtTmFtZV1bYXJyYXlQYXRoXTtcclxuICAgIGlmICghc25hcHNob3RNYXAuaGFzKGluZGV4KSkge1xyXG4gICAgICBzbmFwc2hvdE1hcC5zZXQoaW5kZXgsIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocm93Q29udHJvbC5nZXRSYXdWYWx1ZSgpKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXJyYXlFZGl0aW5nUm93c1tmb3JtTmFtZV1bYXJyYXlQYXRoXS5hZGQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLy8g56Gu6K6k5L+d5a2Y5oyH5a6a6KGM77yI6aqM6K+B6YCa6L+H5YiZ5riF6Zmk5b+r54Wn5bm26YCA5Ye657yW6L6R54q25oCB77yM6L+U5Zue6KGM5pWw5o2u77yb5ZCm5YiZ6L+U5ZueIGZhbHNl77yJXHJcbiAgY29uZmlybVJvd0VkaXQoXHJcbiAgICBmb3JtTmFtZTogc3RyaW5nLFxyXG4gICAgYXJyYXlQYXRoOiBzdHJpbmcsXHJcbiAgICBpbmRleDogbnVtYmVyXHJcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB8IGZhbHNlIHtcclxuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZ2V0Rm9ybUFycmF5KGZvcm1OYW1lLCBhcnJheVBhdGgpO1xyXG4gICAgaWYgKCFmb3JtQXJyYXkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCByb3dDb250cm9sID0gZm9ybUFycmF5LmF0KGluZGV4KTtcclxuICAgIGlmICghcm93Q29udHJvbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFtBbnRkRm9ybVNlcnZpY2VdIGNvbmZpcm1Sb3dFZGl0OiByb3cgJHtpbmRleH0gbm90IGZvdW5kIGluIFwiJHthcnJheVBhdGh9XCIuYFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvd0NvbnRyb2wuaW52YWxpZCkge1xyXG4gICAgICB0aGlzLm1hcmtBbGxDb250cm9sc0FzRGlydHkocm93Q29udHJvbCwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZW5zdXJlQXJyYXlTdGF0ZShmb3JtTmFtZSwgYXJyYXlQYXRoKTtcclxuICAgIHRoaXMuYXJyYXlSb3dTbmFwc2hvdHNbZm9ybU5hbWVdW2FycmF5UGF0aF0uZGVsZXRlKGluZGV4KTtcclxuICAgIHRoaXMuYXJyYXlFZGl0aW5nUm93c1tmb3JtTmFtZV1bYXJyYXlQYXRoXS5kZWxldGUoaW5kZXgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmV4Y2x1ZGVJbnRlcm5hbEZpZWxkcyhyb3dDb250cm9sLmdldFJhd1ZhbHVlKCkpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Y+W5raI57yW6L6R5oyH5a6a6KGM77yI5LuO5b+r54Wn5oGi5aSN5YC877yb6Iul5peg5b+r54Wn5YiZ6K+05piO5piv5paw5aKe6KGM77yM55u05o6l5Yig6Zmk6K+l6KGM77yJXHJcbiAgY2FuY2VsUm93RWRpdChmb3JtTmFtZTogc3RyaW5nLCBhcnJheVBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5nZXRGb3JtQXJyYXkoZm9ybU5hbWUsIGFycmF5UGF0aCk7XHJcbiAgICBpZiAoIWZvcm1BcnJheSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX2Vuc3VyZUFycmF5U3RhdGUoZm9ybU5hbWUsIGFycmF5UGF0aCk7XHJcbiAgICBjb25zdCBzbmFwc2hvdE1hcCA9IHRoaXMuYXJyYXlSb3dTbmFwc2hvdHNbZm9ybU5hbWVdW2FycmF5UGF0aF07XHJcblxyXG4gICAgaWYgKHNuYXBzaG90TWFwLmhhcyhpbmRleCkpIHtcclxuICAgICAgLy8g5bey5pyJ6KGM77ya5LuO5b+r54Wn5oGi5aSN5YC8XHJcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gc25hcHNob3RNYXAuZ2V0KGluZGV4KTtcclxuICAgICAgY29uc3Qgcm93Q29udHJvbCA9IGZvcm1BcnJheS5hdChpbmRleCk7XHJcbiAgICAgIGlmIChyb3dDb250cm9sKSB7XHJcbiAgICAgICAgcm93Q29udHJvbC5wYXRjaFZhbHVlKHNuYXBzaG90KTtcclxuICAgICAgICByb3dDb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgcm93Q29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgICBzbmFwc2hvdE1hcC5kZWxldGUoaW5kZXgpO1xyXG4gICAgICB0aGlzLmFycmF5RWRpdGluZ1Jvd3NbZm9ybU5hbWVdW2FycmF5UGF0aF0uZGVsZXRlKGluZGV4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOaWsOWinuihjO+8muebtOaOpeWIoOmZpFxyXG4gICAgICB0aGlzLnJlbW92ZUFycmF5Um93KGZvcm1OYW1lLCBhcnJheVBhdGgsIGluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOafpeivouaMh+WumuihjOaYr+WQpuWkhOS6jue8lui+keeKtuaAgVxyXG4gIGlzUm93RWRpdGluZyhmb3JtTmFtZTogc3RyaW5nLCBhcnJheVBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5hcnJheUVkaXRpbmdSb3dzW2Zvcm1OYW1lXT8uW2FycmF5UGF0aF0/LmhhcyhpbmRleCkgPz8gZmFsc2VcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bmiYDmnInmraPlnKjnvJbovpHnmoTooYzntKLlvJXliJfooahcclxuICBnZXRFZGl0aW5nUm93SW5kaWNlcyhmb3JtTmFtZTogc3RyaW5nLCBhcnJheVBhdGg6IHN0cmluZyk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IGVkaXRpbmdTZXQgPSB0aGlzLmFycmF5RWRpdGluZ1Jvd3NbZm9ybU5hbWVdPy5bYXJyYXlQYXRoXTtcclxuICAgIHJldHVybiBlZGl0aW5nU2V0ID8gQXJyYXkuZnJvbShlZGl0aW5nU2V0KS5zb3J0KChhLCBiKSA9PiBhIC0gYikgOiBbXTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IOW3peWFt+aWueazlSA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvLyDojrflj5booajljZXnsbvlkI1cclxuICBnZXRGb3JtQ2xhc3NOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5jbGFzc1ByZWZpeH1jdXN0b20tJHtuYW1lfSBgO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6+572uIENTUyDlj5jph4/liLDnm67moIflhYPntKDvvIjmlK/mjIHmjIHkuYXljJbnm5HlkKzliqjmgIHmt7vliqDnmoTlhYPntKDvvIlcclxuICBzZXRDU1NWYXJpYWJsZXNUb1RhcmdldChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZvcm1Db250YWluZXJTZWxlY3RvciA9IGAuJHt0aGlzLmdldEZvcm1DbGFzc05hbWUobmFtZSl9YDtcclxuICAgIGNvbnN0IGZvcm1Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICBmb3JtQ29udGFpbmVyU2VsZWN0b3JcclxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgLy8g5aaC5p6c5a655Zmo6L+Y5LiN5a2Y5Zyo77yM5Y+v5Lul55SoIE11dGF0aW9uT2JzZXJ2ZXIg562J5b6F5a6D5Ye6546wXHJcbiAgICBpZiAoIWZvcm1Db250YWluZXIpIHtcclxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgIGZvcm1Db250YWluZXJTZWxlY3RvclxyXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgY29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1sYWJlbC13aWR0aFwiLCB0aGlzLmxhYmVsV2lkdGgpO1xyXG4gICAgICAgICAgY29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1sYWJlbC1hbGlnblwiLCB0aGlzLmxhYmVsQWxpZ24pO1xyXG4gICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtcclxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyAxMOenkuWQjuiHquWKqOaWreW8gO+8jOmBv+WFjeWGheWtmOazhOa8j1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSwgMTAwMDApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Zyo5a655Zmo5LiK6K6+572uIENTUyDlj5jph49cclxuICAgIGZvcm1Db250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoXCItLWxhYmVsLXdpZHRoXCIsIHRoaXMubGFiZWxXaWR0aCk7XHJcbiAgICBmb3JtQ29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1sYWJlbC1hbGlnblwiLCB0aGlzLmxhYmVsQWxpZ24pO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0g56eB5pyJ5pa55rOVID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8vIOi/h+a7pOWGhemDqOWtl+aute+8iOmAkuW9kuWkhOeQhuWvueixoeWSjOaVsOe7hO+8iVxyXG4gIHByaXZhdGUgZXhjbHVkZUludGVybmFsRmllbGRzKHZhbHVlOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOeJueauiuWkhOeQhiBEYXRlIOWvueixoe+8jOebtOaOpei/lOWbnuS4jeWBmui9rOaNolxyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuZXhjbHVkZUludGVybmFsRmllbGRzKGl0ZW0pKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJlZDogYW55ID0ge307XHJcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xyXG4gICAgICAvLyDov4fmu6Tku6UgX18g5byA5aS055qE5YaF6YOo5a2X5q61XHJcbiAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJfX1wiKSkge1xyXG4gICAgICAgIGZpbHRlcmVkW2tleV0gPSB0aGlzLmV4Y2x1ZGVJbnRlcm5hbEZpZWxkcyh2YWwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmaWx0ZXJlZDtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9ruWAvOWPmOabtOiuoumYhVxyXG4gIHByaXZhdGUgc2V0dXBWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbjxUPihcclxuICAgIHRhcmdldDogeyB2YWx1ZUNoYW5nZXM6IGFueTsgdmFsdWU6IGFueSB9LFxyXG4gICAgaGFuZGxlcjogKHZhbHVlOiBUKSA9PiB2b2lkLFxyXG4gICAgb3B0aW9ucz86IFdhdGNoT3B0aW9uc1xyXG4gICk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICBsZXQgdmFsdWVDaGFuZ2VzJCA9IHRhcmdldC52YWx1ZUNoYW5nZXM7XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/LmRlYm91bmNlICE9IG51bGwpIHtcclxuICAgICAgdmFsdWVDaGFuZ2VzJCA9IHZhbHVlQ2hhbmdlcyQucGlwZShkZWJvdW5jZVRpbWUob3B0aW9ucy5kZWJvdW5jZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvcHRpb25zPy5kaXN0aW5jdFVudGlsQ2hhbmdlZCAhPT0gZmFsc2UpIHtcclxuICAgICAgdmFsdWVDaGFuZ2VzJCA9IHZhbHVlQ2hhbmdlcyQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob3B0aW9ucz8uZW1pdEluaXRpYWwpIHtcclxuICAgICAgaGFuZGxlcih0YXJnZXQudmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZUNoYW5nZXMkLnN1YnNjcmliZShoYW5kbGVyKTtcclxuICB9XHJcbn1cclxuIl19
|