@rosen-bridge/config 1.2.0 → 2.0.0-d62d28de
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 +15 -0
- package/dist/cli.js +7 -7
- package/dist/config.d.ts +34 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +427 -92
- package/dist/schema/Validators/fieldProperties.d.ts +3 -0
- package/dist/schema/Validators/fieldProperties.d.ts.map +1 -1
- package/dist/schema/Validators/fieldProperties.js +12 -1
- package/dist/schema/types/fields.d.ts +11 -2
- package/dist/schema/types/fields.d.ts.map +1 -1
- package/dist/schema/types/fields.js +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -2
- package/dist/value/validators.d.ts.map +1 -1
- package/dist/value/validators.js +55 -13
- package/package.json +9 -12
package/dist/config.js
CHANGED
|
@@ -1,23 +1,56 @@
|
|
|
1
|
+
import config from 'config';
|
|
1
2
|
import * as fs from 'fs';
|
|
2
3
|
import * as yaml from 'js-yaml';
|
|
3
4
|
import path from 'path';
|
|
5
|
+
import JsonBigInt, { JsonBigIntFactory } from '@rosen-bridge/json-bigint';
|
|
4
6
|
import { propertyValidators, supportedTypes, } from './schema/Validators/fieldProperties';
|
|
5
7
|
import { getSourceName, getValueFromConfigSources, toPascalCase, } from './utils';
|
|
6
8
|
import { valueValidations, valueValidators } from './value/validators';
|
|
7
|
-
import JsonBigInt from '@rosen-bridge/json-bigint';
|
|
8
9
|
export class ConfigValidator {
|
|
9
10
|
schema;
|
|
10
11
|
constructor(schema) {
|
|
11
12
|
this.schema = schema;
|
|
12
13
|
this.validateSchema();
|
|
13
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Builds and returns the final configuration object by transforming and validating
|
|
17
|
+
*
|
|
18
|
+
* T - The type of the final normalized configuration object.
|
|
19
|
+
* @returns {T} The normalized configuration object
|
|
20
|
+
*/
|
|
21
|
+
buildConfigs = () => {
|
|
22
|
+
const raw = config.util.toObject();
|
|
23
|
+
this.validateConfig(raw);
|
|
24
|
+
return raw;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* create ConfigValidator from schema file path
|
|
28
|
+
*/
|
|
29
|
+
static fromFile = (schemaPath) => {
|
|
30
|
+
const rawSchemaData = fs.readFileSync(schemaPath, 'utf-8');
|
|
31
|
+
const jsonBigInt = JsonBigIntFactory({
|
|
32
|
+
alwaysParseAsBig: false,
|
|
33
|
+
useNativeBigInt: true,
|
|
34
|
+
});
|
|
35
|
+
const schema = jsonBigInt.parse(rawSchemaData);
|
|
36
|
+
return new ConfigValidator(schema);
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* create ConfigValidator from schema
|
|
40
|
+
*
|
|
41
|
+
* @param {ConfigSchema} schema
|
|
42
|
+
*/
|
|
43
|
+
static fromSchema = (schema) => {
|
|
44
|
+
return new ConfigValidator(schema);
|
|
45
|
+
};
|
|
14
46
|
/**
|
|
15
47
|
* validates the passed config against the instance's schema
|
|
16
48
|
*
|
|
17
49
|
* @param {Record<string, any>} config
|
|
18
50
|
*/
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
52
|
validateConfig(config) {
|
|
20
|
-
this.validateValue(config, { type: 'object', children: this.schema }, config);
|
|
53
|
+
this.validateValue(config, { type: 'object', children: this.schema }, config, []);
|
|
21
54
|
this.validateSubConfig(config, config, this.schema, []);
|
|
22
55
|
}
|
|
23
56
|
/**
|
|
@@ -30,7 +63,13 @@ export class ConfigValidator {
|
|
|
30
63
|
* @param {string[]} path
|
|
31
64
|
* @memberof ConfigValidator
|
|
32
65
|
*/
|
|
33
|
-
validateSubConfig(
|
|
66
|
+
validateSubConfig(
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
config,
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
subConfig, subSchema, path,
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
72
|
+
context) {
|
|
34
73
|
const errorPreamble = (path) => `config validation failed for "${path.join('.')}" field`;
|
|
35
74
|
for (const name of Object.keys(subSchema)) {
|
|
36
75
|
const childPath = path.concat([name]);
|
|
@@ -40,26 +79,120 @@ export class ConfigValidator {
|
|
|
40
79
|
if (subConfig != undefined && Object.hasOwn(subConfig, name)) {
|
|
41
80
|
value = subConfig[name];
|
|
42
81
|
}
|
|
43
|
-
this.validateValue(value, field, config);
|
|
82
|
+
this.validateValue(value, field, config, childPath, context);
|
|
44
83
|
// if a node/field is of type object and thus is a subtree, traverse it
|
|
45
84
|
if (field.type === 'object') {
|
|
46
|
-
this.validateSubConfig(config, value, field.children, childPath);
|
|
85
|
+
this.validateSubConfig(config, value, field.children, childPath, context);
|
|
47
86
|
}
|
|
48
87
|
else if (field.type === 'array') {
|
|
49
88
|
if (Array.isArray(value)) {
|
|
50
|
-
for (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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);
|
|
97
|
+
}
|
|
98
|
+
else if (field.items.type === 'union') {
|
|
99
|
+
this.validateUnionValue(item, field.items, config, itemPath, name, { [name]: item });
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// for primitive fields
|
|
103
|
+
this.validateValue(item, field.items, config, itemPath);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
ConfigValidator.modifyObject(config, value, childPath);
|
|
107
|
+
}
|
|
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;
|
|
54
121
|
}
|
|
55
122
|
}
|
|
56
123
|
}
|
|
57
124
|
}
|
|
58
125
|
catch (error) {
|
|
59
|
-
throw new Error(`${errorPreamble(childPath)}: ${error.message}`);
|
|
126
|
+
throw new Error(`${errorPreamble(childPath)}: ${error instanceof Error ? error.message : error}`);
|
|
60
127
|
}
|
|
61
128
|
}
|
|
62
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
|
+
}
|
|
63
196
|
/**
|
|
64
197
|
* sets an object's specific subtree to the specified value
|
|
65
198
|
*
|
|
@@ -70,7 +203,9 @@ export class ConfigValidator {
|
|
|
70
203
|
* @return {*}
|
|
71
204
|
* @memberof ConfigValidator
|
|
72
205
|
*/
|
|
73
|
-
static modifyObject(
|
|
206
|
+
static modifyObject(
|
|
207
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
208
|
+
obj, newValue, path) {
|
|
74
209
|
let value = obj;
|
|
75
210
|
for (const key of path.slice(0, -1)) {
|
|
76
211
|
if (value != undefined && Object.hasOwn(value, key)) {
|
|
@@ -93,24 +228,49 @@ export class ConfigValidator {
|
|
|
93
228
|
* @param {ConfigField} field the field specification in schema
|
|
94
229
|
* @param {Record<string, any>} config the config object
|
|
95
230
|
*/
|
|
96
|
-
validateValue = (
|
|
231
|
+
validateValue = (
|
|
232
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
233
|
+
value, field,
|
|
234
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
235
|
+
config, path,
|
|
236
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
237
|
+
context) => {
|
|
97
238
|
if (value != undefined) {
|
|
98
239
|
if (field.type === 'bigint') {
|
|
99
|
-
value
|
|
240
|
+
if (typeof value === 'number' &&
|
|
241
|
+
(value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER)) {
|
|
242
|
+
throw new Error(`Field "${path.join('.')}" is declared as a BigInt, but a Number was provided with insufficient precision. Values exceeding 9007199254740991 must be supplied as a string to ensure accuracy.`);
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
value = BigInt(value);
|
|
246
|
+
ConfigValidator.modifyObject(config, value, path);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
throw new Error(`Cannot convert ${value} to a BigInt for field "${path.join('.')}"`);
|
|
250
|
+
}
|
|
100
251
|
}
|
|
101
|
-
|
|
252
|
+
if (field.type === 'number') {
|
|
253
|
+
if (isNaN(Number(value))) {
|
|
254
|
+
throw new Error(`Field "${path.join('.')}" must be a valid number. Please provide a suitable format.`);
|
|
255
|
+
}
|
|
102
256
|
value = Number(value);
|
|
257
|
+
if (value > Number.MAX_SAFE_INTEGER ||
|
|
258
|
+
value < Number.MIN_SAFE_INTEGER) {
|
|
259
|
+
throw new Error(`Value for "${path.join('.')}" is too large or too small. Please enter a valid number.`);
|
|
260
|
+
}
|
|
261
|
+
ConfigValidator.modifyObject(config, value, path);
|
|
103
262
|
}
|
|
104
263
|
valueValidators[field.type](value, field);
|
|
105
264
|
}
|
|
106
265
|
if (field.type !== 'object' &&
|
|
107
266
|
field.type !== 'array' &&
|
|
267
|
+
field.type !== 'union' &&
|
|
108
268
|
field.validations) {
|
|
109
269
|
for (const validation of field.validations) {
|
|
110
270
|
const name = Object.keys(validation).filter((key) => key !== 'when' && key !== 'error')[0];
|
|
111
271
|
if (Object.hasOwn(valueValidations[field.type], name)) {
|
|
112
272
|
try {
|
|
113
|
-
valueValidations[field.type][name](value, validation, config, this);
|
|
273
|
+
valueValidations[field.type][name](value, validation, config, this, context);
|
|
114
274
|
}
|
|
115
275
|
catch (error) {
|
|
116
276
|
if (validation.error != undefined) {
|
|
@@ -130,8 +290,18 @@ export class ConfigValidator {
|
|
|
130
290
|
* @param {Record<string, any>} config
|
|
131
291
|
* @return {boolean}
|
|
132
292
|
*/
|
|
133
|
-
isWhenTrue = (when,
|
|
134
|
-
|
|
293
|
+
isWhenTrue = (when,
|
|
294
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
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
|
+
}
|
|
135
305
|
const value = ConfigValidator.valueAt(config, pathParts);
|
|
136
306
|
return value != undefined && value === when.value;
|
|
137
307
|
};
|
|
@@ -143,10 +313,14 @@ export class ConfigValidator {
|
|
|
143
313
|
* @param {string[]} path
|
|
144
314
|
* @return {*}
|
|
145
315
|
*/
|
|
316
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
146
317
|
static valueAt = (config, path) => {
|
|
147
318
|
let value = config;
|
|
148
319
|
for (const key of path) {
|
|
149
|
-
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)) {
|
|
150
324
|
value = value[key];
|
|
151
325
|
}
|
|
152
326
|
else {
|
|
@@ -196,9 +370,17 @@ export class ConfigValidator {
|
|
|
196
370
|
parentPath: path,
|
|
197
371
|
});
|
|
198
372
|
}
|
|
373
|
+
else if (field.type === 'union') {
|
|
374
|
+
field.children.forEach((unionChild, index) => {
|
|
375
|
+
stack.push({
|
|
376
|
+
subSchema: { [`${name}_union_${index}`]: unionChild },
|
|
377
|
+
parentPath: path,
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
}
|
|
199
381
|
}
|
|
200
382
|
catch (error) {
|
|
201
|
-
throw new Error(`${errorPreamble(path)}: ${error.message}`);
|
|
383
|
+
throw new Error(`${errorPreamble(path)}: ${error instanceof Error ? error.message : error}`);
|
|
202
384
|
}
|
|
203
385
|
}
|
|
204
386
|
}
|
|
@@ -221,8 +403,7 @@ export class ConfigValidator {
|
|
|
221
403
|
validateSchemaField = (field) => {
|
|
222
404
|
for (const key of Object.keys(field)) {
|
|
223
405
|
if (!Object.hasOwn(propertyValidators.all, key) &&
|
|
224
|
-
!(
|
|
225
|
-
Object.hasOwn(propertyValidators.primitive, key)) &&
|
|
406
|
+
!Object.hasOwn(propertyValidators.primitive, key) &&
|
|
226
407
|
!Object.hasOwn(propertyValidators[field.type], key)) {
|
|
227
408
|
throw new Error(`schema field has unknown property "${key}"`);
|
|
228
409
|
}
|
|
@@ -230,7 +411,9 @@ export class ConfigValidator {
|
|
|
230
411
|
for (const validator of Object.values(propertyValidators.all)) {
|
|
231
412
|
validator(field, this);
|
|
232
413
|
}
|
|
233
|
-
if (field.type !== 'object' &&
|
|
414
|
+
if (field.type !== 'object' &&
|
|
415
|
+
field.type !== 'array' &&
|
|
416
|
+
field.type !== 'union') {
|
|
234
417
|
for (const validator of Object.values(propertyValidators.primitive)) {
|
|
235
418
|
validator(field, this);
|
|
236
419
|
}
|
|
@@ -249,17 +432,81 @@ export class ConfigValidator {
|
|
|
249
432
|
let subTree = this.schema;
|
|
250
433
|
let field = undefined;
|
|
251
434
|
for (const part of path) {
|
|
252
|
-
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)) {
|
|
253
464
|
field = subTree[part];
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
465
|
+
if (field.type === 'object') {
|
|
466
|
+
subTree = field.children;
|
|
467
|
+
}
|
|
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
|
+
}
|
|
479
|
+
}
|
|
480
|
+
else if (field.type === 'union') {
|
|
481
|
+
subTree = undefined;
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
subTree = undefined;
|
|
485
|
+
}
|
|
260
486
|
}
|
|
261
487
|
else {
|
|
262
|
-
|
|
488
|
+
if (field?.type === 'union') {
|
|
489
|
+
let found;
|
|
490
|
+
for (const child of field.children) {
|
|
491
|
+
if (child.type === 'object' &&
|
|
492
|
+
Object.hasOwn(child.children, part)) {
|
|
493
|
+
found = child.children[part];
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
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;
|
|
509
|
+
}
|
|
263
510
|
}
|
|
264
511
|
}
|
|
265
512
|
return field;
|
|
@@ -269,6 +516,7 @@ export class ConfigValidator {
|
|
|
269
516
|
*
|
|
270
517
|
* @return {Record<string, any>} object of default values
|
|
271
518
|
*/
|
|
519
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
272
520
|
generateDefault = (options) => {
|
|
273
521
|
const valueTree = this.buildDefaultsForSchema(this.schema);
|
|
274
522
|
if (options?.validate) {
|
|
@@ -278,6 +526,7 @@ export class ConfigValidator {
|
|
|
278
526
|
};
|
|
279
527
|
// Builds default values for a schema subtree (objects and arrays), recursively
|
|
280
528
|
buildDefaultsForSchema = (schema) => {
|
|
529
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
281
530
|
const defaults = Object.create(null);
|
|
282
531
|
for (const key of Object.keys(schema)) {
|
|
283
532
|
const field = schema[key];
|
|
@@ -305,10 +554,8 @@ export class ConfigValidator {
|
|
|
305
554
|
}
|
|
306
555
|
}
|
|
307
556
|
}
|
|
308
|
-
else {
|
|
309
|
-
|
|
310
|
-
defaults[key] = field.default;
|
|
311
|
-
}
|
|
557
|
+
else if (field.type !== 'union' && field.default != undefined) {
|
|
558
|
+
defaults[key] = field.default;
|
|
312
559
|
}
|
|
313
560
|
}
|
|
314
561
|
return defaults;
|
|
@@ -320,7 +567,6 @@ export class ConfigValidator {
|
|
|
320
567
|
* @return {string}
|
|
321
568
|
*/
|
|
322
569
|
generateTSTypes = (name) => {
|
|
323
|
-
const errorPreamble = (path) => `TypeScript type generation failed for "${path.join('.')}" field`;
|
|
324
570
|
const types = [];
|
|
325
571
|
const emittedTypeNames = new Set();
|
|
326
572
|
const stack = [
|
|
@@ -334,73 +580,159 @@ export class ConfigValidator {
|
|
|
334
580
|
];
|
|
335
581
|
// Traverses the schema object tree depth first
|
|
336
582
|
while (stack.length > 0) {
|
|
337
|
-
const
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
types.push(this.genTSInterface(typeName, attributes));
|
|
344
|
-
emittedTypeNames.add(typeName);
|
|
345
|
-
}
|
|
346
|
-
stack.pop();
|
|
347
|
-
continue;
|
|
583
|
+
const current = stack[stack.length - 1];
|
|
584
|
+
const { subSchema, children, parentPath, typeName, attributes } = current;
|
|
585
|
+
if (children.length === 0) {
|
|
586
|
+
if (!emittedTypeNames.has(typeName)) {
|
|
587
|
+
types.push(this.genTSInterface(typeName, attributes));
|
|
588
|
+
emittedTypeNames.add(typeName);
|
|
348
589
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
590
|
+
stack.pop();
|
|
591
|
+
continue;
|
|
592
|
+
}
|
|
593
|
+
const childName = children.pop();
|
|
594
|
+
const field = subSchema[childName];
|
|
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.
|
|
599
|
+
const childNameQuoted = childName.includes('-')
|
|
600
|
+
? `"${childName}"`
|
|
601
|
+
: childName;
|
|
602
|
+
if (field.type === 'union') {
|
|
603
|
+
const unionTypes = [];
|
|
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
|
+
}
|
|
611
|
+
if (child.type === 'object') {
|
|
612
|
+
const optionPath = path.concat([`Option${index}`]);
|
|
613
|
+
const typeName = optionPath.map(toPascalCase).join('');
|
|
614
|
+
stack.push({
|
|
615
|
+
subSchema: child.children,
|
|
616
|
+
children: Object.keys(child.children).reverse(),
|
|
617
|
+
parentPath: optionPath,
|
|
618
|
+
typeName,
|
|
619
|
+
attributes: [],
|
|
620
|
+
});
|
|
621
|
+
unionTypes.push(typeName);
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
if (child.type === 'array') {
|
|
625
|
+
if (child.items.type === 'object') {
|
|
626
|
+
const itemPath = path.concat([`Item${index}`]);
|
|
627
|
+
const typeName = itemPath.map(toPascalCase).join('');
|
|
628
|
+
stack.push({
|
|
629
|
+
subSchema: child.items.children,
|
|
630
|
+
children: Object.keys(child.items.children).reverse(),
|
|
631
|
+
parentPath: itemPath,
|
|
632
|
+
typeName,
|
|
633
|
+
attributes: [],
|
|
634
|
+
});
|
|
635
|
+
unionTypes.push(`${typeName}[]`);
|
|
636
|
+
}
|
|
637
|
+
else {
|
|
638
|
+
unionTypes.push(`${child.items.type}[]`);
|
|
639
|
+
}
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
unionTypes.push(child.type);
|
|
643
|
+
});
|
|
644
|
+
attributes.push([childNameQuoted, unionTypes.join(' | ')]);
|
|
645
|
+
continue;
|
|
646
|
+
}
|
|
647
|
+
if (field.type === 'object') {
|
|
648
|
+
const typeName = path.map(toPascalCase).join('');
|
|
649
|
+
stack.push({
|
|
650
|
+
subSchema: field.children,
|
|
651
|
+
children: Object.keys(field.children).reverse(),
|
|
652
|
+
parentPath: path,
|
|
653
|
+
typeName,
|
|
654
|
+
attributes: [],
|
|
655
|
+
});
|
|
656
|
+
attributes.push([childNameQuoted, typeName]);
|
|
657
|
+
continue;
|
|
658
|
+
}
|
|
659
|
+
if (field.type === 'array') {
|
|
660
|
+
if (field.items.type === 'object') {
|
|
661
|
+
const typeName = path.map(toPascalCase).join('');
|
|
370
662
|
stack.push({
|
|
371
|
-
subSchema: children,
|
|
372
|
-
children: Object.keys(children).reverse(),
|
|
663
|
+
subSchema: field.items.children,
|
|
664
|
+
children: Object.keys(field.items.children).reverse(),
|
|
373
665
|
parentPath: path,
|
|
374
|
-
typeName
|
|
666
|
+
typeName,
|
|
375
667
|
attributes: [],
|
|
376
668
|
});
|
|
377
|
-
attributes.push([
|
|
378
|
-
childNameQuoted,
|
|
379
|
-
field.type === 'array' ? `${childTypeName}[]` : childTypeName,
|
|
380
|
-
]);
|
|
669
|
+
attributes.push([childNameQuoted, `${typeName}[]`]);
|
|
381
670
|
}
|
|
382
|
-
else {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
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}[]`);
|
|
389
705
|
}
|
|
390
|
-
|
|
391
|
-
|
|
706
|
+
else {
|
|
707
|
+
unionTypes.push(`${child.items.type}[]`);
|
|
392
708
|
}
|
|
709
|
+
return;
|
|
393
710
|
}
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
711
|
+
unionTypes.push(child.type);
|
|
712
|
+
});
|
|
713
|
+
attributes.push([childNameQuoted, `(${unionTypes.join(' | ')})[]`]);
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
attributes.push([childNameQuoted, `${field.items.type}[]`]);
|
|
399
717
|
}
|
|
718
|
+
continue;
|
|
400
719
|
}
|
|
401
|
-
|
|
402
|
-
|
|
720
|
+
let fieldType = field.type;
|
|
721
|
+
let isOptional = true;
|
|
722
|
+
if (field.validations) {
|
|
723
|
+
for (const validation of field.validations) {
|
|
724
|
+
if (field.type === 'string' && 'choices' in validation) {
|
|
725
|
+
fieldType = validation.choices.map((c) => `'${c}'`).join(' | ');
|
|
726
|
+
}
|
|
727
|
+
if ('required' in validation && !('when' in validation)) {
|
|
728
|
+
isOptional = false;
|
|
729
|
+
}
|
|
730
|
+
}
|
|
403
731
|
}
|
|
732
|
+
attributes.push([
|
|
733
|
+
isOptional ? `${childNameQuoted}?` : childNameQuoted,
|
|
734
|
+
fieldType,
|
|
735
|
+
]);
|
|
404
736
|
}
|
|
405
737
|
return types.reverse().join('\n\n') + '\n';
|
|
406
738
|
};
|
|
@@ -423,6 +755,7 @@ export class ConfigValidator {
|
|
|
423
755
|
* @param {string} level
|
|
424
756
|
* @return {Record<string, any>}
|
|
425
757
|
*/
|
|
758
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
426
759
|
getConfigForLevel(config, level) {
|
|
427
760
|
const confLevels = ConfigValidator.getNodeConfigLevels(config);
|
|
428
761
|
const levelIndex = confLevels.indexOf(level);
|
|
@@ -544,7 +877,9 @@ export class ConfigValidator {
|
|
|
544
877
|
* @param {string} level output node-config file level
|
|
545
878
|
* @param {string} format the format of the output file
|
|
546
879
|
*/
|
|
547
|
-
validateAndWriteConfig = (
|
|
880
|
+
validateAndWriteConfig = (
|
|
881
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
882
|
+
configObj, config, level, format) => {
|
|
548
883
|
const confLevels = ConfigValidator.getNodeConfigLevels(config).filter((l) => l !== 'custom-environment-variables');
|
|
549
884
|
const levelIndex = confLevels.indexOf(level);
|
|
550
885
|
if (levelIndex === -1) {
|
|
@@ -590,4 +925,4 @@ export class ConfigValidator {
|
|
|
590
925
|
}
|
|
591
926
|
};
|
|
592
927
|
}
|
|
593
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSxxQ0FBcUMsQ0FBQztBQUc3QyxPQUFPLEVBQ0wsYUFBYSxFQUNiLHlCQUF5QixFQUN6QixZQUFZLEdBQ2IsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZFLE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBRW5ELE1BQU0sT0FBTyxlQUFlO0lBQ047SUFBcEIsWUFBb0IsTUFBb0I7UUFBcEIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUN0QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjLENBQUMsTUFBMkI7UUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FDaEIsTUFBTSxFQUNOLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUN6QyxNQUFNLENBQ1AsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLGlCQUFpQixDQUN2QixNQUEyQixFQUMzQixTQUE4QixFQUM5QixTQUF1QixFQUN2QixJQUFjO1FBRWQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFtQixFQUFFLEVBQUUsQ0FDNUMsaUNBQWlDLElBQUks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LEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEtBQUssV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVyRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3BDLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ29uZmlnLCBJQ29uZmlnU291cmNlIH0gZnJvbSAnY29uZmlnJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIHByb3BlcnR5VmFsaWRhdG9ycyxcbiAgc3VwcG9ydGVkVHlwZXMsXG59IGZyb20gJy4vc2NoZW1hL1ZhbGlkYXRvcnMvZmllbGRQcm9wZXJ0aWVzJztcbmltcG9ydCB7IENvbmZpZ0ZpZWxkLCBDb25maWdTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS90eXBlcy9maWVsZHMnO1xuaW1wb3J0IHsgV2hlbiB9IGZyb20gJy4vc2NoZW1hL3R5cGVzL3ZhbGlkYXRpb25zJztcbmltcG9ydCB7XG4gIGdldFNvdXJjZU5hbWUsXG4gIGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMsXG4gIHRvUGFzY2FsQ2FzZSxcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyB2YWx1ZVZhbGlkYXRpb25zLCB2YWx1ZVZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbHVlL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IEpzb25CaWdJbnQgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNjaGVtYTogQ29uZmlnU2NoZW1hKSB7XG4gICAgdGhpcy52YWxpZGF0ZVNjaGVtYSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyB0aGUgcGFzc2VkIGNvbmZpZyBhZ2FpbnN0IHRoZSBpbnN0YW5jZSdzIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHsgdHlwZTogJ29iamVjdCcsIGNoaWxkcmVuOiB0aGlzLnNjaGVtYSB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgY29uZmlnLCB0aGlzLnNjaGVtYSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyYXZlcnNlcyBhbmQgdmFsaWRhdGVzIGEgc3ViY29uZmlnIHVzaW5nIHRoZSBzdWJzY2hlbWFcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzdWJDb25maWdcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHN1YlNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEBtZW1iZXJvZiBDb25maWdWYWxpZGF0b3JcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTdWJDb25maWcoXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHN1YkNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYGNvbmZpZyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKSkge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5jb25jYXQoW25hbWVdKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdWJDb25maWcgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24oc3ViQ29uZmlnLCBuYW1lKSkge1xuICAgICAgICAgIHZhbHVlID0gc3ViQ29uZmlnW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKHZhbHVlLCBmaWVsZCwgY29uZmlnKTtcblxuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCB0cmF2ZXJzZSBpdFxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgdmFsdWUsIGZpZWxkLmNoaWxkcmVuLCBjaGlsZFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgaXRlbSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgeyBbbmFtZV06IGl0ZW0gfSxcbiAgICAgICAgICAgICAgICB7IFtuYW1lXTogZmllbGQuaXRlbXMgfSxcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yUHJlYW1ibGUoY2hpbGRQYXRoKX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2V0cyBhbiBvYmplY3QncyBzcGVjaWZpYyBzdWJ0cmVlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICAgKiBAcGFyYW0geyp9IG5ld1ZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHJldHVybiB7Kn1cbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgc3RhdGljIG1vZGlmeU9iamVjdChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5ld1ZhbHVlOiBhbnksIHBhdGg6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHZhbHVlOiBhbnkgPSBvYmo7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGF0aC5zbGljZSgwLCAtMSkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEtleSA9IHBhdGguYXQoLTEpO1xuICAgIGlmIChsYXN0S2V5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWVbbGFzdEtleV0gPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdmFsaWRhdGVzIGEgdmFsdWUgaW4gY29uZmlnIG9iamVjdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Q29uZmlnRmllbGR9IGZpZWxkIHRoZSBmaWVsZCBzcGVjaWZpY2F0aW9uIGluIHNjaGVtYVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZyB0aGUgY29uZmlnIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZhbHVlID0gKFxuICAgIHZhbHVlOiBhbnksXG4gICAgZmllbGQ6IENvbmZpZ0ZpZWxkLFxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKSA9PiB7XG4gICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHZhbHVlID0gQmlnSW50KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YWx1ZVZhbGlkYXRvcnNbZmllbGQudHlwZV0odmFsdWUsIGZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBmaWVsZC50eXBlICE9PSAnb2JqZWN0JyAmJlxuICAgICAgZmllbGQudHlwZSAhPT0gJ2FycmF5JyAmJlxuICAgICAgZmllbGQudmFsaWRhdGlvbnNcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmtleXModmFsaWRhdGlvbikuZmlsdGVyKFxuICAgICAgICAgIChrZXkpID0+IGtleSAhPT0gJ3doZW4nICYmIGtleSAhPT0gJ2Vycm9yJyxcbiAgICAgICAgKVswXTtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXSwgbmFtZSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXVtuYW1lXSh2YWx1ZSwgdmFsaWRhdGlvbiwgY29uZmlnLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGlvbi5lcnJvciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHZhbGlkYXRpb24uZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBkZXRlcm1pbmVzIGlmIGEgd2hlbiBjbGF1c2UgaW4gdmFsaWRhdGlvbnMgc2VjdGlvbiBvZiBhIHNjaGVtYSBmaWVsZCBpc1xuICAgKiBzYXRpc2ZpZWRcbiAgICpcbiAgICogQHBhcmFtIHtXaGVufSB3aGVuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBwdWJsaWMgaXNXaGVuVHJ1ZSA9ICh3aGVuOiBXaGVuLCBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBwYXRoUGFydHMgPSB3aGVuLnBhdGguc3BsaXQoJy4nKTtcbiAgICBjb25zdCB2YWx1ZSA9IENvbmZpZ1ZhbGlkYXRvci52YWx1ZUF0KGNvbmZpZywgcGF0aFBhcnRzKTtcbiAgICByZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB3aGVuLnZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSB2YWx1ZSBhdCBzcGVjaWZpZWQgcGF0aCBpbiBjb25maWcgb2JqZWN0XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgc3RhdGljIHZhbHVlQXQgPSAoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmdbXSkgPT4ge1xuICAgIGxldCB2YWx1ZTogYW55ID0gY29uZmlnO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIHRoaXMuc2NoZW1hIGFuZCB0aHJvd3MgZXhjZXB0aW9uIGlmIGFueSBlcnJvcnMgZm91bmRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWEgPSAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYFNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcblxuICAgIGNvbnN0IHN0YWNrOiBBcnJheTx7XG4gICAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYTtcbiAgICAgIHBhcmVudFBhdGg6IEFycmF5PHN0cmluZz47XG4gICAgfT4gPSBbXG4gICAgICB7XG4gICAgICAgIHN1YlNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgIHBhcmVudFBhdGg6IFtdLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gVHJhdmVyc2VzIHRoZSBzY2hlbWEgb2JqZWN0IHRyZWUgZGVwdGggZmlyc3QgYW5kIHZhbGlkYXRlIGZpZWxkc1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IHN1YlNjaGVtYSwgcGFyZW50UGF0aCB9ID0gc3RhY2sucG9wKCkhO1xuXG4gICAgICAvLyBwcm9jZXNzIGNoaWxkcmVuIG9mIGN1cnJlbnQgb2JqZWN0IGZpZWxkXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcmVudFBhdGguY29uY2F0KFtuYW1lXSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZ05hbWUobmFtZSk7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbbmFtZV07XG5cbiAgICAgICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICd0eXBlJykgfHwgdHlwZW9mIGZpZWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBldmVyeSBzY2hlbWEgZmllbGQgbXVzdCBoYXZlIGEgXCJ0eXBlXCIgcHJvcGVydHkgb2YgdHlwZSBcInN0cmluZ1wiYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlIFwiJHtmaWVsZC50eXBlfVwiYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVNjaGVtYUZpZWxkKGZpZWxkKTtcblxuICAgICAgICAgIC8vIGlmIHRoZSBjaGlsZCBpcyBhbiBvYmplY3QgZmllbGQgaXRzZWxmIGFkZCBpdCB0byBzdGFjayBmb3JcbiAgICAgICAgICAvLyBwcm9jZXNzaW5nXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgc3ViU2NoZW1hOiBmaWVsZC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHN1YlNjaGVtYTogeyBbbmFtZV06IGZpZWxkLml0ZW1zIH0sXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JQcmVhbWJsZShwYXRoKX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIGNvbmZpZyBrZXkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ05hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb25maWcga2V5IG5hbWUgY2FuIG5vdCBjb250YWluIHRoZSAnLicgY2hhcmFjdGVyYCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgcGFzc2VkIHNjaGVtYSBmaWVsZCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWdGaWVsZH0gZmllbGRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWFGaWVsZCA9IChmaWVsZDogQ29uZmlnRmllbGQpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzLmFsbCwga2V5KSAmJlxuICAgICAgICAhKFxuICAgICAgICAgICFbJ29iamVjdCcsICdhcnJheSddLmluY2x1ZGVzKGZpZWxkLnR5cGUpICYmXG4gICAgICAgICAgT2JqZWN0Lmhhc093bihwcm9wZXJ0eVZhbGlkYXRvcnMucHJpbWl0aXZlLCBrZXkpXG4gICAgICAgICkgJiZcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzW2ZpZWxkLnR5cGVdLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzY2hlbWEgZmllbGQgaGFzIHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIE9iamVjdC52YWx1ZXMocHJvcGVydHlWYWxpZGF0b3JzLmFsbCkpIHtcbiAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkLnR5cGUgIT09ICdvYmplY3QnICYmIGZpZWxkLnR5cGUgIT09ICdhcnJheScpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIE9iamVjdC52YWx1ZXMocHJvcGVydHlWYWxpZGF0b3JzLnByaW1pdGl2ZSkpIHtcbiAgICAgICAgdmFsaWRhdG9yKGZpZWxkLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9yc1tmaWVsZC50eXBlXSkpIHtcbiAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgZmllbGQgY29ycmVzcG9uZGluZyB0byBhIHBhdGggaW4gc2NoZW1hIHRyZWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsoQ29uZmlnRmllbGQgfCB1bmRlZmluZWQpfSByZXR1cm5zIHVuZGVmaW5lZCBpZiBmaWVsZCBpcyBub3QgZm91bmRcbiAgICovXG4gIGdldFNjaGVtYUZpZWxkID0gKHBhdGg6IHN0cmluZ1tdKTogQ29uZmlnRmllbGQgfCB1bmRlZmluZWQgPT4ge1xuICAgIGxldCBzdWJUcmVlOiBDb25maWdTY2hlbWEgfCB1bmRlZmluZWQgPSB0aGlzLnNjaGVtYTtcbiAgICBsZXQgZmllbGQ6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoKSB7XG4gICAgICBpZiAoc3ViVHJlZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bihzdWJUcmVlLCBwYXJ0KSkge1xuICAgICAgICBmaWVsZCA9IHN1YlRyZWVbcGFydF07XG4gICAgICAgIHN1YlRyZWUgPVxuICAgICAgICAgICdjaGlsZHJlbicgaW4gZmllbGRcbiAgICAgICAgICAgID8gZmllbGQuY2hpbGRyZW5cbiAgICAgICAgICAgIDogJ2l0ZW1zJyBpbiBmaWVsZCAmJiAnY2hpbGRyZW4nIGluIGZpZWxkLml0ZW1zXG4gICAgICAgICAgICAgID8gZmllbGQuaXRlbXMuY2hpbGRyZW5cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIGRlZmF1bHQgdmFsdWVzIGZyb20gYSBzY2hlbWFcbiAgICpcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqZWN0IG9mIGRlZmF1bHQgdmFsdWVzXG4gICAqL1xuICBnZW5lcmF0ZURlZmF1bHQgPSAob3B0aW9ucz86IHsgdmFsaWRhdGU/OiBib29sZWFuIH0pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICBjb25zdCB2YWx1ZVRyZWUgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEodGhpcy5zY2hlbWEpO1xuICAgIGlmIChvcHRpb25zPy52YWxpZGF0ZSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZyh2YWx1ZVRyZWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVUcmVlO1xuICB9O1xuXG4gIC8vIEJ1aWxkcyBkZWZhdWx0IHZhbHVlcyBmb3IgYSBzY2hlbWEgc3VidHJlZSAob2JqZWN0cyBhbmQgYXJyYXlzKSwgcmVjdXJzaXZlbHlcbiAgcHJpdmF0ZSBidWlsZERlZmF1bHRzRm9yU2NoZW1hID0gKFxuICAgIHNjaGVtYTogQ29uZmlnU2NoZW1hLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICBjb25zdCBkZWZhdWx0czogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKSkge1xuICAgICAgY29uc3QgZmllbGQgPSBzY2hlbWFba2V5XTtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjaGlsZERlZmF1bHRzID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKGZpZWxkLmNoaWxkcmVuKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNoaWxkRGVmYXVsdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZWZhdWx0c1trZXldID0gY2hpbGREZWZhdWx0cztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmICgoZmllbGQgYXMgYW55KS5kZWZhdWx0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgaXRlbURlZmF1bHRzID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKFxuICAgICAgICAgICAgICBmaWVsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gKGZpZWxkIGFzIGFueSkuZGVmYXVsdC5tYXAoKGVsZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZWxlbSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGVsZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZWxlbSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbURlZmF1bHRzLCAuLi5lbGVtIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IChmaWVsZCBhcyBhbnkpLmRlZmF1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGZpZWxkIGFzIGFueSkuZGVmYXVsdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWZhdWx0c1trZXldID0gKGZpZWxkIGFzIGFueSkuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIGdlbmVyYXRlcyBjb21wYXRpYmxlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZvciB0aGlzIGluc3RhbmNlJ3Mgc2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHJvb3QgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZW5lcmF0ZVRTVHlwZXMgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBlcnJvclByZWFtYmxlID0gKHBhdGg6IEFycmF5PHN0cmluZz4pID0+XG4gICAgICBgVHlwZVNjcmlwdCB0eXBlIGdlbmVyYXRpb24gZmFpbGVkIGZvciBcIiR7cGF0aC5qb2luKCcuJyl9XCIgZmllbGRgO1xuXG4gICAgY29uc3QgdHlwZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBlbWl0dGVkVHlwZU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PHtcbiAgICAgIHN1YlNjaGVtYTogQ29uZmlnU2NoZW1hO1xuICAgICAgY2hpbGRyZW46IHN0cmluZ1tdO1xuICAgICAgcGFyZW50UGF0aDogQXJyYXk8c3RyaW5nPjtcbiAgICAgIHR5cGVOYW1lOiBzdHJpbmc7XG4gICAgICBhdHRyaWJ1dGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPjtcbiAgICB9PiA9IFtcbiAgICAgIHtcbiAgICAgICAgc3ViU2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgcGFyZW50UGF0aDogW10sXG4gICAgICAgIHR5cGVOYW1lOiBuYW1lLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgc3ViU2NoZW1hLCBjaGlsZHJlbiwgcGFyZW50UGF0aCwgdHlwZU5hbWUsIGF0dHJpYnV0ZXMgfSA9XG4gICAgICAgIHN0YWNrLmF0KC0xKSE7XG4gICAgICBsZXQgcGF0aDogc3RyaW5nW10gPSBwYXJlbnRQYXRoO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaWYgYSBzdWJ0cmVlJ3MgcHJvY2Vzc2luZyBpcyBmaW5pc2hlZCBnbyB0byB0aGUgcHJldmlvdXMgbGV2ZWxcbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaWYgKCFlbWl0dGVkVHlwZU5hbWVzLmhhcyh0eXBlTmFtZSkpIHtcbiAgICAgICAgICAgIHR5cGVzLnB1c2godGhpcy5nZW5UU0ludGVyZmFjZSh0eXBlTmFtZSwgYXR0cmlidXRlcykpO1xuICAgICAgICAgICAgZW1pdHRlZFR5cGVOYW1lcy5hZGQodHlwZU5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZSA9IGNoaWxkcmVuLnBvcCgpITtcbiAgICAgICAgcGF0aCA9IHBhcmVudFBhdGguY29uY2F0KFtjaGlsZE5hbWVdKTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbY2hpbGROYW1lXTtcblxuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCBhZGQgaXQgdG9cbiAgICAgICAgLy8gdGhlIHN0YWNrIHRvIGJlIHRyYXZlcnNlZCBsYXRlci4gT3RoZXJ3aXNlIGl0J3MgYSBsZWFmIGFuZCBuZWVkcyBub1xuICAgICAgICAvLyB0cmF2ZXJzYWwuXG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZVF1b3RlZCA9IGNoaWxkTmFtZS5pbmNsdWRlcygnLScpXG4gICAgICAgICAgPyBgXCIke2NoaWxkTmFtZX1cImBcbiAgICAgICAgICA6IGNoaWxkTmFtZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgKGZpZWxkLnR5cGUgPT09ICdhcnJheScgJiYgZmllbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIENyZWF0ZSB1bmlxdWUgdHlwZSBuYW1lIGZyb20gc2NoZW1hIHBhdGggKHN1cHBvcnRzIGh5cGhlbnM6IGJpdGNvaW4tcnVuZXMgLT4gQml0Y29pblJ1bmVzKVxuICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGg7XG4gICAgICAgICAgY29uc3QgY2hpbGRUeXBlTmFtZSA9IHBhdGhQYXJ0c1xuICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gdG9QYXNjYWxDYXNlKHBhcnQpKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPVxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2FycmF5JyAmJiBmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICA/IGZpZWxkLml0ZW1zLmNoaWxkcmVuXG4gICAgICAgICAgICAgIDogZmllbGQudHlwZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICA/IGZpZWxkLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgOiB7fTtcblxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgc3ViU2NoZW1hOiBjaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhjaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBjaGlsZFR5cGVOYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW1xuICAgICAgICAgICAgY2hpbGROYW1lUXVvdGVkLFxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2FycmF5JyA/IGAke2NoaWxkVHlwZU5hbWV9W11gIDogY2hpbGRUeXBlTmFtZSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZmllbGRUeXBlOiBzdHJpbmcgPVxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2FycmF5JyA/IGZpZWxkLml0ZW1zLnR5cGUgOiBmaWVsZC50eXBlO1xuICAgICAgICAgIGxldCBpc09wdGlvbmFsID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZmllbGQudHlwZSAhPT0gJ2FycmF5JyAmJiBmaWVsZC52YWxpZGF0aW9ucyAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0cmluZycgJiYgJ2Nob2ljZXMnIGluIHZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSB2YWxpZGF0aW9uLmNob2ljZXMubWFwKChjKSA9PiBgJyR7Y30nYCkuam9pbignIHwgJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoJ3JlcXVpcmVkJyBpbiB2YWxpZGF0aW9uICYmICEoJ3doZW4nIGluIHZhbGlkYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgaXNPcHRpb25hbCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaChbXG4gICAgICAgICAgICBpc09wdGlvbmFsID8gYCR7Y2hpbGROYW1lUXVvdGVkfT9gIDogY2hpbGROYW1lUXVvdGVkLFxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2FycmF5JyA/IGAke2ZpZWxkVHlwZX1bXWAgOiBmaWVsZFR5cGUsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yUHJlYW1ibGUocGF0aCl9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzLnJldmVyc2UoKS5qb2luKCdcXG5cXG4nKSArICdcXG4nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZW5lcmF0ZXMgYSBUeXBlU2NyaXB0IGludGVyZmFjZSBkZWZpbml0aW9uIGZvciBwYXNzZWQgbmFtZSBhbmQgYXR0cmlidXRlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5PFtzdHJpbmcsIHN0cmluZ10+fSBhdHRyaWJ1dGVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHByaXZhdGUgZ2VuVFNJbnRlcmZhY2UgPSAoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGF0dHJpYnV0ZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+LFxuICApOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBgZXhwb3J0IGludGVyZmFjZSAke25hbWV9IHtcbiAgJHthdHRyaWJ1dGVzLm1hcCgoYXR0cikgPT4gYCR7YXR0clswXX06ICR7YXR0clsxXX07YCkuam9pbignXFxuICAnKX1cbn1gO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgY2hhcmFjdGVyaXN0aWMgb2JqZWN0IGZvciB2YWx1ZXMgYXQgYSBzcGVjaWZpYyBub2RlIGNvbmZpZyBsZXZlbFxuICAgKlxuICAgKiBAcGFyYW0ge0lDb25maWd9IGNvbmZpZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGV2ZWxcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICovXG4gIGdldENvbmZpZ0ZvckxldmVsKGNvbmZpZzogSUNvbmZpZywgbGV2ZWw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IGNvbmZMZXZlbHMgPSBDb25maWdWYWxpZGF0b3IuZ2V0Tm9kZUNvbmZpZ0xldmVscyhjb25maWcpO1xuICAgIGNvbnN0IGxldmVsSW5kZXggPSBjb25mTGV2ZWxzLmluZGV4T2YobGV2ZWwpO1xuICAgIGlmIChsZXZlbEluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIFwiJHtsZXZlbH1cIiBsZXZlbCBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gbGV2ZWxzYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGhpZ2hlckxldmVsU291cmNlcyA9IGNvbmZpZy51dGlsXG4gICAgICAuZ2V0Q29uZmlnU291cmNlcygpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoc291cmNlKSA9PiBjb25mTGV2ZWxzLmluZGV4T2YoZ2V0U291cmNlTmFtZShzb3VyY2UpKSA+IGxldmVsSW5kZXgsXG4gICAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRMZXZlbFNvdXJjZSA9IGNvbmZpZy51dGlsXG4gICAgICAuZ2V0Q29uZmlnU291cmNlcygpXG4gICAgICAuZmlsdGVyKChzb3VyY2UpID0+IGdldFNvdXJjZU5hbWUoc291cmNlKSA9PT0gbGV2ZWwpXG4gICAgICAuYXQoMCk7XG4gICAgY29uc3QgbG93ZXJMZXZlbFNvdXJjZXMgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHNvdXJjZSkgPT4gY29uZkxldmVscy5pbmRleE9mKGdldFNvdXJjZU5hbWUoc291cmNlKSkgPCBsZXZlbEluZGV4LFxuICAgICAgKTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0XG4gICAgY29uc3QgdmFsdWVUcmVlID0gQ29uZmlnVmFsaWRhdG9yLnByb2Nlc3NDb25maWdGb3JMZXZlbE5vZGUoXG4gICAgICB0aGlzLnNjaGVtYSxcbiAgICAgIFtdLFxuICAgICAgaGlnaGVyTGV2ZWxTb3VyY2VzLFxuICAgICAgY3VycmVudExldmVsU291cmNlLFxuICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgKTtcblxuICAgIHJldHVybiB2YWx1ZVRyZWU7XG4gIH1cblxuICAvKipcbiAgICp0cmF2ZXJzZXMgdGhlIGNvbmZpZyBzY2hlbWEgZGVwdGggZmlyc3QgdG8gcHJvZHVjZSBjaGFyYWN0ZXJpc3RpYyBvYmplY3RcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge0NvbmZpZ1NjaGVtYX0gc2NoZW1hXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHBhcmFtIHtJQ29uZmlnU291cmNlW119IGhpZ2hlckxldmVsU291cmNlc1xuICAgKiBAcGFyYW0geyhJQ29uZmlnU291cmNlIHwgdW5kZWZpbmVkKX0gY3VycmVudExldmVsU291cmNlXG4gICAqIEBwYXJhbSB7SUNvbmZpZ1NvdXJjZVtdfSBsb3dlckxldmVsU291cmNlc1xuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICAgKiBAbWVtYmVyb2YgQ29uZmlnVmFsaWRhdG9yXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgIHNjaGVtYTogQ29uZmlnU2NoZW1hLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGhpZ2hlckxldmVsU291cmNlczogSUNvbmZpZ1NvdXJjZVtdLFxuICAgIGN1cnJlbnRMZXZlbFNvdXJjZTogSUNvbmZpZ1NvdXJjZSB8IHVuZGVmaW5lZCxcbiAgICBsb3dlckxldmVsU291cmNlczogSUNvbmZpZ1NvdXJjZVtdLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBjaGlsZE5hbWUgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguY29uY2F0KFtjaGlsZE5hbWVdKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2NoaWxkTmFtZV07XG4gICAgICAvLyBpZiBhIGZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGFuZCB0aHVzIGlzIGEgc3VidHJlZSwgcmVjdXJzZSBvbiBpdC5cbiAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgbGVhZiBhbmQgbmVlZHMgbm8gdHJhdmVyc2FsLlxuICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgICAgIGZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY3VycmVudExldmVsU291cmNlLFxuICAgICAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsnbGFiZWwnXSA9XG4gICAgICAgICAgZmllbGQubGFiZWwgIT0gdW5kZWZpbmVkID8gZmllbGQubGFiZWwgOiBudWxsO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydkZXNjcmlwdGlvbiddID1cbiAgICAgICAgICBmaWVsZC5kZXNjcmlwdGlvbiAhPSB1bmRlZmluZWQgPyBmaWVsZC5kZXNjcmlwdGlvbiA6IG51bGw7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ2RlZmF1bHQnXSA9IGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMoXG4gICAgICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWyd2YWx1ZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBbLi4uKGN1cnJlbnRMZXZlbFNvdXJjZSAhPSB1bmRlZmluZWQgPyBbY3VycmVudExldmVsU291cmNlXSA6IFtdKV0sXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydvdmVycmlkZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgbGlzdCBvZiBjb25maWcgc291cmNlcyB1c2VkIGJ5IG5vZGUgY29uZmlnIHBhY2thZ2UsIG9yZGVyZWQgZnJvbVxuICAgKiB0aGUgbG93ZXN0IHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHJldHVybiAge3N0cmluZ1tdfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Tm9kZUNvbmZpZ0xldmVscyA9IChjb25maWc6IElDb25maWcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfQVBQX0lOU1RBTkNFJyk7XG4gICAgbGV0IGRlcGxveW1lbnQgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfRU5WJyk7XG4gICAgZGVwbG95bWVudCA9IGNvbmZpZy51dGlsLmdldEVudignTk9ERV9DT05GSUdfRU5WJyk7XG4gICAgY29uc3QgZnVsbEhvc3RuYW1lID0gY29uZmlnLnV0aWwuZ2V0RW52KCdIT1NUTkFNRScpO1xuICAgIGNvbnN0IHNob3J0SG9zdG5hbWUgPVxuICAgICAgZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCA/IGZ1bGxIb3N0bmFtZS5zcGxpdCgnLicpWzBdIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29uZmlnTGV2ZWxzID0gW1xuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgZGVmYXVsdC0ke2luc3RhbmNlfWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkID8gW2Ake2RlcGxveW1lbnR9YF0gOiBbXSksXG4gICAgICAuLi4oaW5zdGFuY2UgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7c2hvcnRIb3N0bmFtZX1gXSA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtzaG9ydEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7ZnVsbEhvc3RuYW1lfWBdIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiYgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtkZXBsb3ltZW50fWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7ZnVsbEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICBgbG9jYWxgLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtpbnN0YW5jZX1gXSA6IFtdKSxcbiAgICAgIC4uLihkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgJyROT0RFX0NPTkZJRycsXG4gICAgICAnY3VzdG9tLWVudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgXTtcblxuICAgIHJldHVybiBjb25maWdMZXZlbHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIGNvbmZpZyBvYmplY3QgYW5kIHdyaXRlcyBpdCB0byB0aGUgbm9kZS1jb25maWcgZmlsZVxuICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdPYmpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsIG91dHB1dCBub2RlLWNvbmZpZyBmaWxlIGxldmVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGVcbiAgICovXG4gIHZhbGlkYXRlQW5kV3JpdGVDb25maWcgPSAoXG4gICAgY29uZmlnT2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNvbmZpZzogSUNvbmZpZyxcbiAgICBsZXZlbDogc3RyaW5nLFxuICAgIGZvcm1hdDogc3RyaW5nLFxuICApID0+IHtcbiAgICBjb25zdCBjb25mTGV2ZWxzID0gQ29uZmlnVmFsaWRhdG9yLmdldE5vZGVDb25maWdMZXZlbHMoY29uZmlnKS5maWx0ZXIoXG4gICAgICAobCkgPT4gbCAhPT0gJ2N1c3RvbS1lbnZpcm9ubWVudC12YXJpYWJsZXMnLFxuICAgICk7XG4gICAgY29uc3QgbGV2ZWxJbmRleCA9IGNvbmZMZXZlbHMuaW5kZXhPZihsZXZlbCk7XG4gICAgaWYgKGxldmVsSW5kZXggPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgWyR7bGV2ZWx9XSBsZXZlbCBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgc3lzdGVtJ3MgY29uZmlndXJhdGlvbiBsZXZlbHNgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWdEaXIgPVxuICAgICAgcHJvY2Vzcy5lbnZbJ05PREVfQ09ORklHX0RJUiddICE9IHVuZGVmaW5lZFxuICAgICAgICA/IHByb2Nlc3MuZW52WydOT0RFX0NPTkZJR19ESVInXVxuICAgICAgICA6ICcuL2NvbmZpZyc7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIGxldCBleHQgPSAnJztcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAnanNvbic6IHtcbiAgICAgICAgb3V0cHV0ID0gSnNvbkJpZ0ludC5zdHJpbmdpZnkoY29uZmlnT2JqKTtcbiAgICAgICAgZXh0ID0gJ2pzb24nO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3lhbWwnOiB7XG4gICAgICAgIG91dHB1dCA9IHlhbWwuZHVtcChjb25maWdPYmopO1xuICAgICAgICBleHQgPSAneWFtbCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgYCR7bGV2ZWx9LiR7ZXh0fWApO1xuICAgIGNvbnN0IGJhY2t1cFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBgJHtsZXZlbH0tYmFja3VwLiR7ZXh0fWApO1xuICAgIGNvbnN0IGNvbmZGaWxlRXhpc3RzID0gZnMuZXhpc3RzU3luYyhvdXRwdXRQYXRoKTtcbiAgICBpZiAoY29uZkZpbGVFeGlzdHMpIHtcbiAgICAgIGZzLnJlbmFtZVN5bmMob3V0cHV0UGF0aCwgYmFja3VwUGF0aCk7XG4gICAgfVxuICAgIGZzLndyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgb3V0cHV0KTtcblxuICAgIGNvbnN0IHVwZGF0ZWRDb25mT2JqID0gY29uZmlnLnV0aWwubG9hZEZpbGVDb25maWdzKCk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZk9iaik7XG4gICAgICBmcy51bmxpbmtTeW5jKGJhY2t1cFBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBmcy51bmxpbmtTeW5jKG91dHB1dFBhdGgpO1xuICAgICAgaWYgKGNvbmZGaWxlRXhpc3RzKSB7XG4gICAgICAgIGZzLnJlbmFtZVN5bmMoYmFja3VwUGF0aCwgb3V0cHV0UGF0aCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59XG4iXX0=
|
|
928
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sVUFBVSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVMxRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGNBQWMsR0FDZixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLFlBQVksR0FDYixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkUsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFlO0lBRTdCLFlBQW9CLE1BQW9CO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsR0FBUyxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLFVBQWtCLEVBQW1CLEVBQUU7UUFDeEQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFM0Qs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RyxFQUFFLENBQUMsQ0FBQztRQUNsRSxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXJDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFckQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbmZpZywgSUNvbmZpZ1NvdXJjZSB9IGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBKc29uQmlnSW50LCB7IEpzb25CaWdJbnRGYWN0b3J5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmltcG9ydCB7XG4gIENvbmZpZ0ZpZWxkLFxuICBDb25maWdTY2hlbWEsXG4gIFVuaW9uRmllbGQsXG4gIFZhbHVlVHlwZSxcbn0gZnJvbSAnLi9zY2hlbWEvdHlwZXMvZmllbGRzJztcbmltcG9ydCB7IFdoZW4gfSBmcm9tICcuL3NjaGVtYS90eXBlcy92YWxpZGF0aW9ucyc7XG5pbXBvcnQge1xuICBwcm9wZXJ0eVZhbGlkYXRvcnMsXG4gIHN1cHBvcnRlZFR5cGVzLFxufSBmcm9tICcuL3NjaGVtYS9WYWxpZGF0b3JzL2ZpZWxkUHJvcGVydGllcyc7XG5pbXBvcnQge1xuICBnZXRTb3VyY2VOYW1lLFxuICBnZXRWYWx1ZUZyb21Db25maWdTb3VyY2VzLFxuICB0b1Bhc2NhbENhc2UsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdmFsdWVWYWxpZGF0aW9ucywgdmFsdWVWYWxpZGF0b3JzIH0gZnJvbSAnLi92YWx1ZS92YWxpZGF0b3JzJztcblxuZXhwb3J0IGNsYXNzIENvbmZpZ1ZhbGlkYXRvciB7XG4gIHByaXZhdGUgc2NoZW1hOiBDb25maWdTY2hlbWE7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihzY2hlbWE6IENvbmZpZ1NjaGVtYSkge1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMudmFsaWRhdGVTY2hlbWEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGZpbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGJ5IHRyYW5zZm9ybWluZyBhbmQgdmFsaWRhdGluZ1xuICAgKlxuICAgKiAgVCAtIFRoZSB0eXBlIG9mIHRoZSBmaW5hbCBub3JtYWxpemVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7VH0gVGhlIG5vcm1hbGl6ZWQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICovXG4gIGJ1aWxkQ29uZmlncyA9IDxUPigpOiBUID0+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
|