angular-odata 0.95.0 → 0.99.5
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/README.md +31 -25
- package/esm2020/lib/cache/cache.mjs +2 -2
- package/esm2020/lib/client.mjs +3 -3
- package/esm2020/lib/models/collection.mjs +53 -48
- package/esm2020/lib/models/model.mjs +33 -37
- package/esm2020/lib/models/options.mjs +35 -14
- package/esm2020/lib/module.mjs +4 -4
- package/esm2020/lib/resources/query/builder.mjs +2 -1
- package/esm2020/lib/resources/query/expressions/base.mjs +20 -0
- package/esm2020/lib/resources/query/expressions/compute.mjs +45 -0
- package/esm2020/lib/resources/query/expressions/expand.mjs +121 -0
- package/esm2020/lib/resources/query/expressions/filter.mjs +160 -0
- package/esm2020/lib/resources/query/expressions/index.mjs +7 -0
- package/esm2020/lib/resources/query/expressions/orderby.mjs +62 -0
- package/esm2020/lib/resources/query/expressions/search.mjs +125 -0
- package/esm2020/lib/resources/query/expressions/select.mjs +37 -0
- package/esm2020/lib/resources/query/expressions/syntax.mjs +404 -0
- package/esm2020/lib/resources/query/handlers.mjs +22 -20
- package/esm2020/lib/resources/query/options.mjs +34 -37
- package/esm2020/lib/resources/resource.mjs +6 -14
- package/esm2020/lib/resources/types/action.mjs +4 -1
- package/esm2020/lib/resources/types/batch.mjs +36 -10
- package/esm2020/lib/resources/types/count.mjs +4 -1
- package/esm2020/lib/resources/types/entity-set.mjs +4 -1
- package/esm2020/lib/resources/types/entity.mjs +6 -3
- package/esm2020/lib/resources/types/function.mjs +4 -1
- package/esm2020/lib/resources/types/media.mjs +4 -1
- package/esm2020/lib/resources/types/metadata.mjs +4 -1
- package/esm2020/lib/resources/types/navigation-property.mjs +4 -1
- package/esm2020/lib/resources/types/property.mjs +4 -1
- package/esm2020/lib/resources/types/reference.mjs +4 -1
- package/esm2020/lib/resources/types/singleton.mjs +4 -1
- package/esm2020/lib/resources/types/value.mjs +4 -1
- package/esm2020/lib/schema/element.mjs +12 -2
- package/esm2020/lib/schema/enum-type.mjs +9 -1
- package/esm2020/lib/schema/structured-type.mjs +11 -2
- package/esm2020/lib/services/entity-set.mjs +6 -6
- package/esm2020/lib/services/factory.mjs +3 -3
- package/esm2020/lib/types.mjs +2 -1
- package/esm2020/lib/utils/objects.mjs +5 -1
- package/fesm2015/angular-odata.mjs +751 -297
- package/fesm2015/angular-odata.mjs.map +1 -1
- package/fesm2020/angular-odata.mjs +750 -301
- package/fesm2020/angular-odata.mjs.map +1 -1
- package/lib/models/collection.d.ts +4 -2
- package/lib/models/model.d.ts +1 -1
- package/lib/models/options.d.ts +12 -10
- package/lib/resources/query/builder.d.ts +1 -0
- package/lib/resources/query/expressions/base.d.ts +20 -0
- package/lib/resources/query/expressions/compute.d.ts +27 -0
- package/lib/resources/query/expressions/expand.d.ts +68 -0
- package/lib/resources/query/expressions/filter.d.ts +59 -0
- package/lib/resources/query/expressions/index.d.ts +6 -0
- package/lib/resources/query/expressions/orderby.d.ts +39 -0
- package/lib/resources/query/expressions/search.d.ts +50 -0
- package/lib/resources/query/expressions/select.d.ts +22 -0
- package/lib/resources/query/{syntax.d.ts → expressions/syntax.d.ts} +21 -9
- package/lib/resources/query/handlers.d.ts +27 -12
- package/lib/resources/query/options.d.ts +10 -8
- package/lib/resources/resource.d.ts +2 -1
- package/lib/resources/types/action.d.ts +1 -0
- package/lib/resources/types/batch.d.ts +10 -0
- package/lib/resources/types/count.d.ts +1 -0
- package/lib/resources/types/entity-set.d.ts +1 -0
- package/lib/resources/types/entity.d.ts +1 -0
- package/lib/resources/types/function.d.ts +1 -0
- package/lib/resources/types/media.d.ts +1 -0
- package/lib/resources/types/metadata.d.ts +1 -0
- package/lib/resources/types/navigation-property.d.ts +1 -0
- package/lib/resources/types/property.d.ts +1 -0
- package/lib/resources/types/reference.d.ts +1 -0
- package/lib/resources/types/singleton.d.ts +1 -0
- package/lib/resources/types/value.d.ts +1 -0
- package/lib/schema/element.d.ts +7 -1
- package/lib/schema/enum-type.d.ts +6 -0
- package/lib/schema/structured-type.d.ts +7 -1
- package/lib/types.d.ts +1 -0
- package/package.json +1 -1
- package/esm2020/lib/resources/query/expressions.mjs +0 -207
- package/esm2020/lib/resources/query/syntax.mjs +0 -406
- package/lib/resources/query/expressions.d.ts +0 -63
|
@@ -21,7 +21,7 @@ export class ODataModel {
|
|
|
21
21
|
this.events$ = new EventEmitter();
|
|
22
22
|
const Klass = this.constructor;
|
|
23
23
|
if (Klass.meta === undefined)
|
|
24
|
-
throw new Error(`Can't create model without metadata`);
|
|
24
|
+
throw new Error(`ODataModel: Can't create model without metadata`);
|
|
25
25
|
this._meta = Klass.meta;
|
|
26
26
|
this._meta.bind(this, { parent, resource, annots });
|
|
27
27
|
// Client Id
|
|
@@ -61,19 +61,19 @@ export class ODataModel {
|
|
|
61
61
|
navigationProperty(name) {
|
|
62
62
|
const field = this._meta.field(name);
|
|
63
63
|
if (field === undefined || !field.navigation)
|
|
64
|
-
throw Error(`Can't find navigation property ${name}`);
|
|
64
|
+
throw Error(`navigationProperty: Can't find navigation property ${name}`);
|
|
65
65
|
const resource = this.resource();
|
|
66
66
|
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
67
|
-
throw Error("Can't get navigation without ODataEntityResource with key");
|
|
67
|
+
throw Error("navigationProperty: Can't get navigation without ODataEntityResource with key");
|
|
68
68
|
return field.resourceFactory(resource);
|
|
69
69
|
}
|
|
70
70
|
property(name) {
|
|
71
71
|
const field = this._meta.field(name);
|
|
72
72
|
if (field === undefined || field.navigation)
|
|
73
|
-
throw Error(`Can't find property ${name}`);
|
|
73
|
+
throw Error(`property: Can't find property ${name}`);
|
|
74
74
|
const resource = this.resource();
|
|
75
75
|
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
76
|
-
throw Error("Can't get property without ODataEntityResource with key");
|
|
76
|
+
throw Error("property: Can't get property without ODataEntityResource with key");
|
|
77
77
|
return field.resourceFactory(resource);
|
|
78
78
|
}
|
|
79
79
|
attach(resource) {
|
|
@@ -218,11 +218,11 @@ export class ODataModel {
|
|
|
218
218
|
fetch({ ...options } = {}) {
|
|
219
219
|
let resource = this.resource();
|
|
220
220
|
if (resource === undefined)
|
|
221
|
-
return throwError('fetch: Resource is undefined');
|
|
221
|
+
return throwError(() => new Error('fetch: Resource is undefined'));
|
|
222
222
|
let obs$;
|
|
223
223
|
if (resource instanceof ODataEntityResource) {
|
|
224
224
|
if (!resource.hasKey())
|
|
225
|
-
return throwError("fetch: Can't fetch model without key");
|
|
225
|
+
return throwError(() => new Error("fetch: Can't fetch model without key"));
|
|
226
226
|
obs$ = resource.fetch(options);
|
|
227
227
|
}
|
|
228
228
|
else if (resource instanceof ODataNavigationPropertyResource) {
|
|
@@ -239,49 +239,45 @@ export class ODataModel {
|
|
|
239
239
|
save({ method, navigation = false, validate = true, ...options } = {}) {
|
|
240
240
|
let resource = this.resource();
|
|
241
241
|
if (resource === undefined)
|
|
242
|
-
return throwError('save: Resource is undefined');
|
|
242
|
+
return throwError(() => new Error('save: Resource is undefined'));
|
|
243
243
|
if (!(resource instanceof ODataEntityResource ||
|
|
244
244
|
resource instanceof ODataNavigationPropertyResource))
|
|
245
|
-
return throwError('save: Resource type ODataEntityResource/ODataNavigationPropertyResource needed');
|
|
245
|
+
return throwError(() => new Error('save: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
|
|
246
246
|
// Resolve method and resource key
|
|
247
247
|
if (method === undefined && this.schema().isCompoundKey())
|
|
248
|
-
return throwError('save: Composite key require a specific method, use create/update/modify');
|
|
248
|
+
return throwError(() => new Error('save: Composite key require a specific method, use create/update/modify'));
|
|
249
249
|
method = method || (!resource.hasKey() ? 'create' : 'update');
|
|
250
250
|
if (resource instanceof ODataEntityResource &&
|
|
251
251
|
(method === 'update' || method === 'modify') &&
|
|
252
252
|
!resource.hasKey())
|
|
253
|
-
return throwError('save: Update/Patch require entity key');
|
|
253
|
+
return throwError(() => new Error('save: Update/Patch require entity key'));
|
|
254
254
|
if (resource instanceof ODataNavigationPropertyResource ||
|
|
255
255
|
method === 'create')
|
|
256
256
|
resource.clearKey();
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
const _entity = this.toEntity({
|
|
260
|
-
changes_only: method === 'modify',
|
|
261
|
-
field_mapping: true,
|
|
262
|
-
include_concurrency: true,
|
|
263
|
-
include_navigation: navigation,
|
|
264
|
-
});
|
|
265
|
-
obs$ = (method === 'create'
|
|
266
|
-
? resource.create(_entity, options)
|
|
267
|
-
: method === 'modify'
|
|
268
|
-
? resource.modify(_entity, { etag: this.annots().etag, ...options })
|
|
269
|
-
: resource.update(_entity, { etag: this.annots().etag, ...options })).pipe(map(({ entity, annots }) => ({ entity: entity || _entity, annots })));
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
obs$ = throwError(this._errors);
|
|
257
|
+
if (validate && !this.isValid({ method, navigation })) {
|
|
258
|
+
return throwError(() => new Error('save: Validation errors'));
|
|
273
259
|
}
|
|
274
|
-
|
|
260
|
+
const _entity = this.toEntity({
|
|
261
|
+
changes_only: method === 'modify',
|
|
262
|
+
field_mapping: true,
|
|
263
|
+
include_concurrency: true,
|
|
264
|
+
include_navigation: navigation,
|
|
265
|
+
});
|
|
266
|
+
return this._request((method === 'create'
|
|
267
|
+
? resource.create(_entity, options)
|
|
268
|
+
: method === 'modify'
|
|
269
|
+
? resource.modify(_entity, { etag: this.annots().etag, ...options })
|
|
270
|
+
: resource.update(_entity, { etag: this.annots().etag, ...options })).pipe(map(({ entity, annots }) => ({ entity: entity || _entity, annots }))));
|
|
275
271
|
}
|
|
276
272
|
destroy({ ...options } = {}) {
|
|
277
273
|
let resource = this.resource();
|
|
278
274
|
if (resource === undefined)
|
|
279
|
-
return throwError('destroy: Resource is undefined');
|
|
275
|
+
return throwError(() => new Error('destroy: Resource is undefined'));
|
|
280
276
|
if (!(resource instanceof ODataEntityResource ||
|
|
281
277
|
resource instanceof ODataNavigationPropertyResource))
|
|
282
|
-
return throwError('destroy: Resource type ODataEntityResource/ODataNavigationPropertyResource needed');
|
|
278
|
+
return throwError(() => new Error('destroy: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
|
|
283
279
|
if (!resource.hasKey())
|
|
284
|
-
return throwError("destroy: Can't destroy model without key");
|
|
280
|
+
return throwError(() => new Error("destroy: Can't destroy model without key"));
|
|
285
281
|
const _entity = this.toEntity({ field_mapping: true });
|
|
286
282
|
const obs$ = resource
|
|
287
283
|
.destroy({ etag: this.annots().etag, ...options })
|
|
@@ -314,7 +310,7 @@ export class ODataModel {
|
|
|
314
310
|
callFunction(name, params, responseType, { ...options } = {}) {
|
|
315
311
|
const resource = this.resource();
|
|
316
312
|
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
317
|
-
return throwError("Can't call function without ODataEntityResource with key");
|
|
313
|
+
return throwError(() => new Error("callFunction: Can't call function without ODataEntityResource with key"));
|
|
318
314
|
const func = resource.function(name).query((q) => q.apply(options));
|
|
319
315
|
switch (responseType) {
|
|
320
316
|
case 'property':
|
|
@@ -330,7 +326,7 @@ export class ODataModel {
|
|
|
330
326
|
callAction(name, params, responseType, { ...options } = {}) {
|
|
331
327
|
const resource = this.resource();
|
|
332
328
|
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
333
|
-
return throwError("Can't call action without ODataEntityResource with key");
|
|
329
|
+
return throwError(() => new Error("callAction: Can't call action without ODataEntityResource with key"));
|
|
334
330
|
const action = resource.action(name).query((q) => q.apply(options));
|
|
335
331
|
switch (responseType) {
|
|
336
332
|
case 'property':
|
|
@@ -347,7 +343,7 @@ export class ODataModel {
|
|
|
347
343
|
cast(type) {
|
|
348
344
|
const resource = this.resource();
|
|
349
345
|
if (!(resource instanceof ODataEntityResource))
|
|
350
|
-
throw new Error(`Can't cast to derived model without ODataEntityResource`);
|
|
346
|
+
throw new Error(`cast: Can't cast to derived model without ODataEntityResource`);
|
|
351
347
|
return resource
|
|
352
348
|
.cast(type)
|
|
353
349
|
.asModel(this.toEntity(INCLUDE_DEEP), { annots: this.annots() });
|
|
@@ -366,7 +362,7 @@ export class ODataModel {
|
|
|
366
362
|
getValue(name, options) {
|
|
367
363
|
const field = this._meta.field(name);
|
|
368
364
|
if (field === undefined || field.navigation)
|
|
369
|
-
throw Error(`Can't find property ${name}`);
|
|
365
|
+
throw Error(`getValue: Can't find property ${name}`);
|
|
370
366
|
let value = this[name];
|
|
371
367
|
if (value === undefined) {
|
|
372
368
|
const prop = field.resourceFactory(this.resource());
|
|
@@ -413,7 +409,7 @@ export class ODataModel {
|
|
|
413
409
|
getReference(name) {
|
|
414
410
|
const field = this._meta.field(name);
|
|
415
411
|
if (field === undefined || !field.navigation)
|
|
416
|
-
throw Error(`Can't find navigation property ${name}`);
|
|
412
|
+
throw Error(`getReference: Can't find navigation property ${name}`);
|
|
417
413
|
let model = this[name];
|
|
418
414
|
if (model === undefined) {
|
|
419
415
|
const value = field.collection ? [] : this.referenced(field);
|
|
@@ -450,4 +446,4 @@ export class ODataModel {
|
|
|
450
446
|
}
|
|
451
447
|
}
|
|
452
448
|
export const RESERVED_FIELD_NAMES = Object.getOwnPropertyNames(ODataModel.prototype);
|
|
453
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFJTCxtQkFBbUIsRUFDbkIsK0JBQStCLEdBT2hDLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUVmLGVBQWUsRUFFZixpQkFBaUIsR0FFbEIsTUFBTSxXQUFXLENBQUM7QUFFbkIsV0FBVztBQUNYLE1BQU0sT0FBTyxVQUFVO0lBbURyQixZQUNFLE9BQTZDLEVBQUUsRUFDL0MsRUFDRSxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEdBQUcsS0FBSyxNQVNYLEVBQUU7UUFsQ1IsU0FBUztRQUNULFlBQU8sR0FLSSxJQUFJLENBQUM7UUFDaEIsZ0JBQVcsR0FBNEIsRUFBRSxDQUFDO1FBQzFDLGFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBQ3ZDLGVBQVUsR0FBZ0QsRUFBRSxDQUFDO1FBQzdELGNBQVMsR0FBNEIsSUFBSSxDQUFDO1FBRTFDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixZQUFPLEdBQVksS0FBSyxDQUFDO1FBRXpCLFNBQVM7UUFD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QUFDLFdBQVcsQ0FBQztRQUN0QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJO1lBQzFCLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBdUM7WUFDeEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQzVELFVBQVUsQ0FBQyxTQUFTLENBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZvcmtKb2luLCBORVZFUiwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUVudGl0eSxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlBcmd1bWVudHNPcHRpb25zLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7IE9iamVjdHMsIFN0cmluZ3MsIFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgT0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIElOQ0xVREVfREVFUCxcbiAgSU5DTFVERV9TSEFMTE9XLFxuICBNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxFdmVudCxcbiAgT0RhdGFNb2RlbEZpZWxkLFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbFJlbGF0aW9uLFxufSBmcm9tICcuL29wdGlvbnMnO1xuXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWw8VD4ge1xuICAvLyBQcm9wZXJ0aWVzXG4gIHN0YXRpYyBvcHRpb25zOiBNb2RlbE9wdGlvbnM7XG4gIHN0YXRpYyBtZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBzdGF0aWMgYnVpbGRNZXRhPFQ+KHtcbiAgICBvcHRpb25zLFxuICAgIHNjaGVtYSxcbiAgfToge1xuICAgIG9wdGlvbnM/OiBNb2RlbE9wdGlvbnM7XG4gICAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICB9KSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGZpZWxkcyA9IHNjaGVtYVxuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICAgICAgbGV0IG5hbWUgPSBmLm5hbWU7XG4gICAgICAgICAgLy8gUHJldmVudCBjb2xsaXNpb24gd2l0aCByZXNlcnZlZCBrZXl3b3Jkc1xuICAgICAgICAgIHdoaWxlIChSRVNFUlZFRF9GSUVMRF9OQU1FUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnXyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgIGZpZWxkOiBmLm5hbWUsXG4gICAgICAgICAgICAgIGRlZmF1bHQ6IGYuZGVmYXVsdCxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6ICFmLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwge30pO1xuICAgICAgb3B0aW9ucyA9IHsgZmllbGRzIH07XG4gICAgfVxuICAgIHRoaXMubWV0YSA9IG5ldyBPRGF0YU1vZGVsT3B0aW9uczxUPih7IG9wdGlvbnMsIHNjaGVtYSB9KTtcbiAgfVxuICAvLyBQYXJlbnRcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdXG4gICAgfCBudWxsID0gbnVsbDtcbiAgX2F0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge307XG4gIF9jaGFuZ2VzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBfcmVsYXRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBPRGF0YU1vZGVsUmVsYXRpb248YW55PiB9ID0ge307XG4gIF9yZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPiB8IG51bGwgPSBudWxsO1xuICBfYW5ub3RhdGlvbnMhOiBPRGF0YUVudGl0eUFubm90YXRpb25zO1xuICBfcmVzZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX3JlcGFyZW50OiBib29sZWFuID0gZmFsc2U7XG4gIF9zaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX21ldGE6IE9EYXRhTW9kZWxPcHRpb25zPFQ+O1xuICAvLyBFdmVudHNcbiAgZXZlbnRzJCA9IG5ldyBFdmVudEVtaXR0ZXI8T0RhdGFNb2RlbEV2ZW50PFQ+PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgXTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM7XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IEtsYXNzID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICBpZiAoS2xhc3MubWV0YSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBjcmVhdGUgbW9kZWwgd2l0aG91dCBtZXRhZGF0YWApO1xuICAgIHRoaXMuX21ldGEgPSBLbGFzcy5tZXRhO1xuICAgIHRoaXMuX21ldGEuYmluZCh0aGlzLCB7IHBhcmVudCwgcmVzb3VyY2UsIGFubm90cyB9KTtcblxuICAgIC8vIENsaWVudCBJZFxuICAgICg8YW55PnRoaXMpW3RoaXMuX21ldGEuY2lkXSA9XG4gICAgICAoPGFueT5kYXRhKVt0aGlzLl9tZXRhLmNpZF0gfHxcbiAgICAgIFN0cmluZ3MudW5pcXVlSWQoYCR7S2xhc3MubWV0YS5zY2hlbWEubmFtZS50b0xvd2VyQ2FzZSgpfS1gKTtcblxuICAgIGxldCBhdHRycyA9IHRoaXMuYW5ub3RzKCkuYXR0cmlidXRlczxUPihkYXRhLCAnZnVsbCcpO1xuICAgIGxldCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdHMoKTtcblxuICAgIHRoaXMuYXNzaWduKE9iamVjdHMubWVyZ2UoZGVmYXVsdHMsIGF0dHJzKSwgeyByZXNldCB9KTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBSZXNvdXJjZXNcbiAgcmVzb3VyY2UoKTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzXG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPjtcbiAgfVxuXG4gIG5hdmlnYXRpb25Qcm9wZXJ0eTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nXG4gICk6IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZChuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCAhZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBDYW4ndCBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHkgJHtuYW1lfWApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcIkNhbid0IGdldCBuYXZpZ2F0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiKTtcblxuICAgIHJldHVybiBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgTj4oXG4gICAgICByZXNvdXJjZVxuICAgICkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPjtcbiAgfVxuXG4gIHByb3BlcnR5PE4+KG5hbWU6IHN0cmluZyk6IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxOPiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpZWxkKG5hbWUpO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IGZpZWxkLm5hdmlnYXRpb24pXG4gICAgICB0aHJvdyBFcnJvcihgQ2FuJ3QgZmluZCBwcm9wZXJ0eSAke25hbWV9YCk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHRocm93IEVycm9yKFwiQ2FuJ3QgZ2V0IHByb3BlcnR5IHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiKTtcblxuICAgIHJldHVybiBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgTj4ocmVzb3VyY2UpIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxOPjtcbiAgfVxuXG4gIGF0dGFjaChcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmF0dGFjaCh0aGlzLCByZXNvdXJjZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgc2NoZW1hKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnNjaGVtYTtcbiAgfVxuXG4gIGFubm90cygpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gIH1cblxuICBrZXkoe1xuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICByZXNvbHZlID0gdHJ1ZSxcbiAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9KTpcbiAgICB8IEVudGl0eUtleTxUPlxuICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZUtleSh0aGlzLCB7IGZpZWxkX21hcHBpbmcsIHJlc29sdmUgfSk7XG4gIH1cblxuICBpc05ldygpIHtcbiAgICByZXR1cm4gdGhpcy5rZXkoKSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNQYXJlbnRPZihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hpbGQgIT09IHRoaXMgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKS5zb21lKChwKSA9PiBwWzBdID09PSB0aGlzKVxuICAgICk7XG4gIH1cblxuICByZWZlcmVudGlhbChcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbnRpYWwodGhpcywgZmllbGQsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgcmVmZXJlbmNlZChcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbmNlZCh0aGlzLCBmaWVsZCwge1xuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIHJlc29sdmUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBWYWxpZGF0aW9uXG4gIF9lcnJvcnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICB2YWxpZGF0ZSh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgfToge1xuICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEudmFsaWRhdGUodGhpcywgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gIH1cblxuICBpc1ZhbGlkKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICB9OiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICB9ID0ge30pOiBib29sZWFuIHtcbiAgICB0aGlzLl9lcnJvcnMgPSB0aGlzLnZhbGlkYXRlKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICAgIGlmICh0aGlzLl9lcnJvcnMgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdpbnZhbGlkJywge1xuICAgICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgICAgb3B0aW9uczogeyBtZXRob2QgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9ycyA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuZGVmYXVsdHMoKSB8fCB7fTtcbiAgfVxuXG4gIHRvRW50aXR5KHtcbiAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICBjaGFpbiA9IFtdLFxuICB9OiB7XG4gICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICB9ID0ge30pOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnRvRW50aXR5KHRoaXMsIHtcbiAgICAgIGNsaWVudF9pZCxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9rZXksXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgIGNoYW5nZXNfb25seSxcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICBjaGFpbixcbiAgICB9KTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0VudGl0eSgpO1xuICB9XG5cbiAgYXR0cmlidXRlcyh7XG4gICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgfToge1xuICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICB9ID0ge30pOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuYXR0cmlidXRlcyh0aGlzLCB7XG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICB9KTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSAoPGFueT50aGlzKVtwYXRoQXJyYXlbMF1dO1xuICAgICAgcmV0dXJuIG1vZGVsLnNldChwYXRoQXJyYXkuc2xpY2UoMSksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiAoKDxhbnk+dGhpcylbcGF0aEFycmF5WzBdXSA9IHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gKDxhbnk+dGhpcylbcGF0aEFycmF5WzBdXTtcbiAgICBpZiAoXG4gICAgICBwYXRoQXJyYXkubGVuZ3RoID4gMSAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgT0RhdGFNb2RlbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbilcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZS5nZXQocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmVzZXQoe1xuICAgIHBhdGgsXG4gICAgc2lsZW50ID0gZmFsc2UsXG4gIH06IHsgcGF0aD86IHN0cmluZyB8IHN0cmluZ1tdOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGNvbnN0IHBhdGhBcnJheTogc3RyaW5nW10gPSAoXG4gICAgICBwYXRoID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbXVxuICAgICAgICA6IFR5cGVzLmlzQXJyYXkocGF0aClcbiAgICAgICAgPyBwYXRoXG4gICAgICAgIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoQXJyYXlbMF07XG4gICAgY29uc3QgdmFsdWUgPSBuYW1lICE9PSB1bmRlZmluZWQgPyAoPGFueT50aGlzKVtuYW1lXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSB8fFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKVxuICAgICkge1xuICAgICAgdmFsdWUucmVzZXQoeyBwYXRoOiBwYXRoQXJyYXkuc2xpY2UoMSksIHNpbGVudCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbWV0YS5yZXNldCh0aGlzLCB7IG5hbWU6IHBhdGhBcnJheVswXSwgc2lsZW50IH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBlbnRpdHk6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgIH06IHsgcmVzZXQ/OiBib29sZWFuOyByZXBhcmVudD86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmFzc2lnbih0aGlzLCBlbnRpdHksIHsgcmVzZXQsIHNpbGVudCwgcmVwYXJlbnQgfSk7XG4gIH1cblxuICBjbG9uZTxNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj4oKSB7XG4gICAgbGV0IEN0b3IgPSA8dHlwZW9mIE9EYXRhTW9kZWw+dGhpcy5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gbmV3IEN0b3IodGhpcy50b0VudGl0eShJTkNMVURFX1NIQUxMT1cpLCB7XG4gICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSgpIGFzIE9EYXRhUmVzb3VyY2U8VD4sXG4gICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCksXG4gICAgfSkgYXMgTTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3Qob2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0eTxhbnk+Pik6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgncmVxdWVzdCcsIHtcbiAgICAgICAgbW9kZWw6IHRoaXMsXG4gICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4ge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgICAgdGhpcy5hc3NpZ24oYW5ub3RzLmF0dHJpYnV0ZXM8VD4oZW50aXR5IHx8IHt9LCAnZnVsbCcpLCB7XG4gICAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdzeW5jJywge1xuICAgICAgICAgICAgbW9kZWw6IHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zOiB7IGVudGl0eSwgYW5ub3RzIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBmZXRjaCh7XG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9ucztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ2ZldGNoOiBSZXNvdXJjZSBpcyB1bmRlZmluZWQnKTtcblxuICAgIGxldCBvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PFQ+PjtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB7XG4gICAgICBpZiAoIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihcImZldGNoOiBDYW4ndCBmZXRjaCBtb2RlbCB3aXRob3V0IGtleVwiKTtcbiAgICAgIG9icyQgPSByZXNvdXJjZS5mZXRjaChvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSkge1xuICAgICAgb2JzJCA9IHJlc291cmNlLmZldGNoKHsgcmVzcG9uc2VUeXBlOiAnZW50aXR5JywgLi4ub3B0aW9ucyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JzJCA9IChyZXNvdXJjZSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD4pLmZldGNoKHtcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnZW50aXR5JyxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkKTtcbiAgfVxuXG4gIHNhdmUoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgdmFsaWRhdGUgPSB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB2YWxpZGF0ZT86IGJvb2xlYW47XG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9ucztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ3NhdmU6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgJ3NhdmU6IFJlc291cmNlIHR5cGUgT0RhdGFFbnRpdHlSZXNvdXJjZS9PRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIG5lZWRlZCdcbiAgICAgICk7XG5cbiAgICAvLyBSZXNvbHZlIG1ldGhvZCBhbmQgcmVzb3VyY2Uga2V5XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKCkuaXNDb21wb3VuZEtleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICdzYXZlOiBDb21wb3NpdGUga2V5IHJlcXVpcmUgYSBzcGVjaWZpYyBtZXRob2QsIHVzZSBjcmVhdGUvdXBkYXRlL21vZGlmeSdcbiAgICAgICk7XG4gICAgbWV0aG9kID0gbWV0aG9kIHx8ICghcmVzb3VyY2UuaGFzS2V5KCkgPyAnY3JlYXRlJyA6ICd1cGRhdGUnKTtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgJiZcbiAgICAgIChtZXRob2QgPT09ICd1cGRhdGUnIHx8IG1ldGhvZCA9PT0gJ21vZGlmeScpICYmXG4gICAgICAhcmVzb3VyY2UuaGFzS2V5KClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignc2F2ZTogVXBkYXRlL1BhdGNoIHJlcXVpcmUgZW50aXR5IGtleScpO1xuICAgIGlmIChcbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgbWV0aG9kID09PSAnY3JlYXRlJ1xuICAgIClcbiAgICAgIHJlc291cmNlLmNsZWFyS2V5KCk7XG5cbiAgICBsZXQgb2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0eTxhbnk+PjtcbiAgICBpZiAoIXZhbGlkYXRlIHx8IHRoaXMuaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSkge1xuICAgICAgY29uc3QgX2VudGl0eSA9IHRoaXMudG9FbnRpdHkoe1xuICAgICAgICBjaGFuZ2VzX29ubHk6IG1ldGhvZCA9PT0gJ21vZGlmeScsXG4gICAgICAgIGZpZWxkX21hcHBpbmc6IHRydWUsXG4gICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogbmF2aWdhdGlvbixcbiAgICAgIH0pIGFzIFQ7XG4gICAgICBvYnMkID0gKFxuICAgICAgICBtZXRob2QgPT09ICdjcmVhdGUnXG4gICAgICAgICAgPyByZXNvdXJjZS5jcmVhdGUoX2VudGl0eSwgb3B0aW9ucylcbiAgICAgICAgICA6IG1ldGhvZCA9PT0gJ21vZGlmeSdcbiAgICAgICAgICA/IHJlc291cmNlLm1vZGlmeShfZW50aXR5LCB7IGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZywgLi4ub3B0aW9ucyB9KVxuICAgICAgICAgIDogcmVzb3VyY2UudXBkYXRlKF9lbnRpdHksIHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pXG4gICAgICApLnBpcGUoXG4gICAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiAoeyBlbnRpdHk6IGVudGl0eSB8fCBfZW50aXR5LCBhbm5vdHMgfSkpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnMkID0gdGhyb3dFcnJvcih0aGlzLl9lcnJvcnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkKTtcbiAgfVxuXG4gIGRlc3Ryb3koe1xuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdkZXN0cm95OiBSZXNvdXJjZSBpcyB1bmRlZmluZWQnKTtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICdkZXN0cm95OiBSZXNvdXJjZSB0eXBlIE9EYXRhRW50aXR5UmVzb3VyY2UvT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSBuZWVkZWQnXG4gICAgICApO1xuICAgIGlmICghcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcImRlc3Ryb3k6IENhbid0IGRlc3Ryb3kgbW9kZWwgd2l0aG91dCBrZXlcIik7XG5cbiAgICBjb25zdCBfZW50aXR5ID0gdGhpcy50b0VudGl0eSh7IGZpZWxkX21hcHBpbmc6IHRydWUgfSkgYXMgVDtcbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2VcbiAgICAgIC5kZXN0cm95KHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGVudGl0eSwgYW5ub3RzIH0pID0+ICh7IGVudGl0eTogZW50aXR5IHx8IF9lbnRpdHksIGFubm90cyB9KSlcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCkucGlwZShcbiAgICAgIHRhcCgoKSA9PlxuICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChuZXcgT0RhdGFNb2RlbEV2ZW50KCdkZXN0cm95JywgeyBtb2RlbDogdGhpcyB9KSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleGVjdXRpb24gY29udGV4dCBmb3IgY2hhbmdlIHRoZSBpbnRlcm5hbCBxdWVyeSBvZiBhIHJlc291cmNlXG4gICAqIEBwYXJhbSBmdW5jIEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIHF1ZXJ5KGZ1bmM6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4pID0+IHZvaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5xdWVyeSh0aGlzLCB0aGlzLnJlc291cmNlKCksIGZ1bmMpIGFzIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGNoZWNrIG9uIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbW9kZWwgYW5kIHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBpcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gaW5jbHVkZV9uYXZpZ2F0aW9uIENoZWNrIGluIG5hdmlnYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBtb2RlbCBoYXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBoYXNDaGFuZ2VkKHtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmhhc0NoYW5nZWQodGhpcywgeyBpbmNsdWRlX25hdmlnYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIGdpdmVuIGZ1bmN0aW9uLCB3aGVyZSB0aGUgbW9kZWwgaXMgYm91bmQgdG8gaXRzIGVudGl0eSBlbmRwb2ludFxuICAgKiBAcGFyYW0gY3R4IENvbnRleHQgZnVuY3Rpb25cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgY29udGV4dFxuICAgKi9cbiAgYXNFbnRpdHk8Uj4oY3R4OiAobW9kZWw6IHRoaXMpID0+IFIpOiBSIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hc0VudGl0eSh0aGlzLCBjdHgpO1xuICB9XG5cbiAgY2FsbEZ1bmN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JyB8ICdtb2RlbCcgfCAnY29sbGVjdGlvbicgfCAnbm9uZScsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgIFwiQ2FuJ3QgY2FsbCBmdW5jdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIlxuICAgICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhUXVlcnlBcmd1bWVudHNPcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICBcIkNhbid0IGNhbGwgYWN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICApO1xuXG4gICAgY29uc3QgYWN0aW9uID0gcmVzb3VyY2UuYWN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhc3RcbiAgY2FzdDxTPih0eXBlOiBzdHJpbmcpOiBPRGF0YU1vZGVsPFM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FuJ3QgY2FzdCB0byBkZXJpdmVkIG1vZGVsIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgIC5jYXN0PFM+KHR5cGUpXG4gICAgICAuYXNNb2RlbCh0aGlzLnRvRW50aXR5KElOQ0xVREVfREVFUCksIHsgYW5ub3RzOiB0aGlzLmFubm90cygpIH0pO1xuICB9XG5cbiAgZmV0Y2hOYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgbmFtZToga2V5b2YgVCB8IHN0cmluZyxcbiAgICByZXNwb25zZVR5cGU6ICdtb2RlbCcgfCAnY29sbGVjdGlvbicsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8Uz4gPSB7fVxuICApOiBPYnNlcnZhYmxlPE9EYXRhTW9kZWw8Uz4gfCBPRGF0YUNvbGxlY3Rpb248UywgT0RhdGFNb2RlbDxTPj4gfCBudWxsPiB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgICBuYW1lXG4gICAgKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFM+O1xuICAgIG5hdi5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIG5hdi5mZXRjaE1vZGVsKG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBuYXYuZmV0Y2hDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBWYWx1ZVxuICBnZXRWYWx1ZTxQPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTxQIHwgT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGw+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQobmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBDYW4ndCBmaW5kIHByb3BlcnR5ICR7bmFtZX1gKTtcblxuICAgIGxldCB2YWx1ZSA9ICh0aGlzIGFzIGFueSlbbmFtZV0gYXNcbiAgICAgIHwgUFxuICAgICAgfCBPRGF0YU1vZGVsPFA+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PjtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcHJvcCA9IGZpZWxkLnJlc291cmNlRmFjdG9yeShcbiAgICAgICAgdGhpcy5yZXNvdXJjZSgpXG4gICAgICApIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxQPjtcbiAgICAgIHJldHVybiBmaWVsZC5jb2xsZWN0aW9uXG4gICAgICAgID8gcHJvcFxuICAgICAgICAgICAgLmZldGNoQ29sbGVjdGlvbihvcHRpb25zKVxuICAgICAgICAgICAgLnBpcGUodGFwKChjKSA9PiB0aGlzLmFzc2lnbih7IFtuYW1lXTogYyB9LCB7IHNpbGVudDogdHJ1ZSB9KSkpXG4gICAgICAgIDogZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgID8gcHJvcFxuICAgICAgICAgICAgLmZldGNoTW9kZWwob3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRhcCgoYykgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IGMgfSwgeyBzaWxlbnQ6IHRydWUgfSkpKVxuICAgICAgICA6IHByb3BcbiAgICAgICAgICAgIC5mZXRjaFByb3BlcnR5KG9wdGlvbnMpXG4gICAgICAgICAgICAucGlwZSh0YXAoKGMpID0+IHRoaXMuYXNzaWduKHsgW25hbWVdOiBjIH0sIHsgc2lsZW50OiB0cnVlIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiBvZih2YWx1ZSBhcyBQKTtcbiAgfVxuXG4gIC8vIFNldCBSZWZlcmVuY2VcbiAgc2V0UmVmZXJlbmNlPE4+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8Tj4gfCBPRGF0YUNvbGxlY3Rpb248TiwgT0RhdGFNb2RlbDxOPj4gfCBudWxsLFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gKFxuICAgICAgdGhpcy5uYXZpZ2F0aW9uUHJvcGVydHk8Tj4obmFtZSkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPlxuICAgICkucmVmZXJlbmNlKCk7XG5cbiAgICBjb25zdCBldGFnID0gdGhpcy5hbm5vdHMoKS5ldGFnO1xuICAgIGxldCBvYnMkID0gTkVWRVIgYXMgT2JzZXJ2YWJsZTxhbnk+O1xuICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIE9EYXRhTW9kZWwpIHtcbiAgICAgIG9icyQgPSByZWZlcmVuY2Uuc2V0KFxuICAgICAgICBtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgeyBldGFnLCAuLi5vcHRpb25zIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbikge1xuICAgICAgb2JzJCA9IGZvcmtKb2luKFxuICAgICAgICBtb2RlbFxuICAgICAgICAgIC5tb2RlbHMoKVxuICAgICAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgICAgICByZWZlcmVuY2UuYWRkKFxuICAgICAgICAgICAgICBtLl9tZXRhLmVudGl0eVJlc291cmNlKG0pIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kZWwgPT09IG51bGwpIHtcbiAgICAgIG9icyQgPSByZWZlcmVuY2UudW5zZXQoeyBldGFnLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlcXVlc3QnLCB7XG4gICAgICAgIG1vZGVsOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgbWFwKChtb2RlbCkgPT4ge1xuICAgICAgICB0aGlzLmFzc2lnbih7IFtuYW1lXTogbW9kZWwgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3N5bmMnLCB7IG1vZGVsOiB0aGlzIH0pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRSZWZlcmVuY2U8UD4oXG4gICAgbmFtZToga2V5b2YgVCB8IHN0cmluZ1xuICApOiBPRGF0YU1vZGVsPFA+IHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQobmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgIWZpZWxkLm5hdmlnYXRpb24pXG4gICAgICB0aHJvdyBFcnJvcihgQ2FuJ3QgZmluZCBuYXZpZ2F0aW9uIHByb3BlcnR5ICR7bmFtZX1gKTtcblxuICAgIGxldCBtb2RlbCA9ICh0aGlzIGFzIGFueSlbbmFtZV0gYXNcbiAgICAgIHwgT0RhdGFNb2RlbDxQPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248UCwgT0RhdGFNb2RlbDxQPj47XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuY29sbGVjdGlvbiA/IFtdIDogdGhpcy5yZWZlcmVuY2VkKGZpZWxkKTtcbiAgICAgIG1vZGVsID0gZmllbGQubW9kZWxDb2xsZWN0aW9uRmFjdG9yeTxULCBQPih7IHBhcmVudDogdGhpcywgdmFsdWUgfSk7XG4gICAgICAodGhpcyBhcyBhbnkpW25hbWVdID0gbW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8vIE1vZGVsIGZ1bmN0aW9uc1xuICBlcXVhbHMob3RoZXI6IE9EYXRhTW9kZWw8VD4pIHtcbiAgICBjb25zdCB0aGlzS2V5ID0gdGhpcy5rZXkoKTtcbiAgICBjb25zdCBvdGhlcktleSA9IG90aGVyLmtleSgpO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzID09PSBvdGhlciB8fFxuICAgICAgKHR5cGVvZiB0aGlzID09PSB0eXBlb2Ygb3RoZXIgJiZcbiAgICAgICAgKCg8YW55PnRoaXMpW3RoaXMuX21ldGEuY2lkXSA9PT0gKDxhbnk+b3RoZXIpW3RoaXMuX21ldGEuY2lkXSB8fFxuICAgICAgICAgICh0aGlzS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG90aGVyS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIFR5cGVzLmlzRXF1YWwodGhpc0tleSwgb3RoZXJLZXkpKSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ01vZGVsJztcbiAgfVxuXG4gIGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHRoaXMuX3BhcmVudFswXSlcbiAgICAgID8gKHRoaXMuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5leHQoKTogT0RhdGFNb2RlbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbigpPy5uZXh0KHRoaXMpO1xuICB9XG5cbiAgcHJldigpOiBPRGF0YU1vZGVsPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uKCk/LnByZXYodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFJFU0VSVkVEX0ZJRUxEX05BTUVTID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gIE9EYXRhTW9kZWwucHJvdG90eXBlXG4pO1xuIl19
|
|
449
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFJTCxtQkFBbUIsRUFDbkIsK0JBQStCLEdBT2hDLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUVmLGVBQWUsRUFFZixpQkFBaUIsR0FFbEIsTUFBTSxXQUFXLENBQUM7QUFFbkIsV0FBVztBQUNYLE1BQU0sT0FBTyxVQUFVO0lBbURyQixZQUNFLE9BQTZDLEVBQUUsRUFDL0MsRUFDRSxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEdBQUcsS0FBSyxNQVNYLEVBQUU7UUFsQ1IsU0FBUztRQUNULFlBQU8sR0FLSSxJQUFJLENBQUM7UUFDaEIsZ0JBQVcsR0FBNEIsRUFBRSxDQUFDO1FBQzFDLGFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBQ3ZDLGVBQVUsR0FBZ0QsRUFBRSxDQUFDO1FBQzdELGNBQVMsR0FBNEIsSUFBSSxDQUFDO1FBRTFDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixZQUFPLEdBQVksS0FBSyxDQUFDO1FBRXpCLFNBQVM7UUFD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QUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FDTCxJQUFJLEtBQUssS0FBSztZQUNkLENBQUMsT0FBTyxJQUFJLEtBQUssT0FBTyxLQUFLO2dCQUMzQixDQUFPLElBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFXLEtBQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztvQkFDM0QsQ0FBQyxPQUFPLEtBQUssU0FBUzt3QkFDcEIsUUFBUSxLQUFLLFNBQVM7d0JBQ3RCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7WUFDMUIsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUF1QztZQUN4RCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDNUQsVUFBVSxDQUFDLFNBQVMsQ0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE5FVkVSLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBFbnRpdHlLZXksXG4gIE9EYXRhRW50aXR5LFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnMsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgT2JqZWN0cywgU3RyaW5ncywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgSU5DTFVERV9ERUVQLFxuICBJTkNMVURFX1NIQUxMT1csXG4gIE1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbEV2ZW50LFxuICBPRGF0YU1vZGVsRmllbGQsXG4gIE9EYXRhTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsUmVsYXRpb24sXG59IGZyb20gJy4vb3B0aW9ucyc7XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbDxUPiB7XG4gIC8vIFByb3BlcnRpZXNcbiAgc3RhdGljIG9wdGlvbnM6IE1vZGVsT3B0aW9ucztcbiAgc3RhdGljIG1ldGE6IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIHN0YXRpYyBidWlsZE1ldGE8VD4oe1xuICAgIG9wdGlvbnMsXG4gICAgc2NoZW1hLFxuICB9OiB7XG4gICAgb3B0aW9ucz86IE1vZGVsT3B0aW9ucztcbiAgICBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIH0pIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgZmllbGRzID0gc2NoZW1hXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsIGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAucmVkdWNlKChhY2MsIGYpID0+IHtcbiAgICAgICAgICBsZXQgbmFtZSA9IGYubmFtZTtcbiAgICAgICAgICAvLyBQcmV2ZW50IGNvbGxpc2lvbiB3aXRoIHJlc2VydmVkIGtleXdvcmRzXG4gICAgICAgICAgd2hpbGUgKFJFU0VSVkVEX0ZJRUxEX05BTUVTLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgICAgICBuYW1lID0gbmFtZSArICdfJztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7XG4gICAgICAgICAgICBbbmFtZV06IHtcbiAgICAgICAgICAgICAgZmllbGQ6IGYubmFtZSxcbiAgICAgICAgICAgICAgZGVmYXVsdDogZi5kZWZhdWx0LFxuICAgICAgICAgICAgICByZXF1aXJlZDogIWYubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCB7fSk7XG4gICAgICBvcHRpb25zID0geyBmaWVsZHMgfTtcbiAgICB9XG4gICAgdGhpcy5tZXRhID0gbmV3IE9EYXRhTW9kZWxPcHRpb25zPFQ+KHsgb3B0aW9ucywgc2NoZW1hIH0pO1xuICB9XG4gIC8vIFBhcmVudFxuICBfcGFyZW50OlxuICAgIHwgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfYXR0cmlidXRlczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgX2NoYW5nZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge307XG4gIF9yZWxhdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IE9EYXRhTW9kZWxSZWxhdGlvbjxhbnk+IH0gPSB7fTtcbiAgX3Jlc291cmNlOiBPRGF0YVJlc291cmNlPFQ+IHwgbnVsbCA9IG51bGw7XG4gIF9hbm5vdGF0aW9ucyE6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM7XG4gIF9yZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuICBfcmVwYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgX3NpbGVudDogYm9vbGVhbiA9IGZhbHNlO1xuICBfbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8VD47XG4gIC8vIEV2ZW50c1xuICBldmVudHMkID0gbmV3IEV2ZW50RW1pdHRlcjxPRGF0YU1vZGVsRXZlbnQ8VD4+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdO1xuICAgICAgcmVzb3VyY2U/OiBPRGF0YVJlc291cmNlPFQ+O1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdHlBbm5vdGF0aW9ucztcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgS2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgIGlmIChLbGFzcy5tZXRhID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9EYXRhTW9kZWw6IENhbid0IGNyZWF0ZSBtb2RlbCB3aXRob3V0IG1ldGFkYXRhYCk7XG4gICAgdGhpcy5fbWV0YSA9IEtsYXNzLm1ldGE7XG4gICAgdGhpcy5fbWV0YS5iaW5kKHRoaXMsIHsgcGFyZW50LCByZXNvdXJjZSwgYW5ub3RzIH0pO1xuXG4gICAgLy8gQ2xpZW50IElkXG4gICAgKDxhbnk+dGhpcylbdGhpcy5fbWV0YS5jaWRdID1cbiAgICAgICg8YW55PmRhdGEpW3RoaXMuX21ldGEuY2lkXSB8fFxuICAgICAgU3RyaW5ncy51bmlxdWVJZChgJHtLbGFzcy5tZXRhLnNjaGVtYS5uYW1lLnRvTG93ZXJDYXNlKCl9LWApO1xuXG4gICAgbGV0IGF0dHJzID0gdGhpcy5hbm5vdHMoKS5hdHRyaWJ1dGVzPFQ+KGRhdGEsICdmdWxsJyk7XG4gICAgbGV0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0cygpO1xuXG4gICAgdGhpcy5hc3NpZ24oT2JqZWN0cy5tZXJnZShkZWZhdWx0cywgYXR0cnMpLCB7IHJlc2V0IH0pO1xuICB9XG5cbiAgLy8jcmVnaW9uIFJlc291cmNlc1xuICByZXNvdXJjZSgpOlxuICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+IHtcbiAgICByZXR1cm4gT0RhdGFNb2RlbE9wdGlvbnMucmVzb3VyY2U8VD4odGhpcykgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+O1xuICB9XG5cbiAgbmF2aWdhdGlvblByb3BlcnR5PE4+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmdcbiAgKTogT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpZWxkKG5hbWUpO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8ICFmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoYG5hdmlnYXRpb25Qcm9wZXJ0eTogQ2FuJ3QgZmluZCBuYXZpZ2F0aW9uIHByb3BlcnR5ICR7bmFtZX1gKTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFwibmF2aWdhdGlvblByb3BlcnR5OiBDYW4ndCBnZXQgbmF2aWdhdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIlxuICAgICAgKTtcblxuICAgIHJldHVybiBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgTj4oXG4gICAgICByZXNvdXJjZVxuICAgICkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPjtcbiAgfVxuXG4gIHByb3BlcnR5PE4+KG5hbWU6IHN0cmluZyk6IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxOPiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpZWxkKG5hbWUpO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IGZpZWxkLm5hdmlnYXRpb24pXG4gICAgICB0aHJvdyBFcnJvcihgcHJvcGVydHk6IENhbid0IGZpbmQgcHJvcGVydHkgJHtuYW1lfWApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJwcm9wZXJ0eTogQ2FuJ3QgZ2V0IHByb3BlcnR5IHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGZpZWxkLnJlc291cmNlRmFjdG9yeTxULCBOPihyZXNvdXJjZSkgYXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlPE4+O1xuICB9XG5cbiAgYXR0YWNoPFI+KFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFI+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Uj5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFI+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8Uj5cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuYXR0YWNoPFI+KHRoaXMsIHJlc291cmNlKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBzY2hlbWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuc2NoZW1hO1xuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIGtleSh7XG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIHJlc29sdmUgPSB0cnVlLFxuICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge30pOlxuICAgIHwgRW50aXR5S2V5PFQ+XG4gICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlS2V5KHRoaXMsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZSB9KTtcbiAgfVxuXG4gIGlzTmV3KCkge1xuICAgIHJldHVybiB0aGlzLmtleSgpID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICBpc1BhcmVudE9mKFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGlsZCAhPT0gdGhpcyAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuY2hhaW4oY2hpbGQpLnNvbWUoKHApID0+IHBbMF0gPT09IHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIHJlZmVyZW50aWFsKFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVSZWZlcmVudGlhbCh0aGlzLCBmaWVsZCwge1xuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIHJlc29sdmUsXG4gICAgfSk7XG4gIH1cblxuICByZWZlcmVuY2VkKFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVSZWZlcmVuY2VkKHRoaXMsIGZpZWxkLCB7XG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgcmVzb2x2ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRpb25cbiAgX2Vycm9ycz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIHZhbGlkYXRlKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICB9OiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS52YWxpZGF0ZSh0aGlzLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgfVxuXG4gIGlzVmFsaWQoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2Vycm9ycyA9IHRoaXMudmFsaWRhdGUoeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgaWYgKHRoaXMuX2Vycm9ycyAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2ludmFsaWQnLCB7XG4gICAgICAgICAgbW9kZWw6IHRoaXMsXG4gICAgICAgICAgdmFsdWU6IHRoaXMuX2Vycm9ycyxcbiAgICAgICAgICBvcHRpb25zOiB7IG1ldGhvZCB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWZhdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5kZWZhdWx0cygpIHx8IHt9O1xuICB9XG5cbiAgdG9FbnRpdHkoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIGNoYWluID0gW10sXG4gIH06IHtcbiAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9rZXk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gIH0gPSB7fSk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEudG9FbnRpdHkodGhpcywge1xuICAgICAgY2xpZW50X2lkLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICBpbmNsdWRlX2tleSxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgY2hhbmdlc19vbmx5LFxuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIGNoYWluLFxuICAgIH0pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvRW50aXR5KCk7XG4gIH1cblxuICBhdHRyaWJ1dGVzKHtcbiAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICB9OiB7XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gIH0gPSB7fSk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hdHRyaWJ1dGVzKHRoaXMsIHtcbiAgICAgIGNoYW5nZXNfb25seSxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBtb2RlbCA9ICg8YW55PnRoaXMpW3BhdGhBcnJheVswXV07XG4gICAgICByZXR1cm4gbW9kZWwuc2V0KHBhdGhBcnJheS5zbGljZSgxKSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuICgoPGFueT50aGlzKVtwYXRoQXJyYXlbMF1dID0gdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGFueSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmFsdWUgPSAoPGFueT50aGlzKVtwYXRoQXJyYXlbMF1dO1xuICAgIGlmIChcbiAgICAgIHBhdGhBcnJheS5sZW5ndGggPiAxICYmXG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBPRGF0YU1vZGVsIHx8IHZhbHVlIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzogc3RyaW5nIHwgc3RyaW5nW107IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgY29uc3QgcGF0aEFycmF5OiBzdHJpbmdbXSA9IChcbiAgICAgIHBhdGggPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFtdXG4gICAgICAgIDogVHlwZXMuaXNBcnJheShwYXRoKVxuICAgICAgICA/IHBhdGhcbiAgICAgICAgOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgY29uc3QgbmFtZSA9IHBhdGhBcnJheVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IG5hbWUgIT09IHVuZGVmaW5lZCA/ICg8YW55PnRoaXMpW25hbWVdIDogdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgKSB7XG4gICAgICB2YWx1ZS5yZXNldCh7IHBhdGg6IHBhdGhBcnJheS5zbGljZSgxKSwgc2lsZW50IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tZXRhLnJlc2V0KHRoaXMsIHsgbmFtZTogcGF0aEFycmF5WzBdLCBzaWxlbnQgfSk7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIGVudGl0eTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfTogeyByZXNldD86IGJvb2xlYW47IHJlcGFyZW50PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuYXNzaWduKHRoaXMsIGVudGl0eSwgeyByZXNldCwgc2lsZW50LCByZXBhcmVudCB9KTtcbiAgfVxuXG4gIGNsb25lPE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PigpIHtcbiAgICBsZXQgQ3RvciA9IDx0eXBlb2YgT0RhdGFNb2RlbD50aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBuZXcgQ3Rvcih0aGlzLnRvRW50aXR5KElOQ0xVREVfU0hBTExPVyksIHtcbiAgICAgIHJlc291cmNlOiB0aGlzLnJlc291cmNlKCkgYXMgT0RhdGFSZXNvdXJjZTxUPixcbiAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSxcbiAgICB9KSBhcyBNO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdChvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PGFueT4+KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZXF1ZXN0Jywge1xuICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICB0aGlzLmFzc2lnbihhbm5vdHMuYXR0cmlidXRlczxUPihlbnRpdHkgfHwge30sICdmdWxsJyksIHtcbiAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3N5bmMnLCB7XG4gICAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgZW50aXR5LCBhbm5vdHMgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2ZldGNoOiBSZXNvdXJjZSBpcyB1bmRlZmluZWQnKSk7XG5cbiAgICBsZXQgb2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0eTxUPj47XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkge1xuICAgICAgaWYgKCFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICAgKCkgPT4gbmV3IEVycm9yKFwiZmV0Y2g6IENhbid0IGZldGNoIG1vZGVsIHdpdGhvdXQga2V5XCIpXG4gICAgICAgICk7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2gob3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIG9icyQgPSByZXNvdXJjZS5mZXRjaCh7IHJlc3BvbnNlVHlwZTogJ2VudGl0eScsIC4uLm9wdGlvbnMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9icyQgPSAocmVzb3VyY2UgYXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+KS5mZXRjaCh7XG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2VudGl0eScsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCk7XG4gIH1cblxuICBzYXZlKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIHZhbGlkYXRlID0gdHJ1ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgdmFsaWRhdGU/OiBib29sZWFuO1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignc2F2ZTogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJykpO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnc2F2ZTogUmVzb3VyY2UgdHlwZSBPRGF0YUVudGl0eVJlc291cmNlL09EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgbmVlZGVkJ1xuICAgICAgICAgIClcbiAgICAgICk7XG5cbiAgICAvLyBSZXNvbHZlIG1ldGhvZCBhbmQgcmVzb3VyY2Uga2V5XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKCkuaXNDb21wb3VuZEtleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ3NhdmU6IENvbXBvc2l0ZSBrZXkgcmVxdWlyZSBhIHNwZWNpZmljIG1ldGhvZCwgdXNlIGNyZWF0ZS91cGRhdGUvbW9kaWZ5J1xuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgbWV0aG9kID0gbWV0aG9kIHx8ICghcmVzb3VyY2UuaGFzS2V5KCkgPyAnY3JlYXRlJyA6ICd1cGRhdGUnKTtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgJiZcbiAgICAgIChtZXRob2QgPT09ICd1cGRhdGUnIHx8IG1ldGhvZCA9PT0gJ21vZGlmeScpICYmXG4gICAgICAhcmVzb3VyY2UuaGFzS2V5KClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBVcGRhdGUvUGF0Y2ggcmVxdWlyZSBlbnRpdHkga2V5JylcbiAgICAgICk7XG4gICAgaWYgKFxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIHx8XG4gICAgICBtZXRob2QgPT09ICdjcmVhdGUnXG4gICAgKVxuICAgICAgcmVzb3VyY2UuY2xlYXJLZXkoKTtcblxuICAgIGlmICh2YWxpZGF0ZSAmJiAhdGhpcy5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFZhbGlkYXRpb24gZXJyb3JzJykpO1xuICAgIH1cbiAgICBjb25zdCBfZW50aXR5ID0gdGhpcy50b0VudGl0eSh7XG4gICAgICBjaGFuZ2VzX29ubHk6IG1ldGhvZCA9PT0gJ21vZGlmeScsXG4gICAgICBmaWVsZF9tYXBwaW5nOiB0cnVlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogbmF2aWdhdGlvbixcbiAgICB9KSBhcyBUO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgKG1ldGhvZCA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgPyByZXNvdXJjZS5jcmVhdGUoX2VudGl0eSwgb3B0aW9ucylcbiAgICAgICAgOiBtZXRob2QgPT09ICdtb2RpZnknXG4gICAgICAgID8gcmVzb3VyY2UubW9kaWZ5KF9lbnRpdHksIHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pXG4gICAgICAgIDogcmVzb3VyY2UudXBkYXRlKF9lbnRpdHksIHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pXG4gICAgICApLnBpcGUoXG4gICAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiAoeyBlbnRpdHk6IGVudGl0eSB8fCBfZW50aXR5LCBhbm5vdHMgfSkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGRlc3Ryb3koe1xuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZGVzdHJveTogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJykpO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZGVzdHJveTogUmVzb3VyY2UgdHlwZSBPRGF0YUVudGl0eVJlc291cmNlL09EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgbmVlZGVkJ1xuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgaWYgKCFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoXCJkZXN0cm95OiBDYW4ndCBkZXN0cm95IG1vZGVsIHdpdGhvdXQga2V5XCIpXG4gICAgICApO1xuXG4gICAgY29uc3QgX2VudGl0eSA9IHRoaXMudG9FbnRpdHkoeyBmaWVsZF9tYXBwaW5nOiB0cnVlIH0pIGFzIFQ7XG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlXG4gICAgICAuZGVzdHJveSh7IGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZywgLi4ub3B0aW9ucyB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiAoeyBlbnRpdHk6IGVudGl0eSB8fCBfZW50aXR5LCBhbm5vdHMgfSkpXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQpLnBpcGUoXG4gICAgICB0YXAoKCkgPT5cbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQobmV3IE9EYXRhTW9kZWxFdmVudCgnZGVzdHJveScsIHsgbW9kZWw6IHRoaXMgfSkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXhlY3V0aW9uIGNvbnRleHQgZm9yIGNoYW5nZSB0aGUgaW50ZXJuYWwgcXVlcnkgb2YgYSByZXNvdXJjZVxuICAgKiBAcGFyYW0gZnVuYyBGdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBxdWVyeShmdW5jOiAocTogT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyPFQ+KSA9PiB2b2lkKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucXVlcnkodGhpcywgdGhpcy5yZXNvdXJjZSgpLCBmdW5jKSBhcyB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBjaGVjayBvbiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG1vZGVsIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaXMgY2hhbmdlZC5cbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBDaGVjayBpbiBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzQ2hhbmdlZCh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5oYXNDaGFuZ2VkKHRoaXMsIHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleGVjdXRpb24gY29udGV4dCBmb3IgYSBnaXZlbiBmdW5jdGlvbiwgd2hlcmUgdGhlIG1vZGVsIGlzIGJvdW5kIHRvIGl0cyBlbnRpdHkgZW5kcG9pbnRcbiAgICogQHBhcmFtIGN0eCBDb250ZXh0IGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGNvbnRleHRcbiAgICovXG4gIGFzRW50aXR5PFI+KGN0eDogKG1vZGVsOiB0aGlzKSA9PiBSKTogUiB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuYXNFbnRpdHkodGhpcywgY3R4KTtcbiAgfVxuXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhUXVlcnlBcmd1bWVudHNPcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEZ1bmN0aW9uOiBDYW4ndCBjYWxsIGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICAgICAgKVxuICAgICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhUXVlcnlBcmd1bWVudHNPcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEFjdGlvbjogQ2FuJ3QgY2FsbCBhY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCJcbiAgICAgICAgICApXG4gICAgICApO1xuXG4gICAgY29uc3QgYWN0aW9uID0gcmVzb3VyY2UuYWN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhc3RcbiAgY2FzdDxTPih0eXBlOiBzdHJpbmcpOiBPRGF0YU1vZGVsPFM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2FzdDogQ2FuJ3QgY2FzdCB0byBkZXJpdmVkIG1vZGVsIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZWBcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgIC5jYXN0PFM+KHR5cGUpXG4gICAgICAuYXNNb2RlbCh0aGlzLnRvRW50aXR5KElOQ0xVREVfREVFUCksIHsgYW5ub3RzOiB0aGlzLmFubm90cygpIH0pO1xuICB9XG5cbiAgZmV0Y2hOYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgbmFtZToga2V5b2YgVCB8IHN0cmluZyxcbiAgICByZXNwb25zZVR5cGU6ICdtb2RlbCcgfCAnY29sbGVjdGlvbicsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8Uz4gPSB7fVxuICApOiBPYnNlcnZhYmxlPE9EYXRhTW9kZWw8Uz4gfCBPRGF0YUNvbGxlY3Rpb248UywgT0RhdGFNb2RlbDxTPj4gfCBudWxsPiB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgICBuYW1lXG4gICAgKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFM+O1xuICAgIG5hdi5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIG5hdi5mZXRjaE1vZGVsKG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBuYXYuZmV0Y2hDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBWYWx1ZVxuICBnZXRWYWx1ZTxQPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTxQIHwgT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGw+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQobmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBnZXRWYWx1ZTogQ2FuJ3QgZmluZCBwcm9wZXJ0eSAke25hbWV9YCk7XG5cbiAgICBsZXQgdmFsdWUgPSAodGhpcyBhcyBhbnkpW25hbWVdIGFzXG4gICAgICB8IFBcbiAgICAgIHwgT0RhdGFNb2RlbDxQPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248UCwgT0RhdGFNb2RlbDxQPj47XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBmaWVsZC5yZXNvdXJjZUZhY3RvcnkoXG4gICAgICAgIHRoaXMucmVzb3VyY2UoKVxuICAgICAgKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8UD47XG4gICAgICByZXR1cm4gZmllbGQuY29sbGVjdGlvblxuICAgICAgICA/IHByb3BcbiAgICAgICAgICAgIC5mZXRjaENvbGxlY3Rpb24ob3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRhcCgoYykgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IGMgfSwgeyBzaWxlbnQ6IHRydWUgfSkpKVxuICAgICAgICA6IGZpZWxkLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgICA/IHByb3BcbiAgICAgICAgICAgIC5mZXRjaE1vZGVsKG9wdGlvbnMpXG4gICAgICAgICAgICAucGlwZSh0YXAoKGMpID0+IHRoaXMuYXNzaWduKHsgW25hbWVdOiBjIH0sIHsgc2lsZW50OiB0cnVlIH0pKSlcbiAgICAgICAgOiBwcm9wXG4gICAgICAgICAgICAuZmV0Y2hQcm9wZXJ0eShvcHRpb25zKVxuICAgICAgICAgICAgLnBpcGUodGFwKChjKSA9PiB0aGlzLmFzc2lnbih7IFtuYW1lXTogYyB9LCB7IHNpbGVudDogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2YodmFsdWUgYXMgUCk7XG4gIH1cblxuICAvLyBTZXQgUmVmZXJlbmNlXG4gIHNldFJlZmVyZW5jZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zXG4gICk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IChcbiAgICAgIHRoaXMubmF2aWdhdGlvblByb3BlcnR5PE4+KG5hbWUpIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj5cbiAgICApLnJlZmVyZW5jZSgpO1xuXG4gICAgY29uc3QgZXRhZyA9IHRoaXMuYW5ub3RzKCkuZXRhZztcbiAgICBsZXQgb2JzJCA9IE5FVkVSIGFzIE9ic2VydmFibGU8YW55PjtcbiAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBPRGF0YU1vZGVsKSB7XG4gICAgICBvYnMkID0gcmVmZXJlbmNlLnNldChcbiAgICAgICAgbW9kZWwuX21ldGEuZW50aXR5UmVzb3VyY2UobW9kZWwpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgIHsgZXRhZywgLi4ub3B0aW9ucyB9XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBPRGF0YUNvbGxlY3Rpb24pIHtcbiAgICAgIG9icyQgPSBmb3JrSm9pbihcbiAgICAgICAgbW9kZWxcbiAgICAgICAgICAubW9kZWxzKClcbiAgICAgICAgICAubWFwKChtKSA9PlxuICAgICAgICAgICAgcmVmZXJlbmNlLmFkZChcbiAgICAgICAgICAgICAgbS5fbWV0YS5lbnRpdHlSZXNvdXJjZShtKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPE4+LFxuICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsID09PSBudWxsKSB7XG4gICAgICBvYnMkID0gcmVmZXJlbmNlLnVuc2V0KHsgZXRhZywgLi4ub3B0aW9ucyB9KTtcbiAgICB9XG4gICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZXF1ZXN0Jywge1xuICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgobW9kZWwpID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pO1xuICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChuZXcgT0RhdGFNb2RlbEV2ZW50KCdzeW5jJywgeyBtb2RlbDogdGhpcyB9KSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UmVmZXJlbmNlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmdcbiAgKTogT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpZWxkKG5hbWUpO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8ICFmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoYGdldFJlZmVyZW5jZTogQ2FuJ3QgZmluZCBuYXZpZ2F0aW9uIHByb3BlcnR5ICR7bmFtZX1gKTtcblxuICAgIGxldCBtb2RlbCA9ICh0aGlzIGFzIGFueSlbbmFtZV0gYXNcbiAgICAgIHwgT0RhdGFNb2RlbDxQPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248UCwgT0RhdGFNb2RlbDxQPj47XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuY29sbGVjdGlvbiA/IFtdIDogdGhpcy5yZWZlcmVuY2VkKGZpZWxkKTtcbiAgICAgIG1vZGVsID0gZmllbGQubW9kZWxDb2xsZWN0aW9uRmFjdG9yeTxULCBQPih7IHBhcmVudDogdGhpcywgdmFsdWUgfSk7XG4gICAgICAodGhpcyBhcyBhbnkpW25hbWVdID0gbW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8vIE1vZGVsIGZ1bmN0aW9uc1xuICBlcXVhbHMob3RoZXI6IE9EYXRhTW9kZWw8VD4pIHtcbiAgICBjb25zdCB0aGlzS2V5ID0gdGhpcy5rZXkoKTtcbiAgICBjb25zdCBvdGhlcktleSA9IG90aGVyLmtleSgpO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzID09PSBvdGhlciB8fFxuICAgICAgKHR5cGVvZiB0aGlzID09PSB0eXBlb2Ygb3RoZXIgJiZcbiAgICAgICAgKCg8YW55PnRoaXMpW3RoaXMuX21ldGEuY2lkXSA9PT0gKDxhbnk+b3RoZXIpW3RoaXMuX21ldGEuY2lkXSB8fFxuICAgICAgICAgICh0aGlzS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG90aGVyS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIFR5cGVzLmlzRXF1YWwodGhpc0tleSwgb3RoZXJLZXkpKSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ01vZGVsJztcbiAgfVxuXG4gIGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHRoaXMuX3BhcmVudFswXSlcbiAgICAgID8gKHRoaXMuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5leHQoKTogT0RhdGFNb2RlbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbigpPy5uZXh0KHRoaXMpO1xuICB9XG5cbiAgcHJldigpOiBPRGF0YU1vZGVsPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uKCk/LnByZXYodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFJFU0VSVkVEX0ZJRUxEX05BTUVTID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gIE9EYXRhTW9kZWwucHJvdG90eXBlXG4pO1xuIl19
|