tango-app-ui-store-builder 1.2.13 → 1.2.15

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.
@@ -28,6 +28,10 @@ export class LookPlanoCollectionFormComponent {
28
28
  isNew = true;
29
29
  loading = false;
30
30
  saving = false;
31
+ // Access control — mirrors the Looks list page. Only emails in
32
+ // planostaticdatas `allowedLookUsers` may open the form.
33
+ accessChecked = false;
34
+ allowed = false;
31
35
  form;
32
36
  selectedLookIndex = -1;
33
37
  selectedSlotIndex = -1;
@@ -39,6 +43,20 @@ export class LookPlanoCollectionFormComponent {
39
43
  { id: 'eurocenter', name: 'Floor' },
40
44
  ];
41
45
  fixtureLibraryItems = [];
46
+ // MBQ bucket / Brand / Fixture Header dropdown options, seeded from the
47
+ // sheet into planostaticdatas (type='lookComboOptions'). The form fields
48
+ // are searchable selects so the user picks a known value rather than typing.
49
+ // All three are flat lists of every distinct value present in the sheet —
50
+ // they are NOT cross-filtered, so e.g. the Brand dropdown always offers all
51
+ // brands regardless of which MBQ bucket the look uses.
52
+ mbqBucketItems = [];
53
+ brandItems = [];
54
+ fixtureHeaderItems = [];
55
+ // Raw payload from the comboOptions endpoint, kept so we can rebuild the
56
+ // option lists by merging it with the values already present on the loaded
57
+ // collection (so the dropdowns are never empty even if the endpoint is
58
+ // unavailable or hasn't loaded yet).
59
+ comboRaw = { mbqBuckets: [], brands: [], fixtureHeaders: [], combinations: [] };
42
60
  // Dropdowns inside placement rows.
43
61
  vmTypeOptions = [];
44
62
  vmArtworkOptions = [];
@@ -490,9 +508,13 @@ export class LookPlanoCollectionFormComponent {
490
508
  this.pageInfo = pageInfo;
491
509
  this.planoDataService = planoDataService;
492
510
  }
493
- ngOnInit() {
511
+ async ngOnInit() {
494
512
  this.setPageData();
495
513
  this.initForm();
514
+ // Gate on the allowlist before wiring any data loads / subscriptions.
515
+ await this.checkAccess();
516
+ if (!this.allowed)
517
+ return;
496
518
  // Listen to the shared fixtureTemplateDetails — when the embedded
497
519
  // TemplateProducts/TemplateVms components push edits back into the
498
520
  // BehaviorSubject, persist a snapshot under the active slot + library.
@@ -518,6 +540,7 @@ export class LookPlanoCollectionFormComponent {
518
540
  if (this.clientId) {
519
541
  this.loadFixtureLibraries();
520
542
  this.loadPlacementDropdownData();
543
+ this.loadComboOptions();
521
544
  }
522
545
  });
523
546
  this.route.params.pipe(takeUntil(this.destroy$)).subscribe(async (params) => {
@@ -538,6 +561,20 @@ export class LookPlanoCollectionFormComponent {
538
561
  replaceUrl: true,
539
562
  });
540
563
  }
564
+ /** Resolve whether the session user may access Looks. Never throws. */
565
+ async checkAccess() {
566
+ try {
567
+ const res = await lastValueFrom(this.builderService.getLookAccess());
568
+ this.allowed = !!res?.data?.allowed;
569
+ }
570
+ catch (err) {
571
+ console.log('@@ ~ checkAccess [ERR]:', err);
572
+ this.allowed = false;
573
+ }
574
+ finally {
575
+ this.accessChecked = true;
576
+ }
577
+ }
541
578
  setPageData() {
542
579
  this.pageInfo.setTitle('Look Collection');
543
580
  this.pageInfo.setBreadcrumbs([
@@ -545,7 +582,6 @@ export class LookPlanoCollectionFormComponent {
545
582
  { title: '', path: '', isActive: false, isSeparator: true },
546
583
  { title: 'Looks', path: '/manage/planogram/looks', isActive: false, isSeparator: false },
547
584
  { title: '', path: '', isActive: false, isSeparator: true },
548
- { title: 'Edit', path: '', isActive: true, isSeparator: false },
549
585
  ]);
550
586
  }
551
587
  initForm() {
@@ -812,6 +848,85 @@ export class LookPlanoCollectionFormComponent {
812
848
  console.log('@@ ~ loadPlacementDropdownData [ERR]:', err);
813
849
  }
814
850
  }
851
+ /**
852
+ * Load the MBQ bucket / Brand / Fixture Header dropdown options seeded into
853
+ * planostaticdatas from the sheet, then rebuild the flat option lists
854
+ * (merging in any values already present on the loaded collection).
855
+ */
856
+ async loadComboOptions() {
857
+ if (!this.clientId)
858
+ return;
859
+ try {
860
+ const res = await lastValueFrom(this.builderService.getLookComboOptions(this.clientId));
861
+ const data = res?.data || {};
862
+ const toStrArr = (arr) => (Array.isArray(arr) ? arr : [])
863
+ .map((v) => String(v ?? '').trim())
864
+ .filter((s) => !!s);
865
+ this.comboRaw = {
866
+ mbqBuckets: toStrArr(data.mbqBuckets),
867
+ brands: toStrArr(data.brands),
868
+ fixtureHeaders: toStrArr(data.fixtureHeaders),
869
+ combinations: (Array.isArray(data.combinations) ? data.combinations : [])
870
+ .map((c) => ({
871
+ mbqBucket: String(c?.mbqBucket ?? '').trim(),
872
+ brand: String(c?.brand ?? '').trim(),
873
+ fixtureHeader: String(c?.fixtureHeader ?? '').trim(),
874
+ })),
875
+ };
876
+ }
877
+ catch (err) {
878
+ // Endpoint missing / not yet deployed — fall back to values derived
879
+ // from the loaded collection so the dropdowns still work.
880
+ console.log('@@ ~ loadComboOptions [ERR]:', err);
881
+ }
882
+ this.rebuildComboOptions();
883
+ }
884
+ /**
885
+ * Rebuild the MBQ bucket / Brand / Fixture Header option lists (and the
886
+ * cascading caches) by MERGING the seeded endpoint payload (comboRaw) with
887
+ * whatever values are already present on the currently-loaded looks. The
888
+ * merge guarantees the dropdowns are never empty for an existing collection
889
+ * even when the endpoint hasn't loaded, and that any value already saved on
890
+ * a look is always selectable.
891
+ */
892
+ rebuildComboOptions() {
893
+ const buckets = new Set(this.comboRaw.mbqBuckets);
894
+ const brands = new Set(this.comboRaw.brands);
895
+ const headers = new Set(this.comboRaw.fixtureHeaders);
896
+ // Seed combinations also feed the flat per-field lists.
897
+ for (const c of this.comboRaw.combinations) {
898
+ if (c.mbqBucket)
899
+ buckets.add(c.mbqBucket);
900
+ if (c.brand)
901
+ brands.add(c.brand);
902
+ if (c.fixtureHeader)
903
+ headers.add(c.fixtureHeader);
904
+ }
905
+ // Merge in values already present on the loaded looks/slots so the
906
+ // dropdowns work even when the endpoint hasn't loaded.
907
+ for (const lookCtrl of this.looks.controls) {
908
+ const look = lookCtrl;
909
+ const bucket = String(look.get('mbqBucket')?.value ?? '').trim()
910
+ || String(look.get('brandCategory')?.value ?? '').trim();
911
+ if (bucket)
912
+ buckets.add(bucket);
913
+ const slots = look.get('fixtureSlots');
914
+ for (const slotCtrl of slots?.controls || []) {
915
+ const slot = slotCtrl;
916
+ const brand = String(slot.get('brand')?.value ?? '').trim();
917
+ const header = String(slot.get('fixtureLevelZone')?.value ?? '').trim();
918
+ if (brand)
919
+ brands.add(brand);
920
+ if (header)
921
+ headers.add(header);
922
+ }
923
+ }
924
+ const toItems = (set) => [...set].filter((s) => !!s).sort().map((s) => ({ value: s, label: s }));
925
+ this.mbqBucketItems = toItems(buckets);
926
+ this.brandItems = toItems(brands);
927
+ this.fixtureHeaderItems = toItems(headers);
928
+ console.log('[Looks form] combo options:', this.mbqBucketItems.length, 'buckets,', this.brandItems.length, 'brands,', this.fixtureHeaderItems.length, 'headers');
929
+ }
815
930
  async loadFixtureLibraries() {
816
931
  if (!this.clientId)
817
932
  return;
@@ -880,9 +995,33 @@ export class LookPlanoCollectionFormComponent {
880
995
  return;
881
996
  }
882
997
  this.recomputeFixtureLibraryItemsForSlot();
998
+ // Re-filter the Fixture Templates list when the Fixture Type changes, and
999
+ // RESET the current template selections: wall (shelf) and floor
1000
+ // (eurocenter) library sets are disjoint, so anything selected for the old
1001
+ // type is invalid for the new one. Clearing fixtureLibraryRefs cascades —
1002
+ // the refsSub below clears the embedded preview, and we drop the stale
1003
+ // per-library snapshots too.
1004
+ let prevSlotType = String(slot.get('slotType')?.value ?? '');
883
1005
  const typeSub = slot.get('slotType')?.valueChanges
884
1006
  .pipe(takeUntil(this.destroy$))
885
- .subscribe(() => this.recomputeFixtureLibraryItemsForSlot());
1007
+ .subscribe((nextType) => {
1008
+ const changed = String(nextType ?? '') !== prevSlotType;
1009
+ prevSlotType = String(nextType ?? '');
1010
+ this.recomputeFixtureLibraryItemsForSlot();
1011
+ if (!changed)
1012
+ return;
1013
+ const refsCtrl = slot.get('fixtureLibraryRefs');
1014
+ if (refsCtrl && (refsCtrl.value || []).length) {
1015
+ refsCtrl.setValue([]); // triggers refsSub -> clears active preview
1016
+ }
1017
+ const snapsCtrl = slot.get('librarySnapshots');
1018
+ if (snapsCtrl && (snapsCtrl.value || []).length) {
1019
+ snapsCtrl.setValue([], { emitEvent: false });
1020
+ }
1021
+ // Defensive: clear the legacy single-ref fields if they were set.
1022
+ slot.get('fixtureLibraryRef')?.setValue('', { emitEvent: false });
1023
+ slot.get('fixtureLibraryLabel')?.setValue('', { emitEvent: false });
1024
+ });
886
1025
  if (typeSub)
887
1026
  this.slotSubs.push(typeSub);
888
1027
  // Track previous refs so we can detect *new* additions and auto-apply
@@ -1052,6 +1191,9 @@ export class LookPlanoCollectionFormComponent {
1052
1191
  this.resetLibraryMap();
1053
1192
  this.bindActiveSlotListeners();
1054
1193
  this.autoSelectFirstLibrary();
1194
+ // Merge this collection's own values into the dropdown options so they
1195
+ // show even if the comboOptions endpoint is unavailable.
1196
+ this.rebuildComboOptions();
1055
1197
  }
1056
1198
  }
1057
1199
  catch (err) {
@@ -1079,6 +1221,22 @@ export class LookPlanoCollectionFormComponent {
1079
1221
  this.selectedLookIndex -= 1;
1080
1222
  }
1081
1223
  }
1224
+ /**
1225
+ * Clone the look at `index` (deep copy of its full nested value — slots,
1226
+ * placements, cadHeaderVariants, librarySnapshots) and insert it right
1227
+ * after the original, then select the copy. createLookGroup rebuilds the
1228
+ * whole FormGroup tree from the JSON seed, so the clone shares no control
1229
+ * references with the source.
1230
+ */
1231
+ duplicateLook(index) {
1232
+ const src = this.looks.at(index);
1233
+ if (!src)
1234
+ return;
1235
+ const seed = JSON.parse(JSON.stringify(src.getRawValue()));
1236
+ const clone = this.createLookGroup(seed);
1237
+ this.looks.insert(index + 1, clone);
1238
+ this.selectLook(index + 1);
1239
+ }
1082
1240
  selectLook(index) {
1083
1241
  this.selectedLookIndex = index;
1084
1242
  const slots = this.fixtureSlots(index);
@@ -1300,10 +1458,10 @@ export class LookPlanoCollectionFormComponent {
1300
1458
  this.planoDataService.fixtureTemplateDetails.next(null);
1301
1459
  }
1302
1460
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LookPlanoCollectionFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.GlobalStateService }, { token: i4.StoreBuilderService }, { token: i5.ToastService }, { token: i3.PageInfoService }, { token: i6.PlanoDataService }], target: i0.ɵɵFactoryTarget.Component });
1303
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LookPlanoCollectionFormComponent, selector: "lib-look-plano-collection-form", ngImport: i0, template: "<section class=\"look-form\">\r\n <!-- Top bar (bound to the outer form) -->\r\n <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label fw-bold\">Name *</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n </div>\r\n <div class=\"col-md-5\">\r\n <label class=\"form-label fw-bold\">Description</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n </div>\r\n <div class=\"col-md-1 text-center\">\r\n <label class=\"form-label fw-bold d-block\">Active</label>\r\n <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n </div>\r\n <div class=\"col-md-2 text-end\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n {{ saving ? 'Saving\u2026' : 'Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Three-pane editor -->\r\n <div class=\"row mx-0 g-3\">\r\n <!-- Left: Looks list (no form binding needed \u2014 just navigation) -->\r\n <div class=\"col-md-3\">\r\n <div class=\"card p-3 h-100\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n </div>\r\n <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n <div class=\"looks-tree\">\r\n <div\r\n *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedLookIndex === i\"\r\n [style.background-color]=\"bucketColor($any(look))\"\r\n (click)=\"selectLook(i)\"\r\n >\r\n <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n <ng-container *ngIf=\"fixtureTypeBadge($any(look)) as ftb\">\r\n <span class=\"fixture-type-badge\" [ngClass]=\"ftb.cls\">{{ ftb.label }}</span>\r\n </ng-container>\r\n </span>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeLook(i)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Centre: selected Look metadata + slots -->\r\n <div class=\"col-md-3\">\r\n <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">MBQ bucket</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"mbqBucket\" placeholder=\"e.g. JJ / OD Eye\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture count *</label>\r\n <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">CAD Header Varients</label>\r\n <lib-chips-input\r\n class=\"cad-header-variants-input\"\r\n formControlName=\"cadHeaderVariants\"\r\n placeholder=\"Type a variant and press Enter\">\r\n </lib-chips-input>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Positions</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"fixtureTypeOptions\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n placeholder=\"Select fixture position\"\r\n formControlName=\"fixtureType\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Fixtures</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n </div>\r\n <div class=\"slots-list\">\r\n <div\r\n *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedSlotIndex === s\"\r\n (click)=\"selectSlot(s)\"\r\n >\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"fw-bold small\">\r\n Fixture {{ $any(slot).get('slotIndex')?.value }} \u2014 {{ $any(slot).get('slotType')?.value }}\r\n </span>\r\n <span class=\"text-muted small\">\r\n {{ $any(slot).get('brand')?.value || '(no brand)' }} \u00B7\r\n {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noLook>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Right: selected slot \u2014 placements editor -->\r\n <div class=\"col-md-6\">\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture Type</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Brand</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"brand\" placeholder=\"John Jacobs\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Header</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"fixtureLevelZone\" placeholder=\"Premium Trending\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Templates</label>\r\n <multiselect-chip-dropdown\r\n class=\"fixture-libraries-select\"\r\n [items]=\"fixtureLibraryItemsForSlot\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n [search]=\"true\"\r\n searchField=\"name\"\r\n placeholder=\"Select fixture templates\"\r\n formControlName=\"fixtureLibraryRefs\">\r\n </multiselect-chip-dropdown>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n Showing floor fixtures (eurocenter slot).\r\n </small>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n Showing wall fixtures (shelf slot).\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n </div>\r\n <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n </div>\r\n <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n <div\r\n *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n class=\"placement-row mb-2\"\r\n [formGroupName]=\"pi\"\r\n >\r\n <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n <option value=\"pid\">Product Merchandising</option>\r\n <option value=\"vm\">Visual Merchandising</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmTypeOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Type\"\r\n formControlName=\"position\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Artwork\"\r\n formControlName=\"rawValue\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n <ng-template #pidInputs>\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n <option value=\"\">Position</option>\r\n <option value=\"Top\">Top</option>\r\n <option value=\"Mid\">Mid</option>\r\n <option value=\"Bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"productOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n [multiple]=\"true\"\r\n placeholder=\"Product / SKU\"\r\n formControlName=\"rawValues\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-template>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noSlot>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Per-slot Fixture Library Configuration card -->\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n <div class=\"library-chips\">\r\n <button\r\n *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n type=\"button\"\r\n class=\"library-chip\"\r\n [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n {{ lib.name }}\r\n </button>\r\n </div>\r\n <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details\u2026</div>\r\n\r\n <!--\r\n Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n a switch as a new item \u2014 that forces the embedded template-products\r\n / template-vms components to remount and rerun their ngOnInit\r\n (otherwise their `isPageLoading` guard skips the form rebuild).\r\n -->\r\n <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'products'\"\r\n (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n </li>\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'vms'\"\r\n (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"embeddedTab === 'products'\">\r\n <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n </div>\r\n <div *ngIf=\"embeddedTab === 'vms'\">\r\n <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</section>\r\n", styles: [".look-form .col-md-3>.card,.look-form .col-md-6>.card{display:flex!important;flex-direction:column;height:85vh!important;min-height:720px}.look-form .looks-tree,.look-form .slots-list,.look-form .placements-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.look-form .look-row,.look-form .slot-row{cursor:pointer;border:1px solid transparent;background:#f9fafb;transition:filter .15s ease,box-shadow .15s ease,border-color .15s ease}.look-form .look-row:hover,.look-form .slot-row:hover{filter:brightness(.96)}.look-form .look-row.selected,.look-form .slot-row.selected{filter:brightness(.96);outline:1px solid rgba(14,165,233,.55);outline-offset:-1px}.look-form .bucket-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}.look-form .fixture-type-badge{display:inline-block;flex-shrink:0;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:600;line-height:14px;letter-spacing:.2px;border:1px solid transparent;white-space:nowrap}.look-form .fixture-type-badge.badge-wall{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.look-form .fixture-type-badge.badge-floor{background:#fed7aa;color:#9a3412;border-color:#fdba74}.look-form .fixture-type-badge.badge-mixed{background:#ede9fe;color:#6d28d9;border-color:#c4b5fd}.look-form .fixture-libraries-select{display:block}.look-form .fixture-libraries-select ::ng-deep .multiselect-container{align-items:flex-start}.look-form .fixture-libraries-select ::ng-deep .chip-list{max-height:84px;overflow-y:auto;padding-right:4px}.look-form .cad-header-variants-input{display:block}.look-form .cad-header-variants-input ::ng-deep .chips-input{max-height:84px;overflow-y:auto;align-content:flex-start;padding-right:4px}.look-form .placement-row .placement-fields .ph-field{flex:1 1 0;min-width:0}.look-form .placement-row .placement-fields .ph-remove{flex:0 0 auto}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multiselect-container{padding:4px 10px;min-height:31px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .chip-list{min-height:21px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multi-placeholder{font-size:13px;line-height:21px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.look-form .library-config-card .library-chips{display:flex;flex-wrap:wrap;gap:8px}.look-form .library-config-card .library-chip{background:#f1f5f9;border:1px solid #cbd5e1;color:#1e293b;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.look-form .library-config-card .library-chip:hover{background:#e2e8f0;border-color:#94a3b8}.look-form .library-config-card .library-chip.active{background:#0ea5e9;border-color:#0284c7;color:#fff}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col-8>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products input[readonly]{background-color:var(--bs-gray-200, #e9ecef);cursor:not-allowed}.look-form .library-config-card .fixture-preview{border:1px solid #e2e8f0;border-radius:8px;background:#fff;padding:12px}.look-form .library-config-card .fixture-preview .fx-header,.look-form .library-config-card .fixture-preview .fx-footer{background:#f1f5f9;border:1px dashed #cbd5e1;border-radius:6px;padding:6px 10px;font-size:12px;color:#475569;text-align:center;margin:4px 0}.look-form .library-config-card .fixture-preview .fx-body{display:flex;flex-direction:column;gap:4px;padding:4px 0}.look-form .library-config-card .fixture-preview .fx-shelf{background:linear-gradient(180deg,#f8fafc,#eef2f7);border:1px solid #cbd5e1;border-radius:4px;padding:8px 10px;display:flex;align-items:center;gap:8px;font-size:13px;min-height:36px}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-badge{background:#0ea5e9;color:#fff;font-weight:700;padding:2px 8px;border-radius:999px;font-size:11px;flex-shrink:0}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-label{font-weight:500;color:#1e293b}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-meta{color:#64748b;font-size:11px;margin-left:auto}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray{background:linear-gradient(180deg,#fef3c7,#fde68a);border-color:#f59e0b}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray .fx-shelf-badge{background:#d97706}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly{background:linear-gradient(180deg,#ede9fe,#ddd6fe);border-color:#8b5cf6}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly .fx-shelf-badge{background:#7c3aed}.look-form .library-config-card .fixture-preview .fx-dims{text-align:center}.look-form .library-config-card .shelf-mappings{max-height:70vh;overflow-y:auto;padding-right:4px}.look-form .library-config-card .shelf-mappings .shelf-mapping{border:1px solid #e5e7eb;border-radius:8px;padding:12px;background:#f9fafb}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField", "maxSelection", "compact", "extraActionLabel", "extraActionActive", "disabled"], outputs: ["extraActionClick"] }, { kind: "component", type: i9.TemplateProductsComponent, selector: "lib-template-products", inputs: ["looksMode"] }, { kind: "component", type: i10.SearchableSelectComponent, selector: "lib-searchable-select", inputs: ["items", "idField", "nameField", "searchField", "placeholder", "multiple", "compact"] }, { kind: "component", type: i11.ChipsInputComponent, selector: "lib-chips-input", inputs: ["placeholder", "allowDuplicates"] }, { kind: "component", type: i12.TemplateVmsComponent, selector: "lib-template-vms", inputs: ["looksMode"] }] });
1461
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LookPlanoCollectionFormComponent, selector: "lib-look-plano-collection-form", ngImport: i0, template: "<div *ngIf=\"!accessChecked\" class=\"card p-5 m-4 text-center text-muted\">Checking access\u2026</div>\r\n\r\n<div *ngIf=\"accessChecked && !allowed\" class=\"card p-5 m-4\">\r\n <div class=\"access-denied text-center py-10\">\r\n <div class=\"access-denied-icon mb-4\"><i class=\"bi bi-shield-lock\"></i></div>\r\n <h3 class=\"mb-2\">Access denied</h3>\r\n <p class=\"text-muted mb-0\">\r\n You don't have permission to access Looks. Contact your administrator\r\n to be added to the allowed users list.\r\n </p>\r\n </div>\r\n</div>\r\n\r\n<section class=\"look-form\" *ngIf=\"accessChecked && allowed\">\r\n <!-- Top bar (bound to the outer form) -->\r\n <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label fw-bold\">Name *</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n </div>\r\n <div class=\"col-md-5\">\r\n <label class=\"form-label fw-bold\">Description</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n </div>\r\n <div class=\"col-md-1 text-center\">\r\n <label class=\"form-label fw-bold d-block\">Active</label>\r\n <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n </div>\r\n <div class=\"col-md-2 text-end\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n {{ saving ? 'Saving\u2026' : 'Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Three-pane editor -->\r\n <div class=\"row mx-0 g-3\">\r\n <!-- Left: Looks list (no form binding needed \u2014 just navigation) -->\r\n <div class=\"col-md-3\">\r\n <div class=\"card p-3 h-100\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n </div>\r\n <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n <div class=\"looks-tree\">\r\n <div\r\n *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedLookIndex === i\"\r\n [style.background-color]=\"bucketColor($any(look))\"\r\n (click)=\"selectLook(i)\"\r\n >\r\n <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n <ng-container *ngIf=\"fixtureTypeBadge($any(look)) as ftb\">\r\n <span class=\"fixture-type-badge\" [ngClass]=\"ftb.cls\">{{ ftb.label }}</span>\r\n </ng-container>\r\n </span>\r\n <span class=\"look-row-actions\">\r\n <button type=\"button\" class=\"row-action-btn duplicate\" title=\"Duplicate look\"\r\n (click)=\"$event.stopPropagation(); duplicateLook(i)\">\r\n <i class=\"bi bi-files\"></i>\r\n </button>\r\n <button type=\"button\" class=\"row-action-btn remove\" title=\"Remove look\"\r\n (click)=\"$event.stopPropagation(); removeLook(i)\">\r\n <i class=\"bi bi-trash3\"></i>\r\n </button>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Centre: selected Look metadata + slots -->\r\n <div class=\"col-md-3\">\r\n <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">MBQ bucket</label>\r\n <lib-searchable-select\r\n [items]=\"mbqBucketItems\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Select MBQ bucket\"\r\n formControlName=\"mbqBucket\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture count *</label>\r\n <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">CAD Header Varients</label>\r\n <lib-chips-input\r\n class=\"cad-header-variants-input\"\r\n formControlName=\"cadHeaderVariants\"\r\n placeholder=\"Type a variant and press Enter\">\r\n </lib-chips-input>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Positions</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"fixtureTypeOptions\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n placeholder=\"Select fixture position\"\r\n formControlName=\"fixtureType\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Fixtures</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n </div>\r\n <div class=\"slots-list\">\r\n <div\r\n *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedSlotIndex === s\"\r\n (click)=\"selectSlot(s)\"\r\n >\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"fw-bold small\">\r\n Fixture {{ $any(slot).get('slotIndex')?.value }} \u2014 {{ $any(slot).get('slotType')?.value }}\r\n </span>\r\n <span class=\"text-muted small\">\r\n {{ $any(slot).get('brand')?.value || '(no brand)' }} \u00B7\r\n {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noLook>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Right: selected slot \u2014 placements editor -->\r\n <div class=\"col-md-6\">\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture Type</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Brand</label>\r\n <lib-searchable-select\r\n [items]=\"brandItems\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Select brand\"\r\n formControlName=\"brand\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Header</label>\r\n <lib-searchable-select\r\n [items]=\"fixtureHeaderItems\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Select fixture header\"\r\n formControlName=\"fixtureLevelZone\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Templates</label>\r\n <multiselect-chip-dropdown\r\n class=\"fixture-libraries-select\"\r\n [items]=\"fixtureLibraryItemsForSlot\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n [search]=\"true\"\r\n searchField=\"name\"\r\n placeholder=\"Select fixture templates\"\r\n formControlName=\"fixtureLibraryRefs\">\r\n </multiselect-chip-dropdown>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n Showing floor fixtures (eurocenter slot).\r\n </small>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n Showing wall fixtures (shelf slot).\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n </div>\r\n <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n </div>\r\n <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n <div\r\n *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n class=\"placement-row mb-2\"\r\n [formGroupName]=\"pi\"\r\n >\r\n <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n <option value=\"pid\">Product Merchandising</option>\r\n <option value=\"vm\">Visual Merchandising</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmTypeOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Type\"\r\n formControlName=\"position\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Artwork\"\r\n formControlName=\"rawValue\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n <ng-template #pidInputs>\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n <option value=\"\">Position</option>\r\n <option value=\"Top\">Top</option>\r\n <option value=\"Mid\">Mid</option>\r\n <option value=\"Bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"productOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n [multiple]=\"true\"\r\n placeholder=\"Product / SKU\"\r\n formControlName=\"rawValues\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-template>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noSlot>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Per-slot Fixture Library Configuration card -->\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n <div class=\"library-chips\">\r\n <button\r\n *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n type=\"button\"\r\n class=\"library-chip\"\r\n [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n {{ lib.name }}\r\n </button>\r\n </div>\r\n <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details\u2026</div>\r\n\r\n <!--\r\n Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n a switch as a new item \u2014 that forces the embedded template-products\r\n / template-vms components to remount and rerun their ngOnInit\r\n (otherwise their `isPageLoading` guard skips the form rebuild).\r\n -->\r\n <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'products'\"\r\n (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n </li>\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'vms'\"\r\n (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"embeddedTab === 'products'\">\r\n <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n </div>\r\n <div *ngIf=\"embeddedTab === 'vms'\">\r\n <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</section>\r\n", styles: [".access-denied .access-denied-icon i{font-size:48px;color:#ef4444;line-height:1}.look-form .col-md-3>.card,.look-form .col-md-6>.card{display:flex!important;flex-direction:column;height:85vh!important;min-height:720px}.look-form .looks-tree,.look-form .slots-list,.look-form .placements-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.look-form .look-row,.look-form .slot-row{cursor:pointer;border:1px solid transparent;background:#f9fafb;transition:filter .15s ease,box-shadow .15s ease,border-color .15s ease}.look-form .look-row:hover,.look-form .slot-row:hover{filter:brightness(.96)}.look-form .look-row.selected,.look-form .slot-row.selected{filter:brightness(.96);outline:1px solid rgba(14,165,233,.55);outline-offset:-1px}.look-form .bucket-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}.look-form .look-row-actions{flex-shrink:0;display:flex;align-items:center;gap:2px;opacity:0;transition:opacity .15s ease}.look-form .look-row-actions .row-action-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:0;border-radius:6px;background:transparent;color:#94a3b8;cursor:pointer;transition:background-color .15s ease,color .15s ease}.look-form .look-row-actions .row-action-btn i{font-size:13px;line-height:1}.look-form .look-row-actions .row-action-btn:hover{background:#fff}.look-form .look-row-actions .row-action-btn.duplicate:hover{color:#0ea5e9}.look-form .look-row-actions .row-action-btn.remove:hover{color:#ef4444}.look-form .look-row:hover .look-row-actions,.look-form .look-row.selected .look-row-actions{opacity:1}.look-form .fixture-type-badge{display:inline-block;flex-shrink:0;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:600;line-height:14px;letter-spacing:.2px;border:1px solid transparent;white-space:nowrap}.look-form .fixture-type-badge.badge-wall{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.look-form .fixture-type-badge.badge-floor{background:#fed7aa;color:#9a3412;border-color:#fdba74}.look-form .fixture-type-badge.badge-mixed{background:#ede9fe;color:#6d28d9;border-color:#c4b5fd}.look-form .fixture-libraries-select{display:block}.look-form .fixture-libraries-select ::ng-deep .multiselect-container{align-items:flex-start}.look-form .fixture-libraries-select ::ng-deep .chip-list{max-height:84px;overflow-y:auto;padding-right:4px}.look-form .cad-header-variants-input{display:block}.look-form .cad-header-variants-input ::ng-deep .chips-input{max-height:84px;overflow-y:auto;align-content:flex-start;padding-right:4px}.look-form .placement-row .placement-fields .ph-field{flex:1 1 0;min-width:0}.look-form .placement-row .placement-fields .ph-remove{flex:0 0 auto}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multiselect-container{padding:4px 10px;min-height:31px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .chip-list{min-height:21px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multi-placeholder{font-size:13px;line-height:21px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.look-form .library-config-card .library-chips{display:flex;flex-wrap:wrap;gap:8px}.look-form .library-config-card .library-chip{background:#f1f5f9;border:1px solid #cbd5e1;color:#1e293b;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.look-form .library-config-card .library-chip:hover{background:#e2e8f0;border-color:#94a3b8}.look-form .library-config-card .library-chip.active{background:#0ea5e9;border-color:#0284c7;color:#fff}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col-8>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products input[readonly]{background-color:var(--bs-gray-200, #e9ecef);cursor:not-allowed}.look-form .library-config-card .fixture-preview{border:1px solid #e2e8f0;border-radius:8px;background:#fff;padding:12px}.look-form .library-config-card .fixture-preview .fx-header,.look-form .library-config-card .fixture-preview .fx-footer{background:#f1f5f9;border:1px dashed #cbd5e1;border-radius:6px;padding:6px 10px;font-size:12px;color:#475569;text-align:center;margin:4px 0}.look-form .library-config-card .fixture-preview .fx-body{display:flex;flex-direction:column;gap:4px;padding:4px 0}.look-form .library-config-card .fixture-preview .fx-shelf{background:linear-gradient(180deg,#f8fafc,#eef2f7);border:1px solid #cbd5e1;border-radius:4px;padding:8px 10px;display:flex;align-items:center;gap:8px;font-size:13px;min-height:36px}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-badge{background:#0ea5e9;color:#fff;font-weight:700;padding:2px 8px;border-radius:999px;font-size:11px;flex-shrink:0}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-label{font-weight:500;color:#1e293b}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-meta{color:#64748b;font-size:11px;margin-left:auto}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray{background:linear-gradient(180deg,#fef3c7,#fde68a);border-color:#f59e0b}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray .fx-shelf-badge{background:#d97706}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly{background:linear-gradient(180deg,#ede9fe,#ddd6fe);border-color:#8b5cf6}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly .fx-shelf-badge{background:#7c3aed}.look-form .library-config-card .fixture-preview .fx-dims{text-align:center}.look-form .library-config-card .shelf-mappings{max-height:70vh;overflow-y:auto;padding-right:4px}.look-form .library-config-card .shelf-mappings .shelf-mapping{border:1px solid #e5e7eb;border-radius:8px;padding:12px;background:#f9fafb}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i8.MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField", "maxSelection", "compact", "extraActionLabel", "extraActionActive", "disabled"], outputs: ["extraActionClick"] }, { kind: "component", type: i9.TemplateProductsComponent, selector: "lib-template-products", inputs: ["looksMode"] }, { kind: "component", type: i10.SearchableSelectComponent, selector: "lib-searchable-select", inputs: ["items", "idField", "nameField", "searchField", "placeholder", "multiple", "compact"] }, { kind: "component", type: i11.ChipsInputComponent, selector: "lib-chips-input", inputs: ["placeholder", "allowDuplicates"] }, { kind: "component", type: i12.TemplateVmsComponent, selector: "lib-template-vms", inputs: ["looksMode"] }] });
1304
1462
  }
1305
1463
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LookPlanoCollectionFormComponent, decorators: [{
1306
1464
  type: Component,
1307
- args: [{ selector: 'lib-look-plano-collection-form', template: "<section class=\"look-form\">\r\n <!-- Top bar (bound to the outer form) -->\r\n <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label fw-bold\">Name *</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n </div>\r\n <div class=\"col-md-5\">\r\n <label class=\"form-label fw-bold\">Description</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n </div>\r\n <div class=\"col-md-1 text-center\">\r\n <label class=\"form-label fw-bold d-block\">Active</label>\r\n <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n </div>\r\n <div class=\"col-md-2 text-end\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n {{ saving ? 'Saving\u2026' : 'Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Three-pane editor -->\r\n <div class=\"row mx-0 g-3\">\r\n <!-- Left: Looks list (no form binding needed \u2014 just navigation) -->\r\n <div class=\"col-md-3\">\r\n <div class=\"card p-3 h-100\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n </div>\r\n <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n <div class=\"looks-tree\">\r\n <div\r\n *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedLookIndex === i\"\r\n [style.background-color]=\"bucketColor($any(look))\"\r\n (click)=\"selectLook(i)\"\r\n >\r\n <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n <ng-container *ngIf=\"fixtureTypeBadge($any(look)) as ftb\">\r\n <span class=\"fixture-type-badge\" [ngClass]=\"ftb.cls\">{{ ftb.label }}</span>\r\n </ng-container>\r\n </span>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeLook(i)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Centre: selected Look metadata + slots -->\r\n <div class=\"col-md-3\">\r\n <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">MBQ bucket</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"mbqBucket\" placeholder=\"e.g. JJ / OD Eye\" />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture count *</label>\r\n <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">CAD Header Varients</label>\r\n <lib-chips-input\r\n class=\"cad-header-variants-input\"\r\n formControlName=\"cadHeaderVariants\"\r\n placeholder=\"Type a variant and press Enter\">\r\n </lib-chips-input>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Positions</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"fixtureTypeOptions\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n placeholder=\"Select fixture position\"\r\n formControlName=\"fixtureType\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Fixtures</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n </div>\r\n <div class=\"slots-list\">\r\n <div\r\n *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedSlotIndex === s\"\r\n (click)=\"selectSlot(s)\"\r\n >\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"fw-bold small\">\r\n Fixture {{ $any(slot).get('slotIndex')?.value }} \u2014 {{ $any(slot).get('slotType')?.value }}\r\n </span>\r\n <span class=\"text-muted small\">\r\n {{ $any(slot).get('brand')?.value || '(no brand)' }} \u00B7\r\n {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noLook>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Right: selected slot \u2014 placements editor -->\r\n <div class=\"col-md-6\">\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture Type</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Brand</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"brand\" placeholder=\"John Jacobs\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Header</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" formControlName=\"fixtureLevelZone\" placeholder=\"Premium Trending\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Templates</label>\r\n <multiselect-chip-dropdown\r\n class=\"fixture-libraries-select\"\r\n [items]=\"fixtureLibraryItemsForSlot\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n [search]=\"true\"\r\n searchField=\"name\"\r\n placeholder=\"Select fixture templates\"\r\n formControlName=\"fixtureLibraryRefs\">\r\n </multiselect-chip-dropdown>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n Showing floor fixtures (eurocenter slot).\r\n </small>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n Showing wall fixtures (shelf slot).\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n </div>\r\n <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n </div>\r\n <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n <div\r\n *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n class=\"placement-row mb-2\"\r\n [formGroupName]=\"pi\"\r\n >\r\n <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n <option value=\"pid\">Product Merchandising</option>\r\n <option value=\"vm\">Visual Merchandising</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmTypeOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Type\"\r\n formControlName=\"position\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Artwork\"\r\n formControlName=\"rawValue\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n <ng-template #pidInputs>\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n <option value=\"\">Position</option>\r\n <option value=\"Top\">Top</option>\r\n <option value=\"Mid\">Mid</option>\r\n <option value=\"Bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"productOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n [multiple]=\"true\"\r\n placeholder=\"Product / SKU\"\r\n formControlName=\"rawValues\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-template>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noSlot>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Per-slot Fixture Library Configuration card -->\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n <div class=\"library-chips\">\r\n <button\r\n *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n type=\"button\"\r\n class=\"library-chip\"\r\n [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n {{ lib.name }}\r\n </button>\r\n </div>\r\n <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details\u2026</div>\r\n\r\n <!--\r\n Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n a switch as a new item \u2014 that forces the embedded template-products\r\n / template-vms components to remount and rerun their ngOnInit\r\n (otherwise their `isPageLoading` guard skips the form rebuild).\r\n -->\r\n <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'products'\"\r\n (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n </li>\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'vms'\"\r\n (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"embeddedTab === 'products'\">\r\n <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n </div>\r\n <div *ngIf=\"embeddedTab === 'vms'\">\r\n <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</section>\r\n", styles: [".look-form .col-md-3>.card,.look-form .col-md-6>.card{display:flex!important;flex-direction:column;height:85vh!important;min-height:720px}.look-form .looks-tree,.look-form .slots-list,.look-form .placements-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.look-form .look-row,.look-form .slot-row{cursor:pointer;border:1px solid transparent;background:#f9fafb;transition:filter .15s ease,box-shadow .15s ease,border-color .15s ease}.look-form .look-row:hover,.look-form .slot-row:hover{filter:brightness(.96)}.look-form .look-row.selected,.look-form .slot-row.selected{filter:brightness(.96);outline:1px solid rgba(14,165,233,.55);outline-offset:-1px}.look-form .bucket-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}.look-form .fixture-type-badge{display:inline-block;flex-shrink:0;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:600;line-height:14px;letter-spacing:.2px;border:1px solid transparent;white-space:nowrap}.look-form .fixture-type-badge.badge-wall{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.look-form .fixture-type-badge.badge-floor{background:#fed7aa;color:#9a3412;border-color:#fdba74}.look-form .fixture-type-badge.badge-mixed{background:#ede9fe;color:#6d28d9;border-color:#c4b5fd}.look-form .fixture-libraries-select{display:block}.look-form .fixture-libraries-select ::ng-deep .multiselect-container{align-items:flex-start}.look-form .fixture-libraries-select ::ng-deep .chip-list{max-height:84px;overflow-y:auto;padding-right:4px}.look-form .cad-header-variants-input{display:block}.look-form .cad-header-variants-input ::ng-deep .chips-input{max-height:84px;overflow-y:auto;align-content:flex-start;padding-right:4px}.look-form .placement-row .placement-fields .ph-field{flex:1 1 0;min-width:0}.look-form .placement-row .placement-fields .ph-remove{flex:0 0 auto}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multiselect-container{padding:4px 10px;min-height:31px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .chip-list{min-height:21px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multi-placeholder{font-size:13px;line-height:21px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.look-form .library-config-card .library-chips{display:flex;flex-wrap:wrap;gap:8px}.look-form .library-config-card .library-chip{background:#f1f5f9;border:1px solid #cbd5e1;color:#1e293b;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.look-form .library-config-card .library-chip:hover{background:#e2e8f0;border-color:#94a3b8}.look-form .library-config-card .library-chip.active{background:#0ea5e9;border-color:#0284c7;color:#fff}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col-8>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products input[readonly]{background-color:var(--bs-gray-200, #e9ecef);cursor:not-allowed}.look-form .library-config-card .fixture-preview{border:1px solid #e2e8f0;border-radius:8px;background:#fff;padding:12px}.look-form .library-config-card .fixture-preview .fx-header,.look-form .library-config-card .fixture-preview .fx-footer{background:#f1f5f9;border:1px dashed #cbd5e1;border-radius:6px;padding:6px 10px;font-size:12px;color:#475569;text-align:center;margin:4px 0}.look-form .library-config-card .fixture-preview .fx-body{display:flex;flex-direction:column;gap:4px;padding:4px 0}.look-form .library-config-card .fixture-preview .fx-shelf{background:linear-gradient(180deg,#f8fafc,#eef2f7);border:1px solid #cbd5e1;border-radius:4px;padding:8px 10px;display:flex;align-items:center;gap:8px;font-size:13px;min-height:36px}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-badge{background:#0ea5e9;color:#fff;font-weight:700;padding:2px 8px;border-radius:999px;font-size:11px;flex-shrink:0}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-label{font-weight:500;color:#1e293b}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-meta{color:#64748b;font-size:11px;margin-left:auto}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray{background:linear-gradient(180deg,#fef3c7,#fde68a);border-color:#f59e0b}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray .fx-shelf-badge{background:#d97706}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly{background:linear-gradient(180deg,#ede9fe,#ddd6fe);border-color:#8b5cf6}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly .fx-shelf-badge{background:#7c3aed}.look-form .library-config-card .fixture-preview .fx-dims{text-align:center}.look-form .library-config-card .shelf-mappings{max-height:70vh;overflow-y:auto;padding-right:4px}.look-form .library-config-card .shelf-mappings .shelf-mapping{border:1px solid #e5e7eb;border-radius:8px;padding:12px;background:#f9fafb}\n"] }]
1465
+ args: [{ selector: 'lib-look-plano-collection-form', template: "<div *ngIf=\"!accessChecked\" class=\"card p-5 m-4 text-center text-muted\">Checking access\u2026</div>\r\n\r\n<div *ngIf=\"accessChecked && !allowed\" class=\"card p-5 m-4\">\r\n <div class=\"access-denied text-center py-10\">\r\n <div class=\"access-denied-icon mb-4\"><i class=\"bi bi-shield-lock\"></i></div>\r\n <h3 class=\"mb-2\">Access denied</h3>\r\n <p class=\"text-muted mb-0\">\r\n You don't have permission to access Looks. Contact your administrator\r\n to be added to the allowed users list.\r\n </p>\r\n </div>\r\n</div>\r\n\r\n<section class=\"look-form\" *ngIf=\"accessChecked && allowed\">\r\n <!-- Top bar (bound to the outer form) -->\r\n <div class=\"card p-4 mb-4\" [formGroup]=\"form\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-md-4\">\r\n <label class=\"form-label fw-bold\">Name *</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\" placeholder=\"e.g. Master Look Plan FY26\" />\r\n </div>\r\n <div class=\"col-md-5\">\r\n <label class=\"form-label fw-bold\">Description</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"description\" placeholder=\"Optional description\" />\r\n </div>\r\n <div class=\"col-md-1 text-center\">\r\n <label class=\"form-label fw-bold d-block\">Active</label>\r\n <input type=\"checkbox\" class=\"form-check-input\" formControlName=\"isActive\" />\r\n </div>\r\n <div class=\"col-md-2 text-end\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"cancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" [disabled]=\"saving\" (click)=\"save()\">\r\n {{ saving ? 'Saving\u2026' : 'Save' }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Three-pane editor -->\r\n <div class=\"row mx-0 g-3\">\r\n <!-- Left: Looks list (no form binding needed \u2014 just navigation) -->\r\n <div class=\"col-md-3\">\r\n <div class=\"card p-3 h-100\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-3\">\r\n <h6 class=\"m-0\">MBQ Bucket - Fixture Combinations</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" (click)=\"addLook()\">+ Add Look</button>\r\n </div>\r\n <div *ngIf=\"looks.length === 0\" class=\"text-muted small\">No looks yet. Add one to start.</div>\r\n <div class=\"looks-tree\">\r\n <div\r\n *ngFor=\"let look of looks.controls; let i = index; trackBy: trackByIndex\"\r\n class=\"look-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedLookIndex === i\"\r\n [style.background-color]=\"bucketColor($any(look))\"\r\n (click)=\"selectLook(i)\"\r\n >\r\n <span class=\"d-flex align-items-center gap-2 text-truncate\">\r\n <span class=\"bucket-dot\" [style.background-color]=\"bucketColor($any(look))\"></span>\r\n <span class=\"text-truncate\">{{ lookTitle($any(look)) }}</span>\r\n <ng-container *ngIf=\"fixtureTypeBadge($any(look)) as ftb\">\r\n <span class=\"fixture-type-badge\" [ngClass]=\"ftb.cls\">{{ ftb.label }}</span>\r\n </ng-container>\r\n </span>\r\n <span class=\"look-row-actions\">\r\n <button type=\"button\" class=\"row-action-btn duplicate\" title=\"Duplicate look\"\r\n (click)=\"$event.stopPropagation(); duplicateLook(i)\">\r\n <i class=\"bi bi-files\"></i>\r\n </button>\r\n <button type=\"button\" class=\"row-action-btn remove\" title=\"Remove look\"\r\n (click)=\"$event.stopPropagation(); removeLook(i)\">\r\n <i class=\"bi bi-trash3\"></i>\r\n </button>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Centre: selected Look metadata + slots -->\r\n <div class=\"col-md-3\">\r\n <ng-container *ngIf=\"selectedLookGroup as lookGroup; else noLook\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"lookGroup\">\r\n <h6 class=\"mb-3\">Fixture Combination Details</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">MBQ bucket</label>\r\n <lib-searchable-select\r\n [items]=\"mbqBucketItems\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Select MBQ bucket\"\r\n formControlName=\"mbqBucket\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture count *</label>\r\n <input type=\"number\" min=\"0\" max=\"30\" class=\"form-control form-control-sm\" formControlName=\"fixtureCount\" />\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">CAD Header Varients</label>\r\n <lib-chips-input\r\n class=\"cad-header-variants-input\"\r\n formControlName=\"cadHeaderVariants\"\r\n placeholder=\"Type a variant and press Enter\">\r\n </lib-chips-input>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Positions</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"fixtureTypeOptions\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n placeholder=\"Select fixture position\"\r\n formControlName=\"fixtureType\">\r\n </multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Fixtures</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addSlot()\">+ Add Fixture</button>\r\n </div>\r\n <div class=\"slots-list\">\r\n <div\r\n *ngFor=\"let slot of (selectedSlotsArray?.controls || []); let s = index; trackBy: trackByIndex\"\r\n class=\"slot-row d-flex justify-content-between align-items-center px-2 py-2 mb-1 rounded\"\r\n [class.selected]=\"selectedSlotIndex === s\"\r\n (click)=\"selectSlot(s)\"\r\n >\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"fw-bold small\">\r\n Fixture {{ $any(slot).get('slotIndex')?.value }} \u2014 {{ $any(slot).get('slotType')?.value }}\r\n </span>\r\n <span class=\"text-muted small\">\r\n {{ $any(slot).get('brand')?.value || '(no brand)' }} \u00B7\r\n {{ $any(slot).get('fixtureLevelZone')?.value || '(no zone)' }}\r\n </span>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ms-2\" (click)=\"$event.stopPropagation(); removeSlot(s)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noLook>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select or add a Look to edit it.</div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Right: selected slot \u2014 placements editor -->\r\n <div class=\"col-md-6\">\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroup; else noSlot\">\r\n <div class=\"card p-3 h-100\" [formGroup]=\"slotGroup\">\r\n <h6 class=\"mb-3\">Fixture {{ selectedSlotIndex + 1 }} - Definition</h6>\r\n\r\n <div class=\"row g-2 mb-3\">\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small text-muted\">Slot index (auto)</label>\r\n <input type=\"text\" class=\"form-control form-control-sm\" [value]=\"selectedSlotIndex + 1\" readonly disabled />\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Fixture Type</label>\r\n <select class=\"form-select form-select-sm\" formControlName=\"slotType\">\r\n <option *ngFor=\"let opt of availableSlotTypes\" [value]=\"opt.id\">{{ opt.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"form-label small\">Brand</label>\r\n <lib-searchable-select\r\n [items]=\"brandItems\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Select brand\"\r\n formControlName=\"brand\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Header</label>\r\n <lib-searchable-select\r\n [items]=\"fixtureHeaderItems\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Select fixture header\"\r\n formControlName=\"fixtureLevelZone\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <label class=\"form-label small\">Fixture Templates</label>\r\n <multiselect-chip-dropdown\r\n class=\"fixture-libraries-select\"\r\n [items]=\"fixtureLibraryItemsForSlot\"\r\n idField=\"id\"\r\n nameField=\"name\"\r\n [search]=\"true\"\r\n searchField=\"name\"\r\n placeholder=\"Select fixture templates\"\r\n formControlName=\"fixtureLibraryRefs\">\r\n </multiselect-chip-dropdown>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value === 'eurocenter'\">\r\n Showing floor fixtures (eurocenter slot).\r\n </small>\r\n <small class=\"text-muted\" *ngIf=\"slotGroup.get('slotType')?.value !== 'eurocenter'\">\r\n Showing wall fixtures (shelf slot).\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <hr />\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mb-2\">\r\n <h6 class=\"m-0\">Look and Visual Merchandising Placements</h6>\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"addPlacement()\">+ Add placement</button>\r\n </div>\r\n <div *ngIf=\"(selectedPlacements?.length || 0) === 0\" class=\"text-muted small mb-2\">\r\n No placements yet. Click <strong>+ Add placement</strong> to add one.\r\n </div>\r\n <div class=\"placements-scroll\" formArrayName=\"placements\">\r\n <div\r\n *ngFor=\"let p of (selectedPlacements?.controls || []); let pi = index; trackBy: trackByIndex\"\r\n class=\"placement-row mb-2\"\r\n [formGroupName]=\"pi\"\r\n >\r\n <div class=\"d-flex align-items-start gap-2 placement-fields\">\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"kind\">\r\n <option value=\"pid\">Product Merchandising</option>\r\n <option value=\"vm\">Visual Merchandising</option>\r\n </select>\r\n </div>\r\n\r\n <!-- Visual Merchandising rows: VM Type (single) + VM Artwork (single) -->\r\n <ng-container *ngIf=\"$any(p).get('kind')?.value === 'vm'; else pidInputs\">\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmTypeOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Type\"\r\n formControlName=\"position\">\r\n </lib-searchable-select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"vmArtworkOptionsFor($any(p).get('position')?.value)\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n placeholder=\"Visual Merchandising Artwork\"\r\n formControlName=\"rawValue\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Product Merchandising rows: Top/Mid/Bottom position + multi-select product/SKU -->\r\n <ng-template #pidInputs>\r\n <div class=\"ph-field\">\r\n <select class=\"form-select form-select-sm\" formControlName=\"position\">\r\n <option value=\"\">Position</option>\r\n <option value=\"Top\">Top</option>\r\n <option value=\"Mid\">Mid</option>\r\n <option value=\"Bottom\">Bottom</option>\r\n </select>\r\n </div>\r\n <div class=\"ph-field\">\r\n <lib-searchable-select\r\n [items]=\"productOptions\"\r\n idField=\"value\"\r\n nameField=\"label\"\r\n [multiple]=\"true\"\r\n placeholder=\"Product / SKU\"\r\n formControlName=\"rawValues\">\r\n </lib-searchable-select>\r\n </div>\r\n </ng-template>\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-light-danger ph-remove\" (click)=\"removePlacement(pi)\">\u00D7</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #noSlot>\r\n <div class=\"card p-5 h-100 text-center text-muted\">Select a fixture slot to edit placements.</div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Per-slot Fixture Library Configuration card -->\r\n <ng-container *ngIf=\"selectedSlotGroup as slotGroupForMap\">\r\n <div class=\"card p-4 mt-4 library-config-card\" [formGroup]=\"slotGroupForMap\">\r\n <div class=\"mb-4\">\r\n <h5 class=\"form-label d-block mb-3\">Fixture library</h5>\r\n <div class=\"library-chips\">\r\n <button\r\n *ngFor=\"let lib of selectedSlotLibrariesForDropdown\"\r\n type=\"button\"\r\n class=\"library-chip\"\r\n [class.active]=\"selectedLibraryIdInMap === lib.id\"\r\n (click)=\"onLibraryMapSelect(selectedLibraryIdInMap === lib.id ? '' : lib.id)\">\r\n {{ lib.name }}\r\n </button>\r\n </div>\r\n <small *ngIf=\"selectedSlotLibrariesForDropdown.length === 0\" class=\"text-muted\">\r\n No libraries linked to this slot yet. Add some in the \"Fixture libraries\" multiselect above.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"loadingLibraryDetails\" class=\"text-muted\">Loading fixture details\u2026</div>\r\n\r\n <!--\r\n Use *ngFor + trackBy keyed on (look, slot, library) so Angular treats\r\n a switch as a new item \u2014 that forces the embedded template-products\r\n / template-vms components to remount and rerun their ngOnInit\r\n (otherwise their `isPageLoading` guard skips the form rebuild).\r\n -->\r\n <ng-container *ngFor=\"let _ of embeddedHostKeys; trackBy: trackByEmbeddedKey\">\r\n <ul class=\"nav nav-tabs custom-tabs mb-3\">\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'products'\"\r\n (click)=\"embeddedTab = 'products'\">Product Merchandising</button>\r\n </li>\r\n <li class=\"nav-item\">\r\n <button type=\"button\" class=\"nav-link\"\r\n [class.active]=\"embeddedTab === 'vms'\"\r\n (click)=\"embeddedTab = 'vms'\">Visual Merchandising</button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"embeddedTab === 'products'\">\r\n <lib-template-products [looksMode]=\"true\"></lib-template-products>\r\n </div>\r\n <div *ngIf=\"embeddedTab === 'vms'\">\r\n <lib-template-vms [looksMode]=\"true\"></lib-template-vms>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</section>\r\n", styles: [".access-denied .access-denied-icon i{font-size:48px;color:#ef4444;line-height:1}.look-form .col-md-3>.card,.look-form .col-md-6>.card{display:flex!important;flex-direction:column;height:85vh!important;min-height:720px}.look-form .looks-tree,.look-form .slots-list,.look-form .placements-scroll{flex:1 1 auto;min-height:0;overflow-y:auto}.look-form .look-row,.look-form .slot-row{cursor:pointer;border:1px solid transparent;background:#f9fafb;transition:filter .15s ease,box-shadow .15s ease,border-color .15s ease}.look-form .look-row:hover,.look-form .slot-row:hover{filter:brightness(.96)}.look-form .look-row.selected,.look-form .slot-row.selected{filter:brightness(.96);outline:1px solid rgba(14,165,233,.55);outline-offset:-1px}.look-form .bucket-dot{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}.look-form .look-row-actions{flex-shrink:0;display:flex;align-items:center;gap:2px;opacity:0;transition:opacity .15s ease}.look-form .look-row-actions .row-action-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;border:0;border-radius:6px;background:transparent;color:#94a3b8;cursor:pointer;transition:background-color .15s ease,color .15s ease}.look-form .look-row-actions .row-action-btn i{font-size:13px;line-height:1}.look-form .look-row-actions .row-action-btn:hover{background:#fff}.look-form .look-row-actions .row-action-btn.duplicate:hover{color:#0ea5e9}.look-form .look-row-actions .row-action-btn.remove:hover{color:#ef4444}.look-form .look-row:hover .look-row-actions,.look-form .look-row.selected .look-row-actions{opacity:1}.look-form .fixture-type-badge{display:inline-block;flex-shrink:0;padding:1px 8px;border-radius:999px;font-size:10px;font-weight:600;line-height:14px;letter-spacing:.2px;border:1px solid transparent;white-space:nowrap}.look-form .fixture-type-badge.badge-wall{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.look-form .fixture-type-badge.badge-floor{background:#fed7aa;color:#9a3412;border-color:#fdba74}.look-form .fixture-type-badge.badge-mixed{background:#ede9fe;color:#6d28d9;border-color:#c4b5fd}.look-form .fixture-libraries-select{display:block}.look-form .fixture-libraries-select ::ng-deep .multiselect-container{align-items:flex-start}.look-form .fixture-libraries-select ::ng-deep .chip-list{max-height:84px;overflow-y:auto;padding-right:4px}.look-form .cad-header-variants-input{display:block}.look-form .cad-header-variants-input ::ng-deep .chips-input{max-height:84px;overflow-y:auto;align-content:flex-start;padding-right:4px}.look-form .placement-row .placement-fields .ph-field{flex:1 1 0;min-width:0}.look-form .placement-row .placement-fields .ph-remove{flex:0 0 auto}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multiselect-container{padding:4px 10px;min-height:31px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .chip-list{min-height:21px}.look-form .placement-row .placement-fields ::ng-deep multiselect-chip-dropdown .multi-placeholder{font-size:13px;line-height:21px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.look-form .library-config-card .library-chips{display:flex;flex-wrap:wrap;gap:8px}.look-form .library-config-card .library-chip{background:#f1f5f9;border:1px solid #cbd5e1;color:#1e293b;border-radius:999px;padding:6px 14px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color .15s ease,border-color .15s ease,color .15s ease}.look-form .library-config-card .library-chip:hover{background:#e2e8f0;border-color:#94a3b8}.look-form .library-config-card .library-chip.active{background:#0ea5e9;border-color:#0284c7;color:#fff}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products .cols.col-8>ul.nav.nav-tabs.custom-tabs{display:none!important}.look-form .library-config-card ::ng-deep #fixture-template-products input[readonly]{background-color:var(--bs-gray-200, #e9ecef);cursor:not-allowed}.look-form .library-config-card .fixture-preview{border:1px solid #e2e8f0;border-radius:8px;background:#fff;padding:12px}.look-form .library-config-card .fixture-preview .fx-header,.look-form .library-config-card .fixture-preview .fx-footer{background:#f1f5f9;border:1px dashed #cbd5e1;border-radius:6px;padding:6px 10px;font-size:12px;color:#475569;text-align:center;margin:4px 0}.look-form .library-config-card .fixture-preview .fx-body{display:flex;flex-direction:column;gap:4px;padding:4px 0}.look-form .library-config-card .fixture-preview .fx-shelf{background:linear-gradient(180deg,#f8fafc,#eef2f7);border:1px solid #cbd5e1;border-radius:4px;padding:8px 10px;display:flex;align-items:center;gap:8px;font-size:13px;min-height:36px}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-badge{background:#0ea5e9;color:#fff;font-weight:700;padding:2px 8px;border-radius:999px;font-size:11px;flex-shrink:0}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-label{font-weight:500;color:#1e293b}.look-form .library-config-card .fixture-preview .fx-shelf .fx-shelf-meta{color:#64748b;font-size:11px;margin-left:auto}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray{background:linear-gradient(180deg,#fef3c7,#fde68a);border-color:#f59e0b}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-tray .fx-shelf-badge{background:#d97706}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly{background:linear-gradient(180deg,#ede9fe,#ddd6fe);border-color:#8b5cf6}.look-form .library-config-card .fixture-preview .fx-shelf.fx-shelf-vmonly .fx-shelf-badge{background:#7c3aed}.look-form .library-config-card .fixture-preview .fx-dims{text-align:center}.look-form .library-config-card .shelf-mappings{max-height:70vh;overflow-y:auto;padding-right:4px}.look-form .library-config-card .shelf-mappings .shelf-mapping{border:1px solid #e5e7eb;border-radius:8px;padding:12px;background:#f9fafb}\n"] }]
1308
1466
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.GlobalStateService }, { type: i4.StoreBuilderService }, { type: i5.ToastService }, { type: i3.PageInfoService }, { type: i6.PlanoDataService }] });
1309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0vbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0vbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFxQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQVd2RSxNQUFNLE9BQU8sZ0NBQWdDO0lBa2VqQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBeGVWLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDZCxZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ2IsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsSUFBSSxDQUFhO0lBQ2pCLGlCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQy9CLGlCQUFpQixHQUFXLENBQUMsQ0FBQyxDQUFDO0lBRS9CLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsZ0ZBQWdGO0lBQ3ZFLGtCQUFrQixHQUFHO1FBQzVCLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1FBQzdCLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0tBQ3BDLENBQUM7SUFFRixtQkFBbUIsR0FBd0QsRUFBRSxDQUFDO0lBRTlFLG1DQUFtQztJQUNuQyxhQUFhLEdBQXVDLEVBQUUsQ0FBQztJQUN2RCxnQkFBZ0IsR0FBd0QsRUFBRSxDQUFDO0lBQzNFLGNBQWMsR0FBdUMsRUFBRSxDQUFDO0lBQ3hEO2tFQUM4RDtJQUN0RCxlQUFlLEdBQW9ELElBQUksR0FBRyxFQUFFLENBQUM7SUFDckY7a0ZBQzhFO0lBQ3RFLGNBQWMsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RDs7OztPQUlHO0lBQ0gsMEJBQTBCLEdBQXdELEVBQUUsQ0FBQztJQUVyRiw2REFBNkQ7SUFDN0Qsc0JBQXNCLEdBQVcsRUFBRSxDQUFDO0lBQ3BDLHNCQUFzQixHQUFRLElBQUksQ0FBQztJQUNuQyxxQkFBcUIsR0FBWSxLQUFLLENBQUM7SUFDdkMsV0FBVyxHQUF1QixVQUFVLENBQUM7SUFFN0MscURBQXFEO0lBRXJELHFFQUFxRTtJQUNyRSxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxJQUFrQjtRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBcUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE9BQU8sR0FBRyxDQUFDLFFBQVE7YUFDZCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDbkIsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDO2FBQ25ELEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQixFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVE7WUFDZCxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7U0FDaEUsQ0FBQyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQ7K0RBQzJEO0lBQzNELElBQUksZ0NBQWdDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxHQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25FLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsd0ZBQXdGO0lBQ3hGLElBQUksMEJBQTBCO1FBQzVCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEUsQ0FBQztJQUVELG1GQUFtRjtJQUNuRiw4QkFBOEI7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDeEQsT0FBTyxPQUFPLENBQUMsUUFBUTthQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQWMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssS0FBSyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQ7MERBQ3NEO0lBQzlDLGVBQWU7UUFDckIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLDBFQUEwRTtRQUMxRSx1RUFBdUU7UUFDdkUseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEO2tGQUM4RTtJQUN0RSxzQkFBc0I7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixNQUFNLElBQUksR0FBYSxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3JCLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLE9BQU87WUFBRSxPQUFPO1FBQ3BELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsNERBQTREO0lBQ3BELGtCQUFrQixDQUFDLEtBQWE7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDL0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUN6RCxPQUFPLEtBQUssRUFBRSxRQUFRLElBQUksSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRCx1RUFBdUU7SUFDL0Qsc0JBQXNCLENBQUMsS0FBYSxFQUFFLFFBQWE7UUFDekQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLE1BQU0sT0FBTyxHQUFVLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsNEVBQTRFO1FBQzVFLE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUM1RCxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ3JEO2FBQU07WUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNLLGVBQWUsQ0FBQyxNQUFjLEVBQUUsV0FBa0I7UUFFeEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUN4QyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FDdEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUN4RDtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQVMsRUFBUyxFQUFFO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQy9ELENBQUM7UUFDSixDQUFDLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDO1FBRXpFLElBQUksSUFBSSxLQUFLLGFBQWEsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1lBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7U0FDckc7UUFDRCxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUN0QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsSUFBSSxVQUFVLENBQUM7WUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNsRjtRQUNELElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRTtZQUNwQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQztZQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQ25GO1FBQ0QsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFO1lBQ3BCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3RSxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQztZQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQ3JGO1FBQ0QsSUFBSSxJQUFJLEtBQUssZ0JBQWdCLEVBQUU7WUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUNuRztRQUNELE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVELDJFQUEyRTtJQUNuRSxXQUFXLENBQUMsTUFBYyxFQUFFLE1BQWM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLE9BQU8sQ0FDTCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDN0IsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxLQUFLLENBQUMsa0NBQWtDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsTUFBTSxJQUFJLEdBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQzthQUMvRCxNQUFNLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRXpCLE1BQU0sVUFBVSxHQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFzQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFNLEVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFdEUsOEVBQThFO1FBQzlFLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQzlDLEtBQUssTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFO1lBQzFCLElBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUTtnQkFBRSxTQUFTO1lBQ2hELE1BQU0sSUFBSSxHQUFhLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTTtnQkFDckUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDeEQ7UUFFRCwwQ0FBMEM7UUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQTJELENBQUM7UUFDcEYsS0FBSyxNQUFNLENBQUMsSUFBSSxVQUFVLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUTtnQkFBRSxTQUFTO1lBQy9ELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQzFCLEtBQUs7YUFDTixDQUFDLENBQUM7U0FDSjtRQUVELGdEQUFnRDtRQUNoRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFeEQseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsOEJBQThCO1FBQzlCLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFDNUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPO1lBQzNDLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQVEsTUFBTSxhQUFhLENBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQ3RELENBQUM7Z0JBQ0YsSUFBSSxHQUFHLEVBQUUsSUFBSTtvQkFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbEQ7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQzFFO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxNQUFNO2dCQUFFLFNBQVM7WUFFdEIsTUFBTSxPQUFPLEdBQVUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUNoRCxPQUFPO29CQUNMLEdBQUcsS0FBSztvQkFDUixJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ3ZDLGdCQUFnQixFQUFFLENBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxDQUFFO2lCQUM5QyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLFdBQVcsR0FBVSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7WUFDL0IsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFO2dCQUM5QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztZQUNILEtBQUssTUFBTSxDQUFFLEdBQUcsRUFBRSxHQUFHLENBQUUsSUFBSSxRQUFRLEVBQUU7Z0JBQ25DLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQUUsU0FBUztnQkFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUMvRCxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSztvQkFDakIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO29CQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtvQkFDbEIsR0FBRyxNQUFNO29CQUNULFFBQVEsRUFBRSxFQUFFO2lCQUNiLENBQUMsQ0FBQzthQUNKO1lBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRTtnQkFDakMsR0FBRyxNQUFNO2dCQUNULFdBQVcsRUFBRSxjQUFjO2dCQUMzQixRQUFRLEVBQUUsV0FBVztnQkFDckIsc0JBQXNCLEVBQUUsSUFBSTthQUM3QixDQUFDLENBQUM7U0FDSjtRQUVELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxzQkFBc0I7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3JCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLENBQUM7UUFDdEMsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQztZQUNoRCxHQUFHLE9BQU87WUFDVixzQkFBc0IsRUFBRSxPQUFPLENBQUMsc0JBQXNCLElBQUksSUFBSTtTQUMvRCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQWE7UUFDcEMsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7WUFDbkMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxPQUFPO1NBQ1I7UUFFRCx1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLHFFQUFxRTtRQUNyRSxxRUFBcUU7UUFDckUsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUVsQyxJQUFJLFVBQVUsR0FBUSxJQUFJLENBQUM7UUFDM0IsSUFBSTtZQUNGLHFFQUFxRTtZQUNyRSxxRUFBcUU7WUFDckUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRCxJQUFJLE9BQU8sRUFBRTtnQkFDWCxJQUFJO29CQUFFLE1BQU0sT0FBTyxDQUFDO2lCQUFFO2dCQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFO2FBQ25EO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLElBQUksS0FBSyxFQUFFO2dCQUNULFVBQVUsR0FBRyxLQUFLLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0wsTUFBTSxHQUFHLEdBQVEsTUFBTSxhQUFhLENBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQ3BELENBQUM7Z0JBQ0YsVUFBVSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO2FBQ2hDO1NBQ0Y7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkQsVUFBVSxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUVELGlFQUFpRTtRQUNqRSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsVUFBVSxDQUFDO1FBQ3pDLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQztnQkFDaEQsR0FBRyxVQUFVO2dCQUNiLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxzQkFBc0IsSUFBSSxJQUFJO2FBQ2xFLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLEdBQVcsRUFBRSxDQUFDO0lBQzdCLGdCQUFnQixHQUFhLEVBQUUsQ0FBQztJQUNoQyw2RUFBNkU7SUFDN0UsMkVBQTJFO0lBQzNFLHdEQUF3RDtJQUNoRCxtQkFBbUIsR0FBRyxDQUFDLENBQUM7SUFFeEIsdUJBQXVCO1FBQzdCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0gsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQztTQUM1QjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDdEMsNEVBQTRFO1FBQzVFLHNFQUFzRTtRQUN0RSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsQ0FBUyxFQUFFLEdBQVc7UUFDdkMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksa0JBQWtCO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBd0IsQ0FBQztRQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztTQUNoQztRQUNELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDJFQUEyRTtJQUMzRSxnREFBZ0Q7SUFDeEMsTUFBTSxDQUFVLGNBQWMsR0FBc0I7UUFDMUQsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVMsRUFBRSw4QkFBOEI7S0FDMUMsQ0FBQztJQUVNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXZDLFlBQ1UsRUFBZSxFQUNmLEtBQXFCLEVBQ3JCLE1BQWMsRUFDZCxFQUFzQixFQUN0QixjQUFtQyxFQUNuQyxLQUFtQixFQUNuQixRQUF5QixFQUN6QixnQkFBa0M7UUFQbEMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBcUI7UUFDbkMsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQ3pDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQixrRUFBa0U7UUFDbEUsbUVBQW1FO1FBQ25FLHVFQUF1RTtRQUN2RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCO2FBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCO2dCQUFFLE9BQU87WUFDbEQscUVBQXFFO1lBQ3JFLGtFQUFrRTtZQUNsRSxzREFBc0Q7WUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU87WUFDL0IsOERBQThEO1lBQzlELHNFQUFzRTtZQUN0RSxvRUFBb0U7WUFDcEUsb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3ZFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxFQUFFLE1BQU0sSUFBSSxhQUFhLEVBQUUsTUFBTSxDQUFDO1lBQ3RELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDMUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25ELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDdEIsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ2pELG1CQUFtQixFQUFFLE9BQU87WUFDNUIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQzNCLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUscUNBQXFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO1lBQ3hHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtZQUMzRCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtZQUN4RixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7WUFDM0QsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO1NBQ2hFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN4QixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUMvQixXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakIsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFjLENBQUM7SUFDN0MsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFpQjtRQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQWMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsVUFBVSxDQUFDLFNBQWlCLEVBQUUsU0FBaUI7UUFDN0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFjLENBQUM7SUFDbkYsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQzlFLENBQUMsQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQWU7WUFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRCxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsTUFBTTtZQUN6RSxDQUFDLENBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQWU7WUFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RCxDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQVksRUFBRTtRQUM1QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07WUFDNUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQ25CLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJHLDBFQUEwRTtRQUMxRSx1RUFBdUU7UUFDdkUsMEVBQTBFO1FBQzFFLFFBQVE7UUFDUixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzVELENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCO1lBQ3hCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUNsQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ3hELE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDdkYsQ0FBQyxDQUFDO1FBRUwsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDOUIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7WUFDaEMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDakMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7WUFDekMsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEUsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUM7WUFDOUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7WUFDbkMsaUJBQWlCLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNyQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1NBQ25DLENBQUMsQ0FBQztRQUVILDBFQUEwRTtRQUMxRSxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBRSxDQUFDLFlBQVk7YUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQWMsQ0FBQztZQUM1RCxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFO2dCQUMvQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDekU7WUFDRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFO2dCQUMvQixRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDeEM7WUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEMscURBQXFEO1lBQ3JELElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ3RGLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDN0I7cUJBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRTtvQkFDcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2lCQUM5QztxQkFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7b0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7aUJBQzVCO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxlQUFlLENBQUMsT0FBWSxFQUFFO1FBQzVCLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUN2RSxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDakcsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDckQsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekIsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1lBQy9DLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztZQUNqRCxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7WUFDckQsa0JBQWtCLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRixVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3JDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUNwRCxxRUFBcUU7WUFDckUsOERBQThEO1lBQzlELGdCQUFnQixFQUFFO2dCQUNoQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDbEU7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsT0FBWSxFQUFFO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7WUFDbkMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekIsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7WUFDakMsNkVBQTZFO1lBQzdFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkQsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMzRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsT0FBWSxFQUFFO1FBQ2pDLHlFQUF5RTtRQUN6RSxzRUFBc0U7UUFDdEUsbUVBQW1FO1FBQ25FLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDaEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDL0IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7WUFDMUIsc0VBQXNFO1lBQ3RFLDRDQUE0QztZQUM1QyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUQsU0FBUyxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQzFCLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pCLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztTQUNoRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCO1lBQUUsT0FBTztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCO1lBQUUsT0FBTztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxVQUFVLENBQUMsQ0FBTTtRQUN2QixPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVEOztxRUFFaUU7SUFDakUsbUJBQW1CLENBQUMsTUFBYztRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUM7U0FDdkM7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7bURBSStDO0lBQy9DLEtBQUssQ0FBQyx5QkFBeUI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMzQixJQUFJO1lBQ0YsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDdEUsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDaEUsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0QsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDOUQsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ25FLENBQUMsQ0FBQztZQUVILE1BQU0sT0FBTyxHQUFXLFVBQWtCLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU87aUJBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLFVBQVUsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUM7Z0JBQzFELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLElBQUksQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQztnQkFDckQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMzRCxDQUFDLENBQUM7aUJBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUF5QyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdELE1BQU0sR0FBRyxHQUFXLE1BQWMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHO2lCQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQTRELEVBQUU7Z0JBQ3hFLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLEVBQUU7b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ3JCLE9BQU87b0JBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQ2pCLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7b0JBQzlCLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUNqRCxDQUFDO1lBQ0osQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBMEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU5RSx3RUFBd0U7WUFDeEUsMERBQTBEO1lBQzFELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNoQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTTtvQkFBRSxTQUFTO2dCQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUM5QzthQUNGO1lBRUQsa0VBQWtFO1lBQ2xFLG9FQUFvRTtZQUNwRSxrRUFBa0U7WUFDbEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsR0FBRztvQkFBRSxTQUFTO2dCQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO29CQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3pFO1lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FDVCx1QkFBdUIsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFDbEQsV0FBVyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQ3pDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUNoRSxDQUFDO1lBRUYsZ0VBQWdFO1lBQ2hFLHFFQUFxRTtZQUNyRSxzRUFBc0U7WUFDdEUsTUFBTSxNQUFNLEdBQVcsU0FBaUIsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JELE1BQU0sU0FBUyxHQUFXLFlBQW9CLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMzRCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBQ25DLE1BQU0sUUFBUSxHQUF1QyxFQUFFLENBQUM7WUFDeEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFBRSxPQUFPO2dCQUNsQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTztnQkFDaEMsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHO29CQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUM7WUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRTtnQkFDdEIsT0FBTyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDckIsT0FBTyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUN6QjtZQUNELEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO2dCQUMzQixPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQixPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QixPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3pCO1lBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7WUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FDVCxtQ0FBbUMsRUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQzFCLE1BQU0sRUFDTixNQUFNLENBQUMsTUFBTSxFQUNiLFlBQVksRUFDWixTQUFTLENBQUMsTUFBTSxFQUNoQixpQkFBaUIsQ0FDbEIsQ0FBQztTQUNIO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMzQixJQUFJO1lBQ0Ysc0VBQXNFO1lBQ3RFLE1BQU0sR0FBRyxHQUFRLE1BQU0sYUFBYSxDQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUM1RSxDQUFDO1lBQ0YsOEVBQThFO1lBQzlFLE1BQU0sSUFBSSxHQUNSLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtnQkFDUixJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVc7Z0JBQ25CLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFO2FBQ25FLENBQUMsQ0FBQyxDQUFDO1lBQ0osTUFBTSxTQUFTLEdBQTJCLEVBQUUsQ0FBQztZQUM3QyxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUM7Z0JBQ3RDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDeEM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUNULHdDQUF3QyxFQUN4QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUMvQixvQkFBb0IsRUFDcEIsU0FBUyxDQUNWLENBQUM7WUFDRixJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztTQUM1QztRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLG1DQUFtQztRQUN6QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkUsT0FBTztTQUNSO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDNUQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6RSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzNCLElBQUksQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3JCLElBQUksTUFBTSxLQUFLLE1BQU07Z0JBQUUsT0FBTyxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakUsT0FBTyxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFFBQVEsR0FBVSxFQUFFLENBQUM7SUFFN0IsMkVBQTJFO0lBQ25FLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBRTdEOzs7T0FHRztJQUNLLHVCQUF1QjtRQUM3QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25FLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO1FBRTNDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWTthQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUMsQ0FBQztRQUMvRCxJQUFJLE9BQU87WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6QyxzRUFBc0U7UUFDdEUsMENBQTBDO1FBQzFDLElBQUksUUFBUSxHQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsWUFBWTthQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsQ0FBQyxRQUFrQixFQUFFLEVBQUU7WUFDbEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRCxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBRXJCLCtEQUErRDtZQUMvRCw2Q0FBNkM7WUFDN0MsSUFDRSxJQUFJLENBQUMsc0JBQXNCO21CQUN0QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQ2hEO2dCQUNBLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM3QjtZQUVELEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxFQUFFO2dCQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtvQkFDYixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUMzQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUN0QztnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBRUQscUVBQXFFO1lBQ3JFLHNFQUFzRTtZQUN0RSxpRUFBaUU7WUFDakUsb0VBQW9FO1lBQ3BFLHNEQUFzRDtZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUNoQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLFdBQVc7b0JBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3ZEO1FBQ0QsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLE9BQU87WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6Qyx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSxtQkFBbUI7UUFDbkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQXFCLENBQUM7UUFDakUsTUFBTSxhQUFhLEdBQUcsYUFBYSxFQUFFLFlBQVk7YUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2pELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksYUFBYTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLHNCQUFzQixDQUFDLEtBQWE7UUFDaEQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ25CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFFbEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQXFCLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQVUsYUFBYSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDckMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsRUFBRSxRQUFRLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FDdkQsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBTSxFQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXRFLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQy9DLEtBQUssTUFBTSxDQUFDLElBQUksYUFBYSxFQUFFO1lBQzdCLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDeEQ7UUFFRCx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLGdFQUFnRTtRQUNoRSxJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQVEsTUFBTSxhQUFhLENBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQ3BELENBQUM7Z0JBQ0YsT0FBTyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUM7YUFDckI7WUFBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPO2FBQ1I7U0FDRjtRQUNELElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUVyQixNQUFNLFdBQVcsR0FBVSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pGLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDcEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvRSxPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDNUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN6QixXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ25CLG9FQUFvRTtZQUNwRSxzRUFBc0U7WUFDdEUsb0RBQW9EO1lBQ3BELE9BQU87Z0JBQ0wsR0FBRyxLQUFLO2dCQUNSLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLFdBQVc7Z0JBQ2hDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxDQUFDO2FBQzFCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILDBFQUEwRTtRQUMxRSx1RUFBdUU7UUFDdkUseUVBQXlFO1FBQ3pFLG1FQUFtRTtRQUNuRSw2QkFBNkI7UUFDN0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RSxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDOUIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUIsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDcEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxRQUFRLENBQ3ZDLENBQUM7WUFDRixJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixXQUFXLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNuQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQzVELE9BQU87d0JBQ0wsTUFBTTt3QkFDTixJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO3dCQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO3dCQUNqQyxHQUFHLE1BQU07d0JBQ1QsUUFBUSxFQUFFLEVBQUU7cUJBQ2IsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQ25CO1NBQ0Y7UUFFRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU87UUFFeEMsd0VBQXdFO1FBQ3hFLCtDQUErQztRQUMvQyxNQUFNLFVBQVUsR0FBRztZQUNqQixHQUFHLE9BQU87WUFDVixXQUFXLEVBQUUsY0FBYztZQUMzQixRQUFRLEVBQUUsV0FBVztZQUNyQixzQkFBc0IsRUFBRSxJQUFJO1NBQzdCLENBQUM7UUFDRixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFRLE1BQU0sYUFBYSxDQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FDckUsQ0FBQztZQUNGLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUM7WUFDdkIsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7b0JBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUU7b0JBQ25DLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVE7aUJBQzFCLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzdGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7YUFDL0I7U0FDRjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7U0FDOUQ7Z0JBQVM7WUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLEtBQUssRUFBRTtZQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzdCO2FBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUM7WUFBRSxPQUFPO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBYyxDQUFDO1FBQ3JFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELFVBQVUsQ0FBQyxTQUFpQjtRQUMxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUN2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQWMsQ0FBQztRQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hELEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1RSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7WUFDeEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BGO2FBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxFQUFFO1lBQzdDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsU0FBb0I7UUFDeEMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQWMsQ0FBQztRQUM1RCxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxJQUFrQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxTQUFpQjtRQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUyxDQUFDLFNBQW9CO1FBQzVCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxHQUFHLE9BQU8sS0FBSyxlQUFlO1lBQ3JDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUs7WUFDdkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ25ELE9BQU8sR0FBRyxHQUFHLElBQUksV0FBVyxNQUFNLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFDLFNBQW9CO1FBQ25DLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFxQixDQUFDO1FBQ2hFLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDOUMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDOUIsTUFBTSxDQUFDLEdBQUksQ0FBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDbEQsSUFBSSxDQUFDLEtBQUssWUFBWTtnQkFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDOztnQkFDbEMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLFFBQVEsSUFBSSxPQUFPO2dCQUFFLE1BQU07U0FDaEM7UUFDRCxJQUFJLFFBQVEsSUFBSSxPQUFPO1lBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQzlFLElBQUksT0FBTztZQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELFNBQVMsQ0FBQyxTQUFvQjtRQUM1QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUNoRCxNQUFNLEdBQUcsR0FBRyxPQUFPLEtBQUssZUFBZTtZQUNyQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxLQUFLO1lBQ3ZDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUN0QyxPQUFPLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsV0FBVyxDQUFDLFNBQW9CO1FBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxnQ0FBZ0MsQ0FBQyxjQUFjLENBQUM7UUFDaEUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQzNDLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFrQixDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN6QixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxTQUFTLElBQUksQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUNiLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUUsQ0FBQzthQUN6QjtTQUNGO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZ0JBQWdCO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBdUIsQ0FBQztRQUNsRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU87UUFFL0IsNEVBQTRFO1FBQzVFLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQy9DLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLENBQUM7Z0JBQUUsU0FBUztZQUNqQixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFFRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQiwrRUFBK0U7WUFDL0UsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJO2dCQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRTVCLHNFQUFzRTtZQUN0RSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxJQUFJLE1BQU0sS0FBSyxNQUFNO2dCQUFFLE9BQU8sTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUU5QyxzQ0FBc0M7WUFDdEMsSUFBSSxJQUFJLEtBQUssSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFbkQsaURBQWlEO1lBQ2pELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFFMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUUzQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFaEUsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7WUFDcEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRTtnQkFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUM7YUFDckM7U0FDRjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQzlELE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUk7WUFDRixrRUFBa0U7WUFDbEUseUVBQXlFO1lBQ3pFLCtCQUErQjtZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUV4QixNQUFNLE9BQU8sR0FBRztnQkFDZCxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDbEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3hCLENBQUM7WUFDRixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsTUFBTSxHQUFHLEdBQVEsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUM3RixNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLEtBQUssRUFBRTtvQkFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQzFEO3FCQUFNO29CQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO2lCQUNuRDthQUNGO2lCQUFNO2dCQUNMLE1BQU0sYUFBYSxDQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUMvRixDQUFDO2dCQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMseUJBQXlCLENBQUMsQ0FBQzthQUN6RDtTQUNGO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUM5RDtnQkFBUztZQUNSLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO3dHQTUwQ1UsZ0NBQWdDOzRGQUFoQyxnQ0FBZ0Msc0VDZDdDLG1sZUE0U0E7OzRGRDlSYSxnQ0FBZ0M7a0JBTDVDLFNBQVM7K0JBQ0UsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wbGFuby1kYXRhLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29rLXBsYW5vLWNvbGxlY3Rpb24tZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2xvb2stcGxhbm8tY29sbGVjdGlvbi1mb3JtLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIExvb2tQbGFub0NvbGxlY3Rpb25Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNsaWVudElkID0gJyc7XHJcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBpc05ldyA9IHRydWU7XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG4gIHNhdmluZyA9IGZhbHNlO1xyXG5cclxuICBmb3JtITogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkTG9va0luZGV4OiBudW1iZXIgPSAtMTtcclxuICBzZWxlY3RlZFNsb3RJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vIERpc3BsYXkgbGFiZWxzIGFyZSBXYWxsIC8gRmxvb3I7IHRoZSBzdG9yZWQgaWRzIHN0YXkgJ3NoZWxmJyAvICdldXJvY2VudGVyJ1xyXG4gIC8vIHNvIHRoZSBsaWJyYXJ5IGZpbHRlciwgc2xvdCBkZWZhdWx0cywgYW5kIHRoZSBiYWNrZW5kIHNsb3RUeXBlL2ZpeHR1cmVUeXBlXHJcbiAgLy8gZW51bXMga2VlcCB3b3JraW5nIHVuY2hhbmdlZCAoJ3NoZWxmJyDihpIgd2FsbCBmaXh0dXJlcywgJ2V1cm9jZW50ZXInIOKGkiBmbG9vcikuXHJcbiAgcmVhZG9ubHkgZml4dHVyZVR5cGVPcHRpb25zID0gW1xyXG4gICAgeyBpZDogJ3NoZWxmJywgbmFtZTogJ1dhbGwnIH0sXHJcbiAgICB7IGlkOiAnZXVyb2NlbnRlcicsIG5hbWU6ICdGbG9vcicgfSxcclxuICBdO1xyXG5cclxuICBmaXh0dXJlTGlicmFyeUl0ZW1zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZml4dHVyZVR5cGU6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgLy8gRHJvcGRvd25zIGluc2lkZSBwbGFjZW1lbnQgcm93cy5cclxuICB2bVR5cGVPcHRpb25zOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgdm1BcnR3b3JrT3B0aW9uczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyB2bVR5cGU/OiBzdHJpbmcgfVtdID0gW107XHJcbiAgcHJvZHVjdE9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcclxuICAvKiogQ2FjaGVkIHBlci12bVR5cGUgYXJ0d29yayBsaXN0IOKAlCBzYW1lIHJlZmVyZW5jZSByZXR1cm5lZCBlYWNoIGxvb2t1cCBzb1xyXG4gICAqICBsaWItcmVhY3RpdmUtc2VsZWN0IGRvZXNuJ3QgcmVzZXQgc3RhdGUgZXZlcnkgQ0QgY3ljbGUuICovXHJcbiAgcHJpdmF0ZSB2bUFydHdvcmtCeVR5cGU6IE1hcDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKiAodm1OYW1lfHx2bVR5cGUpIGFuZCAodm1OYW1lKSDihpIgcGxhbm92bSBfaWQsIHNvIGEgVk0gcGxhY2VtZW50J3MgYXJ0d29ya1xyXG4gICAqICBuYW1lIGNhbiBiZSByZXNvbHZlZCB0byB0aGUgX2lkIHRoZSBlbWJlZGRlZCBWTSBlZGl0b3IgbWF0Y2hlcyBhZ2FpbnN0LiAqL1xyXG4gIHByaXZhdGUgdm1JZEJ5TmFtZVR5cGU6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcbiAgLyoqXHJcbiAgICogQ2FjaGVkIGZpbHRlcmVkIGxpc3QgYm91bmQgdG8gdGhlIFwiRml4dHVyZSBsaWJyYXJpZXNcIiBtdWx0aXNlbGVjdC5cclxuICAgKiBNdXN0IE5PVCBiZSBhIGdldHRlciDigJQgdGhlIHVuZGVybHlpbmcgbXVsdGlzZWxlY3QgcmUtY2xvbmVzIGl0cyBpdGVtcyBvblxyXG4gICAqIGV2ZXJ5IG5nT25DaGFuZ2VzLCB3aGljaCBkZXRhY2hlcyBjbGljayB0YXJnZXRzIGFuZCBicmVha3Mgc2VsZWN0aW9uLlxyXG4gICAqL1xyXG4gIGZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90OiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZml4dHVyZVR5cGU6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgLy8gU3RhdGUgZm9yIHRoZSBwZXItc2xvdCBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkLlxyXG4gIHNlbGVjdGVkTGlicmFyeUlkSW5NYXA6IHN0cmluZyA9ICcnO1xyXG4gIHNlbGVjdGVkTGlicmFyeURldGFpbHM6IGFueSA9IG51bGw7XHJcbiAgbG9hZGluZ0xpYnJhcnlEZXRhaWxzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZW1iZWRkZWRUYWI6ICdwcm9kdWN0cycgfCAndm1zJyA9ICdwcm9kdWN0cyc7XHJcblxyXG4gIC8vID09PSBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkIGhlbHBlcnMgPT09XHJcblxyXG4gIC8qKiBTbG90J3MgcGxhY2VtZW50cyB3aXRoIGtpbmQgPSAndm0nLCBleHBvc2VkIGFzIGRyb3Bkb3duIGl0ZW1zLiAqL1xyXG4gIGdldCBjdXJyZW50U2xvdFZtSXRlbXMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNlbWVudHNUb0l0ZW1zKCd2bScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNsb3QncyBwbGFjZW1lbnRzIHdpdGgga2luZCA9ICdwaWQnLCBleHBvc2VkIGFzIGRyb3Bkb3duIGl0ZW1zLiAqL1xyXG4gIGdldCBjdXJyZW50U2xvdFBpZEl0ZW1zKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjZW1lbnRzVG9JdGVtcygncGlkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBsYWNlbWVudHNUb0l0ZW1zKGtpbmQ6ICd2bScgfCAncGlkJyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3QgYXJyID0gc2xvdC5nZXQoJ3BsYWNlbWVudHMnKSBhcyBGb3JtQXJyYXkgfCBudWxsO1xyXG4gICAgaWYgKCFhcnIpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBhcnIuY29udHJvbHNcclxuICAgICAgICAubWFwKChjKSA9PiBjLnZhbHVlKVxyXG4gICAgICAgIC5maWx0ZXIoKHA6IGFueSkgPT4gcD8ua2luZCA9PT0ga2luZCAmJiBwPy5wb3NpdGlvbilcclxuICAgICAgICAubWFwKChwOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBpZDogcC5wb3NpdGlvbixcclxuICAgICAgICAgIG5hbWU6IHAucmF3VmFsdWUgPyBgJHtwLnBvc2l0aW9ufSDigJQgJHtwLnJhd1ZhbHVlfWAgOiBwLnBvc2l0aW9uLFxyXG4gICAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKiBGaXh0dXJlLWxpYnJhcnkgb3B0aW9ucyBmb3IgdGhlIGRyb3Bkb3duIOKAlCBmaWx0ZXJlZCB0byB0aGUgbGlicmFyaWVzXHJcbiAgICogIHNlbGVjdGVkIG9uIHRoZSBjdXJyZW50bHktYWN0aXZlIHNsb3QncyBtdWx0aXNlbGVjdC4gKi9cclxuICBnZXQgc2VsZWN0ZWRTbG90TGlicmFyaWVzRm9yRHJvcGRvd24oKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm4gW107XHJcbiAgICBjb25zdCByZWZzOiBzdHJpbmdbXSA9IHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWUgfHwgW107XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gcmVmcy5pbmNsdWRlcyhpdGVtLmlkKSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIEZvcm1BcnJheSB0aGF0IHN0b3JlcyBwZXItKGxpYnJhcnksIHNoZWxmKSBWTS9QSUQgdmFsdWVzIGZvciB0aGUgYWN0aXZlIHNsb3QuICovXHJcbiAgZ2V0IHNlbGVjdGVkU2xvdExpYnJhcnlDb25maWdzKCk6IEZvcm1BcnJheSB8IG51bGwge1xyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICByZXR1cm4gc2xvdCA/IChzbG90LmdldCgnbGlicmFyeUNvbmZpZ3VyYXRpb25zJykgYXMgRm9ybUFycmF5KSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogRm9ybS1hcnJheSBlbnRyaWVzIHNjb3BlZCB0byB0aGUgY3VycmVudGx5LXNob3duIGxpYnJhcnkgaW4gdGhlIGNvbmZpZyBjYXJkLiAqL1xyXG4gIGNvbmZpZ0VudHJpZXNGb3JDdXJyZW50TGlicmFyeSgpOiB7IGNvbnRyb2w6IEZvcm1Hcm91cDsgYXJyYXlJbmRleDogbnVtYmVyIH1bXSB7XHJcbiAgICBjb25zdCBjb25maWdzID0gdGhpcy5zZWxlY3RlZFNsb3RMaWJyYXJ5Q29uZmlncztcclxuICAgIGlmICghY29uZmlncyB8fCAhdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKSByZXR1cm4gW107XHJcbiAgICByZXR1cm4gY29uZmlncy5jb250cm9sc1xyXG4gICAgICAgIC5tYXAoKGMsIGkpID0+ICh7IGNvbnRyb2w6IGMgYXMgRm9ybUdyb3VwLCBhcnJheUluZGV4OiBpIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguY29udHJvbC5nZXQoJ2xpYnJhcnlSZWYnKT8udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzZXQgY2FyZCBzdGF0ZSB3aGVuZXZlciB0aGUgYWN0aXZlIHNsb3QgY2hhbmdlcyBzbyB3ZSBkb24ndCBjYXJyeSBvdmVyXHJcbiAgICogIHN0YWxlIHNlbGVjdGlvbnMgZnJvbSBhIHByZXZpb3VzbHktdmlld2VkIHNsb3QuICovXHJcbiAgcHJpdmF0ZSByZXNldExpYnJhcnlNYXAoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAgPSAnJztcclxuICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5RGV0YWlscyA9IG51bGw7XHJcbiAgICB0aGlzLnJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk7XHJcbiAgICAvLyBDbGVhciB0aGUgc2hhcmVkIEJlaGF2aW9yU3ViamVjdCB0b28gc28gdGhlIGVtYmVkZGVkIFRlbXBsYXRlUHJvZHVjdHMgL1xyXG4gICAgLy8gVGVtcGxhdGVWbXMgY29tcG9uZW50cywgaWYgdGhleSdyZSBzdGlsbCBtb3VudGVkLCBkb24ndCByZW5kZXIgc3RhbGVcclxuICAgIC8vIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgc2xvdCdzIGxpYnJhcnkuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZW4gYSBzbG90IGlzIGxvYWRlZCwgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBsaWJyYXJ5IGl0IGhhcyBsaW5rZWRcclxuICAgKiAgc28gdGhlIGVtYmVkZGVkIGZpeHR1cmUtdGVtcGxhdGUgZWRpdG9yIG9wZW5zIHN0cmFpZ2h0IHRvIHRoYXQgbGlicmFyeS4gKi9cclxuICBwcml2YXRlIGF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmVmczogc3RyaW5nW10gPSBzbG90LmdldCgnZml4dHVyZUxpYnJhcnlSZWZzJyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgZmlyc3RJZCA9IHJlZnMuZmluZCgoaWQpID0+ICEhaWQpO1xyXG4gICAgaWYgKCFmaXJzdElkKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwID09PSBmaXJzdElkKSByZXR1cm47XHJcbiAgICB0aGlzLm9uTGlicmFyeU1hcFNlbGVjdChmaXJzdElkKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWFkIHRoZSBzbG90J3Mgc2F2ZWQgc25hcHNob3QgZm9yIGEgbGlicmFyeSwgaWYgYW55LiAqL1xyXG4gIHByaXZhdGUgZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkOiBzdHJpbmcpOiBhbnkgfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNuYXBzOiBhbnlbXSA9IHNsb3QuZ2V0KCdsaWJyYXJ5U25hcHNob3RzJyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgZW50cnkgPSBzbmFwcy5maW5kKChzKSA9PiBzPy5saWJyYXJ5UmVmID09PSBsaWJJZCk7XHJcbiAgICByZXR1cm4gZW50cnk/LnNuYXBzaG90IHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyc2lzdCBhIHNuYXBzaG90IGludG8gdGhlIHNsb3QncyBsaWJyYXJ5U25hcHNob3RzIEZvcm1Db250cm9sLiAqL1xyXG4gIHByaXZhdGUgY2FwdHVyZUxpYnJhcnlTbmFwc2hvdChsaWJJZDogc3RyaW5nLCBzbmFwc2hvdDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCB8fCAhbGliSWQpIHJldHVybjtcclxuICAgIGNvbnN0IGN0cmwgPSBzbG90LmdldCgnbGlicmFyeVNuYXBzaG90cycpO1xyXG4gICAgaWYgKCFjdHJsKSByZXR1cm47XHJcbiAgICBjb25zdCBjdXJyZW50OiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoY3RybC52YWx1ZSkgPyBbLi4uY3RybC52YWx1ZV0gOiBbXTtcclxuICAgIC8vIFN0cmlwIHRoZSBpZ25vcmVVcGRhdGUgZmxhZyBiZWZvcmUgc2F2aW5nIHNvIHdlIGRvbid0IGVjaG8gaXQgYmFjayBsYXRlci5cclxuICAgIGNvbnN0IHsgaWdub3JlVXBkYXRlOiBfaWdub3JlZCwgLi4uY2xlYW4gfSA9IHNuYXBzaG90IHx8IHt9O1xyXG4gICAgY29uc3QgaSA9IGN1cnJlbnQuZmluZEluZGV4KChzKSA9PiBzPy5saWJyYXJ5UmVmID09PSBsaWJJZCk7XHJcbiAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgIGN1cnJlbnRbaV0gPSB7IGxpYnJhcnlSZWY6IGxpYklkLCBzbmFwc2hvdDogY2xlYW4gfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN1cnJlbnQucHVzaCh7IGxpYnJhcnlSZWY6IGxpYklkLCBzbmFwc2hvdDogY2xlYW4gfSk7XHJcbiAgICB9XHJcbiAgICBjdHJsLnNldFZhbHVlKGN1cnJlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbCB2bUNvbmZpZyBjb29yZHMgZm9yIGEgZnJlc2hseS1hZGRlZCBWTSBlbnRyeSwgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAqIHZtVHlwZSBhbmQgdGhlIHRhcmdldCBsaWJyYXJ5J3Mgc2hlbGYgbGF5b3V0LiBNaXJyb3JzIHRoZSB3YWxsLWxheW91dFxyXG4gICAqIHJ1bGVzIGluIGBydW5Mb29rc0FsbG9jYXRpb25gIChvbmJvYXJkLmNvbnRyb2xsZXIuanM6YnVpbGRXYWxsVm1FbnRyeSlcclxuICAgKiBzbyB3aGF0IHRoZSBmb3JtIHByZS1wb3NpdGlvbnMgbWF0Y2hlcyB3aGF0IHRoZSBiYWNrZW5kIGFsbG9jYXRvciB3b3VsZFxyXG4gICAqIHBsYWNlIHRoZXJlLlxyXG4gICAqXHJcbiAgICogICBUb3AgTWFza2luZyAgICAgIC0+IGZpcnN0IHNoZWxmLCAgc3RyZXRjaCAodG9wIHN0cmlwIG9mIGZpeHR1cmUpXHJcbiAgICogICBNaWQgMSAvIE1pZCAgICAgIC0+IGZpcnN0IG1pZCBzaGVsZiwgbGVmdFxyXG4gICAqICAgTWlkIDIgICAgICAgICAgICAtPiBsYXN0IG1pZCBzaGVsZiwgIHJpZ2h0XHJcbiAgICogICBNaWQgMyAgICAgICAgICAgIC0+IG1pZGRsZSBtaWQgc2hlbGYgKG9yIGxhc3QpLCBzdHJldGNoXHJcbiAgICogICBCb3R0b20gU2xhbnRlciAgIC0+IGxhc3Qgc2hlbGYsICAgIHN0cmV0Y2ggKGJvdHRvbSBzdHJpcClcclxuICAgKlxyXG4gICAqIEFueXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGUgcHJldmlvdXMgbmV1dHJhbCBkZWZhdWx0ICh0b3AsIG5vIHpvbmUpXHJcbiAgICogc28gYmVoYXZpb3VyIGRvZXNuJ3QgY2hhbmdlIGZvciB1bmtub3duIGxhYmVscy5cclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxWbUxheW91dCh2bVR5cGU6IHN0cmluZywgc2hlbGZDb25maWc6IGFueVtdKTpcclxuICAgICAgeyBzdGFydFlQb3NpdGlvbjogbnVtYmVyOyBlbmRZUG9zaXRpb246IG51bWJlcjsgeFpvbmU6IHN0cmluZzsgeVpvbmU6IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IG5vcm0gPSBTdHJpbmcodm1UeXBlID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IHNoZWx2ZXMgPSBBcnJheS5pc0FycmF5KHNoZWxmQ29uZmlnKVxyXG4gICAgICA/IHNoZWxmQ29uZmlnLnNsaWNlKCkuc29ydChcclxuICAgICAgICAgIChhLCBiKSA9PiAoYT8uc2hlbGZOdW1iZXIgfHwgMCkgLSAoYj8uc2hlbGZOdW1iZXIgfHwgMCksXHJcbiAgICAgICAgKVxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgaW5ab25lID0gKHo6IHN0cmluZyk6IGFueVtdID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gei50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gc2hlbHZlcy5maWx0ZXIoXHJcbiAgICAgICAgICAocykgPT4gU3RyaW5nKHM/LnpvbmUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQsXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZmlyc3RTaGVsZiA9IHNoZWx2ZXNbMF0/LnNoZWxmTnVtYmVyIHx8IDE7XHJcbiAgICBjb25zdCBsYXN0U2hlbGYgPSBzaGVsdmVzW3NoZWx2ZXMubGVuZ3RoIC0gMV0/LnNoZWxmTnVtYmVyIHx8IGZpcnN0U2hlbGY7XHJcblxyXG4gICAgaWYgKG5vcm0gPT09ICd0b3AgbWFza2luZycgfHwgbm9ybSA9PT0gJ3RvcCcpIHtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IGZpcnN0U2hlbGYsIGVuZFlQb3NpdGlvbjogZmlyc3RTaGVsZiwgeFpvbmU6ICdzdHJldGNoJywgeVpvbmU6ICdzdHJldGNoJyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKG5vcm0gPT09ICdtaWQgMScgfHwgbm9ybSA9PT0gJ21pZCcpIHtcclxuICAgICAgY29uc3QgbSA9IGluWm9uZSgnTWlkJyk7XHJcbiAgICAgIGNvbnN0IHNuID0gbVswXT8uc2hlbGZOdW1iZXIgfHwgZmlyc3RTaGVsZjtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IHNuLCBlbmRZUG9zaXRpb246IHNuLCB4Wm9uZTogJ2xlZnQnLCB5Wm9uZTogJ3N0cmV0Y2gnIH07XHJcbiAgICB9XHJcbiAgICBpZiAobm9ybSA9PT0gJ21pZCAyJykge1xyXG4gICAgICBjb25zdCBtID0gaW5ab25lKCdNaWQnKTtcclxuICAgICAgY29uc3Qgc24gPSBtW20ubGVuZ3RoIC0gMV0/LnNoZWxmTnVtYmVyIHx8IGZpcnN0U2hlbGY7XHJcbiAgICAgIHJldHVybiB7IHN0YXJ0WVBvc2l0aW9uOiBzbiwgZW5kWVBvc2l0aW9uOiBzbiwgeFpvbmU6ICdyaWdodCcsIHlab25lOiAnc3RyZXRjaCcgfTtcclxuICAgIH1cclxuICAgIGlmIChub3JtID09PSAnbWlkIDMnKSB7XHJcbiAgICAgIGNvbnN0IG0gPSBpblpvbmUoJ01pZCcpO1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBtLmxlbmd0aCA+PSAzID8gbVtNYXRoLmZsb29yKG0ubGVuZ3RoIC8gMildIDogbVttLmxlbmd0aCAtIDFdO1xyXG4gICAgICBjb25zdCBzbiA9IHRhcmdldD8uc2hlbGZOdW1iZXIgfHwgZmlyc3RTaGVsZjtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IHNuLCBlbmRZUG9zaXRpb246IHNuLCB4Wm9uZTogJ3N0cmV0Y2gnLCB5Wm9uZTogJ3N0cmV0Y2gnIH07XHJcbiAgICB9XHJcbiAgICBpZiAobm9ybSA9PT0gJ2JvdHRvbSBzbGFudGVyJykge1xyXG4gICAgICByZXR1cm4geyBzdGFydFlQb3NpdGlvbjogbGFzdFNoZWxmLCBlbmRZUG9zaXRpb246IGxhc3RTaGVsZiwgeFpvbmU6ICdzdHJldGNoJywgeVpvbmU6ICdzdHJldGNoJyB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IDEsIGVuZFlQb3NpdGlvbjogMSwgeFpvbmU6ICcnLCB5Wm9uZTogJycgfTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNvbHZlIGEgVk0gcGxhY2VtZW50J3MgYXJ0d29yayBOQU1FICgrIHZtVHlwZSkgdG8gaXRzIHBsYW5vdm0gX2lkLiAqL1xyXG4gIHByaXZhdGUgcmVzb2x2ZVZtSWQodm1OYW1lOiBzdHJpbmcsIHZtVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5vcm1WbVR5cGUodm1OYW1lKTtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLm5vcm1WbVR5cGUodm1UeXBlKTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUuZ2V0KGAke25hbWV9fHwke3R5cGV9YCkgfHxcclxuICAgICAgdGhpcy52bUlkQnlOYW1lVHlwZS5nZXQobmFtZSkgfHxcclxuICAgICAgdm1OYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmUtZGVyaXZlIGV2ZXJ5IGFzc2lnbmVkIGxpYnJhcnkncyBzbmFwc2hvdCBmcm9tIHRoZSBhY3RpdmUgc2xvdCdzXHJcbiAgICogY3VycmVudCBwbGFjZW1lbnRzLiBEcml2ZW4gYnkgdGhlIFwiTG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmdcclxuICAgKiBQbGFjZW1lbnRzXCIgbGlzdCDigJQgc28gZWRpdGluZyBvbmUgcGxhY2VtZW50IHVwZGF0ZXMgQUxMIGFzc2lnbmVkXHJcbiAgICogbGlicmFyaWVzIGF0IG9uY2UuXHJcbiAgICpcclxuICAgKiAgLSBQSUQgcGxhY2VtZW50czogYHBvc2l0aW9uYCAoVG9wL01pZC9Cb3R0b20pIOKGkiBzaGVsZiB6b25lOyB0aGUgc2hlbGYnc1xyXG4gICAqICAgIHByb2R1Y3RCcmFuZE5hbWUgaXMgT1ZFUldSSVRURU4gd2l0aCB0aGUgcGxhY2VtZW50J3MgcHJvZHVjdCBsaXN0LlxyXG4gICAqICAtIFZNIHBsYWNlbWVudHM6IGBwb3NpdGlvbmAg4oaSIHZtVHlwZTsgdGhlIG1hdGNoaW5nIHZtQ29uZmlnIGVudHJ5J3NcclxuICAgKiAgICBhcnR3b3JrICh2bUlkL3ZtTmFtZSkgaXMgdXBkYXRlZCB3aGlsZSB0aGUgbGlicmFyeSBrZWVwcyBpdHMgb3duIFZNXHJcbiAgICogICAgcG9zaXRpb25zLiB2bVR5cGVzIG5vdCB5ZXQgcHJlc2VudCBhcmUgYXBwZW5kZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBhcHBseVBsYWNlbWVudHNUb0Fzc2lnbmVkTGlicmFyaWVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICBpZiAoIXNsb3QpIHJldHVybjtcclxuICAgIGNvbnN0IHJlZnM6IHN0cmluZ1tdID0gKHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWUgfHwgW10pXHJcbiAgICAgICAgLmZpbHRlcigocjogc3RyaW5nKSA9PiAhIXIpO1xyXG4gICAgaWYgKCFyZWZzLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBsYWNlbWVudHM6IGFueVtdID0gKHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5IHwgbnVsbCk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3Qgbm9ybSA9IChzOiBhbnkpOiBzdHJpbmcgPT4gU3RyaW5nKHMgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIC8vIHpvbmUgLT4gcHJvZHVjdCBsaXN0IChQSURzKTsgc3VwcG9ydHMgYm90aCByYXdWYWx1ZXNbXSBhbmQgbGVnYWN5IHJhd1ZhbHVlLlxyXG4gICAgY29uc3QgcGlkQnlab25lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHBsYWNlbWVudHMpIHtcclxuICAgICAgaWYgKHA/LmtpbmQgIT09ICdwaWQnIHx8ICFwPy5wb3NpdGlvbikgY29udGludWU7XHJcbiAgICAgIGNvbnN0IHZhbHM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShwLnJhd1ZhbHVlcykgJiYgcC5yYXdWYWx1ZXMubGVuZ3RoXHJcbiAgICAgICAgPyBwLnJhd1ZhbHVlcy5maWx0ZXIoKHY6IHN0cmluZykgPT4gISF2KVxyXG4gICAgICAgIDogKHAucmF3VmFsdWUgPyBbIFN0cmluZyhwLnJhd1ZhbHVlKSBdIDogW10pO1xyXG4gICAgICBpZiAodmFscy5sZW5ndGgpIHBpZEJ5Wm9uZS5zZXQobm9ybShwLnBvc2l0aW9uKSwgdmFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdm1UeXBlIC0+IHsgdm1JZCwgdm1OYW1lLCBsYWJlbCB9IChWTXMpXHJcbiAgICBjb25zdCB2bUJ5VHlwZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHZtSWQ6IHN0cmluZzsgdm1OYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4oKTtcclxuICAgIGZvciAoY29uc3QgcCBvZiBwbGFjZW1lbnRzKSB7XHJcbiAgICAgIGlmIChwPy5raW5kICE9PSAndm0nIHx8ICFwPy5wb3NpdGlvbiB8fCAhcD8ucmF3VmFsdWUpIGNvbnRpbnVlO1xyXG4gICAgICBjb25zdCBsYWJlbCA9IFN0cmluZyhwLnBvc2l0aW9uKTtcclxuICAgICAgdm1CeVR5cGUuc2V0KG5vcm0obGFiZWwpLCB7XHJcbiAgICAgICAgdm1JZDogdGhpcy5yZXNvbHZlVm1JZChTdHJpbmcocC5yYXdWYWx1ZSksIGxhYmVsKSxcclxuICAgICAgICB2bU5hbWU6IFN0cmluZyhwLnJhd1ZhbHVlKSxcclxuICAgICAgICBsYWJlbCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm90aGluZyB0byBhcHBseSDigJQgYmFpbCBvdXQgYmVmb3JlIGFueSBmZXRjaC5cclxuICAgIGlmIChwaWRCeVpvbmUuc2l6ZSA9PT0gMCAmJiB2bUJ5VHlwZS5zaXplID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gRm9yIGFueSBsaWJyYXJ5IHRoYXQgZG9lc24ndCBoYXZlIGEgc25hcHNob3QgeWV0LCBmZXRjaCBpdHMgZGV0YWlscyBzb1xyXG4gICAgLy8gd2UgY2FuIHVzZSB0aGUgZG9jIGFzIHRoZSBiYXNlLiBXaXRob3V0IHRoaXMsIGFwcGx5UGxhY2VtZW50cyBzaWxlbnRseVxyXG4gICAgLy8gc2tpcHBlZCBsaWJyYXJpZXMgdGhlIHVzZXIgaGFkbid0IHZpZXdlZCBhbmQgb25seSB0aGUgY3VycmVudGx5LXZpc2libGVcclxuICAgIC8vIGNoaXAgZXZlciByZWNlaXZlZCB1cGRhdGVzLlxyXG4gICAgY29uc3QgZmV0Y2hlZEJhc2VzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICByZWZzLm1hcChhc3luYyAobGliSWQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpKSByZXR1cm47XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJyYXJ5RGV0YWlscyhsaWJJZCksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkgZmV0Y2hlZEJhc2VzLnNldChsaWJJZCwgcmVzLmRhdGEpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0BAIH4gYXBwbHlQbGFjZW1lbnRzVG9Bc3NpZ25lZExpYnJhcmllcyBbZmV0Y2ggRVJSXTonLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG5cclxuICAgIGZvciAoY29uc3QgbGliSWQgb2YgcmVmcykge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldExpYnJhcnlTbmFwc2hvdChsaWJJZCkgfHwgZmV0Y2hlZEJhc2VzLmdldChsaWJJZCk7XHJcbiAgICAgIGlmICghdGFyZ2V0KSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IHNoZWx2ZXM6IGFueVtdID0gQXJyYXkuaXNBcnJheSh0YXJnZXQuc2hlbGZDb25maWcpID8gdGFyZ2V0LnNoZWxmQ29uZmlnIDogW107XHJcbiAgICAgIGNvbnN0IG5ld1NoZWxmQ29uZmlnID0gc2hlbHZlcy5tYXAoKHNoZWxmOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB6b25lID0gbm9ybShzaGVsZj8uem9uZSB8fCBzaGVsZj8ubGFiZWwpO1xyXG4gICAgICAgIGlmICghem9uZSB8fCAhcGlkQnlab25lLmhhcyh6b25lKSkgcmV0dXJuIHNoZWxmO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5zaGVsZixcclxuICAgICAgICAgIHpvbmU6IHNoZWxmPy56b25lIHx8IHNoZWxmPy5sYWJlbCB8fCAnJyxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFsgLi4ucGlkQnlab25lLmdldCh6b25lKSEgXSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nVm1zOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkodGFyZ2V0LnZtQ29uZmlnKSA/IHRhcmdldC52bUNvbmZpZyA6IFtdO1xyXG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IG5ld1ZtQ29uZmlnID0gZXhpc3RpbmdWbXMubWFwKCh2bTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbm9ybSh2bT8udm1UeXBlKTtcclxuICAgICAgICBzZWVuLmFkZChrZXkpO1xyXG4gICAgICAgIGNvbnN0IHVwZCA9IHZtQnlUeXBlLmdldChrZXkpO1xyXG4gICAgICAgIHJldHVybiB1cGQgPyB7IC4uLnZtLCB2bUlkOiB1cGQudm1JZCwgdm1OYW1lOiB1cGQudm1OYW1lIH0gOiB2bTtcclxuICAgICAgfSk7XHJcbiAgICAgIGZvciAoY29uc3QgWyBrZXksIHVwZCBdIG9mIHZtQnlUeXBlKSB7XHJcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMuaW5pdGlhbFZtTGF5b3V0KHVwZC5sYWJlbCwgbmV3U2hlbGZDb25maWcpO1xyXG4gICAgICAgIG5ld1ZtQ29uZmlnLnB1c2goe1xyXG4gICAgICAgICAgdm1UeXBlOiB1cGQubGFiZWwsXHJcbiAgICAgICAgICB2bUlkOiB1cGQudm1JZCxcclxuICAgICAgICAgIHZtTmFtZTogdXBkLnZtTmFtZSxcclxuICAgICAgICAgIC4uLmxheW91dCxcclxuICAgICAgICAgIHBvc2l0aW9uOiAnJyxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXB0dXJlTGlicmFyeVNuYXBzaG90KGxpYklkLCB7XHJcbiAgICAgICAgLi4udGFyZ2V0LFxyXG4gICAgICAgIHNoZWxmQ29uZmlnOiBuZXdTaGVsZkNvbmZpZyxcclxuICAgICAgICB2bUNvbmZpZzogbmV3Vm1Db25maWcsXHJcbiAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogJ0wzJyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVmbGVjdCB0aGUgY2hhbmdlIGluIHRoZSBjdXJyZW50bHktb3BlbiBlbWJlZGRlZCBlZGl0b3IuXHJcbiAgICB0aGlzLnJlbG9hZERpc3BsYXllZExpYnJhcnkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW91bnQgdGhlIGVtYmVkZGVkIGVkaXRvciBmb3IgdGhlIGFjdGl2ZSBsaWJyYXJ5IHNvIGl0IHBpY2tzIHVwIHRoZVxyXG4gICAqIHNuYXBzaG90IHdlIGp1c3QgcmV3cm90ZS4gVGhlIGVtYmVkZGVkIGNvbXBvbmVudHMgZ3VhcmQgYWdhaW5zdCByZS1pbml0XHJcbiAgICogd2hpbGUgbW91bnRlZCwgc28gd2UgdG9nZ2xlIHRoZSBob3N0IGtleSBvZmYgdGhlbiBvbiB0byBmb3JjZSBhIGZyZXNoXHJcbiAgICogbmdPbkluaXQgd2l0aCB0aGUgdXBkYXRlZCBkYXRhLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVsb2FkRGlzcGxheWVkTGlicmFyeSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxpYklkID0gdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwO1xyXG4gICAgaWYgKCFsaWJJZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkKTtcclxuICAgIGlmICghdXBkYXRlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZExpYnJhcnlEZXRhaWxzID0gdXBkYXRlZDtcclxuICAgIC8vIFB1c2ggdGhlIGZyZXNoIHNuYXBzaG90LCB0aGVuIGJ1bXAgdGhlIG5vbmNlIHNvIHJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzXHJcbiAgICAvLyBwcm9kdWNlcyBhIE5FVyBrZXkg4oCUIHRoYXQncyB3aGF0IGFjdHVhbGx5IGZvcmNlcyB0aGUgKm5nRm9yIHRvIGRlc3Ryb3lcclxuICAgIC8vIHRoZSBvbGQgZW1iZWRkZWQgZWRpdG9yIGFuZCBtb3VudCBhIG5ldyBvbmUgdGhhdCByZS1yZWFkcyB0aGUgc25hcHNob3QuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KHtcclxuICAgICAgLi4udXBkYXRlZCxcclxuICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogdXBkYXRlZC5wcm9kdWN0UmVzb2x1dGlvbkxldmVsIHx8ICdMMycsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZW1iZWRkZWRSZWxvYWROb25jZSsrO1xyXG4gICAgdGhpcy5yZWZyZXNoRW1iZWRkZWRIb3N0S2V5cygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25MaWJyYXJ5TWFwU2VsZWN0KGxpYklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFRvZ2dsaW5nIHRoZSBhY3RpdmUgY2hpcCBvZmYg4oaSIGNsZWFyIGltbWVkaWF0ZWx5IChubyBhc3luYyB3b3JrIG5lZWRlZCkuXHJcbiAgICBpZiAoIWxpYklkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCA9ICcnO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGlicmFyeURldGFpbHMgPSBudWxsO1xyXG4gICAgICB0aGlzLnJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk7XHJcbiAgICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQobnVsbCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgY2hpcDogbGlnaHQgdGhlIG5ldyBjaGlwIHVwIHJpZ2h0IGF3YXksIGJ1dFxyXG4gICAgLy8gS0VFUCB0aGUgcHJldmlvdXMgbGlicmFyeSdzIGVtYmVkZGVkIHByZXZpZXcgbW91bnRlZCB3aGlsZSB3ZSBmZXRjaFxyXG4gICAgLy8gdGhlIG5ldyBzbmFwc2hvdC9kZXRhaWxzLiBPdGhlcndpc2UgdGhlIGNhcmQgd291bGQgY29sbGFwc2UgdG8gaXRzXHJcbiAgICAvLyBoZWFkZXIgaGVpZ2h0IGR1cmluZyB0aGUgZmV0Y2ggYW5kIHJlLWV4cGFuZCBvbmNlIG5ldyBkYXRhIGxhbmRzIOKAlFxyXG4gICAgLy8gdmlzaWJsZSBhcyBhIFwiY3J1bmNoXCIgdGhlIHVzZXIgcmVwb3J0ZWQuXHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAgPSBsaWJJZDtcclxuICAgIHRoaXMubG9hZGluZ0xpYnJhcnlEZXRhaWxzID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgbmV3RGV0YWlsczogYW55ID0gbnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIElmIGFuIGF1dG8tYXBwbHkgZm9yIHRoaXMgbGlicmFyeSBpcyBzdGlsbCBydW5uaW5nLCB3YWl0IGZvciBpdCBzb1xyXG4gICAgICAvLyB3ZSBkb24ndCBiZWF0IGl0IHRvIHRoZSBzbmFwc2hvdCBhbmQgcmVuZGVyIHRoZSB1bi1maWxsZWQgbGlicmFyeS5cclxuICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuYXV0b0FwcGx5SW5GbGlnaHQuZ2V0KGxpYklkKTtcclxuICAgICAgaWYgKHBlbmRpbmcpIHtcclxuICAgICAgICB0cnkgeyBhd2FpdCBwZW5kaW5nOyB9IGNhdGNoIChfZSkgeyAvKiBpZ25vcmUgKi8gfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNhdmVkID0gdGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpO1xyXG4gICAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBuZXdEZXRhaWxzID0gc2F2ZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMobGliSWQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbmV3RGV0YWlscyA9IHJlcz8uZGF0YSB8fCBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gb25MaWJyYXJ5TWFwU2VsZWN0IFtFUlJdOicsIGVycik7XHJcbiAgICAgIG5ld0RldGFpbHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEF0b21pYyBzd2FwIOKAlCBzZWxlY3RlZExpYnJhcnlEZXRhaWxzLCBCZWhhdmlvclN1YmplY3QsIGFuZCB0aGVcclxuICAgIC8vIG5nRm9yIGhvc3Qga2V5IGFsbCBmbGlwIGluIG9uZSBzeW5jaHJvbm91cyBibG9jaywgc28gQW5ndWxhciBkZXN0cm95c1xyXG4gICAgLy8gdGhlIG9sZCBlbWJlZGRlZCBjb21wb25lbnQgYW5kIG1vdW50cyB0aGUgbmV3IG9uZSBpbiB0aGUgc2FtZSBjaGFuZ2VcclxuICAgIC8vIGRldGVjdGlvbiBjeWNsZS4gTm8gZW1wdHktc3RhdGUgaW4gYmV0d2VlbiDihpIgbm8gY2FyZC1oZWlnaHQgY3J1bmNoLlxyXG4gICAgdGhpcy5zZWxlY3RlZExpYnJhcnlEZXRhaWxzID0gbmV3RGV0YWlscztcclxuICAgIGlmIChuZXdEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQoe1xyXG4gICAgICAgIC4uLm5ld0RldGFpbHMsXHJcbiAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbmV3RGV0YWlscy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsIHx8ICdMMycsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wbGFub0RhdGFTZXJ2aWNlLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMubmV4dChudWxsKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaEVtYmVkZGVkSG9zdEtleXMoKTtcclxuICAgIHRoaXMubG9hZGluZ0xpYnJhcnlEZXRhaWxzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wb3NpdGUga2V5IHRpZWQgdG8gdGhlIGN1cnJlbnRseS1hY3RpdmUgKGxvb2ssIHNsb3QsIGxpYnJhcnkpIHRyaXBsZS5cclxuICAgKiBTdGFibGUgcHJvcGVydHkg4oCUIHJlY29tcHV0ZWQgb25seSB3aGVuIHRoZSB1bmRlcmx5aW5nIHNlbGVjdGlvbiBjaGFuZ2VzXHJcbiAgICogKHNlZSByZWZyZXNoRW1iZWRkZWRIb3N0S2V5cygpKS4gQXZvaWRzIHJldHVybmluZyBhIG5ldyBhcnJheSByZWZlcmVuY2VcclxuICAgKiBldmVyeSBDRCBjeWNsZSwgd2hpY2ggdXNlZCB0byByaXBwbGUgaW50byBvdGhlciBtdWx0aS1zZWxlY3RzJyBpbnB1dHMuXHJcbiAgICovXHJcbiAgZW1iZWRkZWRIb3N0S2V5OiBzdHJpbmcgPSAnJztcclxuICBlbWJlZGRlZEhvc3RLZXlzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIC8vIEJ1bXBlZCBieSByZWxvYWREaXNwbGF5ZWRMaWJyYXJ5KCkgdG8gZm9yY2UgdGhlIGVtYmVkZGVkIGVkaXRvciB0byByZW1vdW50XHJcbiAgLy8gZXZlbiB3aGVuIGxvb2svc2xvdC9saWJyYXJ5IGFyZSB1bmNoYW5nZWQgKGEgc2FtZS1rZXkgcm91bmQtdHJpcCB2aWEgdGhlXHJcbiAgLy8gKm5nRm9yIHRyYWNrQnkgZG9lcyBOT1QgcmVtb3VudDsgYSBjaGFuZ2VkIGtleSBkb2VzKS5cclxuICBwcml2YXRlIGVtYmVkZGVkUmVsb2FkTm9uY2UgPSAwO1xyXG5cclxuICBwcml2YXRlIHJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gYCR7dGhpcy5zZWxlY3RlZExvb2tJbmRleH0tJHt0aGlzLnNlbGVjdGVkU2xvdEluZGV4fS0ke3RoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcH0tJHt0aGlzLmVtYmVkZGVkUmVsb2FkTm9uY2V9YDtcclxuICAgIGlmIChrZXkgIT09IHRoaXMuZW1iZWRkZWRIb3N0S2V5KSB7XHJcbiAgICAgIHRoaXMuZW1iZWRkZWRIb3N0S2V5ID0ga2V5O1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuc2VsZWN0ZWRMaWJyYXJ5RGV0YWlscyA/IFt0aGlzLmVtYmVkZGVkSG9zdEtleV0gOiBbXTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmVtYmVkZGVkSG9zdEtleXM7XHJcbiAgICAvLyBPbmx5IGFzc2lnbiBhIG5ldyBhcnJheSBpZiB0aGUgY29udGVudHMgZGlmZmVyIOKAlCBvdGhlcndpc2UgdGhlIG5nRm9yIHNlZXNcclxuICAgIC8vIGEgXCJuZXdcIiBhcnJheSBlYWNoIENEIGFuZCB0cmFja0J5IHN0aWxsIGhhcyB0byBjb21wYXJlIGV2ZXJ5IGVudHJ5LlxyXG4gICAgaWYgKG5leHQubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCB8fCBuZXh0WzBdICE9PSBjdXJyZW50WzBdKSB7XHJcbiAgICAgIHRoaXMuZW1iZWRkZWRIb3N0S2V5cyA9IG5leHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cmFja0J5RW1iZWRkZWRLZXkoXzogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4ga2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNsb3QtdHlwZSBkcm9wZG93biBpbiB0aGUgcmlnaHQgcGFuZSBvbmx5IG9mZmVycyB2YWx1ZXMgdGhhdCB0aGVcclxuICAgKiBwYXJlbnQgTG9vayBoYXMgc2VsZWN0ZWQgaW4gaXRzIEZpeHR1cmUgVHlwZSBtdWx0aXNlbGVjdC4gSWYgbm90aGluZyBpc1xyXG4gICAqIHNlbGVjdGVkIHlldCwgZmFsbCBiYWNrIHRvIHNob3dpbmcgYWxsIG9wdGlvbnMgc28gdGhlIHVzZXIgaXNuJ3QgYmxvY2tlZC5cclxuICAgKi9cclxuICBnZXQgYXZhaWxhYmxlU2xvdFR5cGVzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLnNlbGVjdGVkTG9va0dyb3VwO1xyXG4gICAgaWYgKCFsb29rR3JvdXApIHJldHVybiB0aGlzLmZpeHR1cmVUeXBlT3B0aW9ucztcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVR5cGUnKT8udmFsdWUgYXMgc3RyaW5nW10gfCBudWxsO1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSB8fCBzZWxlY3RlZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZml4dHVyZVR5cGVPcHRpb25zO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZml4dHVyZVR5cGVPcHRpb25zLmZpbHRlcigob3B0KSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHQuaWQpKTtcclxuICB9XHJcblxyXG4gIC8vIDIwIHZlcnkgbWlsZCBwYXN0ZWxzIChhbGwgVGFpbHdpbmQtNTAgLyAxMDAgcmFuZ2UpIGFycmFuZ2VkIHNvIGFkamFjZW50XHJcbiAgLy8gcGFsZXR0ZSBzbG90cyBhcmUgb24gb3Bwb3NpdGUgc2lkZXMgb2YgdGhlIGNvbG91ciB3aGVlbCBmb3IgZGlzdGluZ3Vpc2gtXHJcbiAgLy8gYWJpbGl0eSB3aXRob3V0IGFueSBjb2xvdXIgZmVlbGluZyBzYXR1cmF0ZWQuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQlVDS0VUX1BBTEVUVEU6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xyXG4gICAgJyNmZWYyZjInLCAvLyAgMSBCbHVzaCAgICAgICAgICByZWQtNTBcclxuICAgICcjZjBmZGZhJywgLy8gIDIgTWludCBXaGlzcGVyICAgdGVhbC01MCAgICAob3Bwb3NpdGUgb2YgcmVkKVxyXG4gICAgJyNmZmY3ZWQnLCAvLyAgMyBBcHJpY290ICAgICAgICBvcmFuZ2UtNTBcclxuICAgICcjZWVmMmZmJywgLy8gIDQgSXJpcyAgICAgICAgICAgaW5kaWdvLTUwICAob3Bwb3NpdGUgb2Ygb3JhbmdlKVxyXG4gICAgJyNmZWZjZTgnLCAvLyAgNSBCdXR0ZXIgICAgICAgICB5ZWxsb3ctNTBcclxuICAgICcjZmFmNWZmJywgLy8gIDYgTGF2ZW5kZXIgICAgICAgcHVycGxlLTUwICAob3Bwb3NpdGUgb2YgeWVsbG93KVxyXG4gICAgJyNmMGZkZjQnLCAvLyAgNyBTcHJpbmcgICAgICAgICBncmVlbi01MFxyXG4gICAgJyNmZmYxZjInLCAvLyAgOCBSb3NlIFBldGFsICAgICByb3NlLTUwICAgIChvcHBvc2l0ZSBvZiBncmVlbilcclxuICAgICcjZWNmZWZmJywgLy8gIDkgU2t5IFRpbnQgICAgICAgY3lhbi01MFxyXG4gICAgJyNmZmVkZDUnLCAvLyAxMCBQZWFjaCAgICAgICAgICBvcmFuZ2UtMTAwXHJcbiAgICAnI2VmZjZmZicsIC8vIDExIFBvd2RlciBCbHVlICAgIGJsdWUtNTBcclxuICAgICcjZjBmOWZmJywgLy8gMTIgU2t5ICAgICAgICAgICAgc2t5LTUwICAgICAob3Bwb3NpdGUgb2Ygb3JhbmdlKVxyXG4gICAgJyNmNWYzZmYnLCAvLyAxMyBWaW9sZXQgTWlzdCAgICB2aW9sZXQtNTBcclxuICAgICcjZjdmZWU3JywgLy8gMTQgTGltZSBXaGlzcGVyICAgbGltZS01MCAgICAob3Bwb3NpdGUgb2YgdmlvbGV0KVxyXG4gICAgJyNmZGY0ZmYnLCAvLyAxNSBMaWxhYyAgICAgICAgICBmdWNoc2lhLTUwXHJcbiAgICAnI2VjZmRmNScsIC8vIDE2IE1pbnQgICAgICAgICAgIGVtZXJhbGQtNTBcclxuICAgICcjZmRmMmY4JywgLy8gMTcgUGV0YWwgUGluayAgICAgcGluay01MFxyXG4gICAgJyNmZmZiZWInLCAvLyAxOCBIb25leSAgICAgICAgICBhbWJlci01MFxyXG4gICAgJyNmMWY1ZjknLCAvLyAxOSBDbG91ZCAgICAgICAgICBzbGF0ZS0xMDBcclxuICAgICcjZjVmNWY0JywgLy8gMjAgTGluZW4gICAgICAgICAgc3RvbmUtMTAwXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwbGFub0RhdGFTZXJ2aWNlOiBQbGFub0RhdGFTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcbiAgICB0aGlzLmluaXRGb3JtKCk7XHJcblxyXG4gICAgLy8gTGlzdGVuIHRvIHRoZSBzaGFyZWQgZml4dHVyZVRlbXBsYXRlRGV0YWlscyDigJQgd2hlbiB0aGUgZW1iZWRkZWRcclxuICAgIC8vIFRlbXBsYXRlUHJvZHVjdHMvVGVtcGxhdGVWbXMgY29tcG9uZW50cyBwdXNoIGVkaXRzIGJhY2sgaW50byB0aGVcclxuICAgIC8vIEJlaGF2aW9yU3ViamVjdCwgcGVyc2lzdCBhIHNuYXBzaG90IHVuZGVyIHRoZSBhY3RpdmUgc2xvdCArIGxpYnJhcnkuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlsc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSB8fCAhdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKSByZXR1cm47XHJcbiAgICAgICAgLy8gT25seSBjYXB0dXJlIHVzZXIgZWRpdHMsIG5vdCB0aGUgaW5pdGlhbCBsb2FkIHdlIHB1c2hlZCBvdXJzZWx2ZXMuXHJcbiAgICAgICAgLy8gVGhlIGVtYmVkZGVkIGNvbXBvbmVudHMgc2V0IGBpZ25vcmVVcGRhdGU6IHRydWVgIHdoZW4gdGhleSBwdXNoXHJcbiAgICAgICAgLy8gdGhlaXIgZm9ybSBjaGFuZ2VzIGJhY2s7IHdlIHVzZSB0aGF0IGFzIG91ciBzaWduYWwuXHJcbiAgICAgICAgaWYgKCFkYXRhLmlnbm9yZVVwZGF0ZSkgcmV0dXJuO1xyXG4gICAgICAgIC8vIFBlcnNpc3QgZWRpdHMgbWFkZSBkaXJlY3RseSBpbiB0aGUgZW1iZWRkZWQgZWRpdG9yIChlLmcuIFZNXHJcbiAgICAgICAgLy8gcG9zaXRpb25zLCB3aGljaCBzdGF5IGVkaXRhYmxlIGluIGxvb2tzTW9kZSkgdG8gdGhlIGFjdGl2ZSBsaWJyYXJ5LlxyXG4gICAgICAgIC8vIENyb3NzLWxpYnJhcnkgcHJvcGFnYXRpb24gaXMgZHJpdmVuIGJ5IHRoZSBzbG90J3MgcGxhY2VtZW50cyBsaXN0XHJcbiAgICAgICAgLy8gaW5zdGVhZCAoc2VlIGFwcGx5UGxhY2VtZW50c1RvQXNzaWduZWRMaWJyYXJpZXMpLlxyXG4gICAgICAgIHRoaXMuY2FwdHVyZUxpYnJhcnlTbmFwc2hvdCh0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAsIGRhdGEpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgY29uc3QgaGVhZGVyRmlsdGVycyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJykgfHwgJ3t9Jyk7XHJcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQgfHwgaGVhZGVyRmlsdGVycz8uY2xpZW50O1xyXG4gICAgICBpZiAodGhpcy5jbGllbnRJZCkge1xyXG4gICAgICAgIHRoaXMubG9hZEZpeHR1cmVMaWJyYXJpZXMoKTtcclxuICAgICAgICB0aGlzLmxvYWRQbGFjZW1lbnREcm9wZG93bkRhdGEoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShhc3luYyAocGFyYW1zKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlkID0gcGFyYW1zWydjb2xsZWN0aW9uSWQnXTtcclxuICAgICAgdGhpcy5jb2xsZWN0aW9uSWQgPSBpZCAmJiBpZCAhPT0gJ25ldycgPyBpZCA6IG51bGw7XHJcbiAgICAgIHRoaXMuaXNOZXcgPSAhdGhpcy5jb2xsZWN0aW9uSWQ7XHJcbiAgICAgIGlmICh0aGlzLmNvbGxlY3Rpb25JZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZERldGFpbHMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gRW1iZWRkZWQgVGVtcGxhdGVQcm9kdWN0c0NvbXBvbmVudCAvIFRlbXBsYXRlVm1zQ29tcG9uZW50IHJlYWQgdGhlc2VcclxuICAgIC8vIHF1ZXJ5IHBhcmFtcyBmcm9tIHRoZSBhY3RpdmUgcm91dGUuIEZvcmNlIHRoZW0gdG8gZWRpdC1tb2RlIGFuZCBwaW5cclxuICAgIC8vIHRoZSBwcm9kdWN0cyB2aWV3IHRvIHRoZSBcInNlY3Rpb25cIiBsZXZlbC5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IGlzRWRpdDogJ3RydWUnLCBsZXZlbDogJ3NlY3Rpb24nIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXHJcbiAgICAgIHJlcGxhY2VVcmw6IHRydWUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFBhZ2VEYXRhKCkge1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRUaXRsZSgnTG9vayBDb2xsZWN0aW9uJyk7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAgeyB0aXRsZTogJ1BsYW5vZ3JhbScsIHBhdGg6ICcvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtcycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXHJcbiAgICAgIHsgdGl0bGU6ICcnLCBwYXRoOiAnJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgICB7IHRpdGxlOiAnTG9va3MnLCBwYXRoOiAnL21hbmFnZS9wbGFub2dyYW0vbG9va3MnLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiAnJywgcGF0aDogJycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcclxuICAgICAgeyB0aXRsZTogJ0VkaXQnLCBwYXRoOiAnJywgaXNBY3RpdmU6IHRydWUsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBpbml0Rm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBkZXNjcmlwdGlvbjogWycnXSxcclxuICAgICAgaXNBY3RpdmU6IFtmYWxzZV0sXHJcbiAgICAgIGxvb2tzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxvb2tzKCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnbG9va3MnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBmaXh0dXJlU2xvdHMobG9va0luZGV4OiBudW1iZXIpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMubG9va3MuYXQobG9va0luZGV4KS5nZXQoJ2ZpeHR1cmVTbG90cycpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIHBsYWNlbWVudHMobG9va0luZGV4OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVTbG90cyhsb29rSW5kZXgpLmF0KHNsb3RJbmRleCkuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkTG9va0dyb3VwKCk6IEZvcm1Hcm91cCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPj0gMCAmJiB0aGlzLnNlbGVjdGVkTG9va0luZGV4IDwgdGhpcy5sb29rcy5sZW5ndGhcclxuICAgICAgPyAodGhpcy5sb29rcy5hdCh0aGlzLnNlbGVjdGVkTG9va0luZGV4KSBhcyBGb3JtR3JvdXApXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFNsb3RzQXJyYXkoKTogRm9ybUFycmF5IHwgbnVsbCB7XHJcbiAgICBjb25zdCBsb29rID0gdGhpcy5zZWxlY3RlZExvb2tHcm91cDtcclxuICAgIHJldHVybiBsb29rID8gKGxvb2suZ2V0KCdmaXh0dXJlU2xvdHMnKSBhcyBGb3JtQXJyYXkpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFNsb3RHcm91cCgpOiBGb3JtR3JvdXAgfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5zZWxlY3RlZFNsb3RzQXJyYXk7XHJcbiAgICBpZiAoIXNsb3RzKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID49IDAgJiYgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA8IHNsb3RzLmxlbmd0aFxyXG4gICAgICA/IChzbG90cy5hdCh0aGlzLnNlbGVjdGVkU2xvdEluZGV4KSBhcyBGb3JtR3JvdXApXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFBsYWNlbWVudHMoKTogRm9ybUFycmF5IHwgbnVsbCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIHJldHVybiBzbG90ID8gKHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5KSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMb29rR3JvdXAoc2VlZDogYW55ID0ge30pOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3Qgc2VlZFNsb3RzID0gQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVTbG90cykgJiYgc2VlZC5maXh0dXJlU2xvdHMubGVuZ3RoXHJcbiAgICAgID8gc2VlZC5maXh0dXJlU2xvdHNcclxuICAgICAgOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heCgxLCBOdW1iZXIoc2VlZC5maXh0dXJlQ291bnQpIHx8IDEpIH0sIChfLCBpKSA9PiAoeyBzbG90SW5kZXg6IGkgKyAxIH0pKTtcclxuICAgIGNvbnN0IHNsb3RzID0gc2VlZFNsb3RzLm1hcCgoczogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3JlYXRlU2xvdEdyb3VwKHsgLi4ucywgc2xvdEluZGV4OiBpICsgMSB9KSk7XHJcblxyXG4gICAgLy8gTGVnYWN5IGRhdGEgbWF5IGhhdmUgc3RvcmVkIGNhZEhlYWRlclZhcmlhbnRzIGF0IHRoZSBzbG90IGxldmVsLiBJZiB0aGVcclxuICAgIC8vIGluY29taW5nIGxvb2sgZG9lc24ndCBoYXZlIGl0cyBvd24gdmFyaWFudHMgYXJyYXksIGZvbGQgdGhlIHVuaW9uIG9mXHJcbiAgICAvLyBzbG90LWxldmVsIHZhcmlhbnRzIGludG8gdGhlIGxvb2sgc28gZWRpdGluZyBpbiB0aGUgbmV3IFVJIGRvZXNuJ3QgbG9zZVxyXG4gICAgLy8gdGhlbS5cclxuICAgIGNvbnN0IHNlZWRMb29rVmFyaWFudHMgPSBBcnJheS5pc0FycmF5KHNlZWQuY2FkSGVhZGVyVmFyaWFudHMpXHJcbiAgICAgID8gc2VlZC5jYWRIZWFkZXJWYXJpYW50c1xyXG4gICAgICA6IEFycmF5LmZyb20obmV3IFNldChcclxuICAgICAgICAoQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVTbG90cykgPyBzZWVkLmZpeHR1cmVTbG90cyA6IFtdKVxyXG4gICAgICAgICAgLmZsYXRNYXAoKHM6IGFueSkgPT4gQXJyYXkuaXNBcnJheShzPy5jYWRIZWFkZXJWYXJpYW50cykgPyBzLmNhZEhlYWRlclZhcmlhbnRzIDogW10pLFxyXG4gICAgICApKTtcclxuXHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAga2V5VHlwZTogW3NlZWQua2V5VHlwZSB8fCAnbWJxJ10sXHJcbiAgICAgIG1icUJ1Y2tldDogW3NlZWQubWJxQnVja2V0IHx8ICcnXSxcclxuICAgICAgYnJhbmRDYXRlZ29yeTogW3NlZWQuYnJhbmRDYXRlZ29yeSB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVDb3VudDogW3Nsb3RzLmxlbmd0aCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXHJcbiAgICAgIGZpeHR1cmVUeXBlOiBbQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVUeXBlKSA/IHNlZWQuZml4dHVyZVR5cGUgOiBbXV0sXHJcbiAgICAgIGxheW91dFZhcmlhbnQ6IFtzZWVkLmxheW91dFZhcmlhbnQgfHwgJ3NoZWxmJ10sXHJcbiAgICAgIHN0b3JlUHJvdG86IFtzZWVkLnN0b3JlUHJvdG8gfHwgJyddLFxyXG4gICAgICBjYWRIZWFkZXJWYXJpYW50czogW3NlZWRMb29rVmFyaWFudHNdLFxyXG4gICAgICBmaXh0dXJlU2xvdHM6IHRoaXMuZmIuYXJyYXkoc2xvdHMpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gZml4dHVyZUNvdW50IOKGkiBzbG90cyBsZW5ndGggKHVzZXItZWRpdGVkIGNvdW50IGFkanVzdHMgdGhlIHNsb3RzIGFycmF5KVxyXG4gICAgbG9va0dyb3VwLmdldCgnZml4dHVyZUNvdW50JykhLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKG5leHQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDMwLCBOdW1iZXIobmV4dCkgfHwgMCkpO1xyXG4gICAgICAgIGNvbnN0IHNsb3RzQXJyID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIHdoaWxlIChzbG90c0Fyci5sZW5ndGggPCB0YXJnZXQpIHtcclxuICAgICAgICAgIHNsb3RzQXJyLnB1c2godGhpcy5jcmVhdGVTbG90R3JvdXAoeyBzbG90SW5kZXg6IHNsb3RzQXJyLmxlbmd0aCArIDEgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoc2xvdHNBcnIubGVuZ3RoID4gdGFyZ2V0KSB7XHJcbiAgICAgICAgICBzbG90c0Fyci5yZW1vdmVBdChzbG90c0Fyci5sZW5ndGggLSAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW51bWJlclNsb3RzRm9yR3JvdXAobG9va0dyb3VwKTtcclxuICAgICAgICAvLyBSZWNvbmNpbGUgc2xvdCBzZWxlY3Rpb24gaWYgaXQncyBub3cgb3V0IG9mIGJvdW5kc1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTG9va0luZGV4ID49IDAgJiYgdGhpcy5sb29rcy5hdCh0aGlzLnNlbGVjdGVkTG9va0luZGV4KSA9PT0gbG9va0dyb3VwKSB7XHJcbiAgICAgICAgICBpZiAoc2xvdHNBcnIubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFNsb3RJbmRleCA+PSBzbG90c0Fyci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzQXJyLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGxvb2tHcm91cDtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVNsb3RHcm91cChzZWVkOiBhbnkgPSB7fSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gKEFycmF5LmlzQXJyYXkoc2VlZC5wbGFjZW1lbnRzKSA/IHNlZWQucGxhY2VtZW50cyA6IFtdKVxyXG4gICAgICAubWFwKChwOiBhbnkpID0+IHRoaXMuY3JlYXRlUGxhY2VtZW50R3JvdXAocCkpO1xyXG4gICAgY29uc3QgbGlicmFyeUNvbmZpZ3MgPSAoQXJyYXkuaXNBcnJheShzZWVkLmxpYnJhcnlDb25maWd1cmF0aW9ucykgPyBzZWVkLmxpYnJhcnlDb25maWd1cmF0aW9ucyA6IFtdKVxyXG4gICAgICAubWFwKChjOiBhbnkpID0+IHRoaXMuY3JlYXRlTGlicmFyeUNvbmZpZ0dyb3VwKGMpKTtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2xvdEluZGV4OiBbc2VlZC5zbG90SW5kZXggPz8gMSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHNsb3RUeXBlOiBbc2VlZC5zbG90VHlwZSB8fCAnc2hlbGYnXSxcclxuICAgICAgYnJhbmQ6IFtzZWVkLmJyYW5kIHx8ICcnXSxcclxuICAgICAgZml4dHVyZUxldmVsWm9uZTogW3NlZWQuZml4dHVyZUxldmVsWm9uZSB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVMaWJyYXJ5UmVmOiBbc2VlZC5maXh0dXJlTGlicmFyeVJlZiB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVMaWJyYXJ5TGFiZWw6IFtzZWVkLmZpeHR1cmVMaWJyYXJ5TGFiZWwgfHwgJyddLFxyXG4gICAgICBmaXh0dXJlTGlicmFyeVJlZnM6IFtBcnJheS5pc0FycmF5KHNlZWQuZml4dHVyZUxpYnJhcnlSZWZzKSA/IHNlZWQuZml4dHVyZUxpYnJhcnlSZWZzIDogW11dLFxyXG4gICAgICBwbGFjZW1lbnRzOiB0aGlzLmZiLmFycmF5KHBsYWNlbWVudHMpLFxyXG4gICAgICBsaWJyYXJ5Q29uZmlndXJhdGlvbnM6IHRoaXMuZmIuYXJyYXkobGlicmFyeUNvbmZpZ3MpLFxyXG4gICAgICAvLyBQZXItbGlicmFyeSBzbmFwc2hvdCBvZiB0aGUgZW1iZWRkZWQgZml4dHVyZS10ZW1wbGF0ZSBlZGl0b3Igc3RhdGVcclxuICAgICAgLy8gKHNoZWxmQ29uZmlnICsgcHJvZHVjdC9WTSBwbGFjZW1lbnRzKS4gS2V5ZWQgYnkgbGlicmFyeVJlZi5cclxuICAgICAgbGlicmFyeVNuYXBzaG90czogW1xyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2VlZC5saWJyYXJ5U25hcHNob3RzKSA/IHNlZWQubGlicmFyeVNuYXBzaG90cyA6IFtdLFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMaWJyYXJ5Q29uZmlnR3JvdXAoc2VlZDogYW55ID0ge30pOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBsaWJyYXJ5UmVmOiBbc2VlZC5saWJyYXJ5UmVmIHx8ICcnXSxcclxuICAgICAgc2hlbGZOdW1iZXI6IFtzZWVkLnNoZWxmTnVtYmVyID8/IDFdLFxyXG4gICAgICBsYWJlbDogW3NlZWQubGFiZWwgfHwgJyddLFxyXG4gICAgICBzaGVsZlR5cGU6IFtzZWVkLnNoZWxmVHlwZSB8fCAnJ10sXHJcbiAgICAgIC8vIFZNcyBhbmQgUElEcyBwaWNrZWQgZnJvbSB0aGUgc2xvdCdzIGBwbGFjZW1lbnRzYCBhcnJheSAoYnkgcG9zaXRpb24gbmFtZSkuXHJcbiAgICAgIHZtUmVmczogW0FycmF5LmlzQXJyYXkoc2VlZC52bVJlZnMpID8gc2VlZC52bVJlZnMgOiBbXV0sXHJcbiAgICAgIHBpZFJlZnM6IFtBcnJheS5pc0FycmF5KHNlZWQucGlkUmVmcykgPyBzZWVkLnBpZFJlZnMgOiBbXV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVBsYWNlbWVudEdyb3VwKHNlZWQ6IGFueSA9IHt9KTogRm9ybUdyb3VwIHtcclxuICAgIC8vIEJhY2t3YXJkLWNvbXBhdDogbGVnYWN5IGRhdGEgc3RvcmVkIGEgc2luZ2xlIHN0cmluZyBpbiBgcmF3VmFsdWVgLiBGb3JcclxuICAgIC8vIFBJRCBwbGFjZW1lbnRzIHdlIG5vdyB1c2UgYHJhd1ZhbHVlc2AgKGFycmF5LCBtdWx0aS1zZWxlY3QpLiBJZiB0aGVcclxuICAgIC8vIHNlZWQgb25seSBoYXMgYHJhd1ZhbHVlYCwgbWlncmF0ZSBpdCB0byB0aGUgYXJyYXkgb24gZmlyc3QgbG9hZC5cclxuICAgIGNvbnN0IHJhd1ZhbHVlc1NlZWQgPSBBcnJheS5pc0FycmF5KHNlZWQucmF3VmFsdWVzKVxyXG4gICAgICA/IHNlZWQucmF3VmFsdWVzXHJcbiAgICAgIDogKHNlZWQua2luZCA9PT0gJ3BpZCcgJiYgc2VlZC5yYXdWYWx1ZSA/IFtTdHJpbmcoc2VlZC5yYXdWYWx1ZSldIDogW10pO1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBwb3NpdGlvbjogW3NlZWQucG9zaXRpb24gfHwgJyddLFxyXG4gICAgICBraW5kOiBbc2VlZC5raW5kIHx8ICdwaWQnXSxcclxuICAgICAgLy8gRm9yIFZNIHJvd3MgdGhpcyBob2xkcyB0aGUgYXJ0d29yayBpZCAoc2luZ2xlIHN0cmluZykuIEZvciBQSUQgcm93c1xyXG4gICAgICAvLyBpdCdzIGxlZnQgZW1wdHkgaW4gZmF2b3VyIG9mIGByYXdWYWx1ZXNgLlxyXG4gICAgICByYXdWYWx1ZTogW3NlZWQua2luZCA9PT0gJ3BpZCcgPyAnJyA6IChzZWVkLnJhd1ZhbHVlIHx8ICcnKV0sXHJcbiAgICAgIHJhd1ZhbHVlczogW3Jhd1ZhbHVlc1NlZWRdLFxyXG4gICAgICB2bVJlZjogW3NlZWQudm1SZWYgfHwgJyddLFxyXG4gICAgICBza3VDb2xsZWN0aW9uUmVmOiBbc2VlZC5za3VDb2xsZWN0aW9uUmVmIHx8ICcnXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkUGxhY2VtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUGxhY2VtZW50cykgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZFBsYWNlbWVudHMucHVzaCh0aGlzLmNyZWF0ZVBsYWNlbWVudEdyb3VwKCkpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUGxhY2VtZW50KGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZFBsYWNlbWVudHMpIHJldHVybjtcclxuICAgIHRoaXMuc2VsZWN0ZWRQbGFjZW1lbnRzLnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm9ybVZtVHlwZSh0OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFN0cmluZyh0ID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdGFibGUgcGVyLXZtVHlwZSBhcnR3b3JrIGxpc3QgbG9va3VwLiBSZXR1cm5zIHRoZSBzYW1lIGFycmF5IHJlZmVyZW5jZVxyXG4gICAqICBmb3IgdGhlIHNhbWUgdm1UeXBlIGFjcm9zcyBDRCBjeWNsZXMgc28gbGliLXJlYWN0aXZlLXNlbGVjdCBkb2Vzbid0XHJcbiAgICogIHJlLWluaXQuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgbGlzdCB3aGVuIHZtVHlwZSBpcyBlbXB0eS4gKi9cclxuICB2bUFydHdvcmtPcHRpb25zRm9yKHZtVHlwZTogc3RyaW5nKTogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLm5vcm1WbVR5cGUodm1UeXBlKTtcclxuICAgIGlmIChrZXkgJiYgdGhpcy52bUFydHdvcmtCeVR5cGUuaGFzKGtleSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudm1BcnR3b3JrQnlUeXBlLmdldChrZXkpITtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnZtQXJ0d29ya0J5VHlwZS5nZXQoJycpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBvcHVsYXRlIHRoZSBkcm9wZG93biBkYXRhIHVzZWQgYnkgUGxhY2VtZW50IHJvd3M6XHJcbiAgICogIC0gVk0gVHlwZSBsaXN0IChgZ2V0Vm1UeXBlc0xpc3RgKVxyXG4gICAqICAtIFZNIEFydHdvcmsgbGlzdCAoYHZtTmFtZUxpc3RgKVxyXG4gICAqICAtIFByb2R1Y3QgLyBTS1UgY29sbGVjdGlvbiBsaXN0IChmbGF0dGVuZWQgZnJvbSBicmFuZCDihpIgY2F0ZWdvcnkgbWFwcGluZ1xyXG4gICAqICAgIHRoYXQgcG93ZXJzIC9tYW5hZ2UvcGxhbm9ncmFtL2NvbmZpZykuICovXHJcbiAgYXN5bmMgbG9hZFBsYWNlbWVudERyb3Bkb3duRGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgW3ZtVHlwZXNSZXMsIHZtc1JlcywgYnJhbmRzUmVzLCBicmFuZE1ldGFSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRWbVR5cGVzTGlzdCh0aGlzLmNsaWVudElkKSksXHJcbiAgICAgICAgbGFzdFZhbHVlRnJvbSh0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldFZNTmFtZUxpc3QodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZExpc3QodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZE1ldGFEYXRhKHRoaXMuY2xpZW50SWQpKSxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBjb25zdCB2bVR5cGVzOiBhbnlbXSA9ICh2bVR5cGVzUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIHRoaXMudm1UeXBlT3B0aW9ucyA9IHZtVHlwZXNcclxuICAgICAgICAubWFwKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHYgPSB0Py52bVR5cGUgfHwgdD8udm1UeXBlTmFtZSB8fCB0Py5uYW1lIHx8IHQ/Ll9pZDtcclxuICAgICAgICAgIGNvbnN0IGwgPSB0Py52bVR5cGVOYW1lIHx8IHQ/LnZtVHlwZSB8fCB0Py5uYW1lIHx8IHY7XHJcbiAgICAgICAgICByZXR1cm4gdiA/IHsgdmFsdWU6IFN0cmluZyh2KSwgbGFiZWw6IFN0cmluZyhsKSB9IDogbnVsbDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5maWx0ZXIoKHgpOiB4IGlzIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9ID0+ICEheCk7XHJcblxyXG4gICAgICBjb25zdCB2bXM6IGFueVtdID0gKHZtc1JlcyBhcyBhbnkpPy5kYXRhIHx8IFtdO1xyXG4gICAgICB0aGlzLnZtQXJ0d29ya09wdGlvbnMgPSB2bXNcclxuICAgICAgICAubWFwKCh2OiBhbnkpOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZtVHlwZT86IHN0cmluZyB9IHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpZCA9IHY/LnZtTmFtZSB8fCB2Py5faWQ7XHJcbiAgICAgICAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcoaWQpLFxyXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nKHY/LnZtTmFtZSB8fCBpZCksXHJcbiAgICAgICAgICAgIHZtVHlwZTogdj8udm1UeXBlID8gU3RyaW5nKHYudm1UeXBlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKCh4KTogeCBpcyB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZtVHlwZT86IHN0cmluZyB9ID0+ICEheCk7XHJcblxyXG4gICAgICAvLyAodm1OYW1lLCB2bVR5cGUpIOKGkiBfaWQgc28gd2UgY2FuIHR1cm4gYSBwbGFjZW1lbnQncyBhcnR3b3JrIE5BTUUgaW50b1xyXG4gICAgICAvLyB0aGUgcGxhbm92bSBfaWQgdGhlIGVtYmVkZGVkIFZNIGVkaXRvciBtYXRjaGVzIGFnYWluc3QuXHJcbiAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUgPSBuZXcgTWFwKCk7XHJcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2bXMpIHtcclxuICAgICAgICBpZiAoIXY/Ll9pZCB8fCAhdj8udm1OYW1lKSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5ub3JtVm1UeXBlKHYudm1OYW1lKTtcclxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5ub3JtVm1UeXBlKHYudm1UeXBlKTtcclxuICAgICAgICB0aGlzLnZtSWRCeU5hbWVUeXBlLnNldChgJHtuYW1lfXx8JHt0eXBlfWAsIFN0cmluZyh2Ll9pZCkpO1xyXG4gICAgICAgIGlmICghdGhpcy52bUlkQnlOYW1lVHlwZS5oYXMobmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUuc2V0KG5hbWUsIFN0cmluZyh2Ll9pZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVidWlsZCB0aGUgKHZtVHlwZSDihpIgYXJ0d29ya3MpIGluZGV4IG5vdyB0aGF0IHRoZSBhcnR3b3JrIGxpc3RcclxuICAgICAgLy8gY2hhbmdlZC4gS2V5cyBhcmUgbm9ybWFsaXNlZCAodHJpbSArIGxvd2VyLWNhc2UpIHNvIGEgbWlzbWF0Y2ggaW5cclxuICAgICAgLy8gY2FzaW5nL3doaXRlc3BhY2UgYmV0d2VlbiB2bVR5cGVzIGFuZCB2bXMudm1UeXBlIHN0aWxsIG1hdGNoZXMuXHJcbiAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlID0gbmV3IE1hcCgpO1xyXG4gICAgICBjb25zdCBmdWxsTGlzdCA9IHRoaXMudm1BcnR3b3JrT3B0aW9ucy5tYXAoKHYpID0+ICh7IHZhbHVlOiB2LnZhbHVlLCBsYWJlbDogdi5sYWJlbCB9KSk7XHJcbiAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlLnNldCgnJywgZnVsbExpc3QpO1xyXG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52bUFydHdvcmtPcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5ub3JtVm1UeXBlKHYudm1UeXBlKTtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZtQXJ0d29ya0J5VHlwZS5oYXMoa2V5KSkgdGhpcy52bUFydHdvcmtCeVR5cGUuc2V0KGtleSwgW10pO1xyXG4gICAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlLmdldChrZXkpIS5wdXNoKHsgdmFsdWU6IHYudmFsdWUsIGxhYmVsOiB2LmxhYmVsIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gdm1UeXBlczonLCB0aGlzLnZtVHlwZU9wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdhcnR3b3JrczonLCB0aGlzLnZtQXJ0d29ya09wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdhcnR3b3Jrc0J5VHlwZSBrZXlzOicsIEFycmF5LmZyb20odGhpcy52bUFydHdvcmtCeVR5cGUua2V5cygpKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIFNvdXJjZTogZXZlcnkgdmFsdWUgdGhlIGJyYW5kICYgcHJvZHVjdCBtYXBwaW5nIHBhZ2UgZXhwb3Nlcy5cclxuICAgICAgLy8gIC0gYGdldEJyYW5kTGlzdGAgICAgIOKGkiBwZXItYnJhbmQgYGNhdGVnb3J5W11gIGFuZCBgc3ViQ2F0ZWdvcnlbXWBcclxuICAgICAgLy8gIC0gYGdldEJyYW5kTWV0YURhdGFgIOKGkiByb3dzIHdpdGggYHBpZENhdGAsIGBjYXRlZ29yeWAsIGB0ZW1wR3JvdXBgXHJcbiAgICAgIGNvbnN0IGJyYW5kczogYW55W10gPSAoYnJhbmRzUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIGNvbnN0IGJyYW5kTWV0YTogYW55W10gPSAoYnJhbmRNZXRhUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIGNvbnN0IHNlZW5DYXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IHByb2R1Y3RzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICAgIGNvbnN0IHB1c2hPbmUgPSAodjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcyA9IFN0cmluZyh2ID8/ICcnKS50cmltKCk7XHJcbiAgICAgICAgaWYgKCFzIHx8IHNlZW5DYXRzLmhhcyhzKSkgcmV0dXJuO1xyXG4gICAgICAgIHNlZW5DYXRzLmFkZChzKTtcclxuICAgICAgICBwcm9kdWN0cy5wdXNoKHsgdmFsdWU6IHMsIGxhYmVsOiBzIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBwdXNoQXJyID0gKGFycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybjtcclxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgYXJyKSBwdXNoT25lKHYpO1xyXG4gICAgICB9O1xyXG4gICAgICBmb3IgKGNvbnN0IGIgb2YgYnJhbmRzKSB7XHJcbiAgICAgICAgcHVzaEFycihiPy5jYXRlZ29yeSk7XHJcbiAgICAgICAgcHVzaEFycihiPy5zdWJDYXRlZ29yeSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCByb3cgb2YgYnJhbmRNZXRhKSB7XHJcbiAgICAgICAgcHVzaE9uZShyb3c/LnBpZENhdCk7XHJcbiAgICAgICAgcHVzaE9uZShyb3c/LmNhdGVnb3J5KTtcclxuICAgICAgICBwdXNoT25lKHJvdz8udGVtcEdyb3VwKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnByb2R1Y3RPcHRpb25zID0gcHJvZHVjdHM7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gcHJvZHVjdC9TS1Ugb3B0aW9uczonLFxyXG4gICAgICAgIHRoaXMucHJvZHVjdE9wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdmcm9tJyxcclxuICAgICAgICBicmFuZHMubGVuZ3RoLFxyXG4gICAgICAgICdicmFuZHMgYW5kJyxcclxuICAgICAgICBicmFuZE1ldGEubGVuZ3RoLFxyXG4gICAgICAgICdicmFuZC1tZXRhIHJvd3MnLFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdAQCB+IGxvYWRQbGFjZW1lbnREcm9wZG93bkRhdGEgW0VSUl06JywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRGaXh0dXJlTGlicmFyaWVzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBPbmx5IGxpc3QgZml4dHVyZSB0ZW1wbGF0ZXMgYXZhaWxhYmxlIGluIEluZGlhIChjb3VudHJ5IGNvZGUgJ0lOJykuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJOYW1lTGlzdCh0aGlzLmNsaWVudElkLCAnbm9uLWRyYWZ0JywgJ0lOJyksXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIFJlc3BvbnNlIHNoYXBlOiB7IGNvZGUsIHN0YXR1cywgZGF0YTogW3sgaWQsIGZpeHR1cmVOYW1lLCBmaXh0dXJlVHlwZSB9XSB9LlxyXG4gICAgICBjb25zdCBsaXN0OiB7IGlkOiBzdHJpbmc7IGZpeHR1cmVOYW1lOiBzdHJpbmc7IGZpeHR1cmVUeXBlOiBzdHJpbmcgfVtdID1cclxuICAgICAgICBBcnJheS5pc0FycmF5KHJlcz8uZGF0YSkgPyByZXMuZGF0YSA6IFtdO1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMgPSBsaXN0Lm1hcCgobCkgPT4gKHtcclxuICAgICAgICBpZDogbC5pZCxcclxuICAgICAgICBuYW1lOiBsLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgIGZpeHR1cmVUeXBlOiAobC5maXh0dXJlVHlwZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKSxcclxuICAgICAgfSkpO1xyXG4gICAgICBjb25zdCB0eXBlVGFsbHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBpdCBvZiB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMpIHtcclxuICAgICAgICBjb25zdCBrID0gaXQuZml4dHVyZVR5cGUgfHwgJyhlbXB0eSknO1xyXG4gICAgICAgIHR5cGVUYWxseVtrXSA9ICh0eXBlVGFsbHlba10gfHwgMCkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gZml4dHVyZSBsaWJyYXJpZXMgbG9hZGVkOicsXHJcbiAgICAgICAgdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAnZml4dHVyZVR5cGUgdGFsbHk6JyxcclxuICAgICAgICB0eXBlVGFsbHksXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZygnQEAgfiBsb2FkRml4dHVyZUxpYnJhcmllcyBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlY29tcHV0ZSB0aGUgc2xvdC10eXBlLWZpbHRlcmVkIGxpYnJhcnkgbGlzdCBvbmNlLiBTdGFibGUgcmVmZXJlbmNlXHJcbiAgICogc28gdGhlIG11bHRpc2VsZWN0IGRvZXNuJ3QgdGVhciBkb3duIGl0cyBjbGljayB0YXJnZXRzIGV2ZXJ5IENEIGN5Y2xlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkge1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90ID0gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLnNsaWNlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNsb3RUeXBlID0gc2xvdC5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gc2xvdFR5cGUgPT09ICdldXJvY2VudGVyJyA/ICdmbG9vcicgOiAnd2FsbCc7XHJcbiAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90ID0gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCB0ID0gaXRlbS5maXh0dXJlVHlwZTtcclxuICAgICAgaWYgKCF0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0YXJnZXQgPT09ICd3YWxsJykgcmV0dXJuIHQgPT09ICd3YWxsJyB8fCB0LmluY2x1ZGVzKCd3YWxsJyk7XHJcbiAgICAgIHJldHVybiB0ID09PSAnZmxvb3InIHx8IHQuaW5jbHVkZXMoJ2Zsb29yJykgfHwgdC5pbmNsdWRlcygnZXVybycpIHx8IHQuaW5jbHVkZXMoJ2ZyZWUnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9ucyBzY29wZWQgdG8gd2hpY2hldmVyIHNsb3QgaXMgY3VycmVudGx5IGFjdGl2ZS4gQ2xlYXJlZCBhbmRcclxuICAgKiByZWJ1aWx0IGV2ZXJ5IHRpbWUgdGhlIGFjdGl2ZSBzbG90IGNoYW5nZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzbG90U3ViczogYW55W10gPSBbXTtcclxuXHJcbiAgLyoqIFBlbmRpbmcgYXV0by1hcHBseSBwcm9taXNlcyBrZXllZCBieSBsaWJJZCBzbyBjaGlwIGNsaWNrcyBjYW4gYXdhaXQuICovXHJcbiAgcHJpdmF0ZSBhdXRvQXBwbHlJbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xyXG5cclxuICAvKiogV2lyZS9yZWZyZXNoIHN1YnNjcmlwdGlvbnMgdGhhdCBkZXBlbmQgb24gdGhlIGFjdGl2ZSBzbG90OlxyXG4gICAqICAtIHJlLWZpbHRlciB0aGUgbGlicmFyeSBtdWx0aXNlbGVjdCB3aGVuIHNsb3RUeXBlIGNoYW5nZXNcclxuICAgKiAgLSBydW4gYXV0by1hcHBseSB3aGVuIGEgbmV3IGxpYnJhcnkgaXMgYWRkZWQgdG8gZml4dHVyZUxpYnJhcnlSZWZzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBiaW5kQWN0aXZlU2xvdExpc3RlbmVycygpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnNsb3RTdWJzKSBzPy51bnN1YnNjcmliZT8uKCk7XHJcbiAgICB0aGlzLnNsb3RTdWJzID0gW107XHJcblxyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICBpZiAoIXNsb3QpIHtcclxuICAgICAgdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zRm9yU2xvdCA9IHRoaXMuZml4dHVyZUxpYnJhcnlJdGVtcy5zbGljZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlY29tcHV0ZUZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90KCk7XHJcblxyXG4gICAgY29uc3QgdHlwZVN1YiA9IHNsb3QuZ2V0KCdzbG90VHlwZScpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKSk7XHJcbiAgICBpZiAodHlwZVN1YikgdGhpcy5zbG90U3Vicy5wdXNoKHR5cGVTdWIpO1xyXG5cclxuICAgIC8vIFRyYWNrIHByZXZpb3VzIHJlZnMgc28gd2UgY2FuIGRldGVjdCAqbmV3KiBhZGRpdGlvbnMgYW5kIGF1dG8tYXBwbHlcclxuICAgIC8vIHRoZSBzbG90J3MgUElEcyB0byB0aG9zZSBuZXcgbGlicmFyaWVzLlxyXG4gICAgbGV0IHByZXZSZWZzOiBzdHJpbmdbXSA9IFsuLi4oc2xvdC5nZXQoJ2ZpeHR1cmVMaWJyYXJ5UmVmcycpPy52YWx1ZSB8fCBbXSldO1xyXG4gICAgY29uc3QgcmVmc1N1YiA9IHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgobmV4dFJlZnM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5leHQgPSBBcnJheS5pc0FycmF5KG5leHRSZWZzKSA/IG5leHRSZWZzIDogW107XHJcbiAgICAgIGNvbnN0IGFkZGVkID0gbmV4dC5maWx0ZXIoKHIpID0+ICEhciAmJiAhcHJldlJlZnMuaW5jbHVkZXMocikpO1xyXG4gICAgICBwcmV2UmVmcyA9IFsuLi5uZXh0XTtcclxuXHJcbiAgICAgIC8vIElmIHRoZSBjdXJyZW50bHktcHJldmlld2VkIGxpYnJhcnkgd2FzIHVuc2VsZWN0ZWQsIGNsZWFyIHRoZVxyXG4gICAgICAvLyBlbWJlZGRlZCB2aWV3IHNvIHdlIGRvbid0IHNob3cgc3RhbGUgZGF0YS5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcFxyXG4gICAgICAgICAgJiYgIW5leHQuaW5jbHVkZXModGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLm9uTGlicmFyeU1hcFNlbGVjdCgnJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgbGliSWQgb2YgYWRkZWQpIHtcclxuICAgICAgICBjb25zdCBwID0gdGhpcy5hdXRvQXBwbHlQaWRzVG9MaWJyYXJ5KGxpYklkKTtcclxuICAgICAgICB0aGlzLmF1dG9BcHBseUluRmxpZ2h0LnNldChsaWJJZCwgcCk7XHJcbiAgICAgICAgcC5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmF1dG9BcHBseUluRmxpZ2h0LmdldChsaWJJZCkgPT09IHApIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRvQXBwbHlJbkZsaWdodC5kZWxldGUobGliSWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBub3RoaW5nIGlzIGJlaW5nIHByZXZpZXdlZCB5ZXQsIGF1dG8tYWN0aXZhdGUgdGhlIGZpcnN0IGxpYnJhcnlcclxuICAgICAgLy8gdGhlIHVzZXIganVzdCBhZGRlZCBzbyB0aGUgZW1iZWRkZWQgUElEL1ZNIGVkaXRvciBvcGVucyBpbW1lZGlhdGVseVxyXG4gICAgICAvLyAoZXNwZWNpYWxseSByZWxldmFudCB3aGVuIGFkZGluZyB0aGUgRklSU1QgbGlicmFyeSB0byBhbiBlbXB0eVxyXG4gICAgICAvLyBtdWx0aXNlbGVjdCDigJQgcHJldmlvdXNseSB0aGUgY2hpcCBzdHJpcCBzaG93ZWQgaXQgYnV0IHRoZSBwcmV2aWV3XHJcbiAgICAgIC8vIHBhbmUgc3RheWVkIGJsYW5rIHVudGlsIHRoZSB1c2VyIGNsaWNrZWQgdGhlIGNoaXApLlxyXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0QWN0aXZlID0gYWRkZWQuZmluZCgoaWQpID0+ICEhaWQpIHx8IG5leHQuZmluZCgoaWQpID0+ICEhaWQpO1xyXG4gICAgICAgIGlmIChmaXJzdEFjdGl2ZSkgdGhpcy5vbkxpYnJhcnlNYXBTZWxlY3QoZmlyc3RBY3RpdmUpO1xyXG4gICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHJlZnNTdWIpIHRoaXMuc2xvdFN1YnMucHVzaChyZWZzU3ViKTtcclxuXHJcbiAgICAvLyBXaGVuIGFueSBwbGFjZW1lbnQgaW4gdGhlIFwiTG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmcgUGxhY2VtZW50c1wiXHJcbiAgICAvLyBsaXN0IGNoYW5nZXMsIHJlLWRlcml2ZSBldmVyeSBhc3NpZ25lZCBsaWJyYXJ5J3Mgc25hcHNob3Qgc28gdGhlIGVkaXRcclxuICAgIC8vIHByb3BhZ2F0ZXMgdG8gYWxsIG9mIHRoZW0uIERlYm91bmNlZCBzbyByYXBpZCB0eXBpbmcgY29sbGFwc2VzIGludG8gYVxyXG4gICAgLy8gc2luZ2xlIHJlLWFwcGx5LlxyXG4gICAgY29uc3QgcGxhY2VtZW50c0FyciA9IHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgIGNvbnN0IHBsYWNlbWVudHNTdWIgPSBwbGFjZW1lbnRzQXJyPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDQwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFwcGx5UGxhY2VtZW50c1RvQXNzaWduZWRMaWJyYXJpZXMoKSk7XHJcbiAgICBpZiAocGxhY2VtZW50c1N1YikgdGhpcy5zbG90U3Vicy5wdXNoKHBsYWNlbWVudHNTdWIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBhIG5ldyBsaWJyYXJ5IGlzIGFkZGVkIHRvIHRoZSBzbG90LCB3YWxrIGl0cyBzaGVsZkNvbmZpZyBhbmQgZm9yXHJcbiAgICogZWFjaCBzaGVsZiB3aG9zZSBzZWN0aW9uIGN1cnJlbnRseSBoYXMgbm8gYnJhbmQsIGNvcHkgdGhlIHJhd1ZhbHVlIG9mXHJcbiAgICogdGhlIHNsb3QncyBQSUQgcGxhY2VtZW50IHdob3NlIGBwb3NpdGlvbmAgbWF0Y2hlcyB0aGUgc2hlbGYnc1xyXG4gICAqIGB6b25lYC9gbGFiZWxgLiBSZXN1bHQgaXMgc2F2ZWQgYXMgdGhlIGxpYnJhcnkncyBzbmFwc2hvdCBzbyB0aGVcclxuICAgKiBlbWJlZGRlZCBmaXh0dXJlLXRlbXBsYXRlIGVkaXRvciBwaWNrcyBpdCB1cCB0aGUgbmV4dCB0aW1lIHRoZSBjaGlwXHJcbiAgICogaXMgb3BlbmVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYXV0b0FwcGx5UGlkc1RvTGlicmFyeShsaWJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWxpYklkKSByZXR1cm47XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBsYWNlbWVudHNBcnIgPSBzbG90LmdldCgncGxhY2VtZW50cycpIGFzIEZvcm1BcnJheSB8IG51bGw7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzOiBhbnlbXSA9IHBsYWNlbWVudHNBcnI/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgcGlkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKFxyXG4gICAgICAocCkgPT4gcD8ua2luZCA9PT0gJ3BpZCcgJiYgcD8ucG9zaXRpb24gJiYgcD8ucmF3VmFsdWUsXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IG5vcm0gPSAoczogYW55KTogc3RyaW5nID0+IFN0cmluZyhzID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBwbGFjZW1lbnRNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHBpZFBsYWNlbWVudHMpIHtcclxuICAgICAgcGxhY2VtZW50TWFwLnNldChub3JtKHAucG9zaXRpb24pLCBTdHJpbmcocC5yYXdWYWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFN0YXJ0IGZyb20gYW4gZXhpc3Rpbmcgc25hcHNob3QgaWYgd2UgYWxyZWFkeSBzYXZlZCBvbmUgZm9yIHRoaXMgc2xvdFxyXG4gICAgLy8gKyBsaWJyYXJ5OyBvdGhlcndpc2UgZmV0Y2ggdGhlIGZyZXNoIGxpYnJhcnkgZG9jLiBUaGUgcGVyLWZpZWxkIGd1YXJkc1xyXG4gICAgLy8gYmVsb3cgc3RpbGwgZW5zdXJlIHdlIG5ldmVyIG92ZXJ3cml0ZSB1c2VyLXNldCBicmFuZHMgb3IgVk1zLlxyXG4gICAgbGV0IGxpYkRhdGE6IGFueSA9IHRoaXMuZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkKTtcclxuICAgIGlmICghbGliRGF0YSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0Rml4dHVyZUxpYnJhcnlEZXRhaWxzKGxpYklkKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxpYkRhdGEgPSByZXM/LmRhdGE7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdAQCB+IGF1dG9BcHBseVBpZHNUb0xpYnJhcnkgW0VSUl06JywgZXJyKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghbGliRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNoZWxmQ29uZmlnOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkobGliRGF0YS5zaGVsZkNvbmZpZykgPyBsaWJEYXRhLnNoZWxmQ29uZmlnIDogW107XHJcbiAgICBsZXQgcGlkc0FwcGxpZWQgPSBmYWxzZTtcclxuICAgIGNvbnN0IG5ld1NoZWxmQ29uZmlnID0gc2hlbGZDb25maWcubWFwKChzaGVsZjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNoZWxmPy5wcm9kdWN0QnJhbmROYW1lKSAmJiBzaGVsZi5wcm9kdWN0QnJhbmROYW1lLmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXR1cm4gc2hlbGY7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSBzaGVsZj8uem9uZSB8fCBzaGVsZj8ubGFiZWwgfHwgJyc7XHJcbiAgICAgIGNvbnN0IG1hdGNoS2V5ID0gbm9ybShzb3VyY2VMYWJlbCk7XHJcbiAgICAgIGlmICghbWF0Y2hLZXkpIHJldHVybiBzaGVsZjtcclxuICAgICAgY29uc3QgbWF0Y2ggPSBwbGFjZW1lbnRNYXAuZ2V0KG1hdGNoS2V5KTtcclxuICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuIHNoZWxmO1xyXG4gICAgICBwaWRzQXBwbGllZCA9IHRydWU7XHJcbiAgICAgIC8vIGdyb3VwU2hlbHZlc0J5Wm9uZSgpIGluIFRlbXBsYXRlUHJvZHVjdHNDb21wb25lbnQgU0tJUFMgYW55IHNoZWxmXHJcbiAgICAgIC8vIHdob3NlIGB6b25lYCBpcyBlbXB0eSwgc28gd2UgbXVzdCBzZXQgem9uZSAodXNpbmcgdGhlIHNoZWxmJ3MgbGFiZWxcclxuICAgICAgLy8gaWYgaXQgaXNuJ3QgYWxyZWFkeSBzZXQpIGZvciB0aGUgc2VjdGlvbiB0byBmb3JtLlxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLnNoZWxmLFxyXG4gICAgICAgIHpvbmU6IHNoZWxmPy56b25lIHx8IHNvdXJjZUxhYmVsLFxyXG4gICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFttYXRjaF0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyAtLS0gVk0gYXV0by1hcHBseSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gSWYgdGhlIGxpYnJhcnkgaGFzIG5vIFZNcyBjb25maWd1cmVkIHlldCwgY29weSBlYWNoIG9mIHRoZSBzbG90J3MgVk1cclxuICAgIC8vIHBsYWNlbWVudHMgb3ZlciBhcyBhIHZtQ29uZmlnIGVudHJ5LiBObyBwb3NpdGlvbi1iYXNlZCBtYXRjaGluZyBoZXJlIOKAlFxyXG4gICAgLy8gdGhlIHBsYWNlbWVudCdzIGByYXdWYWx1ZWAgYmVjb21lcyB0aGUgVk0gYXJ0d29yayBhbmQgYHBvc2l0aW9uYFxyXG4gICAgLy8gYmVjb21lcyB0aGUgVk0gdHlwZSBsYWJlbC5cclxuICAgIGNvbnN0IGV4aXN0aW5nVm1zID0gQXJyYXkuaXNBcnJheShsaWJEYXRhLnZtQ29uZmlnKSA/IGxpYkRhdGEudm1Db25maWcgOiBbXTtcclxuICAgIGxldCBuZXdWbUNvbmZpZyA9IGV4aXN0aW5nVm1zO1xyXG4gICAgbGV0IHZtc0FwcGxpZWQgPSBmYWxzZTtcclxuICAgIGlmIChleGlzdGluZ1Ztcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3Qgdm1QbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoXHJcbiAgICAgICAgKHApID0+IHA/LmtpbmQgPT09ICd2bScgJiYgcD8ucmF3VmFsdWUsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh2bVBsYWNlbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIG5ld1ZtQ29uZmlnID0gdm1QbGFjZW1lbnRzLm1hcCgocCkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgdm1UeXBlID0gU3RyaW5nKHA/LnBvc2l0aW9uIHx8ICcnKTtcclxuICAgICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMuaW5pdGlhbFZtTGF5b3V0KHZtVHlwZSwgbmV3U2hlbGZDb25maWcpO1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdm1UeXBlLFxyXG4gICAgICAgICAgICB2bUlkOiBTdHJpbmcocD8ucmF3VmFsdWUgfHwgJycpLFxyXG4gICAgICAgICAgICB2bU5hbWU6IFN0cmluZyhwPy5yYXdWYWx1ZSB8fCAnJyksXHJcbiAgICAgICAgICAgIC4uLmxheW91dCxcclxuICAgICAgICAgICAgcG9zaXRpb246ICcnLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB2bXNBcHBsaWVkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghcGlkc0FwcGxpZWQgJiYgIXZtc0FwcGxpZWQpIHJldHVybjtcclxuXHJcbiAgICAvLyBUaGUgZW1iZWRkZWQgVGVtcGxhdGVQcm9kdWN0c0NvbXBvbmVudCBvbmx5IHJlYWRzIHNlY3Rpb24tbGV2ZWwgYnJhbmRcclxuICAgIC8vIHZhbHVlcyB3aGVuIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWwgPT09ICdMMycuXHJcbiAgICBjb25zdCB1cGRhdGVkTGliID0ge1xyXG4gICAgICAuLi5saWJEYXRhLFxyXG4gICAgICBzaGVsZkNvbmZpZzogbmV3U2hlbGZDb25maWcsXHJcbiAgICAgIHZtQ29uZmlnOiBuZXdWbUNvbmZpZyxcclxuICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogJ0wzJyxcclxuICAgIH07XHJcbiAgICB0aGlzLmNhcHR1cmVMaWJyYXJ5U25hcHNob3QobGliSWQsIHVwZGF0ZWRMaWIpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZERldGFpbHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sbGVjdGlvbklkKSByZXR1cm47XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0TG9va1BsYW5vQ29sbGVjdGlvbkRldGFpbHModGhpcy5jb2xsZWN0aW9uSWQpLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhO1xyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSB8fCAnJyxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgaXNBY3RpdmU6ICEhZGF0YS5pc0FjdGl2ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmxvb2tzLmNsZWFyKCk7XHJcbiAgICAgICAgKGRhdGEubG9va3MgfHwgW10pLmZvckVhY2goKGw6IGFueSkgPT4gdGhpcy5sb29rcy5wdXNoKHRoaXMuY3JlYXRlTG9va0dyb3VwKGwpKSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCA9IHRoaXMubG9va3MubGVuZ3RoID8gMCA6IC0xO1xyXG4gICAgICAgIGNvbnN0IHNsb3RzID0gdGhpcy5zZWxlY3RlZExvb2tJbmRleCA+PSAwID8gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBzbG90cyAmJiBzbG90cy5sZW5ndGggPyAwIDogLTE7XHJcbiAgICAgICAgdGhpcy5yZXNldExpYnJhcnlNYXAoKTtcclxuICAgICAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgICAgICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RMaWJyYXJ5KCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZygnQEAgfiBsb2FkRGV0YWlscyBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3Q/LignRmFpbGVkIHRvIGxvYWQgTG9vayBjb2xsZWN0aW9uJyk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZExvb2soKSB7XHJcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5jcmVhdGVMb29rR3JvdXAoeyBtYnFCdWNrZXQ6ICcnLCBmaXh0dXJlQ291bnQ6IDEgfSk7XHJcbiAgICB0aGlzLmxvb2tzLnB1c2gobmV4dCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID0gdGhpcy5sb29rcy5sZW5ndGggLSAxO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHRoaXMuZml4dHVyZVNsb3RzKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpLmxlbmd0aCA/IDAgOiAtMTtcclxuICAgIHRoaXMuYmluZEFjdGl2ZVNsb3RMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUxvb2soaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5sb29rcy5yZW1vdmVBdChpbmRleCk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb2tJbmRleCA9PT0gaW5kZXgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCA9IHRoaXMubG9va3MubGVuZ3RoID8gMCA6IC0xO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID0gLTE7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPiBpbmRleCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4IC09IDE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RMb29rKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPSBpbmRleDtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5maXh0dXJlU2xvdHMoaW5kZXgpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzLmxlbmd0aCA/IDAgOiAtMTtcclxuICAgIHRoaXMucmVzZXRMaWJyYXJ5TWFwKCk7XHJcbiAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLmF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTtcclxuICB9XHJcblxyXG4gIGFkZFNsb3QoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb2tJbmRleCA8IDApIHJldHVybjtcclxuICAgIGNvbnN0IGxvb2tHcm91cCA9IHRoaXMubG9va3MuYXQodGhpcy5zZWxlY3RlZExvb2tJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3Qgc2xvdHMgPSB0aGlzLmZpeHR1cmVTbG90cyh0aGlzLnNlbGVjdGVkTG9va0luZGV4KTtcclxuICAgIHNsb3RzLnB1c2godGhpcy5jcmVhdGVTbG90R3JvdXAoeyBzbG90SW5kZXg6IHNsb3RzLmxlbmd0aCArIDEgfSkpO1xyXG4gICAgbG9va0dyb3VwLmdldCgnZml4dHVyZUNvdW50JykhLnNldFZhbHVlKHNsb3RzLmxlbmd0aCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzLmxlbmd0aCAtIDE7XHJcbiAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVTbG90KHNsb3RJbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvb2tJbmRleCA8IDApIHJldHVybjtcclxuICAgIGNvbnN0IGxvb2tHcm91cCA9IHRoaXMubG9va3MuYXQodGhpcy5zZWxlY3RlZExvb2tJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3Qgc2xvdHMgPSB0aGlzLmZpeHR1cmVTbG90cyh0aGlzLnNlbGVjdGVkTG9va0luZGV4KTtcclxuICAgIHNsb3RzLnJlbW92ZUF0KHNsb3RJbmRleCk7XHJcbiAgICB0aGlzLnJlbnVtYmVyU2xvdHNGb3JHcm91cChsb29rR3JvdXApO1xyXG4gICAgbG9va0dyb3VwLmdldCgnZml4dHVyZUNvdW50JykhLnNldFZhbHVlKHNsb3RzLmxlbmd0aCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPT09IHNsb3RJbmRleCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID0gc2xvdHMubGVuZ3RoID8gTWF0aC5taW4oc2xvdEluZGV4LCBzbG90cy5sZW5ndGggLSAxKSA6IC0xO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID4gc2xvdEluZGV4KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggLT0gMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbnVtYmVyU2xvdHNGb3JHcm91cChsb29rR3JvdXA6IEZvcm1Hcm91cCkge1xyXG4gICAgY29uc3Qgc2xvdHNBcnIgPSBsb29rR3JvdXAuZ2V0KCdmaXh0dXJlU2xvdHMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICBzbG90c0Fyci5jb250cm9scy5mb3JFYWNoKChzbG90LCBpKSA9PiB7XHJcbiAgICAgIChzbG90IGFzIEZvcm1Hcm91cCkuZ2V0KCdzbG90SW5kZXgnKT8uc2V0VmFsdWUoaSArIDEsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U2xvdChzbG90SW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RJbmRleDtcclxuICAgIHRoaXMucmVzZXRMaWJyYXJ5TWFwKCk7XHJcbiAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgICB0aGlzLmF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTtcclxuICB9XHJcblxyXG4gIGxvb2tUaXRsZShsb29rR3JvdXA6IEZvcm1Hcm91cCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBrZXlUeXBlID0gbG9va0dyb3VwLmdldCgna2V5VHlwZScpPy52YWx1ZTtcclxuICAgIGNvbnN0IGtleSA9IGtleVR5cGUgPT09ICdicmFuZENhdGVnb3J5J1xyXG4gICAgICA/IGxvb2tHcm91cC5nZXQoJ2JyYW5kQ2F0ZWdvcnknKT8udmFsdWVcclxuICAgICAgOiBsb29rR3JvdXAuZ2V0KCdtYnFCdWNrZXQnKT8udmFsdWU7XHJcbiAgICBjb25zdCBjb3VudCA9IGxvb2tHcm91cC5nZXQoJ2ZpeHR1cmVDb3VudCcpPy52YWx1ZTtcclxuICAgIHJldHVybiBgJHtrZXkgfHwgJyh1bm5hbWVkKSd9IOKAlCAke2NvdW50IHx8IDB9IGZpeHR1cmVzYDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3J0IHZpc3VhbCBpbmRpY2F0b3IgZm9yIHRoZSBzbG90VHlwZSBtaXggb2YgYSBsb29rIOKAlCByZW5kZXJlZCBhcyBhXHJcbiAgICogY29sb3VyZWQgY2hpcCBpbiB0aGUgTUJRIEJ1Y2tldCAtIEZpeHR1cmUgQ29tYmluYXRpb25zIGxpc3QuIFJldHVybnNcclxuICAgKiBgbnVsbGAgZm9yIGFuIGVtcHR5IGxvb2sgc28gdGhlIGNoaXAgaXMgaGlkZGVuLlxyXG4gICAqL1xyXG4gIGZpeHR1cmVUeXBlQmFkZ2UobG9va0dyb3VwOiBGb3JtR3JvdXApOiB7IGxhYmVsOiBzdHJpbmc7IGNsczogc3RyaW5nIH0gfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3RzID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgIGlmICghc2xvdHMgfHwgc2xvdHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCBoYXNTaGVsZiA9IGZhbHNlO1xyXG4gICAgbGV0IGhhc0V1cm8gPSBmYWxzZTtcclxuICAgIGZvciAoY29uc3QgYyBvZiBzbG90cy5jb250cm9scykge1xyXG4gICAgICBjb25zdCB0ID0gKGMgYXMgRm9ybUdyb3VwKS5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlO1xyXG4gICAgICBpZiAodCA9PT0gJ2V1cm9jZW50ZXInKSBoYXNFdXJvID0gdHJ1ZTtcclxuICAgICAgZWxzZSBoYXNTaGVsZiA9IHRydWU7XHJcbiAgICAgIGlmIChoYXNTaGVsZiAmJiBoYXNFdXJvKSBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChoYXNTaGVsZiAmJiBoYXNFdXJvKSByZXR1cm4geyBsYWJlbDogJ1dhbGwgKyBGbG9vcicsIGNsczogJ2JhZGdlLW1peGVkJyB9O1xyXG4gICAgaWYgKGhhc0V1cm8pIHJldHVybiB7IGxhYmVsOiAnRmxvb3InLCBjbHM6ICdiYWRnZS1mbG9vcicgfTtcclxuICAgIHJldHVybiB7IGxhYmVsOiAnV2FsbCcsIGNsczogJ2JhZGdlLXdhbGwnIH07XHJcbiAgfVxyXG5cclxuICBidWNrZXRLZXkobG9va0dyb3VwOiBGb3JtR3JvdXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5VHlwZSA9IGxvb2tHcm91cC5nZXQoJ2tleVR5cGUnKT8udmFsdWU7XHJcbiAgICBjb25zdCBrZXkgPSBrZXlUeXBlID09PSAnYnJhbmRDYXRlZ29yeSdcclxuICAgICAgPyBsb29rR3JvdXAuZ2V0KCdicmFuZENhdGVnb3J5Jyk/LnZhbHVlXHJcbiAgICAgIDogbG9va0dyb3VwLmdldCgnbWJxQnVja2V0Jyk/LnZhbHVlO1xyXG4gICAgcmV0dXJuIChrZXkgfHwgJycpLnRyaW0oKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFzc2lnbiBhIGNvbG91ciB0byBlYWNoIHVuaXF1ZSBidWNrZXQga2V5IGJ5ICoqaW5zZXJ0aW9uIG9yZGVyKiosIG5vdCBieSBoYXNoLlxyXG4gICAqIFRoZSBOdGggZGlzdGluY3QgYnVja2V0IChjb3VudGVkIHRvcC10by1ib3R0b20gdGhyb3VnaCB0aGUgbG9va3MgYXJyYXkpIGdldHNcclxuICAgKiBgQlVDS0VUX1BBTEVUVEVbTl1gLiBPbmx5IGFmdGVyIGFsbCAyMCBwYWxldHRlIHNsb3RzIGFyZSB1c2VkIGRvZXMgdGhlIGFzc2lnbm1lbnRcclxuICAgKiB3cmFwIGFyb3VuZCDigJQgc28gbm8gY29sb3VyIGlzIGV2ZXIgcmV1c2VkIHdoaWxlIDwgMjAgZGlzdGluY3QgYnVja2V0cyBleGlzdC5cclxuICAgKlxyXG4gICAqIFJlY29tcHV0ZWQgb24gZXZlcnkgY2FsbCBzbyBsaXZlIGVkaXRzIHRvIHRoZSBidWNrZXQgbmFtZSByZS1mbG93IGNvbG91cnMuXHJcbiAgICovXHJcbiAgYnVja2V0Q29sb3IobG9va0dyb3VwOiBGb3JtR3JvdXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWNrZXRLZXkobG9va0dyb3VwKTtcclxuICAgIGlmICgha2V5KSByZXR1cm4gJyNmOWZhZmInO1xyXG4gICAgY29uc3QgcGFsZXR0ZSA9IExvb2tQbGFub0NvbGxlY3Rpb25Gb3JtQ29tcG9uZW50LkJVQ0tFVF9QQUxFVFRFO1xyXG4gICAgbGV0IG5leHRJbmRleCA9IDA7XHJcbiAgICBjb25zdCBhc3NpZ25lZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMubG9va3MuY29udHJvbHMpIHtcclxuICAgICAgY29uc3QgayA9IHRoaXMuYnVja2V0S2V5KGdyb3VwIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgIGlmIChrICYmICFhc3NpZ25lZC5oYXMoaykpIHtcclxuICAgICAgICBhc3NpZ25lZC5zZXQoaywgcGFsZXR0ZVtuZXh0SW5kZXggJSBwYWxldHRlLmxlbmd0aF0pO1xyXG4gICAgICAgIG5leHRJbmRleCArPSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChrID09PSBrZXkpIHtcclxuICAgICAgICByZXR1cm4gYXNzaWduZWQuZ2V0KGspITtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcjZjlmYWZiJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlb3JkZXIgdGhlIGxvb2tzIEZvcm1BcnJheSBzbyB0aGF0IHRoZSBidWNrZXQgd2l0aCB0aGUgKiptb3N0KiogbG9va3NcclxuICAgKiBjb21lcyBmaXJzdCBhbmQgdGhlIG9uZSB3aXRoIHRoZSBmZXdlc3QgY29tZXMgbGFzdCAoYWxwaGFiZXRpY2FsIHRpZS1icmVha1xyXG4gICAqIHdpdGhpbiB0aGUgc2FtZSBjb3VudCkuIExvb2tzIHdpdGhpbiB0aGUgc2FtZSBidWNrZXQgYXJlIHNvcnRlZCBieVxyXG4gICAqIGFzY2VuZGluZyBmaXh0dXJlQ291bnQuIFNlbGVjdGlvbiBpcyBwcmVzZXJ2ZWQgYnkgcmVmZXJlbmNlLCBub3QgYnkgaW5kZXguXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseVNvcnRlZE9yZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy5sb29rcy5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIGlmIChncm91cHMubGVuZ3RoIDw9IDEpIHJldHVybjtcclxuXHJcbiAgICAvLyBUYWxseSBob3cgbWFueSBsb29rcyBlYWNoIGJ1Y2tldCBoYXMgc28gd2UgY2FuIHNvcnQgYnVja2V0cyBieSBmcmVxdWVuY3kuXHJcbiAgICBjb25zdCBidWNrZXRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG4gICAgZm9yIChjb25zdCBnIG9mIGdyb3Vwcykge1xyXG4gICAgICBjb25zdCBrID0gdGhpcy5idWNrZXRLZXkoZyk7XHJcbiAgICAgIGlmICghaykgY29udGludWU7XHJcbiAgICAgIGJ1Y2tldENvdW50cy5zZXQoaywgKGJ1Y2tldENvdW50cy5nZXQoaykgfHwgMCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uZ3JvdXBzXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGFLZXkgPSB0aGlzLmJ1Y2tldEtleShhKTtcclxuICAgICAgY29uc3QgYktleSA9IHRoaXMuYnVja2V0S2V5KGIpO1xyXG4gICAgICAvLyBFbXB0eSBidWNrZXQga2V5cyBnbyB0byB0aGUgZW5kIHNvIHVuZmluaXNoZWQgbG9va3MgZG9uJ3QgZGlzcnVwdCB0aGUgZ3JvdXBzXHJcbiAgICAgIGlmIChhS2V5ICYmICFiS2V5KSByZXR1cm4gLTE7XHJcbiAgICAgIGlmICghYUtleSAmJiBiS2V5KSByZXR1cm4gMTtcclxuXHJcbiAgICAgIC8vIFByaW1hcnk6IGJ1Y2tldCBmcmVxdWVuY3ksIGRlc2NlbmRpbmcgKG1vc3QtcG9wdWxhdGVkIGJ1Y2tldCBmaXJzdClcclxuICAgICAgY29uc3QgYUNvdW50ID0gYnVja2V0Q291bnRzLmdldChhS2V5KSB8fCAwO1xyXG4gICAgICBjb25zdCBiQ291bnQgPSBidWNrZXRDb3VudHMuZ2V0KGJLZXkpIHx8IDA7XHJcbiAgICAgIGlmIChhQ291bnQgIT09IGJDb3VudCkgcmV0dXJuIGJDb3VudCAtIGFDb3VudDtcclxuXHJcbiAgICAgIC8vIFRpZS1icmVhazogYWxwaGFiZXRpY2FsIGJ1Y2tldCBuYW1lXHJcbiAgICAgIGlmIChhS2V5ICE9PSBiS2V5KSByZXR1cm4gYUtleS5sb2NhbGVDb21wYXJlKGJLZXkpO1xyXG5cclxuICAgICAgLy8gV2l0aGluIHRoZSBzYW1lIGJ1Y2tldDogYXNjZW5kaW5nIGZpeHR1cmVDb3VudFxyXG4gICAgICBjb25zdCBhRkMgPSBOdW1iZXIoYS5nZXQoJ2ZpeHR1cmVDb3VudCcpPy52YWx1ZSkgfHwgMDtcclxuICAgICAgY29uc3QgYkZDID0gTnVtYmVyKGIuZ2V0KCdmaXh0dXJlQ291bnQnKT8udmFsdWUpIHx8IDA7XHJcbiAgICAgIHJldHVybiBhRkMgLSBiRkM7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBvcmRlckNoYW5nZWQgPSBzb3J0ZWQuc29tZSgoZywgaSkgPT4gZyAhPT0gZ3JvdXBzW2ldKTtcclxuICAgIGlmICghb3JkZXJDaGFuZ2VkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3VycmVudExvb2sgPSB0aGlzLnNlbGVjdGVkTG9va0dyb3VwO1xyXG4gICAgY29uc3QgY3VycmVudFNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG5cclxuICAgIHRoaXMubG9va3MuY2xlYXIoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgc29ydGVkLmZvckVhY2goKGcpID0+IHRoaXMubG9va3MucHVzaChnLCB7IGVtaXRFdmVudDogZmFsc2UgfSkpO1xyXG5cclxuICAgIGlmIChjdXJyZW50TG9vaykge1xyXG4gICAgICBjb25zdCBuZXdMb29rSWR4ID0gc29ydGVkLmluZGV4T2YoY3VycmVudExvb2spO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID0gbmV3TG9va0lkeDtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPj0gMCAmJiBjdXJyZW50U2xvdCkge1xyXG4gICAgICAgIGNvbnN0IHNsb3RzQXJyID0gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCk7XHJcbiAgICAgICAgY29uc3QgbmV3U2xvdElkeCA9IHNsb3RzQXJyLmNvbnRyb2xzLmluZGV4T2YoY3VycmVudFNsb3QpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBuZXdTbG90SWR4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBzYXZlKCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdD8uKCdQbGVhc2UgZmlsbCBhbGwgcmVxdWlyZWQgZmllbGRzJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFNvcnQgdGhlIGxvb2tzIGJlZm9yZSBzZXJpYWxpc2luZyBzbyBib3RoIHRoZSBwZXJzaXN0ZWQgcGF5bG9hZFxyXG4gICAgICAvLyBhbmQgdGhlIG9uLXNjcmVlbiBsaXN0IHJlZmxlY3QgZ3JvdXBpbmcgYnkgTUJRIGJ1Y2tldCAvIGJyYW5kIGNhdGVnb3J5XHJcbiAgICAgIC8vIGFuZCBhc2NlbmRpbmcgZml4dHVyZSBjb3VudC5cclxuICAgICAgdGhpcy5hcHBseVNvcnRlZE9yZGVyKCk7XHJcblxyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIC4uLnRoaXMuZm9ybS52YWx1ZSxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgfTtcclxuICAgICAgaWYgKHRoaXMuaXNOZXcpIHtcclxuICAgICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5jcmVhdGVMb29rUGxhbm9Db2xsZWN0aW9uKHBheWxvYWQpKTtcclxuICAgICAgICBjb25zdCBuZXdJZCA9IHJlcz8uZGF0YT8uX2lkO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0Py4oJ0xvb2sgY29sbGVjdGlvbiBjcmVhdGVkJyk7XHJcbiAgICAgICAgaWYgKG5ld0lkKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2xvb2tzJywgbmV3SWRdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcyddKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UudXBkYXRlTG9va1BsYW5vQ29sbGVjdGlvbih7IC4uLnBheWxvYWQsIGNvbGxlY3Rpb25JZDogdGhpcy5jb2xsZWN0aW9uSWQgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdD8uKCdMb29rIGNvbGxlY3Rpb24gdXBkYXRlZCcpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gc2F2ZSBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3Q/LignRmFpbGVkIHRvIHNhdmUgTG9vayBjb2xsZWN0aW9uJyk7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcyddKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgLy8gUmVsZWFzZSB0aGUgc2hhcmVkIEJlaGF2aW9yU3ViamVjdCBzbyBvdGhlciBwYWdlcyBkb24ndCBpbmhlcml0IGEgc3RhbGUgbGlicmFyeS5cclxuICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQobnVsbCk7XHJcbiAgfVxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwibG9vay1mb3JtXCI+XHJcbiAgPCEtLSBUb3AgYmFyIChib3VuZCB0byB0aGUgb3V0ZXIgZm9ybSkgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTRcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPk5hbWUgKjwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuIE1hc3RlciBMb29rIFBsYW4gRlkyNlwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgZGVzY3JpcHRpb25cIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBmdy1ib2xkIGQtYmxvY2tcIj5BY3RpdmU8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0FjdGl2ZVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgdGV4dC1lbmRcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMlwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cInNhdmluZ1wiIChjbGljayk9XCJzYXZlKClcIj5cclxuICAgICAgICAgIHt7IHNhdmluZyA/ICdTYXZpbmfigKYnIDogJ1NhdmUnIH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVGhyZWUtcGFuZSBlZGl0b3IgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBteC0wIGctM1wiPlxyXG4gICAgPCEtLSBMZWZ0OiBMb29rcyBsaXN0IChubyBmb3JtIGJpbmRpbmcgbmVlZGVkIOKAlCBqdXN0IG5hdmlnYXRpb24pIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMyBoLTEwMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgIDxoNiBjbGFzcz1cIm0tMFwiPk1CUSBCdWNrZXQgLSBGaXh0dXJlIENvbWJpbmF0aW9uczwvaDY+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkTG9vaygpXCI+KyBBZGQgTG9vazwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJsb29rcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5ObyBsb29rcyB5ZXQuIEFkZCBvbmUgdG8gc3RhcnQuPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvb2tzLXRyZWVcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxvb2sgb2YgbG9va3MuY29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibG9vay1yb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBweC0yIHB5LTIgbWItMSByb3VuZGVkXCJcclxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkTG9va0luZGV4ID09PSBpXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVja2V0Q29sb3IoJGFueShsb29rKSlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TG9vayhpKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidWNrZXQtZG90XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVja2V0Q29sb3IoJGFueShsb29rKSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+e3sgbG9va1RpdGxlKCRhbnkobG9vaykpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaXh0dXJlVHlwZUJhZGdlKCRhbnkobG9vaykpIGFzIGZ0YlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaXh0dXJlLXR5cGUtYmFkZ2VcIiBbbmdDbGFzc109XCJmdGIuY2xzXCI+e3sgZnRiLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQtZGFuZ2VyIG1zLTJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmVMb29rKGkpXCI+w5c8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ2VudHJlOiBzZWxlY3RlZCBMb29rIG1ldGFkYXRhICsgc2xvdHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTG9va0dyb3VwIGFzIGxvb2tHcm91cDsgZWxzZSBub0xvb2tcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgaC0xMDBcIiBbZm9ybUdyb3VwXT1cImxvb2tHcm91cFwiPlxyXG4gICAgICAgICAgPGg2IGNsYXNzPVwibWItM1wiPkZpeHR1cmUgQ29tYmluYXRpb24gRGV0YWlsczwvaDY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTIgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+TUJRIGJ1Y2tldDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwibWJxQnVja2V0XCIgcGxhY2Vob2xkZXI9XCJlLmcuIEpKIC8gT0QgRXllXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIGNvdW50ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjMwXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUNvdW50XCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Q0FEIEhlYWRlciBWYXJpZW50czwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGxpYi1jaGlwcy1pbnB1dFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjYWQtaGVhZGVyLXZhcmlhbnRzLWlucHV0XCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNhZEhlYWRlclZhcmlhbnRzXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBhIHZhcmlhbnQgYW5kIHByZXNzIEVudGVyXCI+XHJcbiAgICAgICAgICAgICAgPC9saWItY2hpcHMtaW5wdXQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkZpeHR1cmUgUG9zaXRpb25zPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpeHR1cmVUeXBlT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICBpZEZpZWxkPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibmFtZVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBmaXh0dXJlIHBvc2l0aW9uXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVUeXBlXCI+XHJcbiAgICAgICAgICAgICAgPC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxociAvPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibS0wXCI+Rml4dHVyZXM8L2g2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0XCIgKGNsaWNrKT1cImFkZFNsb3QoKVwiPisgQWRkIEZpeHR1cmU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsb3RzLWxpc3RcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbG90IG9mIChzZWxlY3RlZFNsb3RzQXJyYXk/LmNvbnRyb2xzIHx8IFtdKTsgbGV0IHMgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNsb3Qtcm93IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgcHgtMiBweS0yIG1iLTEgcm91bmRlZFwiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkU2xvdEluZGV4ID09PSBzXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U2xvdChzKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LWJvbGQgc21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgRml4dHVyZSB7eyAkYW55KHNsb3QpLmdldCgnc2xvdEluZGV4Jyk/LnZhbHVlIH19IOKAlCB7eyAkYW55KHNsb3QpLmdldCgnc2xvdFR5cGUnKT8udmFsdWUgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyAkYW55KHNsb3QpLmdldCgnYnJhbmQnKT8udmFsdWUgfHwgJyhubyBicmFuZCknIH19IMK3XHJcbiAgICAgICAgICAgICAgICAgIHt7ICRhbnkoc2xvdCkuZ2V0KCdmaXh0dXJlTGV2ZWxab25lJyk/LnZhbHVlIHx8ICcobm8gem9uZSknIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodC1kYW5nZXIgbXMtMlwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHJlbW92ZVNsb3QocylcIj7DlzwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNub0xvb2s+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC01IGgtMTAwIHRleHQtY2VudGVyIHRleHQtbXV0ZWRcIj5TZWxlY3Qgb3IgYWRkIGEgTG9vayB0byBlZGl0IGl0LjwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBSaWdodDogc2VsZWN0ZWQgc2xvdCDigJQgcGxhY2VtZW50cyBlZGl0b3IgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkU2xvdEdyb3VwIGFzIHNsb3RHcm91cDsgZWxzZSBub1Nsb3RcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTMgaC0xMDBcIiBbZm9ybUdyb3VwXT1cInNsb3RHcm91cFwiPlxyXG4gICAgICAgICAgPGg2IGNsYXNzPVwibWItM1wiPkZpeHR1cmUge3sgc2VsZWN0ZWRTbG90SW5kZXggKyAxIH19IC0gRGVmaW5pdGlvbjwvaDY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTIgbWItM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbCB0ZXh0LW11dGVkXCI+U2xvdCBpbmRleCAoYXV0byk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIFt2YWx1ZV09XCJzZWxlY3RlZFNsb3RJbmRleCArIDFcIiByZWFkb25seSBkaXNhYmxlZCAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkZpeHR1cmUgVHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwic2xvdFR5cGVcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBhdmFpbGFibGVTbG90VHlwZXNcIiBbdmFsdWVdPVwib3B0LmlkXCI+e3sgb3B0Lm5hbWUgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5CcmFuZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnJhbmRcIiBwbGFjZWhvbGRlcj1cIkpvaG4gSmFjb2JzXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rml4dHVyZSBIZWFkZXI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVMZXZlbFpvbmVcIiBwbGFjZWhvbGRlcj1cIlByZW1pdW0gVHJlbmRpbmdcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIFRlbXBsYXRlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZml4dHVyZS1saWJyYXJpZXMtc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaXh0dXJlTGlicmFyeUl0ZW1zRm9yU2xvdFwiXHJcbiAgICAgICAgICAgICAgICBpZEZpZWxkPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibmFtZVwiXHJcbiAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgc2VhcmNoRmllbGQ9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGZpeHR1cmUgdGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVMaWJyYXJ5UmVmc1wiPlxyXG4gICAgICAgICAgICAgIDwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJzbG90R3JvdXAuZ2V0KCdzbG90VHlwZScpPy52YWx1ZSA9PT0gJ2V1cm9jZW50ZXInXCI+XHJcbiAgICAgICAgICAgICAgICBTaG93aW5nIGZsb29yIGZpeHR1cmVzIChldXJvY2VudGVyIHNsb3QpLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwic2xvdEdyb3VwLmdldCgnc2xvdFR5cGUnKT8udmFsdWUgIT09ICdldXJvY2VudGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgU2hvd2luZyB3YWxsIGZpeHR1cmVzIChzaGVsZiBzbG90KS5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxociAvPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibS0wXCI+TG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmcgUGxhY2VtZW50czwvaDY+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiAoY2xpY2spPVwiYWRkUGxhY2VtZW50KClcIj4rIEFkZCBwbGFjZW1lbnQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIihzZWxlY3RlZFBsYWNlbWVudHM/Lmxlbmd0aCB8fCAwKSA9PT0gMFwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtYi0yXCI+XHJcbiAgICAgICAgICAgIE5vIHBsYWNlbWVudHMgeWV0LiBDbGljayA8c3Ryb25nPisgQWRkIHBsYWNlbWVudDwvc3Ryb25nPiB0byBhZGQgb25lLlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGxhY2VtZW50cy1zY3JvbGxcIiBmb3JtQXJyYXlOYW1lPVwicGxhY2VtZW50c1wiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHAgb2YgKHNlbGVjdGVkUGxhY2VtZW50cz8uY29udHJvbHMgfHwgW10pOyBsZXQgcGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInBsYWNlbWVudC1yb3cgbWItMlwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwicGlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBnYXAtMiBwbGFjZW1lbnQtZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGgtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwia2luZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwaWRcIj5Qcm9kdWN0IE1lcmNoYW5kaXNpbmc8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidm1cIj5WaXN1YWwgTWVyY2hhbmRpc2luZzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVmlzdWFsIE1lcmNoYW5kaXNpbmcgcm93czogVk0gVHlwZSAoc2luZ2xlKSArIFZNIEFydHdvcmsgKHNpbmdsZSkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiJGFueShwKS5nZXQoJ2tpbmQnKT8udmFsdWUgPT09ICd2bSc7IGVsc2UgcGlkSW5wdXRzXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ2bVR5cGVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGlkRmllbGQ9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lRmllbGQ9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlZpc3VhbCBNZXJjaGFuZGlzaW5nIFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicG9zaXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1zZWFyY2hhYmxlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ2bUFydHdvcmtPcHRpb25zRm9yKCRhbnkocCkuZ2V0KCdwb3NpdGlvbicpPy52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWRGaWVsZD1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWVGaWVsZD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVmlzdWFsIE1lcmNoYW5kaXNpbmcgQXJ0d29ya1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyYXdWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUHJvZHVjdCBNZXJjaGFuZGlzaW5nIHJvd3M6IFRvcC9NaWQvQm90dG9tIHBvc2l0aW9uICsgbXVsdGktc2VsZWN0IHByb2R1Y3QvU0tVIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwaWRJbnB1dHM+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGZvcm1Db250cm9sTmFtZT1cInBvc2l0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+UG9zaXRpb248L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3BcIj5Ub3A8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJNaWRcIj5NaWQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJCb3R0b21cIj5Cb3R0b208L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJwcm9kdWN0T3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZEZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQcm9kdWN0IC8gU0tVXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJhd1ZhbHVlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodC1kYW5nZXIgcGgtcmVtb3ZlXCIgKGNsaWNrKT1cInJlbW92ZVBsYWNlbWVudChwaSlcIj7DlzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNub1Nsb3Q+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC01IGgtMTAwIHRleHQtY2VudGVyIHRleHQtbXV0ZWRcIj5TZWxlY3QgYSBmaXh0dXJlIHNsb3QgdG8gZWRpdCBwbGFjZW1lbnRzLjwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gUGVyLXNsb3QgRml4dHVyZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gY2FyZCAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRTbG90R3JvdXAgYXMgc2xvdEdyb3VwRm9yTWFwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbXQtNCBsaWJyYXJ5LWNvbmZpZy1jYXJkXCIgW2Zvcm1Hcm91cF09XCJzbG90R3JvdXBGb3JNYXBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICA8aDUgY2xhc3M9XCJmb3JtLWxhYmVsIGQtYmxvY2sgbWItM1wiPkZpeHR1cmUgbGlicmFyeTwvaDU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpYnJhcnktY2hpcHNcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxpYiBvZiBzZWxlY3RlZFNsb3RMaWJyYXJpZXNGb3JEcm9wZG93blwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImxpYnJhcnktY2hpcFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCA9PT0gbGliLmlkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTGlicmFyeU1hcFNlbGVjdChzZWxlY3RlZExpYnJhcnlJZEluTWFwID09PSBsaWIuaWQgPyAnJyA6IGxpYi5pZClcIj5cclxuICAgICAgICAgICAge3sgbGliLm5hbWUgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzbWFsbCAqbmdJZj1cInNlbGVjdGVkU2xvdExpYnJhcmllc0ZvckRyb3Bkb3duLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgTm8gbGlicmFyaWVzIGxpbmtlZCB0byB0aGlzIHNsb3QgeWV0LiBBZGQgc29tZSBpbiB0aGUgXCJGaXh0dXJlIGxpYnJhcmllc1wiIG11bHRpc2VsZWN0IGFib3ZlLlxyXG4gICAgICAgIDwvc21hbGw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImxvYWRpbmdMaWJyYXJ5RGV0YWlsc1wiIGNsYXNzPVwidGV4dC1tdXRlZFwiPkxvYWRpbmcgZml4dHVyZSBkZXRhaWxz4oCmPC9kaXY+XHJcblxyXG4gICAgICA8IS0tXHJcbiAgICAgICAgVXNlICpuZ0ZvciArIHRyYWNrQnkga2V5ZWQgb24gKGxvb2ssIHNsb3QsIGxpYnJhcnkpIHNvIEFuZ3VsYXIgdHJlYXRzXHJcbiAgICAgICAgYSBzd2l0Y2ggYXMgYSBuZXcgaXRlbSDigJQgdGhhdCBmb3JjZXMgdGhlIGVtYmVkZGVkIHRlbXBsYXRlLXByb2R1Y3RzXHJcbiAgICAgICAgLyB0ZW1wbGF0ZS12bXMgY29tcG9uZW50cyB0byByZW1vdW50IGFuZCByZXJ1biB0aGVpciBuZ09uSW5pdFxyXG4gICAgICAgIChvdGhlcndpc2UgdGhlaXIgYGlzUGFnZUxvYWRpbmdgIGd1YXJkIHNraXBzIHRoZSBmb3JtIHJlYnVpbGQpLlxyXG4gICAgICAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgXyBvZiBlbWJlZGRlZEhvc3RLZXlzOyB0cmFja0J5OiB0cmFja0J5RW1iZWRkZWRLZXlcIj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgbWItM1wiPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuYXYtbGlua1wiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJlbWJlZGRlZFRhYiA9PT0gJ3Byb2R1Y3RzJ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVtYmVkZGVkVGFiID0gJ3Byb2R1Y3RzJ1wiPlByb2R1Y3QgTWVyY2hhbmRpc2luZzwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmF2LWxpbmtcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZW1iZWRkZWRUYWIgPT09ICd2bXMnXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZW1iZWRkZWRUYWIgPSAndm1zJ1wiPlZpc3VhbCBNZXJjaGFuZGlzaW5nPC9idXR0b24+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJlbWJlZGRlZFRhYiA9PT0gJ3Byb2R1Y3RzJ1wiPlxyXG4gICAgICAgICAgPGxpYi10ZW1wbGF0ZS1wcm9kdWN0cyBbbG9va3NNb2RlXT1cInRydWVcIj48L2xpYi10ZW1wbGF0ZS1wcm9kdWN0cz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZW1iZWRkZWRUYWIgPT09ICd2bXMnXCI+XHJcbiAgICAgICAgICA8bGliLXRlbXBsYXRlLXZtcyBbbG9va3NNb2RlXT1cInRydWVcIj48L2xpYi10ZW1wbGF0ZS12bXM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvc2VjdGlvbj5cclxuIl19
1467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0vbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0vbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFxQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQVd2RSxNQUFNLE9BQU8sZ0NBQWdDO0lBMmZqQztJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBamdCVixRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNiLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUVmLCtEQUErRDtJQUMvRCx5REFBeUQ7SUFDekQsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRWhCLElBQUksQ0FBYTtJQUNqQixpQkFBaUIsR0FBVyxDQUFDLENBQUMsQ0FBQztJQUMvQixpQkFBaUIsR0FBVyxDQUFDLENB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TUFBTSxhQUFhLENBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMseUJBQXlCLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQy9GLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2FBQ3pEO1NBQ0Y7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQzlEO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxZQUFZLENBQUMsS0FBYTtRQUN4QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLG1GQUFtRjtRQUNuRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7d0dBeC9DVSxnQ0FBZ0M7NEZBQWhDLGdDQUFnQyxzRUNkN0MsK2poQkFvVkE7OzRGRHRVYSxnQ0FBZ0M7a0JBTDVDLFNBQVM7K0JBQ0UsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGxhc3RWYWx1ZUZyb20sIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wbGFuby1kYXRhLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbG9vay1wbGFuby1jb2xsZWN0aW9uLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29rLXBsYW5vLWNvbGxlY3Rpb24tZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2xvb2stcGxhbm8tY29sbGVjdGlvbi1mb3JtLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIExvb2tQbGFub0NvbGxlY3Rpb25Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNsaWVudElkID0gJyc7XHJcbiAgY29sbGVjdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBpc05ldyA9IHRydWU7XHJcbiAgbG9hZGluZyA9IGZhbHNlO1xyXG4gIHNhdmluZyA9IGZhbHNlO1xyXG5cclxuICAvLyBBY2Nlc3MgY29udHJvbCDigJQgbWlycm9ycyB0aGUgTG9va3MgbGlzdCBwYWdlLiBPbmx5IGVtYWlscyBpblxyXG4gIC8vIHBsYW5vc3RhdGljZGF0YXMgYGFsbG93ZWRMb29rVXNlcnNgIG1heSBvcGVuIHRoZSBmb3JtLlxyXG4gIGFjY2Vzc0NoZWNrZWQgPSBmYWxzZTtcclxuICBhbGxvd2VkID0gZmFsc2U7XHJcblxyXG4gIGZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgc2VsZWN0ZWRMb29rSW5kZXg6IG51bWJlciA9IC0xO1xyXG4gIHNlbGVjdGVkU2xvdEluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgLy8gRGlzcGxheSBsYWJlbHMgYXJlIFdhbGwgLyBGbG9vcjsgdGhlIHN0b3JlZCBpZHMgc3RheSAnc2hlbGYnIC8gJ2V1cm9jZW50ZXInXHJcbiAgLy8gc28gdGhlIGxpYnJhcnkgZmlsdGVyLCBzbG90IGRlZmF1bHRzLCBhbmQgdGhlIGJhY2tlbmQgc2xvdFR5cGUvZml4dHVyZVR5cGVcclxuICAvLyBlbnVtcyBrZWVwIHdvcmtpbmcgdW5jaGFuZ2VkICgnc2hlbGYnIOKGkiB3YWxsIGZpeHR1cmVzLCAnZXVyb2NlbnRlcicg4oaSIGZsb29yKS5cclxuICByZWFkb25seSBmaXh0dXJlVHlwZU9wdGlvbnMgPSBbXHJcbiAgICB7IGlkOiAnc2hlbGYnLCBuYW1lOiAnV2FsbCcgfSxcclxuICAgIHsgaWQ6ICdldXJvY2VudGVyJywgbmFtZTogJ0Zsb29yJyB9LFxyXG4gIF07XHJcblxyXG4gIGZpeHR1cmVMaWJyYXJ5SXRlbXM6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBmaXh0dXJlVHlwZTogc3RyaW5nIH1bXSA9IFtdO1xyXG5cclxuICAvLyBNQlEgYnVja2V0IC8gQnJhbmQgLyBGaXh0dXJlIEhlYWRlciBkcm9wZG93biBvcHRpb25zLCBzZWVkZWQgZnJvbSB0aGVcclxuICAvLyBzaGVldCBpbnRvIHBsYW5vc3RhdGljZGF0YXMgKHR5cGU9J2xvb2tDb21ib09wdGlvbnMnKS4gVGhlIGZvcm0gZmllbGRzXHJcbiAgLy8gYXJlIHNlYXJjaGFibGUgc2VsZWN0cyBzbyB0aGUgdXNlciBwaWNrcyBhIGtub3duIHZhbHVlIHJhdGhlciB0aGFuIHR5cGluZy5cclxuICAvLyBBbGwgdGhyZWUgYXJlIGZsYXQgbGlzdHMgb2YgZXZlcnkgZGlzdGluY3QgdmFsdWUgcHJlc2VudCBpbiB0aGUgc2hlZXQg4oCUXHJcbiAgLy8gdGhleSBhcmUgTk9UIGNyb3NzLWZpbHRlcmVkLCBzbyBlLmcuIHRoZSBCcmFuZCBkcm9wZG93biBhbHdheXMgb2ZmZXJzIGFsbFxyXG4gIC8vIGJyYW5kcyByZWdhcmRsZXNzIG9mIHdoaWNoIE1CUSBidWNrZXQgdGhlIGxvb2sgdXNlcy5cclxuICBtYnFCdWNrZXRJdGVtczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xyXG4gIGJyYW5kSXRlbXM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcclxuICBmaXh0dXJlSGVhZGVySXRlbXM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcclxuICAvLyBSYXcgcGF5bG9hZCBmcm9tIHRoZSBjb21ib09wdGlvbnMgZW5kcG9pbnQsIGtlcHQgc28gd2UgY2FuIHJlYnVpbGQgdGhlXHJcbiAgLy8gb3B0aW9uIGxpc3RzIGJ5IG1lcmdpbmcgaXQgd2l0aCB0aGUgdmFsdWVzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgbG9hZGVkXHJcbiAgLy8gY29sbGVjdGlvbiAoc28gdGhlIGRyb3Bkb3ducyBhcmUgbmV2ZXIgZW1wdHkgZXZlbiBpZiB0aGUgZW5kcG9pbnQgaXNcclxuICAvLyB1bmF2YWlsYWJsZSBvciBoYXNuJ3QgbG9hZGVkIHlldCkuXHJcbiAgcHJpdmF0ZSBjb21ib1Jhdzoge1xyXG4gICAgbWJxQnVja2V0czogc3RyaW5nW107XHJcbiAgICBicmFuZHM6IHN0cmluZ1tdO1xyXG4gICAgZml4dHVyZUhlYWRlcnM6IHN0cmluZ1tdO1xyXG4gICAgY29tYmluYXRpb25zOiB7IG1icUJ1Y2tldDogc3RyaW5nOyBicmFuZDogc3RyaW5nOyBmaXh0dXJlSGVhZGVyOiBzdHJpbmcgfVtdO1xyXG4gIH0gPSB7IG1icUJ1Y2tldHM6IFtdLCBicmFuZHM6IFtdLCBmaXh0dXJlSGVhZGVyczogW10sIGNvbWJpbmF0aW9uczogW10gfTtcclxuXHJcbiAgLy8gRHJvcGRvd25zIGluc2lkZSBwbGFjZW1lbnQgcm93cy5cclxuICB2bVR5cGVPcHRpb25zOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgdm1BcnR3b3JrT3B0aW9uczogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyB2bVR5cGU/OiBzdHJpbmcgfVtdID0gW107XHJcbiAgcHJvZHVjdE9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcclxuICAvKiogQ2FjaGVkIHBlci12bVR5cGUgYXJ0d29yayBsaXN0IOKAlCBzYW1lIHJlZmVyZW5jZSByZXR1cm5lZCBlYWNoIGxvb2t1cCBzb1xyXG4gICAqICBsaWItcmVhY3RpdmUtc2VsZWN0IGRvZXNuJ3QgcmVzZXQgc3RhdGUgZXZlcnkgQ0QgY3ljbGUuICovXHJcbiAgcHJpdmF0ZSB2bUFydHdvcmtCeVR5cGU6IE1hcDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKiAodm1OYW1lfHx2bVR5cGUpIGFuZCAodm1OYW1lKSDihpIgcGxhbm92bSBfaWQsIHNvIGEgVk0gcGxhY2VtZW50J3MgYXJ0d29ya1xyXG4gICAqICBuYW1lIGNhbiBiZSByZXNvbHZlZCB0byB0aGUgX2lkIHRoZSBlbWJlZGRlZCBWTSBlZGl0b3IgbWF0Y2hlcyBhZ2FpbnN0LiAqL1xyXG4gIHByaXZhdGUgdm1JZEJ5TmFtZVR5cGU6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcbiAgLyoqXHJcbiAgICogQ2FjaGVkIGZpbHRlcmVkIGxpc3QgYm91bmQgdG8gdGhlIFwiRml4dHVyZSBsaWJyYXJpZXNcIiBtdWx0aXNlbGVjdC5cclxuICAgKiBNdXN0IE5PVCBiZSBhIGdldHRlciDigJQgdGhlIHVuZGVybHlpbmcgbXVsdGlzZWxlY3QgcmUtY2xvbmVzIGl0cyBpdGVtcyBvblxyXG4gICAqIGV2ZXJ5IG5nT25DaGFuZ2VzLCB3aGljaCBkZXRhY2hlcyBjbGljayB0YXJnZXRzIGFuZCBicmVha3Mgc2VsZWN0aW9uLlxyXG4gICAqL1xyXG4gIGZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90OiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZml4dHVyZVR5cGU6IHN0cmluZyB9W10gPSBbXTtcclxuXHJcbiAgLy8gU3RhdGUgZm9yIHRoZSBwZXItc2xvdCBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkLlxyXG4gIHNlbGVjdGVkTGlicmFyeUlkSW5NYXA6IHN0cmluZyA9ICcnO1xyXG4gIHNlbGVjdGVkTGlicmFyeURldGFpbHM6IGFueSA9IG51bGw7XHJcbiAgbG9hZGluZ0xpYnJhcnlEZXRhaWxzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZW1iZWRkZWRUYWI6ICdwcm9kdWN0cycgfCAndm1zJyA9ICdwcm9kdWN0cyc7XHJcblxyXG4gIC8vID09PSBGaXh0dXJlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBjYXJkIGhlbHBlcnMgPT09XHJcblxyXG4gIC8qKiBTbG90J3MgcGxhY2VtZW50cyB3aXRoIGtpbmQgPSAndm0nLCBleHBvc2VkIGFzIGRyb3Bkb3duIGl0ZW1zLiAqL1xyXG4gIGdldCBjdXJyZW50U2xvdFZtSXRlbXMoKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNlbWVudHNUb0l0ZW1zKCd2bScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNsb3QncyBwbGFjZW1lbnRzIHdpdGgga2luZCA9ICdwaWQnLCBleHBvc2VkIGFzIGRyb3Bkb3duIGl0ZW1zLiAqL1xyXG4gIGdldCBjdXJyZW50U2xvdFBpZEl0ZW1zKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjZW1lbnRzVG9JdGVtcygncGlkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBsYWNlbWVudHNUb0l0ZW1zKGtpbmQ6ICd2bScgfCAncGlkJyk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3QgYXJyID0gc2xvdC5nZXQoJ3BsYWNlbWVudHMnKSBhcyBGb3JtQXJyYXkgfCBudWxsO1xyXG4gICAgaWYgKCFhcnIpIHJldHVybiBbXTtcclxuICAgIHJldHVybiBhcnIuY29udHJvbHNcclxuICAgICAgICAubWFwKChjKSA9PiBjLnZhbHVlKVxyXG4gICAgICAgIC5maWx0ZXIoKHA6IGFueSkgPT4gcD8ua2luZCA9PT0ga2luZCAmJiBwPy5wb3NpdGlvbilcclxuICAgICAgICAubWFwKChwOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBpZDogcC5wb3NpdGlvbixcclxuICAgICAgICAgIG5hbWU6IHAucmF3VmFsdWUgPyBgJHtwLnBvc2l0aW9ufSDigJQgJHtwLnJhd1ZhbHVlfWAgOiBwLnBvc2l0aW9uLFxyXG4gICAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKiBGaXh0dXJlLWxpYnJhcnkgb3B0aW9ucyBmb3IgdGhlIGRyb3Bkb3duIOKAlCBmaWx0ZXJlZCB0byB0aGUgbGlicmFyaWVzXHJcbiAgICogIHNlbGVjdGVkIG9uIHRoZSBjdXJyZW50bHktYWN0aXZlIHNsb3QncyBtdWx0aXNlbGVjdC4gKi9cclxuICBnZXQgc2VsZWN0ZWRTbG90TGlicmFyaWVzRm9yRHJvcGRvd24oKTogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm4gW107XHJcbiAgICBjb25zdCByZWZzOiBzdHJpbmdbXSA9IHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWUgfHwgW107XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gcmVmcy5pbmNsdWRlcyhpdGVtLmlkKSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIEZvcm1BcnJheSB0aGF0IHN0b3JlcyBwZXItKGxpYnJhcnksIHNoZWxmKSBWTS9QSUQgdmFsdWVzIGZvciB0aGUgYWN0aXZlIHNsb3QuICovXHJcbiAgZ2V0IHNlbGVjdGVkU2xvdExpYnJhcnlDb25maWdzKCk6IEZvcm1BcnJheSB8IG51bGwge1xyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICByZXR1cm4gc2xvdCA/IChzbG90LmdldCgnbGlicmFyeUNvbmZpZ3VyYXRpb25zJykgYXMgRm9ybUFycmF5KSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogRm9ybS1hcnJheSBlbnRyaWVzIHNjb3BlZCB0byB0aGUgY3VycmVudGx5LXNob3duIGxpYnJhcnkgaW4gdGhlIGNvbmZpZyBjYXJkLiAqL1xyXG4gIGNvbmZpZ0VudHJpZXNGb3JDdXJyZW50TGlicmFyeSgpOiB7IGNvbnRyb2w6IEZvcm1Hcm91cDsgYXJyYXlJbmRleDogbnVtYmVyIH1bXSB7XHJcbiAgICBjb25zdCBjb25maWdzID0gdGhpcy5zZWxlY3RlZFNsb3RMaWJyYXJ5Q29uZmlncztcclxuICAgIGlmICghY29uZmlncyB8fCAhdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKSByZXR1cm4gW107XHJcbiAgICByZXR1cm4gY29uZmlncy5jb250cm9sc1xyXG4gICAgICAgIC5tYXAoKGMsIGkpID0+ICh7IGNvbnRyb2w6IGMgYXMgRm9ybUdyb3VwLCBhcnJheUluZGV4OiBpIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHguY29udHJvbC5nZXQoJ2xpYnJhcnlSZWYnKT8udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzZXQgY2FyZCBzdGF0ZSB3aGVuZXZlciB0aGUgYWN0aXZlIHNsb3QgY2hhbmdlcyBzbyB3ZSBkb24ndCBjYXJyeSBvdmVyXHJcbiAgICogIHN0YWxlIHNlbGVjdGlvbnMgZnJvbSBhIHByZXZpb3VzbHktdmlld2VkIHNsb3QuICovXHJcbiAgcHJpdmF0ZSByZXNldExpYnJhcnlNYXAoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAgPSAnJztcclxuICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5RGV0YWlscyA9IG51bGw7XHJcbiAgICB0aGlzLnJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk7XHJcbiAgICAvLyBDbGVhciB0aGUgc2hhcmVkIEJlaGF2aW9yU3ViamVjdCB0b28gc28gdGhlIGVtYmVkZGVkIFRlbXBsYXRlUHJvZHVjdHMgL1xyXG4gICAgLy8gVGVtcGxhdGVWbXMgY29tcG9uZW50cywgaWYgdGhleSdyZSBzdGlsbCBtb3VudGVkLCBkb24ndCByZW5kZXIgc3RhbGVcclxuICAgIC8vIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgc2xvdCdzIGxpYnJhcnkuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZW4gYSBzbG90IGlzIGxvYWRlZCwgYXV0b21hdGljYWxseSBwaWNrIHRoZSBmaXJzdCBsaWJyYXJ5IGl0IGhhcyBsaW5rZWRcclxuICAgKiAgc28gdGhlIGVtYmVkZGVkIGZpeHR1cmUtdGVtcGxhdGUgZWRpdG9yIG9wZW5zIHN0cmFpZ2h0IHRvIHRoYXQgbGlicmFyeS4gKi9cclxuICBwcml2YXRlIGF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmVmczogc3RyaW5nW10gPSBzbG90LmdldCgnZml4dHVyZUxpYnJhcnlSZWZzJyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgZmlyc3RJZCA9IHJlZnMuZmluZCgoaWQpID0+ICEhaWQpO1xyXG4gICAgaWYgKCFmaXJzdElkKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwID09PSBmaXJzdElkKSByZXR1cm47XHJcbiAgICB0aGlzLm9uTGlicmFyeU1hcFNlbGVjdChmaXJzdElkKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWFkIHRoZSBzbG90J3Mgc2F2ZWQgc25hcHNob3QgZm9yIGEgbGlicmFyeSwgaWYgYW55LiAqL1xyXG4gIHByaXZhdGUgZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkOiBzdHJpbmcpOiBhbnkgfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNuYXBzOiBhbnlbXSA9IHNsb3QuZ2V0KCdsaWJyYXJ5U25hcHNob3RzJyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3QgZW50cnkgPSBzbmFwcy5maW5kKChzKSA9PiBzPy5saWJyYXJ5UmVmID09PSBsaWJJZCk7XHJcbiAgICByZXR1cm4gZW50cnk/LnNuYXBzaG90IHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyc2lzdCBhIHNuYXBzaG90IGludG8gdGhlIHNsb3QncyBsaWJyYXJ5U25hcHNob3RzIEZvcm1Db250cm9sLiAqL1xyXG4gIHByaXZhdGUgY2FwdHVyZUxpYnJhcnlTbmFwc2hvdChsaWJJZDogc3RyaW5nLCBzbmFwc2hvdDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCB8fCAhbGliSWQpIHJldHVybjtcclxuICAgIGNvbnN0IGN0cmwgPSBzbG90LmdldCgnbGlicmFyeVNuYXBzaG90cycpO1xyXG4gICAgaWYgKCFjdHJsKSByZXR1cm47XHJcbiAgICBjb25zdCBjdXJyZW50OiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoY3RybC52YWx1ZSkgPyBbLi4uY3RybC52YWx1ZV0gOiBbXTtcclxuICAgIC8vIFN0cmlwIHRoZSBpZ25vcmVVcGRhdGUgZmxhZyBiZWZvcmUgc2F2aW5nIHNvIHdlIGRvbid0IGVjaG8gaXQgYmFjayBsYXRlci5cclxuICAgIGNvbnN0IHsgaWdub3JlVXBkYXRlOiBfaWdub3JlZCwgLi4uY2xlYW4gfSA9IHNuYXBzaG90IHx8IHt9O1xyXG4gICAgY29uc3QgaSA9IGN1cnJlbnQuZmluZEluZGV4KChzKSA9PiBzPy5saWJyYXJ5UmVmID09PSBsaWJJZCk7XHJcbiAgICBpZiAoaSA+PSAwKSB7XHJcbiAgICAgIGN1cnJlbnRbaV0gPSB7IGxpYnJhcnlSZWY6IGxpYklkLCBzbmFwc2hvdDogY2xlYW4gfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN1cnJlbnQucHVzaCh7IGxpYnJhcnlSZWY6IGxpYklkLCBzbmFwc2hvdDogY2xlYW4gfSk7XHJcbiAgICB9XHJcbiAgICBjdHJsLnNldFZhbHVlKGN1cnJlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbCB2bUNvbmZpZyBjb29yZHMgZm9yIGEgZnJlc2hseS1hZGRlZCBWTSBlbnRyeSwgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAqIHZtVHlwZSBhbmQgdGhlIHRhcmdldCBsaWJyYXJ5J3Mgc2hlbGYgbGF5b3V0LiBNaXJyb3JzIHRoZSB3YWxsLWxheW91dFxyXG4gICAqIHJ1bGVzIGluIGBydW5Mb29rc0FsbG9jYXRpb25gIChvbmJvYXJkLmNvbnRyb2xsZXIuanM6YnVpbGRXYWxsVm1FbnRyeSlcclxuICAgKiBzbyB3aGF0IHRoZSBmb3JtIHByZS1wb3NpdGlvbnMgbWF0Y2hlcyB3aGF0IHRoZSBiYWNrZW5kIGFsbG9jYXRvciB3b3VsZFxyXG4gICAqIHBsYWNlIHRoZXJlLlxyXG4gICAqXHJcbiAgICogICBUb3AgTWFza2luZyAgICAgIC0+IGZpcnN0IHNoZWxmLCAgc3RyZXRjaCAodG9wIHN0cmlwIG9mIGZpeHR1cmUpXHJcbiAgICogICBNaWQgMSAvIE1pZCAgICAgIC0+IGZpcnN0IG1pZCBzaGVsZiwgbGVmdFxyXG4gICAqICAgTWlkIDIgICAgICAgICAgICAtPiBsYXN0IG1pZCBzaGVsZiwgIHJpZ2h0XHJcbiAgICogICBNaWQgMyAgICAgICAgICAgIC0+IG1pZGRsZSBtaWQgc2hlbGYgKG9yIGxhc3QpLCBzdHJldGNoXHJcbiAgICogICBCb3R0b20gU2xhbnRlciAgIC0+IGxhc3Qgc2hlbGYsICAgIHN0cmV0Y2ggKGJvdHRvbSBzdHJpcClcclxuICAgKlxyXG4gICAqIEFueXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGUgcHJldmlvdXMgbmV1dHJhbCBkZWZhdWx0ICh0b3AsIG5vIHpvbmUpXHJcbiAgICogc28gYmVoYXZpb3VyIGRvZXNuJ3QgY2hhbmdlIGZvciB1bmtub3duIGxhYmVscy5cclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxWbUxheW91dCh2bVR5cGU6IHN0cmluZywgc2hlbGZDb25maWc6IGFueVtdKTpcclxuICAgICAgeyBzdGFydFlQb3NpdGlvbjogbnVtYmVyOyBlbmRZUG9zaXRpb246IG51bWJlcjsgeFpvbmU6IHN0cmluZzsgeVpvbmU6IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IG5vcm0gPSBTdHJpbmcodm1UeXBlID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IHNoZWx2ZXMgPSBBcnJheS5pc0FycmF5KHNoZWxmQ29uZmlnKVxyXG4gICAgICA/IHNoZWxmQ29uZmlnLnNsaWNlKCkuc29ydChcclxuICAgICAgICAgIChhLCBiKSA9PiAoYT8uc2hlbGZOdW1iZXIgfHwgMCkgLSAoYj8uc2hlbGZOdW1iZXIgfHwgMCksXHJcbiAgICAgICAgKVxyXG4gICAgICA6IFtdO1xyXG4gICAgY29uc3QgaW5ab25lID0gKHo6IHN0cmluZyk6IGFueVtdID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gei50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gc2hlbHZlcy5maWx0ZXIoXHJcbiAgICAgICAgICAocykgPT4gU3RyaW5nKHM/LnpvbmUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQsXHJcbiAgICAgICk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZmlyc3RTaGVsZiA9IHNoZWx2ZXNbMF0/LnNoZWxmTnVtYmVyIHx8IDE7XHJcbiAgICBjb25zdCBsYXN0U2hlbGYgPSBzaGVsdmVzW3NoZWx2ZXMubGVuZ3RoIC0gMV0/LnNoZWxmTnVtYmVyIHx8IGZpcnN0U2hlbGY7XHJcblxyXG4gICAgaWYgKG5vcm0gPT09ICd0b3AgbWFza2luZycgfHwgbm9ybSA9PT0gJ3RvcCcpIHtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IGZpcnN0U2hlbGYsIGVuZFlQb3NpdGlvbjogZmlyc3RTaGVsZiwgeFpvbmU6ICdzdHJldGNoJywgeVpvbmU6ICdzdHJldGNoJyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKG5vcm0gPT09ICdtaWQgMScgfHwgbm9ybSA9PT0gJ21pZCcpIHtcclxuICAgICAgY29uc3QgbSA9IGluWm9uZSgnTWlkJyk7XHJcbiAgICAgIGNvbnN0IHNuID0gbVswXT8uc2hlbGZOdW1iZXIgfHwgZmlyc3RTaGVsZjtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IHNuLCBlbmRZUG9zaXRpb246IHNuLCB4Wm9uZTogJ2xlZnQnLCB5Wm9uZTogJ3N0cmV0Y2gnIH07XHJcbiAgICB9XHJcbiAgICBpZiAobm9ybSA9PT0gJ21pZCAyJykge1xyXG4gICAgICBjb25zdCBtID0gaW5ab25lKCdNaWQnKTtcclxuICAgICAgY29uc3Qgc24gPSBtW20ubGVuZ3RoIC0gMV0/LnNoZWxmTnVtYmVyIHx8IGZpcnN0U2hlbGY7XHJcbiAgICAgIHJldHVybiB7IHN0YXJ0WVBvc2l0aW9uOiBzbiwgZW5kWVBvc2l0aW9uOiBzbiwgeFpvbmU6ICdyaWdodCcsIHlab25lOiAnc3RyZXRjaCcgfTtcclxuICAgIH1cclxuICAgIGlmIChub3JtID09PSAnbWlkIDMnKSB7XHJcbiAgICAgIGNvbnN0IG0gPSBpblpvbmUoJ01pZCcpO1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBtLmxlbmd0aCA+PSAzID8gbVtNYXRoLmZsb29yKG0ubGVuZ3RoIC8gMildIDogbVttLmxlbmd0aCAtIDFdO1xyXG4gICAgICBjb25zdCBzbiA9IHRhcmdldD8uc2hlbGZOdW1iZXIgfHwgZmlyc3RTaGVsZjtcclxuICAgICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IHNuLCBlbmRZUG9zaXRpb246IHNuLCB4Wm9uZTogJ3N0cmV0Y2gnLCB5Wm9uZTogJ3N0cmV0Y2gnIH07XHJcbiAgICB9XHJcbiAgICBpZiAobm9ybSA9PT0gJ2JvdHRvbSBzbGFudGVyJykge1xyXG4gICAgICByZXR1cm4geyBzdGFydFlQb3NpdGlvbjogbGFzdFNoZWxmLCBlbmRZUG9zaXRpb246IGxhc3RTaGVsZiwgeFpvbmU6ICdzdHJldGNoJywgeVpvbmU6ICdzdHJldGNoJyB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgc3RhcnRZUG9zaXRpb246IDEsIGVuZFlQb3NpdGlvbjogMSwgeFpvbmU6ICcnLCB5Wm9uZTogJycgfTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNvbHZlIGEgVk0gcGxhY2VtZW50J3MgYXJ0d29yayBOQU1FICgrIHZtVHlwZSkgdG8gaXRzIHBsYW5vdm0gX2lkLiAqL1xyXG4gIHByaXZhdGUgcmVzb2x2ZVZtSWQodm1OYW1lOiBzdHJpbmcsIHZtVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5vcm1WbVR5cGUodm1OYW1lKTtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLm5vcm1WbVR5cGUodm1UeXBlKTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUuZ2V0KGAke25hbWV9fHwke3R5cGV9YCkgfHxcclxuICAgICAgdGhpcy52bUlkQnlOYW1lVHlwZS5nZXQobmFtZSkgfHxcclxuICAgICAgdm1OYW1lXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmUtZGVyaXZlIGV2ZXJ5IGFzc2lnbmVkIGxpYnJhcnkncyBzbmFwc2hvdCBmcm9tIHRoZSBhY3RpdmUgc2xvdCdzXHJcbiAgICogY3VycmVudCBwbGFjZW1lbnRzLiBEcml2ZW4gYnkgdGhlIFwiTG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmdcclxuICAgKiBQbGFjZW1lbnRzXCIgbGlzdCDigJQgc28gZWRpdGluZyBvbmUgcGxhY2VtZW50IHVwZGF0ZXMgQUxMIGFzc2lnbmVkXHJcbiAgICogbGlicmFyaWVzIGF0IG9uY2UuXHJcbiAgICpcclxuICAgKiAgLSBQSUQgcGxhY2VtZW50czogYHBvc2l0aW9uYCAoVG9wL01pZC9Cb3R0b20pIOKGkiBzaGVsZiB6b25lOyB0aGUgc2hlbGYnc1xyXG4gICAqICAgIHByb2R1Y3RCcmFuZE5hbWUgaXMgT1ZFUldSSVRURU4gd2l0aCB0aGUgcGxhY2VtZW50J3MgcHJvZHVjdCBsaXN0LlxyXG4gICAqICAtIFZNIHBsYWNlbWVudHM6IGBwb3NpdGlvbmAg4oaSIHZtVHlwZTsgdGhlIG1hdGNoaW5nIHZtQ29uZmlnIGVudHJ5J3NcclxuICAgKiAgICBhcnR3b3JrICh2bUlkL3ZtTmFtZSkgaXMgdXBkYXRlZCB3aGlsZSB0aGUgbGlicmFyeSBrZWVwcyBpdHMgb3duIFZNXHJcbiAgICogICAgcG9zaXRpb25zLiB2bVR5cGVzIG5vdCB5ZXQgcHJlc2VudCBhcmUgYXBwZW5kZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBhcHBseVBsYWNlbWVudHNUb0Fzc2lnbmVkTGlicmFyaWVzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICBpZiAoIXNsb3QpIHJldHVybjtcclxuICAgIGNvbnN0IHJlZnM6IHN0cmluZ1tdID0gKHNsb3QuZ2V0KCdmaXh0dXJlTGlicmFyeVJlZnMnKT8udmFsdWUgfHwgW10pXHJcbiAgICAgICAgLmZpbHRlcigocjogc3RyaW5nKSA9PiAhIXIpO1xyXG4gICAgaWYgKCFyZWZzLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBsYWNlbWVudHM6IGFueVtdID0gKHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5IHwgbnVsbCk/LnZhbHVlIHx8IFtdO1xyXG4gICAgY29uc3Qgbm9ybSA9IChzOiBhbnkpOiBzdHJpbmcgPT4gU3RyaW5nKHMgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIC8vIHpvbmUgLT4gcHJvZHVjdCBsaXN0IChQSURzKTsgc3VwcG9ydHMgYm90aCByYXdWYWx1ZXNbXSBhbmQgbGVnYWN5IHJhd1ZhbHVlLlxyXG4gICAgY29uc3QgcGlkQnlab25lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHBsYWNlbWVudHMpIHtcclxuICAgICAgaWYgKHA/LmtpbmQgIT09ICdwaWQnIHx8ICFwPy5wb3NpdGlvbikgY29udGludWU7XHJcbiAgICAgIGNvbnN0IHZhbHM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShwLnJhd1ZhbHVlcykgJiYgcC5yYXdWYWx1ZXMubGVuZ3RoXHJcbiAgICAgICAgPyBwLnJhd1ZhbHVlcy5maWx0ZXIoKHY6IHN0cmluZykgPT4gISF2KVxyXG4gICAgICAgIDogKHAucmF3VmFsdWUgPyBbIFN0cmluZyhwLnJhd1ZhbHVlKSBdIDogW10pO1xyXG4gICAgICBpZiAodmFscy5sZW5ndGgpIHBpZEJ5Wm9uZS5zZXQobm9ybShwLnBvc2l0aW9uKSwgdmFscyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdm1UeXBlIC0+IHsgdm1JZCwgdm1OYW1lLCBsYWJlbCB9IChWTXMpXHJcbiAgICBjb25zdCB2bUJ5VHlwZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHZtSWQ6IHN0cmluZzsgdm1OYW1lOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4oKTtcclxuICAgIGZvciAoY29uc3QgcCBvZiBwbGFjZW1lbnRzKSB7XHJcbiAgICAgIGlmIChwPy5raW5kICE9PSAndm0nIHx8ICFwPy5wb3NpdGlvbiB8fCAhcD8ucmF3VmFsdWUpIGNvbnRpbnVlO1xyXG4gICAgICBjb25zdCBsYWJlbCA9IFN0cmluZyhwLnBvc2l0aW9uKTtcclxuICAgICAgdm1CeVR5cGUuc2V0KG5vcm0obGFiZWwpLCB7XHJcbiAgICAgICAgdm1JZDogdGhpcy5yZXNvbHZlVm1JZChTdHJpbmcocC5yYXdWYWx1ZSksIGxhYmVsKSxcclxuICAgICAgICB2bU5hbWU6IFN0cmluZyhwLnJhd1ZhbHVlKSxcclxuICAgICAgICBsYWJlbCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm90aGluZyB0byBhcHBseSDigJQgYmFpbCBvdXQgYmVmb3JlIGFueSBmZXRjaC5cclxuICAgIGlmIChwaWRCeVpvbmUuc2l6ZSA9PT0gMCAmJiB2bUJ5VHlwZS5zaXplID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gRm9yIGFueSBsaWJyYXJ5IHRoYXQgZG9lc24ndCBoYXZlIGEgc25hcHNob3QgeWV0LCBmZXRjaCBpdHMgZGV0YWlscyBzb1xyXG4gICAgLy8gd2UgY2FuIHVzZSB0aGUgZG9jIGFzIHRoZSBiYXNlLiBXaXRob3V0IHRoaXMsIGFwcGx5UGxhY2VtZW50cyBzaWxlbnRseVxyXG4gICAgLy8gc2tpcHBlZCBsaWJyYXJpZXMgdGhlIHVzZXIgaGFkbid0IHZpZXdlZCBhbmQgb25seSB0aGUgY3VycmVudGx5LXZpc2libGVcclxuICAgIC8vIGNoaXAgZXZlciByZWNlaXZlZCB1cGRhdGVzLlxyXG4gICAgY29uc3QgZmV0Y2hlZEJhc2VzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICByZWZzLm1hcChhc3luYyAobGliSWQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpKSByZXR1cm47XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJyYXJ5RGV0YWlscyhsaWJJZCksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkgZmV0Y2hlZEJhc2VzLnNldChsaWJJZCwgcmVzLmRhdGEpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0BAIH4gYXBwbHlQbGFjZW1lbnRzVG9Bc3NpZ25lZExpYnJhcmllcyBbZmV0Y2ggRVJSXTonLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG5cclxuICAgIGZvciAoY29uc3QgbGliSWQgb2YgcmVmcykge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldExpYnJhcnlTbmFwc2hvdChsaWJJZCkgfHwgZmV0Y2hlZEJhc2VzLmdldChsaWJJZCk7XHJcbiAgICAgIGlmICghdGFyZ2V0KSBjb250aW51ZTtcclxuXHJcbiAgICAgIGNvbnN0IHNoZWx2ZXM6IGFueVtdID0gQXJyYXkuaXNBcnJheSh0YXJnZXQuc2hlbGZDb25maWcpID8gdGFyZ2V0LnNoZWxmQ29uZmlnIDogW107XHJcbiAgICAgIGNvbnN0IG5ld1NoZWxmQ29uZmlnID0gc2hlbHZlcy5tYXAoKHNoZWxmOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB6b25lID0gbm9ybShzaGVsZj8uem9uZSB8fCBzaGVsZj8ubGFiZWwpO1xyXG4gICAgICAgIGlmICghem9uZSB8fCAhcGlkQnlab25lLmhhcyh6b25lKSkgcmV0dXJuIHNoZWxmO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5zaGVsZixcclxuICAgICAgICAgIHpvbmU6IHNoZWxmPy56b25lIHx8IHNoZWxmPy5sYWJlbCB8fCAnJyxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFsgLi4ucGlkQnlab25lLmdldCh6b25lKSEgXSxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nVm1zOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkodGFyZ2V0LnZtQ29uZmlnKSA/IHRhcmdldC52bUNvbmZpZyA6IFtdO1xyXG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IG5ld1ZtQ29uZmlnID0gZXhpc3RpbmdWbXMubWFwKCh2bTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbm9ybSh2bT8udm1UeXBlKTtcclxuICAgICAgICBzZWVuLmFkZChrZXkpO1xyXG4gICAgICAgIGNvbnN0IHVwZCA9IHZtQnlUeXBlLmdldChrZXkpO1xyXG4gICAgICAgIHJldHVybiB1cGQgPyB7IC4uLnZtLCB2bUlkOiB1cGQudm1JZCwgdm1OYW1lOiB1cGQudm1OYW1lIH0gOiB2bTtcclxuICAgICAgfSk7XHJcbiAgICAgIGZvciAoY29uc3QgWyBrZXksIHVwZCBdIG9mIHZtQnlUeXBlKSB7XHJcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xyXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMuaW5pdGlhbFZtTGF5b3V0KHVwZC5sYWJlbCwgbmV3U2hlbGZDb25maWcpO1xyXG4gICAgICAgIG5ld1ZtQ29uZmlnLnB1c2goe1xyXG4gICAgICAgICAgdm1UeXBlOiB1cGQubGFiZWwsXHJcbiAgICAgICAgICB2bUlkOiB1cGQudm1JZCxcclxuICAgICAgICAgIHZtTmFtZTogdXBkLnZtTmFtZSxcclxuICAgICAgICAgIC4uLmxheW91dCxcclxuICAgICAgICAgIHBvc2l0aW9uOiAnJyxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXB0dXJlTGlicmFyeVNuYXBzaG90KGxpYklkLCB7XHJcbiAgICAgICAgLi4udGFyZ2V0LFxyXG4gICAgICAgIHNoZWxmQ29uZmlnOiBuZXdTaGVsZkNvbmZpZyxcclxuICAgICAgICB2bUNvbmZpZzogbmV3Vm1Db25maWcsXHJcbiAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogJ0wzJyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVmbGVjdCB0aGUgY2hhbmdlIGluIHRoZSBjdXJyZW50bHktb3BlbiBlbWJlZGRlZCBlZGl0b3IuXHJcbiAgICB0aGlzLnJlbG9hZERpc3BsYXllZExpYnJhcnkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW91bnQgdGhlIGVtYmVkZGVkIGVkaXRvciBmb3IgdGhlIGFjdGl2ZSBsaWJyYXJ5IHNvIGl0IHBpY2tzIHVwIHRoZVxyXG4gICAqIHNuYXBzaG90IHdlIGp1c3QgcmV3cm90ZS4gVGhlIGVtYmVkZGVkIGNvbXBvbmVudHMgZ3VhcmQgYWdhaW5zdCByZS1pbml0XHJcbiAgICogd2hpbGUgbW91bnRlZCwgc28gd2UgdG9nZ2xlIHRoZSBob3N0IGtleSBvZmYgdGhlbiBvbiB0byBmb3JjZSBhIGZyZXNoXHJcbiAgICogbmdPbkluaXQgd2l0aCB0aGUgdXBkYXRlZCBkYXRhLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVsb2FkRGlzcGxheWVkTGlicmFyeSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxpYklkID0gdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwO1xyXG4gICAgaWYgKCFsaWJJZCkgcmV0dXJuO1xyXG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuZ2V0TGlicmFyeVNuYXBzaG90KGxpYklkKTtcclxuICAgIGlmICghdXBkYXRlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZExpYnJhcnlEZXRhaWxzID0gdXBkYXRlZDtcclxuICAgIC8vIFB1c2ggdGhlIGZyZXNoIHNuYXBzaG90LCB0aGVuIGJ1bXAgdGhlIG5vbmNlIHNvIHJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzXHJcbiAgICAvLyBwcm9kdWNlcyBhIE5FVyBrZXkg4oCUIHRoYXQncyB3aGF0IGFjdHVhbGx5IGZvcmNlcyB0aGUgKm5nRm9yIHRvIGRlc3Ryb3lcclxuICAgIC8vIHRoZSBvbGQgZW1iZWRkZWQgZWRpdG9yIGFuZCBtb3VudCBhIG5ldyBvbmUgdGhhdCByZS1yZWFkcyB0aGUgc25hcHNob3QuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KHtcclxuICAgICAgLi4udXBkYXRlZCxcclxuICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogdXBkYXRlZC5wcm9kdWN0UmVzb2x1dGlvbkxldmVsIHx8ICdMMycsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZW1iZWRkZWRSZWxvYWROb25jZSsrO1xyXG4gICAgdGhpcy5yZWZyZXNoRW1iZWRkZWRIb3N0S2V5cygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25MaWJyYXJ5TWFwU2VsZWN0KGxpYklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIFRvZ2dsaW5nIHRoZSBhY3RpdmUgY2hpcCBvZmYg4oaSIGNsZWFyIGltbWVkaWF0ZWx5IChubyBhc3luYyB3b3JrIG5lZWRlZCkuXHJcbiAgICBpZiAoIWxpYklkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCA9ICcnO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGlicmFyeURldGFpbHMgPSBudWxsO1xyXG4gICAgICB0aGlzLnJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk7XHJcbiAgICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQobnVsbCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTd2l0Y2hpbmcgdG8gYSBkaWZmZXJlbnQgY2hpcDogbGlnaHQgdGhlIG5ldyBjaGlwIHVwIHJpZ2h0IGF3YXksIGJ1dFxyXG4gICAgLy8gS0VFUCB0aGUgcHJldmlvdXMgbGlicmFyeSdzIGVtYmVkZGVkIHByZXZpZXcgbW91bnRlZCB3aGlsZSB3ZSBmZXRjaFxyXG4gICAgLy8gdGhlIG5ldyBzbmFwc2hvdC9kZXRhaWxzLiBPdGhlcndpc2UgdGhlIGNhcmQgd291bGQgY29sbGFwc2UgdG8gaXRzXHJcbiAgICAvLyBoZWFkZXIgaGVpZ2h0IGR1cmluZyB0aGUgZmV0Y2ggYW5kIHJlLWV4cGFuZCBvbmNlIG5ldyBkYXRhIGxhbmRzIOKAlFxyXG4gICAgLy8gdmlzaWJsZSBhcyBhIFwiY3J1bmNoXCIgdGhlIHVzZXIgcmVwb3J0ZWQuXHJcbiAgICB0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXAgPSBsaWJJZDtcclxuICAgIHRoaXMubG9hZGluZ0xpYnJhcnlEZXRhaWxzID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgbmV3RGV0YWlsczogYW55ID0gbnVsbDtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIElmIGFuIGF1dG8tYXBwbHkgZm9yIHRoaXMgbGlicmFyeSBpcyBzdGlsbCBydW5uaW5nLCB3YWl0IGZvciBpdCBzb1xyXG4gICAgICAvLyB3ZSBkb24ndCBiZWF0IGl0IHRvIHRoZSBzbmFwc2hvdCBhbmQgcmVuZGVyIHRoZSB1bi1maWxsZWQgbGlicmFyeS5cclxuICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuYXV0b0FwcGx5SW5GbGlnaHQuZ2V0KGxpYklkKTtcclxuICAgICAgaWYgKHBlbmRpbmcpIHtcclxuICAgICAgICB0cnkgeyBhd2FpdCBwZW5kaW5nOyB9IGNhdGNoIChfZSkgeyAvKiBpZ25vcmUgKi8gfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHNhdmVkID0gdGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpO1xyXG4gICAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBuZXdEZXRhaWxzID0gc2F2ZWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMobGliSWQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbmV3RGV0YWlscyA9IHJlcz8uZGF0YSB8fCBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gb25MaWJyYXJ5TWFwU2VsZWN0IFtFUlJdOicsIGVycik7XHJcbiAgICAgIG5ld0RldGFpbHMgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEF0b21pYyBzd2FwIOKAlCBzZWxlY3RlZExpYnJhcnlEZXRhaWxzLCBCZWhhdmlvclN1YmplY3QsIGFuZCB0aGVcclxuICAgIC8vIG5nRm9yIGhvc3Qga2V5IGFsbCBmbGlwIGluIG9uZSBzeW5jaHJvbm91cyBibG9jaywgc28gQW5ndWxhciBkZXN0cm95c1xyXG4gICAgLy8gdGhlIG9sZCBlbWJlZGRlZCBjb21wb25lbnQgYW5kIG1vdW50cyB0aGUgbmV3IG9uZSBpbiB0aGUgc2FtZSBjaGFuZ2VcclxuICAgIC8vIGRldGVjdGlvbiBjeWNsZS4gTm8gZW1wdHktc3RhdGUgaW4gYmV0d2VlbiDihpIgbm8gY2FyZC1oZWlnaHQgY3J1bmNoLlxyXG4gICAgdGhpcy5zZWxlY3RlZExpYnJhcnlEZXRhaWxzID0gbmV3RGV0YWlscztcclxuICAgIGlmIChuZXdEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLm5leHQoe1xyXG4gICAgICAgIC4uLm5ld0RldGFpbHMsXHJcbiAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbmV3RGV0YWlscy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsIHx8ICdMMycsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wbGFub0RhdGFTZXJ2aWNlLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMubmV4dChudWxsKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaEVtYmVkZGVkSG9zdEtleXMoKTtcclxuICAgIHRoaXMubG9hZGluZ0xpYnJhcnlEZXRhaWxzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wb3NpdGUga2V5IHRpZWQgdG8gdGhlIGN1cnJlbnRseS1hY3RpdmUgKGxvb2ssIHNsb3QsIGxpYnJhcnkpIHRyaXBsZS5cclxuICAgKiBTdGFibGUgcHJvcGVydHkg4oCUIHJlY29tcHV0ZWQgb25seSB3aGVuIHRoZSB1bmRlcmx5aW5nIHNlbGVjdGlvbiBjaGFuZ2VzXHJcbiAgICogKHNlZSByZWZyZXNoRW1iZWRkZWRIb3N0S2V5cygpKS4gQXZvaWRzIHJldHVybmluZyBhIG5ldyBhcnJheSByZWZlcmVuY2VcclxuICAgKiBldmVyeSBDRCBjeWNsZSwgd2hpY2ggdXNlZCB0byByaXBwbGUgaW50byBvdGhlciBtdWx0aS1zZWxlY3RzJyBpbnB1dHMuXHJcbiAgICovXHJcbiAgZW1iZWRkZWRIb3N0S2V5OiBzdHJpbmcgPSAnJztcclxuICBlbWJlZGRlZEhvc3RLZXlzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIC8vIEJ1bXBlZCBieSByZWxvYWREaXNwbGF5ZWRMaWJyYXJ5KCkgdG8gZm9yY2UgdGhlIGVtYmVkZGVkIGVkaXRvciB0byByZW1vdW50XHJcbiAgLy8gZXZlbiB3aGVuIGxvb2svc2xvdC9saWJyYXJ5IGFyZSB1bmNoYW5nZWQgKGEgc2FtZS1rZXkgcm91bmQtdHJpcCB2aWEgdGhlXHJcbiAgLy8gKm5nRm9yIHRyYWNrQnkgZG9lcyBOT1QgcmVtb3VudDsgYSBjaGFuZ2VkIGtleSBkb2VzKS5cclxuICBwcml2YXRlIGVtYmVkZGVkUmVsb2FkTm9uY2UgPSAwO1xyXG5cclxuICBwcml2YXRlIHJlZnJlc2hFbWJlZGRlZEhvc3RLZXlzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gYCR7dGhpcy5zZWxlY3RlZExvb2tJbmRleH0tJHt0aGlzLnNlbGVjdGVkU2xvdEluZGV4fS0ke3RoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcH0tJHt0aGlzLmVtYmVkZGVkUmVsb2FkTm9uY2V9YDtcclxuICAgIGlmIChrZXkgIT09IHRoaXMuZW1iZWRkZWRIb3N0S2V5KSB7XHJcbiAgICAgIHRoaXMuZW1iZWRkZWRIb3N0S2V5ID0ga2V5O1xyXG4gICAgfVxyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuc2VsZWN0ZWRMaWJyYXJ5RGV0YWlscyA/IFt0aGlzLmVtYmVkZGVkSG9zdEtleV0gOiBbXTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmVtYmVkZGVkSG9zdEtleXM7XHJcbiAgICAvLyBPbmx5IGFzc2lnbiBhIG5ldyBhcnJheSBpZiB0aGUgY29udGVudHMgZGlmZmVyIOKAlCBvdGhlcndpc2UgdGhlIG5nRm9yIHNlZXNcclxuICAgIC8vIGEgXCJuZXdcIiBhcnJheSBlYWNoIENEIGFuZCB0cmFja0J5IHN0aWxsIGhhcyB0byBjb21wYXJlIGV2ZXJ5IGVudHJ5LlxyXG4gICAgaWYgKG5leHQubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCB8fCBuZXh0WzBdICE9PSBjdXJyZW50WzBdKSB7XHJcbiAgICAgIHRoaXMuZW1iZWRkZWRIb3N0S2V5cyA9IG5leHQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cmFja0J5RW1iZWRkZWRLZXkoXzogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4ga2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNsb3QtdHlwZSBkcm9wZG93biBpbiB0aGUgcmlnaHQgcGFuZSBvbmx5IG9mZmVycyB2YWx1ZXMgdGhhdCB0aGVcclxuICAgKiBwYXJlbnQgTG9vayBoYXMgc2VsZWN0ZWQgaW4gaXRzIEZpeHR1cmUgVHlwZSBtdWx0aXNlbGVjdC4gSWYgbm90aGluZyBpc1xyXG4gICAqIHNlbGVjdGVkIHlldCwgZmFsbCBiYWNrIHRvIHNob3dpbmcgYWxsIG9wdGlvbnMgc28gdGhlIHVzZXIgaXNuJ3QgYmxvY2tlZC5cclxuICAgKi9cclxuICBnZXQgYXZhaWxhYmxlU2xvdFR5cGVzKCk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLnNlbGVjdGVkTG9va0dyb3VwO1xyXG4gICAgaWYgKCFsb29rR3JvdXApIHJldHVybiB0aGlzLmZpeHR1cmVUeXBlT3B0aW9ucztcclxuICAgIGNvbnN0IHNlbGVjdGVkID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVR5cGUnKT8udmFsdWUgYXMgc3RyaW5nW10gfCBudWxsO1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSB8fCBzZWxlY3RlZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZml4dHVyZVR5cGVPcHRpb25zO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZml4dHVyZVR5cGVPcHRpb25zLmZpbHRlcigob3B0KSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHQuaWQpKTtcclxuICB9XHJcblxyXG4gIC8vIDIwIHZlcnkgbWlsZCBwYXN0ZWxzIChhbGwgVGFpbHdpbmQtNTAgLyAxMDAgcmFuZ2UpIGFycmFuZ2VkIHNvIGFkamFjZW50XHJcbiAgLy8gcGFsZXR0ZSBzbG90cyBhcmUgb24gb3Bwb3NpdGUgc2lkZXMgb2YgdGhlIGNvbG91ciB3aGVlbCBmb3IgZGlzdGluZ3Vpc2gtXHJcbiAgLy8gYWJpbGl0eSB3aXRob3V0IGFueSBjb2xvdXIgZmVlbGluZyBzYXR1cmF0ZWQuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQlVDS0VUX1BBTEVUVEU6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xyXG4gICAgJyNmZWYyZjInLCAvLyAgMSBCbHVzaCAgICAgICAgICByZWQtNTBcclxuICAgICcjZjBmZGZhJywgLy8gIDIgTWludCBXaGlzcGVyICAgdGVhbC01MCAgICAob3Bwb3NpdGUgb2YgcmVkKVxyXG4gICAgJyNmZmY3ZWQnLCAvLyAgMyBBcHJpY290ICAgICAgICBvcmFuZ2UtNTBcclxuICAgICcjZWVmMmZmJywgLy8gIDQgSXJpcyAgICAgICAgICAgaW5kaWdvLTUwICAob3Bwb3NpdGUgb2Ygb3JhbmdlKVxyXG4gICAgJyNmZWZjZTgnLCAvLyAgNSBCdXR0ZXIgICAgICAgICB5ZWxsb3ctNTBcclxuICAgICcjZmFmNWZmJywgLy8gIDYgTGF2ZW5kZXIgICAgICAgcHVycGxlLTUwICAob3Bwb3NpdGUgb2YgeWVsbG93KVxyXG4gICAgJyNmMGZkZjQnLCAvLyAgNyBTcHJpbmcgICAgICAgICBncmVlbi01MFxyXG4gICAgJyNmZmYxZjInLCAvLyAgOCBSb3NlIFBldGFsICAgICByb3NlLTUwICAgIChvcHBvc2l0ZSBvZiBncmVlbilcclxuICAgICcjZWNmZWZmJywgLy8gIDkgU2t5IFRpbnQgICAgICAgY3lhbi01MFxyXG4gICAgJyNmZmVkZDUnLCAvLyAxMCBQZWFjaCAgICAgICAgICBvcmFuZ2UtMTAwXHJcbiAgICAnI2VmZjZmZicsIC8vIDExIFBvd2RlciBCbHVlICAgIGJsdWUtNTBcclxuICAgICcjZjBmOWZmJywgLy8gMTIgU2t5ICAgICAgICAgICAgc2t5LTUwICAgICAob3Bwb3NpdGUgb2Ygb3JhbmdlKVxyXG4gICAgJyNmNWYzZmYnLCAvLyAxMyBWaW9sZXQgTWlzdCAgICB2aW9sZXQtNTBcclxuICAgICcjZjdmZWU3JywgLy8gMTQgTGltZSBXaGlzcGVyICAgbGltZS01MCAgICAob3Bwb3NpdGUgb2YgdmlvbGV0KVxyXG4gICAgJyNmZGY0ZmYnLCAvLyAxNSBMaWxhYyAgICAgICAgICBmdWNoc2lhLTUwXHJcbiAgICAnI2VjZmRmNScsIC8vIDE2IE1pbnQgICAgICAgICAgIGVtZXJhbGQtNTBcclxuICAgICcjZmRmMmY4JywgLy8gMTcgUGV0YWwgUGluayAgICAgcGluay01MFxyXG4gICAgJyNmZmZiZWInLCAvLyAxOCBIb25leSAgICAgICAgICBhbWJlci01MFxyXG4gICAgJyNmMWY1ZjknLCAvLyAxOSBDbG91ZCAgICAgICAgICBzbGF0ZS0xMDBcclxuICAgICcjZjVmNWY0JywgLy8gMjAgTGluZW4gICAgICAgICAgc3RvbmUtMTAwXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwbGFub0RhdGFTZXJ2aWNlOiBQbGFub0RhdGFTZXJ2aWNlLFxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNldFBhZ2VEYXRhKCk7XHJcbiAgICB0aGlzLmluaXRGb3JtKCk7XHJcblxyXG4gICAgLy8gR2F0ZSBvbiB0aGUgYWxsb3dsaXN0IGJlZm9yZSB3aXJpbmcgYW55IGRhdGEgbG9hZHMgLyBzdWJzY3JpcHRpb25zLlxyXG4gICAgYXdhaXQgdGhpcy5jaGVja0FjY2VzcygpO1xyXG4gICAgaWYgKCF0aGlzLmFsbG93ZWQpIHJldHVybjtcclxuXHJcbiAgICAvLyBMaXN0ZW4gdG8gdGhlIHNoYXJlZCBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzIOKAlCB3aGVuIHRoZSBlbWJlZGRlZFxyXG4gICAgLy8gVGVtcGxhdGVQcm9kdWN0cy9UZW1wbGF0ZVZtcyBjb21wb25lbnRzIHB1c2ggZWRpdHMgYmFjayBpbnRvIHRoZVxyXG4gICAgLy8gQmVoYXZpb3JTdWJqZWN0LCBwZXJzaXN0IGEgc25hcHNob3QgdW5kZXIgdGhlIGFjdGl2ZSBzbG90ICsgbGlicmFyeS5cclxuICAgIHRoaXMucGxhbm9EYXRhU2VydmljZS5maXh0dXJlVGVtcGxhdGVEZXRhaWxzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhIHx8ICF0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXApIHJldHVybjtcclxuICAgICAgICAvLyBPbmx5IGNhcHR1cmUgdXNlciBlZGl0cywgbm90IHRoZSBpbml0aWFsIGxvYWQgd2UgcHVzaGVkIG91cnNlbHZlcy5cclxuICAgICAgICAvLyBUaGUgZW1iZWRkZWQgY29tcG9uZW50cyBzZXQgYGlnbm9yZVVwZGF0ZTogdHJ1ZWAgd2hlbiB0aGV5IHB1c2hcclxuICAgICAgICAvLyB0aGVpciBmb3JtIGNoYW5nZXMgYmFjazsgd2UgdXNlIHRoYXQgYXMgb3VyIHNpZ25hbC5cclxuICAgICAgICBpZiAoIWRhdGEuaWdub3JlVXBkYXRlKSByZXR1cm47XHJcbiAgICAgICAgLy8gUGVyc2lzdCBlZGl0cyBtYWRlIGRpcmVjdGx5IGluIHRoZSBlbWJlZGRlZCBlZGl0b3IgKGUuZy4gVk1cclxuICAgICAgICAvLyBwb3NpdGlvbnMsIHdoaWNoIHN0YXkgZWRpdGFibGUgaW4gbG9va3NNb2RlKSB0byB0aGUgYWN0aXZlIGxpYnJhcnkuXHJcbiAgICAgICAgLy8gQ3Jvc3MtbGlicmFyeSBwcm9wYWdhdGlvbiBpcyBkcml2ZW4gYnkgdGhlIHNsb3QncyBwbGFjZW1lbnRzIGxpc3RcclxuICAgICAgICAvLyBpbnN0ZWFkIChzZWUgYXBwbHlQbGFjZW1lbnRzVG9Bc3NpZ25lZExpYnJhcmllcykuXHJcbiAgICAgICAgdGhpcy5jYXB0dXJlTGlicmFyeVNuYXBzaG90KHRoaXMuc2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCwgZGF0YSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCBoZWFkZXJGaWx0ZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSB8fCAne30nKTtcclxuICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGE/LmNsaWVudCB8fCBoZWFkZXJGaWx0ZXJzPy5jbGllbnQ7XHJcbiAgICAgIGlmICh0aGlzLmNsaWVudElkKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkRml4dHVyZUxpYnJhcmllcygpO1xyXG4gICAgICAgIHRoaXMubG9hZFBsYWNlbWVudERyb3Bkb3duRGF0YSgpO1xyXG4gICAgICAgIHRoaXMubG9hZENvbWJvT3B0aW9ucygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFzeW5jIChwYXJhbXMpID0+IHtcclxuICAgICAgY29uc3QgaWQgPSBwYXJhbXNbJ2NvbGxlY3Rpb25JZCddO1xyXG4gICAgICB0aGlzLmNvbGxlY3Rpb25JZCA9IGlkICYmIGlkICE9PSAnbmV3JyA/IGlkIDogbnVsbDtcclxuICAgICAgdGhpcy5pc05ldyA9ICF0aGlzLmNvbGxlY3Rpb25JZDtcclxuICAgICAgaWYgKHRoaXMuY29sbGVjdGlvbklkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkRGV0YWlscygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBFbWJlZGRlZCBUZW1wbGF0ZVByb2R1Y3RzQ29tcG9uZW50IC8gVGVtcGxhdGVWbXNDb21wb25lbnQgcmVhZCB0aGVzZVxyXG4gICAgLy8gcXVlcnkgcGFyYW1zIGZyb20gdGhlIGFjdGl2ZSByb3V0ZS4gRm9yY2UgdGhlbSB0byBlZGl0LW1vZGUgYW5kIHBpblxyXG4gICAgLy8gdGhlIHByb2R1Y3RzIHZpZXcgdG8gdGhlIFwic2VjdGlvblwiIGxldmVsLlxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiAndHJ1ZScsIGxldmVsOiAnc2VjdGlvbicgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc29sdmUgd2hldGhlciB0aGUgc2Vzc2lvbiB1c2VyIG1heSBhY2Nlc3MgTG9va3MuIE5ldmVyIHRocm93cy4gKi9cclxuICBwcml2YXRlIGFzeW5jIGNoZWNrQWNjZXNzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0TG9va0FjY2VzcygpKTtcclxuICAgICAgdGhpcy5hbGxvd2VkID0gISFyZXM/LmRhdGE/LmFsbG93ZWQ7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gY2hlY2tBY2Nlc3MgW0VSUl06JywgZXJyKTtcclxuICAgICAgdGhpcy5hbGxvd2VkID0gZmFsc2U7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmFjY2Vzc0NoZWNrZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKCdMb29rIENvbGxlY3Rpb24nKTtcclxuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xyXG4gICAgICB7IHRpdGxlOiAnUGxhbm9ncmFtJywgcGF0aDogJy9tYW5hZ2UvcGxhbm9ncmFtL21hbmFnZS1wbGFub2dyYW1zJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogJycsIHBhdGg6ICcnLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHsgdGl0bGU6ICdMb29rcycsIHBhdGg6ICcvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXHJcbiAgICAgIHsgdGl0bGU6ICcnLCBwYXRoOiAnJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBpbml0Rm9ybSgpIHtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBuYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBkZXNjcmlwdGlvbjogWycnXSxcclxuICAgICAgaXNBY3RpdmU6IFtmYWxzZV0sXHJcbiAgICAgIGxvb2tzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxvb2tzKCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnbG9va3MnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBmaXh0dXJlU2xvdHMobG9va0luZGV4OiBudW1iZXIpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMubG9va3MuYXQobG9va0luZGV4KS5nZXQoJ2ZpeHR1cmVTbG90cycpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIHBsYWNlbWVudHMobG9va0luZGV4OiBudW1iZXIsIHNsb3RJbmRleDogbnVtYmVyKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVTbG90cyhsb29rSW5kZXgpLmF0KHNsb3RJbmRleCkuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkTG9va0dyb3VwKCk6IEZvcm1Hcm91cCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPj0gMCAmJiB0aGlzLnNlbGVjdGVkTG9va0luZGV4IDwgdGhpcy5sb29rcy5sZW5ndGhcclxuICAgICAgPyAodGhpcy5sb29rcy5hdCh0aGlzLnNlbGVjdGVkTG9va0luZGV4KSBhcyBGb3JtR3JvdXApXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFNsb3RzQXJyYXkoKTogRm9ybUFycmF5IHwgbnVsbCB7XHJcbiAgICBjb25zdCBsb29rID0gdGhpcy5zZWxlY3RlZExvb2tHcm91cDtcclxuICAgIHJldHVybiBsb29rID8gKGxvb2suZ2V0KCdmaXh0dXJlU2xvdHMnKSBhcyBGb3JtQXJyYXkpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFNsb3RHcm91cCgpOiBGb3JtR3JvdXAgfCBudWxsIHtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5zZWxlY3RlZFNsb3RzQXJyYXk7XHJcbiAgICBpZiAoIXNsb3RzKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID49IDAgJiYgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA8IHNsb3RzLmxlbmd0aFxyXG4gICAgICA/IChzbG90cy5hdCh0aGlzLnNlbGVjdGVkU2xvdEluZGV4KSBhcyBGb3JtR3JvdXApXHJcbiAgICAgIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFBsYWNlbWVudHMoKTogRm9ybUFycmF5IHwgbnVsbCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIHJldHVybiBzbG90ID8gKHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5KSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMb29rR3JvdXAoc2VlZDogYW55ID0ge30pOiBGb3JtR3JvdXAge1xyXG4gICAgY29uc3Qgc2VlZFNsb3RzID0gQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVTbG90cykgJiYgc2VlZC5maXh0dXJlU2xvdHMubGVuZ3RoXHJcbiAgICAgID8gc2VlZC5maXh0dXJlU2xvdHNcclxuICAgICAgOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heCgxLCBOdW1iZXIoc2VlZC5maXh0dXJlQ291bnQpIHx8IDEpIH0sIChfLCBpKSA9PiAoeyBzbG90SW5kZXg6IGkgKyAxIH0pKTtcclxuICAgIGNvbnN0IHNsb3RzID0gc2VlZFNsb3RzLm1hcCgoczogYW55LCBpOiBudW1iZXIpID0+IHRoaXMuY3JlYXRlU2xvdEdyb3VwKHsgLi4ucywgc2xvdEluZGV4OiBpICsgMSB9KSk7XHJcblxyXG4gICAgLy8gTGVnYWN5IGRhdGEgbWF5IGhhdmUgc3RvcmVkIGNhZEhlYWRlclZhcmlhbnRzIGF0IHRoZSBzbG90IGxldmVsLiBJZiB0aGVcclxuICAgIC8vIGluY29taW5nIGxvb2sgZG9lc24ndCBoYXZlIGl0cyBvd24gdmFyaWFudHMgYXJyYXksIGZvbGQgdGhlIHVuaW9uIG9mXHJcbiAgICAvLyBzbG90LWxldmVsIHZhcmlhbnRzIGludG8gdGhlIGxvb2sgc28gZWRpdGluZyBpbiB0aGUgbmV3IFVJIGRvZXNuJ3QgbG9zZVxyXG4gICAgLy8gdGhlbS5cclxuICAgIGNvbnN0IHNlZWRMb29rVmFyaWFudHMgPSBBcnJheS5pc0FycmF5KHNlZWQuY2FkSGVhZGVyVmFyaWFudHMpXHJcbiAgICAgID8gc2VlZC5jYWRIZWFkZXJWYXJpYW50c1xyXG4gICAgICA6IEFycmF5LmZyb20obmV3IFNldChcclxuICAgICAgICAoQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVTbG90cykgPyBzZWVkLmZpeHR1cmVTbG90cyA6IFtdKVxyXG4gICAgICAgICAgLmZsYXRNYXAoKHM6IGFueSkgPT4gQXJyYXkuaXNBcnJheShzPy5jYWRIZWFkZXJWYXJpYW50cykgPyBzLmNhZEhlYWRlclZhcmlhbnRzIDogW10pLFxyXG4gICAgICApKTtcclxuXHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAga2V5VHlwZTogW3NlZWQua2V5VHlwZSB8fCAnbWJxJ10sXHJcbiAgICAgIG1icUJ1Y2tldDogW3NlZWQubWJxQnVja2V0IHx8ICcnXSxcclxuICAgICAgYnJhbmRDYXRlZ29yeTogW3NlZWQuYnJhbmRDYXRlZ29yeSB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVDb3VudDogW3Nsb3RzLmxlbmd0aCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXHJcbiAgICAgIGZpeHR1cmVUeXBlOiBbQXJyYXkuaXNBcnJheShzZWVkLmZpeHR1cmVUeXBlKSA/IHNlZWQuZml4dHVyZVR5cGUgOiBbXV0sXHJcbiAgICAgIGxheW91dFZhcmlhbnQ6IFtzZWVkLmxheW91dFZhcmlhbnQgfHwgJ3NoZWxmJ10sXHJcbiAgICAgIHN0b3JlUHJvdG86IFtzZWVkLnN0b3JlUHJvdG8gfHwgJyddLFxyXG4gICAgICBjYWRIZWFkZXJWYXJpYW50czogW3NlZWRMb29rVmFyaWFudHNdLFxyXG4gICAgICBmaXh0dXJlU2xvdHM6IHRoaXMuZmIuYXJyYXkoc2xvdHMpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gZml4dHVyZUNvdW50IOKGkiBzbG90cyBsZW5ndGggKHVzZXItZWRpdGVkIGNvdW50IGFkanVzdHMgdGhlIHNsb3RzIGFycmF5KVxyXG4gICAgbG9va0dyb3VwLmdldCgnZml4dHVyZUNvdW50JykhLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKG5leHQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDMwLCBOdW1iZXIobmV4dCkgfHwgMCkpO1xyXG4gICAgICAgIGNvbnN0IHNsb3RzQXJyID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIHdoaWxlIChzbG90c0Fyci5sZW5ndGggPCB0YXJnZXQpIHtcclxuICAgICAgICAgIHNsb3RzQXJyLnB1c2godGhpcy5jcmVhdGVTbG90R3JvdXAoeyBzbG90SW5kZXg6IHNsb3RzQXJyLmxlbmd0aCArIDEgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAoc2xvdHNBcnIubGVuZ3RoID4gdGFyZ2V0KSB7XHJcbiAgICAgICAgICBzbG90c0Fyci5yZW1vdmVBdChzbG90c0Fyci5sZW5ndGggLSAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW51bWJlclNsb3RzRm9yR3JvdXAobG9va0dyb3VwKTtcclxuICAgICAgICAvLyBSZWNvbmNpbGUgc2xvdCBzZWxlY3Rpb24gaWYgaXQncyBub3cgb3V0IG9mIGJvdW5kc1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTG9va0luZGV4ID49IDAgJiYgdGhpcy5sb29rcy5hdCh0aGlzLnNlbGVjdGVkTG9va0luZGV4KSA9PT0gbG9va0dyb3VwKSB7XHJcbiAgICAgICAgICBpZiAoc2xvdHNBcnIubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFNsb3RJbmRleCA+PSBzbG90c0Fyci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzQXJyLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGxvb2tHcm91cDtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVNsb3RHcm91cChzZWVkOiBhbnkgPSB7fSk6IEZvcm1Hcm91cCB7XHJcbiAgICBjb25zdCBwbGFjZW1lbnRzID0gKEFycmF5LmlzQXJyYXkoc2VlZC5wbGFjZW1lbnRzKSA/IHNlZWQucGxhY2VtZW50cyA6IFtdKVxyXG4gICAgICAubWFwKChwOiBhbnkpID0+IHRoaXMuY3JlYXRlUGxhY2VtZW50R3JvdXAocCkpO1xyXG4gICAgY29uc3QgbGlicmFyeUNvbmZpZ3MgPSAoQXJyYXkuaXNBcnJheShzZWVkLmxpYnJhcnlDb25maWd1cmF0aW9ucykgPyBzZWVkLmxpYnJhcnlDb25maWd1cmF0aW9ucyA6IFtdKVxyXG4gICAgICAubWFwKChjOiBhbnkpID0+IHRoaXMuY3JlYXRlTGlicmFyeUNvbmZpZ0dyb3VwKGMpKTtcclxuICAgIHJldHVybiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2xvdEluZGV4OiBbc2VlZC5zbG90SW5kZXggPz8gMSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHNsb3RUeXBlOiBbc2VlZC5zbG90VHlwZSB8fCAnc2hlbGYnXSxcclxuICAgICAgYnJhbmQ6IFtzZWVkLmJyYW5kIHx8ICcnXSxcclxuICAgICAgZml4dHVyZUxldmVsWm9uZTogW3NlZWQuZml4dHVyZUxldmVsWm9uZSB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVMaWJyYXJ5UmVmOiBbc2VlZC5maXh0dXJlTGlicmFyeVJlZiB8fCAnJ10sXHJcbiAgICAgIGZpeHR1cmVMaWJyYXJ5TGFiZWw6IFtzZWVkLmZpeHR1cmVMaWJyYXJ5TGFiZWwgfHwgJyddLFxyXG4gICAgICBmaXh0dXJlTGlicmFyeVJlZnM6IFtBcnJheS5pc0FycmF5KHNlZWQuZml4dHVyZUxpYnJhcnlSZWZzKSA/IHNlZWQuZml4dHVyZUxpYnJhcnlSZWZzIDogW11dLFxyXG4gICAgICBwbGFjZW1lbnRzOiB0aGlzLmZiLmFycmF5KHBsYWNlbWVudHMpLFxyXG4gICAgICBsaWJyYXJ5Q29uZmlndXJhdGlvbnM6IHRoaXMuZmIuYXJyYXkobGlicmFyeUNvbmZpZ3MpLFxyXG4gICAgICAvLyBQZXItbGlicmFyeSBzbmFwc2hvdCBvZiB0aGUgZW1iZWRkZWQgZml4dHVyZS10ZW1wbGF0ZSBlZGl0b3Igc3RhdGVcclxuICAgICAgLy8gKHNoZWxmQ29uZmlnICsgcHJvZHVjdC9WTSBwbGFjZW1lbnRzKS4gS2V5ZWQgYnkgbGlicmFyeVJlZi5cclxuICAgICAgbGlicmFyeVNuYXBzaG90czogW1xyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2VlZC5saWJyYXJ5U25hcHNob3RzKSA/IHNlZWQubGlicmFyeVNuYXBzaG90cyA6IFtdLFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVMaWJyYXJ5Q29uZmlnR3JvdXAoc2VlZDogYW55ID0ge30pOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBsaWJyYXJ5UmVmOiBbc2VlZC5saWJyYXJ5UmVmIHx8ICcnXSxcclxuICAgICAgc2hlbGZOdW1iZXI6IFtzZWVkLnNoZWxmTnVtYmVyID8/IDFdLFxyXG4gICAgICBsYWJlbDogW3NlZWQubGFiZWwgfHwgJyddLFxyXG4gICAgICBzaGVsZlR5cGU6IFtzZWVkLnNoZWxmVHlwZSB8fCAnJ10sXHJcbiAgICAgIC8vIFZNcyBhbmQgUElEcyBwaWNrZWQgZnJvbSB0aGUgc2xvdCdzIGBwbGFjZW1lbnRzYCBhcnJheSAoYnkgcG9zaXRpb24gbmFtZSkuXHJcbiAgICAgIHZtUmVmczogW0FycmF5LmlzQXJyYXkoc2VlZC52bVJlZnMpID8gc2VlZC52bVJlZnMgOiBbXV0sXHJcbiAgICAgIHBpZFJlZnM6IFtBcnJheS5pc0FycmF5KHNlZWQucGlkUmVmcykgPyBzZWVkLnBpZFJlZnMgOiBbXV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVBsYWNlbWVudEdyb3VwKHNlZWQ6IGFueSA9IHt9KTogRm9ybUdyb3VwIHtcclxuICAgIC8vIEJhY2t3YXJkLWNvbXBhdDogbGVnYWN5IGRhdGEgc3RvcmVkIGEgc2luZ2xlIHN0cmluZyBpbiBgcmF3VmFsdWVgLiBGb3JcclxuICAgIC8vIFBJRCBwbGFjZW1lbnRzIHdlIG5vdyB1c2UgYHJhd1ZhbHVlc2AgKGFycmF5LCBtdWx0aS1zZWxlY3QpLiBJZiB0aGVcclxuICAgIC8vIHNlZWQgb25seSBoYXMgYHJhd1ZhbHVlYCwgbWlncmF0ZSBpdCB0byB0aGUgYXJyYXkgb24gZmlyc3QgbG9hZC5cclxuICAgIGNvbnN0IHJhd1ZhbHVlc1NlZWQgPSBBcnJheS5pc0FycmF5KHNlZWQucmF3VmFsdWVzKVxyXG4gICAgICA/IHNlZWQucmF3VmFsdWVzXHJcbiAgICAgIDogKHNlZWQua2luZCA9PT0gJ3BpZCcgJiYgc2VlZC5yYXdWYWx1ZSA/IFtTdHJpbmcoc2VlZC5yYXdWYWx1ZSldIDogW10pO1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBwb3NpdGlvbjogW3NlZWQucG9zaXRpb24gfHwgJyddLFxyXG4gICAgICBraW5kOiBbc2VlZC5raW5kIHx8ICdwaWQnXSxcclxuICAgICAgLy8gRm9yIFZNIHJvd3MgdGhpcyBob2xkcyB0aGUgYXJ0d29yayBpZCAoc2luZ2xlIHN0cmluZykuIEZvciBQSUQgcm93c1xyXG4gICAgICAvLyBpdCdzIGxlZnQgZW1wdHkgaW4gZmF2b3VyIG9mIGByYXdWYWx1ZXNgLlxyXG4gICAgICByYXdWYWx1ZTogW3NlZWQua2luZCA9PT0gJ3BpZCcgPyAnJyA6IChzZWVkLnJhd1ZhbHVlIHx8ICcnKV0sXHJcbiAgICAgIHJhd1ZhbHVlczogW3Jhd1ZhbHVlc1NlZWRdLFxyXG4gICAgICB2bVJlZjogW3NlZWQudm1SZWYgfHwgJyddLFxyXG4gICAgICBza3VDb2xsZWN0aW9uUmVmOiBbc2VlZC5za3VDb2xsZWN0aW9uUmVmIHx8ICcnXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkUGxhY2VtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUGxhY2VtZW50cykgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZFBsYWNlbWVudHMucHVzaCh0aGlzLmNyZWF0ZVBsYWNlbWVudEdyb3VwKCkpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUGxhY2VtZW50KGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZFBsYWNlbWVudHMpIHJldHVybjtcclxuICAgIHRoaXMuc2VsZWN0ZWRQbGFjZW1lbnRzLnJlbW92ZUF0KGluZGV4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm9ybVZtVHlwZSh0OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIFN0cmluZyh0ID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdGFibGUgcGVyLXZtVHlwZSBhcnR3b3JrIGxpc3QgbG9va3VwLiBSZXR1cm5zIHRoZSBzYW1lIGFycmF5IHJlZmVyZW5jZVxyXG4gICAqICBmb3IgdGhlIHNhbWUgdm1UeXBlIGFjcm9zcyBDRCBjeWNsZXMgc28gbGliLXJlYWN0aXZlLXNlbGVjdCBkb2Vzbid0XHJcbiAgICogIHJlLWluaXQuIEZhbGxzIGJhY2sgdG8gdGhlIGZ1bGwgbGlzdCB3aGVuIHZtVHlwZSBpcyBlbXB0eS4gKi9cclxuICB2bUFydHdvcmtPcHRpb25zRm9yKHZtVHlwZTogc3RyaW5nKTogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLm5vcm1WbVR5cGUodm1UeXBlKTtcclxuICAgIGlmIChrZXkgJiYgdGhpcy52bUFydHdvcmtCeVR5cGUuaGFzKGtleSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudm1BcnR3b3JrQnlUeXBlLmdldChrZXkpITtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnZtQXJ0d29ya0J5VHlwZS5nZXQoJycpIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBvcHVsYXRlIHRoZSBkcm9wZG93biBkYXRhIHVzZWQgYnkgUGxhY2VtZW50IHJvd3M6XHJcbiAgICogIC0gVk0gVHlwZSBsaXN0IChgZ2V0Vm1UeXBlc0xpc3RgKVxyXG4gICAqICAtIFZNIEFydHdvcmsgbGlzdCAoYHZtTmFtZUxpc3RgKVxyXG4gICAqICAtIFByb2R1Y3QgLyBTS1UgY29sbGVjdGlvbiBsaXN0IChmbGF0dGVuZWQgZnJvbSBicmFuZCDihpIgY2F0ZWdvcnkgbWFwcGluZ1xyXG4gICAqICAgIHRoYXQgcG93ZXJzIC9tYW5hZ2UvcGxhbm9ncmFtL2NvbmZpZykuICovXHJcbiAgYXN5bmMgbG9hZFBsYWNlbWVudERyb3Bkb3duRGF0YSgpIHtcclxuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgW3ZtVHlwZXNSZXMsIHZtc1JlcywgYnJhbmRzUmVzLCBicmFuZE1ldGFSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRWbVR5cGVzTGlzdCh0aGlzLmNsaWVudElkKSksXHJcbiAgICAgICAgbGFzdFZhbHVlRnJvbSh0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldFZNTmFtZUxpc3QodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZExpc3QodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5idWlsZGVyU2VydmljZS5nZXRCcmFuZE1ldGFEYXRhKHRoaXMuY2xpZW50SWQpKSxcclxuICAgICAgXSk7XHJcblxyXG4gICAgICBjb25zdCB2bVR5cGVzOiBhbnlbXSA9ICh2bVR5cGVzUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIHRoaXMudm1UeXBlT3B0aW9ucyA9IHZtVHlwZXNcclxuICAgICAgICAubWFwKCh0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHYgPSB0Py52bVR5cGUgfHwgdD8udm1UeXBlTmFtZSB8fCB0Py5uYW1lIHx8IHQ/Ll9pZDtcclxuICAgICAgICAgIGNvbnN0IGwgPSB0Py52bVR5cGVOYW1lIHx8IHQ/LnZtVHlwZSB8fCB0Py5uYW1lIHx8IHY7XHJcbiAgICAgICAgICByZXR1cm4gdiA/IHsgdmFsdWU6IFN0cmluZyh2KSwgbGFiZWw6IFN0cmluZyhsKSB9IDogbnVsbDtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5maWx0ZXIoKHgpOiB4IGlzIHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9ID0+ICEheCk7XHJcblxyXG4gICAgICBjb25zdCB2bXM6IGFueVtdID0gKHZtc1JlcyBhcyBhbnkpPy5kYXRhIHx8IFtdO1xyXG4gICAgICB0aGlzLnZtQXJ0d29ya09wdGlvbnMgPSB2bXNcclxuICAgICAgICAubWFwKCh2OiBhbnkpOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZtVHlwZT86IHN0cmluZyB9IHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpZCA9IHY/LnZtTmFtZSB8fCB2Py5faWQ7XHJcbiAgICAgICAgICBpZiAoIWlkKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcoaWQpLFxyXG4gICAgICAgICAgICBsYWJlbDogU3RyaW5nKHY/LnZtTmFtZSB8fCBpZCksXHJcbiAgICAgICAgICAgIHZtVHlwZTogdj8udm1UeXBlID8gU3RyaW5nKHYudm1UeXBlKSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKCh4KTogeCBpcyB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHZtVHlwZT86IHN0cmluZyB9ID0+ICEheCk7XHJcblxyXG4gICAgICAvLyAodm1OYW1lLCB2bVR5cGUpIOKGkiBfaWQgc28gd2UgY2FuIHR1cm4gYSBwbGFjZW1lbnQncyBhcnR3b3JrIE5BTUUgaW50b1xyXG4gICAgICAvLyB0aGUgcGxhbm92bSBfaWQgdGhlIGVtYmVkZGVkIFZNIGVkaXRvciBtYXRjaGVzIGFnYWluc3QuXHJcbiAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUgPSBuZXcgTWFwKCk7XHJcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2bXMpIHtcclxuICAgICAgICBpZiAoIXY/Ll9pZCB8fCAhdj8udm1OYW1lKSBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5ub3JtVm1UeXBlKHYudm1OYW1lKTtcclxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5ub3JtVm1UeXBlKHYudm1UeXBlKTtcclxuICAgICAgICB0aGlzLnZtSWRCeU5hbWVUeXBlLnNldChgJHtuYW1lfXx8JHt0eXBlfWAsIFN0cmluZyh2Ll9pZCkpO1xyXG4gICAgICAgIGlmICghdGhpcy52bUlkQnlOYW1lVHlwZS5oYXMobmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMudm1JZEJ5TmFtZVR5cGUuc2V0KG5hbWUsIFN0cmluZyh2Ll9pZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVidWlsZCB0aGUgKHZtVHlwZSDihpIgYXJ0d29ya3MpIGluZGV4IG5vdyB0aGF0IHRoZSBhcnR3b3JrIGxpc3RcclxuICAgICAgLy8gY2hhbmdlZC4gS2V5cyBhcmUgbm9ybWFsaXNlZCAodHJpbSArIGxvd2VyLWNhc2UpIHNvIGEgbWlzbWF0Y2ggaW5cclxuICAgICAgLy8gY2FzaW5nL3doaXRlc3BhY2UgYmV0d2VlbiB2bVR5cGVzIGFuZCB2bXMudm1UeXBlIHN0aWxsIG1hdGNoZXMuXHJcbiAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlID0gbmV3IE1hcCgpO1xyXG4gICAgICBjb25zdCBmdWxsTGlzdCA9IHRoaXMudm1BcnR3b3JrT3B0aW9ucy5tYXAoKHYpID0+ICh7IHZhbHVlOiB2LnZhbHVlLCBsYWJlbDogdi5sYWJlbCB9KSk7XHJcbiAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlLnNldCgnJywgZnVsbExpc3QpO1xyXG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52bUFydHdvcmtPcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5ub3JtVm1UeXBlKHYudm1UeXBlKTtcclxuICAgICAgICBpZiAoIWtleSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZtQXJ0d29ya0J5VHlwZS5oYXMoa2V5KSkgdGhpcy52bUFydHdvcmtCeVR5cGUuc2V0KGtleSwgW10pO1xyXG4gICAgICAgIHRoaXMudm1BcnR3b3JrQnlUeXBlLmdldChrZXkpIS5wdXNoKHsgdmFsdWU6IHYudmFsdWUsIGxhYmVsOiB2LmxhYmVsIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gdm1UeXBlczonLCB0aGlzLnZtVHlwZU9wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdhcnR3b3JrczonLCB0aGlzLnZtQXJ0d29ya09wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdhcnR3b3Jrc0J5VHlwZSBrZXlzOicsIEFycmF5LmZyb20odGhpcy52bUFydHdvcmtCeVR5cGUua2V5cygpKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIC8vIFNvdXJjZTogZXZlcnkgdmFsdWUgdGhlIGJyYW5kICYgcHJvZHVjdCBtYXBwaW5nIHBhZ2UgZXhwb3Nlcy5cclxuICAgICAgLy8gIC0gYGdldEJyYW5kTGlzdGAgICAgIOKGkiBwZXItYnJhbmQgYGNhdGVnb3J5W11gIGFuZCBgc3ViQ2F0ZWdvcnlbXWBcclxuICAgICAgLy8gIC0gYGdldEJyYW5kTWV0YURhdGFgIOKGkiByb3dzIHdpdGggYHBpZENhdGAsIGBjYXRlZ29yeWAsIGB0ZW1wR3JvdXBgXHJcbiAgICAgIGNvbnN0IGJyYW5kczogYW55W10gPSAoYnJhbmRzUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIGNvbnN0IGJyYW5kTWV0YTogYW55W10gPSAoYnJhbmRNZXRhUmVzIGFzIGFueSk/LmRhdGEgfHwgW107XHJcbiAgICAgIGNvbnN0IHNlZW5DYXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgIGNvbnN0IHByb2R1Y3RzOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcbiAgICAgIGNvbnN0IHB1c2hPbmUgPSAodjogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcyA9IFN0cmluZyh2ID8/ICcnKS50cmltKCk7XHJcbiAgICAgICAgaWYgKCFzIHx8IHNlZW5DYXRzLmhhcyhzKSkgcmV0dXJuO1xyXG4gICAgICAgIHNlZW5DYXRzLmFkZChzKTtcclxuICAgICAgICBwcm9kdWN0cy5wdXNoKHsgdmFsdWU6IHMsIGxhYmVsOiBzIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICBjb25zdCBwdXNoQXJyID0gKGFycjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybjtcclxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgYXJyKSBwdXNoT25lKHYpO1xyXG4gICAgICB9O1xyXG4gICAgICBmb3IgKGNvbnN0IGIgb2YgYnJhbmRzKSB7XHJcbiAgICAgICAgcHVzaEFycihiPy5jYXRlZ29yeSk7XHJcbiAgICAgICAgcHVzaEFycihiPy5zdWJDYXRlZ29yeSk7XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCByb3cgb2YgYnJhbmRNZXRhKSB7XHJcbiAgICAgICAgcHVzaE9uZShyb3c/LnBpZENhdCk7XHJcbiAgICAgICAgcHVzaE9uZShyb3c/LmNhdGVnb3J5KTtcclxuICAgICAgICBwdXNoT25lKHJvdz8udGVtcEdyb3VwKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnByb2R1Y3RPcHRpb25zID0gcHJvZHVjdHM7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gcHJvZHVjdC9TS1Ugb3B0aW9uczonLFxyXG4gICAgICAgIHRoaXMucHJvZHVjdE9wdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICdmcm9tJyxcclxuICAgICAgICBicmFuZHMubGVuZ3RoLFxyXG4gICAgICAgICdicmFuZHMgYW5kJyxcclxuICAgICAgICBicmFuZE1ldGEubGVuZ3RoLFxyXG4gICAgICAgICdicmFuZC1tZXRhIHJvd3MnLFxyXG4gICAgICApO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdAQCB+IGxvYWRQbGFjZW1lbnREcm9wZG93bkRhdGEgW0VSUl06JywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgdGhlIE1CUSBidWNrZXQgLyBCcmFuZCAvIEZpeHR1cmUgSGVhZGVyIGRyb3Bkb3duIG9wdGlvbnMgc2VlZGVkIGludG9cclxuICAgKiBwbGFub3N0YXRpY2RhdGFzIGZyb20gdGhlIHNoZWV0LCB0aGVuIHJlYnVpbGQgdGhlIGZsYXQgb3B0aW9uIGxpc3RzXHJcbiAgICogKG1lcmdpbmcgaW4gYW55IHZhbHVlcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGxvYWRlZCBjb2xsZWN0aW9uKS5cclxuICAgKi9cclxuICBhc3luYyBsb2FkQ29tYm9PcHRpb25zKCkge1xyXG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRMb29rQ29tYm9PcHRpb25zKHRoaXMuY2xpZW50SWQpLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhIHx8IHt9O1xyXG4gICAgICBjb25zdCB0b1N0ckFyciA9IChhcnI6IGFueSk6IHN0cmluZ1tdID0+XHJcbiAgICAgICAgKEFycmF5LmlzQXJyYXkoYXJyKSA/IGFyciA6IFtdKVxyXG4gICAgICAgICAgICAubWFwKCh2OiBhbnkpID0+IFN0cmluZyh2ID8/ICcnKS50cmltKCkpXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHM6IHN0cmluZykgPT4gISFzKTtcclxuICAgICAgdGhpcy5jb21ib1JhdyA9IHtcclxuICAgICAgICBtYnFCdWNrZXRzOiB0b1N0ckFycihkYXRhLm1icUJ1Y2tldHMpLFxyXG4gICAgICAgIGJyYW5kczogdG9TdHJBcnIoZGF0YS5icmFuZHMpLFxyXG4gICAgICAgIGZpeHR1cmVIZWFkZXJzOiB0b1N0ckFycihkYXRhLmZpeHR1cmVIZWFkZXJzKSxcclxuICAgICAgICBjb21iaW5hdGlvbnM6IChBcnJheS5pc0FycmF5KGRhdGEuY29tYmluYXRpb25zKSA/IGRhdGEuY29tYmluYXRpb25zIDogW10pXHJcbiAgICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICBtYnFCdWNrZXQ6IFN0cmluZyhjPy5tYnFCdWNrZXQgPz8gJycpLnRyaW0oKSxcclxuICAgICAgICAgICAgICBicmFuZDogU3RyaW5nKGM/LmJyYW5kID8/ICcnKS50cmltKCksXHJcbiAgICAgICAgICAgICAgZml4dHVyZUhlYWRlcjogU3RyaW5nKGM/LmZpeHR1cmVIZWFkZXIgPz8gJycpLnRyaW0oKSxcclxuICAgICAgICAgICAgfSkpLFxyXG4gICAgICB9O1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIC8vIEVuZHBvaW50IG1pc3NpbmcgLyBub3QgeWV0IGRlcGxveWVkIOKAlCBmYWxsIGJhY2sgdG8gdmFsdWVzIGRlcml2ZWRcclxuICAgICAgLy8gZnJvbSB0aGUgbG9hZGVkIGNvbGxlY3Rpb24gc28gdGhlIGRyb3Bkb3ducyBzdGlsbCB3b3JrLlxyXG4gICAgICBjb25zb2xlLmxvZygnQEAgfiBsb2FkQ29tYm9PcHRpb25zIFtFUlJdOicsIGVycik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlYnVpbGRDb21ib09wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlYnVpbGQgdGhlIE1CUSBidWNrZXQgLyBCcmFuZCAvIEZpeHR1cmUgSGVhZGVyIG9wdGlvbiBsaXN0cyAoYW5kIHRoZVxyXG4gICAqIGNhc2NhZGluZyBjYWNoZXMpIGJ5IE1FUkdJTkcgdGhlIHNlZWRlZCBlbmRwb2ludCBwYXlsb2FkIChjb21ib1Jhdykgd2l0aFxyXG4gICAqIHdoYXRldmVyIHZhbHVlcyBhcmUgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBjdXJyZW50bHktbG9hZGVkIGxvb2tzLiBUaGVcclxuICAgKiBtZXJnZSBndWFyYW50ZWVzIHRoZSBkcm9wZG93bnMgYXJlIG5ldmVyIGVtcHR5IGZvciBhbiBleGlzdGluZyBjb2xsZWN0aW9uXHJcbiAgICogZXZlbiB3aGVuIHRoZSBlbmRwb2ludCBoYXNuJ3QgbG9hZGVkLCBhbmQgdGhhdCBhbnkgdmFsdWUgYWxyZWFkeSBzYXZlZCBvblxyXG4gICAqIGEgbG9vayBpcyBhbHdheXMgc2VsZWN0YWJsZS5cclxuICAgKi9cclxuICBwcml2YXRlIHJlYnVpbGRDb21ib09wdGlvbnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBidWNrZXRzID0gbmV3IFNldDxzdHJpbmc+KHRoaXMuY29tYm9SYXcubWJxQnVja2V0cyk7XHJcbiAgICBjb25zdCBicmFuZHMgPSBuZXcgU2V0PHN0cmluZz4odGhpcy5jb21ib1Jhdy5icmFuZHMpO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBTZXQ8c3RyaW5nPih0aGlzLmNvbWJvUmF3LmZpeHR1cmVIZWFkZXJzKTtcclxuXHJcbiAgICAvLyBTZWVkIGNvbWJpbmF0aW9ucyBhbHNvIGZlZWQgdGhlIGZsYXQgcGVyLWZpZWxkIGxpc3RzLlxyXG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY29tYm9SYXcuY29tYmluYXRpb25zKSB7XHJcbiAgICAgIGlmIChjLm1icUJ1Y2tldCkgYnVja2V0cy5hZGQoYy5tYnFCdWNrZXQpO1xyXG4gICAgICBpZiAoYy5icmFuZCkgYnJhbmRzLmFkZChjLmJyYW5kKTtcclxuICAgICAgaWYgKGMuZml4dHVyZUhlYWRlcikgaGVhZGVycy5hZGQoYy5maXh0dXJlSGVhZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNZXJnZSBpbiB2YWx1ZXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBsb2FkZWQgbG9va3Mvc2xvdHMgc28gdGhlXHJcbiAgICAvLyBkcm9wZG93bnMgd29yayBldmVuIHdoZW4gdGhlIGVuZHBvaW50IGhhc24ndCBsb2FkZWQuXHJcbiAgICBmb3IgKGNvbnN0IGxvb2tDdHJsIG9mIHRoaXMubG9va3MuY29udHJvbHMpIHtcclxuICAgICAgY29uc3QgbG9vayA9IGxvb2tDdHJsIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY29uc3QgYnVja2V0ID1cclxuICAgICAgICBTdHJpbmcobG9vay5nZXQoJ21icUJ1Y2tldCcpPy52YWx1ZSA/PyAnJykudHJpbSgpXHJcbiAgICAgICAgICB8fCBTdHJpbmcobG9vay5nZXQoJ2JyYW5kQ2F0ZWdvcnknKT8udmFsdWUgPz8gJycpLnRyaW0oKTtcclxuICAgICAgaWYgKGJ1Y2tldCkgYnVja2V0cy5hZGQoYnVja2V0KTtcclxuICAgICAgY29uc3Qgc2xvdHMgPSBsb29rLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgICAgZm9yIChjb25zdCBzbG90Q3RybCBvZiBzbG90cz8uY29udHJvbHMgfHwgW10pIHtcclxuICAgICAgICBjb25zdCBzbG90ID0gc2xvdEN0cmwgYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IGJyYW5kID0gU3RyaW5nKHNsb3QuZ2V0KCdicmFuZCcpPy52YWx1ZSA/PyAnJykudHJpbSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IFN0cmluZyhzbG90LmdldCgnZml4dHVyZUxldmVsWm9uZScpPy52YWx1ZSA/PyAnJykudHJpbSgpO1xyXG4gICAgICAgIGlmIChicmFuZCkgYnJhbmRzLmFkZChicmFuZCk7XHJcbiAgICAgICAgaWYgKGhlYWRlcikgaGVhZGVycy5hZGQoaGVhZGVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRvSXRlbXMgPSAoc2V0OiBTZXQ8c3RyaW5nPik6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPT5cclxuICAgICAgWyAuLi5zZXQgXS5maWx0ZXIoKHMpID0+ICEhcykuc29ydCgpLm1hcCgocykgPT4gKHsgdmFsdWU6IHMsIGxhYmVsOiBzIH0pKTtcclxuXHJcbiAgICB0aGlzLm1icUJ1Y2tldEl0ZW1zID0gdG9JdGVtcyhidWNrZXRzKTtcclxuICAgIHRoaXMuYnJhbmRJdGVtcyA9IHRvSXRlbXMoYnJhbmRzKTtcclxuICAgIHRoaXMuZml4dHVyZUhlYWRlckl0ZW1zID0gdG9JdGVtcyhoZWFkZXJzKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgJ1tMb29rcyBmb3JtXSBjb21ibyBvcHRpb25zOicsXHJcbiAgICAgIHRoaXMubWJxQnVja2V0SXRlbXMubGVuZ3RoLCAnYnVja2V0cywnLFxyXG4gICAgICB0aGlzLmJyYW5kSXRlbXMubGVuZ3RoLCAnYnJhbmRzLCcsXHJcbiAgICAgIHRoaXMuZml4dHVyZUhlYWRlckl0ZW1zLmxlbmd0aCwgJ2hlYWRlcnMnLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRGaXh0dXJlTGlicmFyaWVzKCkge1xyXG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBPbmx5IGxpc3QgZml4dHVyZSB0ZW1wbGF0ZXMgYXZhaWxhYmxlIGluIEluZGlhIChjb3VudHJ5IGNvZGUgJ0lOJykuXHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldEZpeHR1cmVMaWJOYW1lTGlzdCh0aGlzLmNsaWVudElkLCAnbm9uLWRyYWZ0JywgJ0lOJyksXHJcbiAgICAgICk7XHJcbiAgICAgIC8vIFJlc3BvbnNlIHNoYXBlOiB7IGNvZGUsIHN0YXR1cywgZGF0YTogW3sgaWQsIGZpeHR1cmVOYW1lLCBmaXh0dXJlVHlwZSB9XSB9LlxyXG4gICAgICBjb25zdCBsaXN0OiB7IGlkOiBzdHJpbmc7IGZpeHR1cmVOYW1lOiBzdHJpbmc7IGZpeHR1cmVUeXBlOiBzdHJpbmcgfVtdID1cclxuICAgICAgICBBcnJheS5pc0FycmF5KHJlcz8uZGF0YSkgPyByZXMuZGF0YSA6IFtdO1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMgPSBsaXN0Lm1hcCgobCkgPT4gKHtcclxuICAgICAgICBpZDogbC5pZCxcclxuICAgICAgICBuYW1lOiBsLmZpeHR1cmVOYW1lLFxyXG4gICAgICAgIGZpeHR1cmVUeXBlOiAobC5maXh0dXJlVHlwZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKSxcclxuICAgICAgfSkpO1xyXG4gICAgICBjb25zdCB0eXBlVGFsbHk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcclxuICAgICAgZm9yIChjb25zdCBpdCBvZiB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMpIHtcclxuICAgICAgICBjb25zdCBrID0gaXQuZml4dHVyZVR5cGUgfHwgJyhlbXB0eSknO1xyXG4gICAgICAgIHR5cGVUYWxseVtrXSA9ICh0eXBlVGFsbHlba10gfHwgMCkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdbTG9va3MgZm9ybV0gZml4dHVyZSBsaWJyYXJpZXMgbG9hZGVkOicsXHJcbiAgICAgICAgdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAnZml4dHVyZVR5cGUgdGFsbHk6JyxcclxuICAgICAgICB0eXBlVGFsbHksXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMucmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZygnQEAgfiBsb2FkRml4dHVyZUxpYnJhcmllcyBbRVJSXTonLCBlcnIpO1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlY29tcHV0ZSB0aGUgc2xvdC10eXBlLWZpbHRlcmVkIGxpYnJhcnkgbGlzdCBvbmNlLiBTdGFibGUgcmVmZXJlbmNlXHJcbiAgICogc28gdGhlIG11bHRpc2VsZWN0IGRvZXNuJ3QgdGVhciBkb3duIGl0cyBjbGljayB0YXJnZXRzIGV2ZXJ5IENEIGN5Y2xlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVjb21wdXRlRml4dHVyZUxpYnJhcnlJdGVtc0ZvclNsb3QoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuICAgIGlmICghc2xvdCkge1xyXG4gICAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90ID0gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLnNsaWNlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHNsb3RUeXBlID0gc2xvdC5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gc2xvdFR5cGUgPT09ICdldXJvY2VudGVyJyA/ICdmbG9vcicgOiAnd2FsbCc7XHJcbiAgICB0aGlzLmZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90ID0gdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCB0ID0gaXRlbS5maXh0dXJlVHlwZTtcclxuICAgICAgaWYgKCF0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGlmICh0YXJnZXQgPT09ICd3YWxsJykgcmV0dXJuIHQgPT09ICd3YWxsJyB8fCB0LmluY2x1ZGVzKCd3YWxsJyk7XHJcbiAgICAgIHJldHVybiB0ID09PSAnZmxvb3InIHx8IHQuaW5jbHVkZXMoJ2Zsb29yJykgfHwgdC5pbmNsdWRlcygnZXVybycpIHx8IHQuaW5jbHVkZXMoJ2ZyZWUnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9ucyBzY29wZWQgdG8gd2hpY2hldmVyIHNsb3QgaXMgY3VycmVudGx5IGFjdGl2ZS4gQ2xlYXJlZCBhbmRcclxuICAgKiByZWJ1aWx0IGV2ZXJ5IHRpbWUgdGhlIGFjdGl2ZSBzbG90IGNoYW5nZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzbG90U3ViczogYW55W10gPSBbXTtcclxuXHJcbiAgLyoqIFBlbmRpbmcgYXV0by1hcHBseSBwcm9taXNlcyBrZXllZCBieSBsaWJJZCBzbyBjaGlwIGNsaWNrcyBjYW4gYXdhaXQuICovXHJcbiAgcHJpdmF0ZSBhdXRvQXBwbHlJbkZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xyXG5cclxuICAvKiogV2lyZS9yZWZyZXNoIHN1YnNjcmlwdGlvbnMgdGhhdCBkZXBlbmQgb24gdGhlIGFjdGl2ZSBzbG90OlxyXG4gICAqICAtIHJlLWZpbHRlciB0aGUgbGlicmFyeSBtdWx0aXNlbGVjdCB3aGVuIHNsb3RUeXBlIGNoYW5nZXNcclxuICAgKiAgLSBydW4gYXV0by1hcHBseSB3aGVuIGEgbmV3IGxpYnJhcnkgaXMgYWRkZWQgdG8gZml4dHVyZUxpYnJhcnlSZWZzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBiaW5kQWN0aXZlU2xvdExpc3RlbmVycygpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnNsb3RTdWJzKSBzPy51bnN1YnNjcmliZT8uKCk7XHJcbiAgICB0aGlzLnNsb3RTdWJzID0gW107XHJcblxyXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMuc2VsZWN0ZWRTbG90R3JvdXA7XHJcbiAgICBpZiAoIXNsb3QpIHtcclxuICAgICAgdGhpcy5maXh0dXJlTGlicmFyeUl0ZW1zRm9yU2xvdCA9IHRoaXMuZml4dHVyZUxpYnJhcnlJdGVtcy5zbGljZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlY29tcHV0ZUZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90KCk7XHJcblxyXG4gICAgLy8gUmUtZmlsdGVyIHRoZSBGaXh0dXJlIFRlbXBsYXRlcyBsaXN0IHdoZW4gdGhlIEZpeHR1cmUgVHlwZSBjaGFuZ2VzLCBhbmRcclxuICAgIC8vIFJFU0VUIHRoZSBjdXJyZW50IHRlbXBsYXRlIHNlbGVjdGlvbnM6IHdhbGwgKHNoZWxmKSBhbmQgZmxvb3JcclxuICAgIC8vIChldXJvY2VudGVyKSBsaWJyYXJ5IHNldHMgYXJlIGRpc2pvaW50LCBzbyBhbnl0aGluZyBzZWxlY3RlZCBmb3IgdGhlIG9sZFxyXG4gICAgLy8gdHlwZSBpcyBpbnZhbGlkIGZvciB0aGUgbmV3IG9uZS4gQ2xlYXJpbmcgZml4dHVyZUxpYnJhcnlSZWZzIGNhc2NhZGVzIOKAlFxyXG4gICAgLy8gdGhlIHJlZnNTdWIgYmVsb3cgY2xlYXJzIHRoZSBlbWJlZGRlZCBwcmV2aWV3LCBhbmQgd2UgZHJvcCB0aGUgc3RhbGVcclxuICAgIC8vIHBlci1saWJyYXJ5IHNuYXBzaG90cyB0b28uXHJcbiAgICBsZXQgcHJldlNsb3RUeXBlOiBzdHJpbmcgPSBTdHJpbmcoc2xvdC5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlID8/ICcnKTtcclxuICAgIGNvbnN0IHR5cGVTdWIgPSBzbG90LmdldCgnc2xvdFR5cGUnKT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgobmV4dFR5cGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSBTdHJpbmcobmV4dFR5cGUgPz8gJycpICE9PSBwcmV2U2xvdFR5cGU7XHJcbiAgICAgICAgcHJldlNsb3RUeXBlID0gU3RyaW5nKG5leHRUeXBlID8/ICcnKTtcclxuICAgICAgICB0aGlzLnJlY29tcHV0ZUZpeHR1cmVMaWJyYXJ5SXRlbXNGb3JTbG90KCk7XHJcbiAgICAgICAgaWYgKCFjaGFuZ2VkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcmVmc0N0cmwgPSBzbG90LmdldCgnZml4dHVyZUxpYnJhcnlSZWZzJyk7XHJcbiAgICAgICAgaWYgKHJlZnNDdHJsICYmIChyZWZzQ3RybC52YWx1ZSB8fCBbXSkubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZWZzQ3RybC5zZXRWYWx1ZShbXSk7IC8vIHRyaWdnZXJzIHJlZnNTdWIgLT4gY2xlYXJzIGFjdGl2ZSBwcmV2aWV3XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNuYXBzQ3RybCA9IHNsb3QuZ2V0KCdsaWJyYXJ5U25hcHNob3RzJyk7XHJcbiAgICAgICAgaWYgKHNuYXBzQ3RybCAmJiAoc25hcHNDdHJsLnZhbHVlIHx8IFtdKS5sZW5ndGgpIHtcclxuICAgICAgICAgIHNuYXBzQ3RybC5zZXRWYWx1ZShbXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBEZWZlbnNpdmU6IGNsZWFyIHRoZSBsZWdhY3kgc2luZ2xlLXJlZiBmaWVsZHMgaWYgdGhleSB3ZXJlIHNldC5cclxuICAgICAgICBzbG90LmdldCgnZml4dHVyZUxpYnJhcnlSZWYnKT8uc2V0VmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICBzbG90LmdldCgnZml4dHVyZUxpYnJhcnlMYWJlbCcpPy5zZXRWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9KTtcclxuICAgIGlmICh0eXBlU3ViKSB0aGlzLnNsb3RTdWJzLnB1c2godHlwZVN1Yik7XHJcblxyXG4gICAgLy8gVHJhY2sgcHJldmlvdXMgcmVmcyBzbyB3ZSBjYW4gZGV0ZWN0ICpuZXcqIGFkZGl0aW9ucyBhbmQgYXV0by1hcHBseVxyXG4gICAgLy8gdGhlIHNsb3QncyBQSURzIHRvIHRob3NlIG5ldyBsaWJyYXJpZXMuXHJcbiAgICBsZXQgcHJldlJlZnM6IHN0cmluZ1tdID0gWy4uLihzbG90LmdldCgnZml4dHVyZUxpYnJhcnlSZWZzJyk/LnZhbHVlIHx8IFtdKV07XHJcbiAgICBjb25zdCByZWZzU3ViID0gc2xvdC5nZXQoJ2ZpeHR1cmVMaWJyYXJ5UmVmcycpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChuZXh0UmVmczogc3RyaW5nW10pID0+IHtcclxuICAgICAgY29uc3QgbmV4dCA9IEFycmF5LmlzQXJyYXkobmV4dFJlZnMpID8gbmV4dFJlZnMgOiBbXTtcclxuICAgICAgY29uc3QgYWRkZWQgPSBuZXh0LmZpbHRlcigocikgPT4gISFyICYmICFwcmV2UmVmcy5pbmNsdWRlcyhyKSk7XHJcbiAgICAgIHByZXZSZWZzID0gWy4uLm5leHRdO1xyXG5cclxuICAgICAgLy8gSWYgdGhlIGN1cnJlbnRseS1wcmV2aWV3ZWQgbGlicmFyeSB3YXMgdW5zZWxlY3RlZCwgY2xlYXIgdGhlXHJcbiAgICAgIC8vIGVtYmVkZGVkIHZpZXcgc28gd2UgZG9uJ3Qgc2hvdyBzdGFsZSBkYXRhLlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwXHJcbiAgICAgICAgICAmJiAhbmV4dC5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkTGlicmFyeUlkSW5NYXApXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMub25MaWJyYXJ5TWFwU2VsZWN0KCcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCBsaWJJZCBvZiBhZGRlZCkge1xyXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmF1dG9BcHBseVBpZHNUb0xpYnJhcnkobGliSWQpO1xyXG4gICAgICAgIHRoaXMuYXV0b0FwcGx5SW5GbGlnaHQuc2V0KGxpYklkLCBwKTtcclxuICAgICAgICBwLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXV0b0FwcGx5SW5GbGlnaHQuZ2V0KGxpYklkKSA9PT0gcCkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9BcHBseUluRmxpZ2h0LmRlbGV0ZShsaWJJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIG5vdGhpbmcgaXMgYmVpbmcgcHJldmlld2VkIHlldCwgYXV0by1hY3RpdmF0ZSB0aGUgZmlyc3QgbGlicmFyeVxyXG4gICAgICAvLyB0aGUgdXNlciBqdXN0IGFkZGVkIHNvIHRoZSBlbWJlZGRlZCBQSUQvVk0gZWRpdG9yIG9wZW5zIGltbWVkaWF0ZWx5XHJcbiAgICAgIC8vIChlc3BlY2lhbGx5IHJlbGV2YW50IHdoZW4gYWRkaW5nIHRoZSBGSVJTVCBsaWJyYXJ5IHRvIGFuIGVtcHR5XHJcbiAgICAgIC8vIG11bHRpc2VsZWN0IOKAlCBwcmV2aW91c2x5IHRoZSBjaGlwIHN0cmlwIHNob3dlZCBpdCBidXQgdGhlIHByZXZpZXdcclxuICAgICAgLy8gcGFuZSBzdGF5ZWQgYmxhbmsgdW50aWwgdGhlIHVzZXIgY2xpY2tlZCB0aGUgY2hpcCkuXHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZExpYnJhcnlJZEluTWFwKSB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RBY3RpdmUgPSBhZGRlZC5maW5kKChpZCkgPT4gISFpZCkgfHwgbmV4dC5maW5kKChpZCkgPT4gISFpZCk7XHJcbiAgICAgICAgaWYgKGZpcnN0QWN0aXZlKSB0aGlzLm9uTGlicmFyeU1hcFNlbGVjdChmaXJzdEFjdGl2ZSk7XHJcbiAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBpZiAocmVmc1N1YikgdGhpcy5zbG90U3Vicy5wdXNoKHJlZnNTdWIpO1xyXG5cclxuICAgIC8vIFdoZW4gYW55IHBsYWNlbWVudCBpbiB0aGUgXCJMb29rIGFuZCBWaXN1YWwgTWVyY2hhbmRpc2luZyBQbGFjZW1lbnRzXCJcclxuICAgIC8vIGxpc3QgY2hhbmdlcywgcmUtZGVyaXZlIGV2ZXJ5IGFzc2lnbmVkIGxpYnJhcnkncyBzbmFwc2hvdCBzbyB0aGUgZWRpdFxyXG4gICAgLy8gcHJvcGFnYXRlcyB0byBhbGwgb2YgdGhlbS4gRGVib3VuY2VkIHNvIHJhcGlkIHR5cGluZyBjb2xsYXBzZXMgaW50byBhXHJcbiAgICAvLyBzaW5nbGUgcmUtYXBwbHkuXHJcbiAgICBjb25zdCBwbGFjZW1lbnRzQXJyID0gc2xvdC5nZXQoJ3BsYWNlbWVudHMnKSBhcyBGb3JtQXJyYXkgfCBudWxsO1xyXG4gICAgY29uc3QgcGxhY2VtZW50c1N1YiA9IHBsYWNlbWVudHNBcnI/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNDAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuYXBwbHlQbGFjZW1lbnRzVG9Bc3NpZ25lZExpYnJhcmllcygpKTtcclxuICAgIGlmIChwbGFjZW1lbnRzU3ViKSB0aGlzLnNsb3RTdWJzLnB1c2gocGxhY2VtZW50c1N1Yik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIGEgbmV3IGxpYnJhcnkgaXMgYWRkZWQgdG8gdGhlIHNsb3QsIHdhbGsgaXRzIHNoZWxmQ29uZmlnIGFuZCBmb3JcclxuICAgKiBlYWNoIHNoZWxmIHdob3NlIHNlY3Rpb24gY3VycmVudGx5IGhhcyBubyBicmFuZCwgY29weSB0aGUgcmF3VmFsdWUgb2ZcclxuICAgKiB0aGUgc2xvdCdzIFBJRCBwbGFjZW1lbnQgd2hvc2UgYHBvc2l0aW9uYCBtYXRjaGVzIHRoZSBzaGVsZidzXHJcbiAgICogYHpvbmVgL2BsYWJlbGAuIFJlc3VsdCBpcyBzYXZlZCBhcyB0aGUgbGlicmFyeSdzIHNuYXBzaG90IHNvIHRoZVxyXG4gICAqIGVtYmVkZGVkIGZpeHR1cmUtdGVtcGxhdGUgZWRpdG9yIHBpY2tzIGl0IHVwIHRoZSBuZXh0IHRpbWUgdGhlIGNoaXBcclxuICAgKiBpcyBvcGVuZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBhdXRvQXBwbHlQaWRzVG9MaWJyYXJ5KGxpYklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghbGliSWQpIHJldHVybjtcclxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNlbGVjdGVkU2xvdEdyb3VwO1xyXG4gICAgaWYgKCFzbG90KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcGxhY2VtZW50c0FyciA9IHNsb3QuZ2V0KCdwbGFjZW1lbnRzJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgIGNvbnN0IHBsYWNlbWVudHM6IGFueVtdID0gcGxhY2VtZW50c0Fycj8udmFsdWUgfHwgW107XHJcbiAgICBjb25zdCBwaWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoXHJcbiAgICAgIChwKSA9PiBwPy5raW5kID09PSAncGlkJyAmJiBwPy5wb3NpdGlvbiAmJiBwPy5yYXdWYWx1ZSxcclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgbm9ybSA9IChzOiBhbnkpOiBzdHJpbmcgPT4gU3RyaW5nKHMgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGNvbnN0IHBsYWNlbWVudE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgICBmb3IgKGNvbnN0IHAgb2YgcGlkUGxhY2VtZW50cykge1xyXG4gICAgICBwbGFjZW1lbnRNYXAuc2V0KG5vcm0ocC5wb3NpdGlvbiksIFN0cmluZyhwLnJhd1ZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU3RhcnQgZnJvbSBhbiBleGlzdGluZyBzbmFwc2hvdCBpZiB3ZSBhbHJlYWR5IHNhdmVkIG9uZSBmb3IgdGhpcyBzbG90XHJcbiAgICAvLyArIGxpYnJhcnk7IG90aGVyd2lzZSBmZXRjaCB0aGUgZnJlc2ggbGlicmFyeSBkb2MuIFRoZSBwZXItZmllbGQgZ3VhcmRzXHJcbiAgICAvLyBiZWxvdyBzdGlsbCBlbnN1cmUgd2UgbmV2ZXIgb3ZlcndyaXRlIHVzZXItc2V0IGJyYW5kcyBvciBWTXMuXHJcbiAgICBsZXQgbGliRGF0YTogYW55ID0gdGhpcy5nZXRMaWJyYXJ5U25hcHNob3QobGliSWQpO1xyXG4gICAgaWYgKCFsaWJEYXRhKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMobGliSWQpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGliRGF0YSA9IHJlcz8uZGF0YTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0BAIH4gYXV0b0FwcGx5UGlkc1RvTGlicmFyeSBbRVJSXTonLCBlcnIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFsaWJEYXRhKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2hlbGZDb25maWc6IGFueVtdID0gQXJyYXkuaXNBcnJheShsaWJEYXRhLnNoZWxmQ29uZmlnKSA/IGxpYkRhdGEuc2hlbGZDb25maWcgOiBbXTtcclxuICAgIGxldCBwaWRzQXBwbGllZCA9IGZhbHNlO1xyXG4gICAgY29uc3QgbmV3U2hlbGZDb25maWcgPSBzaGVsZkNvbmZpZy5tYXAoKHNoZWxmOiBhbnkpID0+IHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2hlbGY/LnByb2R1Y3RCcmFuZE5hbWUpICYmIHNoZWxmLnByb2R1Y3RCcmFuZE5hbWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiBzaGVsZjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IHNoZWxmPy56b25lIHx8IHNoZWxmPy5sYWJlbCB8fCAnJztcclxuICAgICAgY29uc3QgbWF0Y2hLZXkgPSBub3JtKHNvdXJjZUxhYmVsKTtcclxuICAgICAgaWYgKCFtYXRjaEtleSkgcmV0dXJuIHNoZWxmO1xyXG4gICAgICBjb25zdCBtYXRjaCA9IHBsYWNlbWVudE1hcC5nZXQobWF0Y2hLZXkpO1xyXG4gICAgICBpZiAoIW1hdGNoKSByZXR1cm4gc2hlbGY7XHJcbiAgICAgIHBpZHNBcHBsaWVkID0gdHJ1ZTtcclxuICAgICAgLy8gZ3JvdXBTaGVsdmVzQnlab25lKCkgaW4gVGVtcGxhdGVQcm9kdWN0c0NvbXBvbmVudCBTS0lQUyBhbnkgc2hlbGZcclxuICAgICAgLy8gd2hvc2UgYHpvbmVgIGlzIGVtcHR5LCBzbyB3ZSBtdXN0IHNldCB6b25lICh1c2luZyB0aGUgc2hlbGYncyBsYWJlbFxyXG4gICAgICAvLyBpZiBpdCBpc24ndCBhbHJlYWR5IHNldCkgZm9yIHRoZSBzZWN0aW9uIHRvIGZvcm0uXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uc2hlbGYsXHJcbiAgICAgICAgem9uZTogc2hlbGY/LnpvbmUgfHwgc291cmNlTGFiZWwsXHJcbiAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW21hdGNoXSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIC0tLSBWTSBhdXRvLWFwcGx5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBJZiB0aGUgbGlicmFyeSBoYXMgbm8gVk1zIGNvbmZpZ3VyZWQgeWV0LCBjb3B5IGVhY2ggb2YgdGhlIHNsb3QncyBWTVxyXG4gICAgLy8gcGxhY2VtZW50cyBvdmVyIGFzIGEgdm1Db25maWcgZW50cnkuIE5vIHBvc2l0aW9uLWJhc2VkIG1hdGNoaW5nIGhlcmUg4oCUXHJcbiAgICAvLyB0aGUgcGxhY2VtZW50J3MgYHJhd1ZhbHVlYCBiZWNvbWVzIHRoZSBWTSBhcnR3b3JrIGFuZCBgcG9zaXRpb25gXHJcbiAgICAvLyBiZWNvbWVzIHRoZSBWTSB0eXBlIGxhYmVsLlxyXG4gICAgY29uc3QgZXhpc3RpbmdWbXMgPSBBcnJheS5pc0FycmF5KGxpYkRhdGEudm1Db25maWcpID8gbGliRGF0YS52bUNvbmZpZyA6IFtdO1xyXG4gICAgbGV0IG5ld1ZtQ29uZmlnID0gZXhpc3RpbmdWbXM7XHJcbiAgICBsZXQgdm1zQXBwbGllZCA9IGZhbHNlO1xyXG4gICAgaWYgKGV4aXN0aW5nVm1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCB2bVBsYWNlbWVudHMgPSBwbGFjZW1lbnRzLmZpbHRlcihcclxuICAgICAgICAocCkgPT4gcD8ua2luZCA9PT0gJ3ZtJyAmJiBwPy5yYXdWYWx1ZSxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHZtUGxhY2VtZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbmV3Vm1Db25maWcgPSB2bVBsYWNlbWVudHMubWFwKChwKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB2bVR5cGUgPSBTdHJpbmcocD8ucG9zaXRpb24gfHwgJycpO1xyXG4gICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5pbml0aWFsVm1MYXlvdXQodm1UeXBlLCBuZXdTaGVsZkNvbmZpZyk7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB2bVR5cGUsXHJcbiAgICAgICAgICAgIHZtSWQ6IFN0cmluZyhwPy5yYXdWYWx1ZSB8fCAnJyksXHJcbiAgICAgICAgICAgIHZtTmFtZTogU3RyaW5nKHA/LnJhd1ZhbHVlIHx8ICcnKSxcclxuICAgICAgICAgICAgLi4ubGF5b3V0LFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogJycsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZtc0FwcGxpZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFwaWRzQXBwbGllZCAmJiAhdm1zQXBwbGllZCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFRoZSBlbWJlZGRlZCBUZW1wbGF0ZVByb2R1Y3RzQ29tcG9uZW50IG9ubHkgcmVhZHMgc2VjdGlvbi1sZXZlbCBicmFuZFxyXG4gICAgLy8gdmFsdWVzIHdoZW4gcHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wzJy5cclxuICAgIGNvbnN0IHVwZGF0ZWRMaWIgPSB7XHJcbiAgICAgIC4uLmxpYkRhdGEsXHJcbiAgICAgIHNoZWxmQ29uZmlnOiBuZXdTaGVsZkNvbmZpZyxcclxuICAgICAgdm1Db25maWc6IG5ld1ZtQ29uZmlnLFxyXG4gICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiAnTDMnLFxyXG4gICAgfTtcclxuICAgIHRoaXMuY2FwdHVyZUxpYnJhcnlTbmFwc2hvdChsaWJJZCwgdXBkYXRlZExpYik7XHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2FkRGV0YWlscygpIHtcclxuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uSWQpIHJldHVybjtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5idWlsZGVyU2VydmljZS5nZXRMb29rUGxhbm9Db2xsZWN0aW9uRGV0YWlscyh0aGlzLmNvbGxlY3Rpb25JZCksXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGE7XHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgbmFtZTogZGF0YS5uYW1lIHx8ICcnLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEuZGVzY3JpcHRpb24gfHwgJycsXHJcbiAgICAgICAgICBpc0FjdGl2ZTogISFkYXRhLmlzQWN0aXZlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMubG9va3MuY2xlYXIoKTtcclxuICAgICAgICAoZGF0YS5sb29rcyB8fCBbXSkuZm9yRWFjaCgobDogYW55KSA9PiB0aGlzLmxvb2tzLnB1c2godGhpcy5jcmVhdGVMb29rR3JvdXAobCkpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID0gdGhpcy5sb29rcy5sZW5ndGggPyAwIDogLTE7XHJcbiAgICAgICAgY29uc3Qgc2xvdHMgPSB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID49IDAgPyB0aGlzLmZpeHR1cmVTbG90cyh0aGlzLnNlbGVjdGVkTG9va0luZGV4KSA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzICYmIHNsb3RzLmxlbmd0aCA/IDAgOiAtMTtcclxuICAgICAgICB0aGlzLnJlc2V0TGlicmFyeU1hcCgpO1xyXG4gICAgICAgIHRoaXMuYmluZEFjdGl2ZVNsb3RMaXN0ZW5lcnMoKTtcclxuICAgICAgICB0aGlzLmF1dG9TZWxlY3RGaXJzdExpYnJhcnkoKTtcclxuICAgICAgICAvLyBNZXJnZSB0aGlzIGNvbGxlY3Rpb24ncyBvd24gdmFsdWVzIGludG8gdGhlIGRyb3Bkb3duIG9wdGlvbnMgc28gdGhleVxyXG4gICAgICAgIC8vIHNob3cgZXZlbiBpZiB0aGUgY29tYm9PcHRpb25zIGVuZHBvaW50IGlzIHVuYXZhaWxhYmxlLlxyXG4gICAgICAgIHRoaXMucmVidWlsZENvbWJvT3B0aW9ucygpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0BAIH4gbG9hZERldGFpbHMgW0VSUl06JywgZXJyKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0Py4oJ0ZhaWxlZCB0byBsb2FkIExvb2sgY29sbGVjdGlvbicpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRMb29rKCkge1xyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuY3JlYXRlTG9va0dyb3VwKHsgbWJxQnVja2V0OiAnJywgZml4dHVyZUNvdW50OiAxIH0pO1xyXG4gICAgdGhpcy5sb29rcy5wdXNoKG5leHQpO1xyXG4gICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCA9IHRoaXMubG9va3MubGVuZ3RoIC0gMTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSB0aGlzLmZpeHR1cmVTbG90cyh0aGlzLnNlbGVjdGVkTG9va0luZGV4KS5sZW5ndGggPyAwIDogLTE7XHJcbiAgICB0aGlzLmJpbmRBY3RpdmVTbG90TGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVMb29rKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMubG9va3MucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPT09IGluZGV4KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPSB0aGlzLmxvb2tzLmxlbmd0aCA/IDAgOiAtMTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IC0xO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTG9va0luZGV4ID4gaW5kZXgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCAtPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvbmUgdGhlIGxvb2sgYXQgYGluZGV4YCAoZGVlcCBjb3B5IG9mIGl0cyBmdWxsIG5lc3RlZCB2YWx1ZSDigJQgc2xvdHMsXHJcbiAgICogcGxhY2VtZW50cywgY2FkSGVhZGVyVmFyaWFudHMsIGxpYnJhcnlTbmFwc2hvdHMpIGFuZCBpbnNlcnQgaXQgcmlnaHRcclxuICAgKiBhZnRlciB0aGUgb3JpZ2luYWwsIHRoZW4gc2VsZWN0IHRoZSBjb3B5LiBjcmVhdGVMb29rR3JvdXAgcmVidWlsZHMgdGhlXHJcbiAgICogd2hvbGUgRm9ybUdyb3VwIHRyZWUgZnJvbSB0aGUgSlNPTiBzZWVkLCBzbyB0aGUgY2xvbmUgc2hhcmVzIG5vIGNvbnRyb2xcclxuICAgKiByZWZlcmVuY2VzIHdpdGggdGhlIHNvdXJjZS5cclxuICAgKi9cclxuICBkdXBsaWNhdGVMb29rKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNyYyA9IHRoaXMubG9va3MuYXQoaW5kZXgpIGFzIEZvcm1Hcm91cCB8IG51bGw7XHJcbiAgICBpZiAoIXNyYykgcmV0dXJuO1xyXG4gICAgY29uc3Qgc2VlZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3JjLmdldFJhd1ZhbHVlKCkpKTtcclxuICAgIGNvbnN0IGNsb25lID0gdGhpcy5jcmVhdGVMb29rR3JvdXAoc2VlZCk7XHJcbiAgICB0aGlzLmxvb2tzLmluc2VydChpbmRleCArIDEsIGNsb25lKTtcclxuICAgIHRoaXMuc2VsZWN0TG9vayhpbmRleCArIDEpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0TG9vayhpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTG9va0luZGV4ID0gaW5kZXg7XHJcbiAgICBjb25zdCBzbG90cyA9IHRoaXMuZml4dHVyZVNsb3RzKGluZGV4KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBzbG90cy5sZW5ndGggPyAwIDogLTE7XHJcbiAgICB0aGlzLnJlc2V0TGlicmFyeU1hcCgpO1xyXG4gICAgdGhpcy5iaW5kQWN0aXZlU2xvdExpc3RlbmVycygpO1xyXG4gICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RMaWJyYXJ5KCk7XHJcbiAgfVxyXG5cclxuICBhZGRTbG90KCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPCAwKSByZXR1cm47XHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLmxvb2tzLmF0KHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCk7XHJcbiAgICBzbG90cy5wdXNoKHRoaXMuY3JlYXRlU2xvdEdyb3VwKHsgc2xvdEluZGV4OiBzbG90cy5sZW5ndGggKyAxIH0pKTtcclxuICAgIGxvb2tHcm91cC5nZXQoJ2ZpeHR1cmVDb3VudCcpIS5zZXRWYWx1ZShzbG90cy5sZW5ndGgsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBzbG90cy5sZW5ndGggLSAxO1xyXG4gICAgdGhpcy5iaW5kQWN0aXZlU2xvdExpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2xvdChzbG90SW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXggPCAwKSByZXR1cm47XHJcbiAgICBjb25zdCBsb29rR3JvdXAgPSB0aGlzLmxvb2tzLmF0KHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHNsb3RzID0gdGhpcy5maXh0dXJlU2xvdHModGhpcy5zZWxlY3RlZExvb2tJbmRleCk7XHJcbiAgICBzbG90cy5yZW1vdmVBdChzbG90SW5kZXgpO1xyXG4gICAgdGhpcy5yZW51bWJlclNsb3RzRm9yR3JvdXAobG9va0dyb3VwKTtcclxuICAgIGxvb2tHcm91cC5nZXQoJ2ZpeHR1cmVDb3VudCcpIS5zZXRWYWx1ZShzbG90cy5sZW5ndGgsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID09PSBzbG90SW5kZXgpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFNsb3RJbmRleCA9IHNsb3RzLmxlbmd0aCA/IE1hdGgubWluKHNsb3RJbmRleCwgc2xvdHMubGVuZ3RoIC0gMSkgOiAtMTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFNsb3RJbmRleCA+IHNsb3RJbmRleCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2xvdEluZGV4IC09IDE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW51bWJlclNsb3RzRm9yR3JvdXAobG9va0dyb3VwOiBGb3JtR3JvdXApIHtcclxuICAgIGNvbnN0IHNsb3RzQXJyID0gbG9va0dyb3VwLmdldCgnZml4dHVyZVNsb3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgc2xvdHNBcnIuY29udHJvbHMuZm9yRWFjaCgoc2xvdCwgaSkgPT4ge1xyXG4gICAgICAoc2xvdCBhcyBGb3JtR3JvdXApLmdldCgnc2xvdEluZGV4Jyk/LnNldFZhbHVlKGkgKyAxLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNsb3Qoc2xvdEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTbG90SW5kZXggPSBzbG90SW5kZXg7XHJcbiAgICB0aGlzLnJlc2V0TGlicmFyeU1hcCgpO1xyXG4gICAgdGhpcy5iaW5kQWN0aXZlU2xvdExpc3RlbmVycygpO1xyXG4gICAgdGhpcy5hdXRvU2VsZWN0Rmlyc3RMaWJyYXJ5KCk7XHJcbiAgfVxyXG5cclxuICBsb29rVGl0bGUobG9va0dyb3VwOiBGb3JtR3JvdXApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qga2V5VHlwZSA9IGxvb2tHcm91cC5nZXQoJ2tleVR5cGUnKT8udmFsdWU7XHJcbiAgICBjb25zdCBrZXkgPSBrZXlUeXBlID09PSAnYnJhbmRDYXRlZ29yeSdcclxuICAgICAgPyBsb29rR3JvdXAuZ2V0KCdicmFuZENhdGVnb3J5Jyk/LnZhbHVlXHJcbiAgICAgIDogbG9va0dyb3VwLmdldCgnbWJxQnVja2V0Jyk/LnZhbHVlO1xyXG4gICAgY29uc3QgY291bnQgPSBsb29rR3JvdXAuZ2V0KCdmaXh0dXJlQ291bnQnKT8udmFsdWU7XHJcbiAgICByZXR1cm4gYCR7a2V5IHx8ICcodW5uYW1lZCknfSDigJQgJHtjb3VudCB8fCAwfSBmaXh0dXJlc2A7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG9ydCB2aXN1YWwgaW5kaWNhdG9yIGZvciB0aGUgc2xvdFR5cGUgbWl4IG9mIGEgbG9vayDigJQgcmVuZGVyZWQgYXMgYVxyXG4gICAqIGNvbG91cmVkIGNoaXAgaW4gdGhlIE1CUSBCdWNrZXQgLSBGaXh0dXJlIENvbWJpbmF0aW9ucyBsaXN0LiBSZXR1cm5zXHJcbiAgICogYG51bGxgIGZvciBhbiBlbXB0eSBsb29rIHNvIHRoZSBjaGlwIGlzIGhpZGRlbi5cclxuICAgKi9cclxuICBmaXh0dXJlVHlwZUJhZGdlKGxvb2tHcm91cDogRm9ybUdyb3VwKTogeyBsYWJlbDogc3RyaW5nOyBjbHM6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBzbG90cyA9IGxvb2tHcm91cC5nZXQoJ2ZpeHR1cmVTbG90cycpIGFzIEZvcm1BcnJheSB8IG51bGw7XHJcbiAgICBpZiAoIXNsb3RzIHx8IHNsb3RzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgaGFzU2hlbGYgPSBmYWxzZTtcclxuICAgIGxldCBoYXNFdXJvID0gZmFsc2U7XHJcbiAgICBmb3IgKGNvbnN0IGMgb2Ygc2xvdHMuY29udHJvbHMpIHtcclxuICAgICAgY29uc3QgdCA9IChjIGFzIEZvcm1Hcm91cCkuZ2V0KCdzbG90VHlwZScpPy52YWx1ZTtcclxuICAgICAgaWYgKHQgPT09ICdldXJvY2VudGVyJykgaGFzRXVybyA9IHRydWU7XHJcbiAgICAgIGVsc2UgaGFzU2hlbGYgPSB0cnVlO1xyXG4gICAgICBpZiAoaGFzU2hlbGYgJiYgaGFzRXVybykgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBpZiAoaGFzU2hlbGYgJiYgaGFzRXVybykgcmV0dXJuIHsgbGFiZWw6ICdXYWxsICsgRmxvb3InLCBjbHM6ICdiYWRnZS1taXhlZCcgfTtcclxuICAgIGlmIChoYXNFdXJvKSByZXR1cm4geyBsYWJlbDogJ0Zsb29yJywgY2xzOiAnYmFkZ2UtZmxvb3InIH07XHJcbiAgICByZXR1cm4geyBsYWJlbDogJ1dhbGwnLCBjbHM6ICdiYWRnZS13YWxsJyB9O1xyXG4gIH1cclxuXHJcbiAgYnVja2V0S2V5KGxvb2tHcm91cDogRm9ybUdyb3VwKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGtleVR5cGUgPSBsb29rR3JvdXAuZ2V0KCdrZXlUeXBlJyk/LnZhbHVlO1xyXG4gICAgY29uc3Qga2V5ID0ga2V5VHlwZSA9PT0gJ2JyYW5kQ2F0ZWdvcnknXHJcbiAgICAgID8gbG9va0dyb3VwLmdldCgnYnJhbmRDYXRlZ29yeScpPy52YWx1ZVxyXG4gICAgICA6IGxvb2tHcm91cC5nZXQoJ21icUJ1Y2tldCcpPy52YWx1ZTtcclxuICAgIHJldHVybiAoa2V5IHx8ICcnKS50cmltKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBc3NpZ24gYSBjb2xvdXIgdG8gZWFjaCB1bmlxdWUgYnVja2V0IGtleSBieSAqKmluc2VydGlvbiBvcmRlcioqLCBub3QgYnkgaGFzaC5cclxuICAgKiBUaGUgTnRoIGRpc3RpbmN0IGJ1Y2tldCAoY291bnRlZCB0b3AtdG8tYm90dG9tIHRocm91Z2ggdGhlIGxvb2tzIGFycmF5KSBnZXRzXHJcbiAgICogYEJVQ0tFVF9QQUxFVFRFW05dYC4gT25seSBhZnRlciBhbGwgMjAgcGFsZXR0ZSBzbG90cyBhcmUgdXNlZCBkb2VzIHRoZSBhc3NpZ25tZW50XHJcbiAgICogd3JhcCBhcm91bmQg4oCUIHNvIG5vIGNvbG91ciBpcyBldmVyIHJldXNlZCB3aGlsZSA8IDIwIGRpc3RpbmN0IGJ1Y2tldHMgZXhpc3QuXHJcbiAgICpcclxuICAgKiBSZWNvbXB1dGVkIG9uIGV2ZXJ5IGNhbGwgc28gbGl2ZSBlZGl0cyB0byB0aGUgYnVja2V0IG5hbWUgcmUtZmxvdyBjb2xvdXJzLlxyXG4gICAqL1xyXG4gIGJ1Y2tldENvbG9yKGxvb2tHcm91cDogRm9ybUdyb3VwKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuYnVja2V0S2V5KGxvb2tHcm91cCk7XHJcbiAgICBpZiAoIWtleSkgcmV0dXJuICcjZjlmYWZiJztcclxuICAgIGNvbnN0IHBhbGV0dGUgPSBMb29rUGxhbm9Db2xsZWN0aW9uRm9ybUNvbXBvbmVudC5CVUNLRVRfUEFMRVRURTtcclxuICAgIGxldCBuZXh0SW5kZXggPSAwO1xyXG4gICAgY29uc3QgYXNzaWduZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLmxvb2tzLmNvbnRyb2xzKSB7XHJcbiAgICAgIGNvbnN0IGsgPSB0aGlzLmJ1Y2tldEtleShncm91cCBhcyBGb3JtR3JvdXApO1xyXG4gICAgICBpZiAoayAmJiAhYXNzaWduZWQuaGFzKGspKSB7XHJcbiAgICAgICAgYXNzaWduZWQuc2V0KGssIHBhbGV0dGVbbmV4dEluZGV4ICUgcGFsZXR0ZS5sZW5ndGhdKTtcclxuICAgICAgICBuZXh0SW5kZXggKz0gMTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoayA9PT0ga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIGFzc2lnbmVkLmdldChrKSE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnI2Y5ZmFmYic7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW9yZGVyIHRoZSBsb29rcyBGb3JtQXJyYXkgc28gdGhhdCB0aGUgYnVja2V0IHdpdGggdGhlICoqbW9zdCoqIGxvb2tzXHJcbiAgICogY29tZXMgZmlyc3QgYW5kIHRoZSBvbmUgd2l0aCB0aGUgZmV3ZXN0IGNvbWVzIGxhc3QgKGFscGhhYmV0aWNhbCB0aWUtYnJlYWtcclxuICAgKiB3aXRoaW4gdGhlIHNhbWUgY291bnQpLiBMb29rcyB3aXRoaW4gdGhlIHNhbWUgYnVja2V0IGFyZSBzb3J0ZWQgYnlcclxuICAgKiBhc2NlbmRpbmcgZml4dHVyZUNvdW50LiBTZWxlY3Rpb24gaXMgcHJlc2VydmVkIGJ5IHJlZmVyZW5jZSwgbm90IGJ5IGluZGV4LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlTb3J0ZWRPcmRlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMubG9va3MuY29udHJvbHMgYXMgRm9ybUdyb3VwW107XHJcbiAgICBpZiAoZ3JvdXBzLmxlbmd0aCA8PSAxKSByZXR1cm47XHJcblxyXG4gICAgLy8gVGFsbHkgaG93IG1hbnkgbG9va3MgZWFjaCBidWNrZXQgaGFzIHNvIHdlIGNhbiBzb3J0IGJ1Y2tldHMgYnkgZnJlcXVlbmN5LlxyXG4gICAgY29uc3QgYnVja2V0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuICAgIGZvciAoY29uc3QgZyBvZiBncm91cHMpIHtcclxuICAgICAgY29uc3QgayA9IHRoaXMuYnVja2V0S2V5KGcpO1xyXG4gICAgICBpZiAoIWspIGNvbnRpbnVlO1xyXG4gICAgICBidWNrZXRDb3VudHMuc2V0KGssIChidWNrZXRDb3VudHMuZ2V0KGspIHx8IDApICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmdyb3Vwc10uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBhS2V5ID0gdGhpcy5idWNrZXRLZXkoYSk7XHJcbiAgICAgIGNvbnN0IGJLZXkgPSB0aGlzLmJ1Y2tldEtleShiKTtcclxuICAgICAgLy8gRW1wdHkgYnVja2V0IGtleXMgZ28gdG8gdGhlIGVuZCBzbyB1bmZpbmlzaGVkIGxvb2tzIGRvbid0IGRpc3J1cHQgdGhlIGdyb3Vwc1xyXG4gICAgICBpZiAoYUtleSAmJiAhYktleSkgcmV0dXJuIC0xO1xyXG4gICAgICBpZiAoIWFLZXkgJiYgYktleSkgcmV0dXJuIDE7XHJcblxyXG4gICAgICAvLyBQcmltYXJ5OiBidWNrZXQgZnJlcXVlbmN5LCBkZXNjZW5kaW5nIChtb3N0LXBvcHVsYXRlZCBidWNrZXQgZmlyc3QpXHJcbiAgICAgIGNvbnN0IGFDb3VudCA9IGJ1Y2tldENvdW50cy5nZXQoYUtleSkgfHwgMDtcclxuICAgICAgY29uc3QgYkNvdW50ID0gYnVja2V0Q291bnRzLmdldChiS2V5KSB8fCAwO1xyXG4gICAgICBpZiAoYUNvdW50ICE9PSBiQ291bnQpIHJldHVybiBiQ291bnQgLSBhQ291bnQ7XHJcblxyXG4gICAgICAvLyBUaWUtYnJlYWs6IGFscGhhYmV0aWNhbCBidWNrZXQgbmFtZVxyXG4gICAgICBpZiAoYUtleSAhPT0gYktleSkgcmV0dXJuIGFLZXkubG9jYWxlQ29tcGFyZShiS2V5KTtcclxuXHJcbiAgICAgIC8vIFdpdGhpbiB0aGUgc2FtZSBidWNrZXQ6IGFzY2VuZGluZyBmaXh0dXJlQ291bnRcclxuICAgICAgY29uc3QgYUZDID0gTnVtYmVyKGEuZ2V0KCdmaXh0dXJlQ291bnQnKT8udmFsdWUpIHx8IDA7XHJcbiAgICAgIGNvbnN0IGJGQyA9IE51bWJlcihiLmdldCgnZml4dHVyZUNvdW50Jyk/LnZhbHVlKSB8fCAwO1xyXG4gICAgICByZXR1cm4gYUZDIC0gYkZDO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgb3JkZXJDaGFuZ2VkID0gc29ydGVkLnNvbWUoKGcsIGkpID0+IGcgIT09IGdyb3Vwc1tpXSk7XHJcbiAgICBpZiAoIW9yZGVyQ2hhbmdlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRMb29rID0gdGhpcy5zZWxlY3RlZExvb2tHcm91cDtcclxuICAgIGNvbnN0IGN1cnJlbnRTbG90ID0gdGhpcy5zZWxlY3RlZFNsb3RHcm91cDtcclxuXHJcbiAgICB0aGlzLmxvb2tzLmNsZWFyKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHNvcnRlZC5mb3JFYWNoKChnKSA9PiB0aGlzLmxvb2tzLnB1c2goZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pKTtcclxuXHJcbiAgICBpZiAoY3VycmVudExvb2spIHtcclxuICAgICAgY29uc3QgbmV3TG9va0lkeCA9IHNvcnRlZC5pbmRleE9mKGN1cnJlbnRMb29rKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZExvb2tJbmRleCA9IG5ld0xvb2tJZHg7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTG9va0luZGV4ID49IDAgJiYgY3VycmVudFNsb3QpIHtcclxuICAgICAgICBjb25zdCBzbG90c0FyciA9IHRoaXMuZml4dHVyZVNsb3RzKHRoaXMuc2VsZWN0ZWRMb29rSW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IG5ld1Nsb3RJZHggPSBzbG90c0Fyci5jb250cm9scy5pbmRleE9mKGN1cnJlbnRTbG90KTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU2xvdEluZGV4ID0gbmV3U2xvdElkeDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2F2ZSgpIHtcclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3Q/LignUGxlYXNlIGZpbGwgYWxsIHJlcXVpcmVkIGZpZWxkcycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBTb3J0IHRoZSBsb29rcyBiZWZvcmUgc2VyaWFsaXNpbmcgc28gYm90aCB0aGUgcGVyc2lzdGVkIHBheWxvYWRcclxuICAgICAgLy8gYW5kIHRoZSBvbi1zY3JlZW4gbGlzdCByZWZsZWN0IGdyb3VwaW5nIGJ5IE1CUSBidWNrZXQgLyBicmFuZCBjYXRlZ29yeVxyXG4gICAgICAvLyBhbmQgYXNjZW5kaW5nIGZpeHR1cmUgY291bnQuXHJcbiAgICAgIHRoaXMuYXBwbHlTb3J0ZWRPcmRlcigpO1xyXG5cclxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAgICAgICAuLi50aGlzLmZvcm0udmFsdWUsXHJcbiAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIH07XHJcbiAgICAgIGlmICh0aGlzLmlzTmV3KSB7XHJcbiAgICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKHRoaXMuYnVpbGRlclNlcnZpY2UuY3JlYXRlTG9va1BsYW5vQ29sbGVjdGlvbihwYXlsb2FkKSk7XHJcbiAgICAgICAgY29uc3QgbmV3SWQgPSByZXM/LmRhdGE/Ll9pZDtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdD8uKCdMb29rIGNvbGxlY3Rpb24gY3JlYXRlZCcpO1xyXG4gICAgICAgIGlmIChuZXdJZCkge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3BsYW5vZ3JhbS9sb29rcycsIG5ld0lkXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vbG9va3MnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IGxhc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUxvb2tQbGFub0NvbGxlY3Rpb24oeyAuLi5wYXlsb2FkLCBjb2xsZWN0aW9uSWQ6IHRoaXMuY29sbGVjdGlvbklkIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3Q/LignTG9vayBjb2xsZWN0aW9uIHVwZGF0ZWQnKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdAQCB+IHNhdmUgW0VSUl06JywgZXJyKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0Py4oJ0ZhaWxlZCB0byBzYXZlIExvb2sgY29sbGVjdGlvbicpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbmNlbCgpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vbG9va3MnXSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIGluZGV4O1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIC8vIFJlbGVhc2UgdGhlIHNoYXJlZCBCZWhhdmlvclN1YmplY3Qgc28gb3RoZXIgcGFnZXMgZG9uJ3QgaW5oZXJpdCBhIHN0YWxlIGxpYnJhcnkuXHJcbiAgICB0aGlzLnBsYW5vRGF0YVNlcnZpY2UuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KG51bGwpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwiIWFjY2Vzc0NoZWNrZWRcIiBjbGFzcz1cImNhcmQgcC01IG0tNCB0ZXh0LWNlbnRlciB0ZXh0LW11dGVkXCI+Q2hlY2tpbmcgYWNjZXNz4oCmPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiYWNjZXNzQ2hlY2tlZCAmJiAhYWxsb3dlZFwiIGNsYXNzPVwiY2FyZCBwLTUgbS00XCI+XHJcbiAgPGRpdiBjbGFzcz1cImFjY2Vzcy1kZW5pZWQgdGV4dC1jZW50ZXIgcHktMTBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhY2Nlc3MtZGVuaWVkLWljb24gbWItNFwiPjxpIGNsYXNzPVwiYmkgYmktc2hpZWxkLWxvY2tcIj48L2k+PC9kaXY+XHJcbiAgICA8aDMgY2xhc3M9XCJtYi0yXCI+QWNjZXNzIGRlbmllZDwvaDM+XHJcbiAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWQgbWItMFwiPlxyXG4gICAgICBZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGFjY2VzcyBMb29rcy4gQ29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3JcclxuICAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGFsbG93ZWQgdXNlcnMgbGlzdC5cclxuICAgIDwvcD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48c2VjdGlvbiBjbGFzcz1cImxvb2stZm9ybVwiICpuZ0lmPVwiYWNjZXNzQ2hlY2tlZCAmJiBhbGxvd2VkXCI+XHJcbiAgPCEtLSBUb3AgYmFyIChib3VuZCB0byB0aGUgb3V0ZXIgZm9ybSkgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTRcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPk5hbWUgKjwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuIE1hc3RlciBMb29rIFBsYW4gRlkyNlwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGZ3LWJvbGRcIj5EZXNjcmlwdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgZGVzY3JpcHRpb25cIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBmdy1ib2xkIGQtYmxvY2tcIj5BY3RpdmU8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0FjdGl2ZVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTIgdGV4dC1lbmRcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMlwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgW2Rpc2FibGVkXT1cInNhdmluZ1wiIChjbGljayk9XCJzYXZlKClcIj5cclxuICAgICAgICAgIHt7IHNhdmluZyA/ICdTYXZpbmfigKYnIDogJ1NhdmUnIH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gVGhyZWUtcGFuZSBlZGl0b3IgLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBteC0wIGctM1wiPlxyXG4gICAgPCEtLSBMZWZ0OiBMb29rcyBsaXN0IChubyBmb3JtIGJpbmRpbmcgbmVlZGVkIOKAlCBqdXN0IG5hdmlnYXRpb24pIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMyBoLTEwMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICAgIDxoNiBjbGFzcz1cIm0tMFwiPk1CUSBCdWNrZXQgLSBGaXh0dXJlIENvbWJpbmF0aW9uczwvaDY+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkTG9vaygpXCI+KyBBZGQgTG9vazwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJsb29rcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5ObyBsb29rcyB5ZXQuIEFkZCBvbmUgdG8gc3RhcnQuPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvb2tzLXRyZWVcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxvb2sgb2YgbG9va3MuY29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibG9vay1yb3cgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBweC0yIHB5LTIgbWItMSByb3VuZGVkXCJcclxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkTG9va0luZGV4ID09PSBpXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVja2V0Q29sb3IoJGFueShsb29rKSlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TG9vayhpKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidWNrZXQtZG90XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYnVja2V0Q29sb3IoJGFueShsb29rKSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+e3sgbG9va1RpdGxlKCRhbnkobG9vaykpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaXh0dXJlVHlwZUJhZGdlKCRhbnkobG9vaykpIGFzIGZ0YlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaXh0dXJlLXR5cGUtYmFkZ2VcIiBbbmdDbGFzc109XCJmdGIuY2xzXCI+e3sgZnRiLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9vay1yb3ctYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWFjdGlvbi1idG4gZHVwbGljYXRlXCIgdGl0bGU9XCJEdXBsaWNhdGUgbG9va1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBkdXBsaWNhdGVMb29rKGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLWZpbGVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicm93LWFjdGlvbi1idG4gcmVtb3ZlXCIgdGl0bGU9XCJSZW1vdmUgbG9va1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmVMb29rKGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJpIGJpLXRyYXNoM1wiPjwvaT5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBDZW50cmU6IHNlbGVjdGVkIExvb2sgbWV0YWRhdGEgKyBzbG90cyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMb29rR3JvdXAgYXMgbG9va0dyb3VwOyBlbHNlIG5vTG9va1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMyBoLTEwMFwiIFtmb3JtR3JvdXBdPVwibG9va0dyb3VwXCI+XHJcbiAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0zXCI+Rml4dHVyZSBDb21iaW5hdGlvbiBEZXRhaWxzPC9oNj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMiBtYi0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5NQlEgYnVja2V0PC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bGliLXNlYXJjaGFibGUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwibWJxQnVja2V0SXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgaWRGaWVsZD1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgIG5hbWVGaWVsZD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IE1CUSBidWNrZXRcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWJxQnVja2V0XCI+XHJcbiAgICAgICAgICAgICAgPC9saWItc2VhcmNoYWJsZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Rml4dHVyZSBjb3VudCAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBtYXg9XCIzMFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVDb3VudFwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkNBRCBIZWFkZXIgVmFyaWVudHM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxsaWItY2hpcHMtaW5wdXRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FkLWhlYWRlci12YXJpYW50cy1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjYWRIZWFkZXJWYXJpYW50c1wiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgYSB2YXJpYW50IGFuZCBwcmVzcyBFbnRlclwiPlxyXG4gICAgICAgICAgICAgIDwvbGliLWNoaXBzLWlucHV0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIFBvc2l0aW9uczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaXh0dXJlVHlwZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgaWRGaWVsZD1cImlkXCJcclxuICAgICAgICAgICAgICAgIG5hbWVGaWVsZD1cIm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZml4dHVyZSBwb3NpdGlvblwiXHJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlVHlwZVwiPlxyXG4gICAgICAgICAgICAgIDwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8aHIgLz5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm0tMFwiPkZpeHR1cmVzPC9oNj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodFwiIChjbGljayk9XCJhZGRTbG90KClcIj4rIEFkZCBGaXh0dXJlPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbG90cy1saXN0XCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2xvdCBvZiAoc2VsZWN0ZWRTbG90c0FycmF5Py5jb250cm9scyB8fCBbXSk7IGxldCBzID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzbG90LXJvdyBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIHB4LTIgcHktMiBtYi0xIHJvdW5kZWRcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZFNsb3RJbmRleCA9PT0gc1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFNsb3QocylcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1ib2xkIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgIEZpeHR1cmUge3sgJGFueShzbG90KS5nZXQoJ3Nsb3RJbmRleCcpPy52YWx1ZSB9fSDigJQge3sgJGFueShzbG90KS5nZXQoJ3Nsb3RUeXBlJyk/LnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAge3sgJGFueShzbG90KS5nZXQoJ2JyYW5kJyk/LnZhbHVlIHx8ICcobm8gYnJhbmQpJyB9fSDCt1xyXG4gICAgICAgICAgICAgICAgICB7eyAkYW55KHNsb3QpLmdldCgnZml4dHVyZUxldmVsWm9uZScpPy52YWx1ZSB8fCAnKG5vIHpvbmUpJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQtZGFuZ2VyIG1zLTJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmVTbG90KHMpXCI+w5c8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Mb29rPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtNSBoLTEwMCB0ZXh0LWNlbnRlciB0ZXh0LW11dGVkXCI+U2VsZWN0IG9yIGFkZCBhIExvb2sgdG8gZWRpdCBpdC48L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gUmlnaHQ6IHNlbGVjdGVkIHNsb3Qg4oCUIHBsYWNlbWVudHMgZWRpdG9yIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFNsb3RHcm91cCBhcyBzbG90R3JvdXA7IGVsc2Ugbm9TbG90XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0zIGgtMTAwXCIgW2Zvcm1Hcm91cF09XCJzbG90R3JvdXBcIj5cclxuICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTNcIj5GaXh0dXJlIHt7IHNlbGVjdGVkU2xvdEluZGV4ICsgMSB9fSAtIERlZmluaXRpb248L2g2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0yIG1iLTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGwgdGV4dC1tdXRlZFwiPlNsb3QgaW5kZXggKGF1dG8pPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbdmFsdWVdPVwic2VsZWN0ZWRTbG90SW5kZXggKyAxXCIgcmVhZG9ubHkgZGlzYWJsZWQgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIFR5cGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGZvcm1Db250cm9sTmFtZT1cInNsb3RUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHQgb2YgYXZhaWxhYmxlU2xvdFR5cGVzXCIgW3ZhbHVlXT1cIm9wdC5pZFwiPnt7IG9wdC5uYW1lIH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+QnJhbmQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJicmFuZEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgIGlkRmllbGQ9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBuYW1lRmllbGQ9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBicmFuZFwiXHJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJicmFuZFwiPlxyXG4gICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIEhlYWRlcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPGxpYi1zZWFyY2hhYmxlLXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpeHR1cmVIZWFkZXJJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICBpZEZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZml4dHVyZSBoZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZml4dHVyZUxldmVsWm9uZVwiPlxyXG4gICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5GaXh0dXJlIFRlbXBsYXRlczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZml4dHVyZS1saWJyYXJpZXMtc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaXh0dXJlTGlicmFyeUl0ZW1zRm9yU2xvdFwiXHJcbiAgICAgICAgICAgICAgICBpZEZpZWxkPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibmFtZVwiXHJcbiAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgc2VhcmNoRmllbGQ9XCJuYW1lXCJcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGZpeHR1cmUgdGVtcGxhdGVzXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpeHR1cmVMaWJyYXJ5UmVmc1wiPlxyXG4gICAgICAgICAgICAgIDwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgKm5nSWY9XCJzbG90R3JvdXAuZ2V0KCdzbG90VHlwZScpPy52YWx1ZSA9PT0gJ2V1cm9jZW50ZXInXCI+XHJcbiAgICAgICAgICAgICAgICBTaG93aW5nIGZsb29yIGZpeHR1cmVzIChldXJvY2VudGVyIHNsb3QpLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiICpuZ0lmPVwic2xvdEdyb3VwLmdldCgnc2xvdFR5cGUnKT8udmFsdWUgIT09ICdldXJvY2VudGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgU2hvd2luZyB3YWxsIGZpeHR1cmVzIChzaGVsZiBzbG90KS5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxociAvPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgPGg2IGNsYXNzPVwibS0wXCI+TG9vayBhbmQgVmlzdWFsIE1lcmNoYW5kaXNpbmcgUGxhY2VtZW50czwvaDY+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiAoY2xpY2spPVwiYWRkUGxhY2VtZW50KClcIj4rIEFkZCBwbGFjZW1lbnQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIihzZWxlY3RlZFBsYWNlbWVudHM/Lmxlbmd0aCB8fCAwKSA9PT0gMFwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtYi0yXCI+XHJcbiAgICAgICAgICAgIE5vIHBsYWNlbWVudHMgeWV0LiBDbGljayA8c3Ryb25nPisgQWRkIHBsYWNlbWVudDwvc3Ryb25nPiB0byBhZGQgb25lLlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGxhY2VtZW50cy1zY3JvbGxcIiBmb3JtQXJyYXlOYW1lPVwicGxhY2VtZW50c1wiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHAgb2YgKHNlbGVjdGVkUGxhY2VtZW50cz8uY29udHJvbHMgfHwgW10pOyBsZXQgcGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInBsYWNlbWVudC1yb3cgbWItMlwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwicGlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBnYXAtMiBwbGFjZW1lbnQtZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGgtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgZm9ybUNvbnRyb2xOYW1lPVwia2luZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwaWRcIj5Qcm9kdWN0IE1lcmNoYW5kaXNpbmc8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidm1cIj5WaXN1YWwgTWVyY2hhbmRpc2luZzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVmlzdWFsIE1lcmNoYW5kaXNpbmcgcm93czogVk0gVHlwZSAoc2luZ2xlKSArIFZNIEFydHdvcmsgKHNpbmdsZSkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiJGFueShwKS5nZXQoJ2tpbmQnKT8udmFsdWUgPT09ICd2bSc7IGVsc2UgcGlkSW5wdXRzXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ2bVR5cGVPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGlkRmllbGQ9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lRmllbGQ9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlZpc3VhbCBNZXJjaGFuZGlzaW5nIFR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicG9zaXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1zZWFyY2hhYmxlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJ2bUFydHdvcmtPcHRpb25zRm9yKCRhbnkocCkuZ2V0KCdwb3NpdGlvbicpPy52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgaWRGaWVsZD1cInZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWVGaWVsZD1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVmlzdWFsIE1lcmNoYW5kaXNpbmcgQXJ0d29ya1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyYXdWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUHJvZHVjdCBNZXJjaGFuZGlzaW5nIHJvd3M6IFRvcC9NaWQvQm90dG9tIHBvc2l0aW9uICsgbXVsdGktc2VsZWN0IHByb2R1Y3QvU0tVIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwaWRJbnB1dHM+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGZvcm1Db250cm9sTmFtZT1cInBvc2l0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+UG9zaXRpb248L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJUb3BcIj5Ub3A8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJNaWRcIj5NaWQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJCb3R0b21cIj5Cb3R0b208L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaC1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoYWJsZS1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJwcm9kdWN0T3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZEZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZUZpZWxkPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQcm9kdWN0IC8gU0tVXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJhd1ZhbHVlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGliLXNlYXJjaGFibGUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodC1kYW5nZXIgcGgtcmVtb3ZlXCIgKGNsaWNrKT1cInJlbW92ZVBsYWNlbWVudChwaSlcIj7DlzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNub1Nsb3Q+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC01IGgtMTAwIHRleHQtY2VudGVyIHRleHQtbXV0ZWRcIj5TZWxlY3QgYSBmaXh0dXJlIHNsb3QgdG8gZWRpdCBwbGFjZW1lbnRzLjwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gUGVyLXNsb3QgRml4dHVyZSBMaWJyYXJ5IENvbmZpZ3VyYXRpb24gY2FyZCAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRTbG90R3JvdXAgYXMgc2xvdEdyb3VwRm9yTWFwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbXQtNCBsaWJyYXJ5LWNvbmZpZy1jYXJkXCIgW2Zvcm1Hcm91cF09XCJzbG90R3JvdXBGb3JNYXBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICA8aDUgY2xhc3M9XCJmb3JtLWxhYmVsIGQtYmxvY2sgbWItM1wiPkZpeHR1cmUgbGlicmFyeTwvaDU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpYnJhcnktY2hpcHNcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxpYiBvZiBzZWxlY3RlZFNsb3RMaWJyYXJpZXNGb3JEcm9wZG93blwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImxpYnJhcnktY2hpcFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRMaWJyYXJ5SWRJbk1hcCA9PT0gbGliLmlkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTGlicmFyeU1hcFNlbGVjdChzZWxlY3RlZExpYnJhcnlJZEluTWFwID09PSBsaWIuaWQgPyAnJyA6IGxpYi5pZClcIj5cclxuICAgICAgICAgICAge3sgbGliLm5hbWUgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzbWFsbCAqbmdJZj1cInNlbGVjdGVkU2xvdExpYnJhcmllc0ZvckRyb3Bkb3duLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxyXG4gICAgICAgICAgTm8gbGlicmFyaWVzIGxpbmtlZCB0byB0aGlzIHNsb3QgeWV0LiBBZGQgc29tZSBpbiB0aGUgXCJGaXh0dXJlIGxpYnJhcmllc1wiIG11bHRpc2VsZWN0IGFib3ZlLlxyXG4gICAgICAgIDwvc21hbGw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImxvYWRpbmdMaWJyYXJ5RGV0YWlsc1wiIGNsYXNzPVwidGV4dC1tdXRlZFwiPkxvYWRpbmcgZml4dHVyZSBkZXRhaWxz4oCmPC9kaXY+XHJcblxyXG4gICAgICA8IS0tXHJcbiAgICAgICAgVXNlICpuZ0ZvciArIHRyYWNrQnkga2V5ZWQgb24gKGxvb2ssIHNsb3QsIGxpYnJhcnkpIHNvIEFuZ3VsYXIgdHJlYXRzXHJcbiAgICAgICAgYSBzd2l0Y2ggYXMgYSBuZXcgaXRlbSDigJQgdGhhdCBmb3JjZXMgdGhlIGVtYmVkZGVkIHRlbXBsYXRlLXByb2R1Y3RzXHJcbiAgICAgICAgLyB0ZW1wbGF0ZS12bXMgY29tcG9uZW50cyB0byByZW1vdW50IGFuZCByZXJ1biB0aGVpciBuZ09uSW5pdFxyXG4gICAgICAgIChvdGhlcndpc2UgdGhlaXIgYGlzUGFnZUxvYWRpbmdgIGd1YXJkIHNraXBzIHRoZSBmb3JtIHJlYnVpbGQpLlxyXG4gICAgICAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgXyBvZiBlbWJlZGRlZEhvc3RLZXlzOyB0cmFja0J5OiB0cmFja0J5RW1iZWRkZWRLZXlcIj5cclxuICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgbWItM1wiPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuYXYtbGlua1wiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJlbWJlZGRlZFRhYiA9PT0gJ3Byb2R1Y3RzJ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVtYmVkZGVkVGFiID0gJ3Byb2R1Y3RzJ1wiPlByb2R1Y3QgTWVyY2hhbmRpc2luZzwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmF2LWxpbmtcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZW1iZWRkZWRUYWIgPT09ICd2bXMnXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZW1iZWRkZWRUYWIgPSAndm1zJ1wiPlZpc3VhbCBNZXJjaGFuZGlzaW5nPC9idXR0b24+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJlbWJlZGRlZFRhYiA9PT0gJ3Byb2R1Y3RzJ1wiPlxyXG4gICAgICAgICAgPGxpYi10ZW1wbGF0ZS1wcm9kdWN0cyBbbG9va3NNb2RlXT1cInRydWVcIj48L2xpYi10ZW1wbGF0ZS1wcm9kdWN0cz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZW1iZWRkZWRUYWIgPT09ICd2bXMnXCI+XHJcbiAgICAgICAgICA8bGliLXRlbXBsYXRlLXZtcyBbbG9va3NNb2RlXT1cInRydWVcIj48L2xpYi10ZW1wbGF0ZS12bXM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvc2VjdGlvbj5cclxuIl19