angular-odata 0.100.0 → 0.102.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 (78) hide show
  1. package/esm2020/lib/api.mjs +65 -55
  2. package/esm2020/lib/cache/cache.mjs +56 -4
  3. package/esm2020/lib/cache/memory.mjs +16 -6
  4. package/esm2020/lib/cache/storage.mjs +23 -4
  5. package/esm2020/lib/client.mjs +3 -3
  6. package/esm2020/lib/constants.mjs +2 -1
  7. package/esm2020/lib/helper.mjs +91 -86
  8. package/esm2020/lib/models/collection.mjs +103 -43
  9. package/esm2020/lib/models/model.mjs +20 -7
  10. package/esm2020/lib/models/options.mjs +200 -133
  11. package/esm2020/lib/module.mjs +5 -5
  12. package/esm2020/lib/options.mjs +3 -8
  13. package/esm2020/lib/resources/query/builder.mjs +2 -2
  14. package/esm2020/lib/resources/query/expressions/syntax.mjs +1 -1
  15. package/esm2020/lib/resources/query/handlers.mjs +233 -34
  16. package/esm2020/lib/resources/query/options.mjs +45 -35
  17. package/esm2020/lib/resources/request.mjs +24 -35
  18. package/esm2020/lib/resources/resource.mjs +27 -11
  19. package/esm2020/lib/resources/responses/annotations.mjs +6 -6
  20. package/esm2020/lib/resources/responses/metadata.mjs +1 -1
  21. package/esm2020/lib/resources/responses/options.mjs +1 -1
  22. package/esm2020/lib/resources/responses/response.mjs +4 -4
  23. package/esm2020/lib/resources/types/batch.mjs +108 -97
  24. package/esm2020/lib/resources/types/function.mjs +3 -2
  25. package/esm2020/lib/resources/types/navigation-property.mjs +4 -2
  26. package/esm2020/lib/resources/types/options.mjs +1 -1
  27. package/esm2020/lib/schema/callable.mjs +3 -3
  28. package/esm2020/lib/schema/enum-type.mjs +5 -2
  29. package/esm2020/lib/schema/parsers/callable.mjs +10 -20
  30. package/esm2020/lib/schema/parsers/enum-type.mjs +13 -16
  31. package/esm2020/lib/schema/parsers/structured-type.mjs +15 -27
  32. package/esm2020/lib/schema/structured-type.mjs +10 -11
  33. package/esm2020/lib/services/base.mjs +1 -1
  34. package/esm2020/lib/services/factory.mjs +3 -3
  35. package/esm2020/lib/types.mjs +1 -1
  36. package/esm2020/lib/utils/arrays.mjs +10 -0
  37. package/esm2020/lib/utils/enums.mjs +3 -3
  38. package/esm2020/lib/utils/objects.mjs +10 -5
  39. package/esm2020/lib/utils/types.mjs +5 -1
  40. package/esm2020/lib/utils/urls.mjs +2 -2
  41. package/fesm2015/angular-odata.mjs +3343 -2886
  42. package/fesm2015/angular-odata.mjs.map +1 -1
  43. package/fesm2020/angular-odata.mjs +3336 -2879
  44. package/fesm2020/angular-odata.mjs.map +1 -1
  45. package/{angular-odata.d.ts → index.d.ts} +0 -0
  46. package/lib/cache/cache.d.ts +62 -1
  47. package/lib/cache/memory.d.ts +10 -0
  48. package/lib/cache/storage.d.ts +19 -0
  49. package/lib/constants.d.ts +1 -0
  50. package/lib/helper.d.ts +28 -57
  51. package/lib/models/collection.d.ts +12 -8
  52. package/lib/models/model.d.ts +13 -16
  53. package/lib/models/options.d.ts +22 -16
  54. package/lib/options.d.ts +3 -7
  55. package/lib/resources/query/builder.d.ts +2 -2
  56. package/lib/resources/query/handlers.d.ts +158 -6
  57. package/lib/resources/query/options.d.ts +21 -21
  58. package/lib/resources/request.d.ts +2 -1
  59. package/lib/resources/resource.d.ts +7 -6
  60. package/lib/resources/responses/annotations.d.ts +12 -18
  61. package/lib/resources/responses/options.d.ts +2 -2
  62. package/lib/resources/responses/response.d.ts +1 -3
  63. package/lib/resources/types/batch.d.ts +8 -11
  64. package/lib/resources/types/options.d.ts +4 -2
  65. package/lib/schema/callable.d.ts +4 -4
  66. package/lib/schema/enum-type.d.ts +4 -4
  67. package/lib/schema/parsers/callable.d.ts +10 -10
  68. package/lib/schema/parsers/enum-type.d.ts +7 -7
  69. package/lib/schema/parsers/structured-type.d.ts +11 -11
  70. package/lib/schema/structured-type.d.ts +4 -4
  71. package/lib/services/base.d.ts +9 -9
  72. package/lib/types.d.ts +6 -8
  73. package/lib/utils/arrays.d.ts +3 -0
  74. package/lib/utils/enums.d.ts +2 -2
  75. package/lib/utils/objects.d.ts +1 -1
  76. package/lib/utils/strings.d.ts +1 -1
  77. package/lib/utils/types.d.ts +1 -0
  78. package/package.json +5 -5
@@ -2,11 +2,10 @@ import { Observable } from 'rxjs';
2
2
  import { finalize } from 'rxjs/operators';
3
3
  import { CID_FIELD_NAME, COMPUTED, DEFAULT_VERSION, OPTIMISTIC_CONCURRENCY, } from '../constants';
4
4
  import { ODataHelper } from '../helper';
5
- import { ODataParserOptions } from '../options';
6
5
  import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
7
6
  import { Objects, Types } from '../utils';
8
7
  export class ODataModelEvent {
9
- constructor(name, { model, collection, previous, value, track, options, } = {}) {
8
+ constructor(name, { model, collection, previous, value, field, options, } = {}) {
10
9
  this.bubbling = true;
11
10
  this.name = name;
12
11
  this.model = model;
@@ -17,15 +16,24 @@ export class ODataModelEvent {
17
16
  this.chain = [
18
17
  [
19
18
  (this.collection || this.model),
20
- track || null,
19
+ field || null,
21
20
  ],
22
21
  ];
23
22
  }
24
23
  stopPropagation() {
25
24
  this.bubbling = false;
26
25
  }
27
- push(model, track) {
28
- this.chain.splice(0, 0, [model, track]);
26
+ push(model, field) {
27
+ let event = new ODataModelEvent(this.name, {
28
+ model: this.model,
29
+ collection: this.collection,
30
+ previous: this.previous,
31
+ value: this.value,
32
+ options: this.options,
33
+ });
34
+ event.chain = [...this.chain];
35
+ event.chain.splice(0, 0, [model, field]);
36
+ return event;
29
37
  }
30
38
  visited(model) {
31
39
  return (this.chain.some((c) => c[0] === model) &&
@@ -33,24 +41,26 @@ export class ODataModelEvent {
33
41
  }
34
42
  get path() {
35
43
  return this.chain
36
- .map(([, track], index) => typeof track === 'number'
37
- ? `[${track}]`
38
- : typeof track === 'string'
44
+ .map(([, field], index) => typeof field === 'number'
45
+ ? `[${field}]`
46
+ : field instanceof ODataModelField
39
47
  ? index === 0
40
- ? track
41
- : `.${track}`
48
+ ? field.name
49
+ : `.${field.name}`
42
50
  : '')
43
51
  .join('');
44
52
  }
45
53
  //Identifies the current model for the event
46
54
  get currentModel() {
47
- const link = this.chain.find(c => ODataModelOptions.isModel(c[0]));
55
+ const link = this.chain.find((c) => ODataModelOptions.isModel(c[0]));
48
56
  return link !== undefined ? link[0] : undefined;
49
57
  }
50
58
  //Identifies the current collection for the event
51
59
  get currentCollection() {
52
- const link = this.chain.find(c => ODataModelOptions.isCollection(c[0]));
53
- return link !== undefined ? link[0] : undefined;
60
+ const link = this.chain.find((c) => ODataModelOptions.isCollection(c[0]));
61
+ return link !== undefined
62
+ ? link[0]
63
+ : undefined;
54
64
  }
55
65
  }
56
66
  export const BUBBLING = [
@@ -128,6 +138,7 @@ export class ODataModelField {
128
138
  }
129
139
  configure({ findOptionsForType, concurrency, options, }) {
130
140
  this.meta = findOptionsForType(this.parser.type);
141
+ this.parserOptions = options;
131
142
  if (concurrency)
132
143
  this.concurrency = concurrency;
133
144
  if (this.default !== undefined)
@@ -221,21 +232,15 @@ export class ODataModelField {
221
232
  : this.default;
222
233
  }
223
234
  deserialize(value, options) {
224
- const parserOptions = options !== undefined
225
- ? new ODataParserOptions(options)
226
- : this.api.options;
235
+ const parserOptions = options || this.parserOptions;
227
236
  return this.parser.deserialize(value, parserOptions);
228
237
  }
229
238
  serialize(value, options) {
230
- const parserOptions = options !== undefined
231
- ? new ODataParserOptions(options)
232
- : this.api.options;
239
+ const parserOptions = options || this.parserOptions;
233
240
  return this.parser.serialize(value, parserOptions);
234
241
  }
235
242
  encode(value, options) {
236
- const parserOptions = options !== undefined
237
- ? new ODataParserOptions(options)
238
- : this.api.options;
243
+ const parserOptions = options || this.parserOptions;
239
244
  return this.parser.encode(value, parserOptions);
240
245
  }
241
246
  resourceFactory(base) {
@@ -249,8 +254,8 @@ export class ODataModelField {
249
254
  }
250
255
  annotationsFactory(base) {
251
256
  return this.parser.collection
252
- ? new ODataEntitiesAnnotations(base.helper, base.property(this.parser.name) || {})
253
- : new ODataEntityAnnotations(base.helper, base.property(this.parser.name) || {});
257
+ ? new ODataEntitiesAnnotations(base.helper, base.property(this.parser.name))
258
+ : new ODataEntityAnnotations(base.helper, base.property(this.parser.name));
254
259
  }
255
260
  schemaFactory(base) {
256
261
  return this.api.findStructuredTypeForType(this.parser.type);
@@ -295,12 +300,25 @@ export class ODataModelOptions {
295
300
  get api() {
296
301
  return this.schema.api;
297
302
  }
298
- type() {
299
- return this.schema.type();
303
+ type({ alias = false } = {}) {
304
+ return this.schema.type({ alias });
300
305
  }
301
306
  isTypeOf(type) {
302
307
  return this.schema.isTypeOf(type);
303
308
  }
309
+ isModelFor(entity) {
310
+ // Resolve By Type
311
+ let type = this.api.options.helper.type(entity);
312
+ if (type && this.isTypeOf(type))
313
+ return true;
314
+ // Resolve By fields
315
+ let keys = Object.keys(entity);
316
+ let names = this.fields({
317
+ include_navigation: true,
318
+ include_parents: true,
319
+ }).map((f) => f.name);
320
+ return keys.every((key) => names.includes(key));
321
+ }
304
322
  findChildOptions(predicate) {
305
323
  if (predicate(this))
306
324
  return this;
@@ -380,30 +398,35 @@ export class ODataModelOptions {
380
398
  return chain;
381
399
  }
382
400
  static resource(child) {
383
- let resource = undefined;
401
+ let resource = null;
402
+ let prevField = null;
384
403
  for (let [model, field] of ODataModelOptions.chain(child)) {
385
404
  resource = resource || model._resource;
386
- if (resource === undefined)
405
+ if (resource === null)
387
406
  break;
388
- if (ODataModelOptions.isModel(model)) {
389
- let key = model.key({
407
+ if (ODataModelOptions.isModel(model) &&
408
+ (prevField === null || prevField.collection)) {
409
+ // Resolve key
410
+ let modelKey = model.key({
390
411
  field_mapping: true,
391
412
  });
392
- if (key !== undefined)
413
+ if (modelKey !== undefined)
393
414
  resource =
394
415
  resource instanceof ODataEntitySetResource
395
- ? resource.entity(key)
396
- : resource.key(key);
416
+ ? resource.entity(modelKey)
417
+ : resource.key(modelKey);
397
418
  }
419
+ prevField = field;
398
420
  if (field === null) {
421
+ // Apply the query from model to new resource
399
422
  const query = model._resource?.cloneQuery().toQueryArguments();
400
- if (query !== undefined && resource !== undefined)
423
+ if (query !== undefined)
401
424
  resource.query((q) => q.apply(query));
402
425
  continue;
403
426
  }
404
427
  resource = field.resourceFactory(resource);
405
428
  }
406
- if (resource === undefined)
429
+ if (resource === null)
407
430
  throw new Error(`resource: Can't build resource for ${child}`);
408
431
  return resource;
409
432
  }
@@ -465,8 +488,8 @@ export class ODataModelOptions {
465
488
  }
466
489
  resolveKey(value, { field_mapping = false, resolve = true, } = {}) {
467
490
  const keyTypes = this.schema.keys({ include_parents: true });
468
- const key = {};
469
- for (var kt of keyTypes) {
491
+ const key = new Map();
492
+ for (let kt of keyTypes) {
470
493
  let v = value;
471
494
  let options = this;
472
495
  let field;
@@ -489,47 +512,51 @@ export class ODataModelOptions {
489
512
  let name = field_mapping ? field.field : field.name;
490
513
  if (kt.alias !== undefined)
491
514
  name = kt.alias;
492
- key[name] = v;
515
+ key.set(name, v);
493
516
  }
494
- if (Types.isEmpty(key))
517
+ if (key.size === 0)
495
518
  return undefined;
496
- return resolve ? Objects.resolveKey(key) : key;
519
+ return resolve ? Objects.resolveKey(key) : Object.fromEntries(key);
497
520
  }
498
521
  resolveReferential(value, field, { field_mapping = false, resolve = true, } = {}) {
499
- const referential = {};
500
- for (var ref of field.referentials) {
522
+ const referential = new Map();
523
+ for (let ref of field.referentials) {
501
524
  let from = this.fields({ include_parents: true }).find((p) => p.field === ref.referencedProperty);
502
525
  let to = field.options
503
526
  .fields({ include_parents: true })
504
527
  .find((field) => field.field === ref.property);
505
528
  if (from !== undefined && to !== undefined) {
506
529
  let name = field_mapping ? to.field : to.name;
507
- referential[name] = value && value[from.name];
530
+ referential.set(name, value && value[from.name]);
508
531
  }
509
532
  }
510
- if (Types.isEmpty(referential))
533
+ if (referential.size === 0)
511
534
  return undefined;
535
+ if (referential.size === 1 && Array.from(referential.values())[0] === null)
536
+ return null;
512
537
  return resolve
513
538
  ? Objects.resolveKey(referential, { single: false })
514
- : referential;
539
+ : Object.fromEntries(referential);
515
540
  }
516
541
  resolveReferenced(value, field, { field_mapping = false, resolve = true, } = {}) {
517
- const referenced = {};
518
- for (var ref of field.referentials) {
542
+ const referenced = new Map();
543
+ for (let ref of field.referentials) {
519
544
  let from = this.fields({ include_parents: true }).find((field) => field.field === ref.property);
520
545
  let to = field.meta
521
546
  .fields({ include_parents: true })
522
547
  .find((field) => field.field === ref.referencedProperty);
523
548
  if (from !== undefined && to !== undefined) {
524
549
  let name = field_mapping ? to.field : to.name;
525
- referenced[name] = value && value[from.name];
550
+ referenced.set(name, value && value[from.name]);
526
551
  }
527
552
  }
528
- if (Types.isEmpty(referenced))
553
+ if (referenced.size === 0)
529
554
  return undefined;
555
+ if (referenced.size === 1 && Array.from(referenced.values())[0] === null)
556
+ return null;
530
557
  return resolve
531
558
  ? Objects.resolveKey(referenced, { single: false })
532
- : referenced;
559
+ : Object.fromEntries(referenced);
533
560
  }
534
561
  validate(self, { method, navigation = false, } = {}) {
535
562
  const errors = this.fields({
@@ -554,8 +581,8 @@ export class ODataModelOptions {
554
581
  return !Types.isEmpty(defs) ? defs : undefined;
555
582
  }
556
583
  hasChanged(self, { include_navigation = false } = {}) {
557
- return (!Types.isEmpty(self._changes) ||
558
- Object.values(self._relations)
584
+ return (self._changes.size != 0 ||
585
+ [...self._relations.values()]
559
586
  .filter(({ field }) => !field.navigation || include_navigation)
560
587
  .some(({ field, state, model }) => (!include_navigation || field.navigation) &&
561
588
  (state === ODataModelState.Changed ||
@@ -596,7 +623,7 @@ export class ODataModelOptions {
596
623
  include_computed,
597
624
  include_non_field,
598
625
  });
599
- let relations = Object.entries(self._relations)
626
+ let relations = [...self._relations.entries()]
600
627
  .filter(
601
628
  // Chain
602
629
  ([, { model }]) => chain.every((c) => c !== model))
@@ -673,19 +700,19 @@ export class ODataModelOptions {
673
700
  (ODataModelOptions.isCollection(self._parent[0]) &&
674
701
  self._parent[0]._model
675
702
  .meta !== self._meta))) {
676
- this.api.options.helper.type(entity, this.schema.type());
703
+ entity[this.api.options.helper.ODATA_TYPE] = `#${this.schema.type()}`;
677
704
  }
678
705
  return entity;
679
706
  }
680
707
  attributes(self, { changes_only = false, include_concurrency = false, include_computed = false, include_non_field = false, field_mapping = false, } = {}) {
681
708
  // Attributes by fields (attributes for the model type)
682
709
  const fieldAttrs = this.fields().reduce((acc, f) => {
683
- const isChanged = f.name in self._changes;
710
+ const isChanged = self._changes.has(f.name);
684
711
  const name = field_mapping ? f.field : f.name;
685
712
  const computed = f.annotatedValue(COMPUTED);
686
713
  const value = isChanged
687
- ? self._changes[f.name]
688
- : self._attributes[f.name];
714
+ ? self._changes.get(f.name)
715
+ : self._attributes.get(f.name);
689
716
  if (f.concurrency && include_concurrency) {
690
717
  return Object.assign(acc, { [name]: value });
691
718
  }
@@ -712,32 +739,27 @@ export class ODataModelOptions {
712
739
  return { ...fieldAttrs, ...nonFieldAttrs };
713
740
  }
714
741
  reset(self, { name, silent = false } = {}) {
715
- if (!Types.isEmpty(name) && name in self._changes) {
716
- const value = self._attributes[name];
717
- const previous = self._changes[name];
718
- delete self._changes[name];
719
- if (!silent) {
720
- self.events$.emit(new ODataModelEvent('change', {
721
- model: self,
722
- track: name,
723
- value,
724
- previous,
725
- }));
726
- }
742
+ let changes = [];
743
+ if (name !== undefined) {
744
+ // Reset value
745
+ const value = self._attributes.get(name);
746
+ const change = self._changes.get(name);
747
+ if (value !== change)
748
+ changes = [name];
749
+ self._relations.delete(name);
750
+ self._changes.delete(name);
727
751
  }
728
- else if (Types.isEmpty(name)) {
729
- const entries = Object.entries(self._changes);
730
- self._changes = {};
731
- if (!silent) {
732
- entries.forEach((entry) => {
733
- self.events$.emit(new ODataModelEvent('change', {
734
- track: entry[0],
735
- model: self,
736
- value: self._attributes[entry[0]],
737
- previous: entry[1],
738
- }));
739
- });
740
- }
752
+ else {
753
+ // reset all
754
+ changes = [...self._changes.keys()];
755
+ self._relations.clear();
756
+ self._changes.clear();
757
+ }
758
+ if (!silent && changes.length > 0) {
759
+ self.events$.emit(new ODataModelEvent('reset', {
760
+ model: self,
761
+ options: { changes },
762
+ }));
741
763
  }
742
764
  }
743
765
  assign(self, entity, { reset = false, reparent = false, silent = false, } = {}) {
@@ -804,7 +826,29 @@ export class ODataModelOptions {
804
826
  }
805
827
  _get(self, field) {
806
828
  if (field.isStructuredType()) {
807
- return self._relations[field.name]?.model;
829
+ const relation = self._relations.get(field.name);
830
+ if (relation?.model === null ||
831
+ ODataModelOptions.isModel(relation?.model)) {
832
+ // Check for reference
833
+ const referenced = this.resolveReferenced(self, field);
834
+ if (relation?.model !== null &&
835
+ referenced !== null &&
836
+ referenced !== undefined) {
837
+ relation.model.assign(referenced, {
838
+ silent: true,
839
+ });
840
+ }
841
+ else if (relation?.model !== null && referenced === null) {
842
+ this._unlink(self, relation);
843
+ // New value is null
844
+ relation.model = null;
845
+ }
846
+ else if (relation?.model === null && referenced !== null) {
847
+ // New value is undefined
848
+ relation.model = undefined;
849
+ }
850
+ }
851
+ return relation?.model;
808
852
  }
809
853
  else {
810
854
  return this.attributes(self, {
@@ -816,52 +860,69 @@ export class ODataModelOptions {
816
860
  _setStructured(self, field, value) {
817
861
  let changed = false;
818
862
  // Ensures that the relation exists
819
- if (!(field.name in self._relations)) {
820
- self._relations[field.name] = {
863
+ if (!self._relations.has(field.name)) {
864
+ self._relations.set(field.name, {
821
865
  state: ODataModelState.Unchanged,
822
866
  field: field,
823
- };
867
+ });
824
868
  }
825
- const relation = self._relations[field.name];
826
- const currentModel = relation.model;
869
+ const relation = self._relations.get(field.name);
870
+ const current = relation.model;
827
871
  if (value === null) {
872
+ // Unlink old relation
873
+ this._unlink(self, relation);
874
+ // New value is null
828
875
  relation.model = value;
829
- changed = currentModel !== value;
830
- this._unsubscribe(self, relation);
876
+ changed = current !== value;
831
877
  }
832
- else if (ODataModelOptions.isCollection(currentModel)) {
878
+ else if (ODataModelOptions.isCollection(current)) {
879
+ // Current is collection
880
+ let currentCollection = current;
833
881
  if (ODataModelOptions.isCollection(value)) {
834
- if (currentModel.equals(value)) {
882
+ // New value is collection
883
+ let newCollection = value;
884
+ if (currentCollection.equals(newCollection)) {
835
885
  changed = false;
836
886
  }
837
- this._unsubscribe(self, relation);
838
- relation.model = value;
839
- this._subscribe(self, relation);
840
- if (self._reparent)
841
- relation.model._parent = [self, field];
842
- changed = true;
887
+ else {
888
+ // Unlink old collection
889
+ this._unlink(self, relation);
890
+ relation.model = newCollection;
891
+ // Link new collection
892
+ this._link(self, relation);
893
+ changed = true;
894
+ }
843
895
  }
844
896
  else if (Types.isArray(value)) {
845
- changed = this.updateCollection(self, field, currentModel, value);
897
+ // New value is array
898
+ changed = this.updateCollection(self, field, currentCollection, value);
846
899
  }
847
900
  }
848
- else if (ODataModelOptions.isModel(currentModel)) {
901
+ else if (ODataModelOptions.isModel(current)) {
902
+ // Current is model
903
+ let currentModel = current;
849
904
  if (ODataModelOptions.isModel(value)) {
850
- if (currentModel.equals(value)) {
905
+ // New value is model
906
+ let newModel = value;
907
+ if (currentModel.equals(newModel)) {
851
908
  changed = false;
852
909
  }
853
- this._unsubscribe(self, relation);
854
- relation.model = value;
855
- this._subscribe(self, relation);
856
- if (self._reparent)
857
- relation.model._parent = [self, field];
858
- changed = true;
910
+ else {
911
+ // Unlink old model
912
+ this._unlink(self, relation);
913
+ relation.model = newModel;
914
+ // Link new model
915
+ this._link(self, relation);
916
+ changed = true;
917
+ }
859
918
  }
860
919
  else if (Types.isPlainObject(value)) {
861
920
  changed = this.updateModel(self, field, currentModel, value);
862
921
  }
863
922
  }
864
923
  else {
924
+ // Current is null or undefined
925
+ // create new model/collection for given value
865
926
  relation.model =
866
927
  ODataModelOptions.isCollection(value) ||
867
928
  ODataModelOptions.isModel(value)
@@ -871,27 +932,28 @@ export class ODataModelOptions {
871
932
  value: value,
872
933
  reset: self._reset,
873
934
  });
935
+ // Link new model/collection
936
+ this._link(self, relation);
874
937
  changed = true;
875
- this._subscribe(self, relation);
876
- if (self._reparent)
877
- relation.model._parent = [self, field];
878
938
  }
939
+ // Resolve referentials
879
940
  if (!ODataModelOptions.isCollection(relation.model)) {
880
- var ref = field.meta?.resolveReferential(relation.model, field);
881
- if (ref !== undefined) {
882
- Object.entries(ref).forEach(([k, v]) => this._setValue(self, k, v, false));
941
+ let ref = field.meta?.resolveReferential(relation.model, field);
942
+ if (ref !== null && ref !== undefined) {
943
+ Object.assign(self, ref);
883
944
  }
884
945
  }
946
+ // Update state and emit event
885
947
  relation.state =
886
948
  self._reset || !changed
887
949
  ? ODataModelState.Unchanged
888
950
  : ODataModelState.Changed;
889
951
  if (!self._silent && changed) {
890
952
  self.events$.emit(new ODataModelEvent('change', {
891
- track: field.name,
953
+ field: field,
892
954
  model: self,
893
955
  value: relation.model,
894
- previous: currentModel,
956
+ previous: current,
895
957
  }));
896
958
  }
897
959
  return changed;
@@ -902,21 +964,22 @@ export class ODataModelOptions {
902
964
  include_concurrency: true,
903
965
  include_computed: true,
904
966
  });
905
- const currentValue = attrs[field];
967
+ const name = field.name;
968
+ const currentValue = attrs[name];
906
969
  changed = !Types.isEqual(currentValue, value);
907
970
  if (self._reset) {
908
- delete self._changes[field];
909
- self._attributes[field] = value;
971
+ self._changes.delete(name);
972
+ self._attributes.set(name, value);
910
973
  }
911
- else if (Types.isEqual(value, self._attributes[field])) {
912
- delete self._changes[field];
974
+ else if (Types.isEqual(value, self._attributes.get(name))) {
975
+ self._changes.delete(name);
913
976
  }
914
977
  else if (changed) {
915
- self._changes[field] = value;
978
+ self._changes.set(name, value);
916
979
  }
917
980
  if (!self._silent && changed) {
918
981
  self.events$.emit(new ODataModelEvent('change', {
919
- track: field,
982
+ field: field,
920
983
  model: self,
921
984
  value,
922
985
  previous: currentValue,
@@ -928,21 +991,26 @@ export class ODataModelOptions {
928
991
  _set(self, field, value) {
929
992
  return field.isStructuredType()
930
993
  ? this._setStructured(self, field, value)
931
- : this._setValue(self, field.name, value, field.isKey());
994
+ : this._setValue(self, field, value, field.isKey());
932
995
  }
933
- _unsubscribe(self, relation) {
934
- if (relation.subscription) {
996
+ _unlink(self, relation) {
997
+ if (relation.subscription !== undefined) {
935
998
  relation.subscription.unsubscribe();
936
- delete relation.subscription;
999
+ relation.subscription = undefined;
1000
+ }
1001
+ if (relation.model != null) {
1002
+ relation.model._parent = null;
937
1003
  }
938
1004
  }
939
- _subscribe(self, relation) {
1005
+ _link(self, relation) {
940
1006
  if (relation.subscription) {
941
1007
  throw new Error('Subscription already exists');
942
1008
  }
943
1009
  if (relation.model == null) {
944
1010
  throw new Error('Subscription model is null');
945
1011
  }
1012
+ if (self._reparent)
1013
+ relation.model._parent = [self, relation.field];
946
1014
  relation.subscription = relation.model.events$.subscribe((event) => {
947
1015
  if (BUBBLING.indexOf(event.name) !== -1 &&
948
1016
  event.bubbling &&
@@ -951,16 +1019,15 @@ export class ODataModelOptions {
951
1019
  if (event.name === 'change' &&
952
1020
  relation.field.navigation &&
953
1021
  event.options?.key) {
954
- var ref = relation.model.referential(relation.field);
955
- if (ref !== undefined) {
956
- Object.entries(ref).forEach(([k, v]) => this._setValue(self, k, v, false));
1022
+ let ref = relation.model.referential(relation.field);
1023
+ if (ref !== null && ref !== undefined) {
1024
+ Object.assign(self, ref);
957
1025
  }
958
1026
  }
959
1027
  }
960
- event.push(self, relation.field.name);
961
- self.events$.emit(event);
1028
+ self.events$.emit(event.push(self, relation.field));
962
1029
  }
963
1030
  });
964
1031
  }
965
1032
  }
966
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLCtCQUErQixFQUMvQixxQkFBcUIsR0FLdEIsTUFBTSxjQUFjLENBQUM7QUFPdEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFlMUMsTUFBTSxPQUFPLGVBQWU7SUFLMUIsWUFDRSxJQUF5QixFQUN6QixFQUNFLEtBQUssRUFDTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLEVBQ0wsT0FBTyxNQVFMLEVBQUU7UUFrQlIsYUFBUSxHQUFZLElBQUksQ0FBQztRQWhCdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxP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QUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDcEI7Z0JBQ0EsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUU7b0JBQ2xDLElBQ0UsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO3dCQUN2QixRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVU7d0JBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUNsQjt3QkFDQSxJQUFJLEdBQUcsR0FBSSxRQUFRLENBQUMsS0FBeUIsQ0FBQyxXQUFXLENBQ3ZELFFBQVEsQ0FBQyxLQUFLLENBQ2YsQ0FBQzt3QkFDRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7NEJBQ3JCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUNsQyxDQUFDO3lCQUNIO3FCQUNGO2lCQUNGO2dCQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFCO1FBQ0gsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ0lEX0ZJRUxEX05BTUUsXG4gIENPTVBVVEVELFxuICBERUZBVUxUX1ZFUlNJT04sXG4gIE9QVElNSVNUSUNfQ09OQ1VSUkVOQ1ksXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcic7XG5pbXBvcnQgeyBPRGF0YVBhcnNlck9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlPcHRpb25zLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0eVNldCxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZSxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyLFxufSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgT3B0aW9uc0hlbHBlciB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5cbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxFdmVudFR5cGUgPVxuICB8ICdjaGFuZ2UnXG4gIHwgJ3Jlc2V0J1xuICB8ICd1cGRhdGUnXG4gIHwgJ2Rlc3Ryb3knXG4gIHwgJ2FkZCdcbiAgfCAncmVtb3ZlJ1xuICB8ICdpbnZhbGlkJ1xuICB8ICdyZXF1ZXN0J1xuICB8ICdzeW5jJ1xuICB8ICdhdHRhY2gnO1xuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxFdmVudDxUPiB7XG4gIG5hbWU6IE9EYXRhTW9kZWxFdmVudFR5cGU7XG4gIHZhbHVlPzogYW55O1xuICBwcmV2aW91cz86IGFueTtcbiAgb3B0aW9ucz86IGFueTtcbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogT0RhdGFNb2RlbEV2ZW50VHlwZSxcbiAgICB7XG4gICAgICBtb2RlbCxcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBwcmV2aW91cyxcbiAgICAgIHZhbHVlLFxuICAgICAgdHJhY2ssXG4gICAgICBvcHRpb25zLFxuICAgIH06IHtcbiAgICAgIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgICAgIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gICAgICB0cmFjaz86IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIHByZXZpb3VzPzogYW55O1xuICAgICAgdmFsdWU/OiBhbnk7XG4gICAgICBvcHRpb25zPzogYW55O1xuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgIHRoaXMucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmNoYWluID0gW1xuICAgICAgW1xuICAgICAgICAodGhpcy5jb2xsZWN0aW9uIHx8IHRoaXMubW9kZWwpIGFzXG4gICAgICAgICAgfCBPRGF0YU1vZGVsPGFueT5cbiAgICAgICAgICB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIHRyYWNrIHx8IG51bGwsXG4gICAgICBdLFxuICAgIF07XG4gIH1cblxuICBidWJibGluZzogYm9vbGVhbiA9IHRydWU7XG4gIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICB0aGlzLmJ1YmJsaW5nID0gZmFsc2U7XG4gIH1cblxuICBjaGFpbjogW1xuICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbFxuICBdW107XG4gIHB1c2goXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgdHJhY2s6IHN0cmluZyB8IG51bWJlclxuICApIHtcbiAgICB0aGlzLmNoYWluLnNwbGljZSgwLCAwLCBbbW9kZWwsIHRyYWNrXSk7XG4gIH1cblxuICB2aXNpdGVkKG1vZGVsOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2hhaW4uc29tZSgoYykgPT4gY1swXSA9PT0gbW9kZWwpICYmXG4gICAgICB0aGlzLmNoYWluW3RoaXMuY2hhaW4ubGVuZ3RoIC0gMV1bMF0gIT09IG1vZGVsXG4gICAgKTtcbiAgfVxuXG4gIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmNoYWluXG4gICAgICAubWFwKChbLCB0cmFja10sIGluZGV4KSA9PlxuICAgICAgICB0eXBlb2YgdHJhY2sgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBgWyR7dHJhY2t9XWBcbiAgICAgICAgICA6IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGluZGV4ID09PSAwXG4gICAgICAgICAgICA/IHRyYWNrXG4gICAgICAgICAgICA6IGAuJHt0cmFja31gXG4gICAgICAgICAgOiAnJ1xuICAgICAgKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG4gIFxuXG4gIC8vUmVmZXJlbmNlIHRvIHRoZSBtb2RlbCB3aGljaCB0aGUgZXZlbnQgd2FzIGRpc3BhdGNoZWRcbiAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAvL0lkZW50aWZpZXMgdGhlIGN1cnJlbnQgbW9kZWwgZm9yIHRoZSBldmVudFxuICBnZXQgY3VycmVudE1vZGVsKCk6IE9EYXRhTW9kZWw8YW55PiB8IHVuZGVmaW5lZHtcbiAgICBjb25zdCBsaW5rID0gdGhpcy5jaGFpbi5maW5kKGMgPT4gT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChjWzBdKSk7XG4gICAgcmV0dXJuIGxpbmsgIT09IHVuZGVmaW5lZCA/IGxpbmtbMF0gYXMgT0RhdGFNb2RlbDxhbnk+IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy9SZWZlcmVuY2UgdG8gdGhlIGNvbGxlY3Rpb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBkaXNwYXRjaGVkXG4gIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gIC8vSWRlbnRpZmllcyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIGZvciB0aGUgZXZlbnRcbiAgZ2V0IGN1cnJlbnRDb2xsZWN0aW9uKCk6IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4gfCB1bmRlZmluZWR7XG4gICAgY29uc3QgbGluayA9IHRoaXMuY2hhaW4uZmluZChjID0+IE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjWzBdKSk7XG4gICAgcmV0dXJuIGxpbmsgIT09IHVuZGVmaW5lZCA/IGxpbmtbMF0gYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PiA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgQlVCQkxJTkcgPSBbXG4gICdjaGFuZ2UnLFxuICAncmVzZXQnLFxuICAndXBkYXRlJyxcbiAgJ2Rlc3Ryb3knLFxuICAnYWRkJyxcbiAgJ3JlbW92ZScsXG5dO1xuXG5leHBvcnQgY29uc3QgSU5DTFVERV9TSEFMTE9XID0ge1xuICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICBpbmNsdWRlX2tleTogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBJTkNMVURFX0RFRVAgPSB7XG4gIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgaW5jbHVkZV9ub25fZmllbGQ6IHRydWUsXG4gIC4uLklOQ0xVREVfU0hBTExPVyxcbn07XG5cbmV4cG9ydCBlbnVtIE9EYXRhTW9kZWxTdGF0ZSB7XG4gIEFkZGVkLFxuICBSZW1vdmVkLFxuICBDaGFuZ2VkLFxuICBVbmNoYW5nZWQsXG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsT3B0aW9ucyA9IHtcbiAgY2lkPzogc3RyaW5nO1xuICBmaWVsZHM6IHsgW25hbWU6IHN0cmluZ106IE1vZGVsRmllbGRPcHRpb25zIH07XG59O1xuXG5leHBvcnQgdHlwZSBNb2RlbEZpZWxkT3B0aW9ucyA9IHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k/OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHBhdHRlcm4/OiBSZWdFeHA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gTW9kZWwoeyBjaWQgPSBDSURfRklFTERfTkFNRSB9OiB7IGNpZD86IHN0cmluZyB9ID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKToge30gfT4oY29uc3RydWN0b3I6IFQpID0+IHtcbiAgICBjb25zdCBLbGFzcyA9IDxhbnk+Y29uc3RydWN0b3I7XG4gICAgaWYgKCFLbGFzcy5oYXNPd25Qcm9wZXJ0eSgnb3B0aW9ucycpKVxuICAgICAgS2xhc3Mub3B0aW9ucyA9IHsgZmllbGRzOiB7fSB9IGFzIE1vZGVsT3B0aW9ucztcbiAgICBLbGFzcy5vcHRpb25zLmNpZCA9IGNpZDtcbiAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbEZpZWxkKHtcbiAgbmFtZSxcbiAgLi4ub3B0aW9uc1xufTogeyBuYW1lPzogc3RyaW5nIH0gJiBNb2RlbEZpZWxkT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgS2xhc3MgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gICAgaWYgKCFLbGFzcy5oYXNPd25Qcm9wZXJ0eSgnb3B0aW9ucycpKVxuICAgICAgS2xhc3Mub3B0aW9ucyA9IHsgZmllbGRzOiB7fSB9IGFzIE1vZGVsT3B0aW9ucztcbiAgICBvcHRpb25zLmZpZWxkID0gbmFtZSB8fCBrZXk7XG4gICAgS2xhc3Mub3B0aW9ucy5maWVsZHNba2V5XSA9IG9wdGlvbnM7XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxGaWVsZE9wdGlvbnM8Rj4gPSBNb2RlbEZpZWxkT3B0aW9ucyAmIHtcbiAgbmFtZTogc3RyaW5nO1xuICBmaWVsZDogc3RyaW5nO1xuICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsRmllbGQ8Rj4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+O1xuICBvcHRpb25zOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBtZXRhPzogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgZGVmYXVsdD86IGFueTtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGNvbmN1cnJlbmN5OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHBhdHRlcm4/OiBSZWdFeHA7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4sXG4gICAgeyBuYW1lLCBmaWVsZCwgcGFyc2VyLCAuLi5vcHRzIH06IE9EYXRhTW9kZWxGaWVsZE9wdGlvbnM8Rj5cbiAgKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZmllbGQgPSBmaWVsZDtcbiAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB0aGlzLmRlZmF1bHQgPSBvcHRzLmRlZmF1bHQgfHwgcGFyc2VyLmRlZmF1bHQ7XG4gICAgdGhpcy5yZXF1aXJlZCA9IEJvb2xlYW4ob3B0cy5yZXF1aXJlZCB8fCAhcGFyc2VyLm51bGxhYmxlKTtcbiAgICB0aGlzLmNvbmN1cnJlbmN5ID0gQm9vbGVhbihvcHRzLmNvbmN1cnJlbmN5KTtcbiAgICB0aGlzLm1heExlbmd0aCA9IG9wdHMubWF4TGVuZ3RoIHx8IHBhcnNlci5tYXhMZW5ndGg7XG4gICAgdGhpcy5taW5MZW5ndGggPSBvcHRzLm1pbkxlbmd0aDtcbiAgICB0aGlzLm1pbiA9IG9wdHMubWluO1xuICAgIHRoaXMubWF4ID0gb3B0cy5tYXg7XG4gICAgdGhpcy5wYXR0ZXJuID0gb3B0cy5wYXR0ZXJuO1xuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwaTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci50eXBlO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb24oKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5wYXJzZXIubmF2aWdhdGlvbik7XG4gIH1cblxuICBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnBhcnNlci5jb2xsZWN0aW9uKTtcbiAgfVxuXG4gIGFubm90YXRlZFZhbHVlPFQ+KHRlcm06IHN0cmluZyB8IFJlZ0V4cCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5hbm5vdGF0ZWRWYWx1ZTxUPih0ZXJtKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICAgIGNvbmN1cnJlbmN5LFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uY3VycmVuY3k6IGJvb2xlYW47XG4gICAgb3B0aW9uczogT3B0aW9uc0hlbHBlcjtcbiAgfSkge1xuICAgIHRoaXMubWV0YSA9IGZpbmRPcHRpb25zRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgICBpZiAoY29uY3VycmVuY3kpIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgICBpZiAodGhpcy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlc2VyaWFsaXplKHRoaXMuZGVmYXVsdCwgb3B0aW9ucyk7XG4gIH1cblxuICBpc0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNLZXkoKTtcbiAgfVxuXG4gIGhhc1JlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaGFzUmVmZXJlbnRpYWxzKCk7XG4gIH1cblxuICBnZXQgcmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5yZWZlcmVudGlhbHM7XG4gIH1cblxuICBpc1N0cnVjdHVyZWRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc1N0cnVjdHVyZWRUeXBlKCk7XG4gIH1cblxuICBzdHJ1Y3R1cmVkKCkge1xuICAgIGxldCBzdHJ1Y3R1cmVkVHlwZSA9IHRoaXMuYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8Rj4oXG4gICAgICB0aGlzLnBhcnNlci50eXBlXG4gICAgKTtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIGlmICghc3RydWN0dXJlZFR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHN0cnVjdHVyZWQgdHlwZSBmb3IgJHt0aGlzLnBhcnNlci50eXBlfWApO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkVHlwZTtcbiAgfVxuXG4gIGlzRW51bVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzRW51bVR5cGUoKTtcbiAgfVxuXG4gIGVudW0oKSB7XG4gICAgbGV0IGVudW1UeXBlID0gdGhpcy5hcGkuZmluZEVudW1UeXBlRm9yVHlwZTxGPih0aGlzLnBhcnNlci50eXBlKTtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIGlmICghZW51bVR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGVudW0gdHlwZSBmb3IgJHt0aGlzLnBhcnNlci50eXBlfWApO1xuICAgIHJldHVybiBlbnVtVHlwZTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICAvKlxuICAgIGlmICgnaXNWYWxpZCcgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmlzVmFsaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAhdmFsdWUuaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSA/IHZhbHVlLl9lcnJvcnMgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICgnbW9kZWxzJyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubW9kZWxzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAqL1xuICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuICF2YWx1ZS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pID8gdmFsdWUuX2Vycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAubW9kZWxzKClcbiAgICAgICAgLnNvbWUoKG06IE9EYXRhTW9kZWw8YW55PikgPT4gIW0uaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSlcbiAgICAgICAgPyB2YWx1ZS5tb2RlbHMoKS5tYXAoKG06IE9EYXRhTW9kZWw8YW55PikgPT4gbS5fZXJyb3JzKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmFubm90YXRlZFZhbHVlPGJvb2xlYW4+KENPTVBVVEVEKTtcbiAgICAgIGxldCBlcnJvcnMgPSB0aGlzLnBhcnNlcj8udmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pIHx8IFtdO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnJlcXVpcmVkICYmXG4gICAgICAgICh2YWx1ZSA9PT0gbnVsbCB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBtZXRob2QgIT09ICdtb2RpZnknKSkgJiYgLy8gSXMgbnVsbCBvciB1bmRlZmluZWQgd2l0aG91dCBwYXRjaD9cbiAgICAgICAgIShjb21wdXRlZCAmJiBtZXRob2QgPT09ICdjcmVhdGUnKSAvLyBOb3QgKElzIENvbXB1dGVkIGZpZWxkIGFuZCBjcmVhdGUpID9cbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgcmVxdWlyZWRgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXhMZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYG1heGxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgbWlubGVuZ3RoYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA8IHRoaXMubWluXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYG1pbmApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1heCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiB0aGlzLm1heFxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtYXhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wYXR0ZXJuICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAhdGhpcy5wYXR0ZXJuLnRlc3QodmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGRlZmF1bHRzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmIHRoaXMubWV0YSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHRoaXMubWV0YS5kZWZhdWx0cygpXG4gICAgICA6IHRoaXMuZGVmYXVsdDtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBPcHRpb25zSGVscGVyKTogRiB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5hcGkub3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgc2VyaWFsaXplKHZhbHVlOiBGLCBvcHRpb25zPzogT3B0aW9uc0hlbHBlcik6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5hcGkub3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIGVuY29kZSh2YWx1ZTogRiwgb3B0aW9ucz86IE9wdGlvbnNIZWxwZXIpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMuYXBpLm9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmVuY29kZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gIH1cblxuICByZXNvdXJjZUZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFSZXNvdXJjZTxUPlxuICApOiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPEY+IHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPEY+IHtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFQcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yIG5vbiBjb21wYXRpYmxlIGJhc2UgdHlwZVwiKTtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uXG4gICAgICA/IChiYXNlIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4pLm5hdmlnYXRpb25Qcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKVxuICAgICAgOiAoYmFzZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5wcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKTtcbiAgfVxuXG4gIGFubm90YXRpb25zRmFjdG9yeShcbiAgICBiYXNlOiBPRGF0YUVudGl0eUFubm90YXRpb25zXG4gICk6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMgfCBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5jb2xsZWN0aW9uXG4gICAgICA/IG5ldyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMoXG4gICAgICAgICAgYmFzZS5oZWxwZXIsXG4gICAgICAgICAgYmFzZS5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lKSB8fCB7fVxuICAgICAgICApXG4gICAgICA6IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKFxuICAgICAgICAgIGJhc2UuaGVscGVyLFxuICAgICAgICAgIGJhc2UucHJvcGVydHkodGhpcy5wYXJzZXIubmFtZSkgfHwge31cbiAgICAgICAgKTtcbiAgfVxuXG4gIHNjaGVtYUZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlPEY+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcGkuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgfVxuXG4gIG1vZGVsQ29sbGVjdGlvbkZhY3Rvcnk8VCwgRj4oe1xuICAgIHBhcmVudCxcbiAgICB2YWx1ZSxcbiAgICByZXNldCxcbiAgfToge1xuICAgIHBhcmVudDogT0RhdGFNb2RlbDxhbnk+O1xuICAgIHZhbHVlPzogRiB8IEZbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXTtcbiAgICByZXNldD86IGJvb2xlYW47XG4gIH0pOiBPRGF0YU1vZGVsPEY+IHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+IHtcbiAgICBjb25zdCBhbm5vdHMgPSB0aGlzLmFubm90YXRpb25zRmFjdG9yeShwYXJlbnQuYW5ub3RzKCkpO1xuICAgIGNvbnN0IE1vZGVsID0gdGhpcy5hcGkubW9kZWxGb3JUeXBlKHRoaXMucGFyc2VyLnR5cGUpO1xuICAgIGNvbnN0IENvbGxlY3Rpb24gPSB0aGlzLmFwaS5jb2xsZWN0aW9uRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcblxuICAgIGlmIChNb2RlbCA9PT0gdW5kZWZpbmVkIHx8IENvbGxlY3Rpb24gPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IEVycm9yKGBObyBtb2RlbCBmb3IgJHt0aGlzLm5hbWV9YCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmNvbGxlY3Rpb25cbiAgICAgID8gKG5ldyBDb2xsZWN0aW9uKCh2YWx1ZSB8fCBbXSkgYXMgRltdLCB7XG4gICAgICAgICAgYW5ub3RzOiBhbm5vdHMgYXMgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICAgICAgICAgIHBhcmVudDogW3BhcmVudCwgdGhpc10sXG4gICAgICAgICAgcmVzZXQsXG4gICAgICAgIH0pIGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PilcbiAgICAgIDogKG5ldyBNb2RlbCgodmFsdWUgfHwge30pIGFzIEYsIHtcbiAgICAgICAgICBhbm5vdHM6IGFubm90cyBhcyBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICAgICAgICAgIHBhcmVudDogW3BhcmVudCwgdGhpc10sXG4gICAgICAgICAgcmVzZXQsXG4gICAgICAgIH0pIGFzIE9EYXRhTW9kZWw8Rj4pO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxSZWxhdGlvbjxUPiA9IHtcbiAgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZTtcbiAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+IHwgbnVsbDtcbiAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxUPjtcbiAgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xufTtcbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxFbnRyeTxULCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj4gPSB7XG4gIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGU7XG4gIG1vZGVsOiBNO1xuICBrZXk/OiBFbnRpdHlLZXk8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxPcHRpb25zPFQ+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjaWQ6IHN0cmluZztcbiAgYmFzZT86IHN0cmluZztcbiAgb3Blbj86IGJvb2xlYW47XG4gIHByaXZhdGUgX2ZpZWxkczogT0RhdGFNb2RlbEZpZWxkPGFueT5bXTtcbiAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICBlbnRpdHlTZXQ/OiBPRGF0YUVudGl0eVNldDtcbiAgLy8gSGllcmFyY2h5XG4gIHBhcmVudD86IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIGNoaWxkcmVuOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+W10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgb3B0aW9ucyxcbiAgICBzY2hlbWEsXG4gIH06IHtcbiAgICBvcHRpb25zOiBNb2RlbE9wdGlvbnM7XG4gICAgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+O1xuICB9KSB7XG4gICAgdGhpcy5uYW1lID0gc2NoZW1hLm5hbWU7XG4gICAgdGhpcy5iYXNlID0gc2NoZW1hLmJhc2U7XG4gICAgdGhpcy5vcGVuID0gc2NoZW1hLm9wZW47XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5jaWQgPSBvcHRpb25zPy5jaWQgfHwgQ0lEX0ZJRUxEX05BTUU7XG4gICAgdGhpcy5fZmllbGRzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5maWVsZHMpLm1hcCgoW25hbWUsIG9wdGlvbnNdKSA9PiB7XG4gICAgICBjb25zdCB7IGZpZWxkLCAuLi5vcHRzIH0gPSBvcHRpb25zO1xuICAgICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgbmFtZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZGVsIFByb3BlcnRpZXMgbmVlZCBuYW1lIGFuZCBmaWVsZCcpO1xuICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5zY2hlbWEuZmluZEZpZWxkQnlOYW1lPFQ+KGZpZWxkIGFzIGtleW9mIFQpO1xuICAgICAgaWYgKHBhcnNlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBhcnNlciBmb3IgJHtmaWVsZH0gd2l0aCBuYW1lID0gJHtuYW1lfWApO1xuICAgICAgcmV0dXJuIG5ldyBPRGF0YU1vZGVsRmllbGQ8VD4odGhpcywgeyBuYW1lLCBmaWVsZCwgcGFyc2VyLCAuLi5vcHRzIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEuYXBpO1xuICB9XG5cbiAgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEudHlwZSgpO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmlzVHlwZU9mKHR5cGUpO1xuICB9XG5cbiAgZmluZENoaWxkT3B0aW9ucyhcbiAgICBwcmVkaWNhdGU6IChvcHRpb25zOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+KSA9PiBib29sZWFuXG4gICk6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcmVkaWNhdGUodGhpcykpIHJldHVybiB0aGlzO1xuICAgIGxldCBtYXRjaDogT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBjaCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBtYXRjaCA9IGNoLmZpbmRDaGlsZE9wdGlvbnMocHJlZGljYXRlKTtcbiAgICAgIGlmIChtYXRjaCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBvcHRpb25zOiBPcHRpb25zSGVscGVyO1xuICB9KSB7XG4gICAgaWYgKHRoaXMuYmFzZSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZmluZE9wdGlvbnNGb3JUeXBlKHRoaXMuYmFzZSkgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuZW50aXR5U2V0ID0gdGhpcy5hcGkuZmluZEVudGl0eVNldEZvckVudGl0eVR5cGUodGhpcy50eXBlKCkpO1xuICAgIGxldCBjb25jdXJyZW5jeUZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5lbnRpdHlTZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uY3VycmVuY3lGaWVsZHMgPVxuICAgICAgICB0aGlzLmVudGl0eVNldC5hbm5vdGF0ZWRWYWx1ZTxzdHJpbmdbXT4oT1BUSU1JU1RJQ19DT05DVVJSRU5DWSkgfHwgW107XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgbGV0IGNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3lGaWVsZHMuaW5kZXhPZihmaWVsZC5maWVsZCkgIT09IC0xO1xuICAgICAgZmllbGQuY29uZmlndXJlKHtcbiAgICAgICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICAgICAgICBjb25jdXJyZW5jeSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZmllbGRzKHtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICBpbmNsdWRlX3BhcmVudHMgPSB0cnVlLFxuICB9OiB7XG4gICAgaW5jbHVkZV9wYXJlbnRzPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICB9ID0ge30pOiBPRGF0YU1vZGVsRmllbGQ8YW55PltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uKGluY2x1ZGVfcGFyZW50cyAmJiB0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5wYXJlbnQuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uLCBpbmNsdWRlX3BhcmVudHMgfSlcbiAgICAgICAgOiBbXSksXG4gICAgICAuLi50aGlzLl9maWVsZHMuZmlsdGVyKFxuICAgICAgICAoZmllbGQpID0+IGluY2x1ZGVfbmF2aWdhdGlvbiB8fCAhZmllbGQubmF2aWdhdGlvblxuICAgICAgKSxcbiAgICBdO1xuICB9XG5cbiAgZmllbGQ8Rj4obmFtZToga2V5b2YgVCB8IHN0cmluZykge1xuICAgIGxldCBmaWVsZCA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICB9KS5maW5kKFxuICAgICAgKG1vZGVsRmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPikgPT5cbiAgICAgICAgbW9kZWxGaWVsZC5uYW1lID09PSBuYW1lIHx8IG1vZGVsRmllbGQuZmllbGQgPT09IG5hbWVcbiAgICApO1xuICAgIC8vVGhyb3cgZXJyb3IgaWYgbm90IGZvdW5kXG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgTm8gZmllbGQgd2l0aCBuYW1lICR7bmFtZX1gKTtcbiAgICByZXR1cm4gZmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPEY+O1xuICB9XG5cbiAgYXR0YWNoPFI+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8Uj5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxSPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Uj5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxSPlxuICApIHtcbiAgICBpZiAoXG4gICAgICBzZWxmLl9yZXNvdXJjZSAhPT0gbnVsbCAmJlxuICAgICAgcmVzb3VyY2UudHlwZSgpICE9PSBzZWxmLl9yZXNvdXJjZS50eXBlKCkgJiZcbiAgICAgICFzZWxmLl9yZXNvdXJjZS5pc1N1YnR5cGVPZihyZXNvdXJjZSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW4ndCBhdHRhY2ggJHtyZXNvdXJjZS50eXBlKCl9IHRvICR7c2VsZi5fcmVzb3VyY2UudHlwZSgpfWBcbiAgICAgICk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gc2VsZi5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgIWN1cnJlbnQuaXNFcXVhbFRvKHJlc291cmNlKSkge1xuICAgICAgc2VsZi5fcmVzb3VyY2UgPSByZXNvdXJjZSBhcyBPRGF0YVJlc291cmNlPGFueT47XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnYXR0YWNoJywge1xuICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICAgIHZhbHVlOiByZXNvdXJjZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8jIHJlZ2lvbiBSZXNvdXJjZVxuICBzdGF0aWMgY2hhaW4oXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj5cbiAgKTogW1xuICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gIF1bXSB7XG4gICAgY29uc3QgY2hhaW4gPSBbXSBhcyBhbnlbXTtcbiAgICBsZXQgdHVwbGU6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgICBdXG4gICAgICB8IG51bGwgPSBbY2hpbGQsIG51bGxdO1xuICAgIHdoaWxlICh0dXBsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyZW50ID0gdHVwbGUgYXMgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICBpZiAoY2hhaW4uc29tZSgocCkgPT4gcFswXSA9PT0gcGFyZW50WzBdKSkgYnJlYWs7XG4gICAgICBjaGFpbi5zcGxpY2UoMCwgMCwgcGFyZW50KTtcbiAgICAgIHR1cGxlID0gdHVwbGVbMF0uX3BhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYWluO1xuICB9XG5cbiAgc3RhdGljIHJlc291cmNlPFQ+KFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+XG4gICk6IE9EYXRhUmVzb3VyY2U8VD4ge1xuICAgIGxldCByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IFttb2RlbCwgZmllbGRdIG9mIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKSkge1xuICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZSB8fCAobW9kZWwuX3Jlc291cmNlIGFzIE9EYXRhUmVzb3VyY2U8VD4pO1xuICAgICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgIGxldCBrZXkgPSAobW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+KS5rZXkoe1xuICAgICAgICAgIGZpZWxkX21hcHBpbmc6IHRydWUsXG4gICAgICAgIH0pIGFzIEVudGl0eUtleTxhbnk+O1xuICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgcmVzb3VyY2UgPVxuICAgICAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlXG4gICAgICAgICAgICAgID8gcmVzb3VyY2UuZW50aXR5KGtleSlcbiAgICAgICAgICAgICAgOiAocmVzb3VyY2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikua2V5KGtleSk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBtb2RlbC5fcmVzb3VyY2U/LmNsb25lUXVlcnk8VD4oKS50b1F1ZXJ5QXJndW1lbnRzKCk7XG4gICAgICAgIGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkICYmIHJlc291cmNlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgcmVzb3VyY2UucXVlcnkoKHEpID0+IHEuYXBwbHkocXVlcnkpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXNvdXJjZSA9IChmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PikucmVzb3VyY2VGYWN0b3J5PGFueSwgYW55PihcbiAgICAgICAgcmVzb3VyY2UgYXMgT0RhdGFSZXNvdXJjZTxhbnk+XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVzb3VyY2U6IENhbid0IGJ1aWxkIHJlc291cmNlIGZvciAke2NoaWxkfWApO1xuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIGNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG4gICAgcXVlcnk/OiBPRGF0YVF1ZXJ5T3B0aW9uczxUPlxuICApOlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmVudGl0eVNldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPRGF0YUVudGl0eVNldFJlc291cmNlLmZhY3Rvcnk8VD4odGhpcy5hcGksIHtcbiAgICAgIHBhdGg6IHRoaXMuZW50aXR5U2V0Lm5hbWUsXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgcXVlcnksXG4gICAgfSk7XG4gIH1cblxuICBtb2RlbFJlc291cmNlRmFjdG9yeShcbiAgICBxdWVyeT86IE9EYXRhUXVlcnlPcHRpb25zPFQ+XG4gICk6XG4gICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkocXVlcnkpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHJldHVybiByZXNvdXJjZS5lbnRpdHkoKTtcbiAgICByZXR1cm4gcmVzb3VyY2UgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGVudGl0eVJlc291cmNlKHNlbGY6IE9EYXRhTW9kZWw8VD4pOiBPRGF0YVJlc291cmNlPFQ+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLm1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgc2VsZi5fcmVzb3VyY2UgIT09IG51bGwgPyBzZWxmLl9yZXNvdXJjZS5jbG9uZVF1ZXJ5KCkgOiB1bmRlZmluZWRcbiAgICApO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbnRpdHlSZXNvdXJjZTogQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yICR7c2VsZn1gKTtcbiAgICBjb25zdCBrZXkgPSBzZWxmLmtleSh7IGZpZWxkX21hcHBpbmc6IHRydWUgfSkgYXMgRW50aXR5S2V5PFQ+O1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHJlc291cmNlLmtleShrZXkpO1xuICAgIHJldHVybiByZXNvdXJjZSBhcyBPRGF0YVJlc291cmNlPFQ+O1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGJpbmQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBwYXJlbnQsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFubm90cyxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgXTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIC8vIFBhcmVudFxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VsZi5fcGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlXG4gICAgaWYgKHNlbGYuX3BhcmVudCA9PT0gbnVsbCAmJiByZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmVzb3VyY2UgPSB0aGlzLm1vZGVsUmVzb3VyY2VGYWN0b3J5KCk7XG4gICAgaWYgKHJlc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXR0YWNoKFxuICAgICAgICBzZWxmLFxuICAgICAgICByZXNvdXJjZSBhc1xuICAgICAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFubm90YXRpb25zXG4gICAgc2VsZi5fYW5ub3RhdGlvbnMgPVxuICAgICAgYW5ub3RzIHx8IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKE9EYXRhSGVscGVyW0RFRkFVTFRfVkVSU0lPTl0pO1xuXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pO1xuICAgIGZvciAobGV0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIGZpZWxkLm5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldChzZWxmLCBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiksXG4gICAgICAgIHNldDogKHZhbHVlOiBhbnkpID0+XG4gICAgICAgICAgdGhpcy5fc2V0KHNlbGYsIGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+LCB2YWx1ZSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBxdWVyeShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD4sXG4gICAgZnVuYzogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPikgPT4gdm9pZFxuICApIHtcbiAgICByZXNvdXJjZS5xdWVyeShmdW5jKTtcbiAgICB0aGlzLmF0dGFjaChzZWxmLCByZXNvdXJjZSk7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICByZXNvbHZlS2V5KFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fVxuICApOiBFbnRpdHlLZXk8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5VHlwZXMgPSB0aGlzLnNjaGVtYS5rZXlzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGtleTogYW55ID0ge307XG4gICAgZm9yICh2YXIga3Qgb2Yga2V5VHlwZXMpIHtcbiAgICAgIGxldCB2ID0gdmFsdWUgYXMgYW55O1xuICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gICAgICBsZXQgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChsZXQgbmFtZSBvZiBrdC5uYW1lLnNwbGl0KCcvJykpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgIGZpZWxkID0gb3B0aW9uc1xuICAgICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgICAuZmluZCgoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdiA9XG4gICAgICAgICAgICBUeXBlcy5pc1BsYWluT2JqZWN0KHYpIHx8IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodilcbiAgICAgICAgICAgICAgPyB2W2ZpZWxkLm5hbWVdXG4gICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICBvcHRpb25zID0gZmllbGQubWV0YSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGZpZWxkLmZpZWxkIDogZmllbGQubmFtZTtcbiAgICAgIGlmIChrdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSBuYW1lID0ga3QuYWxpYXM7XG4gICAgICBrZXlbbmFtZV0gPSB2O1xuICAgIH1cbiAgICBpZiAoVHlwZXMuaXNFbXB0eShrZXkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlID8gT2JqZWN0cy5yZXNvbHZlS2V5KGtleSkgOiBrZXk7XG4gIH1cblxuICByZXNvbHZlUmVmZXJlbnRpYWwoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsLFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZmVyZW50aWFsOiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciByZWYgb2YgZmllbGQucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pLmZpbmQoXG4gICAgICAgIChwOiBhbnkpID0+IHAuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHlcbiAgICAgICk7XG4gICAgICBsZXQgdG8gPSBmaWVsZC5vcHRpb25zXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IHJlZi5wcm9wZXJ0eSk7XG4gICAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gdG8uZmllbGQgOiB0by5uYW1lO1xuICAgICAgICByZWZlcmVudGlhbFtuYW1lXSA9IHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KHJlZmVyZW50aWFsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbnRpYWwsIHsgc2luZ2xlOiBmYWxzZSB9KVxuICAgICAgOiByZWZlcmVudGlhbDtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVuY2VkKFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWZlcmVuY2VkOiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciByZWYgb2YgZmllbGQucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pLmZpbmQoXG4gICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSByZWYucHJvcGVydHlcbiAgICAgICk7XG4gICAgICBsZXQgdG8gPSAoZmllbGQubWV0YSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+KVxuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5maW5kKFxuICAgICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+XG4gICAgICAgICAgICBmaWVsZC5maWVsZCA9PT0gcmVmLnJlZmVyZW5jZWRQcm9wZXJ0eVxuICAgICAgICApO1xuICAgICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IHRvLmZpZWxkIDogdG8ubmFtZTtcbiAgICAgICAgcmVmZXJlbmNlZFtuYW1lXSA9IHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KHJlZmVyZW5jZWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlXG4gICAgICA/IE9iamVjdHMucmVzb2x2ZUtleShyZWZlcmVuY2VkLCB7IHNpbmdsZTogZmFsc2UgfSlcbiAgICAgIDogcmVmZXJlbmNlZDtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IG5hdmlnYXRpb24sXG4gICAgfSkucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSAoc2VsZiBhcyBhbnkpW2ZpZWxkLm5hbWVdO1xuICAgICAgbGV0IGVycnMgPSBmaWVsZC52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QgfSk7XG4gICAgICByZXR1cm4gZXJycyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2ZpZWxkLm5hbWVdOiBlcnJzIH0pXG4gICAgICAgIDogYWNjO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlZmF1bHRzKCk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGVmcyA9IHRoaXMuZmllbGRzKCkucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBmaWVsZC5kZWZhdWx0cygpO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IHZhbHVlIH0pXG4gICAgICAgIDogYWNjO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZGVmcykgPyBkZWZzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaGFzQ2hhbmdlZChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHsgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UgfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIVR5cGVzLmlzRW1wdHkoc2VsZi5fY2hhbmdlcykgfHxcbiAgICAgIE9iamVjdC52YWx1ZXMoc2VsZi5fcmVsYXRpb25zKVxuICAgICAgICAuZmlsdGVyKCh7IGZpZWxkIH0pID0+ICFmaWVsZC5uYXZpZ2F0aW9uIHx8IGluY2x1ZGVfbmF2aWdhdGlvbilcbiAgICAgICAgLnNvbWUoXG4gICAgICAgICAgKHsgZmllbGQsIHN0YXRlLCBtb2RlbCB9KSA9PlxuICAgICAgICAgICAgKCFpbmNsdWRlX25hdmlnYXRpb24gfHwgZmllbGQubmF2aWdhdGlvbikgJiZcbiAgICAgICAgICAgIChzdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQgfHxcbiAgICAgICAgICAgICAgKG1vZGVsICE9IHVuZGVmaW5lZCAmJiBtb2RlbC5oYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pKSlcbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICBhc0VudGl0eTxSLCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj4oc2VsZjogTSwgZnVuYzogKG1vZGVsOiBNKSA9PiBSKTogUiB7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcXVlcnkgPSBzZWxmLnJlc291cmNlKCkuY2xvbmVRdWVyeTxUPigpO1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3RvcnkocXVlcnkpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBkb2VzIG5vdCBoYXZlIGFzc29jaWF0ZWQgRW50aXR5IGVuZHBvaW50Jyk7XG4gICAgLy8gU3RvcmUgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIGNvbnN0IHN0b3JlID0geyBwYXJlbnQ6IHNlbGYuX3BhcmVudCwgcmVzb3VyY2U6IHNlbGYuX3Jlc291cmNlIH07XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgc2VsZi5fcGFyZW50ID0gbnVsbDtcbiAgICBzZWxmLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgIC8vIEV4ZWN1dGUgZnVuY3Rpb25cbiAgICBjb25zdCByZXN1bHQgPSBmdW5jKHNlbGYpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICByZXR1cm4gKHJlc3VsdCBhcyBhbnkpLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAvLyBSZXN0b3JlIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICAgICAgICBzZWxmLl9wYXJlbnQgPSBzdG9yZS5wYXJlbnQ7XG4gICAgICAgICAgc2VsZi5fcmVzb3VyY2UgPSBzdG9yZS5yZXNvdXJjZTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc3RvcmUgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgICAgc2VsZi5fcGFyZW50ID0gc3RvcmUucGFyZW50O1xuICAgICAgc2VsZi5fcmVzb3VyY2UgPSBzdG9yZS5yZXNvdXJjZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgdG9FbnRpdHkoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgY2hhaW4gPSBbXSxcbiAgICB9OiB7XG4gICAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICAgIH0gPSB7fVxuICApOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGxldCBhdHRycyA9IHNlbGYuYXR0cmlidXRlcyh7XG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICB9KTtcblxuICAgIGxldCByZWxhdGlvbnMgPSBPYmplY3QuZW50cmllcyhzZWxmLl9yZWxhdGlvbnMpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAvLyBDaGFpblxuICAgICAgICAoWywgeyBtb2RlbCB9XSkgPT4gY2hhaW4uZXZlcnkoKGMpID0+IGMgIT09IG1vZGVsKVxuICAgICAgKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgLy8gQ2hhbmdlcyBvbmx5XG4gICAgICAgIChbLCB7IG1vZGVsLCBzdGF0ZSB9XSkgPT5cbiAgICAgICAgICAhY2hhbmdlc19vbmx5IHx8XG4gICAgICAgICAgKGNoYW5nZXNfb25seSAmJlxuICAgICAgICAgICAgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZCB8fFxuICAgICAgICAgICAgICAobW9kZWwgIT0gdW5kZWZpbmVkICYmIG1vZGVsLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpKSlcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCB7IGZpZWxkLCBtb2RlbCB9XSkgPT5cbiAgICAgICAgICAvLyBOYXZpZ2F0aW9uXG4gICAgICAgICAgKGluY2x1ZGVfbmF2aWdhdGlvbiAmJiBmaWVsZC5uYXZpZ2F0aW9uICYmIG1vZGVsICE9PSBudWxsKSB8fFxuICAgICAgICAgICFmaWVsZC5uYXZpZ2F0aW9uXG4gICAgICApXG4gICAgICAubWFwKChbaywgeyBtb2RlbCwgZmllbGQsIHN0YXRlIH1dKSA9PiB7XG4gICAgICAgIGxldCBjaGFuZ2VzT25seSA9XG4gICAgICAgICAgY2hhbmdlc19vbmx5ICYmXG4gICAgICAgICAgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkICYmXG4gICAgICAgICAgISFmaWVsZC5uYXZpZ2F0aW9uO1xuICAgICAgICBsZXQgaW5jbHVkZUtleSA9IGluY2x1ZGVfa2V5ICYmICEhZmllbGQubmF2aWdhdGlvbjtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGssXG4gICAgICAgICAgICAobW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+KS50b0VudGl0eSh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVLZXksXG4gICAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24obW9kZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGssXG4gICAgICAgICAgICAobW9kZWwgYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PikudG9FbnRpdGllcyh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVLZXksXG4gICAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2ssIG1vZGVsXTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlKChhY2MsIFtrLCB2XSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZ1xuICAgICAgICAgID8gdGhpcy5maWVsZHMoKS5maW5kKFxuICAgICAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5uYW1lID09PSBrXG4gICAgICAgICAgICApPy5maWVsZCB8fCBrXG4gICAgICAgICAgOiBrO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2IH0pO1xuICAgICAgfSwge30pO1xuXG4gICAgLy8gQ3JlYXRlIGVudGl0eVxuICAgIGxldCBlbnRpdHkgPSB7IC4uLmF0dHJzLCAuLi5yZWxhdGlvbnMgfTtcblxuICAgIC8vIEFkZCBjbGllbnRfaWRcbiAgICBpZiAoY2xpZW50X2lkKSB7XG4gICAgICAoPGFueT5lbnRpdHkpW3RoaXMuY2lkXSA9ICg8YW55PnNlbGYpW3RoaXMuY2lkXTtcbiAgICB9XG5cbiAgICAvLyBBZGQga2V5XG4gICAgaWYgKGluY2x1ZGVfa2V5KSB7XG4gICAgICBlbnRpdHkgPSB7XG4gICAgICAgIC4uLmVudGl0eSxcbiAgICAgICAgLi4uKHRoaXMucmVzb2x2ZUtleShzZWxmLCB7IGZpZWxkX21hcHBpbmcsIHJlc29sdmU6IGZhbHNlIH0pIGFzIHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQWRkIHR5cGVcbiAgICBpZiAoXG4gICAgICBzZWxmLl9wYXJlbnQgIT09IG51bGwgJiZcbiAgICAgICgoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChzZWxmLl9wYXJlbnRbMF0pICYmXG4gICAgICAgIChzZWxmLl9wYXJlbnRbMV0gYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4pLm1ldGEgIT09IHNlbGYuX21ldGEpIHx8XG4gICAgICAgIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oc2VsZi5fcGFyZW50WzBdKSAmJlxuICAgICAgICAgIChzZWxmLl9wYXJlbnRbMF0gYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PikuX21vZGVsXG4gICAgICAgICAgICAubWV0YSAhPT0gc2VsZi5fbWV0YSkpXG4gICAgKSB7XG4gICAgICB0aGlzLmFwaS5vcHRpb25zLmhlbHBlci50eXBlKGVudGl0eSwgdGhpcy5zY2hlbWEudHlwZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgYXR0cmlidXRlcyhcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgLy8gQXR0cmlidXRlcyBieSBmaWVsZHMgKGF0dHJpYnV0ZXMgZm9yIHRoZSBtb2RlbCB0eXBlKVxuICAgIGNvbnN0IGZpZWxkQXR0cnMgPSB0aGlzLmZpZWxkcygpLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICBjb25zdCBpc0NoYW5nZWQgPSBmLm5hbWUgaW4gc2VsZi5fY2hhbmdlcztcbiAgICAgIGNvbnN0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gZi5maWVsZCA6IGYubmFtZTtcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gZi5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGlzQ2hhbmdlZFxuICAgICAgICA/IHNlbGYuX2NoYW5nZXNbZi5uYW1lXVxuICAgICAgICA6IHNlbGYuX2F0dHJpYnV0ZXNbZi5uYW1lXTtcbiAgICAgIGlmIChmLmNvbmN1cnJlbmN5ICYmIGluY2x1ZGVfY29uY3VycmVuY3kpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNvbXB1dGVkICYmIGluY2x1ZGVfY29tcHV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNfb25seSAmJiBpc0NoYW5nZWQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKCFjaGFuZ2VzX29ubHkgJiYgIWYuY29uY3VycmVuY3kgJiYgIWNvbXB1dGVkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICB9LCB7fSk7XG4gICAgaWYgKCFpbmNsdWRlX25vbl9maWVsZCkgcmV0dXJuIGZpZWxkQXR0cnM7XG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhmaWVsZEF0dHJzKTtcbiAgICAvLyBBdHRyaWJ1dGVzIGZyb20gb2JqZWN0IChhdHRyaWJ1dGVzIGZvciBvYmplY3QpXG4gICAgY29uc3Qgbm9uRmllbGRBdHRycyA9IE9iamVjdC5lbnRyaWVzKHNlbGYpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoW2tdKSA9PlxuICAgICAgICAgIG5hbWVzLmluZGV4T2YoaykgPT09IC0xICYmICFrLnN0YXJ0c1dpdGgoJ18nKSAmJiAhay5lbmRzV2l0aCgnJCcpXG4gICAgICApXG4gICAgICAucmVkdWNlKChhY2MsIFtrLCB2XSkgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2tdOiB2IH0pLCB7fSk7XG4gICAgcmV0dXJuIHsgLi4uZmllbGRBdHRycywgLi4ubm9uRmllbGRBdHRycyB9O1xuICB9XG5cbiAgcmVzZXQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7IG5hbWUsIHNpbGVudCA9IGZhbHNlIH06IHsgbmFtZT86IHN0cmluZzsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgaWYgKCFUeXBlcy5pc0VtcHR5KG5hbWUpICYmIChuYW1lIGFzIHN0cmluZykgaW4gc2VsZi5fY2hhbmdlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBzZWxmLl9hdHRyaWJ1dGVzW25hbWUgYXMgc3RyaW5nXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gc2VsZi5fY2hhbmdlc1tuYW1lIGFzIHN0cmluZ107XG4gICAgICBkZWxldGUgc2VsZi5fY2hhbmdlc1tuYW1lIGFzIHN0cmluZ107XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICAgIHRyYWNrOiBuYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBwcmV2aW91cyxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNFbXB0eShuYW1lKSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHNlbGYuX2NoYW5nZXMpO1xuICAgICAgc2VsZi5fY2hhbmdlcyA9IHt9O1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgICAgICB0cmFjazogZW50cnlbMF0sXG4gICAgICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5fYXR0cmlidXRlc1tlbnRyeVswXV0sXG4gICAgICAgICAgICAgIHByZXZpb3VzOiBlbnRyeVsxXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZW50aXR5OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7IHJlc2V0PzogYm9vbGVhbjsgcmVwYXJlbnQ/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICBzZWxmLl9yZXNldCA9IHJlc2V0O1xuICAgIHNlbGYuX3JlcGFyZW50ID0gcmVwYXJlbnQ7XG4gICAgc2VsZi5fc2lsZW50ID0gc2lsZW50O1xuXG4gICAgY29uc3QgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFwcGx5IGVudGl0eVxuICAgIGNvbnN0IG1vZGVsID0gc2VsZiBhcyBhbnk7XG4gICAgT2JqZWN0LmVudHJpZXMoZW50aXR5KVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSAvLyBGaWx0ZXIgdW5kZWZpbmVkXG4gICAgICAuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMoe1xuICAgICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICAgIH0pLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT5cbiAgICAgICAgICAgIChzZWxmLl9yZXNldCAmJiBmaWVsZC5maWVsZCA9PT0ga2V5KSB8fCBmaWVsZC5uYW1lID09PSBrZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIERlbGVnYXRlZCB0byBwcml2YXRlIHNldHRlclxuICAgICAgICAgIGlmICh0aGlzLl9zZXQoc2VsZiwgZmllbGQsIHZhbHVlKSkge1xuICAgICAgICAgICAgY2hhbmdlcy5wdXNoKGZpZWxkLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBCYXNpYyBhc3NpZ25tZW50XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG1vZGVsW2tleV07XG4gICAgICAgICAgbW9kZWxba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSB2YWx1ZSkgY2hhbmdlcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKCghc2VsZi5fc2lsZW50ICYmIGNoYW5nZXMubGVuZ3RoID4gMCkgfHwgc2VsZi5fcmVzZXQpIHtcbiAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KHNlbGYuX3Jlc2V0ID8gJ3Jlc2V0JyA6ICd1cGRhdGUnLCB7XG4gICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgb3B0aW9uczogeyBjaGFuZ2VzIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBzZWxmLl9yZXNldCA9IGZhbHNlO1xuICAgIHNlbGYuX3JlcGFyZW50ID0gZmFsc2U7XG4gICAgc2VsZi5fc2lsZW50ID0gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgaXNNb2RlbChvYmo6IGFueSkge1xuICAgIHJldHVybiBUeXBlcy5yYXdUeXBlKG9iaikgPT09ICdNb2RlbCc7XG4gIH1cblxuICBzdGF0aWMgaXNDb2xsZWN0aW9uKG9iajogYW55KSB7XG4gICAgcmV0dXJuIFR5cGVzLnJhd1R5cGUob2JqKSA9PT0gJ0NvbGxlY3Rpb24nO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2xsZWN0aW9uPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICBjb2xsZWN0aW9uOiBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4sXG4gICAgdmFsdWU6IFRbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgKSB7XG4gICAgY29sbGVjdGlvbi5fYW5ub3RhdGlvbnMgPSBmaWVsZC5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICBzZWxmLmFubm90cygpXG4gICAgKSBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM7XG4gICAgY29sbGVjdGlvbi5hc3NpZ24odmFsdWUgYXMgVFtdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSwge1xuICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0LFxuICAgICAgcmVwYXJlbnQ6IHNlbGYuX3JlcGFyZW50LFxuICAgICAgc2lsZW50OiBzZWxmLl9zaWxlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uaGFzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlTW9kZWw8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPEY+LFxuICAgIHZhbHVlOiBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgKSB7XG4gICAgbW9kZWwuX2Fubm90YXRpb25zID0gZmllbGQuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgc2VsZi5hbm5vdHMoKVxuICAgICkgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucztcbiAgICBtb2RlbC5hc3NpZ24odmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICByZXNldDogc2VsZi5fcmVzZXQsXG4gICAgICByZXBhcmVudDogc2VsZi5fcmVwYXJlbnQsXG4gICAgICBzaWxlbnQ6IHNlbGYuX3NpbGVudCxcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kZWwuaGFzQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0PEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPlxuICApOiBGIHwgT0RhdGFNb2RlbDxGPiB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PiB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkpIHtcbiAgICAgIHJldHVybiBzZWxmLl9yZWxhdGlvbnNbZmllbGQubmFtZV0/Lm1vZGVsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzKHNlbGYsIHtcbiAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZV9jb21wdXRlZDogdHJ1ZSxcbiAgICAgIH0pW2ZpZWxkLm5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFN0cnVjdHVyZWQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAvLyBFbnN1cmVzIHRoYXQgdGhlIHJlbGF0aW9uIGV4aXN0c1xuICAgIGlmICghKGZpZWxkLm5hbWUgaW4gc2VsZi5fcmVsYXRpb25zKSkge1xuICAgICAgc2VsZi5fcmVsYXRpb25zW2ZpZWxkLm5hbWVdID0ge1xuICAgICAgICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCxcbiAgICAgICAgZmllbGQ6IGZpZWxkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbiA9IHNlbGYuX3JlbGF0aW9uc1tmaWVsZC5uYW1lXTtcbiAgICBjb25zdCBjdXJyZW50TW9kZWwgPSByZWxhdGlvbi5tb2RlbDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmVsYXRpb24ubW9kZWwgPSB2YWx1ZSBhcyBudWxsO1xuICAgICAgY2hhbmdlZCA9IGN1cnJlbnRNb2RlbCAhPT0gdmFsdWU7XG4gICAgICB0aGlzLl91bnN1YnNjcmliZShzZWxmLCByZWxhdGlvbik7XG4gICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oY3VycmVudE1vZGVsKSkge1xuICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChjdXJyZW50TW9kZWwgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+KS5lcXVhbHMoXG4gICAgICAgICAgICB2YWx1ZSBhcyBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj5cbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZShzZWxmLCByZWxhdGlvbik7XG4gICAgICAgIHJlbGF0aW9uLm1vZGVsID0gdmFsdWUgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+O1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoc2VsZiwgcmVsYXRpb24pO1xuICAgICAgICBpZiAoc2VsZi5fcmVwYXJlbnQpIHJlbGF0aW9uLm1vZGVsLl9wYXJlbnQgPSBbc2VsZiwgZmllbGRdO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRoaXMudXBkYXRlQ29sbGVjdGlvbjxGPihcbiAgICAgICAgICBzZWxmLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGN1cnJlbnRNb2RlbCBhcyBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4sXG4gICAgICAgICAgdmFsdWUgYXMgVFtdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChjdXJyZW50TW9kZWwpKSB7XG4gICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKChjdXJyZW50TW9kZWwgYXMgT0RhdGFNb2RlbDxGPikuZXF1YWxzKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4pKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlKHNlbGYsIHJlbGF0aW9uKTtcbiAgICAgICAgcmVsYXRpb24ubW9kZWwgPSB2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+O1xuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoc2VsZiwgcmVsYXRpb24pO1xuICAgICAgICBpZiAoc2VsZi5fcmVwYXJlbnQpIHJlbGF0aW9uLm1vZGVsLl9wYXJlbnQgPSBbc2VsZiwgZmllbGRdO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRoaXMudXBkYXRlTW9kZWw8Rj4oXG4gICAgICAgICAgc2VsZixcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBjdXJyZW50TW9kZWwgYXMgT0RhdGFNb2RlbDxGPixcbiAgICAgICAgICB2YWx1ZSBhcyBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVsYXRpb24ubW9kZWwgPVxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpIHx8XG4gICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpXG4gICAgICAgICAgPyAodmFsdWUgYXMgT0RhdGFNb2RlbDxGPiB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PilcbiAgICAgICAgICA6IGZpZWxkLm1vZGVsQ29sbGVjdGlvbkZhY3Rvcnk8VCwgRj4oe1xuICAgICAgICAgICAgICBwYXJlbnQ6IHNlbGYsXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0LFxuICAgICAgICAgICAgfSk7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3N1YnNjcmliZShzZWxmLCByZWxhdGlvbik7XG4gICAgICBpZiAoc2VsZi5fcmVwYXJlbnQpIHJlbGF0aW9uLm1vZGVsLl9wYXJlbnQgPSBbc2VsZiwgZmllbGRdO1xuICAgIH1cbiAgICBpZiAoIU9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihyZWxhdGlvbi5tb2RlbCkpIHtcbiAgICAgIHZhciByZWYgPSBmaWVsZC5tZXRhPy5yZXNvbHZlUmVmZXJlbnRpYWwocmVsYXRpb24ubW9kZWwsIGZpZWxkKTtcbiAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWYpLmZvckVhY2goKFtrLCB2XSkgPT5cbiAgICAgICAgICB0aGlzLl9zZXRWYWx1ZShzZWxmLCBrLCB2LCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVsYXRpb24uc3RhdGUgPVxuICAgICAgc2VsZi5fcmVzZXQgfHwgIWNoYW5nZWRcbiAgICAgICAgPyBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkXG4gICAgICAgIDogT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQ7XG4gICAgaWYgKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlZCkge1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICB0cmFjazogZmllbGQubmFtZSxcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICB2YWx1ZTogcmVsYXRpb24ubW9kZWwsXG4gICAgICAgICAgcHJldmlvdXM6IGN1cnJlbnRNb2RlbCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0VmFsdWU8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogc3RyaW5nLFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGwsXG4gICAga2V5PzogYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGF0dHJzID0gdGhpcy5hdHRyaWJ1dGVzKHNlbGYsIHtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGF0dHJzW2ZpZWxkXTtcbiAgICBjaGFuZ2VkID0gIVR5cGVzLmlzRXF1YWwoY3VycmVudFZhbHVlLCB2YWx1ZSk7XG4gICAgaWYgKHNlbGYuX3Jlc2V0KSB7XG4gICAgICBkZWxldGUgc2VsZi5fY2hhbmdlc1tmaWVsZF07XG4gICAgICBzZWxmLl9hdHRyaWJ1dGVzW2ZpZWxkXSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNFcXVhbCh2YWx1ZSwgc2VsZi5fYXR0cmlidXRlc1tmaWVsZF0pKSB7XG4gICAgICBkZWxldGUgc2VsZi5fY2hhbmdlc1tmaWVsZF07XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VkKSB7XG4gICAgICBzZWxmLl9jaGFuZ2VzW2ZpZWxkXSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAoIXNlbGYuX3NpbGVudCAmJiBjaGFuZ2VkKSB7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgIHRyYWNrOiBmaWVsZCxcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudFZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHsga2V5IH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgdmFsdWU6XG4gICAgICB8IEZcbiAgICAgIHwgRltdXG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgIHwgT0RhdGFNb2RlbDxGPlxuICAgICAgfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj5cbiAgICAgIHwgbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICA/IHRoaXMuX3NldFN0cnVjdHVyZWQoc2VsZiwgZmllbGQsIHZhbHVlKVxuICAgICAgOiB0aGlzLl9zZXRWYWx1ZShzZWxmLCBmaWVsZC5uYW1lLCB2YWx1ZSwgZmllbGQuaXNLZXkoKSk7XG4gIH1cblxuICBwcml2YXRlIF91bnN1YnNjcmliZTxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlbGF0aW9uOiBPRGF0YU1vZGVsUmVsYXRpb248Rj5cbiAgKSB7XG4gICAgaWYgKHJlbGF0aW9uLnN1YnNjcmlwdGlvbikge1xuICAgICAgcmVsYXRpb24uc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICBkZWxldGUgcmVsYXRpb24uc3Vic2NyaXB0aW9uO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9zdWJzY3JpYmU8Rj4oc2VsZjogT0RhdGFNb2RlbDxUPiwgcmVsYXRpb246IE9EYXRhTW9kZWxSZWxhdGlvbjxGPikge1xuICAgIGlmIChyZWxhdGlvbi5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3Vic2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgfVxuICAgIGlmIChyZWxhdGlvbi5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YnNjcmlwdGlvbiBtb2RlbCBpcyBudWxsJyk7XG4gICAgfVxuICAgIHJlbGF0aW9uLnN1YnNjcmlwdGlvbiA9IHJlbGF0aW9uLm1vZGVsLmV2ZW50cyQuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8YW55PikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgQlVCQkxJTkcuaW5kZXhPZihldmVudC5uYW1lKSAhPT0gLTEgJiZcbiAgICAgICAgICBldmVudC5idWJibGluZyAmJlxuICAgICAgICAgICFldmVudC52aXNpdGVkKHNlbGYpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChldmVudC5tb2RlbCA9PT0gcmVsYXRpb24ubW9kZWwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXZlbnQubmFtZSA9PT0gJ2NoYW5nZScgJiZcbiAgICAgICAgICAgICAgcmVsYXRpb24uZmllbGQubmF2aWdhdGlvbiAmJlxuICAgICAgICAgICAgICBldmVudC5vcHRpb25zPy5rZXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2YXIgcmVmID0gKHJlbGF0aW9uLm1vZGVsIGFzIE9EYXRhTW9kZWw8YW55PikucmVmZXJlbnRpYWwoXG4gICAgICAgICAgICAgICAgcmVsYXRpb24uZmllbGRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVmKS5mb3JFYWNoKChbaywgdl0pID0+XG4gICAgICAgICAgICAgICAgICB0aGlzLl9zZXRWYWx1ZShzZWxmLCBrLCB2LCBmYWxzZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHVzaChzZWxmLCByZWxhdGlvbi5maWVsZC5uYW1lKTtcbiAgICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iXX0=
1033
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsK0JBQStCLEVBQy9CLHFCQUFxQixHQUt0QixNQUFNLGNBQWMsQ0FBQztBQU90QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQWUxQyxNQUFNLE9BQU8sZUFBZTtJQU0xQixZQUNFLElBQXlCLEVBQ3pCLEVBQ0UsS0FBSyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxPQUFPLE1BUUwsRUFBRTtRQWtCUixhQUFRLEdBQVksSUFBSSxDQUFDO1FBaEJ2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHO1lBQ1g7Z0JB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UUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBFLFFBQVEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUN0RCxDQUFDLEtBQTJCLEVBQUUsRUFBRTtZQUM5QixJQUNFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsS0FBSyxDQUFDLFFBQVE7Z0JBQ2QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUNwQjtnQkFDQSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEtBQUssRUFBRTtvQkFDbEMsSUFDRSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7d0JBQ3ZCLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVTt3QkFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQ2xCO3dCQUNBLElBQUksR0FBRyxHQUFJLFFBQVEsQ0FBQyxLQUF5QixDQUFDLFdBQVcsQ0FDdkQsUUFBUSxDQUFDLEtBQUssQ0FDZixDQUFDO3dCQUNGLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFOzRCQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzt5QkFDMUI7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDckQ7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDSURfRklFTERfTkFNRSxcbiAgQ09NUFVURUQsXG4gIERFRkFVTFRfVkVSU0lPTixcbiAgT1BUSU1JU1RJQ19DT05DVVJSRU5DWSxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUXVlcnlPcHRpb25zLFxuICBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXIsXG4gIE9EYXRhUmVzb3VyY2UsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0eVNldCxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZSxcbiAgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyLFxufSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFR5cGVzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5cbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxFdmVudFR5cGUgPVxuICB8ICdjaGFuZ2UnXG4gIHwgJ3Jlc2V0J1xuICB8ICd1cGRhdGUnXG4gIHwgJ2Rlc3Ryb3knXG4gIHwgJ2FkZCdcbiAgfCAncmVtb3ZlJ1xuICB8ICdpbnZhbGlkJ1xuICB8ICdyZXF1ZXN0J1xuICB8ICdzeW5jJ1xuICB8ICdhdHRhY2gnO1xuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxFdmVudDxUPiB7XG4gIG5hbWU6IE9EYXRhTW9kZWxFdmVudFR5cGU7XG4gIHZhbHVlPzogYW55O1xuICBwcmV2aW91cz86IGFueTtcbiAgb3B0aW9ucz86IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBPRGF0YU1vZGVsRXZlbnRUeXBlLFxuICAgIHtcbiAgICAgIG1vZGVsLFxuICAgICAgY29sbGVjdGlvbixcbiAgICAgIHByZXZpb3VzLFxuICAgICAgdmFsdWUsXG4gICAgICBmaWVsZCxcbiAgICAgIG9wdGlvbnMsXG4gICAgfToge1xuICAgICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgICAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcbiAgICAgIGZpZWxkPzogT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudW1iZXI7XG4gICAgICBwcmV2aW91cz86IGFueTtcbiAgICAgIHZhbHVlPzogYW55O1xuICAgICAgb3B0aW9ucz86IGFueTtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcbiAgICB0aGlzLnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5jaGFpbiA9IFtcbiAgICAgIFtcbiAgICAgICAgKHRoaXMuY29sbGVjdGlvbiB8fCB0aGlzLm1vZGVsKSBhc1xuICAgICAgICAgIHwgT0RhdGFNb2RlbDxhbnk+XG4gICAgICAgICAgfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBmaWVsZCB8fCBudWxsLFxuICAgICAgXSxcbiAgICBdO1xuICB9XG5cbiAgYnViYmxpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5idWJibGluZyA9IGZhbHNlO1xuICB9XG5cbiAgY2hhaW46IFtcbiAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVtYmVyIHwgbnVsbFxuICBdW107XG4gIHB1c2goXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVtYmVyXG4gICkge1xuICAgIGxldCBldmVudCA9IG5ldyBPRGF0YU1vZGVsRXZlbnQodGhpcy5uYW1lLCB7XG4gICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgIGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbixcbiAgICAgIHByZXZpb3VzOiB0aGlzLnByZXZpb3VzLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgZXZlbnQuY2hhaW4gPSBbLi4udGhpcy5jaGFpbl07XG4gICAgZXZlbnQuY2hhaW4uc3BsaWNlKDAsIDAsIFttb2RlbCwgZmllbGRdKTtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cbiAgdmlzaXRlZChtb2RlbDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+Pikge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNoYWluLnNvbWUoKGMpID0+IGNbMF0gPT09IG1vZGVsKSAmJlxuICAgICAgdGhpcy5jaGFpblt0aGlzLmNoYWluLmxlbmd0aCAtIDFdWzBdICE9PSBtb2RlbFxuICAgICk7XG4gIH1cblxuICBnZXQgcGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFpblxuICAgICAgLm1hcCgoWywgZmllbGRdLCBpbmRleCkgPT5cbiAgICAgICAgdHlwZW9mIGZpZWxkID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gYFske2ZpZWxkfV1gXG4gICAgICAgICAgOiBmaWVsZCBpbnN0YW5jZW9mIE9EYXRhTW9kZWxGaWVsZFxuICAgICAgICAgID8gaW5kZXggPT09IDBcbiAgICAgICAgICAgID8gZmllbGQubmFtZVxuICAgICAgICAgICAgOiBgLiR7ZmllbGQubmFtZX1gXG4gICAgICAgICAgOiAnJ1xuICAgICAgKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG5cbiAgLy9SZWZlcmVuY2UgdG8gdGhlIG1vZGVsIHdoaWNoIHRoZSBldmVudCB3YXMgZGlzcGF0Y2hlZFxuICBtb2RlbD86IE9EYXRhTW9kZWw8VD47XG4gIC8vSWRlbnRpZmllcyB0aGUgY3VycmVudCBtb2RlbCBmb3IgdGhlIGV2ZW50XG4gIGdldCBjdXJyZW50TW9kZWwoKTogT0RhdGFNb2RlbDxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsaW5rID0gdGhpcy5jaGFpbi5maW5kKChjKSA9PiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGNbMF0pKTtcbiAgICByZXR1cm4gbGluayAhPT0gdW5kZWZpbmVkID8gKGxpbmtbMF0gYXMgT0RhdGFNb2RlbDxhbnk+KSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vUmVmZXJlbmNlIHRvIHRoZSBjb2xsZWN0aW9uIHdoaWNoIHRoZSBldmVudCB3YXMgZGlzcGF0Y2hlZFxuICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuICAvL0lkZW50aWZpZXMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBmb3IgdGhlIGV2ZW50XG4gIGdldCBjdXJyZW50Q29sbGVjdGlvbigpOiBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsaW5rID0gdGhpcy5jaGFpbi5maW5kKChjKSA9PiBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oY1swXSkpO1xuICAgIHJldHVybiBsaW5rICE9PSB1bmRlZmluZWRcbiAgICAgID8gKGxpbmtbMF0gYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBCVUJCTElORyA9IFtcbiAgJ2NoYW5nZScsXG4gICdyZXNldCcsXG4gICd1cGRhdGUnLFxuICAnZGVzdHJveScsXG4gICdhZGQnLFxuICAncmVtb3ZlJyxcbl07XG5cbmV4cG9ydCBjb25zdCBJTkNMVURFX1NIQUxMT1cgPSB7XG4gIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gIGluY2x1ZGVfY29tcHV0ZWQ6IHRydWUsXG4gIGluY2x1ZGVfa2V5OiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IElOQ0xVREVfREVFUCA9IHtcbiAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICBpbmNsdWRlX25vbl9maWVsZDogdHJ1ZSxcbiAgLi4uSU5DTFVERV9TSEFMTE9XLFxufTtcblxuZXhwb3J0IGVudW0gT0RhdGFNb2RlbFN0YXRlIHtcbiAgQWRkZWQsXG4gIFJlbW92ZWQsXG4gIENoYW5nZWQsXG4gIFVuY2hhbmdlZCxcbn1cblxuZXhwb3J0IHR5cGUgTW9kZWxPcHRpb25zID0ge1xuICBjaWQ/OiBzdHJpbmc7XG4gIGZpZWxkczogeyBbbmFtZTogc3RyaW5nXTogTW9kZWxGaWVsZE9wdGlvbnMgfTtcbn07XG5cbmV4cG9ydCB0eXBlIE1vZGVsRmllbGRPcHRpb25zID0ge1xuICBmaWVsZD86IHN0cmluZztcbiAgZGVmYXVsdD86IGFueTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBjb25jdXJyZW5jeT86IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgbWluTGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbCh7IGNpZCA9IENJRF9GSUVMRF9OQU1FIH06IHsgY2lkPzogc3RyaW5nIH0gPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyB7IG5ldyAoLi4uYXJnczogYW55W10pOiB7fSB9Pihjb25zdHJ1Y3RvcjogVCkgPT4ge1xuICAgIGNvbnN0IEtsYXNzID0gPGFueT5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0geyBmaWVsZHM6IHt9IH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIEtsYXNzLm9wdGlvbnMuY2lkID0gY2lkO1xuICAgIHJldHVybiBjb25zdHJ1Y3RvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsRmllbGQoe1xuICBuYW1lLFxuICAuLi5vcHRpb25zXG59OiB7IG5hbWU/OiBzdHJpbmcgfSAmIE1vZGVsRmllbGRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBjb25zdCBLbGFzcyA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoIUtsYXNzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpXG4gICAgICBLbGFzcy5vcHRpb25zID0geyBmaWVsZHM6IHt9IH0gYXMgTW9kZWxPcHRpb25zO1xuICAgIG9wdGlvbnMuZmllbGQgPSBuYW1lIHx8IGtleTtcbiAgICBLbGFzcy5vcHRpb25zLmZpZWxkc1trZXldID0gb3B0aW9ucztcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPiA9IE1vZGVsRmllbGRPcHRpb25zICYge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxGaWVsZDxGPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj47XG4gIG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIG1ldGE/OiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBkZWZhdWx0PzogYW55O1xuICByZXF1aXJlZDogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k6IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgbWluTGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbiAgcGFyc2VyT3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PixcbiAgICB7IG5hbWUsIGZpZWxkLCBwYXJzZXIsIC4uLm9wdHMgfTogT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPlxuICApIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5maWVsZCA9IGZpZWxkO1xuICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgIHRoaXMuZGVmYXVsdCA9IG9wdHMuZGVmYXVsdCB8fCBwYXJzZXIuZGVmYXVsdDtcbiAgICB0aGlzLnJlcXVpcmVkID0gQm9vbGVhbihvcHRzLnJlcXVpcmVkIHx8ICFwYXJzZXIubnVsbGFibGUpO1xuICAgIHRoaXMuY29uY3VycmVuY3kgPSBCb29sZWFuKG9wdHMuY29uY3VycmVuY3kpO1xuICAgIHRoaXMubWF4TGVuZ3RoID0gb3B0cy5tYXhMZW5ndGggfHwgcGFyc2VyLm1heExlbmd0aDtcbiAgICB0aGlzLm1pbkxlbmd0aCA9IG9wdHMubWluTGVuZ3RoO1xuICAgIHRoaXMubWluID0gb3B0cy5taW47XG4gICAgdGhpcy5tYXggPSBvcHRzLm1heDtcbiAgICB0aGlzLnBhdHRlcm4gPSBvcHRzLnBhdHRlcm47XG4gIH1cblxuICBnZXQgYXBpKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXBpO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnR5cGU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnBhcnNlci5uYXZpZ2F0aW9uKTtcbiAgfVxuXG4gIGdldCBjb2xsZWN0aW9uKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMucGFyc2VyLmNvbGxlY3Rpb24pO1xuICB9XG5cbiAgYW5ub3RhdGVkVmFsdWU8VD4odGVybTogc3RyaW5nIHwgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmFubm90YXRlZFZhbHVlPFQ+KHRlcm0pO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGUsXG4gICAgY29uY3VycmVuY3ksXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25jdXJyZW5jeTogYm9vbGVhbjtcbiAgICBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICB9KSB7XG4gICAgdGhpcy5tZXRhID0gZmluZE9wdGlvbnNGb3JUeXBlKHRoaXMucGFyc2VyLnR5cGUpO1xuICAgIHRoaXMucGFyc2VyT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKGNvbmN1cnJlbmN5KSB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gICAgaWYgKHRoaXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZXNlcmlhbGl6ZSh0aGlzLmRlZmF1bHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaXNLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzS2V5KCk7XG4gIH1cblxuICBoYXNSZWZlcmVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmhhc1JlZmVyZW50aWFscygpO1xuICB9XG5cbiAgZ2V0IHJlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIucmVmZXJlbnRpYWxzO1xuICB9XG5cbiAgaXNTdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNTdHJ1Y3R1cmVkVHlwZSgpO1xuICB9XG5cbiAgc3RydWN0dXJlZCgpIHtcbiAgICBsZXQgc3RydWN0dXJlZFR5cGUgPSB0aGlzLmFwaS5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPEY+KFxuICAgICAgdGhpcy5wYXJzZXIudHlwZVxuICAgICk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoIXN0cnVjdHVyZWRUeXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBzdHJ1Y3R1cmVkIHR5cGUgZm9yICR7dGhpcy5wYXJzZXIudHlwZX1gKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZFR5cGU7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc0VudW1UeXBlKCk7XG4gIH1cblxuICBlbnVtKCkge1xuICAgIGxldCBlbnVtVHlwZSA9IHRoaXMuYXBpLmZpbmRFbnVtVHlwZUZvclR5cGU8Rj4odGhpcy5wYXJzZXIudHlwZSk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoIWVudW1UeXBlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBlbnVtIHR5cGUgZm9yICR7dGhpcy5wYXJzZXIudHlwZX1gKTtcbiAgICByZXR1cm4gZW51bVR5cGU7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgLypcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gIXZhbHVlLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgPyB2YWx1ZS5fZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoJ21vZGVscycgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLm1vZGVscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKi9cbiAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAhdmFsdWUuaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSA/IHZhbHVlLl9lcnJvcnMgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgLm1vZGVscygpXG4gICAgICAgIC5zb21lKChtOiBPRGF0YU1vZGVsPGFueT4pID0+ICFtLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkpXG4gICAgICAgID8gdmFsdWUubW9kZWxzKCkubWFwKChtOiBPRGF0YU1vZGVsPGFueT4pID0+IG0uX2Vycm9ycylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gICAgICBsZXQgZXJyb3JzID0gdGhpcy5wYXJzZXI/LnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yZXF1aXJlZCAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpICYmIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICAgICEoY29tcHV0ZWQgJiYgbWV0aG9kID09PSAnY3JlYXRlJykgLy8gTm90IChJcyBDb21wdXRlZCBmaWVsZCBhbmQgY3JlYXRlKSA/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5taW5MZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYG1pbmxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPCB0aGlzLm1pblxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtaW5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gdGhpcy5tYXhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgbWF4YCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGF0dGVybiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgIXRoaXMucGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBwYXR0ZXJuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0cygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJiB0aGlzLm1ldGEgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLm1ldGEuZGVmYXVsdHMoKVxuICAgICAgOiB0aGlzLmRlZmF1bHQ7XG4gIH1cblxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IEYge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMucGFyc2VyT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgc2VyaWFsaXplKHZhbHVlOiBGLCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5wYXJzZXJPcHRpb25zO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5zZXJpYWxpemUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgZW5jb2RlKHZhbHVlOiBGLCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5wYXJzZXJPcHRpb25zO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5lbmNvZGUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgcmVzb3VyY2VGYWN0b3J5PFQsIEY+KFxuICAgIGJhc2U6IE9EYXRhUmVzb3VyY2U8VD5cbiAgKTogT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxGPiB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxGPiB7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgfHxcbiAgICAgICAgYmFzZSBpbnN0YW5jZW9mIE9EYXRhUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGJ1aWxkIHJlc291cmNlIGZvciBub24gY29tcGF0aWJsZSBiYXNlIHR5cGVcIik7XG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblxuICAgICAgPyAoYmFzZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5uYXZpZ2F0aW9uUHJvcGVydHk8Rj4odGhpcy5wYXJzZXIubmFtZSlcbiAgICAgIDogKGJhc2UgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPikucHJvcGVydHk8Rj4odGhpcy5wYXJzZXIubmFtZSk7XG4gIH1cblxuICBhbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgYmFzZTogT0RhdGFFbnRpdHlBbm5vdGF0aW9uc1xuICApOiBPRGF0YUVudGl0eUFubm90YXRpb25zIHwgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuY29sbGVjdGlvblxuICAgICAgPyBuZXcgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zKFxuICAgICAgICAgIGJhc2UuaGVscGVyLFxuICAgICAgICAgIGJhc2UucHJvcGVydHkodGhpcy5wYXJzZXIubmFtZSlcbiAgICAgICAgKVxuICAgICAgOiBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhcbiAgICAgICAgICBiYXNlLmhlbHBlcixcbiAgICAgICAgICBiYXNlLnByb3BlcnR5KHRoaXMucGFyc2VyLm5hbWUpXG4gICAgICAgICk7XG4gIH1cblxuICBzY2hlbWFGYWN0b3J5PFQsIEY+KFxuICAgIGJhc2U6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD5cbiAgKTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxGPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGUodGhpcy5wYXJzZXIudHlwZSk7XG4gIH1cblxuICBtb2RlbENvbGxlY3Rpb25GYWN0b3J5PFQsIEY+KHtcbiAgICBwYXJlbnQsXG4gICAgdmFsdWUsXG4gICAgcmVzZXQsXG4gIH06IHtcbiAgICBwYXJlbnQ6IE9EYXRhTW9kZWw8YW55PjtcbiAgICB2YWx1ZT86IEYgfCBGW10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W107XG4gICAgcmVzZXQ/OiBib29sZWFuO1xuICB9KTogT0RhdGFNb2RlbDxGPiB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PiB7XG4gICAgY29uc3QgYW5ub3RzID0gdGhpcy5hbm5vdGF0aW9uc0ZhY3RvcnkocGFyZW50LmFubm90cygpKTtcbiAgICBjb25zdCBNb2RlbCA9IHRoaXMuYXBpLm1vZGVsRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgICBjb25zdCBDb2xsZWN0aW9uID0gdGhpcy5hcGkuY29sbGVjdGlvbkZvclR5cGUodGhpcy5wYXJzZXIudHlwZSk7XG5cbiAgICBpZiAoTW9kZWwgPT09IHVuZGVmaW5lZCB8fCBDb2xsZWN0aW9uID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBFcnJvcihgTm8gbW9kZWwgZm9yICR7dGhpcy5uYW1lfWApO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5jb2xsZWN0aW9uXG4gICAgICA/IChuZXcgQ29sbGVjdGlvbigodmFsdWUgfHwgW10pIGFzIEZbXSwge1xuICAgICAgICAgIGFubm90czogYW5ub3RzIGFzIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgICAgICAgICBwYXJlbnQ6IFtwYXJlbnQsIHRoaXNdLFxuICAgICAgICAgIHJlc2V0LFxuICAgICAgICB9KSBhcyBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4pXG4gICAgICA6IChuZXcgTW9kZWwoKHZhbHVlIHx8IHt9KSBhcyBGLCB7XG4gICAgICAgICAgYW5ub3RzOiBhbm5vdHMgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgICAgICAgICBwYXJlbnQ6IFtwYXJlbnQsIHRoaXNdLFxuICAgICAgICAgIHJlc2V0LFxuICAgICAgICB9KSBhcyBPRGF0YU1vZGVsPEY+KTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsUmVsYXRpb248VD4gPSB7XG4gIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGU7XG4gIG1vZGVsPzogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PiB8IG51bGw7XG4gIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8VD47XG4gIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbn07XG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsRW50cnk8VCwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+ID0ge1xuICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlO1xuICBtb2RlbDogTTtcbiAga2V5PzogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsT3B0aW9uczxUPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgY2lkOiBzdHJpbmc7XG4gIGJhc2U/OiBzdHJpbmc7XG4gIG9wZW4/OiBib29sZWFuO1xuICBwcml2YXRlIF9maWVsZHM6IE9EYXRhTW9kZWxGaWVsZDxhbnk+W107XG4gIHNjaGVtYTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPjtcbiAgZW50aXR5U2V0PzogT0RhdGFFbnRpdHlTZXQ7XG4gIC8vIEhpZXJhcmNoeVxuICBwYXJlbnQ/OiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBjaGlsZHJlbjogT0RhdGFNb2RlbE9wdGlvbnM8YW55PltdID0gW107XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIG9wdGlvbnMsXG4gICAgc2NoZW1hLFxuICB9OiB7XG4gICAgb3B0aW9uczogTW9kZWxPcHRpb25zO1xuICAgIHNjaGVtYTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPjtcbiAgfSkge1xuICAgIHRoaXMubmFtZSA9IHNjaGVtYS5uYW1lO1xuICAgIHRoaXMuYmFzZSA9IHNjaGVtYS5iYXNlO1xuICAgIHRoaXMub3BlbiA9IHNjaGVtYS5vcGVuO1xuICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHRoaXMuY2lkID0gb3B0aW9ucz8uY2lkIHx8IENJRF9GSUVMRF9OQU1FO1xuICAgIHRoaXMuX2ZpZWxkcyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuZmllbGRzKS5tYXAoKFtuYW1lLCBvcHRpb25zXSkgPT4ge1xuICAgICAgY29uc3QgeyBmaWVsZCwgLi4ub3B0cyB9ID0gb3B0aW9ucztcbiAgICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBQcm9wZXJ0aWVzIG5lZWQgbmFtZSBhbmQgZmllbGQnKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMuc2NoZW1hLmZpbmRGaWVsZEJ5TmFtZTxUPihmaWVsZCBhcyBrZXlvZiBUKTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwYXJzZXIgZm9yICR7ZmllbGR9IHdpdGggbmFtZSA9ICR7bmFtZX1gKTtcbiAgICAgIHJldHVybiBuZXcgT0RhdGFNb2RlbEZpZWxkPFQ+KHRoaXMsIHsgbmFtZSwgZmllbGQsIHBhcnNlciwgLi4ub3B0cyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBhcGkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmFwaTtcbiAgfVxuXG4gIHR5cGUoeyBhbGlhcyA9IGZhbHNlIH06IHsgYWxpYXM/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS50eXBlKHsgYWxpYXMgfSk7XG4gIH1cblxuICBpc1R5cGVPZih0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEuaXNUeXBlT2YodHlwZSk7XG4gIH1cblxuICBpc01vZGVsRm9yKGVudGl0eTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9KSB7XG4gICAgLy8gUmVzb2x2ZSBCeSBUeXBlXG4gICAgbGV0IHR5cGUgPSB0aGlzLmFwaS5vcHRpb25zLmhlbHBlci50eXBlKGVudGl0eSk7XG4gICAgaWYgKHR5cGUgJiYgdGhpcy5pc1R5cGVPZih0eXBlKSkgcmV0dXJuIHRydWU7XG4gICAgLy8gUmVzb2x2ZSBCeSBmaWVsZHNcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGVudGl0eSk7XG4gICAgbGV0IG5hbWVzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLm1hcCgoZikgPT4gZi5uYW1lKTtcbiAgICByZXR1cm4ga2V5cy5ldmVyeSgoa2V5KSA9PiBuYW1lcy5pbmNsdWRlcyhrZXkpKTtcbiAgfVxuXG4gIGZpbmRDaGlsZE9wdGlvbnMoXG4gICAgcHJlZGljYXRlOiAob3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PikgPT4gYm9vbGVhblxuICApOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJlZGljYXRlKHRoaXMpKSByZXR1cm4gdGhpcztcbiAgICBsZXQgbWF0Y2g6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgbWF0Y2ggPSBjaC5maW5kQ2hpbGRPcHRpb25zKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgb3B0aW9uczogUGFyc2VyT3B0aW9ucztcbiAgfSkge1xuICAgIGlmICh0aGlzLmJhc2UpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGZpbmRPcHRpb25zRm9yVHlwZSh0aGlzLmJhc2UpIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICB0aGlzLmVudGl0eVNldCA9IHRoaXMuYXBpLmZpbmRFbnRpdHlTZXRGb3JFbnRpdHlUeXBlKHRoaXMudHlwZSgpKTtcbiAgICBsZXQgY29uY3VycmVuY3lGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuZW50aXR5U2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmN1cnJlbmN5RmllbGRzID1cbiAgICAgICAgdGhpcy5lbnRpdHlTZXQuYW5ub3RhdGVkVmFsdWU8c3RyaW5nW10+KE9QVElNSVNUSUNfQ09OQ1VSUkVOQ1kpIHx8IFtdO1xuICAgIH1cbiAgICB0aGlzLl9maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGxldCBjb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5RmllbGRzLmluZGV4T2YoZmllbGQuZmllbGQpICE9PSAtMTtcbiAgICAgIGZpZWxkLmNvbmZpZ3VyZSh7XG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpZWxkcyh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9wYXJlbnRzID0gdHJ1ZSxcbiAgfToge1xuICAgIGluY2x1ZGVfcGFyZW50cz86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogT0RhdGFNb2RlbEZpZWxkPGFueT5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihpbmNsdWRlX3BhcmVudHMgJiYgdGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMucGFyZW50LmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbiwgaW5jbHVkZV9wYXJlbnRzIH0pXG4gICAgICAgIDogW10pLFxuICAgICAgLi4udGhpcy5fZmllbGRzLmZpbHRlcihcbiAgICAgICAgKGZpZWxkKSA9PiBpbmNsdWRlX25hdmlnYXRpb24gfHwgIWZpZWxkLm5hdmlnYXRpb25cbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGZpZWxkPEY+KG5hbWU6IGtleW9mIFQgfCBzdHJpbmcpIHtcbiAgICBsZXQgZmllbGQgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgfSkuZmluZChcbiAgICAgIChtb2RlbEZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4pID0+XG4gICAgICAgIG1vZGVsRmllbGQubmFtZSA9PT0gbmFtZSB8fCBtb2RlbEZpZWxkLmZpZWxkID09PSBuYW1lXG4gICAgKTtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpZWxkIHdpdGggbmFtZSAke25hbWUgYXMgc3RyaW5nfWApO1xuICAgIHJldHVybiBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8Rj47XG4gIH1cblxuICBhdHRhY2g8Uj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxSPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFI+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxSPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFI+XG4gICkge1xuICAgIGlmIChcbiAgICAgIHNlbGYuX3Jlc291cmNlICE9PSBudWxsICYmXG4gICAgICByZXNvdXJjZS50eXBlKCkgIT09IHNlbGYuX3Jlc291cmNlLnR5cGUoKSAmJlxuICAgICAgIXNlbGYuX3Jlc291cmNlLmlzU3VidHlwZU9mKHJlc291cmNlKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbid0IGF0dGFjaCAke3Jlc291cmNlLnR5cGUoKX0gdG8gJHtzZWxmLl9yZXNvdXJjZS50eXBlKCl9YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxmLl9yZXNvdXJjZTtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICBzZWxmLl9yZXNvdXJjZSA9IHJlc291cmNlIGFzIE9EYXRhUmVzb3VyY2U8YW55PjtcbiAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdhdHRhY2gnLCB7XG4gICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgcHJldmlvdXM6IGN1cnJlbnQsXG4gICAgICAgICAgdmFsdWU6IHJlc291cmNlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyMgcmVnaW9uIFJlc291cmNlXG4gIHN0YXRpYyBjaGFpbihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PlxuICApOiBbXG4gICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgXVtdIHtcbiAgICBjb25zdCBjaGFpbiA9IFtdIGFzIGFueVtdO1xuICAgIGxldCB0dXBsZTpcbiAgICAgIHwgW1xuICAgICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICAgIF1cbiAgICAgIHwgbnVsbCA9IFtjaGlsZCwgbnVsbF07XG4gICAgd2hpbGUgKHR1cGxlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0dXBsZSBhcyBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgXTtcbiAgICAgIGlmIChjaGFpbi5zb21lKChwKSA9PiBwWzBdID09PSBwYXJlbnRbMF0pKSBicmVhaztcbiAgICAgIGNoYWluLnNwbGljZSgwLCAwLCBwYXJlbnQpO1xuICAgICAgdHVwbGUgPSB0dXBsZVswXS5fcGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gY2hhaW47XG4gIH1cblxuICBzdGF0aWMgcmVzb3VyY2U8VD4oXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj5cbiAgKTogT0RhdGFSZXNvdXJjZTxUPiB7XG4gICAgbGV0IHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgcHJldkZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwgPSBudWxsO1xuICAgIGZvciAobGV0IFttb2RlbCwgZmllbGRdIG9mIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKSkge1xuICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZSB8fCAobW9kZWwuX3Jlc291cmNlIGFzIE9EYXRhUmVzb3VyY2U8VD4pO1xuICAgICAgaWYgKHJlc291cmNlID09PSBudWxsKSBicmVhaztcbiAgICAgIGlmIChcbiAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbCkgJiZcbiAgICAgICAgKHByZXZGaWVsZCA9PT0gbnVsbCB8fCBwcmV2RmllbGQuY29sbGVjdGlvbilcbiAgICAgICkge1xuICAgICAgICAvLyBSZXNvbHZlIGtleVxuICAgICAgICBsZXQgbW9kZWxLZXkgPSAobW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+KS5rZXkoe1xuICAgICAgICAgIGZpZWxkX21hcHBpbmc6IHRydWUsXG4gICAgICAgIH0pIGFzIEVudGl0eUtleTxhbnk+O1xuICAgICAgICBpZiAobW9kZWxLZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICByZXNvdXJjZSA9XG4gICAgICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2VcbiAgICAgICAgICAgICAgPyByZXNvdXJjZS5lbnRpdHkobW9kZWxLZXkpXG4gICAgICAgICAgICAgIDogKHJlc291cmNlIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4pLmtleShtb2RlbEtleSk7XG4gICAgICB9XG4gICAgICBwcmV2RmllbGQgPSBmaWVsZDtcbiAgICAgIGlmIChmaWVsZCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBBcHBseSB0aGUgcXVlcnkgZnJvbSBtb2RlbCB0byBuZXcgcmVzb3VyY2VcbiAgICAgICAgY29uc3QgcXVlcnkgPSBtb2RlbC5fcmVzb3VyY2U/LmNsb25lUXVlcnk8VD4oKS50b1F1ZXJ5QXJndW1lbnRzKCk7XG4gICAgICAgIGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkKSByZXNvdXJjZS5xdWVyeSgocSkgPT4gcS5hcHBseShxdWVyeSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc291cmNlID0gZmllbGQucmVzb3VyY2VGYWN0b3J5PGFueSwgYW55PihyZXNvdXJjZSk7XG4gICAgfVxuICAgIGlmIChyZXNvdXJjZSA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVzb3VyY2U6IENhbid0IGJ1aWxkIHJlc291cmNlIGZvciAke2NoaWxkfWApO1xuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIGNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG4gICAgcXVlcnk/OiBPRGF0YVF1ZXJ5T3B0aW9uczxUPlxuICApOlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmVudGl0eVNldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPRGF0YUVudGl0eVNldFJlc291cmNlLmZhY3Rvcnk8VD4odGhpcy5hcGksIHtcbiAgICAgIHBhdGg6IHRoaXMuZW50aXR5U2V0Lm5hbWUsXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgcXVlcnksXG4gICAgfSk7XG4gIH1cblxuICBtb2RlbFJlc291cmNlRmFjdG9yeShcbiAgICBxdWVyeT86IE9EYXRhUXVlcnlPcHRpb25zPFQ+XG4gICk6XG4gICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkocXVlcnkpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHJldHVybiByZXNvdXJjZS5lbnRpdHkoKTtcbiAgICByZXR1cm4gcmVzb3VyY2UgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGVudGl0eVJlc291cmNlKHNlbGY6IE9EYXRhTW9kZWw8VD4pOiBPRGF0YVJlc291cmNlPFQ+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLm1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgc2VsZi5fcmVzb3VyY2UgIT09IG51bGwgPyBzZWxmLl9yZXNvdXJjZS5jbG9uZVF1ZXJ5KCkgOiB1bmRlZmluZWRcbiAgICApO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbnRpdHlSZXNvdXJjZTogQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yICR7c2VsZn1gKTtcbiAgICBjb25zdCBrZXkgPSBzZWxmLmtleSh7IGZpZWxkX21hcHBpbmc6IHRydWUgfSkgYXMgRW50aXR5S2V5PFQ+O1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHJlc291cmNlLmtleShrZXkpO1xuICAgIHJldHVybiByZXNvdXJjZSBhcyBPRGF0YVJlc291cmNlPFQ+O1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGJpbmQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBwYXJlbnQsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFubm90cyxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgXTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPjtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIC8vIFBhcmVudFxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VsZi5fcGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlXG4gICAgaWYgKHNlbGYuX3BhcmVudCA9PT0gbnVsbCAmJiByZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmVzb3VyY2UgPSB0aGlzLm1vZGVsUmVzb3VyY2VGYWN0b3J5KCk7XG4gICAgaWYgKHJlc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYXR0YWNoKFxuICAgICAgICBzZWxmLFxuICAgICAgICByZXNvdXJjZSBhc1xuICAgICAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFubm90YXRpb25zXG4gICAgc2VsZi5fYW5ub3RhdGlvbnMgPVxuICAgICAgYW5ub3RzIHx8IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKE9EYXRhSGVscGVyW0RFRkFVTFRfVkVSU0lPTl0pO1xuXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pO1xuICAgIGZvciAobGV0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIGZpZWxkLm5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldChzZWxmLCBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiksXG4gICAgICAgIHNldDogKHZhbHVlOiBhbnkpID0+XG4gICAgICAgICAgdGhpcy5fc2V0KHNlbGYsIGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+LCB2YWx1ZSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBxdWVyeShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD4sXG4gICAgZnVuYzogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWRcbiAgKSB7XG4gICAgcmVzb3VyY2UucXVlcnkoZnVuYyk7XG4gICAgdGhpcy5hdHRhY2goc2VsZiwgcmVzb3VyY2UpO1xuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgcmVzb2x2ZUtleShcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleVR5cGVzID0gdGhpcy5zY2hlbWEua2V5cyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KTtcbiAgICBjb25zdCBrZXkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGZvciAobGV0IGt0IG9mIGtleVR5cGVzKSB7XG4gICAgICBsZXQgdiA9IHZhbHVlIGFzIGFueTtcbiAgICAgIGxldCBvcHRpb25zID0gdGhpcyBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgbGV0IGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IG5hbWUgb2Yga3QubmFtZS5zcGxpdCgnLycpKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICBmaWVsZCA9IG9wdGlvbnNcbiAgICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHYgPVxuICAgICAgICAgICAgVHlwZXMuaXNQbGFpbk9iamVjdCh2KSB8fCBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHYpXG4gICAgICAgICAgICAgID8gdltmaWVsZC5uYW1lXVxuICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgb3B0aW9ucyA9IGZpZWxkLm1ldGEgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBsZXQgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyBmaWVsZC5maWVsZCA6IGZpZWxkLm5hbWU7XG4gICAgICBpZiAoa3QuYWxpYXMgIT09IHVuZGVmaW5lZCkgbmFtZSA9IGt0LmFsaWFzO1xuICAgICAga2V5LnNldChuYW1lLCB2KTtcbiAgICB9XG4gICAgaWYgKGtleS5zaXplID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlID8gT2JqZWN0cy5yZXNvbHZlS2V5KGtleSkgOiBPYmplY3QuZnJvbUVudHJpZXMoa2V5KTtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVudGlhbChcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwsXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZmVyZW50aWFsID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBmb3IgKGxldCByZWYgb2YgZmllbGQucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pLmZpbmQoXG4gICAgICAgIChwOiBhbnkpID0+IHAuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHlcbiAgICAgICk7XG4gICAgICBsZXQgdG8gPSBmaWVsZC5vcHRpb25zXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IHJlZi5wcm9wZXJ0eSk7XG4gICAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gdG8uZmllbGQgOiB0by5uYW1lO1xuICAgICAgICByZWZlcmVudGlhbC5zZXQobmFtZSwgdmFsdWUgJiYgKHZhbHVlIGFzIGFueSlbZnJvbS5uYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWZlcmVudGlhbC5zaXplID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChyZWZlcmVudGlhbC5zaXplID09PSAxICYmIEFycmF5LmZyb20ocmVmZXJlbnRpYWwudmFsdWVzKCkpWzBdID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlc29sdmVcbiAgICAgID8gT2JqZWN0cy5yZXNvbHZlS2V5KHJlZmVyZW50aWFsLCB7IHNpbmdsZTogZmFsc2UgfSlcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHJlZmVyZW50aWFsKTtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVuY2VkKFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgZm9yIChsZXQgcmVmIG9mIGZpZWxkLnJlZmVyZW50aWFscykge1xuICAgICAgbGV0IGZyb20gPSB0aGlzLmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KS5maW5kKFxuICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gcmVmLnByb3BlcnR5XG4gICAgICApO1xuICAgICAgbGV0IHRvID0gKGZpZWxkLm1ldGEgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PilcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PlxuICAgICAgICAgICAgZmllbGQuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHlcbiAgICAgICAgKTtcbiAgICAgIGlmIChmcm9tICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyB0by5maWVsZCA6IHRvLm5hbWU7XG4gICAgICAgIHJlZmVyZW5jZWQuc2V0KG5hbWUsIHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmZXJlbmNlZC5zaXplID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChyZWZlcmVuY2VkLnNpemUgPT09IDEgJiYgQXJyYXkuZnJvbShyZWZlcmVuY2VkLnZhbHVlcygpKVswXSA9PT0gbnVsbClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiByZXNvbHZlXG4gICAgICA/IE9iamVjdHMucmVzb2x2ZUtleShyZWZlcmVuY2VkLCB7IHNpbmdsZTogZmFsc2UgfSlcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHJlZmVyZW5jZWQpO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogbmF2aWdhdGlvbixcbiAgICB9KS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IChzZWxmIGFzIGFueSlbZmllbGQubmFtZV07XG4gICAgICBsZXQgZXJycyA9IGZpZWxkLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCB9KTtcbiAgICAgIHJldHVybiBlcnJzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IGVycnMgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWZzID0gdGhpcy5maWVsZHMoKS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRzKCk7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtmaWVsZC5uYW1lXTogdmFsdWUgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShkZWZzKSA/IGRlZnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBoYXNDaGFuZ2VkKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSB9OiB7IGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW4gfSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzZWxmLl9jaGFuZ2VzLnNpemUgIT0gMCB8fFxuICAgICAgWy4uLnNlbGYuX3JlbGF0aW9ucy52YWx1ZXMoKV1cbiAgICAgICAgLmZpbHRlcigoeyBmaWVsZCB9KSA9PiAhZmllbGQubmF2aWdhdGlvbiB8fCBpbmNsdWRlX25hdmlnYXRpb24pXG4gICAgICAgIC5zb21lKFxuICAgICAgICAgICh7IGZpZWxkLCBzdGF0ZSwgbW9kZWwgfSkgPT5cbiAgICAgICAgICAgICghaW5jbHVkZV9uYXZpZ2F0aW9uIHx8IGZpZWxkLm5hdmlnYXRpb24pICYmXG4gICAgICAgICAgICAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkIHx8XG4gICAgICAgICAgICAgIChtb2RlbCAhPSB1bmRlZmluZWQgJiYgbW9kZWwuaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSkpXG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXNFbnRpdHk8UiwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KHNlbGY6IE0sIGZ1bmM6IChtb2RlbDogTSkgPT4gUik6IFIge1xuICAgIC8vIEJ1aWxkIG5ldyByZXNvdXJjZVxuICAgIGNvbnN0IHF1ZXJ5ID0gc2VsZi5yZXNvdXJjZSgpLmNsb25lUXVlcnk8VD4oKTtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLm1vZGVsUmVzb3VyY2VGYWN0b3J5KHF1ZXJ5KTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgZG9lcyBub3QgaGF2ZSBhc3NvY2lhdGVkIEVudGl0eSBlbmRwb2ludCcpO1xuICAgIC8vIFN0b3JlIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBzdG9yZSA9IHsgcGFyZW50OiBzZWxmLl9wYXJlbnQsIHJlc291cmNlOiBzZWxmLl9yZXNvdXJjZSB9O1xuICAgIC8vIFJlcGxhY2UgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHNlbGYuX3BhcmVudCA9IG51bGw7XG4gICAgc2VsZi5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAvLyBFeGVjdXRlIGZ1bmN0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gZnVuYyhzZWxmKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gUmVzdG9yZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgICAgICAgc2VsZi5fcGFyZW50ID0gc3RvcmUucGFyZW50O1xuICAgICAgICAgIHNlbGYuX3Jlc291cmNlID0gc3RvcmUucmVzb3VyY2U7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXN0b3JlIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICAgIHNlbGYuX3BhcmVudCA9IHN0b3JlLnBhcmVudDtcbiAgICAgIHNlbGYuX3Jlc291cmNlID0gc3RvcmUucmVzb3VyY2U7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHRvRW50aXR5KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgY2xpZW50X2lkID0gZmFsc2UsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIGNoYWluID0gW10sXG4gICAgfToge1xuICAgICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9rZXk/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgICB9ID0ge31cbiAgKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBsZXQgYXR0cnMgPSBzZWxmLmF0dHJpYnV0ZXMoe1xuICAgICAgY2hhbmdlc19vbmx5LFxuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgfSk7XG5cbiAgICBsZXQgcmVsYXRpb25zID0gWy4uLnNlbGYuX3JlbGF0aW9ucy5lbnRyaWVzKCldXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAvLyBDaGFpblxuICAgICAgICAoWywgeyBtb2RlbCB9XSkgPT4gY2hhaW4uZXZlcnkoKGMpID0+IGMgIT09IG1vZGVsKVxuICAgICAgKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgLy8gQ2hhbmdlcyBvbmx5XG4gICAgICAgIChbLCB7IG1vZGVsLCBzdGF0ZSB9XSkgPT5cbiAgICAgICAgICAhY2hhbmdlc19vbmx5IHx8XG4gICAgICAgICAgKGNoYW5nZXNfb25seSAmJlxuICAgICAgICAgICAgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZCB8fFxuICAgICAgICAgICAgICAobW9kZWwgIT0gdW5kZWZpbmVkICYmIG1vZGVsLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpKSlcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCB7IGZpZWxkLCBtb2RlbCB9XSkgPT5cbiAgICAgICAgICAvLyBOYXZpZ2F0aW9uXG4gICAgICAgICAgKGluY2x1ZGVfbmF2aWdhdGlvbiAmJiBmaWVsZC5uYXZpZ2F0aW9uICYmIG1vZGVsICE9PSBudWxsKSB8fFxuICAgICAgICAgICFmaWVsZC5uYXZpZ2F0aW9uXG4gICAgICApXG4gICAgICAubWFwKChbaywgeyBtb2RlbCwgZmllbGQsIHN0YXRlIH1dKSA9PiB7XG4gICAgICAgIGxldCBjaGFuZ2VzT25seSA9XG4gICAgICAgICAgY2hhbmdlc19vbmx5ICYmXG4gICAgICAgICAgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkICYmXG4gICAgICAgICAgISFmaWVsZC5uYXZpZ2F0aW9uO1xuICAgICAgICBsZXQgaW5jbHVkZUtleSA9IGluY2x1ZGVfa2V5ICYmICEhZmllbGQubmF2aWdhdGlvbjtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGssXG4gICAgICAgICAgICAobW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+KS50b0VudGl0eSh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVLZXksXG4gICAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24obW9kZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGssXG4gICAgICAgICAgICAobW9kZWwgYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PikudG9FbnRpdGllcyh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVLZXksXG4gICAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2ssIG1vZGVsXTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlKChhY2MsIFtrLCB2XSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZ1xuICAgICAgICAgID8gdGhpcy5maWVsZHMoKS5maW5kKFxuICAgICAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5uYW1lID09PSBrXG4gICAgICAgICAgICApPy5maWVsZCB8fCBrXG4gICAgICAgICAgOiBrO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2IH0pO1xuICAgICAgfSwge30pO1xuXG4gICAgLy8gQ3JlYXRlIGVudGl0eVxuICAgIGxldCBlbnRpdHk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHsgLi4uYXR0cnMsIC4uLnJlbGF0aW9ucyB9O1xuXG4gICAgLy8gQWRkIGNsaWVudF9pZFxuICAgIGlmIChjbGllbnRfaWQpIHtcbiAgICAgICg8YW55PmVudGl0eSlbdGhpcy5jaWRdID0gKDxhbnk+c2VsZilbdGhpcy5jaWRdO1xuICAgIH1cblxuICAgIC8vIEFkZCBrZXlcbiAgICBpZiAoaW5jbHVkZV9rZXkpIHtcbiAgICAgIGVudGl0eSA9IHtcbiAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAuLi4odGhpcy5yZXNvbHZlS2V5KHNlbGYsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZTogZmFsc2UgfSkgYXMge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdHlwZVxuICAgIGlmIChcbiAgICAgIHNlbGYuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgKChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHNlbGYuX3BhcmVudFswXSkgJiZcbiAgICAgICAgKHNlbGYuX3BhcmVudFsxXSBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PikubWV0YSAhPT0gc2VsZi5fbWV0YSkgfHxcbiAgICAgICAgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihzZWxmLl9wYXJlbnRbMF0pICYmXG4gICAgICAgICAgKHNlbGYuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KS5fbW9kZWxcbiAgICAgICAgICAgIC5tZXRhICE9PSBzZWxmLl9tZXRhKSlcbiAgICApIHtcbiAgICAgIGVudGl0eVt0aGlzLmFwaS5vcHRpb25zLmhlbHBlci5PREFUQV9UWVBFXSA9IGAjJHt0aGlzLnNjaGVtYS50eXBlKCl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgYXR0cmlidXRlcyhcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgLy8gQXR0cmlidXRlcyBieSBmaWVsZHMgKGF0dHJpYnV0ZXMgZm9yIHRoZSBtb2RlbCB0eXBlKVxuICAgIGNvbnN0IGZpZWxkQXR0cnMgPSB0aGlzLmZpZWxkcygpLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICBjb25zdCBpc0NoYW5nZWQgPSBzZWxmLl9jaGFuZ2VzLmhhcyhmLm5hbWUpO1xuICAgICAgY29uc3QgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyBmLmZpZWxkIDogZi5uYW1lO1xuICAgICAgY29uc3QgY29tcHV0ZWQgPSBmLmFubm90YXRlZFZhbHVlPGJvb2xlYW4+KENPTVBVVEVEKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gaXNDaGFuZ2VkXG4gICAgICAgID8gc2VsZi5fY2hhbmdlcy5nZXQoZi5uYW1lKVxuICAgICAgICA6IHNlbGYuX2F0dHJpYnV0ZXMuZ2V0KGYubmFtZSk7XG4gICAgICBpZiAoZi5jb25jdXJyZW5jeSAmJiBpbmNsdWRlX2NvbmN1cnJlbmN5KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIGlmIChjb21wdXRlZCAmJiBpbmNsdWRlX2NvbXB1dGVkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIGlmIChjaGFuZ2VzX29ubHkgJiYgaXNDaGFuZ2VkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIGlmICghY2hhbmdlc19vbmx5ICYmICFmLmNvbmN1cnJlbmN5ICYmICFjb21wdXRlZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgfSwge30pO1xuICAgIGlmICghaW5jbHVkZV9ub25fZmllbGQpIHJldHVybiBmaWVsZEF0dHJzO1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoZmllbGRBdHRycyk7XG4gICAgLy8gQXR0cmlidXRlcyBmcm9tIG9iamVjdCAoYXR0cmlidXRlcyBmb3Igb2JqZWN0KVxuICAgIGNvbnN0IG5vbkZpZWxkQXR0cnMgPSBPYmplY3QuZW50cmllcyhzZWxmKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFtrXSkgPT5cbiAgICAgICAgICBuYW1lcy5pbmRleE9mKGspID09PSAtMSAmJiAhay5zdGFydHNXaXRoKCdfJykgJiYgIWsuZW5kc1dpdGgoJyQnKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjLCBbaywgdl0pID0+IE9iamVjdC5hc3NpZ24oYWNjLCB7IFtrXTogdiB9KSwge30pO1xuICAgIHJldHVybiB7IC4uLmZpZWxkQXR0cnMsIC4uLm5vbkZpZWxkQXR0cnMgfTtcbiAgfVxuXG4gIHJlc2V0KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgeyBuYW1lLCBzaWxlbnQgPSBmYWxzZSB9OiB7IG5hbWU/OiBzdHJpbmc7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGxldCBjaGFuZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlc2V0IHZhbHVlXG4gICAgICBjb25zdCB2YWx1ZSA9IHNlbGYuX2F0dHJpYnV0ZXMuZ2V0KG5hbWUpO1xuICAgICAgY29uc3QgY2hhbmdlID0gc2VsZi5fY2hhbmdlcy5nZXQobmFtZSk7XG4gICAgICBpZiAodmFsdWUgIT09IGNoYW5nZSkgY2hhbmdlcyA9IFtuYW1lXTtcbiAgICAgIHNlbGYuX3JlbGF0aW9ucy5kZWxldGUobmFtZSk7XG4gICAgICBzZWxmLl9jaGFuZ2VzLmRlbGV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzZXQgYWxsXG4gICAgICBjaGFuZ2VzID0gWy4uLnNlbGYuX2NoYW5nZXMua2V5cygpXTtcbiAgICAgIHNlbGYuX3JlbGF0aW9ucy5jbGVhcigpO1xuICAgICAgc2VsZi5fY2hhbmdlcy5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAoIXNpbGVudCAmJiBjaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZXNldCcsIHtcbiAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICBvcHRpb25zOiB7IGNoYW5nZXMgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZW50aXR5OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7IHJlc2V0PzogYm9vbGVhbjsgcmVwYXJlbnQ/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICBzZWxmLl9yZXNldCA9IHJlc2V0O1xuICAgIHNlbGYuX3JlcGFyZW50ID0gcmVwYXJlbnQ7XG4gICAgc2VsZi5fc2lsZW50ID0gc2lsZW50O1xuXG4gICAgY29uc3QgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFwcGx5IGVudGl0eVxuICAgIGNvbnN0IG1vZGVsID0gc2VsZiBhcyBhbnk7XG4gICAgT2JqZWN0LmVudHJpZXMoZW50aXR5KVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSAvLyBGaWx0ZXIgdW5kZWZpbmVkXG4gICAgICAuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMoe1xuICAgICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICAgIH0pLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT5cbiAgICAgICAgICAgIChzZWxmLl9yZXNldCAmJiBmaWVsZC5maWVsZCA9PT0ga2V5KSB8fCBmaWVsZC5uYW1lID09PSBrZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIERlbGVnYXRlZCB0byBwcml2YXRlIHNldHRlclxuICAgICAgICAgIGlmICh0aGlzLl9zZXQoc2VsZiwgZmllbGQsIHZhbHVlKSkge1xuICAgICAgICAgICAgY2hhbmdlcy5wdXNoKGZpZWxkLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBCYXNpYyBhc3NpZ25tZW50XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG1vZGVsW2tleV07XG4gICAgICAgICAgbW9kZWxba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSB2YWx1ZSkgY2hhbmdlcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKCghc2VsZi5fc2lsZW50ICYmIGNoYW5nZXMubGVuZ3RoID4gMCkgfHwgc2VsZi5fcmVzZXQpIHtcbiAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KHNlbGYuX3Jlc2V0ID8gJ3Jlc2V0JyA6ICd1cGRhdGUnLCB7XG4gICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgb3B0aW9uczogeyBjaGFuZ2VzIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBzZWxmLl9yZXNldCA9IGZhbHNlO1xuICAgIHNlbGYuX3JlcGFyZW50ID0gZmFsc2U7XG4gICAgc2VsZi5fc2lsZW50ID0gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgaXNNb2RlbChvYmo6IGFueSkge1xuICAgIHJldHVybiBUeXBlcy5yYXdUeXBlKG9iaikgPT09ICdNb2RlbCc7XG4gIH1cblxuICBzdGF0aWMgaXNDb2xsZWN0aW9uKG9iajogYW55KSB7XG4gICAgcmV0dXJuIFR5cGVzLnJhd1R5cGUob2JqKSA9PT0gJ0NvbGxlY3Rpb24nO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2xsZWN0aW9uPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICBjb2xsZWN0aW9uOiBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4sXG4gICAgdmFsdWU6IFRbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgKSB7XG4gICAgY29sbGVjdGlvbi5fYW5ub3RhdGlvbnMgPSBmaWVsZC5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICBzZWxmLmFubm90cygpXG4gICAgKSBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM7XG4gICAgY29sbGVjdGlvbi5hc3NpZ24odmFsdWUgYXMgVFtdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSwge1xuICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0LFxuICAgICAgcmVwYXJlbnQ6IHNlbGYuX3JlcGFyZW50LFxuICAgICAgc2lsZW50OiBzZWxmLl9zaWxlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbGxlY3Rpb24uaGFzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlTW9kZWw8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPEY+LFxuICAgIHZhbHVlOiBGIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgKSB7XG4gICAgbW9kZWwuX2Fubm90YXRpb25zID0gZmllbGQuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgc2VsZi5hbm5vdHMoKVxuICAgICkgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucztcbiAgICBtb2RlbC5hc3NpZ24odmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICByZXNldDogc2VsZi5fcmVzZXQsXG4gICAgICByZXBhcmVudDogc2VsZi5fcmVwYXJlbnQsXG4gICAgICBzaWxlbnQ6IHNlbGYuX3NpbGVudCxcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kZWwuaGFzQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0PEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPlxuICApOiBGIHwgT0RhdGFNb2RlbDxGPiB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PiB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gc2VsZi5fcmVsYXRpb25zLmdldChmaWVsZC5uYW1lKTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVsYXRpb24/Lm1vZGVsID09PSBudWxsIHx8XG4gICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwocmVsYXRpb24/Lm1vZGVsKVxuICAgICAgKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciByZWZlcmVuY2VcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlZCA9IHRoaXMucmVzb2x2ZVJlZmVyZW5jZWQoc2VsZiwgZmllbGQpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVsYXRpb24/Lm1vZGVsICE9PSBudWxsICYmXG4gICAgICAgICAgcmVmZXJlbmNlZCAhPT0gbnVsbCAmJlxuICAgICAgICAgIHJlZmVyZW5jZWQgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICAocmVsYXRpb24hLm1vZGVsIGFzIE9EYXRhTW9kZWw8Rj4pLmFzc2lnbihyZWZlcmVuY2VkIGFzIFBhcnRpYWw8Rj4sIHtcbiAgICAgICAgICAgIHNpbGVudDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbj8ubW9kZWwgIT09IG51bGwgJiYgcmVmZXJlbmNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3VubGluayhzZWxmLCByZWxhdGlvbiBhcyBPRGF0YU1vZGVsUmVsYXRpb248Rj4pO1xuICAgICAgICAgIC8vIE5ldyB2YWx1ZSBpcyBudWxsXG4gICAgICAgICAgKHJlbGF0aW9uIGFzIE9EYXRhTW9kZWxSZWxhdGlvbjxGPikubW9kZWwgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uPy5tb2RlbCA9PT0gbnVsbCAmJiByZWZlcmVuY2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gTmV3IHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgICAgICAgIChyZWxhdGlvbiBhcyBPRGF0YU1vZGVsUmVsYXRpb248Rj4pLm1vZGVsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsYXRpb24/Lm1vZGVsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzKHNlbGYsIHtcbiAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZV9jb21wdXRlZDogdHJ1ZSxcbiAgICAgIH0pW2ZpZWxkLm5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldFN0cnVjdHVyZWQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAvLyBFbnN1cmVzIHRoYXQgdGhlIHJlbGF0aW9uIGV4aXN0c1xuICAgIGlmICghc2VsZi5fcmVsYXRpb25zLmhhcyhmaWVsZC5uYW1lKSkge1xuICAgICAgc2VsZi5fcmVsYXRpb25zLnNldChmaWVsZC5uYW1lLCB7XG4gICAgICAgIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkLFxuICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbiA9IHNlbGYuX3JlbGF0aW9ucy5nZXQoZmllbGQubmFtZSkhO1xuICAgIGNvbnN0IGN1cnJlbnQgPSByZWxhdGlvbi5tb2RlbDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gVW5saW5rIG9sZCByZWxhdGlvblxuICAgICAgdGhpcy5fdW5saW5rKHNlbGYsIHJlbGF0aW9uKTtcblxuICAgICAgLy8gTmV3IHZhbHVlIGlzIG51bGxcbiAgICAgIHJlbGF0aW9uLm1vZGVsID0gdmFsdWUgYXMgbnVsbDtcbiAgICAgIGNoYW5nZWQgPSBjdXJyZW50ICE9PSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjdXJyZW50KSkge1xuICAgICAgLy8gQ3VycmVudCBpcyBjb2xsZWN0aW9uXG4gICAgICBsZXQgY3VycmVudENvbGxlY3Rpb24gPSBjdXJyZW50IGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PjtcbiAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIC8vIE5ldyB2YWx1ZSBpcyBjb2xsZWN0aW9uXG4gICAgICAgIGxldCBuZXdDb2xsZWN0aW9uID0gdmFsdWUgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+O1xuICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24uZXF1YWxzKG5ld0NvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVubGluayBvbGQgY29sbGVjdGlvblxuICAgICAgICAgIHRoaXMuX3VubGluayhzZWxmLCByZWxhdGlvbik7XG4gICAgICAgICAgcmVsYXRpb24ubW9kZWwgPSBuZXdDb2xsZWN0aW9uO1xuICAgICAgICAgIC8vIExpbmsgbmV3IGNvbGxlY3Rpb25cbiAgICAgICAgICB0aGlzLl9saW5rKHNlbGYsIHJlbGF0aW9uKTtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChUeXBlcy5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBOZXcgdmFsdWUgaXMgYXJyYXlcbiAgICAgICAgY2hhbmdlZCA9IHRoaXMudXBkYXRlQ29sbGVjdGlvbjxGPihcbiAgICAgICAgICBzZWxmLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGN1cnJlbnRDb2xsZWN0aW9uLFxuICAgICAgICAgIHZhbHVlIGFzIFRbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoY3VycmVudCkpIHtcbiAgICAgIC8vIEN1cnJlbnQgaXMgbW9kZWxcbiAgICAgIGxldCBjdXJyZW50TW9kZWwgPSBjdXJyZW50IGFzIE9EYXRhTW9kZWw8Rj47XG4gICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgICAgLy8gTmV3IHZhbHVlIGlzIG1vZGVsXG4gICAgICAgIGxldCBuZXdNb2RlbCA9IHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj47XG4gICAgICAgIGlmIChjdXJyZW50TW9kZWwuZXF1YWxzKG5ld01vZGVsKSkge1xuICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBVbmxpbmsgb2xkIG1vZGVsXG4gICAgICAgICAgdGhpcy5fdW5saW5rKHNlbGYsIHJlbGF0aW9uKTtcbiAgICAgICAgICByZWxhdGlvbi5tb2RlbCA9IG5ld01vZGVsO1xuICAgICAgICAgIC8vIExpbmsgbmV3IG1vZGVsXG4gICAgICAgICAgdGhpcy5fbGluayhzZWxmLCByZWxhdGlvbik7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRoaXMudXBkYXRlTW9kZWw8Rj4oXG4gICAgICAgICAgc2VsZixcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBjdXJyZW50TW9kZWwsXG4gICAgICAgICAgdmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEN1cnJlbnQgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgIC8vIGNyZWF0ZSBuZXcgbW9kZWwvY29sbGVjdGlvbiBmb3IgZ2l2ZW4gdmFsdWVcbiAgICAgIHJlbGF0aW9uLm1vZGVsID1cbiAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSB8fFxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKVxuICAgICAgICAgID8gKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4pXG4gICAgICAgICAgOiBmaWVsZC5tb2RlbENvbGxlY3Rpb25GYWN0b3J5PFQsIEY+KHtcbiAgICAgICAgICAgICAgcGFyZW50OiBzZWxmLFxuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgIHJlc2V0OiBzZWxmLl9yZXNldCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgLy8gTGluayBuZXcgbW9kZWwvY29sbGVjdGlvblxuICAgICAgdGhpcy5fbGluayhzZWxmLCByZWxhdGlvbik7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIHJlZmVyZW50aWFsc1xuICAgIGlmICghT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHJlbGF0aW9uLm1vZGVsKSkge1xuICAgICAgbGV0IHJlZiA9IGZpZWxkLm1ldGE/LnJlc29sdmVSZWZlcmVudGlhbChyZWxhdGlvbi5tb2RlbCwgZmllbGQpO1xuICAgICAgaWYgKHJlZiAhPT0gbnVsbCAmJiByZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHNlbGYsIHJlZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHN0YXRlIGFuZCBlbWl0IGV2ZW50XG4gICAgcmVsYXRpb24uc3RhdGUgPVxuICAgICAgc2VsZi5fcmVzZXQgfHwgIWNoYW5nZWRcbiAgICAgICAgPyBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkXG4gICAgICAgIDogT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQ7XG4gICAgaWYgKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlZCkge1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgdmFsdWU6IHJlbGF0aW9uLm1vZGVsLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldFZhbHVlPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICB2YWx1ZTpcbiAgICAgIHwgRlxuICAgICAgfCBGW11cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICAgICAgfCBPRGF0YU1vZGVsPEY+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PlxuICAgICAgfCBudWxsLFxuICAgIGtleT86IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBhdHRycyA9IHRoaXMuYXR0cmlidXRlcyhzZWxmLCB7XG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZDogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBuYW1lID0gZmllbGQubmFtZTtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBhdHRyc1tuYW1lXTtcbiAgICBjaGFuZ2VkID0gIVR5cGVzLmlzRXF1YWwoY3VycmVudFZhbHVlLCB2YWx1ZSk7XG4gICAgaWYgKHNlbGYuX3Jlc2V0KSB7XG4gICAgICBzZWxmLl9jaGFuZ2VzLmRlbGV0ZShuYW1lKTtcbiAgICAgIHNlbGYuX2F0dHJpYnV0ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKFR5cGVzLmlzRXF1YWwodmFsdWUsIHNlbGYuX2F0dHJpYnV0ZXMuZ2V0KG5hbWUpKSkge1xuICAgICAgc2VsZi5fY2hhbmdlcy5kZWxldGUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VkKSB7XG4gICAgICBzZWxmLl9jaGFuZ2VzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICghc2VsZi5fc2lsZW50ICYmIGNoYW5nZWQpIHtcbiAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgICAgZmllbGQ6IGZpZWxkLFxuICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50VmFsdWUsXG4gICAgICAgICAgb3B0aW9uczogeyBrZXkgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0PEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICB2YWx1ZTpcbiAgICAgIHwgRlxuICAgICAgfCBGW11cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICAgICAgfCBPRGF0YU1vZGVsPEY+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PlxuICAgICAgfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICAgID8gdGhpcy5fc2V0U3RydWN0dXJlZChzZWxmLCBmaWVsZCwgdmFsdWUpXG4gICAgICA6IHRoaXMuX3NldFZhbHVlKHNlbGYsIGZpZWxkLCB2YWx1ZSwgZmllbGQuaXNLZXkoKSk7XG4gIH1cblxuICBwcml2YXRlIF91bmxpbms8Rj4oc2VsZjogT0RhdGFNb2RlbDxUPiwgcmVsYXRpb246IE9EYXRhTW9kZWxSZWxhdGlvbjxGPikge1xuICAgIGlmIChyZWxhdGlvbi5zdWJzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVsYXRpb24uc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICByZWxhdGlvbi5zdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChyZWxhdGlvbi5tb2RlbCAhPSBudWxsKSB7XG4gICAgICByZWxhdGlvbi5tb2RlbC5fcGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9saW5rPEY+KHNlbGY6IE9EYXRhTW9kZWw8VD4sIHJlbGF0aW9uOiBPRGF0YU1vZGVsUmVsYXRpb248Rj4pIHtcbiAgICBpZiAocmVsYXRpb24uc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBpZiAocmVsYXRpb24ubW9kZWwgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdWJzY3JpcHRpb24gbW9kZWwgaXMgbnVsbCcpO1xuICAgIH1cblxuICAgIGlmIChzZWxmLl9yZXBhcmVudCkgcmVsYXRpb24ubW9kZWwuX3BhcmVudCA9IFtzZWxmLCByZWxhdGlvbi5maWVsZF07XG5cbiAgICByZWxhdGlvbi5zdWJzY3JpcHRpb24gPSByZWxhdGlvbi5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PGFueT4pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEJVQkJMSU5HLmluZGV4T2YoZXZlbnQubmFtZSkgIT09IC0xICYmXG4gICAgICAgICAgZXZlbnQuYnViYmxpbmcgJiZcbiAgICAgICAgICAhZXZlbnQudmlzaXRlZChzZWxmKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZXZlbnQubW9kZWwgPT09IHJlbGF0aW9uLm1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV2ZW50Lm5hbWUgPT09ICdjaGFuZ2UnICYmXG4gICAgICAgICAgICAgIHJlbGF0aW9uLmZpZWxkLm5hdmlnYXRpb24gJiZcbiAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucz8ua2V5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgbGV0IHJlZiA9IChyZWxhdGlvbi5tb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLnJlZmVyZW50aWFsKFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uLmZpZWxkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHNlbGYsIHJlZik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChldmVudC5wdXNoKHNlbGYsIHJlbGF0aW9uLmZpZWxkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iXX0=