angular-odata 0.115.0 → 0.121.0

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.
Files changed (86) hide show
  1. package/README.md +4 -2
  2. package/esm2020/lib/api.mjs +7 -7
  3. package/esm2020/lib/cache/cache.mjs +3 -3
  4. package/esm2020/lib/client.mjs +33 -27
  5. package/esm2020/lib/index.mjs +2 -2
  6. package/esm2020/lib/loaders.mjs +33 -0
  7. package/esm2020/lib/models/collection.mjs +79 -48
  8. package/esm2020/lib/models/model.mjs +35 -9
  9. package/esm2020/lib/models/options.mjs +99 -39
  10. package/esm2020/lib/module.mjs +21 -17
  11. package/esm2020/lib/options.mjs +4 -3
  12. package/esm2020/lib/resources/path/handlers.mjs +8 -8
  13. package/esm2020/lib/resources/path/segments.mjs +6 -6
  14. package/esm2020/lib/resources/query/builder.mjs +1 -1
  15. package/esm2020/lib/resources/query/expressions/count.mjs +5 -5
  16. package/esm2020/lib/resources/query/expressions/expand.mjs +18 -18
  17. package/esm2020/lib/resources/query/handlers.mjs +45 -45
  18. package/esm2020/lib/resources/query/options.mjs +27 -27
  19. package/esm2020/lib/resources/request.mjs +1 -1
  20. package/esm2020/lib/resources/resource.mjs +11 -9
  21. package/esm2020/lib/resources/responses/annotations.mjs +1 -1
  22. package/esm2020/lib/resources/types/action.mjs +16 -7
  23. package/esm2020/lib/resources/types/batch.mjs +135 -31
  24. package/esm2020/lib/resources/types/count.mjs +4 -4
  25. package/esm2020/lib/resources/types/entity-set.mjs +5 -7
  26. package/esm2020/lib/resources/types/entity.mjs +5 -5
  27. package/esm2020/lib/resources/types/function.mjs +16 -7
  28. package/esm2020/lib/resources/types/media.mjs +3 -3
  29. package/esm2020/lib/resources/types/metadata.mjs +3 -3
  30. package/esm2020/lib/resources/types/navigation-property.mjs +7 -9
  31. package/esm2020/lib/resources/types/options.mjs +1 -1
  32. package/esm2020/lib/resources/types/property.mjs +6 -10
  33. package/esm2020/lib/resources/types/reference.mjs +3 -3
  34. package/esm2020/lib/resources/types/singleton.mjs +4 -4
  35. package/esm2020/lib/resources/types/value.mjs +3 -3
  36. package/esm2020/lib/schema/parsers/edm.mjs +18 -17
  37. package/esm2020/lib/schema/parsers/enum-type.mjs +1 -1
  38. package/esm2020/lib/schema/parsers/structured-type.mjs +31 -19
  39. package/esm2020/lib/schema/structured-type.mjs +7 -1
  40. package/esm2020/lib/services/factory.mjs +3 -3
  41. package/esm2020/lib/settings.mjs +2 -2
  42. package/esm2020/lib/types.mjs +101 -32
  43. package/esm2020/lib/utils/enums.mjs +20 -20
  44. package/esm2020/lib/utils/strings.mjs +2 -2
  45. package/fesm2015/angular-odata.mjs +761 -406
  46. package/fesm2015/angular-odata.mjs.map +1 -1
  47. package/fesm2020/angular-odata.mjs +763 -404
  48. package/fesm2020/angular-odata.mjs.map +1 -1
  49. package/lib/api.d.ts +3 -3
  50. package/lib/client.d.ts +8 -7
  51. package/lib/index.d.ts +1 -1
  52. package/lib/loaders.d.ts +15 -0
  53. package/lib/models/collection.d.ts +21 -13
  54. package/lib/models/model.d.ts +10 -5
  55. package/lib/models/options.d.ts +20 -7
  56. package/lib/module.d.ts +12 -6
  57. package/lib/options.d.ts +6 -2
  58. package/lib/resources/path/handlers.d.ts +2 -2
  59. package/lib/resources/path/segments.d.ts +2 -2
  60. package/lib/resources/query/builder.d.ts +4 -1
  61. package/lib/resources/query/handlers.d.ts +3 -3
  62. package/lib/resources/query/options.d.ts +21 -21
  63. package/lib/resources/request.d.ts +4 -4
  64. package/lib/resources/resource.d.ts +4 -6
  65. package/lib/resources/types/action.d.ts +19 -2
  66. package/lib/resources/types/batch.d.ts +16 -5
  67. package/lib/resources/types/entity-set.d.ts +8 -8
  68. package/lib/resources/types/entity.d.ts +5 -5
  69. package/lib/resources/types/function.d.ts +17 -2
  70. package/lib/resources/types/navigation-property.d.ts +11 -11
  71. package/lib/resources/types/options.d.ts +0 -3
  72. package/lib/resources/types/property.d.ts +4 -4
  73. package/lib/resources/types/reference.d.ts +5 -5
  74. package/lib/resources/types/singleton.d.ts +5 -5
  75. package/lib/schema/parsers/edm.d.ts +2 -2
  76. package/lib/schema/parsers/enum-type.d.ts +2 -2
  77. package/lib/schema/parsers/structured-type.d.ts +8 -7
  78. package/lib/schema/structured-type.d.ts +3 -1
  79. package/lib/services/entity-set.d.ts +1 -6
  80. package/lib/settings.d.ts +3 -3
  81. package/lib/types.d.ts +46 -3
  82. package/lib/utils/enums.d.ts +18 -6
  83. package/lib/utils/strings.d.ts +4 -1
  84. package/package.json +1 -1
  85. package/esm2020/lib/tokens.mjs +0 -3
  86. package/lib/tokens.d.ts +0 -3
@@ -77,8 +77,9 @@ export class ODataCollection {
77
77
  !this._resource.isSubtypeOf(resource))
78
78
  throw new Error(`attach: Can't reattach ${this._resource.type()} to ${resource.type()}`);
79
79
  this._entries.forEach(({ model }) => {
80
- const mr = this._model.meta.modelResourceFactory(resource.cloneQuery());
81
- model.attach(mr);
80
+ const modelResource = this._model.meta.modelResourceFactory(resource.cloneQuery());
81
+ if (modelResource !== undefined)
82
+ model.attach(modelResource);
82
83
  });
83
84
  const current = this._resource;
84
85
  if (current === null || !current.isEqualTo(resource)) {
@@ -90,16 +91,11 @@ export class ODataCollection {
90
91
  }));
91
92
  }
92
93
  }
93
- asEntitySet(func) {
94
- // Build new resource
95
- const query = this._resource?.cloneQuery();
96
- let resource = this._model.meta.collectionResourceFactory(query);
97
- if (resource === undefined)
98
- throw new Error('asEntitySet: Collection does not have associated EntitySet endpoint');
94
+ withResource(resource, ctx) {
99
95
  // Push
100
96
  this.pushResource(resource);
101
97
  // Execute
102
- const result = func(this);
98
+ const result = ctx(this);
103
99
  if (result instanceof Observable) {
104
100
  return result.pipe(finalize(() => this.popResource()));
105
101
  }
@@ -109,6 +105,14 @@ export class ODataCollection {
109
105
  return result;
110
106
  }
111
107
  }
108
+ asEntitySet(ctx) {
109
+ // Build new resource
110
+ const query = this._resource?.cloneQuery();
111
+ let resource = this._model.meta.collectionResourceFactory(query);
112
+ if (resource === undefined)
113
+ throw new Error('asEntitySet: Collection does not have associated EntitySet endpoint');
114
+ return this.withResource(resource, ctx);
115
+ }
112
116
  annots() {
113
117
  return this._annotations;
114
118
  }
@@ -160,22 +164,23 @@ export class ODataCollection {
160
164
  annots: this.annots(),
161
165
  });
162
166
  }
163
- _request(obs$) {
167
+ _request(obs$, { remove } = {}) {
164
168
  this.events$.emit(new ODataModelEvent('request', {
165
169
  collection: this,
166
170
  options: { observable: obs$ },
167
171
  }));
168
172
  return obs$.pipe(map(({ entities, annots }) => {
169
173
  this._annotations = annots;
170
- this.assign(entities || [], { reset: true });
174
+ const models = (entities || []).map((entity) => this.modelFactory(entity, { reset: true }));
175
+ this.assign(models, { reset: true, remove });
171
176
  this.events$.emit(new ODataModelEvent('sync', {
172
177
  collection: this,
173
- options: { entities, annots },
178
+ options: { models, entities, annots },
174
179
  }));
175
- return this;
180
+ return models;
176
181
  }));
177
182
  }
178
- fetch({ withCount, ...options } = {}) {
183
+ fetch({ withCount, remove, ...options } = {}) {
179
184
  const resource = this.resource();
180
185
  const obs$ = resource instanceof ODataEntitySetResource
181
186
  ? resource.fetch({ withCount, ...options })
@@ -184,20 +189,21 @@ export class ODataCollection {
184
189
  withCount,
185
190
  ...options,
186
191
  });
187
- return this._request(obs$);
192
+ return this._request(obs$, { remove });
188
193
  }
189
- fetchAll({ withCount, ...options } = {}) {
194
+ fetchAll({ withCount, remove, ...options } = {}) {
190
195
  const resource = this.resource();
191
196
  const obs$ = resource.fetchAll({ withCount, ...options });
192
- return this._request(obs$);
197
+ return this._request(obs$, { remove });
193
198
  }
194
- fetchMany(top, { withCount, ...options } = {}) {
199
+ fetchMany(top, { withCount, remove, ...options } = {}) {
195
200
  const resource = this.resource();
201
+ resource.query((q) => remove || this.length == 0 ? q.skip().clear() : q.skip(this.length));
196
202
  const obs$ = resource.fetchMany(top, { withCount, ...options });
197
- return this._request(obs$);
203
+ return this._request(obs$, { remove: remove ?? false });
198
204
  }
199
- fetchOne({ withCount, ...options } = {}) {
200
- return this.fetchMany(1, { withCount, ...options }).pipe(map((col) => col.first() || null));
205
+ fetchOne({ withCount, remove, ...options } = {}) {
206
+ return this.fetchMany(1, { withCount, remove, ...options }).pipe(map((models) => models[0]));
201
207
  }
202
208
  /**
203
209
  * Save all models in the collection
@@ -416,18 +422,33 @@ export class ODataCollection {
416
422
  return of(this.removeModel(model, { silent }));
417
423
  }
418
424
  }
425
+ _moveModel(model, position) {
426
+ const key = model.key();
427
+ let entry = this._findEntry({
428
+ model,
429
+ key,
430
+ cid: model[this._model.meta.cid],
431
+ });
432
+ if (entry === undefined || entry.state === ODataModelState.Removed) {
433
+ return model;
434
+ }
435
+ // Now remove
436
+ const index = this._entries.indexOf(entry);
437
+ this._entries.splice(index, 1);
438
+ this._entries.splice(position, 0, entry);
439
+ return entry.model;
440
+ }
419
441
  create(attrs = {}, { silent = false, server = true, } = {}) {
420
442
  const model = this.modelFactory(attrs);
421
443
  return (model.isValid() && server ? model.save() : of(model)).pipe(switchMap((model) => this.add(model, { silent, server })), map(() => model));
422
444
  }
423
- set(path, value) {
424
- const Model = this._model;
445
+ set(path, value, {}) {
425
446
  const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
426
447
  if (pathArray.length === 0)
427
448
  return undefined;
428
449
  if (pathArray.length > 1) {
429
450
  const model = this._entries[Number(pathArray[0])].model;
430
- return model.set(pathArray.slice(1), value);
451
+ return model.set(pathArray.slice(1), value, {});
431
452
  }
432
453
  if (pathArray.length === 1 && ODataModelOptions.isModel(value)) {
433
454
  let toAdd = [];
@@ -456,7 +477,6 @@ export class ODataCollection {
456
477
  }
457
478
  }
458
479
  get(path) {
459
- const Model = this._model;
460
480
  const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
461
481
  if (pathArray.length === 0)
462
482
  return undefined;
@@ -466,6 +486,16 @@ export class ODataCollection {
466
486
  }
467
487
  return value;
468
488
  }
489
+ has(path) {
490
+ const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
491
+ if (pathArray.length === 0)
492
+ return false;
493
+ const value = this.models()[Number(pathArray[0])];
494
+ if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
495
+ return value.has(pathArray.slice(1));
496
+ }
497
+ return value !== undefined;
498
+ }
469
499
  reset({ path, silent = false, } = {}) {
470
500
  let toAdd = [];
471
501
  let toChange = [];
@@ -529,8 +559,9 @@ export class ODataCollection {
529
559
  }));
530
560
  }
531
561
  }
532
- assign(objects, { reset = false, reparent = false, silent = false, } = {}) {
562
+ assign(objects, { remove = true, reset = false, reparent = false, silent = false, } = {}) {
533
563
  const Model = this._model;
564
+ const offset = remove ? 0 : this.length;
534
565
  let toAdd = [];
535
566
  let toChange = [];
536
567
  let toRemove = [];
@@ -538,6 +569,7 @@ export class ODataCollection {
538
569
  let modelMap = [];
539
570
  objects.forEach((obj, index) => {
540
571
  const isModel = ODataModelOptions.isModel(obj);
572
+ const position = index + offset;
541
573
  const key = Model !== null && Model.meta ? Model.meta.resolveKey(obj) : undefined;
542
574
  const cid = Model.meta.cid in obj ? obj[Model.meta.cid] : undefined;
543
575
  // Try find entry
@@ -566,38 +598,37 @@ export class ODataCollection {
566
598
  }
567
599
  // Model Change?
568
600
  if (model.hasChanged())
569
- toChange.push(model);
601
+ toChange.push([model, position]);
570
602
  }
571
603
  // Has Sort or Index Change?
572
- if (toSort.length > 0 || index !== this.models().indexOf(model)) {
573
- toSort.push([model, index]);
604
+ if (toSort.length > 0 || position !== this.models().indexOf(model)) {
605
+ toSort.push([model, position]);
574
606
  }
575
607
  }
576
608
  else {
577
609
  // Add
578
610
  model = isModel
579
611
  ? obj
580
- : this.modelFactory(obj, {
581
- reset,
582
- });
583
- toAdd.push([model, index]);
612
+ : this.modelFactory(obj);
613
+ toAdd.push([model, position]);
584
614
  }
585
615
  modelMap.push(model[Model.meta.cid]);
586
616
  });
587
- this._entries
588
- .filter((e) => modelMap.indexOf(e.model[Model.meta.cid]) === -1)
589
- .forEach((entry) => {
590
- toRemove.push(entry.model);
591
- });
592
- toRemove.forEach((m) => {
593
- this._removeModel(m, { silent, reset });
617
+ if (remove) {
618
+ this._entries.forEach((entry, position) => {
619
+ if (modelMap.indexOf(entry.model[Model.meta.cid]) === -1)
620
+ toRemove.push([entry.model, position]);
621
+ });
622
+ }
623
+ // Apply remove, add and sort
624
+ toRemove.forEach(([model, position]) => {
625
+ this._removeModel(model, { silent, reset });
594
626
  });
595
- toAdd.forEach((m) => {
596
- this._addModel(m[0], { silent, reset, reparent, position: m[1] });
627
+ toAdd.forEach(([model, position]) => {
628
+ this._addModel(model, { silent, reset, reparent, position });
597
629
  });
598
- toSort.forEach((m) => {
599
- this._removeModel(m[0], { silent: true, reset });
600
- this._addModel(m[0], { silent: true, reset, position: m[1], reparent });
630
+ toSort.forEach(([model, position]) => {
631
+ this._moveModel(model, position);
601
632
  });
602
633
  if ((!silent &&
603
634
  (toAdd.length > 0 ||
@@ -617,9 +648,9 @@ export class ODataCollection {
617
648
  }));
618
649
  }
619
650
  }
620
- query(func) {
651
+ query(ctx) {
621
652
  const resource = this.resource();
622
- resource.query(func);
653
+ resource.query(ctx);
623
654
  this.attach(resource);
624
655
  return this;
625
656
  }
@@ -823,4 +854,4 @@ export class ODataCollection {
823
854
  }
824
855
  }
825
856
  ODataCollection.model = null;
826
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFJTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBRXRCLHNCQUFzQixFQUV0QiwrQkFBK0IsRUFFL0IscUJBQXFCLEdBR3RCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBRWYsZUFBZSxFQUVmLGlCQUFpQixFQUNqQixlQUFlLEdBQ2hCLE1BQU0sV0FBVyxDQUFDO0FBRW5CLE1BQU0sT0FBTyxlQUFlO0lBNEMxQixZQUNFLFdBQXFELEVBQUUsRUFDdkQsRUFDRSxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxHQUFHLEtBQUssTUFPWCxFQUFFO1FBdERSLFlBQU8sR0FLSSxJQUFJLENBQUM7UUFDaEIsY0FBUyxHQUlFLElBQUksQ0FBQztRQUNoQixlQUFVLEdBWUosRUFBRSxDQUFDO1FBRVQsYUFBUSxHQUE0QixFQUFFLENBQUM7UUFhdkMsUUFBUTtRQUNSLFlBQU8sR0FBRyxJQUFJ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USxFQUFFO2dCQUM1QixVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQ0gsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7QUFydENNLHFCQUFLLEdBQTZCLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUFjdGlvbk9wdGlvbnMsXG4gIE9EYXRhRW50aXRpZXMsXG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFGdW5jdGlvbk9wdGlvbnMsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hL3N0cnVjdHVyZWQtdHlwZSc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhTW9kZWwgfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gIEJVQkJMSU5HLFxuICBJTkNMVURFX0RFRVAsXG4gIElOQ0xVREVfU0hBTExPVyxcbiAgT0RhdGFNb2RlbEVudHJ5LFxuICBPRGF0YU1vZGVsRXZlbnQsXG4gIE9EYXRhTW9kZWxGaWVsZCxcbiAgT0RhdGFNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxTdGF0ZSxcbn0gZnJvbSAnLi9vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIE9EYXRhQ29sbGVjdGlvbjxULCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj5cbiAgaW1wbGVtZW50cyBJdGVyYWJsZTxNPlxue1xuICBzdGF0aWMgbW9kZWw6IHR5cGVvZiBPRGF0YU1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIF9wYXJlbnQ6XG4gICAgfCBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgXVxuICAgIHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZTpcbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZXM6IHtcbiAgICBwYXJlbnQ6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgICBdXG4gICAgICB8IG51bGw7XG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbDtcbiAgfVtdID0gW107XG4gIF9hbm5vdGF0aW9ucyE6IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPjtcbiAgX2VudHJpZXM6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG4gIF9tb2RlbDogdHlwZW9mIE9EYXRhTW9kZWw7XG5cbiAgbW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzXG4gICAgICAuZmlsdGVyKChlKSA9PiBlLnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZClcbiAgICAgIC5tYXAoKGUpID0+IGUubW9kZWwpO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmxlbmd0aDtcbiAgfVxuXG4gIC8vRXZlbnRzXG4gIGV2ZW50cyQgPSBuZXcgRXZlbnRFbWl0dGVyPE9EYXRhTW9kZWxFdmVudDxUPj4oKTtcbiAgY29uc3RydWN0b3IoXG4gICAgZW50aXRpZXM6IFBhcnRpYWw8VD5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10gPSBbXSxcbiAgICB7XG4gICAgICBwYXJlbnQsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFubm90cyxcbiAgICAgIG1vZGVsLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbT0RhdGFNb2RlbDxhbnk+LCBPRGF0YU1vZGVsRmllbGQ8YW55Pl07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8VD47XG4gICAgICBtb2RlbD86IHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBLbGFzcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCAmJiBLbGFzcy5tb2RlbCAhPT0gbnVsbCkgbW9kZWwgPSBLbGFzcy5tb2RlbDtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbjogQ29sbGVjdGlvbiBuZWVkIG1vZGVsJyk7XG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcblxuICAgIC8vIFBhcmVudFxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlXG4gICAgaWYgKHRoaXMuX3BhcmVudCA9PT0gbnVsbCAmJiByZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoKSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmF0dGFjaChcbiAgICAgICAgcmVzb3VyY2UgYXNcbiAgICAgICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIHRoaXMuX2Fubm90YXRpb25zID1cbiAgICAgIGFubm90cyB8fFxuICAgICAgbmV3IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyhcbiAgICAgICAgT0RhdGFIZWxwZXJbcmVzb3VyY2U/LmFwaT8ub3B0aW9ucy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTl1cbiAgICAgICk7XG5cbiAgICBlbnRpdGllcyA9IGVudGl0aWVzIHx8IFtdO1xuICAgIHRoaXMuYXNzaWduKGVudGl0aWVzLCB7IHJlc2V0IH0pO1xuICB9XG5cbiAgaXNQYXJlbnRPZihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hpbGQgIT09IHRoaXMgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKS5zb21lKChwKSA9PiBwWzBdID09PSB0aGlzKVxuICAgICk7XG4gIH1cblxuICByZXNvdXJjZSgpOlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+IHtcbiAgICByZXR1cm4gT0RhdGFNb2RlbE9wdGlvbnMucmVzb3VyY2U8VD4odGhpcykgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPjtcbiAgfVxuXG4gIHB1c2hSZXNvdXJjZShcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICApIHtcbiAgICAvLyBQdXNoIGN1cnJlbnQgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3Jlc291cmNlcy5wdXNoKHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9KTtcbiAgICAvLyBSZXBsYWNlIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICBwb3BSZXNvdXJjZSgpIHtcbiAgICAvLyBQb3AgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIGNvbnN0IHBvcCA9IHRoaXMuX3Jlc291cmNlcy5wb3AoKTtcbiAgICBpZiAocG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfTtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBvcC5wYXJlbnQ7XG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHBvcC5yZXNvdXJjZTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYXR0YWNoKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX3Jlc291cmNlICE9PSBudWxsICYmXG4gICAgICB0aGlzLl9yZXNvdXJjZS50eXBlKCkgIT09IHJlc291cmNlLnR5cGUoKSAmJlxuICAgICAgIXRoaXMuX3Jlc291cmNlLmlzU3VidHlwZU9mKHJlc291cmNlKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGF0dGFjaDogQ2FuJ3QgcmVhdHRhY2ggJHt0aGlzLl9yZXNvdXJjZS50eXBlKCl9IHRvICR7cmVzb3VyY2UudHlwZSgpfWBcbiAgICAgICk7XG5cbiAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgY29uc3QgbXIgPSB0aGlzLl9tb2RlbC5tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgICByZXNvdXJjZS5jbG9uZVF1ZXJ5PFQ+KClcbiAgICAgICkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPjtcbiAgICAgIG1vZGVsLmF0dGFjaChtcik7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgIWN1cnJlbnQuaXNFcXVhbFRvKHJlc291cmNlKSkge1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdhdHRhY2gnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzRW50aXR5U2V0PFI+KGZ1bmM6IChjb2xsZWN0aW9uOiB0aGlzKSA9PiBSKTogUiB7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpO1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeShxdWVyeSk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdhc0VudGl0eVNldDogQ29sbGVjdGlvbiBkb2VzIG5vdCBoYXZlIGFzc29jaWF0ZWQgRW50aXR5U2V0IGVuZHBvaW50J1xuICAgICAgKTtcbiAgICAvLyBQdXNoXG4gICAgdGhpcy5wdXNoUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgIC8vIEV4ZWN1dGVcbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKHRoaXMpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICByZXR1cm4gKHJlc3VsdCBhcyBhbnkpLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5wb3BSZXNvdXJjZSgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvcFxuICAgICAgdGhpcy5wb3BSZXNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBhbm5vdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBtb2RlbEZhY3RvcnkoXG4gICAgZGF0YTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHsgcmVzZXQgPSBmYWxzZSB9OiB7IHJlc2V0PzogYm9vbGVhbiB9ID0ge31cbiAgKTogTSB7XG4gICAgbGV0IE1vZGVsID0gdGhpcy5fbW9kZWw7XG4gICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhRW50aXR5QW5ub3RhdGlvbnModGhpcy5fYW5ub3RhdGlvbnMuaGVscGVyKTtcbiAgICBhbm5vdHMudXBkYXRlKGRhdGEpO1xuXG4gICAgaWYgKGFubm90cz8udHlwZSAhPT0gdW5kZWZpbmVkICYmIE1vZGVsLm1ldGEgIT09IG51bGwpIHtcbiAgICAgIGxldCBzY2hlbWEgPSBNb2RlbC5tZXRhLmZpbmRDaGlsZE9wdGlvbnMoKG8pID0+XG4gICAgICAgIG8uaXNUeXBlT2YoYW5ub3RzLnR5cGUgYXMgc3RyaW5nKVxuICAgICAgKT8uc2NoZW1hO1xuICAgICAgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYS5tb2RlbCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAvLyBDaGFuZ2UgdG8gY2hpbGQgbW9kZWxcbiAgICAgICAgTW9kZWwgPSBzY2hlbWEubW9kZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbChkYXRhLCB7XG4gICAgICBhbm5vdHMsXG4gICAgICByZXNldCxcbiAgICAgIHBhcmVudDogW3RoaXMsIG51bGxdLFxuICAgIH0pIGFzIE07XG4gIH1cblxuICB0b0VudGl0aWVzKHtcbiAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICBjaGFpbiA9IFtdLFxuICB9OiB7XG4gICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICB9ID0ge30pOiAoUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9KVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHsgbW9kZWwsIHN0YXRlIH0pID0+XG4gICAgICAgICAgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkICYmIGNoYWluLmV2ZXJ5KChjKSA9PiBjICE9PSBtb2RlbClcbiAgICAgIClcbiAgICAgIC5tYXAoKHsgbW9kZWwsIHN0YXRlIH0pID0+IHtcbiAgICAgICAgdmFyIGNoYW5nZXNPbmx5ID0gY2hhbmdlc19vbmx5ICYmIHN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQ7XG4gICAgICAgIHJldHVybiBtb2RlbC50b0VudGl0eSh7XG4gICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICAgICAgaW5jbHVkZV9rZXksXG4gICAgICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNPbmx5LFxuICAgICAgICAgIGNoYWluOiBbdGhpcywgLi4uY2hhaW5dLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvRW50aXRpZXMoKTtcbiAgfVxuXG4gIGhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9lbnRyaWVzLnNvbWUoKGUpID0+IGUuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQpIHx8XG4gICAgICB0aGlzLm1vZGVscygpLnNvbWUoKG0pID0+IG0uaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSlcbiAgICApO1xuICB9XG5cbiAgY2xvbmU8QyBleHRlbmRzIE9EYXRhQ29sbGVjdGlvbjxULCBNPj4oKSB7XG4gICAgbGV0IEN0b3IgPSA8dHlwZW9mIE9EYXRhQ29sbGVjdGlvbj50aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBuZXcgQ3Rvcih0aGlzLnRvRW50aXRpZXMoSU5DTFVERV9TSEFMTE9XKSwge1xuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSxcbiAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSxcbiAgICB9KSBhcyBDO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdChvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXRpZXM8YW55Pj4pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlcXVlc3QnLCB7XG4gICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+IHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICAgIHRoaXMuYXNzaWduKGVudGl0aWVzIHx8IFtdLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdzeW5jJywge1xuICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgZW50aXRpZXMsIGFubm90cyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2goe1xuICAgIHdpdGhDb3VudCxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcblxuICAgIGNvbnN0IG9icyQgPVxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlXG4gICAgICAgID8gcmVzb3VyY2UuZmV0Y2goeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSlcbiAgICAgICAgOiByZXNvdXJjZS5mZXRjaCh7XG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsXG4gICAgICAgICAgICB3aXRoQ291bnQsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCk7XG4gIH1cblxuICBmZXRjaEFsbCh7XG4gICAgd2l0aENvdW50LFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoQWxsKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCk7XG4gIH1cblxuICBmZXRjaE1hbnkoXG4gICAgdG9wOiBudW1iZXIsXG4gICAge1xuICAgICAgd2l0aENvdW50LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoTWFueSh0b3AsIHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCk7XG4gIH1cblxuICBmZXRjaE9uZSh7XG4gICAgd2l0aENvdW50LFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaE1hbnkoMSwgeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoY29sKSA9PiBjb2wuZmlyc3QoKSB8fCBudWxsKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhbGwgbW9kZWxzIGluIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSByZWxNb2RlbCBUaGUgbW9kZWwgaXMgcmVsYXRpb25zaGlwXG4gICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byB1c2VcbiAgICogQHBhcmFtIG9wdGlvbnMgSHR0cE9wdGlvbnNcbiAgICovXG4gIHNhdmUoe1xuICAgIHJlbE1vZGVsID0gZmFsc2UsXG4gICAgbWV0aG9kLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbE1vZGVsPzogYm9vbGVhbjtcbiAgICBtZXRob2Q/OiAndXBkYXRlJyB8ICdtb2RpZnknO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YVByb3BlcnR5UmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBSZXNvdXJjZSBpcyBPRGF0YVByb3BlcnR5UmVzb3VyY2UnKVxuICAgICAgKTtcblxuICAgIGxldCB0b0Rlc3Ryb3lFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGxldCB0b1JlbW92ZVJlZmVyZW5jZTogTVtdID0gW107XG4gICAgbGV0IHRvRGVzdHJveUNvbnRhaW5lZDogTVtdID0gW107XG4gICAgbGV0IHRvQ3JlYXRlRW50aXR5OiBNW10gPSBbXTtcbiAgICBsZXQgdG9BZGRSZWZlcmVuY2U6IE1bXSA9IFtdO1xuICAgIGxldCB0b0NyZWF0ZUNvbnRhaW5lZDogTVtdID0gW107XG4gICAgbGV0IHRvVXBkYXRlRW50aXR5OiBNW10gPSBbXTtcbiAgICBsZXQgdG9VcGRhdGVDb250YWluZWQ6IE1bXSA9IFtdO1xuXG4gICAgdGhpcy5fZW50cmllcy5mb3JFYWNoKCh7IG1vZGVsLCBzdGF0ZSB9KSA9PiB7XG4gICAgICBpZiAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICAgIGlmIChyZWxNb2RlbCkge1xuICAgICAgICAgIHRvRGVzdHJveUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAgIHRvUmVtb3ZlUmVmZXJlbmNlLnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvRGVzdHJveUNvbnRhaW5lZC5wdXNoKG1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkKSB7XG4gICAgICAgIGlmIChyZWxNb2RlbCkge1xuICAgICAgICAgIHRvQ3JlYXRlRW50aXR5LnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5pc05ldygpKSB7XG4gICAgICAgICAgdG9BZGRSZWZlcmVuY2UucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9DcmVhdGVDb250YWluZWQucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobW9kZWwuaGFzQ2hhbmdlZCgpKSB7XG4gICAgICAgIHRvVXBkYXRlRW50aXR5LnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHRvRGVzdHJveUVudGl0eS5sZW5ndGggPiAwIHx8XG4gICAgICB0b1JlbW92ZVJlZmVyZW5jZS5sZW5ndGggPiAwIHx8XG4gICAgICB0b0Rlc3Ryb3lDb250YWluZWQubGVuZ3RoID4gMCB8fFxuICAgICAgdG9DcmVhdGVFbnRpdHkubGVuZ3RoID4gMCB8fFxuICAgICAgdG9BZGRSZWZlcmVuY2UubGVuZ3RoID4gMCB8fFxuICAgICAgdG9DcmVhdGVDb250YWluZWQubGVuZ3RoID4gMCB8fFxuICAgICAgdG9VcGRhdGVFbnRpdHkubGVuZ3RoID4gMCB8fFxuICAgICAgdG9VcGRhdGVDb250YWluZWQubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgY29uc3Qgb2JzJCA9IGZvcmtKb2luKFtcbiAgICAgICAgLi4udG9EZXN0cm95RW50aXR5Lm1hcCgobSkgPT4gbS5hc0VudGl0eSgoZSkgPT4gZS5kZXN0cm95KG9wdGlvbnMpKSksXG4gICAgICAgIC4uLnRvUmVtb3ZlUmVmZXJlbmNlLm1hcCgobSkgPT4gdGhpcy5yZW1vdmVSZWZlcmVuY2UobSwgb3B0aW9ucykpLFxuICAgICAgICAuLi50b0Rlc3Ryb3lDb250YWluZWQubWFwKChtKSA9PiBtLmRlc3Ryb3kob3B0aW9ucykpLFxuICAgICAgICAuLi50b0NyZWF0ZUVudGl0eS5tYXAoKG0pID0+XG4gICAgICAgICAgbS5hc0VudGl0eSgoZSkgPT4gZS5zYXZlKHsgbWV0aG9kOiAnY3JlYXRlJywgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKSxcbiAgICAgICAgLi4udG9BZGRSZWZlcmVuY2UubWFwKChtKSA9PiB0aGlzLmFkZFJlZmVyZW5jZShtLCBvcHRpb25zKSksXG4gICAgICAgIC4uLnRvQ3JlYXRlQ29udGFpbmVkLm1hcCgobSkgPT5cbiAgICAgICAgICBtLnNhdmUoeyBtZXRob2Q6ICdjcmVhdGUnLCAuLi5vcHRpb25zIH0pXG4gICAgICAgICksXG4gICAgICAgIC4uLnRvVXBkYXRlRW50aXR5Lm1hcCgobSkgPT5cbiAgICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2QsIC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICksXG4gICAgICAgIC4uLnRvVXBkYXRlQ29udGFpbmVkLm1hcCgobSkgPT4gbS5zYXZlKHsgbWV0aG9kLCAuLi5vcHRpb25zIH0pKSxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlcXVlc3QnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzXG4gICAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKVxuICAgICAgICAgICAgLm1hcCgoZW50cnkpID0+ICh7IC4uLmVudHJ5LCBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCB9KSk7XG4gICAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQobmV3IE9EYXRhTW9kZWxFdmVudCgnc3luYycsIHsgY29sbGVjdGlvbjogdGhpcyB9KSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb2YodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZFJlZmVyZW5jZShtb2RlbDogTSwgb3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghbW9kZWwuaXNOZXcoKSAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgICAucmVmZXJlbmNlKClcbiAgICAgICAgLmFkZChcbiAgICAgICAgICBtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPixcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIClcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgbWVyZ2UgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uID0gLTEsXG4gICAgfToge1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApOiBNIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbC5rZXkoKTtcbiAgICBsZXQgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoe1xuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICBjaWQ6ICg8YW55Pm1vZGVsKVt0aGlzLl9tb2RlbC5tZXRhLmNpZF0sXG4gICAgfSk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKG1vZGVsLnRvRW50aXR5KCkgYXMgVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIEVudHJ5XG4gICAgZW50cnkgPSB7XG4gICAgICBzdGF0ZTogcmVzZXQgPyBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkIDogT0RhdGFNb2RlbFN0YXRlLkFkZGVkLFxuICAgICAgbW9kZWwsXG4gICAgICBrZXk6IG1vZGVsLmtleSgpLFxuICAgIH07XG4gICAgLy8gU2V0IFBhcmVudFxuICAgIGlmIChyZXBhcmVudCkgbW9kZWwuX3BhcmVudCA9IFt0aGlzLCBudWxsXTtcbiAgICAvLyBTdWJzY3JpYmVcbiAgICB0aGlzLl9saW5rKGVudHJ5KTtcbiAgICAvLyBOb3cgYWRkXG4gICAgaWYgKHBvc2l0aW9uID49IDApIHRoaXMuX2VudHJpZXMuc3BsaWNlKHBvc2l0aW9uLCAwLCBlbnRyeSk7XG4gICAgZWxzZSB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuXG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIG1vZGVsLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnYWRkJywgeyBtb2RlbCwgY29sbGVjdGlvbjogdGhpcyB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgbWVyZ2UgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uID0gLTEsXG4gICAgfToge1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApOiBNIHtcbiAgICBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbiA9IHRoaXMuX2Jpc2VjdChtb2RlbCk7XG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLl9hZGRNb2RlbChtb2RlbCwge1xuICAgICAgc2lsZW50LFxuICAgICAgcmVzZXQsXG4gICAgICBtZXJnZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgcmVwYXJlbnQsXG4gICAgfSk7XG4gICAgaWYgKCFzaWxlbnQgJiYgYWRkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IFthZGRlZF0sIHJlbW92ZWQ6IFtdLCBtZXJnZWQ6IFtdIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYWRkZWQ7XG4gIH1cblxuICBhZGQoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICAgIG1lcmdlID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBzZXJ2ZXI/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcG9zaXRpb24/OiBudW1iZXI7XG4gICAgfSA9IHt9XG4gICk6IE9ic2VydmFibGU8TT4ge1xuICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZFJlZmVyZW5jZShtb2RlbCkucGlwZShcbiAgICAgICAgbWFwKChtb2RlbCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmFkZE1vZGVsKG1vZGVsLCB7XG4gICAgICAgICAgICBzaWxlbnQsXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIHJlcGFyZW50LFxuICAgICAgICAgICAgbWVyZ2UsXG4gICAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZih0aGlzLmFkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcG9zaXRpb24sIG1lcmdlLCByZXBhcmVudCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWZlcmVuY2UobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFtb2RlbC5pc05ldygpICYmIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSkge1xuICAgICAgbGV0IHRhcmdldCA9XG4gICAgICAgIHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdpZCdcbiAgICAgICAgICA/IChtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAncGF0aCcpIHtcbiAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZS5rZXkobW9kZWwua2V5KCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc291cmNlXG4gICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAucmVtb3ZlKHRhcmdldCwgb3B0aW9ucylcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0ge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cbiAgICAvLyBFbWl0IEV2ZW50XG4gICAgaWYgKCFzaWxlbnQpXG4gICAgICBtb2RlbC5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlbW92ZScsIHsgbW9kZWwsIGNvbGxlY3Rpb246IHRoaXMgfSlcbiAgICAgICk7XG5cbiAgICAvLyBOb3cgcmVtb3ZlXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoIShyZXNldCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkKSkge1xuICAgICAgLy8gTW92ZSB0byBlbmQgb2YgYXJyYXkgYW5kIG1hcmsgYXMgcmVtb3ZlZFxuICAgICAgZW50cnkuc3RhdGUgPSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZDtcbiAgICAgIHRoaXMuX2VudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuICAgIHRoaXMuX3VubGluayhlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0ge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl9yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0IH0pO1xuICAgIGlmICghc2lsZW50ICYmIHJlbW92ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IFtdLCByZW1vdmVkOiBbcmVtb3ZlZF0sIG1lcmdlZDogW10gfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZW1vdmVkO1xuICB9XG5cbiAgcmVtb3ZlKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE9ic2VydmFibGU8TT4ge1xuICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZVJlZmVyZW5jZShtb2RlbCkucGlwZShcbiAgICAgICAgbWFwKChtb2RlbCkgPT4gdGhpcy5yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0OiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKHRoaXMucmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50IH0pKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGUoXG4gICAgYXR0cnM6IFQgPSB7fSBhcyBULFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbEZhY3RvcnkoYXR0cnMpO1xuICAgIHJldHVybiAobW9kZWwuaXNWYWxpZCgpICYmIHNlcnZlciA/IG1vZGVsLnNhdmUoKSA6IG9mKG1vZGVsKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgobW9kZWwpID0+IHRoaXMuYWRkKG1vZGVsLCB7IHNpbGVudCwgc2VydmVyIH0pKSxcbiAgICAgIG1hcCgoKSA9PiBtb2RlbClcbiAgICApO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fZW50cmllc1tOdW1iZXIocGF0aEFycmF5WzBdKV0ubW9kZWw7XG4gICAgICByZXR1cm4gbW9kZWwuc2V0KHBhdGhBcnJheS5zbGljZSgxKSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgbGV0IHRvQWRkOiBNW10gPSBbXTtcbiAgICAgIGxldCB0b0NoYW5nZTogTVtdID0gW107XG4gICAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IFtdO1xuICAgICAgbGV0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzKClbaW5kZXhdO1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoeyBtb2RlbCB9KTtcbiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vVE9ETzogUmVtb3ZlL0FkZCBvciBNZXJnZT9cbiAgICAgICAgLy8gTWVyZ2VcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKFxuICAgICAgICAgIHZhbHVlLnRvRW50aXR5KHsgY2xpZW50X2lkOiB0cnVlLCAuLi5JTkNMVURFX0RFRVAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVudHJ5Lm1vZGVsLmhhc0NoYW5nZWQoKSkgdG9DaGFuZ2UucHVzaChtb2RlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgdGhpcy5fYWRkTW9kZWwodmFsdWUsIHsgcmVwYXJlbnQ6IHRydWUgfSk7XG4gICAgICAgIHRvQWRkLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IHRvQWRkLCByZW1vdmVkOiB0b1JlbW92ZSwgY2hhbmdlZDogdG9DaGFuZ2UgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhdGg6IG51bWJlcik6IE0gfCB1bmRlZmluZWQ7XG4gIGdldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGFueTtcbiAgZ2V0KHBhdGg6IGFueSk6IGFueSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbHMoKVtOdW1iZXIocGF0aEFycmF5WzBdKV07XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0KHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJlc2V0KHtcbiAgICBwYXRoLFxuICAgIHNpbGVudCA9IGZhbHNlLFxuICB9OiB7IHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgdG9BZGQ6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG4gICAgbGV0IHRvQ2hhbmdlOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICAgIGxldCB0b1JlbW92ZTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcblxuICAgIGlmIChwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlc2V0IGJ5IHBhdGhcbiAgICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgICApIGFzIGFueVtdO1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIocGF0aEFycmF5WzBdKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKGluZGV4KSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzKClbaW5kZXhdO1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbCkpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7IG1vZGVsIH0pIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPjtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQgfHxcbiAgICAgICAgICAgIChlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCAmJlxuICAgICAgICAgICAgICBlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0b0NoYW5nZSA9IFtlbnRyeV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGggPSBwYXRoQXJyYXkuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzZXQgYWxsXG4gICAgICB0b0FkZCA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCk7XG4gICAgICB0b0NoYW5nZSA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKFxuICAgICAgICAoZSkgPT5cbiAgICAgICAgICBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZCB8fFxuICAgICAgICAgIChlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkICYmIGUubW9kZWwuaGFzQ2hhbmdlZCgpKVxuICAgICAgKTtcbiAgICAgIHRvUmVtb3ZlID0gdGhpcy5fZW50cmllcy5maWx0ZXIoKGUpID0+IGUuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCk7XG4gICAgfVxuXG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0b0FkZC5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgdGhpcy5fYWRkTW9kZWwoZW50cnkubW9kZWwsIHsgc2lsZW50IH0pO1xuICAgIH0pO1xuICAgIHRvQ2hhbmdlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBlbnRyeS5tb2RlbC5yZXNldCh7IHBhdGgsIHNpbGVudCB9KTtcbiAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZDtcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAhc2lsZW50ICYmXG4gICAgICAodG9BZGQubGVuZ3RoID4gMCB8fCB0b1JlbW92ZS5sZW5ndGggPiAwIHx8IHRvQ2hhbmdlLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgncmVzZXQnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBhZGRlZDogdG9BZGQubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgICAgIHJlbW92ZWQ6IHRvUmVtb3ZlLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgICAgICBjaGFuZ2VkOiB0b0NoYW5nZS5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKHsgc2lsZW50ID0gZmFsc2UgfTogeyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGxldCB0b1JlbW92ZTogTVtdID0gdGhpcy5tb2RlbHMoKTtcbiAgICB0b1JlbW92ZS5mb3JFYWNoKChtKSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChtLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9lbnRyaWVzID0gW107XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCd1cGRhdGUnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7IHJlbW92ZWQ6IHRvUmVtb3ZlIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBvYmplY3RzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdIHwgTVtdLFxuICAgIHtcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfTogeyByZXNldD86IGJvb2xlYW47IHJlcGFyZW50PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcblxuICAgIGxldCB0b0FkZDogW00sIG51bWJlcl1bXSA9IFtdO1xuICAgIGxldCB0b0NoYW5nZTogTVtdID0gW107XG4gICAgbGV0IHRvUmVtb3ZlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9Tb3J0OiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IG1vZGVsTWFwOiBzdHJpbmdbXSA9IFtdO1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNNb2RlbCA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwob2JqKTtcbiAgICAgIGNvbnN0IGtleSA9XG4gICAgICAgIE1vZGVsICE9PSBudWxsICYmIE1vZGVsLm1ldGEgPyBNb2RlbC5tZXRhLnJlc29sdmVLZXkob2JqKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGNpZCA9XG4gICAgICAgIE1vZGVsLm1ldGEuY2lkIGluIG9iaiA/ICg8YW55Pm9iailbTW9kZWwubWV0YS5jaWRdIDogdW5kZWZpbmVkO1xuICAgICAgLy8gVHJ5IGZpbmQgZW50cnlcbiAgICAgIGNvbnN0IGVudHJ5ID0gaXNNb2RlbFxuICAgICAgICA/IHRoaXMuX2ZpbmRFbnRyeSh7IG1vZGVsOiBvYmogYXMgTSB9KSAvLyBCeSBNb2RlbFxuICAgICAgICA6IHRoaXMuX2ZpbmRFbnRyeSh7IGNpZCwga2V5IH0pOyAvLyBCeSBDaWQgb3IgS2V5XG5cbiAgICAgIGxldCBtb2RlbDogTTtcbiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIE1lcmdlXG4gICAgICAgIG1vZGVsID0gZW50cnkubW9kZWw7XG4gICAgICAgIGlmIChtb2RlbCAhPT0gb2JqKSB7XG4gICAgICAgICAgLy8gR2V0IGVudGl0eSBmcm9tIG1vZGVsXG4gICAgICAgICAgaWYgKGlzTW9kZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IChvYmogYXMgTSkudG9FbnRpdHkoe1xuICAgICAgICAgICAgICBjbGllbnRfaWQ6IHRydWUsXG4gICAgICAgICAgICAgIC4uLklOQ0xVREVfREVFUCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW9kZWwuYXNzaWduKGVudGl0eSwgeyByZXNldCwgc2lsZW50IH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSB0aGlzLl9hbm5vdGF0aW9ucy5oZWxwZXI7XG4gICAgICAgICAgICBjb25zdCBhbm5vdHMgPSBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPihcbiAgICAgICAgICAgICAgaGVscGVyLFxuICAgICAgICAgICAgICBoZWxwZXIuYW5ub3RhdGlvbnMob2JqKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IGFubm90cy5hdHRyaWJ1dGVzKG9iaiwgJ2Z1bGwnKTtcbiAgICAgICAgICAgIG1vZGVsLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgICAgICAgIG1vZGVsLmFzc2lnbihlbnRpdHksIHsgcmVzZXQsIHNpbGVudCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTW9kZWwgQ2hhbmdlP1xuICAgICAgICAgIGlmIChtb2RlbC5oYXNDaGFuZ2VkKCkpIHRvQ2hhbmdlLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhcyBTb3J0IG9yIEluZGV4IENoYW5nZT9cbiAgICAgICAgaWYgKHRvU29ydC5sZW5ndGggPiAwIHx8IGluZGV4ICE9PSB0aGlzLm1vZGVscygpLmluZGV4T2YobW9kZWwpKSB7XG4gICAgICAgICAgdG9Tb3J0LnB1c2goW21vZGVsLCBpbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgbW9kZWwgPSBpc01vZGVsXG4gICAgICAgICAgPyAob2JqIGFzIE0pXG4gICAgICAgICAgOiB0aGlzLm1vZGVsRmFjdG9yeShvYmogYXMgUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICAgICAgICAgIHJlc2V0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRvQWRkLnB1c2goW21vZGVsLCBpbmRleF0pO1xuICAgICAgfVxuICAgICAgbW9kZWxNYXAucHVzaCgoPGFueT5tb2RlbClbTW9kZWwubWV0YS5jaWRdKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoKGUpID0+IG1vZGVsTWFwLmluZGV4T2YoKDxhbnk+ZS5tb2RlbClbTW9kZWwubWV0YS5jaWRdKSA9PT0gLTEpXG4gICAgICAuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgdG9SZW1vdmUucHVzaChlbnRyeS5tb2RlbCk7XG4gICAgICB9KTtcblxuICAgIHRvUmVtb3ZlLmZvckVhY2goKG0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG0sIHsgc2lsZW50LCByZXNldCB9KTtcbiAgICB9KTtcbiAgICB0b0FkZC5mb3JFYWNoKChtKSA9PiB7XG4gICAgICB0aGlzLl9hZGRNb2RlbChtWzBdLCB7IHNpbGVudCwgcmVzZXQsIHJlcGFyZW50LCBwb3NpdGlvbjogbVsxXSB9KTtcbiAgICB9KTtcbiAgICB0b1NvcnQuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwobVswXSwgeyBzaWxlbnQ6IHRydWUsIHJlc2V0IH0pO1xuICAgICAgdGhpcy5fYWRkTW9kZWwobVswXSwgeyBzaWxlbnQ6IHRydWUsIHJlc2V0LCBwb3NpdGlvbjogbVsxXSwgcmVwYXJlbnQgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICAoIXNpbGVudCAmJlxuICAgICAgICAodG9BZGQubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHRvUmVtb3ZlLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICB0b0NoYW5nZS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9Tb3J0Lmxlbmd0aCA+IDApKSB8fFxuICAgICAgcmVzZXRcbiAgICApIHtcbiAgICAgIHRoaXMuX3NvcnRCeSA9IG51bGw7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChyZXNldCA/ICdyZXNldCcgOiAndXBkYXRlJywge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLFxuICAgICAgICAgICAgcmVtb3ZlZDogdG9SZW1vdmUsXG4gICAgICAgICAgICBjaGFuZ2VkOiB0b0NoYW5nZSxcbiAgICAgICAgICAgIHNvcnRlZDogdG9Tb3J0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXJ5KFxuICAgIGZ1bmM6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkXG4gICkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIHJlc291cmNlLnF1ZXJ5KGZ1bmMpO1xuICAgIHRoaXMuYXR0YWNoKHJlc291cmNlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSB7XG4gICAgICBjb25zdCBmdW5jID0gcmVzb3VyY2UuZnVuY3Rpb248UCwgUj4obmFtZSk7XG4gICAgICBmdW5jLnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgRXJyb3IoYGNhbGxGdW5jdGlvbjogQ2FuJ3QgZnVuY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVNldFJlc291cmNlYClcbiAgICApO1xuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIHsgLi4ub3B0aW9ucyB9OiB7fSAmIE9EYXRhQWN0aW9uT3B0aW9uczxSPiA9IHt9XG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKGBjYWxsQWN0aW9uOiBDYW4ndCBhY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVNldFJlc291cmNlYClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKTtcbiAgICBhY3Rpb24ucXVlcnkoKHEpID0+IHEuYXBwbHkob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdW5saW5rKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saW5rKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb246IFN1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBlbnRyeS5zdWJzY3JpcHRpb24gPSBlbnRyeS5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PFQ+KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBCVUJCTElORy5pbmRleE9mKGV2ZW50Lm5hbWUpICE9PSAtMSAmJlxuICAgICAgICAgIGV2ZW50LmJ1YmJsaW5nICYmXG4gICAgICAgICAgIWV2ZW50LnZpc2l0ZWQodGhpcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGVsID09PSBlbnRyeS5tb2RlbCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdkZXN0cm95Jykge1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5uYW1lID09PSAnY2hhbmdlJyAmJiBldmVudC5vcHRpb25zPy5rZXkpIHtcbiAgICAgICAgICAgICAgZW50cnkua2V5ID0gZW50cnkubW9kZWwua2V5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVscygpLmluZGV4T2YoZW50cnkubW9kZWwpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KGV2ZW50LnB1c2godGhpcywgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9maW5kRW50cnkoe1xuICAgIG1vZGVsLFxuICAgIGNpZCxcbiAgICBrZXksXG4gIH06IHtcbiAgICBtb2RlbD86IE9EYXRhTW9kZWw8VD47XG4gICAgY2lkPzogc3RyaW5nO1xuICAgIGtleT86IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllcy5maW5kKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgYnlNb2RlbCA9IG1vZGVsICE9PSB1bmRlZmluZWQgJiYgZW50cnkubW9kZWwuZXF1YWxzKG1vZGVsKTtcbiAgICAgIGNvbnN0IGJ5Q2lkID1cbiAgICAgICAgY2lkICE9PSB1bmRlZmluZWQgJiYgKDxhbnk+ZW50cnkubW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSA9PT0gY2lkO1xuICAgICAgY29uc3QgYnlLZXkgPVxuICAgICAgICBrZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBlbnRyeS5rZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBUeXBlcy5pc0VxdWFsKGVudHJ5LmtleSwga2V5KTtcbiAgICAgIHJldHVybiBieU1vZGVsIHx8IGJ5Q2lkIHx8IGJ5S2V5O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29sbGVjdGlvbiBmdW5jdGlvbnNcbiAgZXF1YWxzKG90aGVyOiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pIHtcbiAgICByZXR1cm4gdGhpcyA9PT0gb3RoZXI7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdDb2xsZWN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBsZXQgcG9pbnRlciA9IDA7XG4gICAgbGV0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQoKTogSXRlcmF0b3JSZXN1bHQ8TT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IHBvaW50ZXIgPT09IG1vZGVscy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWU6IG1vZGVsc1twb2ludGVyKytdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZmlsdGVyKFxuICAgIHByZWRpY2F0ZTogKHZhbHVlOiBNLCBpbmRleDogbnVtYmVyLCBhcnJheTogTVtdKSA9PiB1bmtub3duLFxuICAgIHRoaXNBcmc/OiBhbnlcbiAgKTogTVtdIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxuXG4gIG1hcDxVPihcbiAgICBjYWxsYmFja2ZuOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIGFycmF5OiBNW10pID0+IFUsXG4gICAgdGhpc0FyZz86IGFueVxuICApOiBVW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLm1hcChjYWxsYmFja2ZuLCB0aGlzQXJnKTtcbiAgfVxuXG4gIGZpbmQoXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIG9iajogTVtdKSA9PiB1bmtub3duLFxuICAgIHRoaXNBcmc/OiBhbnlcbiAgKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgcmVkdWNlPFU+KFxuICAgIGNhbGxiYWNrZm46IChcbiAgICAgIHByZXZpb3VzVmFsdWU6IFUsXG4gICAgICBjdXJyZW50VmFsdWU6IE0sXG4gICAgICBjdXJyZW50SW5kZXg6IG51bWJlcixcbiAgICAgIGFycmF5OiBNW11cbiAgICApID0+IFUsXG4gICAgaW5pdGlhbFZhbHVlOiBVXG4gICk6IFUge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLnJlZHVjZShjYWxsYmFja2ZuLCBpbml0aWFsVmFsdWUpO1xuICB9XG5cbiAgZmlyc3QoKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKClbMF07XG4gIH1cblxuICBsYXN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIG1vZGVsc1ttb2RlbHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBuZXh0KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4ICsgMSk7XG4gIH1cblxuICBwcmV2KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA8PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQoaW5kZXggLSAxKTtcbiAgfVxuXG4gIGV2ZXJ5KHByZWRpY2F0ZTogKG06IE0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5ldmVyeShwcmVkaWNhdGUpO1xuICB9XG5cbiAgc29tZShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuc29tZShwcmVkaWNhdGUpO1xuICB9XG5cbiAgY29udGFpbnMobW9kZWw6IE0pIHtcbiAgICByZXR1cm4gdGhpcy5zb21lKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICB9XG5cbiAgaW5kZXhPZihtb2RlbDogTSk6IG51bWJlciB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICBjb25zdCBtID0gbW9kZWxzLmZpbmQoKG0pID0+IG0uZXF1YWxzKG1vZGVsKSk7XG4gICAgcmV0dXJuIG0gPT09IHVuZGVmaW5lZCA/IC0xIDogbW9kZWxzLmluZGV4T2YobSk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIC8vIExvY2FsIGxlbmd0aCBhbmQgaWYgZXhpc3RzIHJlbW90ZSBsZW5ndGhcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHRoaXMuYW5ub3RzKCkuY291bnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5hbm5vdHMoKS5jb3VudCA9PT0gMFxuICAgICk7XG4gIH1cblxuICAvLyNyZWdpb24gU29ydFxuICBwcml2YXRlIF9iaXNlY3QobW9kZWw6IE0pIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBpZiAodGhpcy5fc29ydEJ5ICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9lbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAodGhpcy5fY29tcGFyZShtb2RlbCwgdGhpcy5fZW50cmllc1tpbmRleF0sIHRoaXMuX3NvcnRCeSwgMCkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBhcmUoXG4gICAgZTE6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgZTI6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgbGV0IG0xID0gT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChlMSlcbiAgICAgID8gKGUxIGFzIE0pXG4gICAgICA6IChlMSBhcyBPRGF0YU1vZGVsRW50cnk8VCwgTT4pLm1vZGVsO1xuICAgIGxldCBtMiA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTIpXG4gICAgICA/IChlMiBhcyBNKVxuICAgICAgOiAoZTIgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBsZXQgdmFsdWUxID0gbTEuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGxldCB2YWx1ZTIgPSBtMi5nZXQoYnlbaW5kZXhdLmZpZWxkIGFzIHN0cmluZyk7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcblxuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgIT0gbnVsbCkgcmVzdWx0ID0gLTE7XG4gICAgZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyID09IG51bGwpIHJlc3VsdCA9IDE7XG4gICAgZWxzZSBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyID09IG51bGwpIHJlc3VsdCA9IDA7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlMSA9PSAnc3RyaW5nJyB8fCB2YWx1ZTEgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIGlmICh2YWx1ZTEubG9jYWxlQ29tcGFyZSAmJiB2YWx1ZTEgIT0gdmFsdWUyKSB7XG4gICAgICAgIHJldHVybiAoYnlbaW5kZXhdLm9yZGVyIHx8IDEpICogdmFsdWUxLmxvY2FsZUNvbXBhcmUodmFsdWUyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdmFsdWUxIDwgdmFsdWUyID8gLTEgOiAxO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZTEgPT0gdmFsdWUyKSB7XG4gICAgICByZXR1cm4gYnkubGVuZ3RoIC0gMSA+IGluZGV4ID8gdGhpcy5fY29tcGFyZShlMSwgZTIsIGJ5LCBpbmRleCArIDEpIDogMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKGJ5W2luZGV4XS5vcmRlciB8fCAxKSAqIHJlc3VsdDtcbiAgfVxuXG4gIF9zb3J0Qnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSB8IG51bGwgPSBudWxsO1xuICBpc1NvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEJ5ICE9PSBudWxsO1xuICB9XG5cbiAgc29ydChcbiAgICBieTogeyBmaWVsZDogc3RyaW5nIHwga2V5b2YgVDsgb3JkZXI/OiAxIHwgLTEgfVtdLFxuICAgIHsgc2lsZW50IH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5fc29ydEJ5ID0gYnk7XG4gICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXMuc29ydChcbiAgICAgIChlMTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+LCBlMjogT0RhdGFNb2RlbEVudHJ5PFQsIE0+KSA9PlxuICAgICAgICB0aGlzLl9jb21wYXJlKGUxLCBlMiwgYnksIDApXG4gICAgKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iXX0=
857
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFJTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBRXRCLHNCQUFzQixFQUV0QiwrQkFBK0IsRUFFL0IscUJBQXFCLEdBR3RCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBR2YsZUFBZSxFQUVmLGlCQUFpQixFQUNqQixlQUFlLEdBQ2hCLE1BQU0sV0FBVyxDQUFDO0FBRW5CLE1BQU0sT0FBTyxlQUFlO0lBNEMxQixZQUNFLFdBQXFELEVBQUUsRUFDdkQsRUFDRSxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxHQUFHLEtBQUssTUFPWCxFQUFFO1FBdERSLFlBQU8sR0FLSSxJQUFJLENBQUM7UUFDaEIsY0FBUyxHQUlFLElBQUksQ0FBQztRQUNoQixlQUFVLEdBWUosRUFBRSxDQUFDO1FBRVQsYUFBUSxHQUE0QixFQUFFLENBQUM7UUFhdkMsUUFBUTtRQUNSLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQXN0Q2pELFlBQU8sR0FBeUQsSUFBSSxDQUFDO1FBcnNDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQXFDLENBQUM7UUFDekQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSTtZQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3JFLElBQUksS0FBSyxLQUFLLFNBQVM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXBCLFNBQVM7UUFDVCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDdkI7UUFFRCxXQUFXO1FBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUztZQUNqRCxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBSXhDLENBQUM7UUFDaEIsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQ1QsUUFHc0MsQ0FDdkMsQ0FBQztTQUNIO1FBRUQsY0FBYztRQUNkLElBQUksQ0FBQyxZQUFZO1lBQ2YsTUFBTTtnQkFDTixJQUFJLHdCQUF3QixDQUMxQixXQUFXLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxDQUMvRCxDQUFDO1FBRUosUUFBUSxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFoRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVE7YUFDakIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxPQUFPLENBQUM7YUFDbEQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUM5QixDQUFDO0lBMERELFVBQVUsQ0FDUixLQUE4RDtRQUU5RCxPQUFPLENBQ0wsS0FBSyxLQUFLLElBQUk7WUFDZCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQzFELENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUlOLE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFJLElBQUksQ0FHYixDQUFDO0lBQy9CLENBQUM7SUFFRCxZQUFZLENBQ1YsUUFHNEI7UUFFNUIsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVztRQUNULDBCQUEwQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUNyQixNQUFNLE9BQU8sR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUM5QixPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLENBQ0osUUFHNEI7UUFFNUIsSUFDRSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUk7WUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ3pDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBRXJDLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEJBQTBCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3hFLENBQUM7UUFFSixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNsQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FDekQsUUFBUSxDQUFDLFVBQVUsRUFBSyxDQUNDLENBQUM7WUFDNUIsSUFBSSxhQUFhLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMvQixJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRTtnQkFDNUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixLQUFLLEVBQUUsUUFBUTthQUNoQixDQUFDLENBQ0gsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUNELFlBQVksQ0FDVixRQUc0QixFQUM1QixHQUE0QjtRQUU1QixPQUFPO1FBQ1AsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixVQUFVO1FBQ1YsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksTUFBTSxZQUFZLFVBQVUsRUFBRTtZQUNoQyxPQUFRLE1BQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDakU7YUFBTTtZQUNMLE1BQU07WUFDTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUM7U0FDZjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUksR0FBNEI7UUFDekMscUJBQXFCO1FBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFLLENBQUM7UUFDOUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsSUFBSSxRQUFRLEtBQUssU0FBUztZQUN4QixNQUFNLElBQUksS0FBSyxDQUNiLHFFQUFxRSxDQUN0RSxDQUFDO1FBQ0osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRU8sWUFBWSxDQUNsQixJQUEwQyxFQUMxQyxFQUFFLEtBQUssR0FBRyxLQUFLLEtBQTBCLEVBQUU7UUFFM0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQixJQUFJLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ3JELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM3QyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFjLENBQUMsQ0FDbEMsRUFBRSxNQUFNLENBQUM7WUFDVixJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUNwRCx3QkFBd0I7Z0JBQ3hCLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDckIsTUFBTTtZQUNOLEtBQUs7WUFDTCxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQ3JCLENBQU0sQ0FBQztJQUNWLENBQUM7SUFFRCxVQUFVLENBQUMsRUFDVCxTQUFTLEdBQUcsS0FBSyxFQUNqQixrQkFBa0IsR0FBRyxLQUFLLEVBQzFCLG1CQUFtQixHQUFHLEtBQUssRUFDM0IsZ0JBQWdCLEdBQUcsS0FBSyxFQUN4QixXQUFXLEdBQUcsSUFBSSxFQUNsQixpQkFBaUIsR0FBRyxLQUFLLEVBQ3pCLFlBQVksR0FBRyxLQUFLLEVBQ3BCLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLEtBQUssR0FBRyxFQUFFLE1BV1IsRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVE7YUFDakIsTUFBTSxDQUNMLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUNuQixLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQ3ZFO2FBQ0EsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUN4QixJQUFJLFdBQVcsR0FBRyxZQUFZLElBQUksS0FBSyxLQUFLLGVBQWUsQ0FBQyxLQUFLLENBQUM7WUFDbEUsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUNwQixTQUFTO2dCQUNULGtCQUFrQjtnQkFDbEIsbUJBQW1CO2dCQUNuQixnQkFBZ0I7Z0JBQ2hCLFdBQVc7Z0JBQ1gsaUJBQWlCO2dCQUNqQixhQUFhO2dCQUNiLFlBQVksRUFBRSxXQUFXO2dCQUN6QixLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7YUFDeEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxVQUFVLENBQUMsRUFBRSxrQkFBa0IsS0FBdUMsRUFBRTtRQUN0RSxPQUFPLENBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLFNBQVMsQ0FBQztZQUNoRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQ2hFLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxHQUEyQixJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNoRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN6QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRTtTQUN0QixDQUFNLENBQUM7SUFDVixDQUFDO0lBRU8sUUFBUSxDQUNkLElBQW9DLEVBQ3BDLEVBQUUsTUFBTSxLQUEyQixFQUFFO1FBRXJDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRTtZQUM3QixVQUFVLEVBQUUsSUFBSTtZQUNoQixPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1NBQzlCLENBQUMsQ0FDSCxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDM0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUNqQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQU0sQ0FDckQsQ0FBQztZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLE1BQU0sRUFBRTtnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFO2FBQ3RDLENBQUMsQ0FDSCxDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsRUFDSixTQUFTLEVBQ1QsTUFBTSxFQUNOLEdBQUcsT0FBTyxLQUlSLEVBQUU7UUFDSixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakMsTUFBTSxJQUFJLEdBQ1IsUUFBUSxZQUFZLHNCQUFzQjtZQUN4QyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNiLFlBQVksRUFBRSxVQUFVO2dCQUN4QixTQUFTO2dCQUNULEdBQUcsT0FBTzthQUNYLENBQUMsQ0FBQztRQUVULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxRQUFRLENBQUMsRUFDUCxTQUFTLEVBQ1QsTUFBTSxFQUNOLEdBQUcsT0FBTyxLQUlSLEVBQUU7UUFDSixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFMUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFNBQVMsQ0FDUCxHQUFXLEVBQ1gsRUFDRSxTQUFTLEVBQ1QsTUFBTSxFQUNOLEdBQUcsT0FBTyxLQUlSLEVBQUU7UUFFTixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ25CLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDcEUsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVoRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxRQUFRLENBQUMsRUFDUCxTQUFTLEVBQ1QsTUFBTSxFQUNOLEdBQUcsT0FBTyxLQUlSLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUM5RCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLEVBQ0gsUUFBUSxHQUFHLEtBQUssRUFDaEIsTUFBTSxFQUNOLEdBQUcsT0FBTyxLQUlSLEVBQUU7UUFDSixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxRQUFRLFlBQVkscUJBQXFCO1lBQzNDLE9BQU8sVUFBVSxDQUNmLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQzNELENBQUM7UUFFSixJQUFJLGVBQWUsR0FBUSxFQUFFLENBQUM7UUFDOUIsSUFBSSxpQkFBaUIsR0FBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxrQkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxjQUFjLEdBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksY0FBYyxHQUFRLEVBQUUsQ0FBQztRQUM3QixJQUFJLGlCQUFpQixHQUFRLEVBQUUsQ0FBQztRQUNoQyxJQUFJLGNBQWMsR0FBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxpQkFBaUIsR0FBUSxFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3pDLElBQUksS0FBSyxLQUFLLGVBQWUsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLElBQUksUUFBUSxFQUFFO29CQUNaLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzdCO3FCQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3pCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDL0I7cUJBQU07b0JBQ0wsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNoQzthQUNGO2lCQUFNLElBQUksS0FBSyxLQUFLLGVBQWUsQ0FBQyxLQUFLLEVBQUU7Z0JBQzFDLElBQUksUUFBUSxFQUFFO29CQUNaLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVCO3FCQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3pCLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzVCO3FCQUFNO29CQUNMLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDL0I7YUFDRjtpQkFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDN0IsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFDRSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDMUIsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDNUIsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDN0IsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3pCLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN6QixpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUM1QixjQUFjLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDekIsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDNUI7WUFDQSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUM7Z0JBQ3BCLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pFLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUMxQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDNUQ7Z0JBQ0QsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDM0QsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQ3pDO2dCQUNELEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzFCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQ2xEO2dCQUNELEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNoRSxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUU7Z0JBQzdCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO2FBQzlCLENBQUMsQ0FDSCxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUTtxQkFDMUIsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxPQUFPLENBQUM7cUJBQzFELEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUNELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBUSxFQUFFLE9BQXNCO1FBQ25ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLFFBQVEsWUFBWSwrQkFBK0IsRUFBRTtZQUN6RSxPQUFPLFFBQVE7aUJBQ1osU0FBUyxFQUFFO2lCQUNYLEdBQUcsQ0FDRixLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQTJCLEVBQzNELE9BQU8sQ0FDUjtpQkFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDM0I7UUFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRU8sU0FBUyxDQUNmLEtBQVEsRUFDUixFQUNFLE1BQU0sR0FBRyxLQUFLLEVBQ2QsS0FBSyxHQUFHLEtBQUssRUFDYixRQUFRLEdBQUcsS0FBSyxFQUNoQixLQUFLLEdBQUcsS0FBSyxFQUNiLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFPWCxFQUFFO1FBRU4sTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDMUIsS0FBSztZQUNMLEdBQUc7WUFDSCxHQUFHLEVBQVEsS0FBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUN4QyxDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsT0FBTyxFQUFFO1lBQ2xFLElBQUksS0FBSyxFQUFFO2dCQUNULEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQU8sQ0FBQyxDQUFDO2FBQzNDO1lBQ0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFFRCxlQUFlO1FBQ2YsS0FBSyxHQUFHO1lBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUs7WUFDaEUsS0FBSztZQUNMLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFO1NBQ2pCLENBQUM7UUFDRixhQUFhO1FBQ2IsSUFBSSxRQUFRO1lBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxZQUFZO1FBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixVQUFVO1FBQ1YsSUFBSSxRQUFRLElBQUksQ0FBQztZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7O1lBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDaEIsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUN4RCxDQUFDO1NBQ0g7UUFDRCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVPLFFBQVEsQ0FDZCxLQUFRLEVBQ1IsRUFDRSxNQUFNLEdBQUcsS0FBSyxFQUNkLEtBQUssR0FBRyxLQUFLLEVBQ2IsUUFBUSxHQUFHLEtBQUssRUFDaEIsS0FBSyxHQUFHLEtBQUssRUFDYixRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BT1gsRUFBRTtRQUVOLElBQUksUUFBUSxHQUFHLENBQUM7WUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtZQUNsQyxNQUFNO1lBQ04sS0FBSztZQUNMLEtBQUs7WUFDTCxRQUFRO1lBQ1IsUUFBUTtTQUNULENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzVCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7YUFDckQsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELEdBQUcsQ0FDRCxLQUFRLEVBQ1IsRUFDRSxNQUFNLEdBQUcsS0FBSyxFQUNkLFFBQVEsR0FBRyxLQUFLLEVBQ2hCLE1BQU0sR0FBRyxJQUFJLEVBQ2IsS0FBSyxHQUFHLEtBQUssRUFDYixRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BT1gsRUFBRTtRQUVOLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDbEMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ1osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtvQkFDMUIsTUFBTTtvQkFDTixRQUFRO29CQUNSLFFBQVE7b0JBQ1IsS0FBSztvQkFDTCxLQUFLLEVBQUUsSUFBSTtpQkFDWixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxLQUFRLEVBQUUsT0FBc0I7UUFDdEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksUUFBUSxZQUFZLCtCQUErQixFQUFFO1lBQ3pFLElBQUksTUFBTSxHQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxLQUFLLElBQUk7Z0JBQy9DLENBQUMsQ0FBRSxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQTRCO2dCQUMvRCxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssTUFBTSxFQUFFO2dCQUN2RCxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sUUFBUTtpQkFDWixTQUFTLEVBQUU7aUJBQ1gsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7aUJBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUMzQjtRQUNELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTyxZQUFZLENBQ2xCLEtBQVEsRUFDUixFQUNFLE1BQU0sR0FBRyxLQUFLLEVBQ2QsS0FBSyxHQUFHLEtBQUssTUFDNEIsRUFBRTtRQUU3QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMxQixLQUFLO1lBQ0wsR0FBRztZQUNILEdBQUcsRUFBUSxLQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ3hDLENBQUMsQ0FBQztRQUNILElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxPQUFPLEVBQUU7WUFDbEUsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELGFBQWE7UUFDYixJQUFJLENBQUMsTUFBTTtZQUNULEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNoQixJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQzNELENBQUM7UUFFSixhQUFhO1FBQ2IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyRCwyQ0FBMkM7WUFDM0MsS0FBSyxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVPLFdBQVcsQ0FDakIsS0FBUSxFQUNSLEVBQ0UsTUFBTSxHQUFHLEtBQUssRUFDZCxLQUFLLEdBQUcsS0FBSyxNQUM0QixFQUFFO1FBRTdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRTtnQkFDNUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTthQUN2RCxDQUFDLENBQ0gsQ0FBQztTQUNIO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FDSixLQUFRLEVBQ1IsRUFDRSxNQUFNLEdBQUcsS0FBSyxFQUNkLE1BQU0sR0FBRyxJQUFJLE1BQzZCLEVBQUU7UUFFOUMsSUFBSSxNQUFNLEVBQUU7WUFDVixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUNyQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ2pFLENBQUM7U0FDSDthQUFNO1lBQ0wsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQVEsRUFBRSxRQUFnQjtRQUMzQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMxQixLQUFLO1lBQ0wsR0FBRztZQUNILEdBQUcsRUFBUSxLQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ3hDLENBQUMsQ0FBQztRQUNILElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxPQUFPLEVBQUU7WUFDbEUsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELGFBQWE7UUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FDSixRQUFXLEVBQU8sRUFDbEIsRUFDRSxNQUFNLEdBQUcsS0FBSyxFQUNkLE1BQU0sR0FBRyxJQUFJLE1BQzZCLEVBQUU7UUFFOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2hFLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUN6RCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQXVCLEVBQUUsS0FBVSxFQUFFLEVBQTBCO1FBQ2pFLE1BQU0sU0FBUyxHQUFHLENBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsSUFBZSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FDMUQsQ0FBQztRQUNYLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDN0MsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN4RCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM5RCxJQUFJLEtBQUssR0FBUSxFQUFFLENBQUM7WUFDcEIsSUFBSSxRQUFRLEdBQVEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksUUFBUSxHQUFRLEVBQUUsQ0FBQztZQUN2QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDdkIsNEJBQTRCO2dCQUM1QixRQUFRO2dCQUNSLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUNoQixLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDLENBQ3JELENBQUM7Z0JBQ0YsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtvQkFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNMLE1BQU07Z0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQjtZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRTtnQkFDNUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO2FBQ2hFLENBQUMsQ0FDSCxDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFJRCxHQUFHLENBQUMsSUFBUztRQUNYLE1BQU0sU0FBUyxHQUFHLENBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQ25ELENBQUM7UUFDWCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1RCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQWdDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLENBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQ25ELENBQUM7UUFDWCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1RCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsRUFDSixJQUFJLEVBQ0osTUFBTSxHQUFHLEtBQUssTUFDb0MsRUFBRTtRQUNwRCxJQUFJLEtBQUssR0FBNEIsRUFBRSxDQUFDO1FBQ3hDLElBQUksUUFBUSxHQUE0QixFQUFFLENBQUM7UUFDM0MsSUFBSSxRQUFRLEdBQTRCLEVBQUUsQ0FBQztRQUUzQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdEIsZ0JBQWdCO1lBQ2hCLE1BQU0sU0FBUyxHQUFHLENBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQ25ELENBQUM7WUFDWCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBMEIsQ0FBQztvQkFDbEUsSUFDRSxLQUFLLENBQUMsS0FBSyxLQUFLLGVBQWUsQ0FBQyxPQUFPO3dCQUN2QyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLFNBQVM7NEJBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsRUFDM0I7d0JBQ0EsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3BCO29CQUNELElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzQjthQUNGO1NBQ0Y7YUFBTTtZQUNMLFlBQVk7WUFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pFLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDN0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxLQUFLLEtBQUssZUFBZSxDQUFDLE9BQU87Z0JBQ25DLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDbEUsQ0FBQztZQUNGLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0U7UUFFRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3pCLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDcEMsS0FBSyxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFDRSxDQUFDLE1BQU07WUFDUCxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQ2hFO1lBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFO2dCQUMzQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsT0FBTyxFQUFFO29CQUNQLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUNoQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDckMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7aUJBQ3RDO2FBQ0YsQ0FBQyxDQUNILENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsRUFBRSxNQUFNLEdBQUcsS0FBSyxLQUEyQixFQUFFO1FBQ2pELElBQUksUUFBUSxHQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRTtnQkFDNUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7YUFDL0IsQ0FBQyxDQUNILENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxNQUFNLENBQ0osT0FBdUQsRUFDdkQsRUFDRSxNQUFNLEdBQUcsSUFBSSxFQUNiLEtBQUssR0FBRyxLQUFLLEVBQ2IsUUFBUSxHQUFHLEtBQUssRUFDaEIsTUFBTSxHQUFHLEtBQUssTUFNWixFQUFFO1FBRU4sTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUV4QyxJQUFJLEtBQUssR0FBa0IsRUFBRSxDQUFDO1FBQzlCLElBQUksUUFBUSxHQUFrQixFQUFFLENBQUM7UUFDakMsSUFBSSxRQUFRLEdBQWtCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE1BQU0sR0FBa0IsRUFBRSxDQUFDO1FBQy9CLElBQUksUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM1QixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxHQUNQLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN4RSxNQUFNLEdBQUcsR0FDUCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFPLEdBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDakUsaUJBQWlCO1lBQ2pCLE1BQU0sS0FBSyxHQUFHLE9BQU87Z0JBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQVEsRUFBRSxDQUFDLENBQUMsV0FBVztnQkFDbEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtZQUVuRCxJQUFJLEtBQVEsQ0FBQztZQUNiLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDdkIsUUFBUTtnQkFDUixLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxLQUFLLEtBQUssR0FBRyxFQUFFO29CQUNqQix3QkFBd0I7b0JBQ3hCLElBQUksT0FBTyxFQUFFO3dCQUNYLE1BQU0sTUFBTSxHQUFJLEdBQVMsQ0FBQyxRQUFRLENBQUM7NEJBQ2pDLFNBQVMsRUFBRSxJQUFJOzRCQUNmLEdBQUcsWUFBWTt5QkFDaEIsQ0FBQyxDQUFDO3dCQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7cUJBQ3pDO3lCQUFNO3dCQUNMLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO3dCQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLHNCQUFzQixDQUN2QyxNQUFNLEVBQ04sTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FDeEIsQ0FBQzt3QkFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDOUMsS0FBSyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7d0JBQzVCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7cUJBQ3pDO29CQUNELGdCQUFnQjtvQkFDaEIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO3dCQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDMUQ7Z0JBQ0QsNEJBQTRCO2dCQUM1QixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUNsRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7aUJBQ2hDO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTTtnQkFDTixLQUFLLEdBQUcsT0FBTztvQkFDYixDQUFDLENBQUUsR0FBUztvQkFDWixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUEyQyxDQUFDLENBQUM7Z0JBQ25FLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUMvQjtZQUNELFFBQVEsQ0FBQyxJQUFJLENBQU8sS0FBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBTyxLQUFLLENBQUMsS0FBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzdELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELDZCQUE2QjtRQUM3QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUNFLENBQUMsQ0FBQyxNQUFNO1lBQ04sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ2YsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNuQixRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkIsS0FBSyxFQUNMO1lBQ0EsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtnQkFDOUMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLE9BQU8sRUFBRTtvQkFDUCxLQUFLLEVBQUUsS0FBSztvQkFDWixPQUFPLEVBQUUsUUFBUTtvQkFDakIsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLE1BQU0sRUFBRSxNQUFNO2lCQUNmO2FBQ0YsQ0FBQyxDQUNILENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxLQUFLLENBQ0gsR0FBeUU7UUFFekUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxZQUFZLENBQ1YsSUFBWSxFQUNaLE1BQWdCLEVBQ2hCLFlBQTBELEVBQzFELEVBQUUsR0FBRyxPQUFPLEtBQW1DLEVBQUU7UUFFakQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLElBQUksUUFBUSxZQUFZLHNCQUFzQixFQUFFO1lBQzlDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQU8sSUFBSSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLFFBQVEsWUFBWSxFQUFFO2dCQUNwQixLQUFLLFVBQVU7b0JBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDNUMsS0FBSyxPQUFPO29CQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssWUFBWTtvQkFDZixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM5QztvQkFDRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUMxRDtTQUNGO1FBQ0QsT0FBTyxVQUFVLENBQ2YsR0FBRyxFQUFFLENBQ0gsSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FDM0UsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVLENBQ1IsSUFBWSxFQUNaLE1BQWdCLEVBQ2hCLFlBQTBELEVBQzFELEVBQUUsR0FBRyxPQUFPLEtBQWlDLEVBQUU7UUFFL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLFFBQVEsWUFBWSxzQkFBc0IsQ0FBQyxFQUFFO1lBQ2pELE9BQU8sVUFBVSxDQUNmLEdBQUcsRUFBRSxDQUNILElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQ3ZFLENBQUM7U0FDSDtRQUNELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQU8sSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLFFBQVEsWUFBWSxFQUFFO1lBQ3BCLEtBQUssVUFBVTtnQkFDYixPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLEtBQUssT0FBTztnQkFDVixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLEtBQUssWUFBWTtnQkFDZixPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hEO2dCQUNFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO0lBQ0gsQ0FBQztJQUVPLE9BQU8sQ0FBQyxLQUE0QjtRQUMxQyxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUU7WUFDdEIsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxLQUFLLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsS0FBNEI7UUFDeEMsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUM1RDtRQUNELEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUNoRCxDQUFDLEtBQXlCLEVBQUUsRUFBRTtZQUM1QixJQUNFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsS0FBSyxDQUFDLFFBQVE7Z0JBQ2QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUNwQjtnQkFDQSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRTtvQkFDL0IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTt3QkFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7cUJBQ2hEO3lCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7d0JBQ3hELEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQkFDL0I7aUJBQ0Y7Z0JBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDNUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxVQUFVLENBQUMsRUFDakIsS0FBSyxFQUNMLEdBQUcsRUFDSCxHQUFHLE1BS0QsRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNsQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sS0FBSyxHQUNULEdBQUcsS0FBSyxTQUFTLElBQVUsS0FBSyxDQUFDLEtBQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDeEUsTUFBTSxLQUFLLEdBQ1QsR0FBRyxLQUFLLFNBQVM7Z0JBQ2pCLEtBQUssQ0FBQyxHQUFHLEtBQUssU0FBUztnQkFDdkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sT0FBTyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLE1BQU0sQ0FBQyxLQUF3QztRQUM3QyxPQUFPLElBQUksS0FBSyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDdEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQ0wsSUFBSTtnQkFDRixPQUFPO29CQUNMLElBQUksRUFBRSxPQUFPLEtBQUssTUFBTSxDQUFDLE1BQU07b0JBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ3pCLENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQ0osU0FBMkQsRUFDM0QsT0FBYTtRQUViLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsR0FBRyxDQUNELFVBQXNELEVBQ3RELE9BQWE7UUFFYixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFJLENBQ0YsU0FBeUQsRUFDekQsT0FBYTtRQUViLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUNKLFVBS00sRUFDTixZQUFlO1FBRWYsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFRO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0MsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBUTtRQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2QsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBMkM7UUFDL0MsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLENBQUMsU0FBMkM7UUFDOUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBUTtRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsT0FBTztRQUNMLDJDQUEyQztRQUMzQyxPQUFPLENBQ0wsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUztZQUNqQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjO0lBQ04sT0FBTyxDQUFDLEtBQVE7UUFDdEIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDZixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3pCLEtBQUssS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3JELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDbkUsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7YUFDRjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sUUFBUSxDQUNkLEVBQTZCLEVBQzdCLEVBQTZCLEVBQzdCLEVBQWlELEVBQ2pELEtBQWE7UUFFYixJQUFJLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BDLENBQUMsQ0FBRSxFQUFRO1lBQ1gsQ0FBQyxDQUFFLEVBQTRCLENBQUMsS0FBSyxDQUFDO1FBQ3hDLElBQUksRUFBRSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDcEMsQ0FBQyxDQUFFLEVBQVE7WUFDWCxDQUFDLENBQUUsRUFBNEIsQ0FBQyxLQUFLLENBQUM7UUFDeEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDL0MsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDL0MsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO1FBRXZCLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSTtZQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM3QyxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUk7WUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ2pELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSTtZQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7YUFDakQsSUFBSSxPQUFPLE1BQU0sSUFBSSxRQUFRLElBQUksTUFBTSxZQUFZLE1BQU0sRUFBRTtZQUM5RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRTtnQkFDNUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM5RDtTQUNGO2FBQU07WUFDTCxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQztRQUVELElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRTtZQUNwQixPQUFPLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6RTtRQUVELE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUN6QyxDQUFDO0lBR0QsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksQ0FDRixFQUFpRCxFQUNqRCxFQUFFLE1BQU0sS0FBMkIsRUFBRTtRQUVyQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNoQyxDQUFDLEVBQXlCLEVBQUUsRUFBeUIsRUFBRSxFQUFFLENBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQy9CLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFO2dCQUM1QixVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQ0gsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7QUFueENNLHFCQUFLLEdBQTZCLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUFjdGlvbk9wdGlvbnMsXG4gIE9EYXRhRW50aXRpZXMsXG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFGdW5jdGlvbk9wdGlvbnMsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hL3N0cnVjdHVyZWQtdHlwZSc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhTW9kZWwgfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gIEJVQkJMSU5HLFxuICBJTkNMVURFX0RFRVAsXG4gIElOQ0xVREVfU0hBTExPVyxcbiAgTW9kZWxGaWVsZE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxFbnRyeSxcbiAgT0RhdGFNb2RlbEV2ZW50LFxuICBPRGF0YU1vZGVsRmllbGQsXG4gIE9EYXRhTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsU3RhdGUsXG59IGZyb20gJy4vb3B0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUNvbGxlY3Rpb248VCwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+XG4gIGltcGxlbWVudHMgSXRlcmFibGU8TT5cbntcbiAgc3RhdGljIG1vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbCB8IG51bGwgPSBudWxsO1xuICBfcGFyZW50OlxuICAgIHwgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2U6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2VzOiB7XG4gICAgcGFyZW50OlxuICAgICAgfCBbXG4gICAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgICAgXVxuICAgICAgfCBudWxsO1xuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IG51bGw7XG4gIH1bXSA9IFtdO1xuICBfYW5ub3RhdGlvbnMhOiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM8VD47XG4gIF9lbnRyaWVzOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICBfbW9kZWw6IHR5cGVvZiBPRGF0YU1vZGVsO1xuXG4gIG1vZGVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAubWFwKChlKSA9PiBlLm1vZGVsKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5sZW5ndGg7XG4gIH1cblxuICAvL0V2ZW50c1xuICBldmVudHMkID0gbmV3IEV2ZW50RW1pdHRlcjxPRGF0YU1vZGVsRXZlbnQ8VD4+KCk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0aWVzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdID0gW10sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW09EYXRhTW9kZWw8YW55PiwgT0RhdGFNb2RlbEZpZWxkPGFueT5dO1xuICAgICAgcmVzb3VyY2U/OiBPRGF0YVJlc291cmNlPFQ+O1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPFQ+O1xuICAgICAgbW9kZWw/OiB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgS2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YUNvbGxlY3Rpb247XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQgJiYgS2xhc3MubW9kZWwgIT09IG51bGwpIG1vZGVsID0gS2xhc3MubW9kZWw7XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb246IENvbGxlY3Rpb24gbmVlZCBtb2RlbCcpO1xuICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG5cbiAgICAvLyBQYXJlbnRcbiAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICAvLyBSZXNvdXJjZVxuICAgIGlmICh0aGlzLl9wYXJlbnQgPT09IG51bGwgJiYgcmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJlc291cmNlID0gdGhpcy5fbW9kZWwubWV0YS5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KCkgYXNcbiAgICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hdHRhY2goXG4gICAgICAgIHJlc291cmNlIGFzXG4gICAgICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3RhdGlvbnNcbiAgICB0aGlzLl9hbm5vdGF0aW9ucyA9XG4gICAgICBhbm5vdHMgfHxcbiAgICAgIG5ldyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMoXG4gICAgICAgIE9EYXRhSGVscGVyW3Jlc291cmNlPy5hcGk/Lm9wdGlvbnMudmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT05dXG4gICAgICApO1xuXG4gICAgZW50aXRpZXMgPSBlbnRpdGllcyB8fCBbXTtcbiAgICB0aGlzLmFzc2lnbihlbnRpdGllcywgeyByZXNldCB9KTtcbiAgfVxuXG4gIGlzUGFyZW50T2YoXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoaWxkICE9PSB0aGlzICYmXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5jaGFpbihjaGlsZCkuc29tZSgocCkgPT4gcFswXSA9PT0gdGhpcylcbiAgICApO1xuICB9XG5cbiAgcmVzb3VyY2UoKTpcbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzXG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD47XG4gIH1cblxuICBwdXNoUmVzb3VyY2UoXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgKSB7XG4gICAgLy8gUHVzaCBjdXJyZW50IHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9yZXNvdXJjZXMucHVzaCh7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfSk7XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgcG9wUmVzb3VyY2UoKSB7XG4gICAgLy8gUG9wIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBwb3AgPSB0aGlzLl9yZXNvdXJjZXMucG9wKCk7XG4gICAgaWYgKHBvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0geyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH07XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwb3AucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBwb3AucmVzb3VyY2U7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGF0dGFjaChcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICApIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXNvdXJjZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5fcmVzb3VyY2UudHlwZSgpICE9PSByZXNvdXJjZS50eXBlKCkgJiZcbiAgICAgICF0aGlzLl9yZXNvdXJjZS5pc1N1YnR5cGVPZihyZXNvdXJjZSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBhdHRhY2g6IENhbid0IHJlYXR0YWNoICR7dGhpcy5fcmVzb3VyY2UudHlwZSgpfSB0byAke3Jlc291cmNlLnR5cGUoKX1gXG4gICAgICApO1xuXG4gICAgdGhpcy5fZW50cmllcy5mb3JFYWNoKCh7IG1vZGVsIH0pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsUmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgICByZXNvdXJjZS5jbG9uZVF1ZXJ5PFQ+KClcbiAgICAgICkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPjtcbiAgICAgIGlmIChtb2RlbFJlc291cmNlICE9PSB1bmRlZmluZWQpIG1vZGVsLmF0dGFjaChtb2RlbFJlc291cmNlKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9yZXNvdXJjZTtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2F0dGFjaCcsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICAgIHZhbHVlOiByZXNvdXJjZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHdpdGhSZXNvdXJjZTxSPihcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPixcbiAgICBjdHg6IChjb2xsZWN0aW9uOiB0aGlzKSA9PiBSXG4gICk6IFIge1xuICAgIC8vIFB1c2hcbiAgICB0aGlzLnB1c2hSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgLy8gRXhlY3V0ZVxuICAgIGNvbnN0IHJlc3VsdCA9IGN0eCh0aGlzKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKGZpbmFsaXplKCgpID0+IHRoaXMucG9wUmVzb3VyY2UoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQb3BcbiAgICAgIHRoaXMucG9wUmVzb3VyY2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgYXNFbnRpdHlTZXQ8Uj4oY3R4OiAoY29sbGVjdGlvbjogdGhpcykgPT4gUik6IFIge1xuICAgIC8vIEJ1aWxkIG5ldyByZXNvdXJjZVxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5fcmVzb3VyY2U/LmNsb25lUXVlcnk8VD4oKTtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkocXVlcnkpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYXNFbnRpdHlTZXQ6IENvbGxlY3Rpb24gZG9lcyBub3QgaGF2ZSBhc3NvY2lhdGVkIEVudGl0eVNldCBlbmRwb2ludCdcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJlc291cmNlKHJlc291cmNlLCBjdHgpO1xuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbW9kZWxGYWN0b3J5KFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7IHJlc2V0ID0gZmFsc2UgfTogeyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0ge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuX21vZGVsO1xuICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcik7XG4gICAgYW5ub3RzLnVwZGF0ZShkYXRhKTtcblxuICAgIGlmIChhbm5vdHM/LnR5cGUgIT09IHVuZGVmaW5lZCAmJiBNb2RlbC5tZXRhICE9PSBudWxsKSB7XG4gICAgICBsZXQgc2NoZW1hID0gTW9kZWwubWV0YS5maW5kQ2hpbGRPcHRpb25zKChvKSA9PlxuICAgICAgICBvLmlzVHlwZU9mKGFubm90cy50eXBlIGFzIHN0cmluZylcbiAgICAgICk/LnNjaGVtYTtcbiAgICAgIGlmIChzY2hlbWEgIT09IHVuZGVmaW5lZCAmJiBzY2hlbWEubW9kZWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLy8gQ2hhbmdlIHRvIGNoaWxkIG1vZGVsXG4gICAgICAgIE1vZGVsID0gc2NoZW1hLm1vZGVsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTW9kZWwoZGF0YSwge1xuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQsXG4gICAgICBwYXJlbnQ6IFt0aGlzLCBudWxsXSxcbiAgICB9KSBhcyBNO1xuICB9XG5cbiAgdG9FbnRpdGllcyh7XG4gICAgY2xpZW50X2lkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2tleSA9IHRydWUsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgY2hhaW4gPSBbXSxcbiAgfToge1xuICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgfSA9IHt9KTogKFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh7IG1vZGVsLCBzdGF0ZSB9KSA9PlxuICAgICAgICAgIHN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCAmJiBjaGFpbi5ldmVyeSgoYykgPT4gYyAhPT0gbW9kZWwpXG4gICAgICApXG4gICAgICAubWFwKCh7IG1vZGVsLCBzdGF0ZSB9KSA9PiB7XG4gICAgICAgIHZhciBjaGFuZ2VzT25seSA9IGNoYW5nZXNfb25seSAmJiBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkO1xuICAgICAgICByZXR1cm4gbW9kZWwudG9FbnRpdHkoe1xuICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgICAgIGluY2x1ZGVfa2V5LFxuICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICBjaGFpbjogW3RoaXMsIC4uLmNoYWluXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0VudGl0aWVzKCk7XG4gIH1cblxuICBoYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fZW50cmllcy5zb21lKChlKSA9PiBlLnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkKSB8fFxuICAgICAgdGhpcy5tb2RlbHMoKS5zb21lKChtKSA9PiBtLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lPEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248VCwgTT4+KCkge1xuICAgIGxldCBDdG9yID0gPHR5cGVvZiBPRGF0YUNvbGxlY3Rpb24+dGhpcy5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gbmV3IEN0b3IodGhpcy50b0VudGl0aWVzKElOQ0xVREVfU0hBTExPVyksIHtcbiAgICAgIHJlc291cmNlOiB0aGlzLnJlc291cmNlKCksXG4gICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCksXG4gICAgfSkgYXMgQztcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3QoXG4gICAgb2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0aWVzPGFueT4+LFxuICAgIHsgcmVtb3ZlIH06IHsgcmVtb3ZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxNW10+IHtcbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlcXVlc3QnLCB7XG4gICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+IHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICAgIGNvbnN0IG1vZGVscyA9IChlbnRpdGllcyB8fCBbXSkubWFwKFxuICAgICAgICAgIChlbnRpdHkpID0+IHRoaXMubW9kZWxGYWN0b3J5KGVudGl0eSwgeyByZXNldDogdHJ1ZSB9KSBhcyBNXG4gICAgICAgICkgYXMgTVtdO1xuICAgICAgICB0aGlzLmFzc2lnbihtb2RlbHMsIHsgcmVzZXQ6IHRydWUsIHJlbW92ZSB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnc3luYycsIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zOiB7IG1vZGVscywgZW50aXRpZXMsIGFubm90cyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtb2RlbHM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBmZXRjaCh7XG4gICAgd2l0aENvdW50LFxuICAgIHJlbW92ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG5cbiAgICBjb25zdCBvYnMkID1cbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVxuICAgICAgICA/IHJlc291cmNlLmZldGNoKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pXG4gICAgICAgIDogcmVzb3VyY2UuZmV0Y2goe1xuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLFxuICAgICAgICAgICAgd2l0aENvdW50LFxuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIHsgcmVtb3ZlIH0pO1xuICB9XG5cbiAgZmV0Y2hBbGwoe1xuICAgIHdpdGhDb3VudCxcbiAgICByZW1vdmUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoQWxsKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgeyByZW1vdmUgfSk7XG4gIH1cblxuICBmZXRjaE1hbnkoXG4gICAgdG9wOiBudW1iZXIsXG4gICAge1xuICAgICAgd2l0aENvdW50LFxuICAgICAgcmVtb3ZlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIHJlc291cmNlLnF1ZXJ5KChxKSA9PlxuICAgICAgcmVtb3ZlIHx8IHRoaXMubGVuZ3RoID09IDAgPyBxLnNraXAoKS5jbGVhcigpIDogcS5za2lwKHRoaXMubGVuZ3RoKVxuICAgICk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZmV0Y2hNYW55KHRvcCwgeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCB7IHJlbW92ZTogcmVtb3ZlID8/IGZhbHNlIH0pO1xuICB9XG5cbiAgZmV0Y2hPbmUoe1xuICAgIHdpdGhDb3VudCxcbiAgICByZW1vdmUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaE1hbnkoMSwgeyB3aXRoQ291bnQsIHJlbW92ZSwgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKChtb2RlbHMpID0+IG1vZGVsc1swXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWxsIG1vZGVscyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gcmVsTW9kZWwgVGhlIG1vZGVsIGlzIHJlbGF0aW9uc2hpcFxuICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gdXNlXG4gICAqIEBwYXJhbSBvcHRpb25zIEh0dHBPcHRpb25zXG4gICAqL1xuICBzYXZlKHtcbiAgICByZWxNb2RlbCA9IGZhbHNlLFxuICAgIG1ldGhvZCxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZWxNb2RlbD86IGJvb2xlYW47XG4gICAgbWV0aG9kPzogJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFQcm9wZXJ0eVJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+IG5ldyBFcnJvcignc2F2ZTogUmVzb3VyY2UgaXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlJylcbiAgICAgICk7XG5cbiAgICBsZXQgdG9EZXN0cm95RW50aXR5OiBNW10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmVSZWZlcmVuY2U6IE1bXSA9IFtdO1xuICAgIGxldCB0b0Rlc3Ryb3lDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b0NyZWF0ZUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvQWRkUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9DcmVhdGVDb250YWluZWQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b1VwZGF0ZUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvVXBkYXRlQ29udGFpbmVkOiBNW10gPSBbXTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b1JlbW92ZVJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lDb250YWluZWQucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0NyZWF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAgIHRvQWRkUmVmZXJlbmNlLnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkge1xuICAgICAgICB0b1VwZGF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICB0b0Rlc3Ryb3lFbnRpdHkubGVuZ3RoID4gMCB8fFxuICAgICAgdG9SZW1vdmVSZWZlcmVuY2UubGVuZ3RoID4gMCB8fFxuICAgICAgdG9EZXN0cm95Q29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQWRkUmVmZXJlbmNlLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlRW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvVXBkYXRlQ29udGFpbmVkLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IG9icyQgPSBmb3JrSm9pbihbXG4gICAgICAgIC4uLnRvRGVzdHJveUVudGl0eS5tYXAoKG0pID0+IG0uYXNFbnRpdHkoKGUpID0+IGUuZGVzdHJveShvcHRpb25zKSkpLFxuICAgICAgICAuLi50b1JlbW92ZVJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMucmVtb3ZlUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9EZXN0cm95Q29udGFpbmVkLm1hcCgobSkgPT4gbS5kZXN0cm95KG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVFbnRpdHkubWFwKChtKSA9PlxuICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUuc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICksXG4gICAgICAgIC4uLnRvQWRkUmVmZXJlbmNlLm1hcCgobSkgPT4gdGhpcy5hZGRSZWZlcmVuY2UobSwgb3B0aW9ucykpLFxuICAgICAgICAuLi50b0NyZWF0ZUNvbnRhaW5lZC5tYXAoKG0pID0+XG4gICAgICAgICAgbS5zYXZlKHsgbWV0aG9kOiAnY3JlYXRlJywgLi4ub3B0aW9ucyB9KVxuICAgICAgICApLFxuICAgICAgICAuLi50b1VwZGF0ZUVudGl0eS5tYXAoKG0pID0+XG4gICAgICAgICAgbS5hc0VudGl0eSgoZSkgPT4gZS5zYXZlKHsgbWV0aG9kLCAuLi5vcHRpb25zIH0pKVxuICAgICAgICApLFxuICAgICAgICAuLi50b1VwZGF0ZUNvbnRhaW5lZC5tYXAoKG0pID0+IG0uc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSksXG4gICAgICBdKTtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZXF1ZXN0Jywge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lbnRyaWVzID0gdGhpcy5fZW50cmllc1xuICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZClcbiAgICAgICAgICAgIC5tYXAoKGVudHJ5KSA9PiAoeyAuLi5lbnRyeSwgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgfSkpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3N5bmMnLCB7IGNvbGxlY3Rpb246IHRoaXMgfSkpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZWZlcmVuY2UobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIW1vZGVsLmlzTmV3KCkgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgIC5hZGQoXG4gICAgICAgICAgbW9kZWwuX21ldGEuZW50aXR5UmVzb3VyY2UobW9kZWwpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4sXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApXG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiBtb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIG1lcmdlID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICB9ID0ge31cbiAgKTogTSB7XG4gICAgY29uc3Qga2V5ID0gbW9kZWwua2V5KCk7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHtcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgY2lkOiAoPGFueT5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdLFxuICAgIH0pO1xuICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIGVudHJ5Lm1vZGVsLmFzc2lnbihtb2RlbC50b0VudGl0eSgpIGFzIFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICAgIH1cblxuICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBFbnRyeVxuICAgIGVudHJ5ID0ge1xuICAgICAgc3RhdGU6IHJlc2V0ID8gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCA6IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCxcbiAgICAgIG1vZGVsLFxuICAgICAga2V5OiBtb2RlbC5rZXkoKSxcbiAgICB9O1xuICAgIC8vIFNldCBQYXJlbnRcbiAgICBpZiAocmVwYXJlbnQpIG1vZGVsLl9wYXJlbnQgPSBbdGhpcywgbnVsbF07XG4gICAgLy8gU3Vic2NyaWJlXG4gICAgdGhpcy5fbGluayhlbnRyeSk7XG4gICAgLy8gTm93IGFkZFxuICAgIGlmIChwb3NpdGlvbiA+PSAwKSB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuICAgIGVsc2UgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBtb2RlbC5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2FkZCcsIHsgbW9kZWwsIGNvbGxlY3Rpb246IHRoaXMgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIG1lcmdlID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICB9ID0ge31cbiAgKTogTSB7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gPSB0aGlzLl9iaXNlY3QobW9kZWwpO1xuICAgIGNvbnN0IGFkZGVkID0gdGhpcy5fYWRkTW9kZWwobW9kZWwsIHtcbiAgICAgIHNpbGVudCxcbiAgICAgIHJlc2V0LFxuICAgICAgbWVyZ2UsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIHJlcGFyZW50LFxuICAgIH0pO1xuICAgIGlmICghc2lsZW50ICYmIGFkZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCd1cGRhdGUnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7IGFkZGVkOiBbYWRkZWRdLCByZW1vdmVkOiBbXSwgbWVyZ2VkOiBbXSB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFkZGVkO1xuICB9XG5cbiAgYWRkKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgICBtZXJnZSA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24gPSAtMSxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2VydmVyPzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRSZWZlcmVuY2UobW9kZWwpLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZGRNb2RlbChtb2RlbCwge1xuICAgICAgICAgICAgc2lsZW50LFxuICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICByZXBhcmVudCxcbiAgICAgICAgICAgIG1lcmdlLFxuICAgICAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5hZGRNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHBvc2l0aW9uLCBtZXJnZSwgcmVwYXJlbnQgfSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVmZXJlbmNlKG1vZGVsOiBNLCBvcHRpb25zPzogT0RhdGFPcHRpb25zKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghbW9kZWwuaXNOZXcoKSAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIGxldCB0YXJnZXQgPVxuICAgICAgICB0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAnaWQnXG4gICAgICAgICAgPyAobW9kZWwuX21ldGEuZW50aXR5UmVzb3VyY2UobW9kZWwpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4pXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5fbW9kZWwubWV0YS5hcGkub3B0aW9ucy5kZWxldGVSZWZCeSA9PT0gJ3BhdGgnKSB7XG4gICAgICAgIHJlc291cmNlID0gcmVzb3VyY2Uua2V5KG1vZGVsLmtleSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgICAucmVmZXJlbmNlKClcbiAgICAgICAgLnJlbW92ZSh0YXJnZXQsIG9wdGlvbnMpXG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiBtb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fVxuICApOiBNIHtcbiAgICBjb25zdCBrZXkgPSBtb2RlbC5rZXkoKTtcbiAgICBsZXQgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoe1xuICAgICAgbW9kZWwsXG4gICAgICBrZXksXG4gICAgICBjaWQ6ICg8YW55Pm1vZGVsKVt0aGlzLl9tb2RlbC5tZXRhLmNpZF0sXG4gICAgfSk7XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQgfHwgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBFdmVudFxuICAgIGlmICghc2lsZW50KVxuICAgICAgbW9kZWwuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZW1vdmUnLCB7IG1vZGVsLCBjb2xsZWN0aW9uOiB0aGlzIH0pXG4gICAgICApO1xuXG4gICAgLy8gTm93IHJlbW92ZVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKCEocmVzZXQgfHwgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkpIHtcbiAgICAgIC8vIE1vdmUgdG8gZW5kIG9mIGFycmF5IGFuZCBtYXJrIGFzIHJlbW92ZWRcbiAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQ7XG4gICAgICB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cbiAgICB0aGlzLl91bmxpbmsoZW50cnkpO1xuICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fVxuICApOiBNIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fcmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldCB9KTtcbiAgICBpZiAoIXNpbGVudCAmJiByZW1vdmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCd1cGRhdGUnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7IGFkZGVkOiBbXSwgcmVtb3ZlZDogW3JlbW92ZWRdLCBtZXJnZWQ6IFtdIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlZDtcbiAgfVxuXG4gIHJlbW92ZShcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVSZWZlcmVuY2UobW9kZWwpLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZWwpID0+IHRoaXMucmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldDogdHJ1ZSB9KSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZih0aGlzLnJlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCB9KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbW92ZU1vZGVsKG1vZGVsOiBNLCBwb3NpdGlvbjogbnVtYmVyKTogTSB7XG4gICAgY29uc3Qga2V5ID0gbW9kZWwua2V5KCk7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHtcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgY2lkOiAoPGFueT5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdLFxuICAgIH0pO1xuICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cblxuICAgIC8vIE5vdyByZW1vdmVcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKHBvc2l0aW9uLCAwLCBlbnRyeSk7XG5cbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICBjcmVhdGUoXG4gICAgYXR0cnM6IFQgPSB7fSBhcyBULFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbEZhY3RvcnkoYXR0cnMpO1xuICAgIHJldHVybiAobW9kZWwuaXNWYWxpZCgpICYmIHNlcnZlciA/IG1vZGVsLnNhdmUoKSA6IG9mKG1vZGVsKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgobW9kZWwpID0+IHRoaXMuYWRkKG1vZGVsLCB7IHNpbGVudCwgc2VydmVyIH0pKSxcbiAgICAgIG1hcCgoKSA9PiBtb2RlbClcbiAgICApO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55LCB7fToge30gJiBNb2RlbEZpZWxkT3B0aW9ucykge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9lbnRyaWVzW051bWJlcihwYXRoQXJyYXlbMF0pXS5tb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgbGV0IHRvQWRkOiBNW10gPSBbXTtcbiAgICAgIGxldCB0b0NoYW5nZTogTVtdID0gW107XG4gICAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IFtdO1xuICAgICAgbGV0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzKClbaW5kZXhdO1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoeyBtb2RlbCB9KTtcbiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vVE9ETzogUmVtb3ZlL0FkZCBvciBNZXJnZT9cbiAgICAgICAgLy8gTWVyZ2VcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKFxuICAgICAgICAgIHZhbHVlLnRvRW50aXR5KHsgY2xpZW50X2lkOiB0cnVlLCAuLi5JTkNMVURFX0RFRVAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGVudHJ5Lm1vZGVsLmhhc0NoYW5nZWQoKSkgdG9DaGFuZ2UucHVzaChtb2RlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgdGhpcy5fYWRkTW9kZWwodmFsdWUsIHsgcmVwYXJlbnQ6IHRydWUgfSk7XG4gICAgICAgIHRvQWRkLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IHRvQWRkLCByZW1vdmVkOiB0b1JlbW92ZSwgY2hhbmdlZDogdG9DaGFuZ2UgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhdGg6IG51bWJlcik6IE0gfCB1bmRlZmluZWQ7XG4gIGdldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSk6IGFueTtcbiAgZ2V0KHBhdGg6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubW9kZWxzKClbTnVtYmVyKHBhdGhBcnJheVswXSldO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBoYXMocGF0aDogbnVtYmVyIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1vZGVscygpW051bWJlcihwYXRoQXJyYXlbMF0pXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEgJiYgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5oYXMocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzogc3RyaW5nIHwgc3RyaW5nW107IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgbGV0IHRvQWRkOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICAgIGxldCB0b0NoYW5nZTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmU6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG5cbiAgICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNldCBieSBwYXRoXG4gICAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICAgKSBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHBhdGhBcnJheVswXSk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihpbmRleCkpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVscygpW2luZGV4XTtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkoeyBtb2RlbCB9KSBhcyBPRGF0YU1vZGVsRW50cnk8VCwgTT47XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkIHx8XG4gICAgICAgICAgICAoZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgJiZcbiAgICAgICAgICAgICAgZW50cnkubW9kZWwuaGFzQ2hhbmdlZCgpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdG9DaGFuZ2UgPSBbZW50cnldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRoID0gcGF0aEFycmF5LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGFsbFxuICAgICAgdG9BZGQgPSB0aGlzLl9lbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpO1xuICAgICAgdG9DaGFuZ2UgPSB0aGlzLl9lbnRyaWVzLmZpbHRlcihcbiAgICAgICAgKGUpID0+XG4gICAgICAgICAgZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQgfHxcbiAgICAgICAgICAoZS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCAmJiBlLm1vZGVsLmhhc0NoYW5nZWQoKSlcbiAgICAgICk7XG4gICAgICB0b1JlbW92ZSA9IHRoaXMuX2VudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpO1xuICAgIH1cblxuICAgIHRvUmVtb3ZlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChlbnRyeS5tb2RlbCwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdG9BZGQuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKGVudHJ5Lm1vZGVsLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0b0NoYW5nZS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgZW50cnkubW9kZWwucmVzZXQoeyBwYXRoLCBzaWxlbnQgfSk7XG4gICAgICBlbnRyeS5zdGF0ZSA9IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQ7XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgIXNpbGVudCAmJlxuICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHwgdG9SZW1vdmUubGVuZ3RoID4gMCB8fCB0b0NoYW5nZS5sZW5ndGggPiAwKVxuICAgICkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3Jlc2V0Jywge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZS5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICAgICAgY2hhbmdlZDogdG9DaGFuZ2UubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjbGVhcih7IHNpbGVudCA9IGZhbHNlIH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IHRoaXMubW9kZWxzKCk7XG4gICAgdG9SZW1vdmUuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwobSwgeyBzaWxlbnQgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fZW50cmllcyA9IFtdO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgndXBkYXRlJywge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczogeyByZW1vdmVkOiB0b1JlbW92ZSB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgb2JqZWN0czogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSB8IE1bXSxcbiAgICB7XG4gICAgICByZW1vdmUgPSB0cnVlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICByZW1vdmU/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBvZmZzZXQgPSByZW1vdmUgPyAwIDogdGhpcy5sZW5ndGg7XG5cbiAgICBsZXQgdG9BZGQ6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9DaGFuZ2U6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmU6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgdG9Tb3J0OiBbTSwgbnVtYmVyXVtdID0gW107XG4gICAgbGV0IG1vZGVsTWFwOiBzdHJpbmdbXSA9IFtdO1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXNNb2RlbCA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwob2JqKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gaW5kZXggKyBvZmZzZXQ7XG4gICAgICBjb25zdCBrZXkgPVxuICAgICAgICBNb2RlbCAhPT0gbnVsbCAmJiBNb2RlbC5tZXRhID8gTW9kZWwubWV0YS5yZXNvbHZlS2V5KG9iaikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBjaWQgPVxuICAgICAgICBNb2RlbC5tZXRhLmNpZCBpbiBvYmogPyAoPGFueT5vYmopW01vZGVsLm1ldGEuY2lkXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRyeSBmaW5kIGVudHJ5XG4gICAgICBjb25zdCBlbnRyeSA9IGlzTW9kZWxcbiAgICAgICAgPyB0aGlzLl9maW5kRW50cnkoeyBtb2RlbDogb2JqIGFzIE0gfSkgLy8gQnkgTW9kZWxcbiAgICAgICAgOiB0aGlzLl9maW5kRW50cnkoeyBjaWQsIGtleSB9KTsgLy8gQnkgQ2lkIG9yIEtleVxuXG4gICAgICBsZXQgbW9kZWw6IE07XG4gICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBNZXJnZVxuICAgICAgICBtb2RlbCA9IGVudHJ5Lm1vZGVsO1xuICAgICAgICBpZiAobW9kZWwgIT09IG9iaikge1xuICAgICAgICAgIC8vIEdldCBlbnRpdHkgZnJvbSBtb2RlbFxuICAgICAgICAgIGlmIChpc01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSAob2JqIGFzIE0pLnRvRW50aXR5KHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkOiB0cnVlLFxuICAgICAgICAgICAgICAuLi5JTkNMVURFX0RFRVAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZGVsLmFzc2lnbihlbnRpdHksIHsgcmVzZXQsIHNpbGVudCB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gdGhpcy5fYW5ub3RhdGlvbnMuaGVscGVyO1xuICAgICAgICAgICAgY29uc3QgYW5ub3RzID0gbmV3IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD4oXG4gICAgICAgICAgICAgIGhlbHBlcixcbiAgICAgICAgICAgICAgaGVscGVyLmFubm90YXRpb25zKG9iailcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBhbm5vdHMuYXR0cmlidXRlcyhvYmosICdmdWxsJyk7XG4gICAgICAgICAgICBtb2RlbC5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICAgICAgICBtb2RlbC5hc3NpZ24oZW50aXR5LCB7IHJlc2V0LCBzaWxlbnQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE1vZGVsIENoYW5nZT9cbiAgICAgICAgICBpZiAobW9kZWwuaGFzQ2hhbmdlZCgpKSB0b0NoYW5nZS5wdXNoKFttb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYXMgU29ydCBvciBJbmRleCBDaGFuZ2U/XG4gICAgICAgIGlmICh0b1NvcnQubGVuZ3RoID4gMCB8fCBwb3NpdGlvbiAhPT0gdGhpcy5tb2RlbHMoKS5pbmRleE9mKG1vZGVsKSkge1xuICAgICAgICAgIHRvU29ydC5wdXNoKFttb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkXG4gICAgICAgIG1vZGVsID0gaXNNb2RlbFxuICAgICAgICAgID8gKG9iaiBhcyBNKVxuICAgICAgICAgIDogdGhpcy5tb2RlbEZhY3Rvcnkob2JqIGFzIFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSk7XG4gICAgICAgIHRvQWRkLnB1c2goW21vZGVsLCBwb3NpdGlvbl0pO1xuICAgICAgfVxuICAgICAgbW9kZWxNYXAucHVzaCgoPGFueT5tb2RlbClbTW9kZWwubWV0YS5jaWRdKTtcbiAgICB9KTtcblxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoZW50cnksIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIGlmIChtb2RlbE1hcC5pbmRleE9mKCg8YW55PmVudHJ5Lm1vZGVsKVtNb2RlbC5tZXRhLmNpZF0pID09PSAtMSlcbiAgICAgICAgICB0b1JlbW92ZS5wdXNoKFtlbnRyeS5tb2RlbCwgcG9zaXRpb25dKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHJlbW92ZSwgYWRkIGFuZCBzb3J0XG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQgfSk7XG4gICAgfSk7XG4gICAgdG9BZGQuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQsIHJlcGFyZW50LCBwb3NpdGlvbiB9KTtcbiAgICB9KTtcbiAgICB0b1NvcnQuZm9yRWFjaCgoW21vZGVsLCBwb3NpdGlvbl0pID0+IHtcbiAgICAgIHRoaXMuX21vdmVNb2RlbChtb2RlbCwgcG9zaXRpb24pO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgKCFzaWxlbnQgJiZcbiAgICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICB0b1JlbW92ZS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9DaGFuZ2UubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHRvU29ydC5sZW5ndGggPiAwKSkgfHxcbiAgICAgIHJlc2V0XG4gICAgKSB7XG4gICAgICB0aGlzLl9zb3J0QnkgPSBudWxsO1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQocmVzZXQgPyAncmVzZXQnIDogJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGFkZGVkOiB0b0FkZCxcbiAgICAgICAgICAgIHJlbW92ZWQ6IHRvUmVtb3ZlLFxuICAgICAgICAgICAgY2hhbmdlZDogdG9DaGFuZ2UsXG4gICAgICAgICAgICBzb3J0ZWQ6IHRvU29ydCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBxdWVyeShcbiAgICBjdHg6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkXG4gICkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIHJlc291cmNlLnF1ZXJ5KGN0eCk7XG4gICAgdGhpcy5hdHRhY2gocmVzb3VyY2UpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2FsbEZ1bmN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JyB8ICdtb2RlbCcgfCAnY29sbGVjdGlvbicgfCAnbm9uZScsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFGdW5jdGlvbk9wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHtcbiAgICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKTtcbiAgICAgIGZ1bmMucXVlcnkoKHEpID0+IHEuYXBwbHkob3B0aW9ucykpO1xuICAgICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBFcnJvcihgY2FsbEZ1bmN0aW9uOiBDYW4ndCBmdW5jdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VgKVxuICAgICk7XG4gIH1cblxuICBjYWxsQWN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JyB8ICdtb2RlbCcgfCAnY29sbGVjdGlvbicgfCAnbm9uZScsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFBY3Rpb25PcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoYGNhbGxBY3Rpb246IENhbid0IGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VgKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aW9uID0gcmVzb3VyY2UuYWN0aW9uPFAsIFI+KG5hbWUpO1xuICAgIGFjdGlvbi5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91bmxpbmsoZW50cnk6IE9EYXRhTW9kZWxFbnRyeTxULCBNPikge1xuICAgIGlmIChlbnRyeS5zdWJzY3JpcHRpb24pIHtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgZW50cnkuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xpbmsoZW50cnk6IE9EYXRhTW9kZWxFbnRyeTxULCBNPikge1xuICAgIGlmIChlbnRyeS5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbjogU3Vic2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgfVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IGVudHJ5Lm1vZGVsLmV2ZW50cyQuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8VD4pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEJVQkJMSU5HLmluZGV4T2YoZXZlbnQubmFtZSkgIT09IC0xICYmXG4gICAgICAgICAgZXZlbnQuYnViYmxpbmcgJiZcbiAgICAgICAgICAhZXZlbnQudmlzaXRlZCh0aGlzKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZXZlbnQubW9kZWwgPT09IGVudHJ5Lm1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2Rlc3Ryb3knKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlTW9kZWwoZW50cnkubW9kZWwsIHsgcmVzZXQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdjaGFuZ2UnICYmIGV2ZW50Lm9wdGlvbnM/LmtleSkge1xuICAgICAgICAgICAgICBlbnRyeS5rZXkgPSBlbnRyeS5tb2RlbC5rZXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWxzKCkuaW5kZXhPZihlbnRyeS5tb2RlbCk7XG4gICAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQoZXZlbnQucHVzaCh0aGlzLCBpbmRleCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRFbnRyeSh7XG4gICAgbW9kZWwsXG4gICAgY2lkLFxuICAgIGtleSxcbiAgfToge1xuICAgIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgICBjaWQ/OiBzdHJpbmc7XG4gICAga2V5PzogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBieU1vZGVsID0gbW9kZWwgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5tb2RlbC5lcXVhbHMobW9kZWwpO1xuICAgICAgY29uc3QgYnlDaWQgPVxuICAgICAgICBjaWQgIT09IHVuZGVmaW5lZCAmJiAoPGFueT5lbnRyeS5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdID09PSBjaWQ7XG4gICAgICBjb25zdCBieUtleSA9XG4gICAgICAgIGtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGVudHJ5LmtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIFR5cGVzLmlzRXF1YWwoZW50cnkua2V5LCBrZXkpO1xuICAgICAgcmV0dXJuIGJ5TW9kZWwgfHwgYnlDaWQgfHwgYnlLZXk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBDb2xsZWN0aW9uIGZ1bmN0aW9uc1xuICBlcXVhbHMob3RoZXI6IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+Pikge1xuICAgIHJldHVybiB0aGlzID09PSBvdGhlcjtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0NvbGxlY3Rpb24nO1xuICB9XG5cbiAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGxldCBwb2ludGVyID0gMDtcbiAgICBsZXQgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dCgpOiBJdGVyYXRvclJlc3VsdDxNPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZG9uZTogcG9pbnRlciA9PT0gbW9kZWxzLmxlbmd0aCxcbiAgICAgICAgICB2YWx1ZTogbW9kZWxzW3BvaW50ZXIrK10sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmaWx0ZXIoXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIGFycmF5OiBNW10pID0+IHVua25vd24sXG4gICAgdGhpc0FyZz86IGFueVxuICApOiBNW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgbWFwPFU+KFxuICAgIGNhbGxiYWNrZm46ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgYXJyYXk6IE1bXSkgPT4gVSxcbiAgICB0aGlzQXJnPzogYW55XG4gICk6IFVbXSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkubWFwKGNhbGxiYWNrZm4sIHRoaXNBcmcpO1xuICB9XG5cbiAgZmluZChcbiAgICBwcmVkaWNhdGU6ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgb2JqOiBNW10pID0+IHVua25vd24sXG4gICAgdGhpc0FyZz86IGFueVxuICApOiBNIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICByZWR1Y2U8VT4oXG4gICAgY2FsbGJhY2tmbjogKFxuICAgICAgcHJldmlvdXNWYWx1ZTogVSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogTSxcbiAgICAgIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICAgICAgYXJyYXk6IE1bXVxuICAgICkgPT4gVSxcbiAgICBpbml0aWFsVmFsdWU6IFVcbiAgKTogVSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkucmVkdWNlKGNhbGxiYWNrZm4sIGluaXRpYWxWYWx1ZSk7XG4gIH1cblxuICBmaXJzdCgpOiBNIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKVswXTtcbiAgfVxuXG4gIGxhc3QoKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICByZXR1cm4gbW9kZWxzW21vZGVscy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIG5leHQobW9kZWw6IE0pOiBNIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXhPZihtb2RlbCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSB8fCBpbmRleCA9PT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQoaW5kZXggKyAxKTtcbiAgfVxuXG4gIHByZXYobW9kZWw6IE0pOiBNIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXhPZihtb2RlbCk7XG4gICAgaWYgKGluZGV4IDw9IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldChpbmRleCAtIDEpO1xuICB9XG5cbiAgZXZlcnkocHJlZGljYXRlOiAobTogTSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmV2ZXJ5KHByZWRpY2F0ZSk7XG4gIH1cblxuICBzb21lKHByZWRpY2F0ZTogKG06IE0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5zb21lKHByZWRpY2F0ZSk7XG4gIH1cblxuICBjb250YWlucyhtb2RlbDogTSkge1xuICAgIHJldHVybiB0aGlzLnNvbWUoKG0pID0+IG0uZXF1YWxzKG1vZGVsKSk7XG4gIH1cblxuICBpbmRleE9mKG1vZGVsOiBNKTogbnVtYmVyIHtcbiAgICBjb25zdCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgIGNvbnN0IG0gPSBtb2RlbHMuZmluZCgobSkgPT4gbS5lcXVhbHMobW9kZWwpKTtcbiAgICByZXR1cm4gbSA9PT0gdW5kZWZpbmVkID8gLTEgOiBtb2RlbHMuaW5kZXhPZihtKTtcbiAgfVxuXG4gIGlzRW1wdHkoKSB7XG4gICAgLy8gTG9jYWwgbGVuZ3RoIGFuZCBpZiBleGlzdHMgcmVtb3RlIGxlbmd0aFxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgdGhpcy5hbm5vdHMoKS5jb3VudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmFubm90cygpLmNvdW50ID09PSAwXG4gICAgKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBTb3J0XG4gIHByaXZhdGUgX2Jpc2VjdChtb2RlbDogTSkge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGlmICh0aGlzLl9zb3J0QnkgIT09IG51bGwpIHtcbiAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2VudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb21wYXJlKG1vZGVsLCB0aGlzLl9lbnRyaWVzW2luZGV4XSwgdGhpcy5fc29ydEJ5LCAwKSA8IDApIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcGFyZShcbiAgICBlMTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+IHwgTSxcbiAgICBlMjogT0RhdGFNb2RlbEVudHJ5PFQsIE0+IHwgTSxcbiAgICBieTogeyBmaWVsZDogc3RyaW5nIHwga2V5b2YgVDsgb3JkZXI/OiAxIHwgLTEgfVtdLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKTogbnVtYmVyIHtcbiAgICBsZXQgbTEgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUxKVxuICAgICAgPyAoZTEgYXMgTSlcbiAgICAgIDogKGUxIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgbGV0IG0yID0gT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChlMilcbiAgICAgID8gKGUyIGFzIE0pXG4gICAgICA6IChlMiBhcyBPRGF0YU1vZGVsRW50cnk8VCwgTT4pLm1vZGVsO1xuICAgIGxldCB2YWx1ZTEgPSBtMS5nZXQoYnlbaW5kZXhdLmZpZWxkIGFzIHN0cmluZyk7XG4gICAgbGV0IHZhbHVlMiA9IG0yLmdldChieVtpbmRleF0uZmllbGQgYXMgc3RyaW5nKTtcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xuXG4gICAgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiAhPSBudWxsKSByZXN1bHQgPSAtMTtcbiAgICBlbHNlIGlmICh2YWx1ZTEgIT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbCkgcmVzdWx0ID0gMTtcbiAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbCkgcmVzdWx0ID0gMDtcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUxID09ICdzdHJpbmcnIHx8IHZhbHVlMSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgaWYgKHZhbHVlMS5sb2NhbGVDb21wYXJlICYmIHZhbHVlMSAhPSB2YWx1ZTIpIHtcbiAgICAgICAgcmV0dXJuIChieVtpbmRleF0ub3JkZXIgfHwgMSkgKiB2YWx1ZTEubG9jYWxlQ29tcGFyZSh2YWx1ZTIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZTEgPCB2YWx1ZTIgPyAtMSA6IDE7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlMSA9PSB2YWx1ZTIpIHtcbiAgICAgIHJldHVybiBieS5sZW5ndGggLSAxID4gaW5kZXggPyB0aGlzLl9jb21wYXJlKGUxLCBlMiwgYnksIGluZGV4ICsgMSkgOiAwO1xuICAgIH1cblxuICAgIHJldHVybiAoYnlbaW5kZXhdLm9yZGVyIHx8IDEpICogcmVzdWx0O1xuICB9XG5cbiAgX3NvcnRCeTogeyBmaWVsZDogc3RyaW5nIHwga2V5b2YgVDsgb3JkZXI/OiAxIHwgLTEgfVtdIHwgbnVsbCA9IG51bGw7XG4gIGlzU29ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3J0QnkgIT09IG51bGw7XG4gIH1cblxuICBzb3J0KFxuICAgIGJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10sXG4gICAgeyBzaWxlbnQgfTogeyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLl9zb3J0QnkgPSBieTtcbiAgICB0aGlzLl9lbnRyaWVzID0gdGhpcy5fZW50cmllcy5zb3J0KFxuICAgICAgKGUxOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4sIGUyOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pID0+XG4gICAgICAgIHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgMClcbiAgICApO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgndXBkYXRlJywge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==