@rosen-bridge/config 2.0.0-eae8c5f0 → 2.0.0-f04e35dc
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/CHANGELOG.md +1 -1
- package/dist/config.d.ts +14 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +235 -92
- package/dist/value/validators.d.ts.map +1 -1
- package/dist/value/validators.js +6 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/config.d.ts
CHANGED
|
@@ -38,6 +38,18 @@ export declare class ConfigValidator {
|
|
|
38
38
|
* @memberof ConfigValidator
|
|
39
39
|
*/
|
|
40
40
|
private validateSubConfig;
|
|
41
|
+
/**
|
|
42
|
+
* traverses and validates a union subconfig using the subschema
|
|
43
|
+
*
|
|
44
|
+
* @private
|
|
45
|
+
* @param {any} value
|
|
46
|
+
* @param {UnionField} field
|
|
47
|
+
* @param {Record<string, any>} config
|
|
48
|
+
* @param {ConfigSchema} subSchema
|
|
49
|
+
* @param {string[]} childPath
|
|
50
|
+
* @param {string} name
|
|
51
|
+
*/
|
|
52
|
+
private validateUnionValue;
|
|
41
53
|
/**
|
|
42
54
|
* sets an object's specific subtree to the specified value
|
|
43
55
|
*
|
|
@@ -66,7 +78,7 @@ export declare class ConfigValidator {
|
|
|
66
78
|
* @param {Record<string, any>} config
|
|
67
79
|
* @return {boolean}
|
|
68
80
|
*/
|
|
69
|
-
isWhenTrue: (when: When, config: Record<string, any>) => boolean;
|
|
81
|
+
isWhenTrue: (when: When, config: Record<string, any>, context?: Record<string, any>) => boolean;
|
|
70
82
|
/**
|
|
71
83
|
* returns the value at specified path in config object
|
|
72
84
|
*
|
|
@@ -75,7 +87,7 @@ export declare class ConfigValidator {
|
|
|
75
87
|
* @param {string[]} path
|
|
76
88
|
* @return {*}
|
|
77
89
|
*/
|
|
78
|
-
static valueAt: (config:
|
|
90
|
+
static valueAt: (config: any, path: string[]) => any;
|
|
79
91
|
/**
|
|
80
92
|
* validates this.schema and throws exception if any errors found
|
|
81
93
|
*/
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAQhD,OAAO,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiB,MAAM,QAAQ,CAAC;AAQhD,OAAO,EACL,WAAW,EACX,YAAY,EAEZ,SAAS,EACV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAYlD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO;IAKP;;;;;OAKG;IACH,YAAY,GAAI,CAAC,OAAK,CAAC,CAIrB;IAEF;;OAEG;IACH,MAAM,CAAC,QAAQ,GAAI,YAAY,MAAM,KAAG,eAAe,CAUrD;IAEF;;;;OAIG;IACH,MAAM,CAAC,UAAU,GAAI,QAAQ,YAAY,KAAG,eAAe,CAEzD;IAEF;;;;OAIG;IAEI,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAWjD;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IA6FzB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IA+F1B;;;;;;;;;OASG;IACH,MAAM,CAAC,YAAY,CAEjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,QAAQ,EAAE,SAAS,EACnB,IAAI,EAAE,MAAM,EAAE;IAgBhB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa,CA6EnB;IAEF;;;;;;;OAOG;IACI,UAAU,GACf,MAAM,IAAI,EAEV,QAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAE3B,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAC5B,OAAO,CAUR;IAEF;;;;;;;OAOG;IAEH,MAAM,CAAC,OAAO,GAAI,QAAQ,GAAG,EAAE,MAAM,MAAM,EAAE,SAc3C;IAEF;;OAEG;IACH,OAAO,CAAC,cAAc,CAgEpB;IAEF;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAIxB;IAEF;;;;OAIG;IACH,OAAO,CAAC,mBAAmB,CA4BzB;IAEF;;;;;OAKG;IACH,cAAc,GAAI,MAAM,MAAM,EAAE,KAAG,WAAW,GAAG,SAAS,CA0FxD;IAEF;;;;OAIG;IAEH,eAAe,GAAI,UAAU;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAMvE;IAGF,OAAO,CAAC,sBAAsB,CAsC5B;IAEF;;;;;OAKG;IACH,eAAe,GAAI,MAAM,MAAM,KAAG,MAAM,CA4MtC;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,cAAc,CAOpB;IAEF;;;;;;OAMG;IAEH,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAmCtE;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IA8CxC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAkDhC;IAEF;;;;;;;;OAQG;IACH,sBAAsB,GAEpB,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,QAAQ,OAAO,EACf,OAAO,MAAM,EACb,QAAQ,MAAM,UAqDd;CACH"}
|
package/dist/config.js
CHANGED
|
@@ -67,7 +67,9 @@ export class ConfigValidator {
|
|
|
67
67
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
68
|
config,
|
|
69
69
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
-
subConfig, subSchema, path
|
|
70
|
+
subConfig, subSchema, path,
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
72
|
+
context) {
|
|
71
73
|
const errorPreamble = (path) => `config validation failed for "${path.join('.')}" field`;
|
|
72
74
|
for (const name of Object.keys(subSchema)) {
|
|
73
75
|
const childPath = path.concat([name]);
|
|
@@ -77,53 +79,46 @@ export class ConfigValidator {
|
|
|
77
79
|
if (subConfig != undefined && Object.hasOwn(subConfig, name)) {
|
|
78
80
|
value = subConfig[name];
|
|
79
81
|
}
|
|
80
|
-
this.validateValue(value, field, config, childPath);
|
|
82
|
+
this.validateValue(value, field, config, childPath, context);
|
|
81
83
|
// if a node/field is of type object and thus is a subtree, traverse it
|
|
82
84
|
if (field.type === 'object') {
|
|
83
|
-
this.validateSubConfig(config, value, field.children, childPath);
|
|
85
|
+
this.validateSubConfig(config, value, field.children, childPath, context);
|
|
84
86
|
}
|
|
85
87
|
else if (field.type === 'array') {
|
|
86
88
|
if (Array.isArray(value)) {
|
|
87
|
-
for (
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
let isMatched = false;
|
|
96
|
-
let errorMessage = '';
|
|
97
|
-
for (const activeField of field.children) {
|
|
98
|
-
try {
|
|
99
|
-
if (activeField.type === 'object' &&
|
|
100
|
-
typeof value === 'object' &&
|
|
101
|
-
value != null) {
|
|
102
|
-
this.validateSubConfig(config, { [name]: value }, { [name]: activeField }, childPath);
|
|
103
|
-
isMatched = true;
|
|
89
|
+
for (let i = 0; i < value.length; i++) {
|
|
90
|
+
const item = value[i];
|
|
91
|
+
const itemPath = childPath.concat([String(i)]);
|
|
92
|
+
if (field.items.type === 'object') {
|
|
93
|
+
this.validateSubConfig(config, item, field.items.children, itemPath, { [name]: item });
|
|
94
|
+
}
|
|
95
|
+
else if (field.items.type === 'array') {
|
|
96
|
+
this.validateSubConfig(config, { [name]: item }, { [name]: field.items }, childPath);
|
|
104
97
|
}
|
|
105
|
-
else if (
|
|
106
|
-
|
|
107
|
-
ConfigValidator.modifyObject(config, item, childPath);
|
|
108
|
-
this.validateSubConfig(config, { [name]: item }, { [name]: activeField.items }, childPath);
|
|
109
|
-
ConfigValidator.modifyObject(config, value, childPath);
|
|
110
|
-
isMatched = true;
|
|
111
|
-
}
|
|
98
|
+
else if (field.items.type === 'union') {
|
|
99
|
+
this.validateUnionValue(item, field.items, config, itemPath, name, { [name]: item });
|
|
112
100
|
}
|
|
113
101
|
else {
|
|
114
|
-
|
|
115
|
-
|
|
102
|
+
// for primitive fields
|
|
103
|
+
this.validateValue(item, field.items, config, itemPath);
|
|
116
104
|
}
|
|
117
|
-
if (isMatched)
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
catch (e) {
|
|
121
|
-
errorMessage = `${e instanceof Error ? e.message : e}`;
|
|
122
|
-
isMatched = isMatched === true;
|
|
123
105
|
}
|
|
106
|
+
ConfigValidator.modifyObject(config, value, childPath);
|
|
124
107
|
}
|
|
125
|
-
|
|
126
|
-
|
|
108
|
+
}
|
|
109
|
+
else if (field.type === 'union') {
|
|
110
|
+
this.validateUnionValue(value, field, config, childPath, name);
|
|
111
|
+
}
|
|
112
|
+
if (value === undefined &&
|
|
113
|
+
field.type !== 'object' &&
|
|
114
|
+
field.type !== 'array' &&
|
|
115
|
+
field.type !== 'union') {
|
|
116
|
+
if (field.default !== undefined) {
|
|
117
|
+
value = field.default;
|
|
118
|
+
ConfigValidator.modifyObject(config, value, childPath);
|
|
119
|
+
if (subConfig != undefined) {
|
|
120
|
+
subConfig[name] = value;
|
|
121
|
+
}
|
|
127
122
|
}
|
|
128
123
|
}
|
|
129
124
|
}
|
|
@@ -132,6 +127,72 @@ export class ConfigValidator {
|
|
|
132
127
|
}
|
|
133
128
|
}
|
|
134
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* traverses and validates a union subconfig using the subschema
|
|
132
|
+
*
|
|
133
|
+
* @private
|
|
134
|
+
* @param {any} value
|
|
135
|
+
* @param {UnionField} field
|
|
136
|
+
* @param {Record<string, any>} config
|
|
137
|
+
* @param {ConfigSchema} subSchema
|
|
138
|
+
* @param {string[]} childPath
|
|
139
|
+
* @param {string} name
|
|
140
|
+
*/
|
|
141
|
+
validateUnionValue(
|
|
142
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
143
|
+
value, field,
|
|
144
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
145
|
+
config, childPath, name,
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
+
context) {
|
|
148
|
+
let isMatched = false;
|
|
149
|
+
let errorMessage = '';
|
|
150
|
+
for (const activeField of field.children) {
|
|
151
|
+
try {
|
|
152
|
+
if (activeField.type === 'object' &&
|
|
153
|
+
typeof value === 'object' &&
|
|
154
|
+
value != null) {
|
|
155
|
+
this.validateSubConfig(config, value, activeField.children, childPath, context);
|
|
156
|
+
isMatched = true;
|
|
157
|
+
}
|
|
158
|
+
else if (activeField.type === 'array' && Array.isArray(value)) {
|
|
159
|
+
for (let i = 0; i < value.length; i++) {
|
|
160
|
+
const item = value[i];
|
|
161
|
+
const itemPath = childPath.concat([String(i)]);
|
|
162
|
+
if (activeField.items.type === 'object') {
|
|
163
|
+
this.validateSubConfig(config, item, activeField.items.children, itemPath, item);
|
|
164
|
+
}
|
|
165
|
+
else if (activeField.items.type === 'union') {
|
|
166
|
+
this.validateUnionValue(item, activeField.items, config, itemPath, name, item);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.validateValue(item, activeField.items, config, itemPath, item);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
ConfigValidator.modifyObject(config, value, childPath);
|
|
173
|
+
isMatched = true;
|
|
174
|
+
}
|
|
175
|
+
else if (activeField.type === 'union') {
|
|
176
|
+
this.validateUnionValue(value, activeField, config, childPath, name, context);
|
|
177
|
+
isMatched = true;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
this.validateValue(value, activeField, config, childPath, context);
|
|
181
|
+
isMatched = true;
|
|
182
|
+
}
|
|
183
|
+
if (isMatched)
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
errorMessage = `${e instanceof Error ? e.message : e}`;
|
|
188
|
+
console.debug(`Value for "${childPath.join('.')}" has this error: ${errorMessage}.`);
|
|
189
|
+
isMatched = isMatched === true;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (!isMatched) {
|
|
193
|
+
throw new Error(`Value for "${childPath.join('.')}" does not match any of the union types for this error: ${errorMessage}. Please provide a valid value.`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
135
196
|
/**
|
|
136
197
|
* sets an object's specific subtree to the specified value
|
|
137
198
|
*
|
|
@@ -171,10 +232,9 @@ export class ConfigValidator {
|
|
|
171
232
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
172
233
|
value, field,
|
|
173
234
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
174
|
-
config, path
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
}
|
|
235
|
+
config, path,
|
|
236
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
237
|
+
context) => {
|
|
178
238
|
if (value != undefined) {
|
|
179
239
|
if (field.type === 'bigint') {
|
|
180
240
|
if (typeof value === 'number' &&
|
|
@@ -210,7 +270,7 @@ export class ConfigValidator {
|
|
|
210
270
|
const name = Object.keys(validation).filter((key) => key !== 'when' && key !== 'error')[0];
|
|
211
271
|
if (Object.hasOwn(valueValidations[field.type], name)) {
|
|
212
272
|
try {
|
|
213
|
-
valueValidations[field.type][name](value, validation, config, this);
|
|
273
|
+
valueValidations[field.type][name](value, validation, config, this, context);
|
|
214
274
|
}
|
|
215
275
|
catch (error) {
|
|
216
276
|
if (validation.error != undefined) {
|
|
@@ -230,9 +290,18 @@ export class ConfigValidator {
|
|
|
230
290
|
* @param {Record<string, any>} config
|
|
231
291
|
* @return {boolean}
|
|
232
292
|
*/
|
|
293
|
+
isWhenTrue = (when,
|
|
233
294
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
234
|
-
|
|
235
|
-
|
|
295
|
+
config,
|
|
296
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
297
|
+
context) => {
|
|
298
|
+
let pathParts = when.path.split('.');
|
|
299
|
+
if (context != undefined) {
|
|
300
|
+
const localValue = ConfigValidator.valueAt(context, pathParts);
|
|
301
|
+
if (localValue !== undefined) {
|
|
302
|
+
return localValue === when.value;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
236
305
|
const value = ConfigValidator.valueAt(config, pathParts);
|
|
237
306
|
return value != undefined && value === when.value;
|
|
238
307
|
};
|
|
@@ -246,10 +315,12 @@ export class ConfigValidator {
|
|
|
246
315
|
*/
|
|
247
316
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
248
317
|
static valueAt = (config, path) => {
|
|
249
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
250
318
|
let value = config;
|
|
251
319
|
for (const key of path) {
|
|
252
|
-
if (
|
|
320
|
+
if (Array.isArray(value)) {
|
|
321
|
+
value = value.map((item) => item?.[key]).find((v) => v !== undefined);
|
|
322
|
+
}
|
|
323
|
+
else if (value != undefined && Object.hasOwn(value, key)) {
|
|
253
324
|
value = value[key];
|
|
254
325
|
}
|
|
255
326
|
else {
|
|
@@ -361,13 +432,50 @@ export class ConfigValidator {
|
|
|
361
432
|
let subTree = this.schema;
|
|
362
433
|
let field = undefined;
|
|
363
434
|
for (const part of path) {
|
|
364
|
-
if (subTree
|
|
435
|
+
if (!subTree) {
|
|
436
|
+
if (field?.type === 'union') {
|
|
437
|
+
let found;
|
|
438
|
+
for (const child of field.children) {
|
|
439
|
+
if (child.type === 'object' &&
|
|
440
|
+
Object.hasOwn(child.children, part)) {
|
|
441
|
+
found = child.children[part];
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (!found)
|
|
446
|
+
return undefined;
|
|
447
|
+
field = found;
|
|
448
|
+
if (field.type === 'object') {
|
|
449
|
+
subTree = field.children;
|
|
450
|
+
}
|
|
451
|
+
else if (field.type === 'array' &&
|
|
452
|
+
(field.items.type === 'object' || field.items.type === 'union')) {
|
|
453
|
+
subTree =
|
|
454
|
+
field.items.type === 'object' ? field.items.children : undefined;
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
subTree = undefined;
|
|
458
|
+
}
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
return undefined;
|
|
462
|
+
}
|
|
463
|
+
if (Object.hasOwn(subTree, part)) {
|
|
365
464
|
field = subTree[part];
|
|
366
465
|
if (field.type === 'object') {
|
|
367
466
|
subTree = field.children;
|
|
368
467
|
}
|
|
369
|
-
else if (field.type === 'array'
|
|
370
|
-
|
|
468
|
+
else if (field.type === 'array') {
|
|
469
|
+
if (field.items.type === 'object') {
|
|
470
|
+
subTree = field.items.children;
|
|
471
|
+
}
|
|
472
|
+
else if (field.items.type === 'union') {
|
|
473
|
+
subTree = undefined;
|
|
474
|
+
field = field.items;
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
subTree = undefined;
|
|
478
|
+
}
|
|
371
479
|
}
|
|
372
480
|
else if (field.type === 'union') {
|
|
373
481
|
subTree = undefined;
|
|
@@ -378,16 +486,27 @@ export class ConfigValidator {
|
|
|
378
486
|
}
|
|
379
487
|
else {
|
|
380
488
|
if (field?.type === 'union') {
|
|
489
|
+
let found;
|
|
381
490
|
for (const child of field.children) {
|
|
382
491
|
if (child.type === 'object' &&
|
|
383
492
|
Object.hasOwn(child.children, part)) {
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
return field;
|
|
493
|
+
found = child.children[part];
|
|
494
|
+
break;
|
|
387
495
|
}
|
|
388
496
|
}
|
|
497
|
+
if (!found)
|
|
498
|
+
return undefined;
|
|
499
|
+
field = found;
|
|
500
|
+
if (field.type === 'object') {
|
|
501
|
+
subTree = field.children;
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
subTree = undefined;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
return undefined;
|
|
389
509
|
}
|
|
390
|
-
return undefined;
|
|
391
510
|
}
|
|
392
511
|
}
|
|
393
512
|
return field;
|
|
@@ -435,34 +554,8 @@ export class ConfigValidator {
|
|
|
435
554
|
}
|
|
436
555
|
}
|
|
437
556
|
}
|
|
438
|
-
else if (field.type
|
|
439
|
-
|
|
440
|
-
if (option.type === 'object') {
|
|
441
|
-
const obj = this.buildDefaultsForSchema(option.children);
|
|
442
|
-
if (Object.keys(obj).length > 0) {
|
|
443
|
-
defaults[key] = obj;
|
|
444
|
-
break;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
else if (option.type === 'array' && option.items.type == 'object') {
|
|
448
|
-
const obj = this.buildDefaultsForSchema(option.items.children);
|
|
449
|
-
if (Object.keys(obj).length > 0) {
|
|
450
|
-
defaults[key] = obj;
|
|
451
|
-
break;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
else if (option.type != 'union') {
|
|
455
|
-
if (option.default) {
|
|
456
|
-
defaults[key] = option.default;
|
|
457
|
-
break;
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
if (field.default != undefined) {
|
|
464
|
-
defaults[key] = field.default;
|
|
465
|
-
}
|
|
557
|
+
else if (field.type !== 'union' && field.default != undefined) {
|
|
558
|
+
defaults[key] = field.default;
|
|
466
559
|
}
|
|
467
560
|
}
|
|
468
561
|
return defaults;
|
|
@@ -485,6 +578,7 @@ export class ConfigValidator {
|
|
|
485
578
|
attributes: [],
|
|
486
579
|
},
|
|
487
580
|
];
|
|
581
|
+
// Traverses the schema object tree depth first
|
|
488
582
|
while (stack.length > 0) {
|
|
489
583
|
const current = stack[stack.length - 1];
|
|
490
584
|
const { subSchema, children, parentPath, typeName, attributes } = current;
|
|
@@ -499,21 +593,28 @@ export class ConfigValidator {
|
|
|
499
593
|
const childName = children.pop();
|
|
500
594
|
const field = subSchema[childName];
|
|
501
595
|
const path = parentPath.concat(childName);
|
|
596
|
+
// if a node/field is of type object and thus is a subtree, add it to
|
|
597
|
+
// the stack to be traversed later. Otherwise it's a leaf and needs no
|
|
598
|
+
// traversal.
|
|
502
599
|
const childNameQuoted = childName.includes('-')
|
|
503
600
|
? `"${childName}"`
|
|
504
601
|
: childName;
|
|
505
602
|
if (field.type === 'union') {
|
|
506
603
|
const unionTypes = [];
|
|
507
604
|
field.children.forEach((child, index) => {
|
|
605
|
+
if (child.type === 'union') {
|
|
606
|
+
child.children.forEach((nestedChild) => {
|
|
607
|
+
unionTypes.push(nestedChild.type);
|
|
608
|
+
});
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
508
611
|
if (child.type === 'object') {
|
|
509
|
-
const
|
|
510
|
-
|
|
511
|
-
.map(toPascalCase)
|
|
512
|
-
.join('');
|
|
612
|
+
const optionPath = path.concat([`Option${index}`]);
|
|
613
|
+
const typeName = optionPath.map(toPascalCase).join('');
|
|
513
614
|
stack.push({
|
|
514
615
|
subSchema: child.children,
|
|
515
616
|
children: Object.keys(child.children).reverse(),
|
|
516
|
-
parentPath:
|
|
617
|
+
parentPath: optionPath,
|
|
517
618
|
typeName,
|
|
518
619
|
attributes: [],
|
|
519
620
|
});
|
|
@@ -522,14 +623,12 @@ export class ConfigValidator {
|
|
|
522
623
|
}
|
|
523
624
|
if (child.type === 'array') {
|
|
524
625
|
if (child.items.type === 'object') {
|
|
525
|
-
const
|
|
526
|
-
|
|
527
|
-
.map(toPascalCase)
|
|
528
|
-
.join('');
|
|
626
|
+
const itemPath = path.concat([`Item${index}`]);
|
|
627
|
+
const typeName = itemPath.map(toPascalCase).join('');
|
|
529
628
|
stack.push({
|
|
530
629
|
subSchema: child.items.children,
|
|
531
630
|
children: Object.keys(child.items.children).reverse(),
|
|
532
|
-
parentPath:
|
|
631
|
+
parentPath: itemPath,
|
|
533
632
|
typeName,
|
|
534
633
|
attributes: [],
|
|
535
634
|
});
|
|
@@ -569,6 +668,50 @@ export class ConfigValidator {
|
|
|
569
668
|
});
|
|
570
669
|
attributes.push([childNameQuoted, `${typeName}[]`]);
|
|
571
670
|
}
|
|
671
|
+
else if (field.items.type === 'union') {
|
|
672
|
+
const unionTypes = [];
|
|
673
|
+
field.items.children.forEach((child, index) => {
|
|
674
|
+
if (child.type === 'string' ||
|
|
675
|
+
child.type === 'number' ||
|
|
676
|
+
child.type === 'boolean') {
|
|
677
|
+
unionTypes.push(child.type);
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
if (child.type === 'object') {
|
|
681
|
+
const optionPath = path.concat([`Option${index}`]);
|
|
682
|
+
const typeName = optionPath.map(toPascalCase).join('');
|
|
683
|
+
stack.push({
|
|
684
|
+
subSchema: child.children,
|
|
685
|
+
children: Object.keys(child.children).reverse(),
|
|
686
|
+
parentPath: optionPath,
|
|
687
|
+
typeName,
|
|
688
|
+
attributes: [],
|
|
689
|
+
});
|
|
690
|
+
unionTypes.push(typeName);
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
if (child.type === 'array') {
|
|
694
|
+
if (child.items.type === 'object') {
|
|
695
|
+
const itemPath = path.concat([`Option${index}Item`]);
|
|
696
|
+
const typeName = itemPath.map(toPascalCase).join('');
|
|
697
|
+
stack.push({
|
|
698
|
+
subSchema: child.items.children,
|
|
699
|
+
children: Object.keys(child.items.children).reverse(),
|
|
700
|
+
parentPath: itemPath,
|
|
701
|
+
typeName,
|
|
702
|
+
attributes: [],
|
|
703
|
+
});
|
|
704
|
+
unionTypes.push(`${typeName}[]`);
|
|
705
|
+
}
|
|
706
|
+
else {
|
|
707
|
+
unionTypes.push(`${child.items.type}[]`);
|
|
708
|
+
}
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
unionTypes.push(child.type);
|
|
712
|
+
});
|
|
713
|
+
attributes.push([childNameQuoted, `(${unionTypes.join(' | ')})[]`]);
|
|
714
|
+
}
|
|
572
715
|
else {
|
|
573
716
|
attributes.push([childNameQuoted, `${field.items.type}[]`]);
|
|
574
717
|
}
|
|
@@ -782,4 +925,4 @@ export class ConfigValidator {
|
|
|
782
925
|
}
|
|
783
926
|
};
|
|
784
927
|
}
|
|
785
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sVUFBVSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUkxRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGNBQWMsR0FDZixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLFlBQVksR0FDYixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkUsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFlO0lBRTdCLFlBQW9CLE1BQW9CO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsR0FBUyxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLFVBQWtCLEVBQW1CLEVBQUU7UUFDeEQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFM0Qs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Q0FBQyxDQUFDO1FBRXJDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFckQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbmZpZywgSUNvbmZpZ1NvdXJjZSB9IGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBKc29uQmlnSW50LCB7IEpzb25CaWdJbnRGYWN0b3J5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmltcG9ydCB7IENvbmZpZ0ZpZWxkLCBDb25maWdTY2hlbWEsIFZhbHVlVHlwZSB9IGZyb20gJy4vc2NoZW1hL3R5cGVzL2ZpZWxkcyc7XG5pbXBvcnQgeyBXaGVuIH0gZnJvbSAnLi9zY2hlbWEvdHlwZXMvdmFsaWRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgcHJvcGVydHlWYWxpZGF0b3JzLFxuICBzdXBwb3J0ZWRUeXBlcyxcbn0gZnJvbSAnLi9zY2hlbWEvVmFsaWRhdG9ycy9maWVsZFByb3BlcnRpZXMnO1xuaW1wb3J0IHtcbiAgZ2V0U291cmNlTmFtZSxcbiAgZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyxcbiAgdG9QYXNjYWxDYXNlLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHZhbHVlVmFsaWRhdGlvbnMsIHZhbHVlVmFsaWRhdG9ycyB9IGZyb20gJy4vdmFsdWUvdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdWYWxpZGF0b3Ige1xuICBwcml2YXRlIHNjaGVtYTogQ29uZmlnU2NoZW1hO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NoZW1hOiBDb25maWdTY2hlbWEpIHtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLnZhbGlkYXRlU2NoZW1hKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBmaW5hbCBjb25maWd1cmF0aW9uIG9iamVjdCBieSB0cmFuc2Zvcm1pbmcgYW5kIHZhbGlkYXRpbmdcbiAgICpcbiAgICogIFQgLSBUaGUgdHlwZSBvZiB0aGUgZmluYWwgbm9ybWFsaXplZCBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogQHJldHVybnMge1R9IFRoZSBub3JtYWxpemVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqL1xuICBidWlsZENvbmZpZ3MgPSA8VD4oKTogVCA9PiB7XG4gICAgY29uc3QgcmF3ID0gY29uZmlnLnV0aWwudG9PYmplY3QoKTtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlnKHJhdyk7XG4gICAgcmV0dXJuIHJhdztcbiAgfTtcblxuICAvKipcbiAgICogY3JlYXRlIENvbmZpZ1ZhbGlkYXRvciBmcm9tIHNjaGVtYSBmaWxlIHBhdGhcbiAgICovXG4gIHN0YXRpYyBmcm9tRmlsZSA9IChzY2hlbWFQYXRoOiBzdHJpbmcpOiBDb25maWdWYWxpZGF0b3IgPT4ge1xuICAgIGNvbnN0IHJhd1NjaGVtYURhdGEgPSBmcy5yZWFkRmlsZVN5bmMoc2NoZW1hUGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBqc29uQmlnSW50ID0gSnNvbkJpZ0ludEZhY3Rvcnkoe1xuICAgICAgYWx3YXlzUGFyc2VBc0JpZzogZmFsc2UsXG4gICAgICB1c2VOYXRpdmVCaWdJbnQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSBqc29uQmlnSW50LnBhcnNlKHJhd1NjaGVtYURhdGEpO1xuICAgIHJldHVybiBuZXcgQ29uZmlnVmFsaWRhdG9yKHNjaGVtYSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBDb25maWdWYWxpZGF0b3IgZnJvbSBzY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHNjaGVtYVxuICAgKi9cbiAgc3RhdGljIGZyb21TY2hlbWEgPSAoc2NoZW1hOiBDb25maWdTY2hlbWEpOiBDb25maWdWYWxpZGF0b3IgPT4ge1xuICAgIHJldHVybiBuZXcgQ29uZmlnVmFsaWRhdG9yKHNjaGVtYSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyB0aGUgcGFzc2VkIGNvbmZpZyBhZ2FpbnN0IHRoZSBpbnN0YW5jZSdzIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHZhbGlkYXRlQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHsgdHlwZTogJ29iamVjdCcsIGNoaWxkcmVuOiB0aGlzLnNjaGVtYSB9LFxuICAgICAgY29uZmlnLFxuICAgICAgW10sXG4gICAgKTtcblxuICAgIHRoaXMudmFsaWRhdGVTdWJDb25maWcoY29uZmlnLCBjb25maWcsIHRoaXMuc2NoZW1hLCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogdHJhdmVyc2VzIGFuZCB2YWxpZGF0ZXMgYSBzdWJjb25maWcgdXNpbmcgdGhlIHN1YnNjaGVtYVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHN1YkNvbmZpZ1xuICAgKiBAcGFyYW0ge0NvbmZpZ1NjaGVtYX0gc3ViU2NoZW1hXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN1YkNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYGNvbmZpZyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKSkge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5jb25jYXQoW25hbWVdKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdWJDb25maWcgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24oc3ViQ29uZmlnLCBuYW1lKSkge1xuICAgICAgICAgIHZhbHVlID0gc3ViQ29uZmlnW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZSh2YWx1ZSwgZmllbGQsIGNvbmZpZywgY2hpbGRQYXRoKTtcblxuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCB0cmF2ZXJzZSBpdFxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgdmFsdWUsIGZpZWxkLmNoaWxkcmVuLCBjaGlsZFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgaXRlbSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgeyBbbmFtZV06IGl0ZW0gfSxcbiAgICAgICAgICAgICAgICB7IFtuYW1lXTogZmllbGQuaXRlbXMgfSxcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICAgIGxldCBpc01hdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgZm9yIChjb25zdCBhY3RpdmVGaWVsZCBvZiBmaWVsZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFjdGl2ZUZpZWxkLnR5cGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIHsgW25hbWVdOiB2YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyBbbmFtZV06IGFjdGl2ZUZpZWxkIH0sXG4gICAgICAgICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpc01hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUZpZWxkLnR5cGUgPT09ICdhcnJheScgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCBpdGVtLCBjaGlsZFBhdGgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICB7IFtuYW1lXTogaXRlbSB9LFxuICAgICAgICAgICAgICAgICAgICB7IFtuYW1lXTogYWN0aXZlRmllbGQuaXRlbXMgfSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZSh2YWx1ZSwgYWN0aXZlRmllbGQsIGNvbmZpZywgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgICBpc01hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc01hdGNoZWQpIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWA7XG4gICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IGlzTWF0Y2hlZCA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpc01hdGNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFZhbHVlIGZvciBcIiR7Y2hpbGRQYXRoLmpvaW4oJy4nKX1cIiBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHVuaW9uIHR5cGVzIGZvciB0aGlzIGVycm9yOiAgJHtlcnJvck1lc3NhZ2V9LiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIHZhbHVlLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke2Vycm9yUHJlYW1ibGUoY2hpbGRQYXRoKX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZXRzIGFuIG9iamVjdCdzIHNwZWNpZmljIHN1YnRyZWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqXG4gICAqIEBwYXJhbSB7Kn0gbmV3VmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAbWVtYmVyb2YgQ29uZmlnVmFsaWRhdG9yXG4gICAqL1xuICBzdGF0aWMgbW9kaWZ5T2JqZWN0KFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIG5ld1ZhbHVlOiBWYWx1ZVR5cGUsXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICkge1xuICAgIGxldCB2YWx1ZSA9IG9iajtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXRoLnNsaWNlKDAsIC0xKSkge1xuICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCAmJiBPYmplY3QuaGFzT3duKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGFzdEtleSA9IHBhdGguYXQoLTEpO1xuICAgIGlmIChsYXN0S2V5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWVbbGFzdEtleV0gPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdmFsaWRhdGVzIGEgdmFsdWUgaW4gY29uZmlnIG9iamVjdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Q29uZmlnRmllbGR9IGZpZWxkIHRoZSBmaWVsZCBzcGVjaWZpY2F0aW9uIGluIHNjaGVtYVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZyB0aGUgY29uZmlnIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZhbHVlID0gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdmFsdWU6IGFueSxcbiAgICBmaWVsZDogQ29uZmlnRmllbGQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICkgPT4ge1xuICAgIGlmIChmaWVsZC5sYWJlbCkge1xuICAgICAgcGF0aCA9IHBhdGguY29uY2F0KFtmaWVsZC5sYWJlbF0pO1xuICAgIH1cbiAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAodmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCB2YWx1ZSA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRmllbGQgXCIke3BhdGguam9pbignLicpfVwiIGlzIGRlY2xhcmVkIGFzIGEgQmlnSW50LCBidXQgYSBOdW1iZXIgd2FzIHByb3ZpZGVkIHdpdGggaW5zdWZmaWNpZW50IHByZWNpc2lvbi4gVmFsdWVzIGV4Y2VlZGluZyA5MDA3MTk5MjU0NzQwOTkxIG11c3QgYmUgc3VwcGxpZWQgYXMgYSBzdHJpbmcgdG8gZW5zdXJlIGFjY3VyYWN5LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gQmlnSW50KHZhbHVlKTtcblxuICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgcGF0aCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgY29udmVydCAke3ZhbHVlfSB0byBhIEJpZ0ludCBmb3IgZmllbGQgXCIke3BhdGguam9pbignLicpfVwiYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEZpZWxkIFwiJHtwYXRoLmpvaW4oJy4nKX1cIiBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLiBQbGVhc2UgcHJvdmlkZSBhIHN1aXRhYmxlIGZvcm1hdC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fFxuICAgICAgICAgIHZhbHVlIDwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFZhbHVlIGZvciBcIiR7cGF0aC5qb2luKCcuJyl9XCIgaXMgdG9vIGxhcmdlIG9yIHRvbyBzbWFsbC4gUGxlYXNlIGVudGVyIGEgdmFsaWQgbnVtYmVyLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgdmFsdWUsIHBhdGgpO1xuICAgICAgfVxuICAgICAgdmFsdWVWYWxpZGF0b3JzW2ZpZWxkLnR5cGVdKHZhbHVlLCBmaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZmllbGQudHlwZSAhPT0gJ29iamVjdCcgJiZcbiAgICAgIGZpZWxkLnR5cGUgIT09ICdhcnJheScgJiZcbiAgICAgIGZpZWxkLnR5cGUgIT09ICd1bmlvbicgJiZcbiAgICAgIGZpZWxkLnZhbGlkYXRpb25zXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb24gb2YgZmllbGQudmFsaWRhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IE9iamVjdC5rZXlzKHZhbGlkYXRpb24pLmZpbHRlcihcbiAgICAgICAgICAoa2V5KSA9PiBrZXkgIT09ICd3aGVuJyAmJiBrZXkgIT09ICdlcnJvcicsXG4gICAgICAgIClbMF07XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duKHZhbHVlVmFsaWRhdGlvbnNbZmllbGQudHlwZV0sIG5hbWUpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlVmFsaWRhdGlvbnNbZmllbGQudHlwZV1bbmFtZV0odmFsdWUsIHZhbGlkYXRpb24sIGNvbmZpZywgdGhpcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uLmVycm9yICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodmFsaWRhdGlvbi5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGRldGVybWluZXMgaWYgYSB3aGVuIGNsYXVzZSBpbiB2YWxpZGF0aW9ucyBzZWN0aW9uIG9mIGEgc2NoZW1hIGZpZWxkIGlzXG4gICAqIHNhdGlzZmllZFxuICAgKlxuICAgKiBAcGFyYW0ge1doZW59IHdoZW5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyBpc1doZW5UcnVlID0gKHdoZW46IFdoZW4sIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHdoZW4ucGF0aC5zcGxpdCgnLicpO1xuICAgIGNvbnN0IHZhbHVlID0gQ29uZmlnVmFsaWRhdG9yLnZhbHVlQXQoY29uZmlnLCBwYXRoUGFydHMpO1xuICAgIHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IHdoZW4udmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgdGhlIHZhbHVlIGF0IHNwZWNpZmllZCBwYXRoIGluIGNvbmZpZyBvYmplY3RcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBzdGF0aWMgdmFsdWVBdCA9IChjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgdmFsdWU6IGFueSA9IGNvbmZpZztcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXRoKSB7XG4gICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24odmFsdWUsIGtleSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyB0aGlzLnNjaGVtYSBhbmQgdGhyb3dzIGV4Y2VwdGlvbiBpZiBhbnkgZXJyb3JzIGZvdW5kXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2NoZW1hID0gKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yUHJlYW1ibGUgPSAocGF0aDogQXJyYXk8c3RyaW5nPikgPT5cbiAgICAgIGBTY2hlbWEgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIFwiJHtwYXRoLmpvaW4oJy4nKX1cIiBmaWVsZGA7XG5cbiAgICBjb25zdCBzdGFjazogQXJyYXk8e1xuICAgICAgc3ViU2NoZW1hOiBDb25maWdTY2hlbWE7XG4gICAgICBwYXJlbnRQYXRoOiBBcnJheTxzdHJpbmc+O1xuICAgIH0+ID0gW1xuICAgICAge1xuICAgICAgICBzdWJTY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgICBwYXJlbnRQYXRoOiBbXSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0IGFuZCB2YWxpZGF0ZSBmaWVsZHNcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBzdWJTY2hlbWEsIHBhcmVudFBhdGggfSA9IHN0YWNrLnBvcCgpITtcblxuICAgICAgLy8gcHJvY2VzcyBjaGlsZHJlbiBvZiBjdXJyZW50IG9iamVjdCBmaWVsZFxuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHN1YlNjaGVtYSkucmV2ZXJzZSgpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBwYXJlbnRQYXRoLmNvbmNhdChbbmFtZV0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVDb25maWdOYW1lKG5hbWUpO1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuXG4gICAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGZpZWxkLCAndHlwZScpIHx8IHR5cGVvZiBmaWVsZC50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXZlcnkgc2NoZW1hIGZpZWxkIG11c3QgaGF2ZSBhIFwidHlwZVwiIHByb3BlcnR5IG9mIHR5cGUgXCJzdHJpbmdcImAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc3VwcG9ydGVkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZmllbGQgdHlwZSBcIiR7ZmllbGQudHlwZX1cImApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudmFsaWRhdGVTY2hlbWFGaWVsZChmaWVsZCk7XG5cbiAgICAgICAgICAvLyBpZiB0aGUgY2hpbGQgaXMgYW4gb2JqZWN0IGZpZWxkIGl0c2VsZiBhZGQgaXQgdG8gc3RhY2sgZm9yXG4gICAgICAgICAgLy8gcHJvY2Vzc2luZ1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHN1YlNjaGVtYTogZmllbGQuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICBzdWJTY2hlbWE6IHsgW25hbWVdOiBmaWVsZC5pdGVtcyB9LFxuICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgICBmaWVsZC5jaGlsZHJlbi5mb3JFYWNoKCh1bmlvbkNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdWJTY2hlbWE6IHsgW2Ake25hbWV9X3VuaW9uXyR7aW5kZXh9YF06IHVuaW9uQ2hpbGQgfSxcbiAgICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtlcnJvclByZWFtYmxlKHBhdGgpfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIGNvbmZpZyBrZXkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ05hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb25maWcga2V5IG5hbWUgY2FuIG5vdCBjb250YWluIHRoZSAnLicgY2hhcmFjdGVyYCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgcGFzc2VkIHNjaGVtYSBmaWVsZCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWdGaWVsZH0gZmllbGRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWFGaWVsZCA9IChmaWVsZDogQ29uZmlnRmllbGQpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzLmFsbCwga2V5KSAmJlxuICAgICAgICAhT2JqZWN0Lmhhc093bihwcm9wZXJ0eVZhbGlkYXRvcnMucHJpbWl0aXZlLCBrZXkpICYmXG4gICAgICAgICFPYmplY3QuaGFzT3duKHByb3BlcnR5VmFsaWRhdG9yc1tmaWVsZC50eXBlXSwga2V5KVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2NoZW1hIGZpZWxkIGhhcyB1bmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9ycy5hbGwpKSB7XG4gICAgICB2YWxpZGF0b3IoZmllbGQsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZpZWxkLnR5cGUgIT09ICdvYmplY3QnICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAnYXJyYXknICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAndW5pb24nXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9ycy5wcmltaXRpdmUpKSB7XG4gICAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2YgT2JqZWN0LnZhbHVlcyhwcm9wZXJ0eVZhbGlkYXRvcnNbZmllbGQudHlwZV0pKSB7XG4gICAgICB2YWxpZGF0b3IoZmllbGQsIHRoaXMpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXRoIGluIHNjaGVtYSB0cmVlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHJldHVybiB7KENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkKX0gcmV0dXJucyB1bmRlZmluZWQgaWYgZmllbGQgaXMgbm90IGZvdW5kXG4gICAqL1xuICBnZXRTY2hlbWFGaWVsZCA9IChwYXRoOiBzdHJpbmdbXSk6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkID0+IHtcbiAgICBsZXQgc3ViVHJlZTogQ29uZmlnU2NoZW1hIHwgdW5kZWZpbmVkID0gdGhpcy5zY2hlbWE7XG4gICAgbGV0IGZpZWxkOiBDb25maWdGaWVsZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aCkge1xuICAgICAgaWYgKHN1YlRyZWUgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24oc3ViVHJlZSwgcGFydCkpIHtcbiAgICAgICAgZmllbGQgPSBzdWJUcmVlW3BhcnRdO1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBzdWJUcmVlID0gZmllbGQuY2hpbGRyZW47XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5JyAmJiBmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHN1YlRyZWUgPSBmaWVsZC5pdGVtcy5jaGlsZHJlbjtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgc3ViVHJlZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJUcmVlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZpZWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGNoaWxkLnR5cGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIE9iamVjdC5oYXNPd24oY2hpbGQuY2hpbGRyZW4sIHBhcnQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZmllbGQgPSBjaGlsZC5jaGlsZHJlbltwYXJ0XTtcbiAgICAgICAgICAgICAgc3ViVHJlZSA9IGZpZWxkLnR5cGUgPT09ICdvYmplY3QnID8gZmllbGQuY2hpbGRyZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBkZWZhdWx0IHZhbHVlcyBmcm9tIGEgc2NoZW1hXG4gICAqXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iamVjdCBvZiBkZWZhdWx0IHZhbHVlc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZ2VuZXJhdGVEZWZhdWx0ID0gKG9wdGlvbnM/OiB7IHZhbGlkYXRlPzogYm9vbGVhbiB9KTogUmVjb3JkPHN0cmluZywgYW55PiA9PiB7XG4gICAgY29uc3QgdmFsdWVUcmVlID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKHRoaXMuc2NoZW1hKTtcbiAgICBpZiAob3B0aW9ucz8udmFsaWRhdGUpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb25maWcodmFsdWVUcmVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlVHJlZTtcbiAgfTtcblxuICAvLyBCdWlsZHMgZGVmYXVsdCB2YWx1ZXMgZm9yIGEgc2NoZW1hIHN1YnRyZWUgKG9iamVjdHMgYW5kIGFycmF5cyksIHJlY3Vyc2l2ZWx5XG4gIHByaXZhdGUgYnVpbGREZWZhdWx0c0ZvclNjaGVtYSA9IChcbiAgICBzY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGRlZmF1bHRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYVtrZXldO1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRGVmYXVsdHMgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEoZmllbGQuY2hpbGRyZW4pO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hpbGREZWZhdWx0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBjaGlsZERlZmF1bHRzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgaWYgKGZpZWxkLmRlZmF1bHQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRGVmYXVsdHMgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEoXG4gICAgICAgICAgICAgIGZpZWxkLml0ZW1zLmNoaWxkcmVuLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBmaWVsZC5kZWZhdWx0Lm1hcCgoZWxlbTogVmFsdWVUeXBlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbGVtICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZWxlbSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShlbGVtKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtRGVmYXVsdHMsIC4uLmVsZW0gfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gZmllbGQuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBmaWVsZC5jaGlsZHJlbikge1xuICAgICAgICAgIGlmIChvcHRpb24udHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHRoaXMuYnVpbGREZWZhdWx0c0ZvclNjaGVtYShvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBkZWZhdWx0c1trZXldID0gb2JqO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi50eXBlID09PSAnYXJyYXknICYmIG9wdGlvbi5pdGVtcy50eXBlID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEob3B0aW9uLml0ZW1zLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG9iajtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24udHlwZSAhPSAndW5pb24nKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmRlZmF1bHQpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG9wdGlvbi5kZWZhdWx0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWVsZC5kZWZhdWx0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBmaWVsZC5kZWZhdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfTtcblxuICAvKipcbiAgICogZ2VuZXJhdGVzIGNvbXBhdGlibGUgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZm9yIHRoaXMgaW5zdGFuY2UncyBzY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2Ygcm9vdCB0eXBlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdlbmVyYXRlVFNUeXBlcyA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVtaXR0ZWRUeXBlTmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PHtcbiAgICAgIHN1YlNjaGVtYTogQ29uZmlnU2NoZW1hO1xuICAgICAgY2hpbGRyZW46IHN0cmluZ1tdO1xuICAgICAgcGFyZW50UGF0aDogc3RyaW5nW107XG4gICAgICB0eXBlTmFtZTogc3RyaW5nO1xuICAgICAgYXR0cmlidXRlczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT47XG4gICAgfT4gPSBbXG4gICAgICB7XG4gICAgICAgIHN1YlNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYSksXG4gICAgICAgIHBhcmVudFBhdGg6IFtdLFxuICAgICAgICB0eXBlTmFtZTogbmFtZSxcbiAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgeyBzdWJTY2hlbWEsIGNoaWxkcmVuLCBwYXJlbnRQYXRoLCB0eXBlTmFtZSwgYXR0cmlidXRlcyB9ID0gY3VycmVudDtcblxuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoIWVtaXR0ZWRUeXBlTmFtZXMuaGFzKHR5cGVOYW1lKSkge1xuICAgICAgICAgIHR5cGVzLnB1c2godGhpcy5nZW5UU0ludGVyZmFjZSh0eXBlTmFtZSwgYXR0cmlidXRlcykpO1xuICAgICAgICAgIGVtaXR0ZWRUeXBlTmFtZXMuYWRkKHR5cGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkTmFtZSA9IGNoaWxkcmVuLnBvcCgpITtcbiAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW2NoaWxkTmFtZV07XG4gICAgICBjb25zdCBwYXRoID0gcGFyZW50UGF0aC5jb25jYXQoY2hpbGROYW1lKTtcblxuICAgICAgY29uc3QgY2hpbGROYW1lUXVvdGVkID0gY2hpbGROYW1lLmluY2x1ZGVzKCctJylcbiAgICAgICAgPyBgXCIke2NoaWxkTmFtZX1cImBcbiAgICAgICAgOiBjaGlsZE5hbWU7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICBjb25zdCB1bmlvblR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZpZWxkLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBwYXRoXG4gICAgICAgICAgICAgIC5jb25jYXQoW2BPcHRpb24ke2luZGV4fWBdKVxuICAgICAgICAgICAgICAubWFwKHRvUGFzY2FsQ2FzZSlcbiAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgc3ViU2NoZW1hOiBjaGlsZC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKGNoaWxkLmNoaWxkcmVuKS5yZXZlcnNlKCksXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB1bmlvblR5cGVzLnB1c2godHlwZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgaWYgKGNoaWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gcGF0aFxuICAgICAgICAgICAgICAgIC5jb25jYXQoW2BJdGVtJHtpbmRleH1gXSlcbiAgICAgICAgICAgICAgICAubWFwKHRvUGFzY2FsQ2FzZSlcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgc3ViU2NoZW1hOiBjaGlsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogT2JqZWN0LmtleXMoY2hpbGQuaXRlbXMuY2hpbGRyZW4pLnJldmVyc2UoKSxcbiAgICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB1bmlvblR5cGVzLnB1c2goYCR7dHlwZU5hbWV9W11gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChgJHtjaGlsZC5pdGVtcy50eXBlfVtdYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChjaGlsZC50eXBlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChbY2hpbGROYW1lUXVvdGVkLCB1bmlvblR5cGVzLmpvaW4oJyB8ICcpXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gcGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBzdWJTY2hlbWE6IGZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhmaWVsZC5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgdHlwZU5hbWUsXG4gICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChbY2hpbGROYW1lUXVvdGVkLCB0eXBlTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmIChmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gcGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgc3ViU2NoZW1hOiBmaWVsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhmaWVsZC5pdGVtcy5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW2NoaWxkTmFtZVF1b3RlZCwgYCR7dHlwZU5hbWV9W11gXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5wdXNoKFtjaGlsZE5hbWVRdW90ZWQsIGAke2ZpZWxkLml0ZW1zLnR5cGV9W11gXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgZmllbGRUeXBlOiBzdHJpbmcgPSBmaWVsZC50eXBlO1xuICAgICAgbGV0IGlzT3B0aW9uYWwgPSB0cnVlO1xuICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnc3RyaW5nJyAmJiAnY2hvaWNlcycgaW4gdmFsaWRhdGlvbikge1xuICAgICAgICAgICAgZmllbGRUeXBlID0gdmFsaWRhdGlvbi5jaG9pY2VzLm1hcCgoYykgPT4gYCcke2N9J2ApLmpvaW4oJyB8ICcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgncmVxdWlyZWQnIGluIHZhbGlkYXRpb24gJiYgISgnd2hlbicgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgICAgIGlzT3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMucHVzaChbXG4gICAgICAgIGlzT3B0aW9uYWwgPyBgJHtjaGlsZE5hbWVRdW90ZWR9P2AgOiBjaGlsZE5hbWVRdW90ZWQsXG4gICAgICAgIGZpZWxkVHlwZSxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlcy5yZXZlcnNlKCkuam9pbignXFxuXFxuJykgKyAnXFxuJztcbiAgfTtcblxuICAvKipcbiAgICogZ2VuZXJhdGVzIGEgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgcGFzc2VkIG5hbWUgYW5kIGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheTxbc3RyaW5nLCBzdHJpbmddPn0gYXR0cmlidXRlc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBwcml2YXRlIGdlblRTSW50ZXJmYWNlID0gKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhdHRyaWJ1dGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPixcbiAgKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gYGV4cG9ydCBpbnRlcmZhY2UgJHtuYW1lfSB7XG4gICR7YXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGAke2F0dHJbMF19OiAke2F0dHJbMV19O2ApLmpvaW4oJ1xcbiAgJyl9XG59YDtcbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIGNoYXJhY3RlcmlzdGljIG9iamVjdCBmb3IgdmFsdWVzIGF0IGEgc3BlY2lmaWMgbm9kZSBjb25maWcgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBnZXRDb25maWdGb3JMZXZlbChjb25maWc6IElDb25maWcsIGxldmVsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBjb25mTGV2ZWxzID0gQ29uZmlnVmFsaWRhdG9yLmdldE5vZGVDb25maWdMZXZlbHMoY29uZmlnKTtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gY29uZkxldmVscy5pbmRleE9mKGxldmVsKTtcbiAgICBpZiAobGV2ZWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBcIiR7bGV2ZWx9XCIgbGV2ZWwgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IHN5c3RlbSBjb25maWd1cmF0aW9uIGxldmVsc2AsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBoaWdoZXJMZXZlbFNvdXJjZXMgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHNvdXJjZSkgPT4gY29uZkxldmVscy5pbmRleE9mKGdldFNvdXJjZU5hbWUoc291cmNlKSkgPiBsZXZlbEluZGV4LFxuICAgICAgKTtcbiAgICBjb25zdCBjdXJyZW50TGV2ZWxTb3VyY2UgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcigoc291cmNlKSA9PiBnZXRTb3VyY2VOYW1lKHNvdXJjZSkgPT09IGxldmVsKVxuICAgICAgLmF0KDApO1xuICAgIGNvbnN0IGxvd2VyTGV2ZWxTb3VyY2VzID0gY29uZmlnLnV0aWxcbiAgICAgIC5nZXRDb25maWdTb3VyY2VzKClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChzb3VyY2UpID0+IGNvbmZMZXZlbHMuaW5kZXhPZihnZXRTb3VyY2VOYW1lKHNvdXJjZSkpIDwgbGV2ZWxJbmRleCxcbiAgICAgICk7XG5cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIHNjaGVtYSBvYmplY3QgdHJlZSBkZXB0aCBmaXJzdFxuICAgIGNvbnN0IHZhbHVlVHJlZSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICBbXSxcbiAgICAgIGhpZ2hlckxldmVsU291cmNlcyxcbiAgICAgIGN1cnJlbnRMZXZlbFNvdXJjZSxcbiAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICk7XG5cbiAgICByZXR1cm4gdmFsdWVUcmVlO1xuICB9XG5cbiAgLyoqXG4gICAqdHJhdmVyc2VzIHRoZSBjb25maWcgc2NoZW1hIGRlcHRoIGZpcnN0IHRvIHByb2R1Y2UgY2hhcmFjdGVyaXN0aWMgb2JqZWN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEBwYXJhbSB7SUNvbmZpZ1NvdXJjZVtdfSBoaWdoZXJMZXZlbFNvdXJjZXNcbiAgICogQHBhcmFtIHsoSUNvbmZpZ1NvdXJjZSB8IHVuZGVmaW5lZCl9IGN1cnJlbnRMZXZlbFNvdXJjZVxuICAgKiBAcGFyYW0ge0lDb25maWdTb3VyY2VbXX0gbG93ZXJMZXZlbFNvdXJjZXNcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcHJvY2Vzc0NvbmZpZ0ZvckxldmVsTm9kZShcbiAgICBzY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBoaWdoZXJMZXZlbFNvdXJjZXM6IElDb25maWdTb3VyY2VbXSxcbiAgICBjdXJyZW50TGV2ZWxTb3VyY2U6IElDb25maWdTb3VyY2UgfCB1bmRlZmluZWQsXG4gICAgbG93ZXJMZXZlbFNvdXJjZXM6IElDb25maWdTb3VyY2VbXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBjaGlsZE5hbWUgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguY29uY2F0KFtjaGlsZE5hbWVdKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2NoaWxkTmFtZV07XG4gICAgICAvLyBpZiBhIGZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGFuZCB0aHVzIGlzIGEgc3VidHJlZSwgcmVjdXJzZSBvbiBpdC5cbiAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgbGVhZiBhbmQgbmVlZHMgbm8gdHJhdmVyc2FsLlxuICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgICAgIGZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY3VycmVudExldmVsU291cmNlLFxuICAgICAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsnbGFiZWwnXSA9XG4gICAgICAgICAgZmllbGQubGFiZWwgIT0gdW5kZWZpbmVkID8gZmllbGQubGFiZWwgOiBudWxsO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydkZXNjcmlwdGlvbiddID1cbiAgICAgICAgICBmaWVsZC5kZXNjcmlwdGlvbiAhPSB1bmRlZmluZWQgPyBmaWVsZC5kZXNjcmlwdGlvbiA6IG51bGw7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ2RlZmF1bHQnXSA9IGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMoXG4gICAgICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWyd2YWx1ZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBbLi4uKGN1cnJlbnRMZXZlbFNvdXJjZSAhPSB1bmRlZmluZWQgPyBbY3VycmVudExldmVsU291cmNlXSA6IFtdKV0sXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydvdmVycmlkZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgbGlzdCBvZiBjb25maWcgc291cmNlcyB1c2VkIGJ5IG5vZGUgY29uZmlnIHBhY2thZ2UsIG9yZGVyZWQgZnJvbVxuICAgKiB0aGUgbG93ZXN0IHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHJldHVybiAge3N0cmluZ1tdfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Tm9kZUNvbmZpZ0xldmVscyA9IChjb25maWc6IElDb25maWcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfQVBQX0lOU1RBTkNFJyk7XG4gICAgbGV0IGRlcGxveW1lbnQgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfRU5WJyk7XG4gICAgZGVwbG95bWVudCA9IGNvbmZpZy51dGlsLmdldEVudignTk9ERV9DT05GSUdfRU5WJyk7XG4gICAgY29uc3QgZnVsbEhvc3RuYW1lID0gY29uZmlnLnV0aWwuZ2V0RW52KCdIT1NUTkFNRScpO1xuICAgIGNvbnN0IHNob3J0SG9zdG5hbWUgPVxuICAgICAgZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCA/IGZ1bGxIb3N0bmFtZS5zcGxpdCgnLicpWzBdIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29uZmlnTGV2ZWxzID0gW1xuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgZGVmYXVsdC0ke2luc3RhbmNlfWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkID8gW2Ake2RlcGxveW1lbnR9YF0gOiBbXSksXG4gICAgICAuLi4oaW5zdGFuY2UgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7c2hvcnRIb3N0bmFtZX1gXSA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtzaG9ydEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7ZnVsbEhvc3RuYW1lfWBdIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiYgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtkZXBsb3ltZW50fWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7ZnVsbEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICBgbG9jYWxgLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtpbnN0YW5jZX1gXSA6IFtdKSxcbiAgICAgIC4uLihkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgJyROT0RFX0NPTkZJRycsXG4gICAgICAnY3VzdG9tLWVudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgXTtcblxuICAgIHJldHVybiBjb25maWdMZXZlbHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIGNvbmZpZyBvYmplY3QgYW5kIHdyaXRlcyBpdCB0byB0aGUgbm9kZS1jb25maWcgZmlsZVxuICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdPYmpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsIG91dHB1dCBub2RlLWNvbmZpZyBmaWxlIGxldmVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGVcbiAgICovXG4gIHZhbGlkYXRlQW5kV3JpdGVDb25maWcgPSAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWdPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY29uZmlnOiBJQ29uZmlnLFxuICAgIGxldmVsOiBzdHJpbmcsXG4gICAgZm9ybWF0OiBzdHJpbmcsXG4gICkgPT4ge1xuICAgIGNvbnN0IGNvbmZMZXZlbHMgPSBDb25maWdWYWxpZGF0b3IuZ2V0Tm9kZUNvbmZpZ0xldmVscyhjb25maWcpLmZpbHRlcihcbiAgICAgIChsKSA9PiBsICE9PSAnY3VzdG9tLWVudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgKTtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gY29uZkxldmVscy5pbmRleE9mKGxldmVsKTtcbiAgICBpZiAobGV2ZWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBbJHtsZXZlbH1dIGxldmVsIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBzeXN0ZW0ncyBjb25maWd1cmF0aW9uIGxldmVsc2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ0RpciA9XG4gICAgICBwcm9jZXNzLmVudlsnTk9ERV9DT05GSUdfRElSJ10gIT0gdW5kZWZpbmVkXG4gICAgICAgID8gcHJvY2Vzcy5lbnZbJ05PREVfQ09ORklHX0RJUiddXG4gICAgICAgIDogJy4vY29uZmlnJztcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgbGV0IGV4dCA9ICcnO1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlICdqc29uJzoge1xuICAgICAgICBvdXRwdXQgPSBKc29uQmlnSW50LnN0cmluZ2lmeShjb25maWdPYmopO1xuICAgICAgICBleHQgPSAnanNvbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAneWFtbCc6IHtcbiAgICAgICAgb3V0cHV0ID0geWFtbC5kdW1wKGNvbmZpZ09iaik7XG4gICAgICAgIGV4dCA9ICd5YW1sJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBgJHtsZXZlbH0uJHtleHR9YCk7XG4gICAgY29uc3QgYmFja3VwUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIGAke2xldmVsfS1iYWNrdXAuJHtleHR9YCk7XG4gICAgY29uc3QgY29uZkZpbGVFeGlzdHMgPSBmcy5leGlzdHNTeW5jKG91dHB1dFBhdGgpO1xuICAgIGlmIChjb25mRmlsZUV4aXN0cykge1xuICAgICAgZnMucmVuYW1lU3luYyhvdXRwdXRQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBvdXRwdXQpO1xuXG4gICAgY29uc3QgdXBkYXRlZENvbmZPYmogPSBjb25maWcudXRpbC5sb2FkRmlsZUNvbmZpZ3MoKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ29uZmlnKHVwZGF0ZWRDb25mT2JqKTtcbiAgICAgIGZzLnVubGlua1N5bmMoYmFja3VwUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZzLnVubGlua1N5bmMob3V0cHV0UGF0aCk7XG4gICAgICBpZiAoY29uZkZpbGVFeGlzdHMpIHtcbiAgICAgICAgZnMucmVuYW1lU3luYyhiYWNrdXBQYXRoLCBvdXRwdXRQYXRoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==
|
|
928
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sVUFBVSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVMxRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGNBQWMsR0FDZixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLFlBQVksR0FDYixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkUsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFlO0lBRTdCLFlBQW9CLE1BQW9CO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsR0FBUyxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLFVBQWtCLEVBQW1CLEVBQUU7UUFDeEQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7WUFDbkMsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixlQUFlLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxNQUFvQixFQUFtQixFQUFFO1FBQzVELE9BQU8sSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILDhEQUE4RDtJQUN2RCxjQUFjLENBQUMsTUFBMkI7UUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsTUFBTSxFQUNOLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUN6QyxNQUFNLEVBQ04sRUFBRSxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxpQkFBaUI7SUFDdkIsOERBQThEO0lBQzlELE1BQTJCO0lBQzNCLDhEQUE4RDtJQUM5RCxTQUE4QixFQUM5QixTQUF1QixFQUN2QixJQUFjO0lBQ2QsOERBQThEO0lBQzlELE9BQTZCO1FBRTdCLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBbUIsRUFBRSxFQUFFLENBQzVDLGlDQUFpQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFFM0QsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDO2dCQUN0QixJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDN0QsS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztnQkFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0QsdUVBQXVFO2dCQUN2RSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzVCLElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLENBQUMsUUFBUSxFQUNkLFNBQVMsRUFDVCxPQUFPLENBQ1IsQ0FBQztnQkFDSixDQUFDO3FCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7NEJBQ3RDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBRS9DLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0NBQ2xDLElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsTUFBTSxFQUNOLElBQUksRUFDSixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDcEIsUUFBUSxFQUNSLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FDakIsQ0FBQzs0QkFDSixDQUFDO2lDQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0NBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsTUFBTSxFQUNOLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFDaEIsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFDdkIsU0FBUyxDQUNWLENBQUM7NEJBQ0osQ0FBQztpQ0FBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dDQUN4QyxJQUFJLENBQUMsa0JBQWtCLENBQ3JCLElBQUksRUFDSixLQUFLLENBQUMsS0FBSyxFQUNYLE1BQU0sRUFDTixRQUFRLEVBQ1IsSUFBSSxFQUNKLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FDakIsQ0FBQzs0QkFDSixDQUFDO2lDQUFNLENBQUM7Z0NBQ04sdUJBQXVCO2dDQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzs0QkFDMUQsQ0FBQzt3QkFDSCxDQUFDO3dCQUNELGVBQWUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDekQsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakUsQ0FBQztnQkFDRCxJQUNFLEtBQUssS0FBSyxTQUFTO29CQUNuQixLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7b0JBQ3ZCLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTztvQkFDdEIsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQ3RCLENBQUM7b0JBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNoQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQzt3QkFDdEIsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQzs0QkFDM0IsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzt3QkFDMUIsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUNqRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLGtCQUFrQjtJQUN4Qiw4REFBOEQ7SUFDOUQsS0FBVSxFQUNWLEtBQWlCO0lBQ2pCLDhEQUE4RDtJQUM5RCxNQUEyQixFQUMzQixTQUFtQixFQUNuQixJQUFZO0lBQ1osOERBQThEO0lBQzlELE9BQTZCO1FBRTdCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFdEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDO2dCQUNILElBQ0UsV0FBVyxDQUFDLElBQUksS0FBSyxRQUFRO29CQUM3QixPQUFPLEtBQUssS0FBSyxRQUFRO29CQUN6QixLQUFLLElBQUksSUFBSSxFQUNiLENBQUM7b0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNMLFdBQVcsQ0FBQyxRQUFRLEVBQ3BCLFNBQVMsRUFDVCxPQUFPLENBQ1IsQ0FBQztvQkFDRixTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixDQUFDO3FCQUFNLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUN0QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUUvQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDOzRCQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLE1BQU0sRUFDTixJQUFJLEVBQ0osV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQzFCLFFBQVEsRUFDUixJQUFJLENBQ0wsQ0FBQzt3QkFDSixDQUFDOzZCQUFNLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7NEJBQzlDLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsSUFBSSxFQUNKLFdBQVcsQ0FBQyxLQUFLLEVBQ2pCLE1BQU0sRUFDTixRQUFRLEVBQ1IsSUFBSSxFQUNKLElBQUksQ0FDTCxDQUFDO3dCQUNKLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixJQUFJLENBQUMsYUFBYSxDQUNoQixJQUFJLEVBQ0osV0FBVyxDQUFDLEtBQUssRUFDakIsTUFBTSxFQUNOLFFBQVEsRUFDUixJQUFJLENBQ0wsQ0FBQzt3QkFDSixDQUFDO29CQUNILENBQUM7b0JBQ0QsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUN2RCxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixDQUFDO3FCQUFNLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUNyQixLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sRUFDTixTQUFTLEVBQ1QsSUFBSSxFQUNKLE9BQU8sQ0FDUixDQUFDO29CQUNGLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ25CLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDbkUsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDbkIsQ0FBQztnQkFFRCxJQUFJLFNBQVM7b0JBQUUsTUFBTTtZQUN2QixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdkQsT0FBTyxDQUFDLEtBQUssQ0FDWCxjQUFjLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLHFCQUFxQixZQUFZLEdBQUcsQ0FDdEUsQ0FBQztnQkFDRixTQUFTLEdBQUcsU0FBUyxLQUFLLElBQUksQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FBYyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQywyREFBMkQsWUFBWSxpQ0FBaUMsQ0FDMUksQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLFlBQVk7SUFDakIsOERBQThEO0lBQzlELEdBQXdCLEVBQ3hCLFFBQW1CLEVBQ25CLElBQWM7UUFFZCxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDaEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGFBQWEsR0FBRztJQUN0Qiw4REFBOEQ7SUFDOUQsS0FBVSxFQUNWLEtBQWtCO0lBQ2xCLDhEQUE4RDtJQUM5RCxNQUEyQixFQUMzQixJQUFjO0lBQ2QsOERBQThEO0lBQzlELE9BQTZCLEVBQzdCLEVBQUU7UUFDRixJQUFJLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLElBQ0UsT0FBTyxLQUFLLEtBQUssUUFBUTtvQkFDekIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFDcEUsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsc0tBQXNLLENBQy9MLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJLENBQUM7b0JBQ0gsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEIsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxNQUFNLElBQUksS0FBSyxDQUNiLGtCQUFrQixLQUFLLDJCQUEyQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ3BFLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2REFBNkQsQ0FDdEYsQ0FBQztnQkFDSixDQUFDO2dCQUNELEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLElBQ0UsS0FBSyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0I7b0JBQy9CLEtBQUssR0FBRyxNQUFNLENBQUMsZ0JBQWdCLEVBQy9CLENBQUM7b0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYixjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLDJEQUEyRCxDQUN4RixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFDRCxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsSUFDRSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDdkIsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPO1lBQ3RCLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTztZQUN0QixLQUFLLENBQUMsV0FBVyxFQUNqQixDQUFDO1lBQ0QsS0FBSyxNQUFNLFVBQVUsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUN6QyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssT0FBTyxDQUMzQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDO3dCQUNILGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDaEMsS0FBSyxFQUNMLFVBQVUsRUFDVixNQUFNLEVBQ04sSUFBSSxFQUNKLE9BQU8sQ0FDUixDQUFDO29CQUNKLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixJQUFJLFVBQVUsQ0FBQyxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7NEJBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNwQyxDQUFDO3dCQUNELE1BQU0sS0FBSyxDQUFDO29CQUNkLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7T0FPRztJQUNJLFVBQVUsR0FBRyxDQUNsQixJQUFVO0lBQ1YsOERBQThEO0lBQzlELE1BQTJCO0lBQzNCLDhEQUE4RDtJQUM5RCxPQUE2QixFQUNwQixFQUFFO1FBQ1gsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7WUFDekIsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDL0QsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sVUFBVSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6RCxPQUFPLEtBQUssSUFBSSxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7T0FPRztJQUNILDhEQUE4RDtJQUM5RCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsTUFBVyxFQUFFLElBQWMsRUFBRSxFQUFFO1FBQy9DLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUVuQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUN4RSxDQUFDO2lCQUFNLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSyxjQUFjLEdBQUcsR0FBRyxFQUFFO1FBQzVCLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBbUIsRUFBRSxFQUFFLENBQzVDLGlDQUFpQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFFM0QsTUFBTSxLQUFLLEdBR047WUFDSDtnQkFDRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ3RCLFVBQVUsRUFBRSxFQUFFO2FBQ2Y7U0FDRixDQUFDO1FBRUYsbUVBQW1FO1FBQ25FLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUcsQ0FBQztZQUUvQywyQ0FBMkM7WUFDM0MsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUM7b0JBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRTlCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQ2IsaUVBQWlFLENBQ2xFLENBQUM7b0JBQ0osQ0FBQztvQkFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQzVELENBQUM7b0JBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUVoQyw2REFBNkQ7b0JBQzdELGFBQWE7b0JBQ2IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDOzRCQUNULFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUTs0QkFDekIsVUFBVSxFQUFFLElBQUk7eUJBQ2pCLENBQUMsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQzt3QkFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQzs0QkFDVCxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUU7NEJBQ2xDLFVBQVUsRUFBRSxJQUFJO3lCQUNqQixDQUFDLENBQUM7b0JBQ0wsQ0FBQzt5QkFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7d0JBQ2xDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFOzRCQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDO2dDQUNULFNBQVMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLFVBQVUsS0FBSyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUU7Z0NBQ3JELFVBQVUsRUFBRSxJQUFJOzZCQUNqQixDQUFDLENBQUM7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FDYixHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FDNUUsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRjs7OztPQUlHO0lBQ0ssa0JBQWtCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtRQUM1QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkUsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSyxtQkFBbUIsR0FBRyxDQUFDLEtBQWtCLEVBQUUsRUFBRTtRQUNuRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUNFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO2dCQUMzQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQztnQkFDakQsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFDbkQsQ0FBQztnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUQsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsSUFDRSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDdkIsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPO1lBQ3RCLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUN0QixDQUFDO1lBQ0QsS0FBSyxNQUFNLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRjs7Ozs7T0FLRztJQUNILGNBQWMsR0FBRyxDQUFDLElBQWMsRUFBMkIsRUFBRTtRQUMzRCxJQUFJLE9BQU8sR0FBNkIsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNwRCxJQUFJLEtBQUssR0FBNEIsU0FBUyxDQUFDO1FBRS9DLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxLQUE4QixDQUFDO29CQUVuQyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDbkMsSUFDRSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7NEJBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFDbkMsQ0FBQzs0QkFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDN0IsTUFBTTt3QkFDUixDQUFDO29CQUNILENBQUM7b0JBRUQsSUFBSSxDQUFDLEtBQUs7d0JBQUUsT0FBTyxTQUFTLENBQUM7b0JBRTdCLEtBQUssR0FBRyxLQUFLLENBQUM7b0JBRWQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUM1QixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztvQkFDM0IsQ0FBQzt5QkFBTSxJQUNMLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTzt3QkFDdEIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQy9ELENBQUM7d0JBQ0QsT0FBTzs0QkFDTCxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ3JFLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixPQUFPLEdBQUcsU0FBUyxDQUFDO29CQUN0QixDQUFDO29CQUVELFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUV0QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzVCLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUMzQixDQUFDO3FCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDbEMsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO29CQUNqQyxDQUFDO3lCQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7d0JBQ3hDLE9BQU8sR0FBRyxTQUFTLENBQUM7d0JBQ3BCLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUN0QixDQUFDO3lCQUFNLENBQUM7d0JBQ04sT0FBTyxHQUFHLFNBQVMsQ0FBQztvQkFDdEIsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxHQUFHLFNBQVMsQ0FBQztnQkFDdEIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sR0FBRyxTQUFTLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUM1QixJQUFJLEtBQThCLENBQUM7b0JBRW5DLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNuQyxJQUNFLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTs0QkFDdkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUNuQyxDQUFDOzRCQUNELEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUM3QixNQUFNO3dCQUNSLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxJQUFJLENBQUMsS0FBSzt3QkFBRSxPQUFPLFNBQVMsQ0FBQztvQkFFN0IsS0FBSyxHQUFHLEtBQUssQ0FBQztvQkFFZCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQzVCLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO29CQUMzQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sT0FBTyxHQUFHLFNBQVMsQ0FBQztvQkFDdEIsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxTQUFTLENBQUM7Z0JBQ25CLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILDhEQUE4RDtJQUM5RCxlQUFlLEdBQUcsQ0FBQyxPQUFnQyxFQUF1QixFQUFFO1FBQzFFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsK0VBQStFO0lBQ3ZFLHNCQUFzQixHQUFHLENBQy9CLE1BQW9CLEVBRUMsRUFBRTtRQUN2Qiw4REFBOEQ7UUFDOUQsTUFBTSxRQUFRLEdBQXdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDMUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQztnQkFDaEMsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNsQyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQy9CLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ2xDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDOUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ3JCLENBQUM7d0JBQ0YsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBZSxFQUFFLEVBQUU7NEJBQ3BELElBQ0UsSUFBSSxJQUFJLElBQUk7Z0NBQ1osT0FBTyxJQUFJLEtBQUssUUFBUTtnQ0FDeEIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUNwQixDQUFDO2dDQUNELE9BQU8sRUFBRSxHQUFHLFlBQVksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDOzRCQUN0QyxDQUFDOzRCQUNELE9BQU8sSUFBSSxDQUFDO3dCQUNkLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztvQkFDaEMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2hFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxlQUFlLEdBQUcsQ0FBQyxJQUFZLEVBQVUsRUFBRTtRQUN6QyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVoRCxNQUFNLEtBQUssR0FNTjtZQUNIO2dCQUNFLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDdEIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDbEMsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLEVBQUU7YUFDZjtTQUNGLENBQUM7UUFDRiwrQ0FBK0M7UUFDL0MsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO1lBRTFFLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUNwQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7b0JBQ3RELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDakMsQ0FBQztnQkFDRCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1osU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFHLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUMscUVBQXFFO1lBQ3JFLHNFQUFzRTtZQUN0RSxhQUFhO1lBQ2IsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxJQUFJLFNBQVMsR0FBRztnQkFDbEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNkLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO2dCQUVoQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDdEMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO3dCQUMzQixLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFOzRCQUNyQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDcEMsQ0FBQyxDQUFDLENBQUM7d0JBRUgsT0FBTztvQkFDVCxDQUFDO29CQUVELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNuRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFFdkQsS0FBSyxDQUFDLElBQUksQ0FBQzs0QkFDVCxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVE7NEJBQ3pCLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUU7NEJBQy9DLFVBQVUsRUFBRSxVQUFVOzRCQUN0QixRQUFROzRCQUNSLFVBQVUsRUFBRSxFQUFFO3lCQUNmLENBQUMsQ0FBQzt3QkFFSCxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUMxQixPQUFPO29CQUNULENBQUM7b0JBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO3dCQUMzQixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDOzRCQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQy9DLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUVyRCxLQUFLLENBQUMsSUFBSSxDQUFDO2dDQUNULFNBQVMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVE7Z0NBQy9CLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFO2dDQUNyRCxVQUFVLEVBQUUsUUFBUTtnQ0FDcEIsUUFBUTtnQ0FDUixVQUFVLEVBQUUsRUFBRTs2QkFDZixDQUFDLENBQUM7NEJBRUgsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsSUFBSSxDQUFDLENBQUM7d0JBQ25DLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO3dCQUMzQyxDQUFDO3dCQUVELE9BQU87b0JBQ1QsQ0FBQztvQkFFRCxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0QsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUVqRCxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNULFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUTtvQkFDekIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRTtvQkFDL0MsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVE7b0JBQ1IsVUFBVSxFQUFFLEVBQUU7aUJBQ2YsQ0FBQyxDQUFDO2dCQUVILFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzNCLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUVqRCxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUNULFNBQVMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVE7d0JBQy9CLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFO3dCQUNyRCxVQUFVLEVBQUUsSUFBSTt3QkFDaEIsUUFBUTt3QkFDUixVQUFVLEVBQUUsRUFBRTtxQkFDZixDQUFDLENBQUM7b0JBRUgsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsQ0FBQztxQkFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUN4QyxNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7b0JBRWhDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTt3QkFDNUMsSUFDRSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7NEJBQ3ZCLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTs0QkFDdkIsS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQ3hCLENBQUM7NEJBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzVCLE9BQU87d0JBQ1QsQ0FBQzt3QkFFRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7NEJBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDbkQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBRXZELEtBQUssQ0FBQyxJQUFJLENBQUM7Z0NBQ1QsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRO2dDQUN6QixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFO2dDQUMvQyxVQUFVLEVBQUUsVUFBVTtnQ0FDdEIsUUFBUTtnQ0FDUixVQUFVLEVBQUUsRUFBRTs2QkFDZixDQUFDLENBQUM7NEJBRUgsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDMUIsT0FBTzt3QkFDVCxDQUFDO3dCQUVELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQzs0QkFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQ0FDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dDQUNyRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQ0FFckQsS0FBSyxDQUFDLElBQUksQ0FBQztvQ0FDVCxTQUFTLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRO29DQUMvQixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRTtvQ0FDckQsVUFBVSxFQUFFLFFBQVE7b0NBQ3BCLFFBQVE7b0NBQ1IsVUFBVSxFQUFFLEVBQUU7aUNBQ2YsQ0FBQyxDQUFDO2dDQUVILFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQyxDQUFDOzRCQUNuQyxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQzs0QkFDM0MsQ0FBQzs0QkFFRCxPQUFPO3dCQUNULENBQUM7d0JBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlCLENBQUMsQ0FBQyxDQUFDO29CQUVILFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO2dCQUVELFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxTQUFTLEdBQVcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNuQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUMzQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDdkQsU0FBUyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNsRSxDQUFDO29CQUVELElBQUksVUFBVSxJQUFJLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUM7d0JBQ3hELFVBQVUsR0FBRyxLQUFLLENBQUM7b0JBQ3JCLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNkLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsZUFBZTtnQkFDcEQsU0FBUzthQUNWLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzdDLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNLLGNBQWMsR0FBRyxDQUN2QixJQUFZLEVBQ1osVUFBbUMsRUFDM0IsRUFBRTtRQUNWLE9BQU8sb0JBQW9CLElBQUk7SUFDL0IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0VBQ2xFLENBQUM7SUFDRCxDQUFDLENBQUM7SUFFRjs7Ozs7O09BTUc7SUFDSCw4REFBOEQ7SUFDOUQsaUJBQWlCLENBQUMsTUFBZSxFQUFFLEtBQWE7UUFDOUMsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUNiLFFBQVEsS0FBSyw4REFBOEQsQ0FDNUUsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxJQUFJO2FBQ25DLGdCQUFnQixFQUFFO2FBQ2xCLE1BQU0sQ0FDTCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQ25FLENBQUM7UUFDSixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxJQUFJO2FBQ25DLGdCQUFnQixFQUFFO2FBQ2xCLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssQ0FBQzthQUNuRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDVCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxJQUFJO2FBQ2xDLGdCQUFnQixFQUFFO2FBQ2xCLE1BQU0sQ0FDTCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQ25FLENBQUM7UUFFSiwrQ0FBK0M7UUFDL0MsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLHlCQUF5QixDQUN6RCxJQUFJLENBQUMsTUFBTSxFQUNYLEVBQUUsRUFDRixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGlCQUFpQixDQUNsQixDQUFDO1FBRUYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNLLE1BQU0sQ0FBQyx5QkFBeUIsQ0FDdEMsTUFBb0IsRUFDcEIsSUFBYyxFQUNkLGtCQUFtQyxFQUNuQyxrQkFBNkMsRUFDN0MsaUJBQWtDO1FBR2xDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLHFFQUFxRTtZQUNyRSxnREFBZ0Q7WUFDaEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsZUFBZSxDQUFDLHlCQUF5QixDQUMxRCxLQUFLLENBQUMsUUFBUSxFQUNkLFNBQVMsRUFDVCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLGlCQUFpQixDQUNsQixDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUM7b0JBQ3ZCLEtBQUssQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUM7b0JBQzdCLEtBQUssQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzVELEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyx5QkFBeUIsQ0FDckQsaUJBQWlCLEVBQ2pCLFNBQVMsQ0FDVixDQUFDO2dCQUNGLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyx5QkFBeUIsQ0FDbkQsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2xFLFNBQVMsQ0FDVixDQUFDO2dCQUNGLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyx5QkFBeUIsQ0FDdEQsa0JBQWtCLEVBQ2xCLFNBQVMsQ0FDVixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxDQUFDLG1CQUFtQixHQUFHLENBQUMsTUFBZSxFQUFZLEVBQUU7UUFDakUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN6RCxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxNQUFNLGFBQWEsR0FDakIsWUFBWSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRXJFLE1BQU0sWUFBWSxHQUFHO1lBQ25CLFNBQVM7WUFDVCxHQUFHLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxHQUFHLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxHQUFHLENBQUMsUUFBUSxJQUFJLFNBQVMsSUFBSSxVQUFVLElBQUksU0FBUztnQkFDbEQsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQy9CLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxHQUFHLENBQUMsYUFBYSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxHQUFHLENBQUMsYUFBYSxJQUFJLFNBQVMsSUFBSSxRQUFRLElBQUksU0FBUztnQkFDckQsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxHQUFHLENBQUMsYUFBYSxJQUFJLFNBQVMsSUFBSSxVQUFVLElBQUksU0FBUztnQkFDdkQsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxHQUFHLENBQUMsYUFBYSxJQUFJLFNBQVM7Z0JBQzlCLFVBQVUsSUFBSSxTQUFTO2dCQUN2QixRQUFRLElBQUksU0FBUztnQkFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLElBQUksVUFBVSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNoRCxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsR0FBRyxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekQsR0FBRyxDQUFDLFlBQVksSUFBSSxTQUFTLElBQUksUUFBUSxJQUFJLFNBQVM7Z0JBQ3BELENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsR0FBRyxDQUFDLFlBQVksSUFBSSxTQUFTLElBQUksVUFBVSxJQUFJLFNBQVM7Z0JBQ3RELENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsR0FBRyxDQUFDLFlBQVksSUFBSSxTQUFTO2dCQUM3QixVQUFVLElBQUksU0FBUztnQkFDdkIsUUFBUSxJQUFJLFNBQVM7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxJQUFJLFVBQVUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE9BQU87WUFDUCxHQUFHLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxHQUFHLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRCxHQUFHLENBQUMsVUFBVSxJQUFJLFNBQVMsSUFBSSxRQUFRLElBQUksU0FBUztnQkFDbEQsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxjQUFjO1lBQ2QsOEJBQThCO1NBQy9CLENBQUM7UUFFRixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7T0FRRztJQUNILHNCQUFzQixHQUFHO0lBQ3ZCLDhEQUE4RDtJQUM5RCxTQUE4QixFQUM5QixNQUFlLEVBQ2YsS0FBYSxFQUNiLE1BQWMsRUFDZCxFQUFFO1FBQ0YsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FDbkUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyw4QkFBOEIsQ0FDNUMsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUNiLFFBQVEsS0FBSyxnRUFBZ0UsQ0FDOUUsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FDYixPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksU0FBUztZQUN6QyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztZQUNoQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ2pCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxHQUFHLEdBQUcsTUFBTSxDQUFDO2dCQUNiLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5QixHQUFHLEdBQUcsTUFBTSxDQUFDO2dCQUNiLE1BQU07WUFDUixDQUFDO1lBQ0Q7Z0JBQ0UsTUFBTSxLQUFLLENBQUMsbUJBQW1CLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDM0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxLQUFLLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRSxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXJDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFckQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbmZpZywgSUNvbmZpZ1NvdXJjZSB9IGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBKc29uQmlnSW50LCB7IEpzb25CaWdJbnRGYWN0b3J5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmltcG9ydCB7XG4gIENvbmZpZ0ZpZWxkLFxuICBDb25maWdTY2hlbWEsXG4gIFVuaW9uRmllbGQsXG4gIFZhbHVlVHlwZSxcbn0gZnJvbSAnLi9zY2hlbWEvdHlwZXMvZmllbGRzJztcbmltcG9ydCB7IFdoZW4gfSBmcm9tICcuL3NjaGVtYS90eXBlcy92YWxpZGF0aW9ucyc7XG5pbXBvcnQge1xuICBwcm9wZXJ0eVZhbGlkYXRvcnMsXG4gIHN1cHBvcnRlZFR5cGVzLFxufSBmcm9tICcuL3NjaGVtYS9WYWxpZGF0b3JzL2ZpZWxkUHJvcGVydGllcyc7XG5pbXBvcnQge1xuICBnZXRTb3VyY2VOYW1lLFxuICBnZXRWYWx1ZUZyb21Db25maWdTb3VyY2VzLFxuICB0b1Bhc2NhbENhc2UsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdmFsdWVWYWxpZGF0aW9ucywgdmFsdWVWYWxpZGF0b3JzIH0gZnJvbSAnLi92YWx1ZS92YWxpZGF0b3JzJztcblxuZXhwb3J0IGNsYXNzIENvbmZpZ1ZhbGlkYXRvciB7XG4gIHByaXZhdGUgc2NoZW1hOiBDb25maWdTY2hlbWE7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihzY2hlbWE6IENvbmZpZ1NjaGVtYSkge1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMudmFsaWRhdGVTY2hlbWEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGZpbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGJ5IHRyYW5zZm9ybWluZyBhbmQgdmFsaWRhdGluZ1xuICAgKlxuICAgKiAgVCAtIFRoZSB0eXBlIG9mIHRoZSBmaW5hbCBub3JtYWxpemVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7VH0gVGhlIG5vcm1hbGl6ZWQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIGJ1aWxkQ29uZmlncyA9IDxUPigpOiBUID0+IHtcbiAgICBjb25zdCByYXcgPSBjb25maWcudXRpbC50b09iamVjdCgpO1xuICAgIHRoaXMudmFsaWRhdGVDb25maWcocmF3KTtcbiAgICByZXR1cm4gcmF3O1xuICB9O1xuXG4gIC8qKlxuICAgKiBjcmVhdGUgQ29uZmlnVmFsaWRhdG9yIGZyb20gc2NoZW1hIGZpbGUgcGF0aFxuICAgKi9cbiAgc3RhdGljIGZyb21GaWxlID0gKHNjaGVtYVBhdGg6IHN0cmluZyk6IENvbmZpZ1ZhbGlkYXRvciA9PiB7XG4gICAgY29uc3QgcmF3U2NoZW1hRGF0YSA9IGZzLnJlYWRGaWxlU3luYyhzY2hlbWFQYXRoLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGpzb25CaWdJbnQgPSBKc29uQmlnSW50RmFjdG9yeSh7XG4gICAgICBhbHdheXNQYXJzZUFzQmlnOiBmYWxzZSxcbiAgICAgIHVzZU5hdGl2ZUJpZ0ludDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNjaGVtYSA9IGpzb25CaWdJbnQucGFyc2UocmF3U2NoZW1hRGF0YSk7XG4gICAgcmV0dXJuIG5ldyBDb25maWdWYWxpZGF0b3Ioc2NoZW1hKTtcbiAgfTtcblxuICAvKipcbiAgICogY3JlYXRlIENvbmZpZ1ZhbGlkYXRvciBmcm9tIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbmZpZ1NjaGVtYX0gc2NoZW1hXG4gICAqL1xuICBzdGF0aWMgZnJvbVNjaGVtYSA9IChzY2hlbWE6IENvbmZpZ1NjaGVtYSk6IENvbmZpZ1ZhbGlkYXRvciA9PiB7XG4gICAgcmV0dXJuIG5ldyBDb25maWdWYWxpZGF0b3Ioc2NoZW1hKTtcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIHRoZSBwYXNzZWQgY29uZmlnIGFnYWluc3QgdGhlIGluc3RhbmNlJ3Mgc2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgdmFsaWRhdGVDb25maWcoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdGhpcy52YWxpZGF0ZVZhbHVlKFxuICAgICAgY29uZmlnLFxuICAgICAgeyB0eXBlOiAnb2JqZWN0JywgY2hpbGRyZW46IHRoaXMuc2NoZW1hIH0sXG4gICAgICBjb25maWcsXG4gICAgICBbXSxcbiAgICApO1xuXG4gICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhjb25maWcsIGNvbmZpZywgdGhpcy5zY2hlbWEsIFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmF2ZXJzZXMgYW5kIHZhbGlkYXRlcyBhIHN1YmNvbmZpZyB1c2luZyB0aGUgc3Vic2NoZW1hXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gc3ViQ29uZmlnXG4gICAqIEBwYXJhbSB7Q29uZmlnU2NoZW1hfSBzdWJTY2hlbWFcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAbWVtYmVyb2YgQ29uZmlnVmFsaWRhdG9yXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU3ViQ29uZmlnKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3ViQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHN1YlNjaGVtYTogQ29uZmlnU2NoZW1hLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICkge1xuICAgIGNvbnN0IGVycm9yUHJlYW1ibGUgPSAocGF0aDogQXJyYXk8c3RyaW5nPikgPT5cbiAgICAgIGBjb25maWcgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIFwiJHtwYXRoLmpvaW4oJy4nKX1cIiBmaWVsZGA7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKSkge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5jb25jYXQoW25hbWVdKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdWJDb25maWcgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24oc3ViQ29uZmlnLCBuYW1lKSkge1xuICAgICAgICAgIHZhbHVlID0gc3ViQ29uZmlnW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZSh2YWx1ZSwgZmllbGQsIGNvbmZpZywgY2hpbGRQYXRoLCBjb250ZXh0KTtcbiAgICAgICAgLy8gaWYgYSBub2RlL2ZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGFuZCB0aHVzIGlzIGEgc3VidHJlZSwgdHJhdmVyc2UgaXRcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZmllbGQuY2hpbGRyZW4sXG4gICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdmFsdWVbaV07XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1QYXRoID0gY2hpbGRQYXRoLmNvbmNhdChbU3RyaW5nKGkpXSk7XG5cbiAgICAgICAgICAgICAgaWYgKGZpZWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICBmaWVsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICAgIGl0ZW1QYXRoLFxuICAgICAgICAgICAgICAgICAgeyBbbmFtZV06IGl0ZW0gfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLml0ZW1zLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKFxuICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgeyBbbmFtZV06IGl0ZW0gfSxcbiAgICAgICAgICAgICAgICAgIHsgW25hbWVdOiBmaWVsZC5pdGVtcyB9LFxuICAgICAgICAgICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXRlbXMudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVVbmlvblZhbHVlKFxuICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgIGZpZWxkLml0ZW1zLFxuICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgaXRlbVBhdGgsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgeyBbbmFtZV06IGl0ZW0gfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZvciBwcmltaXRpdmUgZmllbGRzXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKGl0ZW0sIGZpZWxkLml0ZW1zLCBjb25maWcsIGl0ZW1QYXRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ29uZmlnVmFsaWRhdG9yLm1vZGlmeU9iamVjdChjb25maWcsIHZhbHVlLCBjaGlsZFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVVuaW9uVmFsdWUodmFsdWUsIGZpZWxkLCBjb25maWcsIGNoaWxkUGF0aCwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHZhbHVlID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBmaWVsZC50eXBlICE9PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIGZpZWxkLnR5cGUgIT09ICdhcnJheScgJiZcbiAgICAgICAgICBmaWVsZC50eXBlICE9PSAndW5pb24nXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChmaWVsZC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gZmllbGQuZGVmYXVsdDtcbiAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgIGlmIChzdWJDb25maWcgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHN1YkNvbmZpZ1tuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke2Vycm9yUHJlYW1ibGUoY2hpbGRQYXRoKX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmF2ZXJzZXMgYW5kIHZhbGlkYXRlcyBhIHVuaW9uIHN1YmNvbmZpZyB1c2luZyB0aGUgc3Vic2NoZW1hXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge1VuaW9uRmllbGR9IGZpZWxkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnXG4gICAqIEBwYXJhbSB7Q29uZmlnU2NoZW1hfSBzdWJTY2hlbWFcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY2hpbGRQYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVW5pb25WYWx1ZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHZhbHVlOiBhbnksXG4gICAgZmllbGQ6IFVuaW9uRmllbGQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2hpbGRQYXRoOiBzdHJpbmdbXSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKSB7XG4gICAgbGV0IGlzTWF0Y2hlZCA9IGZhbHNlO1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIGZvciAoY29uc3QgYWN0aXZlRmllbGQgb2YgZmllbGQuY2hpbGRyZW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBhY3RpdmVGaWVsZC50eXBlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICB2YWx1ZSAhPSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVTdWJDb25maWcoXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGFjdGl2ZUZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aXZlRmllbGQudHlwZSA9PT0gJ2FycmF5JyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2YWx1ZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1QYXRoID0gY2hpbGRQYXRoLmNvbmNhdChbU3RyaW5nKGkpXSk7XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmVGaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKFxuICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIGFjdGl2ZUZpZWxkLml0ZW1zLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGl0ZW1QYXRoLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUZpZWxkLml0ZW1zLnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVVuaW9uVmFsdWUoXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBhY3RpdmVGaWVsZC5pdGVtcyxcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgaXRlbVBhdGgsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgYWN0aXZlRmllbGQuaXRlbXMsXG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgIGl0ZW1QYXRoLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICBpc01hdGNoZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUZpZWxkLnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlVW5pb25WYWx1ZShcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgYWN0aXZlRmllbGQsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKHZhbHVlLCBhY3RpdmVGaWVsZCwgY29uZmlnLCBjaGlsZFBhdGgsIGNvbnRleHQpO1xuICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNNYXRjaGVkKSBicmVhaztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYCR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gO1xuICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgIGBWYWx1ZSBmb3IgXCIke2NoaWxkUGF0aC5qb2luKCcuJyl9XCIgaGFzIHRoaXMgZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfS5gLFxuICAgICAgICApO1xuICAgICAgICBpc01hdGNoZWQgPSBpc01hdGNoZWQgPT09IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc01hdGNoZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhbHVlIGZvciBcIiR7Y2hpbGRQYXRoLmpvaW4oJy4nKX1cIiBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHVuaW9uIHR5cGVzIGZvciB0aGlzIGVycm9yOiAke2Vycm9yTWVzc2FnZX0uIFBsZWFzZSBwcm92aWRlIGEgdmFsaWQgdmFsdWUuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldHMgYW4gb2JqZWN0J3Mgc3BlY2lmaWMgc3VidHJlZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHsqfSBuZXdWYWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEByZXR1cm4geyp9XG4gICAqIEBtZW1iZXJvZiBDb25maWdWYWxpZGF0b3JcbiAgICovXG4gIHN0YXRpYyBtb2RpZnlPYmplY3QoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgbmV3VmFsdWU6IFZhbHVlVHlwZSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IHZhbHVlID0gb2JqO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHBhdGguc2xpY2UoMCwgLTEpKSB7XG4gICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24odmFsdWUsIGtleSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsYXN0S2V5ID0gcGF0aC5hdCgtMSk7XG4gICAgaWYgKGxhc3RLZXkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZVtsYXN0S2V5XSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgYSB2YWx1ZSBpbiBjb25maWcgb2JqZWN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtDb25maWdGaWVsZH0gZmllbGQgdGhlIGZpZWxkIHNwZWNpZmljYXRpb24gaW4gc2NoZW1hXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnIHRoZSBjb25maWcgb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVmFsdWUgPSAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB2YWx1ZTogYW55LFxuICAgIGZpZWxkOiBDb25maWdGaWVsZCxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApID0+IHtcbiAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAodmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCB2YWx1ZSA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRmllbGQgXCIke3BhdGguam9pbignLicpfVwiIGlzIGRlY2xhcmVkIGFzIGEgQmlnSW50LCBidXQgYSBOdW1iZXIgd2FzIHByb3ZpZGVkIHdpdGggaW5zdWZmaWNpZW50IHByZWNpc2lvbi4gVmFsdWVzIGV4Y2VlZGluZyA5MDA3MTk5MjU0NzQwOTkxIG11c3QgYmUgc3VwcGxpZWQgYXMgYSBzdHJpbmcgdG8gZW5zdXJlIGFjY3VyYWN5LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgdmFsdWUsIHBhdGgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGNvbnZlcnQgJHt2YWx1ZX0gdG8gYSBCaWdJbnQgZm9yIGZpZWxkIFwiJHtwYXRoLmpvaW4oJy4nKX1cImAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChpc05hTihOdW1iZXIodmFsdWUpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGaWVsZCBcIiR7cGF0aC5qb2luKCcuJyl9XCIgbXVzdCBiZSBhIHZhbGlkIG51bWJlci4gUGxlYXNlIHByb3ZpZGUgYSBzdWl0YWJsZSBmb3JtYXQuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHZhbHVlID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHxcbiAgICAgICAgICB2YWx1ZSA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBWYWx1ZSBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGlzIHRvbyBsYXJnZSBvciB0b28gc21hbGwuIFBsZWFzZSBlbnRlciBhIHZhbGlkIG51bWJlci5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgQ29uZmlnVmFsaWRhdG9yLm1vZGlmeU9iamVjdChjb25maWcsIHZhbHVlLCBwYXRoKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlVmFsaWRhdG9yc1tmaWVsZC50eXBlXSh2YWx1ZSwgZmllbGQpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZpZWxkLnR5cGUgIT09ICdvYmplY3QnICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAnYXJyYXknICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAndW5pb24nICYmXG4gICAgICBmaWVsZC52YWxpZGF0aW9uc1xuICAgICkge1xuICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uIG9mIGZpZWxkLnZhbGlkYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBPYmplY3Qua2V5cyh2YWxpZGF0aW9uKS5maWx0ZXIoXG4gICAgICAgICAgKGtleSkgPT4ga2V5ICE9PSAnd2hlbicgJiYga2V5ICE9PSAnZXJyb3InLFxuICAgICAgICApWzBdO1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093bih2YWx1ZVZhbGlkYXRpb25zW2ZpZWxkLnR5cGVdLCBuYW1lKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZVZhbGlkYXRpb25zW2ZpZWxkLnR5cGVdW25hbWVdKFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgdmFsaWRhdGlvbixcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24uZXJyb3IgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih2YWxpZGF0aW9uLmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogZGV0ZXJtaW5lcyBpZiBhIHdoZW4gY2xhdXNlIGluIHZhbGlkYXRpb25zIHNlY3Rpb24gb2YgYSBzY2hlbWEgZmllbGQgaXNcbiAgICogc2F0aXNmaWVkXG4gICAqXG4gICAqIEBwYXJhbSB7V2hlbn0gd2hlblxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgcHVibGljIGlzV2hlblRydWUgPSAoXG4gICAgd2hlbjogV2hlbixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICApOiBib29sZWFuID0+IHtcbiAgICBsZXQgcGF0aFBhcnRzID0gd2hlbi5wYXRoLnNwbGl0KCcuJyk7XG4gICAgaWYgKGNvbnRleHQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBsb2NhbFZhbHVlID0gQ29uZmlnVmFsaWRhdG9yLnZhbHVlQXQoY29udGV4dCwgcGF0aFBhcnRzKTtcbiAgICAgIGlmIChsb2NhbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsVmFsdWUgPT09IHdoZW4udmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gQ29uZmlnVmFsaWRhdG9yLnZhbHVlQXQoY29uZmlnLCBwYXRoUGFydHMpO1xuICAgIHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IHdoZW4udmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgdGhlIHZhbHVlIGF0IHNwZWNpZmllZCBwYXRoIGluIGNvbmZpZyBvYmplY3RcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBzdGF0aWMgdmFsdWVBdCA9IChjb25maWc6IGFueSwgcGF0aDogc3RyaW5nW10pID0+IHtcbiAgICBsZXQgdmFsdWUgPSBjb25maWc7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXRoKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoKGl0ZW0pID0+IGl0ZW0/LltrZXldKS5maW5kKCh2KSA9PiB2ICE9PSB1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIHRoaXMuc2NoZW1hIGFuZCB0aHJvd3MgZXhjZXB0aW9uIGlmIGFueSBlcnJvcnMgZm91bmRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWEgPSAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYFNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcblxuICAgIGNvbnN0IHN0YWNrOiBBcnJheTx7XG4gICAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYTtcbiAgICAgIHBhcmVudFBhdGg6IEFycmF5PHN0cmluZz47XG4gICAgfT4gPSBbXG4gICAgICB7XG4gICAgICAgIHN1YlNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgIHBhcmVudFBhdGg6IFtdLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gVHJhdmVyc2VzIHRoZSBzY2hlbWEgb2JqZWN0IHRyZWUgZGVwdGggZmlyc3QgYW5kIHZhbGlkYXRlIGZpZWxkc1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IHN1YlNjaGVtYSwgcGFyZW50UGF0aCB9ID0gc3RhY2sucG9wKCkhO1xuXG4gICAgICAvLyBwcm9jZXNzIGNoaWxkcmVuIG9mIGN1cnJlbnQgb2JqZWN0IGZpZWxkXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcmVudFBhdGguY29uY2F0KFtuYW1lXSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZ05hbWUobmFtZSk7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbbmFtZV07XG5cbiAgICAgICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICd0eXBlJykgfHwgdHlwZW9mIGZpZWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBldmVyeSBzY2hlbWEgZmllbGQgbXVzdCBoYXZlIGEgXCJ0eXBlXCIgcHJvcGVydHkgb2YgdHlwZSBcInN0cmluZ1wiYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlIFwiJHtmaWVsZC50eXBlfVwiYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVNjaGVtYUZpZWxkKGZpZWxkKTtcblxuICAgICAgICAgIC8vIGlmIHRoZSBjaGlsZCBpcyBhbiBvYmplY3QgZmllbGQgaXRzZWxmIGFkZCBpdCB0byBzdGFjayBmb3JcbiAgICAgICAgICAvLyBwcm9jZXNzaW5nXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgc3ViU2NoZW1hOiBmaWVsZC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHN1YlNjaGVtYTogeyBbbmFtZV06IGZpZWxkLml0ZW1zIH0sXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICAgIGZpZWxkLmNoaWxkcmVuLmZvckVhY2goKHVuaW9uQ2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgIHN1YlNjaGVtYTogeyBbYCR7bmFtZX1fdW5pb25fJHtpbmRleH1gXTogdW5pb25DaGlsZCB9LFxuICAgICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke2Vycm9yUHJlYW1ibGUocGF0aCl9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgY29uZmlnIGtleSBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQ29uZmlnTmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBpZiAobmFtZS5pbmNsdWRlcygnLicpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbmZpZyBrZXkgbmFtZSBjYW4gbm90IGNvbnRhaW4gdGhlICcuJyBjaGFyYWN0ZXJgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBwYXNzZWQgc2NoZW1hIGZpZWxkIHN0cnVjdHVyZVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbmZpZ0ZpZWxkfSBmaWVsZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNjaGVtYUZpZWxkID0gKGZpZWxkOiBDb25maWdGaWVsZCkgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZpZWxkKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhT2JqZWN0Lmhhc093bihwcm9wZXJ0eVZhbGlkYXRvcnMuYWxsLCBrZXkpICYmXG4gICAgICAgICFPYmplY3QuaGFzT3duKHByb3BlcnR5VmFsaWRhdG9ycy5wcmltaXRpdmUsIGtleSkgJiZcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzW2ZpZWxkLnR5cGVdLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzY2hlbWEgZmllbGQgaGFzIHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIE9iamVjdC52YWx1ZXMocHJvcGVydHlWYWxpZGF0b3JzLmFsbCkpIHtcbiAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZmllbGQudHlwZSAhPT0gJ29iamVjdCcgJiZcbiAgICAgIGZpZWxkLnR5cGUgIT09ICdhcnJheScgJiZcbiAgICAgIGZpZWxkLnR5cGUgIT09ICd1bmlvbidcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIE9iamVjdC52YWx1ZXMocHJvcGVydHlWYWxpZGF0b3JzLnByaW1pdGl2ZSkpIHtcbiAgICAgICAgdmFsaWRhdG9yKGZpZWxkLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9yc1tmaWVsZC50eXBlXSkpIHtcbiAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgZmllbGQgY29ycmVzcG9uZGluZyB0byBhIHBhdGggaW4gc2NoZW1hIHRyZWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsoQ29uZmlnRmllbGQgfCB1bmRlZmluZWQpfSByZXR1cm5zIHVuZGVmaW5lZCBpZiBmaWVsZCBpcyBub3QgZm91bmRcbiAgICovXG4gIGdldFNjaGVtYUZpZWxkID0gKHBhdGg6IHN0cmluZ1tdKTogQ29uZmlnRmllbGQgfCB1bmRlZmluZWQgPT4ge1xuICAgIGxldCBzdWJUcmVlOiBDb25maWdTY2hlbWEgfCB1bmRlZmluZWQgPSB0aGlzLnNjaGVtYTtcbiAgICBsZXQgZmllbGQ6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhdGgpIHtcbiAgICAgIGlmICghc3ViVHJlZSkge1xuICAgICAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICBsZXQgZm91bmQ6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmaWVsZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjaGlsZC50eXBlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICBPYmplY3QuaGFzT3duKGNoaWxkLmNoaWxkcmVuLCBwYXJ0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZvdW5kID0gY2hpbGQuY2hpbGRyZW5bcGFydF07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZm91bmQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBmaWVsZCA9IGZvdW5kO1xuXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzdWJUcmVlID0gZmllbGQuY2hpbGRyZW47XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgIChmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0JyB8fCBmaWVsZC5pdGVtcy50eXBlID09PSAndW5pb24nKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgc3ViVHJlZSA9XG4gICAgICAgICAgICAgIGZpZWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnID8gZmllbGQuaXRlbXMuY2hpbGRyZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YlRyZWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0Lmhhc093bihzdWJUcmVlLCBwYXJ0KSkge1xuICAgICAgICBmaWVsZCA9IHN1YlRyZWVbcGFydF07XG5cbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgc3ViVHJlZSA9IGZpZWxkLmNoaWxkcmVuO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICBpZiAoZmllbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHN1YlRyZWUgPSBmaWVsZC5pdGVtcy5jaGlsZHJlbjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLml0ZW1zLnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICAgIHN1YlRyZWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmaWVsZCA9IGZpZWxkLml0ZW1zO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJUcmVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgc3ViVHJlZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJUcmVlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICBsZXQgZm91bmQ6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmaWVsZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBjaGlsZC50eXBlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICBPYmplY3QuaGFzT3duKGNoaWxkLmNoaWxkcmVuLCBwYXJ0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGZvdW5kID0gY2hpbGQuY2hpbGRyZW5bcGFydF07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZm91bmQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBmaWVsZCA9IGZvdW5kO1xuXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzdWJUcmVlID0gZmllbGQuY2hpbGRyZW47XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YlRyZWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIGRlZmF1bHQgdmFsdWVzIGZyb20gYSBzY2hlbWFcbiAgICpcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqZWN0IG9mIGRlZmF1bHQgdmFsdWVzXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBnZW5lcmF0ZURlZmF1bHQgPSAob3B0aW9ucz86IHsgdmFsaWRhdGU/OiBib29sZWFuIH0pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICBjb25zdCB2YWx1ZVRyZWUgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEodGhpcy5zY2hlbWEpO1xuICAgIGlmIChvcHRpb25zPy52YWxpZGF0ZSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZyh2YWx1ZVRyZWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVUcmVlO1xuICB9O1xuXG4gIC8vIEJ1aWxkcyBkZWZhdWx0IHZhbHVlcyBmb3IgYSBzY2hlbWEgc3VidHJlZSAob2JqZWN0cyBhbmQgYXJyYXlzKSwgcmVjdXJzaXZlbHlcbiAgcHJpdmF0ZSBidWlsZERlZmF1bHRzRm9yU2NoZW1hID0gKFxuICAgIHNjaGVtYTogQ29uZmlnU2NoZW1hLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4gPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgZGVmYXVsdHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2tleV07XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgY2hpbGREZWZhdWx0cyA9IHRoaXMuYnVpbGREZWZhdWx0c0ZvclNjaGVtYShmaWVsZC5jaGlsZHJlbik7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjaGlsZERlZmF1bHRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZGVmYXVsdHNba2V5XSA9IGNoaWxkRGVmYXVsdHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBpZiAoZmllbGQuZGVmYXVsdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoZmllbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1EZWZhdWx0cyA9IHRoaXMuYnVpbGREZWZhdWx0c0ZvclNjaGVtYShcbiAgICAgICAgICAgICAgZmllbGQuaXRlbXMuY2hpbGRyZW4sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IGZpZWxkLmRlZmF1bHQubWFwKChlbGVtOiBWYWx1ZVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVsZW0gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBlbGVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGVsZW0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLml0ZW1EZWZhdWx0cywgLi4uZWxlbSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBmaWVsZC5kZWZhdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlICE9PSAndW5pb24nICYmIGZpZWxkLmRlZmF1bHQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlZmF1bHRzW2tleV0gPSBmaWVsZC5kZWZhdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIGdlbmVyYXRlcyBjb21wYXRpYmxlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZvciB0aGlzIGluc3RhbmNlJ3Mgc2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHJvb3QgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZW5lcmF0ZVRTVHlwZXMgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCB0eXBlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbWl0dGVkVHlwZU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IHN0YWNrOiBBcnJheTx7XG4gICAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYTtcbiAgICAgIGNoaWxkcmVuOiBzdHJpbmdbXTtcbiAgICAgIHBhcmVudFBhdGg6IHN0cmluZ1tdO1xuICAgICAgdHlwZU5hbWU6IHN0cmluZztcbiAgICAgIGF0dHJpYnV0ZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+O1xuICAgIH0+ID0gW1xuICAgICAge1xuICAgICAgICBzdWJTY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgICBjaGlsZHJlbjogT2JqZWN0LmtleXModGhpcy5zY2hlbWEpLFxuICAgICAgICBwYXJlbnRQYXRoOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IG5hbWUsXG4gICAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgICAgfSxcbiAgICBdO1xuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IHsgc3ViU2NoZW1hLCBjaGlsZHJlbiwgcGFyZW50UGF0aCwgdHlwZU5hbWUsIGF0dHJpYnV0ZXMgfSA9IGN1cnJlbnQ7XG5cbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKCFlbWl0dGVkVHlwZU5hbWVzLmhhcyh0eXBlTmFtZSkpIHtcbiAgICAgICAgICB0eXBlcy5wdXNoKHRoaXMuZ2VuVFNJbnRlcmZhY2UodHlwZU5hbWUsIGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgICBlbWl0dGVkVHlwZU5hbWVzLmFkZCh0eXBlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZE5hbWUgPSBjaGlsZHJlbi5wb3AoKSE7XG4gICAgICBjb25zdCBmaWVsZCA9IHN1YlNjaGVtYVtjaGlsZE5hbWVdO1xuICAgICAgY29uc3QgcGF0aCA9IHBhcmVudFBhdGguY29uY2F0KGNoaWxkTmFtZSk7XG4gICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCBhZGQgaXQgdG9cbiAgICAgIC8vIHRoZSBzdGFjayB0byBiZSB0cmF2ZXJzZWQgbGF0ZXIuIE90aGVyd2lzZSBpdCdzIGEgbGVhZiBhbmQgbmVlZHMgbm9cbiAgICAgIC8vIHRyYXZlcnNhbC5cbiAgICAgIGNvbnN0IGNoaWxkTmFtZVF1b3RlZCA9IGNoaWxkTmFtZS5pbmNsdWRlcygnLScpXG4gICAgICAgID8gYFwiJHtjaGlsZE5hbWV9XCJgXG4gICAgICAgIDogY2hpbGROYW1lO1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgY29uc3QgdW5pb25UeXBlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmaWVsZC5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW4uZm9yRWFjaCgobmVzdGVkQ2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgdW5pb25UeXBlcy5wdXNoKG5lc3RlZENoaWxkLnR5cGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvblBhdGggPSBwYXRoLmNvbmNhdChbYE9wdGlvbiR7aW5kZXh9YF0pO1xuICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBvcHRpb25QYXRoLm1hcCh0b1Bhc2NhbENhc2UpLmpvaW4oJycpO1xuXG4gICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgc3ViU2NoZW1hOiBjaGlsZC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKGNoaWxkLmNoaWxkcmVuKS5yZXZlcnNlKCksXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IG9wdGlvblBhdGgsXG4gICAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB1bmlvblR5cGVzLnB1c2godHlwZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbVBhdGggPSBwYXRoLmNvbmNhdChbYEl0ZW0ke2luZGV4fWBdKTtcbiAgICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBpdGVtUGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdWJTY2hlbWE6IGNoaWxkLml0ZW1zLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhjaGlsZC5pdGVtcy5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgICAgICAgIHBhcmVudFBhdGg6IGl0ZW1QYXRoLFxuICAgICAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB1bmlvblR5cGVzLnB1c2goYCR7dHlwZU5hbWV9W11gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChgJHtjaGlsZC5pdGVtcy50eXBlfVtdYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1bmlvblR5cGVzLnB1c2goY2hpbGQudHlwZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChbY2hpbGROYW1lUXVvdGVkLCB1bmlvblR5cGVzLmpvaW4oJyB8ICcpXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gcGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBzdWJTY2hlbWE6IGZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhmaWVsZC5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgdHlwZU5hbWUsXG4gICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChbY2hpbGROYW1lUXVvdGVkLCB0eXBlTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmIChmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gcGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgc3ViU2NoZW1hOiBmaWVsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhmaWVsZC5pdGVtcy5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW2NoaWxkTmFtZVF1b3RlZCwgYCR7dHlwZU5hbWV9W11gXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXRlbXMudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICAgIGNvbnN0IHVuaW9uVHlwZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICBmaWVsZC5pdGVtcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hpbGQudHlwZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgY2hpbGQudHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgY2hpbGQudHlwZSA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdW5pb25UeXBlcy5wdXNoKGNoaWxkLnR5cGUpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICBjb25zdCBvcHRpb25QYXRoID0gcGF0aC5jb25jYXQoW2BPcHRpb24ke2luZGV4fWBdKTtcbiAgICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBvcHRpb25QYXRoLm1hcCh0b1Bhc2NhbENhc2UpLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgIHN1YlNjaGVtYTogY2hpbGQuY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKGNoaWxkLmNoaWxkcmVuKS5yZXZlcnNlKCksXG4gICAgICAgICAgICAgICAgcGFyZW50UGF0aDogb3B0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICB0eXBlTmFtZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgdW5pb25UeXBlcy5wdXNoKHR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgICBpZiAoY2hpbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUGF0aCA9IHBhdGguY29uY2F0KFtgT3B0aW9uJHtpbmRleH1JdGVtYF0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gaXRlbVBhdGgubWFwKHRvUGFzY2FsQ2FzZSkuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHN1YlNjaGVtYTogY2hpbGQuaXRlbXMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICBjaGlsZHJlbjogT2JqZWN0LmtleXMoY2hpbGQuaXRlbXMuY2hpbGRyZW4pLnJldmVyc2UoKSxcbiAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGg6IGl0ZW1QYXRoLFxuICAgICAgICAgICAgICAgICAgdHlwZU5hbWUsXG4gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChgJHt0eXBlTmFtZX1bXWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChgJHtjaGlsZC5pdGVtcy50eXBlfVtdYCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChjaGlsZC50eXBlKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaChbY2hpbGROYW1lUXVvdGVkLCBgKCR7dW5pb25UeXBlcy5qb2luKCcgfCAnKX0pW11gXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5wdXNoKFtjaGlsZE5hbWVRdW90ZWQsIGAke2ZpZWxkLml0ZW1zLnR5cGV9W11gXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBmaWVsZFR5cGU6IHN0cmluZyA9IGZpZWxkLnR5cGU7XG4gICAgICBsZXQgaXNPcHRpb25hbCA9IHRydWU7XG4gICAgICBpZiAoZmllbGQudmFsaWRhdGlvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YWxpZGF0aW9uIG9mIGZpZWxkLnZhbGlkYXRpb25zKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnICYmICdjaG9pY2VzJyBpbiB2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICBmaWVsZFR5cGUgPSB2YWxpZGF0aW9uLmNob2ljZXMubWFwKChjKSA9PiBgJyR7Y30nYCkuam9pbignIHwgJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCdyZXF1aXJlZCcgaW4gdmFsaWRhdGlvbiAmJiAhKCd3aGVuJyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICAgICAgaXNPcHRpb25hbCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXR0cmlidXRlcy5wdXNoKFtcbiAgICAgICAgaXNPcHRpb25hbCA/IGAke2NoaWxkTmFtZVF1b3RlZH0/YCA6IGNoaWxkTmFtZVF1b3RlZCxcbiAgICAgICAgZmllbGRUeXBlLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzLnJldmVyc2UoKS5qb2luKCdcXG5cXG4nKSArICdcXG4nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZW5lcmF0ZXMgYSBUeXBlU2NyaXB0IGludGVyZmFjZSBkZWZpbml0aW9uIGZvciBwYXNzZWQgbmFtZSBhbmQgYXR0cmlidXRlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5PFtzdHJpbmcsIHN0cmluZ10+fSBhdHRyaWJ1dGVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHByaXZhdGUgZ2VuVFNJbnRlcmZhY2UgPSAoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGF0dHJpYnV0ZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+LFxuICApOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBgZXhwb3J0IGludGVyZmFjZSAke25hbWV9IHtcbiAgJHthdHRyaWJ1dGVzLm1hcCgoYXR0cikgPT4gYCR7YXR0clswXX06ICR7YXR0clsxXX07YCkuam9pbignXFxuICAnKX1cbn1gO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgY2hhcmFjdGVyaXN0aWMgb2JqZWN0IGZvciB2YWx1ZXMgYXQgYSBzcGVjaWZpYyBub2RlIGNvbmZpZyBsZXZlbFxuICAgKlxuICAgKiBAcGFyYW0ge0lDb25maWd9IGNvbmZpZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWxcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGdldENvbmZpZ0ZvckxldmVsKGNvbmZpZzogSUNvbmZpZywgbGV2ZWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IGNvbmZMZXZlbHMgPSBDb25maWdWYWxpZGF0b3IuZ2V0Tm9kZUNvbmZpZ0xldmVscyhjb25maWcpO1xuICAgIGNvbnN0IGxldmVsSW5kZXggPSBjb25mTGV2ZWxzLmluZGV4T2YobGV2ZWwpO1xuICAgIGlmIChsZXZlbEluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIFwiJHtsZXZlbH1cIiBsZXZlbCBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gbGV2ZWxzYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGhpZ2hlckxldmVsU291cmNlcyA9IGNvbmZpZy51dGlsXG4gICAgICAuZ2V0Q29uZmlnU291cmNlcygpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoc291cmNlKSA9PiBjb25mTGV2ZWxzLmluZGV4T2YoZ2V0U291cmNlTmFtZShzb3VyY2UpKSA+IGxldmVsSW5kZXgsXG4gICAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRMZXZlbFNvdXJjZSA9IGNvbmZpZy51dGlsXG4gICAgICAuZ2V0Q29uZmlnU291cmNlcygpXG4gICAgICAuZmlsdGVyKChzb3VyY2UpID0+IGdldFNvdXJjZU5hbWUoc291cmNlKSA9PT0gbGV2ZWwpXG4gICAgICAuYXQoMCk7XG4gICAgY29uc3QgbG93ZXJMZXZlbFNvdXJjZXMgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHNvdXJjZSkgPT4gY29uZkxldmVscy5pbmRleE9mKGdldFNvdXJjZU5hbWUoc291cmNlKSkgPCBsZXZlbEluZGV4LFxuICAgICAgKTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0XG4gICAgY29uc3QgdmFsdWVUcmVlID0gQ29uZmlnVmFsaWRhdG9yLnByb2Nlc3NDb25maWdGb3JMZXZlbE5vZGUoXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIFtdLFxuICAgICAgaGlnaGVyTGV2ZWxTb3VyY2VzLFxuICAgICAgY3VycmVudExldmVsU291cmNlLFxuICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgKTtcblxuICAgIHJldHVybiB2YWx1ZVRyZWU7XG4gIH1cblxuICAvKipcbiAgICp0cmF2ZXJzZXMgdGhlIGNvbmZpZyBzY2hlbWEgZGVwdGggZmlyc3QgdG8gcHJvZHVjZSBjaGFyYWN0ZXJpc3RpYyBvYmplY3RcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge0NvbmZpZ1NjaGVtYX0gc2NoZW1hXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHBhcmFtIHtJQ29uZmlnU291cmNlW119IGhpZ2hlckxldmVsU291cmNlc1xuICAgKiBAcGFyYW0geyhJQ29uZmlnU291cmNlIHwgdW5kZWZpbmVkKX0gY3VycmVudExldmVsU291cmNlXG4gICAqIEBwYXJhbSB7SUNvbmZpZ1NvdXJjZVtdfSBsb3dlckxldmVsU291cmNlc1xuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICAgKiBAbWVtYmVyb2YgQ29uZmlnVmFsaWRhdG9yXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgIHNjaGVtYTogQ29uZmlnU2NoZW1hLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGhpZ2hlckxldmVsU291cmNlczogSUNvbmZpZ1NvdXJjZVtdLFxuICAgIGN1cnJlbnRMZXZlbFNvdXJjZTogSUNvbmZpZ1NvdXJjZSB8IHVuZGVmaW5lZCxcbiAgICBsb3dlckxldmVsU291cmNlczogSUNvbmZpZ1NvdXJjZVtdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHZhbHVlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkTmFtZSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpLnJldmVyc2UoKSkge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5jb25jYXQoW2NoaWxkTmFtZV0pO1xuICAgICAgY29uc3QgZmllbGQgPSBzY2hlbWFbY2hpbGROYW1lXTtcbiAgICAgIC8vIGlmIGEgZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCByZWN1cnNlIG9uIGl0LlxuICAgICAgLy8gT3RoZXJ3aXNlIGl0J3MgYSBsZWFmIGFuZCBuZWVkcyBubyB0cmF2ZXJzYWwuXG4gICAgICB2YWx1ZVtjaGlsZE5hbWVdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdID0gQ29uZmlnVmFsaWRhdG9yLnByb2Nlc3NDb25maWdGb3JMZXZlbE5vZGUoXG4gICAgICAgICAgZmllbGQuY2hpbGRyZW4sXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICAgIGhpZ2hlckxldmVsU291cmNlcyxcbiAgICAgICAgICBjdXJyZW50TGV2ZWxTb3VyY2UsXG4gICAgICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydsYWJlbCddID1cbiAgICAgICAgICBmaWVsZC5sYWJlbCAhPSB1bmRlZmluZWQgPyBmaWVsZC5sYWJlbCA6IG51bGw7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ2Rlc2NyaXB0aW9uJ10gPVxuICAgICAgICAgIGZpZWxkLmRlc2NyaXB0aW9uICE9IHVuZGVmaW5lZCA/IGZpZWxkLmRlc2NyaXB0aW9uIDogbnVsbDtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsnZGVmYXVsdCddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBsb3dlckxldmVsU291cmNlcyxcbiAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ3ZhbHVlJ10gPSBnZXRWYWx1ZUZyb21Db25maWdTb3VyY2VzKFxuICAgICAgICAgIFsuLi4oY3VycmVudExldmVsU291cmNlICE9IHVuZGVmaW5lZCA/IFtjdXJyZW50TGV2ZWxTb3VyY2VdIDogW10pXSxcbiAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ292ZXJyaWRlJ10gPSBnZXRWYWx1ZUZyb21Db25maWdTb3VyY2VzKFxuICAgICAgICAgIGhpZ2hlckxldmVsU291cmNlcyxcbiAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgYSBsaXN0IG9mIGNvbmZpZyBzb3VyY2VzIHVzZWQgYnkgbm9kZSBjb25maWcgcGFja2FnZSwgb3JkZXJlZCBmcm9tXG4gICAqIHRoZSBsb3dlc3QgdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHlcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge0lDb25maWd9IGNvbmZpZ1xuICAgKiBAcmV0dXJuICB7c3RyaW5nW119XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXROb2RlQ29uZmlnTGV2ZWxzID0gKGNvbmZpZzogSUNvbmZpZyk6IHN0cmluZ1tdID0+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGNvbmZpZy51dGlsLmdldEVudignTk9ERV9BUFBfSU5TVEFOQ0UnKTtcbiAgICBsZXQgZGVwbG95bWVudCA9IGNvbmZpZy51dGlsLmdldEVudignTk9ERV9FTlYnKTtcbiAgICBkZXBsb3ltZW50ID0gY29uZmlnLnV0aWwuZ2V0RW52KCdOT0RFX0NPTkZJR19FTlYnKTtcbiAgICBjb25zdCBmdWxsSG9zdG5hbWUgPSBjb25maWcudXRpbC5nZXRFbnYoJ0hPU1ROQU1FJyk7XG4gICAgY29uc3Qgc2hvcnRIb3N0bmFtZSA9XG4gICAgICBmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkID8gZnVsbEhvc3RuYW1lLnNwbGl0KCcuJylbMF0gOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjb25maWdMZXZlbHMgPSBbXG4gICAgICAnZGVmYXVsdCcsXG4gICAgICAuLi4oaW5zdGFuY2UgIT0gdW5kZWZpbmVkID8gW2BkZWZhdWx0LSR7aW5zdGFuY2V9YF0gOiBbXSksXG4gICAgICAuLi4oZGVwbG95bWVudCAhPSB1bmRlZmluZWQgPyBbYCR7ZGVwbG95bWVudH1gXSA6IFtdKSxcbiAgICAgIC4uLihpbnN0YW5jZSAhPSB1bmRlZmluZWQgJiYgZGVwbG95bWVudCAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7ZGVwbG95bWVudH0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCA/IFtgJHtzaG9ydEhvc3RuYW1lfWBdIDogW10pLFxuICAgICAgLi4uKHNob3J0SG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtzaG9ydEhvc3RuYW1lfS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKHNob3J0SG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake3Nob3J0SG9zdG5hbWV9LSR7ZGVwbG95bWVudH1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJlxuICAgICAgZGVwbG95bWVudCAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtzaG9ydEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCA/IFtgJHtmdWxsSG9zdG5hbWV9YF0gOiBbXSksXG4gICAgICAuLi4oZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7ZnVsbEhvc3RuYW1lfS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiYgZGVwbG95bWVudCAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7ZnVsbEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJlxuICAgICAgZGVwbG95bWVudCAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtmdWxsSG9zdG5hbWV9LSR7ZGVwbG95bWVudH0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIGBsb2NhbGAsXG4gICAgICAuLi4oaW5zdGFuY2UgIT0gdW5kZWZpbmVkID8gW2Bsb2NhbC0ke2luc3RhbmNlfWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkID8gW2Bsb2NhbC0ke2RlcGxveW1lbnR9YF0gOiBbXSksXG4gICAgICAuLi4oZGVwbG95bWVudCAhPSB1bmRlZmluZWQgJiYgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Bsb2NhbC0ke2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAnJE5PREVfQ09ORklHJyxcbiAgICAgICdjdXN0b20tZW52aXJvbm1lbnQtdmFyaWFibGVzJyxcbiAgICBdO1xuXG4gICAgcmV0dXJuIGNvbmZpZ0xldmVscztcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIGEgY29uZmlnIG9iamVjdCBhbmQgd3JpdGVzIGl0IHRvIHRoZSBub2RlLWNvbmZpZyBmaWxlXG4gICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhc3NlZCBsZXZlbFxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ09ialxuICAgKiBAcGFyYW0ge0lDb25maWd9IGNvbmZpZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWwgb3V0cHV0IG5vZGUtY29uZmlnIGZpbGUgbGV2ZWxcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZVxuICAgKi9cbiAgdmFsaWRhdGVBbmRXcml0ZUNvbmZpZyA9IChcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbmZpZ09iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb25maWc6IElDb25maWcsXG4gICAgbGV2ZWw6IHN0cmluZyxcbiAgICBmb3JtYXQ6IHN0cmluZyxcbiAgKSA9PiB7XG4gICAgY29uc3QgY29uZkxldmVscyA9IENvbmZpZ1ZhbGlkYXRvci5nZXROb2RlQ29uZmlnTGV2ZWxzKGNvbmZpZykuZmlsdGVyKFxuICAgICAgKGwpID0+IGwgIT09ICdjdXN0b20tZW52aXJvbm1lbnQtdmFyaWFibGVzJyxcbiAgICApO1xuICAgIGNvbnN0IGxldmVsSW5kZXggPSBjb25mTGV2ZWxzLmluZGV4T2YobGV2ZWwpO1xuICAgIGlmIChsZXZlbEluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIFske2xldmVsfV0gbGV2ZWwgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IHN5c3RlbSdzIGNvbmZpZ3VyYXRpb24gbGV2ZWxzYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnRGlyID1cbiAgICAgIHByb2Nlc3MuZW52WydOT0RFX0NPTkZJR19ESVInXSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBwcm9jZXNzLmVudlsnTk9ERV9DT05GSUdfRElSJ11cbiAgICAgICAgOiAnLi9jb25maWcnO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgZXh0ID0gJyc7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgJ2pzb24nOiB7XG4gICAgICAgIG91dHB1dCA9IEpzb25CaWdJbnQuc3RyaW5naWZ5KGNvbmZpZ09iaik7XG4gICAgICAgIGV4dCA9ICdqc29uJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd5YW1sJzoge1xuICAgICAgICBvdXRwdXQgPSB5YW1sLmR1bXAoY29uZmlnT2JqKTtcbiAgICAgICAgZXh0ID0gJ3lhbWwnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGZvcm1hdDogJHtmb3JtYXR9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIGAke2xldmVsfS4ke2V4dH1gKTtcbiAgICBjb25zdCBiYWNrdXBQYXRoID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgYCR7bGV2ZWx9LWJhY2t1cC4ke2V4dH1gKTtcbiAgICBjb25zdCBjb25mRmlsZUV4aXN0cyA9IGZzLmV4aXN0c1N5bmMob3V0cHV0UGF0aCk7XG4gICAgaWYgKGNvbmZGaWxlRXhpc3RzKSB7XG4gICAgICBmcy5yZW5hbWVTeW5jKG91dHB1dFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgIH1cbiAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIG91dHB1dCk7XG5cbiAgICBjb25zdCB1cGRhdGVkQ29uZk9iaiA9IGNvbmZpZy51dGlsLmxvYWRGaWxlQ29uZmlncygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb25maWcodXBkYXRlZENvbmZPYmopO1xuICAgICAgZnMudW5saW5rU3luYyhiYWNrdXBQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZnMudW5saW5rU3luYyhvdXRwdXRQYXRoKTtcbiAgICAgIGlmIChjb25mRmlsZUV4aXN0cykge1xuICAgICAgICBmcy5yZW5hbWVTeW5jKGJhY2t1cFBhdGgsIG91dHB1dFBhdGgpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../lib/value/validators.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CA+D/C,CAAC;
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../lib/value/validators.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CA+D/C,CAAC;AAwBF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAuNhE,CAAC"}
|
package/dist/value/validators.js
CHANGED
|
@@ -59,8 +59,11 @@ export const valueValidators = {
|
|
|
59
59
|
};
|
|
60
60
|
const required = (value, validation,
|
|
61
61
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
|
-
config, configValidator
|
|
63
|
-
|
|
62
|
+
config, configValidator,
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
context) => {
|
|
65
|
+
if (validation.when &&
|
|
66
|
+
!configValidator.isWhenTrue(validation.when, config, context)) {
|
|
64
67
|
return;
|
|
65
68
|
}
|
|
66
69
|
if (validation.required && value == undefined) {
|
|
@@ -202,4 +205,4 @@ export const valueValidations = {
|
|
|
202
205
|
},
|
|
203
206
|
},
|
|
204
207
|
};
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi92YWx1ZS92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQXdCO0lBQ2xELE1BQU0sRUFBRSxDQUNOLEtBQXNDLEVBQ3RDLEtBQXdCLEVBQ3hCLEVBQUU7UUFDRixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN4RCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQzdELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELDZEQUE2RDtJQUM3RCxLQUFLLEVBQUUsQ0FBQyxLQUF1QixFQUFFLE1BQXdCLEVBQUUsRUFBRTtRQUMzRCxNQUFNLGVBQWUsR0FBRztZQUN0QixRQUFRO1lBQ1IsT0FBTztZQUNQLFNBQVM7WUFDVCxPQUFPO1lBQ1AsUUFBUTtZQUNSLFFBQVE7WUFDUixRQUFRO1NBQ1QsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUNiLDZEQUE2RCxDQUM5RCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCw2REFBNkQ7SUFD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aEMsRUFBRTtZQUNGLElBQ0UsS0FBSyxJQUFJLFNBQVM7Z0JBQ2xCLENBQUMsVUFBVSxDQUFDLElBQUk7b0JBQ2QsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFDdkQsQ0FBQztnQkFDRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQztRQUNILENBQUM7UUFDRCxHQUFHLEVBQUUsQ0FDSCxLQUFhLEVBQ2IsVUFBOEI7UUFDOUIsOERBQThEO1FBQzlELE1BQTJCLEVBQzNCLGVBQWdDLEVBQ2hDLEVBQUU7WUFDRixJQUNFLEtBQUssSUFBSSxTQUFTO2dCQUNsQixDQUFDLFVBQVUsQ0FBQyxJQUFJO29CQUNkLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQ3ZELENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUNBQXlDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FDMUQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnVmFsaWRhdG9yIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4uL3NjaGVtYS90eXBlcy9maWVsZHMnO1xuaW1wb3J0IHtcbiAgVkNob2ljZXMsXG4gIFZHcmVhdGVyLFxuICBWR3JlYXRlckVxdWFsLFxuICBWTGVzcyxcbiAgVkxlc3NFcXVhbCxcbiAgVlJlZ2V4LFxuICBWUmVxdWlyZWQsXG59IGZyb20gJy4uL3NjaGVtYS90eXBlcy92YWxpZGF0aW9ucyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsdWVWYWxpZGF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICBvYmplY3Q6IChcbiAgICB2YWx1ZTogUmVjb3JkPHN0cmluZywgdHlwZXMuVmFsdWVUeXBlPixcbiAgICBmaWVsZDogdHlwZXMuT2JqZWN0RmllbGQsXG4gICkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIG11c3QgYmUgb2Ygb2JqZWN0IHR5cGVgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhmaWVsZC5jaGlsZHJlbikpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgaWYgKCFzY2hlbWFLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCIke2tleX1cIiBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSBzY2hlbWFgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgdW5pb246ICh2YWx1ZTogdHlwZXMuVW5pb25GaWVsZCwgX2ZpZWxkOiB0eXBlcy5VbmlvbkZpZWxkKSA9PiB7XG4gICAgY29uc3QgdmFsaWRVbmlvblR5cGVzID0gW1xuICAgICAgJ29iamVjdCcsXG4gICAgICAnYXJyYXknLFxuICAgICAgJ2Jvb2xlYW4nLFxuICAgICAgJ3VuaW9uJyxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgJ251bWJlcicsXG4gICAgICAnYmlnaW50JyxcbiAgICBdO1xuICAgIGlmICghdmFsaWRVbmlvblR5cGVzLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1ZhbHVlIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgdmFsaWQgdW5pb24gY2hpbGRyZW4gdHlwZXMuJyxcbiAgICAgICk7XG4gICAgfVxuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFycmF5OiAodmFsdWU6IEFycmF5PHR5cGVzLlZhbHVlVHlwZT4sIF9maWVsZDogdHlwZXMuQXJyYXlGaWVsZCkgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWUgbXVzdCBiZSBvZiBhcnJheSB0eXBlYCk7XG4gICAgfVxuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHN0cmluZzogKHZhbHVlOiBzdHJpbmcsIF9maWVsZDogdHlwZXMuU3RyaW5nRmllbGQpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBtdXN0IGJlIG9mIHN0cmluZyB0eXBlYCk7XG4gICAgfVxuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGJvb2xlYW46ICh2YWx1ZTogYm9vbGVhbiwgX2ZpZWxkOiB0eXBlcy5Cb29sZWFuRmllbGQpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWUgbXVzdCBiZSBvZiBib29sZWFuIHR5cGVgKTtcbiAgICB9XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbnVtYmVyOiAodmFsdWU6IG51bWJlciwgX2ZpZWxkOiB0eXBlcy5OdW1iZXJGaWVsZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIG11c3QgYmUgb2YgbnVtYmVyIHR5cGVgKTtcbiAgICB9XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYmlnaW50OiAodmFsdWU6IGJpZ2ludCwgX2ZpZWxkOiB0eXBlcy5CaWdJbnRGaWVsZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdiaWdpbnQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIG11c3QgYmUgb2YgYmlnaW50IHR5cGVgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCByZXF1aXJlZCA9IChcbiAgdmFsdWU6IHR5cGVzLlZhbHVlVHlwZSxcbiAgdmFsaWRhdGlvbjogVlJlcXVpcmVkLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuKSA9PiB7XG4gIGlmICh2YWxpZGF0aW9uLndoZW4gJiYgIWNvbmZpZ1ZhbGlkYXRvci5pc1doZW5UcnVlKHZhbGlkYXRpb24ud2hlbiwgY29uZmlnKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh2YWxpZGF0aW9uLnJlcXVpcmVkICYmIHZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndmFsdWUgaXMgcmVxdWlyZWQgYnV0IG5vdCBmb3VuZCBpbiBjb25maWcnKTtcbiAgfVxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCB2YWx1ZVZhbGlkYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgYm9vbGVhbjogeyByZXF1aXJlZCB9LFxuICBzdHJpbmc6IHtcbiAgICByZXF1aXJlZCxcbiAgICByZWdleDogKFxuICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgIHZhbGlkYXRpb246IFZSZWdleCxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKHZhbGlkYXRpb24ucmVnZXgpO1xuICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaChyZSk7XG4gICAgICBpZiAobWF0Y2ggPT0gbnVsbCB8fCBtYXRjaFswXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBzaG91bGQgbWF0Y2ggdGhlIHJlZ2V4PVwiJHt2YWxpZGF0aW9uLnJlZ2V4fVwiYCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjaG9pY2VzOiAoXG4gICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgdmFsaWRhdGlvbjogVkNob2ljZXMsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgY29uZmlnVmFsaWRhdG9yOiBDb25maWdWYWxpZGF0b3IsXG4gICAgKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlID09IHVuZGVmaW5lZCB8fFxuICAgICAgICAodmFsaWRhdGlvbi53aGVuICYmXG4gICAgICAgICAgIWNvbmZpZ1ZhbGlkYXRvci5pc1doZW5UcnVlKHZhbGlkYXRpb24ud2hlbiwgY29uZmlnKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbi5jaG9pY2VzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZhbHVlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGNob2ljZXM9WyR7dmFsaWRhdGlvbi5jaG9pY2VzLmpvaW4oXG4gICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICl9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgbnVtYmVyOiB7XG4gICAgcmVxdWlyZWQsXG4gICAgZ3Q6IChcbiAgICAgIHZhbHVlOiBudW1iZXIsXG4gICAgICB2YWxpZGF0aW9uOiBWR3JlYXRlcjxudW1iZXI+LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKHZhbGlkYXRpb24ud2hlbiAmJlxuICAgICAgICAgICFjb25maWdWYWxpZGF0b3IuaXNXaGVuVHJ1ZSh2YWxpZGF0aW9uLndoZW4sIGNvbmZpZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPD0gdmFsaWRhdGlvbi5ndCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gJHt2YWxpZGF0aW9uLmd0fWApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ3RlOiAoXG4gICAgICB2YWx1ZTogbnVtYmVyLFxuICAgICAgdmFsaWRhdGlvbjogVkdyZWF0ZXJFcXVhbDxudW1iZXI+LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKHZhbGlkYXRpb24ud2hlbiAmJlxuICAgICAgICAgICFjb25maWdWYWxpZGF0b3IuaXNXaGVuVHJ1ZSh2YWxpZGF0aW9uLndoZW4sIGNvbmZpZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPCB2YWxpZGF0aW9uLmd0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHt2YWxpZGF0aW9uLmd0ZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICAgbHQ6IChcbiAgICAgIHZhbHVlOiBudW1iZXIsXG4gICAgICB2YWxpZGF0aW9uOiBWTGVzczxudW1iZXI+LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKHZhbGlkYXRpb24ud2hlbiAmJlxuICAgICAgICAgICFjb25maWdWYWxpZGF0b3IuaXNXaGVuVHJ1ZSh2YWxpZGF0aW9uLndoZW4sIGNvbmZpZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPj0gdmFsaWRhdGlvbi5sdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gJHt2YWxpZGF0aW9uLmx0fWApO1xuICAgICAgfVxuICAgIH0sXG4gICAgbHRlOiAoXG4gICAgICB2YWx1ZTogbnVtYmVyLFxuICAgICAgdmFsaWRhdGlvbjogVkxlc3NFcXVhbDxudW1iZXI+LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKHZhbGlkYXRpb24ud2hlbiAmJlxuICAgICAgICAgICFjb25maWdWYWxpZGF0b3IuaXNXaGVuVHJ1ZSh2YWxpZGF0aW9uLndoZW4sIGNvbmZpZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPiB2YWxpZGF0aW9uLmx0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHt2YWxpZGF0aW9uLmx0ZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGJpZ2ludDoge1xuICAgIHJlcXVpcmVkLFxuICAgIGd0OiAoXG4gICAgICB2YWx1ZTogYmlnaW50LFxuICAgICAgdmFsaWRhdGlvbjogVkdyZWF0ZXI8YmlnaW50PixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlIDw9IHZhbGlkYXRpb24uZ3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuICR7dmFsaWRhdGlvbi5ndH1gKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGd0ZTogKFxuICAgICAgdmFsdWU6IGJpZ2ludCxcbiAgICAgIHZhbGlkYXRpb246IFZHcmVhdGVyRXF1YWw8YmlnaW50PixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlIDwgdmFsaWRhdGlvbi5ndGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7dmFsaWRhdGlvbi5ndGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGx0OiAoXG4gICAgICB2YWx1ZTogYmlnaW50LFxuICAgICAgdmFsaWRhdGlvbjogVkxlc3M8YmlnaW50PixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID49IHZhbGlkYXRpb24ubHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuICR7dmFsaWRhdGlvbi5sdH1gKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGx0ZTogKFxuICAgICAgdmFsdWU6IGJpZ2ludCxcbiAgICAgIHZhbGlkYXRpb246IFZMZXNzRXF1YWw8YmlnaW50PixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID4gdmFsaWRhdGlvbi5sdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7dmFsaWRhdGlvbi5sdGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufTtcbiJdfQ==
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi92YWx1ZS92YWxpZGF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVlBLDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQXdCO0lBQ2xELE1BQU0sRUFBRSxDQUNOLEtBQXNDLEVBQ3RDLEtBQXdCLEVBQ3hCLEVBQUU7UUFDRixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN4RCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQzdELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELDZEQUE2RDtJQUM3RCxLQUFLLEVBQUUsQ0FBQyxLQUF1QixFQUFFLE1BQXdCLEVBQUUsRUFBRTtRQUMzRCxNQUFNLGVBQWUsR0FBRztZQUN0QixRQUFRO1lBQ1IsT0FBTztZQUNQLFNBQVM7WUFDVCxPQUFPO1lBQ1AsUUFBUTtZQUNSLFFBQVE7WUFDUixRQUFRO1NBQ1QsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUNiLDZEQUE2RCxDQUM5RCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCw2REFBNkQ7SUFDN0QsS0FBSyxFQUFFLENBQUMsS0FBNkIsRUFBRSxNQUF3QixFQUFFLEVBQUU7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFDRCw2REFBNkQ7SUFDN0QsTUFBTSxFQUFFLENBQUMsS0FBYSxFQUFFLE1BQXlCLEVBQUUsRUFBRTtRQUNuRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUNELDZEQUE2RDtJQUM3RCxPQUFPLEVBQUUsQ0FBQyxLQUFjLEVBQUUsTUFBMEIsRUFBRSxFQUFFO1FBQ3RELElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBQ0QsNkRBQTZEO0lBQzdELE1BQU0sRUFBRSxDQUFDLEtBQWEsRUFBRSxNQUF5QixFQUFFLEVBQUU7UUFDbkQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFDRCw2REFBNkQ7SUFDN0QsTUFBTSxFQUFFLENBQUMsS0FBYSxFQUFFLE1BQXlCLEVBQUUsRUFBRTtRQUNuRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRyxDQUNmLEtBQXNCLEVBQ3RCLFVBQXFCO0FBQ3JCLDhEQUE4RDtBQUM5RCxNQUEyQixFQUMzQixlQUFnQztBQUNoQyw4REFBOEQ7QUFDOUQsT0FBNkIsRUFDN0IsRUFBRTtJQUNGLElBQ0UsVUFBVSxDQUFDLElBQUk7UUFDZixDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQzdELENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLFFBQVEsSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRiw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQXdDO0lBQ25FLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRTtJQUNyQixNQUFNLEVBQUU7UUFDTixRQUFRO1FBQ1IsS0FBSyxFQUFFLENBQ0wsS0FBYSxFQUNiLFVBQWtCO1FBQ2xCLDhEQUE4RDtRQUM5RCxNQUEyQixFQUMzQixlQUFnQyxFQUNoQyxFQUFFO1lBQ0YsSUFDRSxLQUFLLElBQUksU0FBUztnQkFDbEIsQ0FBQyxVQUFVLENBQUMsSUFBSTtvQkFDZCxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUN2RCxDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUIsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsVUFBVSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDeEUsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FDUCxLQUFhLEVBQ2IsVUFBb0I7UUFDcEIsOERBQThEO1FBQzlELE1BQTJCLEVBQzNCLGVBQWdDLEVBQ2hDLEVBQUU7WUFDRixJQUNFLEtBQUssSUFBSSxTQUFTO2dCQUNsQixDQUFDLFVBQVUsQ0FBQyxJQUFJO29CQUNkLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQ3ZELENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDYix1Q0FBdUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzVELElBQUksQ0FDTCxHQUFHLENBQ0wsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0tBQ0Y7SUFDRCxNQUFNLEVBQUU7UUFDTixRQUFRO1FBQ1IsRUFBRSxFQUFFLENBQ0YsS0FBYSxFQUNiLFVBQTRCO1FBQzVCLDhEQUE4RDtRQUM5RCxNQUEyQixFQUMzQixlQUFnQyxFQUNoQyxFQUFFO1lBQ0YsSUFDRSxLQUFLLElBQUksU0FBUztnQkFDbEIsQ0FBQyxVQUFVLENBQUMsSUFBSTtvQkFDZCxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUN2RCxDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0gsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUNILEtBQWEsRUFDYixVQUFpQztRQUNqQyw4REFBOEQ7UUFDOUQsTUFBMkIsRUFDM0IsZUFBZ0MsRUFDaEMsRUFBRTtZQUNGLElBQ0UsS0FBSyxJQUFJLFNBQVM7Z0JBQ2xCLENBQUMsVUFBVSxDQUFDLElBQUk7b0JBQ2QsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFDdkQsQ0FBQztnQkFDRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYiw0Q0FBNEMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUM3RCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxFQUFFLEVBQUUsQ0FDRixLQUFhLEVBQ2IsVUFBeUI7UUFDekIsOERBQThEO1FBQzlELE1BQTJCLEVBQzNCLGVBQWdDLEVBQ2hDLEVBQUU7WUFDRixJQUNFLEtBQUssSUFBSSxTQUFTO2dCQUNsQixDQUFDLFVBQVUsQ0FBQyxJQUFJO29CQUNkLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQ3ZELENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLEtBQUssSUFBSSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDO1FBQ0QsR0FBRyxFQUFFLENBQ0gsS0FBYSxFQUNiLFVBQThCO1FBQzlCLDhEQUE4RDtRQUM5RCxNQUEyQixFQUMzQixlQUFnQyxFQUNoQyxFQUFFO1lBQ0YsSUFDRSxLQUFLLElBQUksU0FBUztnQkFDbEIsQ0FBQyxVQUFVLENBQUMsSUFBSTtvQkFDZCxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUN2RCxDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLHlDQUF5QyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQzFELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztLQUNGO0lBQ0QsTUFBTSxFQUFFO1FBQ04sUUFBUTtRQUNSLEVBQUUsRUFBRSxDQUNGLEtBQWEsRUFDYixVQUE0QjtRQUM1Qiw4REFBOEQ7UUFDOUQsTUFBMkIsRUFDM0IsZUFBZ0MsRUFDaEMsRUFBRTtZQUNGLElBQ0UsS0FBSyxJQUFJLFNBQVM7Z0JBQ2xCLENBQUMsVUFBVSxDQUFDLElBQUk7b0JBQ2QsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFDdkQsQ0FBQztnQkFDRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNILENBQUM7UUFDRCxHQUFHLEVBQUUsQ0FDSCxLQUFhLEVBQ2IsVUFBaUM7UUFDakMsOERBQThEO1FBQzlELE1BQTJCLEVBQzNCLGVBQWdDLEVBQ2hDLEVBQUU7WUFDRixJQUNFLEtBQUssSUFBSSxTQUFTO2dCQUNsQixDQUFDLFVBQVUsQ0FBQyxJQUFJO29CQUNkLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQ3ZELENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNENBQTRDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FDN0QsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsRUFBRSxFQUFFLENBQ0YsS0FBYSxFQUNiLFVBQXlCO1FBQ3pCLDhEQUE4RDtRQUM5RCxNQUEyQixFQUMzQixlQUFnQyxFQUNoQyxFQUFFO1lBQ0YsSUFDRSxLQUFLLElBQUksU0FBUztnQkFDbEIsQ0FBQyxVQUFVLENBQUMsSUFBSTtvQkFDZCxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUN2RCxDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRSxDQUFDO1FBQ0gsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUNILEtBQWEsRUFDYixVQUE4QjtRQUM5Qiw4REFBOEQ7UUFDOUQsTUFBMkIsRUFDM0IsZUFBZ0MsRUFDaEMsRUFBRTtZQUNGLElBQ0UsS0FBSyxJQUFJLFNBQVM7Z0JBQ2xCLENBQUMsVUFBVSxDQUFDLElBQUk7b0JBQ2QsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFDdkQsQ0FBQztnQkFDRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYix5Q0FBeUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUMxRCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25maWdWYWxpZGF0b3IgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi4vc2NoZW1hL3R5cGVzL2ZpZWxkcyc7XG5pbXBvcnQge1xuICBWQ2hvaWNlcyxcbiAgVkdyZWF0ZXIsXG4gIFZHcmVhdGVyRXF1YWwsXG4gIFZMZXNzLFxuICBWTGVzc0VxdWFsLFxuICBWUmVnZXgsXG4gIFZSZXF1aXJlZCxcbn0gZnJvbSAnLi4vc2NoZW1hL3R5cGVzL3ZhbGlkYXRpb25zJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCB2YWx1ZVZhbGlkYXRvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gIG9iamVjdDogKFxuICAgIHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB0eXBlcy5WYWx1ZVR5cGU+LFxuICAgIGZpZWxkOiB0eXBlcy5PYmplY3RGaWVsZCxcbiAgKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWUgbXVzdCBiZSBvZiBvYmplY3QgdHlwZWApO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGZpZWxkLmNoaWxkcmVuKSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XG4gICAgICBpZiAoIXNjaGVtYUtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7a2V5fVwiIGtleSBpcyBub3QgZm91bmQgaW4gdGhlIHNjaGVtYWApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB1bmlvbjogKHZhbHVlOiB0eXBlcy5VbmlvbkZpZWxkLCBfZmllbGQ6IHR5cGVzLlVuaW9uRmllbGQpID0+IHtcbiAgICBjb25zdCB2YWxpZFVuaW9uVHlwZXMgPSBbXG4gICAgICAnb2JqZWN0JyxcbiAgICAgICdhcnJheScsXG4gICAgICAnYm9vbGVhbicsXG4gICAgICAndW5pb24nLFxuICAgICAgJ3N0cmluZycsXG4gICAgICAnbnVtYmVyJyxcbiAgICAgICdiaWdpbnQnLFxuICAgIF07XG4gICAgaWYgKCF2YWxpZFVuaW9uVHlwZXMuaW5jbHVkZXModHlwZW9mIHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVmFsdWUgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSB2YWxpZCB1bmlvbiBjaGlsZHJlbiB0eXBlcy4nLFxuICAgICAgKTtcbiAgICB9XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXJyYXk6ICh2YWx1ZTogQXJyYXk8dHlwZXMuVmFsdWVUeXBlPiwgX2ZpZWxkOiB0eXBlcy5BcnJheUZpZWxkKSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBtdXN0IGJlIG9mIGFycmF5IHR5cGVgKTtcbiAgICB9XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgc3RyaW5nOiAodmFsdWU6IHN0cmluZywgX2ZpZWxkOiB0eXBlcy5TdHJpbmdGaWVsZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIG11c3QgYmUgb2Ygc3RyaW5nIHR5cGVgKTtcbiAgICB9XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYm9vbGVhbjogKHZhbHVlOiBib29sZWFuLCBfZmllbGQ6IHR5cGVzLkJvb2xlYW5GaWVsZCkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBtdXN0IGJlIG9mIGJvb2xlYW4gdHlwZWApO1xuICAgIH1cbiAgfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBudW1iZXI6ICh2YWx1ZTogbnVtYmVyLCBfZmllbGQ6IHR5cGVzLk51bWJlckZpZWxkKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWUgbXVzdCBiZSBvZiBudW1iZXIgdHlwZWApO1xuICAgIH1cbiAgfSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBiaWdpbnQ6ICh2YWx1ZTogYmlnaW50LCBfZmllbGQ6IHR5cGVzLkJpZ0ludEZpZWxkKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2JpZ2ludCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWUgbXVzdCBiZSBvZiBiaWdpbnQgdHlwZWApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlcXVpcmVkID0gKFxuICB2YWx1ZTogdHlwZXMuVmFsdWVUeXBlLFxuICB2YWxpZGF0aW9uOiBWUmVxdWlyZWQsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgY29uZmlnVmFsaWRhdG9yOiBDb25maWdWYWxpZGF0b3IsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKSA9PiB7XG4gIGlmIChcbiAgICB2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcsIGNvbnRleHQpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh2YWxpZGF0aW9uLnJlcXVpcmVkICYmIHZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndmFsdWUgaXMgcmVxdWlyZWQgYnV0IG5vdCBmb3VuZCBpbiBjb25maWcnKTtcbiAgfVxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCB2YWx1ZVZhbGlkYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgYm9vbGVhbjogeyByZXF1aXJlZCB9LFxuICBzdHJpbmc6IHtcbiAgICByZXF1aXJlZCxcbiAgICByZWdleDogKFxuICAgICAgdmFsdWU6IHN0cmluZyxcbiAgICAgIHZhbGlkYXRpb246IFZSZWdleCxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKHZhbGlkYXRpb24ucmVnZXgpO1xuICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5tYXRjaChyZSk7XG4gICAgICBpZiAobWF0Y2ggPT0gbnVsbCB8fCBtYXRjaFswXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBzaG91bGQgbWF0Y2ggdGhlIHJlZ2V4PVwiJHt2YWxpZGF0aW9uLnJlZ2V4fVwiYCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjaG9pY2VzOiAoXG4gICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgdmFsaWRhdGlvbjogVkNob2ljZXMsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgY29uZmlnVmFsaWRhdG9yOiBDb25maWdWYWxpZGF0b3IsXG4gICAgKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlID09IHVuZGVmaW5lZCB8fFxuICAgICAgICAodmFsaWRhdGlvbi53aGVuICYmXG4gICAgICAgICAgIWNvbmZpZ1ZhbGlkYXRvci5pc1doZW5UcnVlKHZhbGlkYXRpb24ud2hlbiwgY29uZmlnKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdGlvbi5jaG9pY2VzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZhbHVlIHNob3VsZCBiZSBvbmUgb2YgdGhlIGNob2ljZXM9WyR7dmFsaWRhdGlvbi5jaG9pY2VzLmpvaW4oXG4gICAgICAgICAgICAnLCAnLFxuICAgICAgICAgICl9XWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgbnVtYmVyOiB7XG4gICAgcmVxdWlyZWQsXG4gICAgZ3Q6IChcbiAgICAgIHZhbHVlOiBudW1iZXIsXG4gICAgICB2YWxpZGF0aW9uOiBWR3JlYXRlcjxudW1iZXI+LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKHZhbGlkYXRpb24ud2hlbiAmJlxuICAgICAgICAgICFjb25maWdWYWxpZGF0b3IuaXNXaGVuVHJ1ZSh2YWxpZGF0aW9uLndoZW4sIGNvbmZpZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPD0gdmFsaWRhdGlvbi5ndCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gJHt2YWxpZGF0aW9uLmd0fWApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ3RlOiAoXG4gICAgICB2YWx1ZTogbnVtYmVyLFxuICAgICAgdmFsaWRhdGlvbjogVkdyZWF0ZXJFcXVhbDxudW1iZXI+LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKHZhbGlkYXRpb24ud2hlbiAmJlxuICAgICAgICAgICFjb25maWdWYWxpZGF0b3IuaXNXaGVuVHJ1ZSh2YWxpZGF0aW9uLndoZW4sIGNvbmZpZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPCB2YWxpZGF0aW9uLmd0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZhbHVlIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHt2YWxpZGF0aW9uLmd0ZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICAgbHQ6IChcbiAgICAgIHZhbHVlOiBudW1iZXIsXG4gICAgICB2YWxpZGF0aW9uOiBWTGVzczxudW1iZXI+LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKHZhbGlkYXRpb24ud2hlbiAmJlxuICAgICAgICAgICFjb25maWdWYWxpZGF0b3IuaXNXaGVuVHJ1ZSh2YWxpZGF0aW9uLndoZW4sIGNvbmZpZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPj0gdmFsaWRhdGlvbi5sdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gJHt2YWxpZGF0aW9uLmx0fWApO1xuICAgICAgfVxuICAgIH0sXG4gICAgbHRlOiAoXG4gICAgICB2YWx1ZTogbnVtYmVyLFxuICAgICAgdmFsaWRhdGlvbjogVkxlc3NFcXVhbDxudW1iZXI+LFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAgIGNvbmZpZ1ZhbGlkYXRvcjogQ29uZmlnVmFsaWRhdG9yLFxuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKHZhbGlkYXRpb24ud2hlbiAmJlxuICAgICAgICAgICFjb25maWdWYWxpZGF0b3IuaXNXaGVuVHJ1ZSh2YWxpZGF0aW9uLndoZW4sIGNvbmZpZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPiB2YWxpZGF0aW9uLmx0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHt2YWxpZGF0aW9uLmx0ZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIGJpZ2ludDoge1xuICAgIHJlcXVpcmVkLFxuICAgIGd0OiAoXG4gICAgICB2YWx1ZTogYmlnaW50LFxuICAgICAgdmFsaWRhdGlvbjogVkdyZWF0ZXI8YmlnaW50PixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlIDw9IHZhbGlkYXRpb24uZ3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuICR7dmFsaWRhdGlvbi5ndH1gKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGd0ZTogKFxuICAgICAgdmFsdWU6IGJpZ2ludCxcbiAgICAgIHZhbGlkYXRpb246IFZHcmVhdGVyRXF1YWw8YmlnaW50PixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlIDwgdmFsaWRhdGlvbi5ndGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7dmFsaWRhdGlvbi5ndGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGx0OiAoXG4gICAgICB2YWx1ZTogYmlnaW50LFxuICAgICAgdmFsaWRhdGlvbjogVkxlc3M8YmlnaW50PixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID49IHZhbGlkYXRpb24ubHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuICR7dmFsaWRhdGlvbi5sdH1gKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGx0ZTogKFxuICAgICAgdmFsdWU6IGJpZ2ludCxcbiAgICAgIHZhbGlkYXRpb246IFZMZXNzRXF1YWw8YmlnaW50PixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgICBjb25maWdWYWxpZGF0b3I6IENvbmZpZ1ZhbGlkYXRvcixcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICh2YWxpZGF0aW9uLndoZW4gJiZcbiAgICAgICAgICAhY29uZmlnVmFsaWRhdG9yLmlzV2hlblRydWUodmFsaWRhdGlvbi53aGVuLCBjb25maWcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID4gdmFsaWRhdGlvbi5sdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7dmFsaWRhdGlvbi5sdGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufTtcbiJdfQ==
|