tango-app-ui-store-builder 1.2.17 → 1.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/esm2022/lib/components/access-denied/access-denied.component.mjs +31 -0
  2. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +3 -3
  3. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +3 -3
  4. package/esm2022/lib/components/collection-update-ai/find-replace-layout/review-replace/review-replace.component.mjs +3 -3
  5. package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +3 -3
  6. package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +3 -3
  7. package/esm2022/lib/components/fixture-template-table/find-and-replace/find-and-replace.component.mjs +3 -3
  8. package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +25 -3
  9. package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +3 -3
  10. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +3 -3
  11. package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +3 -3
  12. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +9 -3
  13. package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +9 -3
  14. package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +133 -21
  15. package/esm2022/lib/components/plano-configurations/plano-configurations.component.mjs +8 -3
  16. package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +28 -5
  17. package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +3 -3
  18. package/esm2022/lib/components/plano-tools/delete-floor/delete-floor.component.mjs +3 -3
  19. package/esm2022/lib/components/plano-tools/layout-touchup/layout-touchup.component.mjs +3 -3
  20. package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +3 -3
  21. package/esm2022/lib/components/plano-tools/tool-page-header/tool-page-header.component.mjs +3 -3
  22. package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
  23. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +3 -3
  24. package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +3 -3
  25. package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +3 -3
  26. package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +3 -3
  27. package/esm2022/lib/components/popups/publish-plano-modal/publish-plano-modal.component.mjs +1 -1
  28. package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -3
  29. package/esm2022/lib/components/store-plano/store-plano.component.mjs +3 -3
  30. package/esm2022/lib/functions/feature-access.guard.mjs +20 -0
  31. package/esm2022/lib/functions/plano.function.mjs +22 -1
  32. package/esm2022/lib/services/store-builder.service.mjs +15 -3
  33. package/esm2022/lib/tango-store-builder-routing.module.mjs +11 -1
  34. package/esm2022/lib/tango-store-builder.module.mjs +5 -2
  35. package/fesm2022/tango-app-ui-store-builder.mjs +318 -61
  36. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  37. package/lib/components/access-denied/access-denied.component.d.ts +18 -0
  38. package/lib/components/fixture-template-table/fixture-template-table.component.d.ts +6 -0
  39. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +2 -2
  40. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +5 -5
  41. package/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.d.ts +1 -0
  42. package/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.d.ts +1 -0
  43. package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +8 -0
  44. package/lib/components/plano-library/fixture-library/fixture-library.component.d.ts +5 -1
  45. package/lib/functions/feature-access.guard.d.ts +9 -0
  46. package/lib/functions/plano.function.d.ts +9 -0
  47. package/lib/services/store-builder.service.d.ts +6 -0
  48. package/lib/tango-store-builder.module.d.ts +38 -37
  49. package/package.json +1 -1
@@ -244,10 +244,10 @@ export class DeleteFloorComponent {
244
244
  this.destroy$.complete();
245
245
  }
246
246
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DeleteFloorComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
247
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DeleteFloorComponent, selector: "lib-delete-floor", ngImport: i0, template: "<section class=\"delete-floor p-3\">\n <lib-tool-page-header\n title=\"Delete Floor\"\n description=\"Removes a floor and every row that references it \u2014 fixtures, shelves, task compliance, processed tasks, comments, and revisions. If this is the only floor, the entire planogram is removed. The store entry is never touched.\"\n ></lib-tool-page-header>\n <div class=\"card p-4\" style=\"max-width: 720px;\">\n\n <!-- Store -->\n <div class=\"mb-3\">\n <lib-reactive-select\n label=\"Store\"\n [idField]=\"'storeId'\"\n [nameField]=\"'storeName'\"\n [data]=\"storeOptions\"\n [search]=\"true\"\n [ngModel]=\"selectedStoreId\"\n (ngModelChange)=\"onStoreSelected($event)\">\n </lib-reactive-select>\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\n </div>\n\n <!-- Floor -->\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\n <div class=\"text-muted small\">Loading floors...</div>\n </ng-container>\n <ng-template #floorPicker>\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\n <lib-reactive-select\n label=\"Floor\"\n [idField]=\"'_id'\"\n [nameField]=\"'displayName'\"\n [data]=\"floors\"\n [search]=\"true\"\n [ngModel]=\"selectedFloorId\"\n (ngModelChange)=\"onFloorSelected($event)\">\n </lib-reactive-select>\n </ng-container>\n <ng-template #noFloors>\n <div class=\"text-muted small\">No floors found for this store.</div>\n </ng-template>\n </ng-template>\n </div>\n\n <!-- Status + cascade preview -->\n <ng-container *ngIf=\"selectedFloorId\">\n <ng-container *ngIf=\"isLoadingImpact; else impactBlock\">\n <div class=\"text-muted small\">Loading floor details...</div>\n </ng-container>\n <ng-template #impactBlock>\n <ng-container *ngIf=\"impact\">\n <div class=\"mb-3 p-3 rounded info-block\">\n <div class=\"row gx-3 gy-2 small\">\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Floor status</span>\n <span class=\"fw-semibold\">{{ formatStatus(impact.floor.status) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Planogram status</span>\n <span class=\"fw-semibold\">{{ formatStatus(impact.planogram.status) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Plano approved</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.isPlanoApproved) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Verification done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.verificationStatus) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Merch rollout done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.merchRolloutStatus) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">VM rollout done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.vmRolloutStatus) }}</span>\n </div>\n <div class=\"col-12\">\n <span class=\"text-muted d-block\">Total floors in this planogram</span>\n <span class=\"fw-semibold\">{{ impact.totalFloors }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 p-3 rounded cascade-block\">\n <div class=\"fw-semibold mb-2\">Will delete</div>\n <ul class=\"small mb-0 ps-3\">\n <li>1 floor (storelayouts)</li>\n <li>{{ impact.cascade.storefixtures }} fixture(s) (storefixtures)</li>\n <li>{{ impact.cascade.fixtureshelves }} shelf row(s) (fixtureshelves)</li>\n <li>{{ impact.cascade.planotaskcompliances }} task compliance row(s) (planotaskcompliances)</li>\n <li>{{ impact.cascade.processedtasks }} processed task(s) (processedtasks)</li>\n <li>{{ impact.cascade.planoglobalcomments }} global comment(s) (planoglobalcomments)</li>\n <li>{{ impact.cascade.planorevisions }} revision(s) (planorevisions)</li>\n </ul>\n <div class=\"text-muted small mt-2\">Total downstream rows: {{ totalCascadeRows }}</div>\n </div>\n\n <div class=\"alert alert-warning small\" *ngIf=\"impact.isLastFloor\">\n <strong>This is the only floor in this planogram.</strong>\n Deleting it will also remove the planogram entry \u2014 the plano will\n disappear completely. The store record itself will NOT be deleted.\n </div>\n </ng-container>\n </ng-template>\n </ng-container>\n\n <!-- Submit -->\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\n {{ isSubmitting ? 'Deleting...' : 'Delete Floor' }}\n </button>\n\n <div class=\"mt-3 alert\" *ngIf=\"message\"\n [class.alert-success]=\"messageType === 'success'\"\n [class.alert-danger]=\"messageType === 'error'\"\n style=\"white-space: pre-line;\">\n {{ message }}\n </div>\n </div>\n</section>\n", styles: [".delete-floor .info-block{background-color:#f9fafb;border:1px solid #e4e7ec}.delete-floor .cascade-block{background-color:#fff7ed;border:1px solid #fed7aa}\n"], dependencies: [{ kind: "component", type: i4.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel", "disabled"], outputs: ["actionClick"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.ToolPageHeaderComponent, selector: "lib-tool-page-header", inputs: ["title", "description", "backLink"] }] });
247
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DeleteFloorComponent, selector: "lib-delete-floor", ngImport: i0, template: "<section class=\"delete-floor p-3\">\r\n <lib-tool-page-header\r\n title=\"Delete Floor\"\r\n description=\"Removes a floor and every row that references it \u2014 fixtures, shelves, task compliance, processed tasks, comments, and revisions. If this is the only floor, the entire planogram is removed. The store entry is never touched.\"\r\n ></lib-tool-page-header>\r\n <div class=\"card p-4\" style=\"max-width: 720px;\">\r\n\r\n <!-- Store -->\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'storeId'\"\r\n [nameField]=\"'storeName'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStoreId\"\r\n (ngModelChange)=\"onStoreSelected($event)\">\r\n </lib-reactive-select>\r\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\r\n </div>\r\n\r\n <!-- Floor -->\r\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\r\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\r\n <div class=\"text-muted small\">Loading floors...</div>\r\n </ng-container>\r\n <ng-template #floorPicker>\r\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\r\n <lib-reactive-select\r\n label=\"Floor\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [data]=\"floors\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedFloorId\"\r\n (ngModelChange)=\"onFloorSelected($event)\">\r\n </lib-reactive-select>\r\n </ng-container>\r\n <ng-template #noFloors>\r\n <div class=\"text-muted small\">No floors found for this store.</div>\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Status + cascade preview -->\r\n <ng-container *ngIf=\"selectedFloorId\">\r\n <ng-container *ngIf=\"isLoadingImpact; else impactBlock\">\r\n <div class=\"text-muted small\">Loading floor details...</div>\r\n </ng-container>\r\n <ng-template #impactBlock>\r\n <ng-container *ngIf=\"impact\">\r\n <div class=\"mb-3 p-3 rounded info-block\">\r\n <div class=\"row gx-3 gy-2 small\">\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Floor status</span>\r\n <span class=\"fw-semibold\">{{ formatStatus(impact.floor.status) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Planogram status</span>\r\n <span class=\"fw-semibold\">{{ formatStatus(impact.planogram.status) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Plano approved</span>\r\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.isPlanoApproved) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Verification done</span>\r\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.verificationStatus) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Merch rollout done</span>\r\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.merchRolloutStatus) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">VM rollout done</span>\r\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.vmRolloutStatus) }}</span>\r\n </div>\r\n <div class=\"col-12\">\r\n <span class=\"text-muted d-block\">Total floors in this planogram</span>\r\n <span class=\"fw-semibold\">{{ impact.totalFloors }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 p-3 rounded cascade-block\">\r\n <div class=\"fw-semibold mb-2\">Will delete</div>\r\n <ul class=\"small mb-0 ps-3\">\r\n <li>1 floor (storelayouts)</li>\r\n <li>{{ impact.cascade.storefixtures }} fixture(s) (storefixtures)</li>\r\n <li>{{ impact.cascade.fixtureshelves }} shelf row(s) (fixtureshelves)</li>\r\n <li>{{ impact.cascade.planotaskcompliances }} task compliance row(s) (planotaskcompliances)</li>\r\n <li>{{ impact.cascade.processedtasks }} processed task(s) (processedtasks)</li>\r\n <li>{{ impact.cascade.planoglobalcomments }} global comment(s) (planoglobalcomments)</li>\r\n <li>{{ impact.cascade.planorevisions }} revision(s) (planorevisions)</li>\r\n </ul>\r\n <div class=\"text-muted small mt-2\">Total downstream rows: {{ totalCascadeRows }}</div>\r\n </div>\r\n\r\n <div class=\"alert alert-warning small\" *ngIf=\"impact.isLastFloor\">\r\n <strong>This is the only floor in this planogram.</strong>\r\n Deleting it will also remove the planogram entry \u2014 the plano will\r\n disappear completely. The store record itself will NOT be deleted.\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Submit -->\r\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\r\n {{ isSubmitting ? 'Deleting...' : 'Delete Floor' }}\r\n </button>\r\n\r\n <div class=\"mt-3 alert\" *ngIf=\"message\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\"\r\n style=\"white-space: pre-line;\">\r\n {{ message }}\r\n </div>\r\n </div>\r\n</section>\r\n", styles: [".delete-floor .info-block{background-color:#f9fafb;border:1px solid #e4e7ec}.delete-floor .cascade-block{background-color:#fff7ed;border:1px solid #fed7aa}\n"], dependencies: [{ kind: "component", type: i4.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel", "disabled"], outputs: ["actionClick"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.ToolPageHeaderComponent, selector: "lib-tool-page-header", inputs: ["title", "description", "backLink"] }] });
248
248
  }
249
249
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DeleteFloorComponent, decorators: [{
250
250
  type: Component,
251
- args: [{ selector: "lib-delete-floor", template: "<section class=\"delete-floor p-3\">\n <lib-tool-page-header\n title=\"Delete Floor\"\n description=\"Removes a floor and every row that references it \u2014 fixtures, shelves, task compliance, processed tasks, comments, and revisions. If this is the only floor, the entire planogram is removed. The store entry is never touched.\"\n ></lib-tool-page-header>\n <div class=\"card p-4\" style=\"max-width: 720px;\">\n\n <!-- Store -->\n <div class=\"mb-3\">\n <lib-reactive-select\n label=\"Store\"\n [idField]=\"'storeId'\"\n [nameField]=\"'storeName'\"\n [data]=\"storeOptions\"\n [search]=\"true\"\n [ngModel]=\"selectedStoreId\"\n (ngModelChange)=\"onStoreSelected($event)\">\n </lib-reactive-select>\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\n </div>\n\n <!-- Floor -->\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\n <div class=\"text-muted small\">Loading floors...</div>\n </ng-container>\n <ng-template #floorPicker>\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\n <lib-reactive-select\n label=\"Floor\"\n [idField]=\"'_id'\"\n [nameField]=\"'displayName'\"\n [data]=\"floors\"\n [search]=\"true\"\n [ngModel]=\"selectedFloorId\"\n (ngModelChange)=\"onFloorSelected($event)\">\n </lib-reactive-select>\n </ng-container>\n <ng-template #noFloors>\n <div class=\"text-muted small\">No floors found for this store.</div>\n </ng-template>\n </ng-template>\n </div>\n\n <!-- Status + cascade preview -->\n <ng-container *ngIf=\"selectedFloorId\">\n <ng-container *ngIf=\"isLoadingImpact; else impactBlock\">\n <div class=\"text-muted small\">Loading floor details...</div>\n </ng-container>\n <ng-template #impactBlock>\n <ng-container *ngIf=\"impact\">\n <div class=\"mb-3 p-3 rounded info-block\">\n <div class=\"row gx-3 gy-2 small\">\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Floor status</span>\n <span class=\"fw-semibold\">{{ formatStatus(impact.floor.status) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Planogram status</span>\n <span class=\"fw-semibold\">{{ formatStatus(impact.planogram.status) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Plano approved</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.isPlanoApproved) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Verification done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.verificationStatus) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">Merch rollout done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.merchRolloutStatus) }}</span>\n </div>\n <div class=\"col-6\">\n <span class=\"text-muted d-block\">VM rollout done</span>\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.vmRolloutStatus) }}</span>\n </div>\n <div class=\"col-12\">\n <span class=\"text-muted d-block\">Total floors in this planogram</span>\n <span class=\"fw-semibold\">{{ impact.totalFloors }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3 p-3 rounded cascade-block\">\n <div class=\"fw-semibold mb-2\">Will delete</div>\n <ul class=\"small mb-0 ps-3\">\n <li>1 floor (storelayouts)</li>\n <li>{{ impact.cascade.storefixtures }} fixture(s) (storefixtures)</li>\n <li>{{ impact.cascade.fixtureshelves }} shelf row(s) (fixtureshelves)</li>\n <li>{{ impact.cascade.planotaskcompliances }} task compliance row(s) (planotaskcompliances)</li>\n <li>{{ impact.cascade.processedtasks }} processed task(s) (processedtasks)</li>\n <li>{{ impact.cascade.planoglobalcomments }} global comment(s) (planoglobalcomments)</li>\n <li>{{ impact.cascade.planorevisions }} revision(s) (planorevisions)</li>\n </ul>\n <div class=\"text-muted small mt-2\">Total downstream rows: {{ totalCascadeRows }}</div>\n </div>\n\n <div class=\"alert alert-warning small\" *ngIf=\"impact.isLastFloor\">\n <strong>This is the only floor in this planogram.</strong>\n Deleting it will also remove the planogram entry \u2014 the plano will\n disappear completely. The store record itself will NOT be deleted.\n </div>\n </ng-container>\n </ng-template>\n </ng-container>\n\n <!-- Submit -->\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\n {{ isSubmitting ? 'Deleting...' : 'Delete Floor' }}\n </button>\n\n <div class=\"mt-3 alert\" *ngIf=\"message\"\n [class.alert-success]=\"messageType === 'success'\"\n [class.alert-danger]=\"messageType === 'error'\"\n style=\"white-space: pre-line;\">\n {{ message }}\n </div>\n </div>\n</section>\n", styles: [".delete-floor .info-block{background-color:#f9fafb;border:1px solid #e4e7ec}.delete-floor .cascade-block{background-color:#fff7ed;border:1px solid #fed7aa}\n"] }]
251
+ args: [{ selector: "lib-delete-floor", template: "<section class=\"delete-floor p-3\">\r\n <lib-tool-page-header\r\n title=\"Delete Floor\"\r\n description=\"Removes a floor and every row that references it \u2014 fixtures, shelves, task compliance, processed tasks, comments, and revisions. If this is the only floor, the entire planogram is removed. The store entry is never touched.\"\r\n ></lib-tool-page-header>\r\n <div class=\"card p-4\" style=\"max-width: 720px;\">\r\n\r\n <!-- Store -->\r\n <div class=\"mb-3\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'storeId'\"\r\n [nameField]=\"'storeName'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStoreId\"\r\n (ngModelChange)=\"onStoreSelected($event)\">\r\n </lib-reactive-select>\r\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\r\n </div>\r\n\r\n <!-- Floor -->\r\n <div class=\"mb-3\" *ngIf=\"selectedStoreId\">\r\n <ng-container *ngIf=\"isLoadingFloors; else floorPicker\">\r\n <div class=\"text-muted small\">Loading floors...</div>\r\n </ng-container>\r\n <ng-template #floorPicker>\r\n <ng-container *ngIf=\"floors.length > 0; else noFloors\">\r\n <lib-reactive-select\r\n label=\"Floor\"\r\n [idField]=\"'_id'\"\r\n [nameField]=\"'displayName'\"\r\n [data]=\"floors\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedFloorId\"\r\n (ngModelChange)=\"onFloorSelected($event)\">\r\n </lib-reactive-select>\r\n </ng-container>\r\n <ng-template #noFloors>\r\n <div class=\"text-muted small\">No floors found for this store.</div>\r\n </ng-template>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Status + cascade preview -->\r\n <ng-container *ngIf=\"selectedFloorId\">\r\n <ng-container *ngIf=\"isLoadingImpact; else impactBlock\">\r\n <div class=\"text-muted small\">Loading floor details...</div>\r\n </ng-container>\r\n <ng-template #impactBlock>\r\n <ng-container *ngIf=\"impact\">\r\n <div class=\"mb-3 p-3 rounded info-block\">\r\n <div class=\"row gx-3 gy-2 small\">\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Floor status</span>\r\n <span class=\"fw-semibold\">{{ formatStatus(impact.floor.status) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Planogram status</span>\r\n <span class=\"fw-semibold\">{{ formatStatus(impact.planogram.status) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Plano approved</span>\r\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.isPlanoApproved) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Verification done</span>\r\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.verificationStatus) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">Merch rollout done</span>\r\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.merchRolloutStatus) }}</span>\r\n </div>\r\n <div class=\"col-6\">\r\n <span class=\"text-muted d-block\">VM rollout done</span>\r\n <span class=\"fw-semibold\">{{ formatBool(impact.floor.vmRolloutStatus) }}</span>\r\n </div>\r\n <div class=\"col-12\">\r\n <span class=\"text-muted d-block\">Total floors in this planogram</span>\r\n <span class=\"fw-semibold\">{{ impact.totalFloors }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3 p-3 rounded cascade-block\">\r\n <div class=\"fw-semibold mb-2\">Will delete</div>\r\n <ul class=\"small mb-0 ps-3\">\r\n <li>1 floor (storelayouts)</li>\r\n <li>{{ impact.cascade.storefixtures }} fixture(s) (storefixtures)</li>\r\n <li>{{ impact.cascade.fixtureshelves }} shelf row(s) (fixtureshelves)</li>\r\n <li>{{ impact.cascade.planotaskcompliances }} task compliance row(s) (planotaskcompliances)</li>\r\n <li>{{ impact.cascade.processedtasks }} processed task(s) (processedtasks)</li>\r\n <li>{{ impact.cascade.planoglobalcomments }} global comment(s) (planoglobalcomments)</li>\r\n <li>{{ impact.cascade.planorevisions }} revision(s) (planorevisions)</li>\r\n </ul>\r\n <div class=\"text-muted small mt-2\">Total downstream rows: {{ totalCascadeRows }}</div>\r\n </div>\r\n\r\n <div class=\"alert alert-warning small\" *ngIf=\"impact.isLastFloor\">\r\n <strong>This is the only floor in this planogram.</strong>\r\n Deleting it will also remove the planogram entry \u2014 the plano will\r\n disappear completely. The store record itself will NOT be deleted.\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- Submit -->\r\n <button class=\"btn btn-danger\" (click)=\"onSubmit()\" [disabled]=\"!canSubmit\">\r\n {{ isSubmitting ? 'Deleting...' : 'Delete Floor' }}\r\n </button>\r\n\r\n <div class=\"mt-3 alert\" *ngIf=\"message\"\r\n [class.alert-success]=\"messageType === 'success'\"\r\n [class.alert-danger]=\"messageType === 'error'\"\r\n style=\"white-space: pre-line;\">\r\n {{ message }}\r\n </div>\r\n </div>\r\n</section>\r\n", styles: [".delete-floor .info-block{background-color:#f9fafb;border:1px solid #e4e7ec}.delete-floor .cascade-block{background-color:#fff7ed;border:1px solid #fed7aa}\n"] }]
252
252
  }], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i3.NgbModal }] });
253
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWZsb29yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5vLXRvb2xzL2RlbGV0ZS1mbG9vci9kZWxldGUtZmxvb3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvZGVsZXRlLWZsb29yL2RlbGV0ZS1mbG9vci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sT0FBTyxFQUNQLFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdFQUFnRSxDQUFDOzs7Ozs7Ozs7QUFtRDdHLE1BQU0sT0FBTyxvQkFBb0I7SUFzQnJCO0lBQ0E7SUFDQTtJQXZCVixRQUFRLENBQVM7SUFFakIsWUFBWSxHQUFrQixFQUFFLENBQUM7SUFDakMsZUFBZSxHQUFrQixJQUFJLENBQUM7SUFDdEMsaUJBQWlCLEdBQWtCLElBQUksQ0FBQztJQUN4QyxlQUFlLEdBQVksS0FBSyxDQUFDO0lBRWpDLE1BQU0sR0FBa0IsRUFBRSxDQUFDO0lBQzNCLGVBQWUsR0FBa0IsSUFBSSxDQUFDO0lBQ3RDLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFFakMsTUFBTSxHQUF1QixJQUFJLENBQUM7SUFDbEMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUVqQyxZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLE9BQU8sR0FBVyxFQUFFLENBQUM7SUFDckIsV0FBVyxHQUF3QixTQUFTLENBQUM7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QU8sR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTNSVSxvQkFBb0I7NEZBQXBCLG9CQUFvQix3REM5RGpDLGkvS0F3SEE7OzRGRDFEYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBTdWJqZWN0LFxuICB0YWtlVW50aWwsXG59IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9wb3B1cHMvZGVsZXRlLWNvbmZpcm1hdGlvbi9kZWxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudFwiO1xuXG5pbnRlcmZhY2UgU3RvcmVPcHRpb24ge1xuICBzdG9yZUlkOiBzdHJpbmc7XG4gIHN0b3JlTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRmxvb3JPcHRpb24ge1xuICBfaWQ6IHN0cmluZztcbiAgZmxvb3JOdW1iZXI6IG51bWJlcjtcbiAgZmxvb3JOYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBGbG9vckltcGFjdCB7XG4gIGZsb29yOiB7XG4gICAgX2lkOiBzdHJpbmc7XG4gICAgZmxvb3JOdW1iZXI6IG51bWJlcjtcbiAgICBmbG9vck5hbWU6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBpc1BsYW5vQXBwcm92ZWQ/OiBib29sZWFuO1xuICAgIHZlcmlmaWNhdGlvblN0YXR1cz86IGJvb2xlYW47XG4gICAgbWVyY2hSb2xsb3V0U3RhdHVzPzogYm9vbGVhbjtcbiAgICB2bVJvbGxvdXRTdGF0dXM/OiBib29sZWFuO1xuICAgIHBsYW5vUHJvZ3Jlc3M/OiBudW1iZXI7XG4gIH07XG4gIHBsYW5vZ3JhbToge1xuICAgIF9pZDogc3RyaW5nO1xuICAgIHN0b3JlTmFtZTogc3RyaW5nO1xuICAgIHN0b3JlSWQ6IHN0cmluZztcbiAgICBzdGF0dXM/OiBzdHJpbmc7XG4gICAgbGF5b3V0TmFtZT86IHN0cmluZztcbiAgfTtcbiAgdG90YWxGbG9vcnM6IG51bWJlcjtcbiAgaXNMYXN0Rmxvb3I6IGJvb2xlYW47XG4gIHdpbGxEZWxldGVQbGFub2dyYW06IGJvb2xlYW47XG4gIGNhc2NhZGU6IHtcbiAgICBzdG9yZWZpeHR1cmVzOiBudW1iZXI7XG4gICAgZml4dHVyZXNoZWx2ZXM6IG51bWJlcjtcbiAgICBwbGFub3Rhc2tjb21wbGlhbmNlczogbnVtYmVyO1xuICAgIHByb2Nlc3NlZHRhc2tzOiBudW1iZXI7XG4gICAgcGxhbm9nbG9iYWxjb21tZW50czogbnVtYmVyO1xuICAgIHBsYW5vcmV2aXNpb25zOiBudW1iZXI7XG4gIH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJsaWItZGVsZXRlLWZsb29yXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vZGVsZXRlLWZsb29yLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsOiBcIi4vZGVsZXRlLWZsb29yLmNvbXBvbmVudC5zY3NzXCIsXG59KVxuZXhwb3J0IGNsYXNzIERlbGV0ZUZsb29yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBjbGllbnRJZDogc3RyaW5nO1xuXG4gIHN0b3JlT3B0aW9uczogU3RvcmVPcHRpb25bXSA9IFtdO1xuICBzZWxlY3RlZFN0b3JlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzZWxlY3RlZFN0b3JlTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlzTG9hZGluZ1N0b3JlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGZsb29yczogRmxvb3JPcHRpb25bXSA9IFtdO1xuICBzZWxlY3RlZEZsb29ySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBpc0xvYWRpbmdGbG9vcnM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBpbXBhY3Q6IEZsb29ySW1wYWN0IHwgbnVsbCA9IG51bGw7XG4gIGlzTG9hZGluZ0ltcGFjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzU3VibWl0dGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBtZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xuICBtZXNzYWdlVHlwZTogXCJzdWNjZXNzXCIgfCBcImVycm9yXCIgPSBcInN1Y2Nlc3NcIjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNiczogU3RvcmVCdWlsZGVyU2VydmljZSxcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICAgIGZpbHRlcigoZGF0YSkgPT4gISFkYXRhKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZGF0YT8uY2xpZW50KSB7XG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGEuY2xpZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGhlYWRlckRhdGEgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNsaWVudElkID0gaGVhZGVyRGF0YT8uY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRBbGwoKTtcbiAgICAgICAgdGhpcy5sb2FkU3RvcmVzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGxvYWRTdG9yZXMoKSB7XG4gICAgaWYgKCF0aGlzLmNsaWVudElkKSByZXR1cm47XG4gICAgdGhpcy5pc0xvYWRpbmdTdG9yZXMgPSB0cnVlO1xuICAgIHRoaXMuc2JzLmdldEFsbFN0b3Jlcyh0aGlzLmNsaWVudElkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmVPcHRpb25zID0gKHJlcz8uZGF0YSB8fCBbXSkubWFwKChzOiBhbnkpID0+ICh7XG4gICAgICAgICAgc3RvcmVJZDogcy5zdG9yZUlkLFxuICAgICAgICAgIHN0b3JlTmFtZTogcy5zdG9yZU5hbWUsXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdTdG9yZXMgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXG4gICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBsb2FkIHN0b3Jlcy5cIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nU3RvcmVzID0gZmFsc2U7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25TdG9yZVNlbGVjdGVkKHN0b3JlSWQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVJZCA9IHN0b3JlSWQ7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlT3B0aW9ucy5maW5kKChzKSA9PiBzLnN0b3JlSWQgPT09IHN0b3JlSWQpO1xuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZU5hbWUgPSBzdG9yZT8uc3RvcmVOYW1lID8/IG51bGw7XG4gICAgdGhpcy5yZXNldEZsb29yU3RhdGUoKTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFN0b3JlSWQpIHtcbiAgICAgIHRoaXMubG9hZEZsb29ycygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGbG9vclN0YXRlKCkge1xuICAgIHRoaXMuZmxvb3JzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZEZsb29ySWQgPSBudWxsO1xuICAgIHRoaXMuaW1wYWN0ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRBbGwoKSB7XG4gICAgdGhpcy5zdG9yZU9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVJZCA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlTmFtZSA9IG51bGw7XG4gICAgdGhpcy5yZXNldEZsb29yU3RhdGUoKTtcbiAgfVxuXG4gIGxvYWRGbG9vcnMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkU3RvcmVJZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNMb2FkaW5nRmxvb3JzID0gdHJ1ZTtcbiAgICB0aGlzLnNicy5nZXRTdG9yZUZsb29yc0xpc3QodGhpcy5zZWxlY3RlZFN0b3JlSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmF3OiBhbnlbXSA9IHJlcz8uZGF0YSB8fCBbXTtcbiAgICAgICAgdGhpcy5mbG9vcnMgPSByYXdcbiAgICAgICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICAgICAgX2lkOiBmLl9pZCxcbiAgICAgICAgICAgIGZsb29yTnVtYmVyOiBmLmZsb29yTnVtYmVyLFxuICAgICAgICAgICAgZmxvb3JOYW1lOiBmLmZsb29yTmFtZSxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBgRmxvb3IgJHtmLmZsb29yTnVtYmVyfSDigJQgJHtmLmZsb29yTmFtZX1gLFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmZsb29yTnVtYmVyIC0gYi5mbG9vck51bWJlcik7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nRmxvb3JzID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxuICAgICAgICAgIGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgXCJGYWlsZWQgdG8gbG9hZCBmbG9vcnMuXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTG9hZGluZ0Zsb29ycyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRmxvb3JTZWxlY3RlZChmbG9vcklkOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZsb29ySWQgPSBmbG9vcklkO1xuICAgIHRoaXMuaW1wYWN0ID0gbnVsbDtcbiAgICBpZiAoZmxvb3JJZCkge1xuICAgICAgdGhpcy5sb2FkSW1wYWN0KGZsb29ySWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9hZEltcGFjdChmbG9vcklkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmlzTG9hZGluZ0ltcGFjdCA9IHRydWU7XG4gICAgdGhpcy5zYnMuZ2V0Rmxvb3JEZWxldGVJbXBhY3QoeyBmbG9vcklkIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pbXBhY3QgPSByZXM/LmRhdGEgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdJbXBhY3QgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXG4gICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBsb2FkIGZsb29yIGRldGFpbHMuXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmlzTG9hZGluZ0ltcGFjdCA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGZvcm1hdFN0YXR1cyhzdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiBzdHJpbmcge1xuICAgIGlmICghc3RhdHVzKSByZXR1cm4gXCItLVwiO1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGRyYWZ0OiBcIkRyYWZ0XCIsXG4gICAgICBhbGxvY2F0aW9uUGVuZGluZzogXCJBbGxvY2F0aW9uIFBlbmRpbmdcIixcbiAgICAgIGNvbXBsZXRlZDogXCJDb21wbGV0ZWRcIixcbiAgICB9O1xuICAgIHJldHVybiBtYXBbc3RhdHVzXSB8fCBzdGF0dXM7XG4gIH1cblxuICBmb3JtYXRCb29sKHY6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiB2ID8gXCJZZXNcIiA6IFwiTm9cIjtcbiAgfVxuXG4gIGdldCB0b3RhbENhc2NhZGVSb3dzKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmltcGFjdCkgcmV0dXJuIDA7XG4gICAgY29uc3QgYyA9IHRoaXMuaW1wYWN0LmNhc2NhZGU7XG4gICAgcmV0dXJuIChcbiAgICAgIGMuc3RvcmVmaXh0dXJlcyArXG4gICAgICBjLmZpeHR1cmVzaGVsdmVzICtcbiAgICAgIGMucGxhbm90YXNrY29tcGxpYW5jZXMgK1xuICAgICAgYy5wcm9jZXNzZWR0YXNrcyArXG4gICAgICBjLnBsYW5vZ2xvYmFsY29tbWVudHMgK1xuICAgICAgYy5wbGFub3JldmlzaW9uc1xuICAgICk7XG4gIH1cblxuICBnZXQgY2FuU3VibWl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMuc2VsZWN0ZWRGbG9vcklkICYmXG4gICAgICAhIXRoaXMuaW1wYWN0ICYmXG4gICAgICAhdGhpcy5pc1N1Ym1pdHRpbmcgJiZcbiAgICAgICF0aGlzLmlzTG9hZGluZ0ltcGFjdFxuICAgICk7XG4gIH1cblxuICBhc3luYyBvblN1Ym1pdCgpIHtcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0IHx8ICF0aGlzLmltcGFjdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXNMYXN0ID0gdGhpcy5pbXBhY3QuaXNMYXN0Rmxvb3I7XG4gICAgY29uc3QgZmxvb3IgPSB0aGlzLmltcGFjdC5mbG9vcjtcbiAgICBjb25zdCBwbGFubyA9IHRoaXMuaW1wYWN0LnBsYW5vZ3JhbTtcbiAgICBjb25zdCBjID0gdGhpcy5pbXBhY3QuY2FzY2FkZTtcblxuICAgIGNvbnN0IHN1bW1hcnk6IHN0cmluZ1tdID0gW107XG4gICAgc3VtbWFyeS5wdXNoKGBTdG9yZTogJHtwbGFuby5zdG9yZU5hbWUgPz8gXCItLVwifWApO1xuICAgIHN1bW1hcnkucHVzaChcbiAgICAgIGBGbG9vciAke2Zsb29yLmZsb29yTnVtYmVyfSDigJQgJHtmbG9vci5mbG9vck5hbWV9IFske3RoaXMuZm9ybWF0U3RhdHVzKGZsb29yLnN0YXR1cyl9XWAsXG4gICAgKTtcbiAgICBzdW1tYXJ5LnB1c2goXG4gICAgICBgQ2FzY2FkZTogJHtjLnN0b3JlZml4dHVyZXN9IGZpeHR1cmVzLCAke2MuZml4dHVyZXNoZWx2ZXN9IHNoZWx2ZXMsICR7Yy5wbGFub3Rhc2tjb21wbGlhbmNlc30gY29tcGxpYW5jZSwgJHtjLnByb2Nlc3NlZHRhc2tzfSB0YXNrKHMpLCAke2MucGxhbm9nbG9iYWxjb21tZW50c30gY29tbWVudChzKSwgJHtjLnBsYW5vcmV2aXNpb25zfSByZXZpc2lvbihzKWAsXG4gICAgKTtcbiAgICBpZiAoaXNMYXN0KSB7XG4gICAgICBzdW1tYXJ5LnB1c2goXG4gICAgICAgIFwiVGhpcyBpcyB0aGUgT05MWSBmbG9vciBpbiB0aGlzIHBsYW5vZ3JhbS4gRGVsZXRpbmcgaXQgd2lsbCBSRU1PVkUgVEhFIEVOVElSRSBQTEFOT0dSQU0uIFRoZSBzdG9yZSBlbnRyeSBpdHNlbGYgd2lsbCBub3QgYmUgdG91Y2hlZC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHN1bW1hcnkucHVzaChcIlRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuXCIpO1xuXG4gICAgY29uc3QgZmlyc3RUaXRsZSA9IGlzTGFzdFxuICAgICAgPyBcIkRlbGV0ZSBwbGFub2dyYW0gZW50aXJlbHk/XCJcbiAgICAgIDogXCJEZWxldGUgdGhpcyBmbG9vcj9cIjtcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmNvbmZpcm0oZmlyc3RUaXRsZSwgc3VtbWFyeS5qb2luKFwiXFxuXCIpKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuXG4gICAgaWYgKGlzTGFzdCkge1xuICAgICAgY29uc3QgZG91YmxlQ29uZmlybWVkID0gYXdhaXQgdGhpcy5jb25maXJtKFxuICAgICAgICBcIkZpbmFsIGNvbmZpcm1hdGlvblwiLFxuICAgICAgICBgWW91IGFyZSBhYm91dCB0byBwZXJtYW5lbnRseSBkZWxldGUgdGhlIHBsYW5vZ3JhbSBmb3IgXCIke3BsYW5vLnN0b3JlTmFtZX1cIi4gVGhpcyB3aXBlcyB0aGUgZmxvb3IgYW5kIHRoZSBwbGFub2dyYW0gbWV0YWRhdGEuIFRoZSBzdG9yZSBpcyBwcmVzZXJ2ZWQuIFByb2NlZWQ/YCxcbiAgICAgICk7XG4gICAgICBpZiAoIWRvdWJsZUNvbmZpcm1lZCkgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNic1xuICAgICAgLmRlbGV0ZUZsb29yQ2FzY2FkZSh7XG4gICAgICAgIGZsb29ySWQ6IHRoaXMuc2VsZWN0ZWRGbG9vcklkISxcbiAgICAgICAgY29uZmlybUxhc3RGbG9vcjogaXNMYXN0LFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhIHx8IHt9O1xuICAgICAgICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGlmIChkYXRhLnBsYW5vZ3JhbURlbGV0ZWQpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goXCJQbGFub2dyYW0gcmVtb3ZlZCBlbnRpcmVseVwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFydHMucHVzaChcIkZsb29yIGRlbGV0ZWRcIik7XG4gICAgICAgICAgICBpZiAoZGF0YS5yZW51bWJlcmVkRmxvb3JzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcGFydHMucHVzaChcbiAgICAgICAgICAgICAgICBgJHtkYXRhLnJlbnVtYmVyZWRGbG9vcnMubGVuZ3RofSBzaWJsaW5nIGZsb29yKHMpIHJlbnVtYmVyZWRgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkYyA9IGRhdGEuZGVsZXRlZENvdW50cyB8fCB7fTtcbiAgICAgICAgICBwYXJ0cy5wdXNoKFxuICAgICAgICAgICAgYENsZWFuZWQ6ICR7ZGMuc3RvcmVmaXh0dXJlcyB8fCAwfSBmaXh0dXJlcywgJHtkYy5maXh0dXJlc2hlbHZlcyB8fCAwfSBzaGVsdmVzLCAke2RjLnBsYW5vdGFza2NvbXBsaWFuY2VzIHx8IDB9IGNvbXBsaWFuY2UsICR7ZGMucHJvY2Vzc2VkdGFza3MgfHwgMH0gdGFzayhzKSwgJHtkYy5wbGFub2dsb2JhbGNvbW1lbnRzIHx8IDB9IGNvbW1lbnQocyksICR7ZGMucGxhbm9yZXZpc2lvbnMgfHwgMH0gcmV2aXNpb24ocylgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShwYXJ0cy5qb2luKFwiLiBcIiksIFwic3VjY2Vzc1wiKTtcbiAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVzZXRGbG9vclN0YXRlKCk7XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdG9yZUlkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRGbG9vcnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxuICAgICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBkZWxldGUgZmxvb3IuXCIsXG4gICAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm0odGl0bGU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xuICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gdGl0bGU7XG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgIHJlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maXJtTGFiZWwgPSBcIkRlbGV0ZVwiO1xuICAgICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbmZpcm1DbGFzcyA9IFwiYnRuLWRhbmdlclwiO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVmLnJlc3VsdDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IFwib2tcIjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzaG93TWVzc2FnZShtc2c6IHN0cmluZywgdHlwZTogXCJzdWNjZXNzXCIgfCBcImVycm9yXCIpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7XG4gICAgdGhpcy5tZXNzYWdlVHlwZSA9IHR5cGU7XG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5tZXNzYWdlID0gXCJcIiksIDYwMDApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8c2VjdGlvbiBjbGFzcz1cImRlbGV0ZS1mbG9vciBwLTNcIj5cbiAgPGxpYi10b29sLXBhZ2UtaGVhZGVyXG4gICAgdGl0bGU9XCJEZWxldGUgRmxvb3JcIlxuICAgIGRlc2NyaXB0aW9uPVwiUmVtb3ZlcyBhIGZsb29yIGFuZCBldmVyeSByb3cgdGhhdCByZWZlcmVuY2VzIGl0IOKAlCBmaXh0dXJlcywgc2hlbHZlcywgdGFzayBjb21wbGlhbmNlLCBwcm9jZXNzZWQgdGFza3MsIGNvbW1lbnRzLCBhbmQgcmV2aXNpb25zLiBJZiB0aGlzIGlzIHRoZSBvbmx5IGZsb29yLCB0aGUgZW50aXJlIHBsYW5vZ3JhbSBpcyByZW1vdmVkLiBUaGUgc3RvcmUgZW50cnkgaXMgbmV2ZXIgdG91Y2hlZC5cIlxuICA+PC9saWItdG9vbC1wYWdlLWhlYWRlcj5cbiAgPGRpdiBjbGFzcz1cImNhcmQgcC00XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDcyMHB4O1wiPlxuXG4gICAgPCEtLSBTdG9yZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcbiAgICAgICAgbGFiZWw9XCJTdG9yZVwiXG4gICAgICAgIFtpZEZpZWxkXT1cIidzdG9yZUlkJ1wiXG4gICAgICAgIFtuYW1lRmllbGRdPVwiJ3N0b3JlTmFtZSdcIlxuICAgICAgICBbZGF0YV09XCJzdG9yZU9wdGlvbnNcIlxuICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFN0b3JlSWRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblN0b3JlU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiICpuZ0lmPVwiaXNMb2FkaW5nU3RvcmVzXCI+TG9hZGluZyBzdG9yZXMuLi48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRmxvb3IgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cInNlbGVjdGVkU3RvcmVJZFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ0Zsb29yczsgZWxzZSBmbG9vclBpY2tlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPkxvYWRpbmcgZmxvb3JzLi4uPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmxvb3JQaWNrZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmbG9vcnMubGVuZ3RoID4gMDsgZWxzZSBub0Zsb29yc1wiPlxuICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XG4gICAgICAgICAgICBsYWJlbD1cIkZsb29yXCJcbiAgICAgICAgICAgIFtpZEZpZWxkXT1cIidfaWQnXCJcbiAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2Rpc3BsYXlOYW1lJ1wiXG4gICAgICAgICAgICBbZGF0YV09XCJmbG9vcnNcIlxuICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRmxvb3JJZFwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZsb29yU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9GbG9vcnM+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5ObyBmbG9vcnMgZm91bmQgZm9yIHRoaXMgc3RvcmUuPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGF0dXMgKyBjYXNjYWRlIHByZXZpZXcgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkRmxvb3JJZFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ0ltcGFjdDsgZWxzZSBpbXBhY3RCbG9ja1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPkxvYWRpbmcgZmxvb3IgZGV0YWlscy4uLjwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2ltcGFjdEJsb2NrPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW1wYWN0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcC0zIHJvdW5kZWQgaW5mby1ibG9ja1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBneC0zIGd5LTIgc21hbGxcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5GbG9vciBzdGF0dXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGZvcm1hdFN0YXR1cyhpbXBhY3QuZmxvb3Iuc3RhdHVzKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrXCI+UGxhbm9ncmFtIHN0YXR1czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgZm9ybWF0U3RhdHVzKGltcGFjdC5wbGFub2dyYW0uc3RhdHVzKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrXCI+UGxhbm8gYXBwcm92ZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGZvcm1hdEJvb2woaW1wYWN0LmZsb29yLmlzUGxhbm9BcHByb3ZlZCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgZC1ibG9ja1wiPlZlcmlmaWNhdGlvbiBkb25lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBmb3JtYXRCb29sKGltcGFjdC5mbG9vci52ZXJpZmljYXRpb25TdGF0dXMpIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5NZXJjaCByb2xsb3V0IGRvbmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGZvcm1hdEJvb2woaW1wYWN0LmZsb29yLm1lcmNoUm9sbG91dFN0YXR1cykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgZC1ibG9ja1wiPlZNIHJvbGxvdXQgZG9uZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgZm9ybWF0Qm9vbChpbXBhY3QuZmxvb3Iudm1Sb2xsb3V0U3RhdHVzKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgZC1ibG9ja1wiPlRvdGFsIGZsb29ycyBpbiB0aGlzIHBsYW5vZ3JhbTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgaW1wYWN0LnRvdGFsRmxvb3JzIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTMgcC0zIHJvdW5kZWQgY2FzY2FkZS1ibG9ja1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIG1iLTJcIj5XaWxsIGRlbGV0ZTwvZGl2PlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwic21hbGwgbWItMCBwcy0zXCI+XG4gICAgICAgICAgICAgIDxsaT4xIGZsb29yIChzdG9yZWxheW91dHMpPC9saT5cbiAgICAgICAgICAgICAgPGxpPnt7IGltcGFjdC5jYXNjYWRlLnN0b3JlZml4dHVyZXMgfX0gZml4dHVyZShzKSAoc3RvcmVmaXh0dXJlcyk8L2xpPlxuICAgICAgICAgICAgICA8bGk+e3sgaW1wYWN0LmNhc2NhZGUuZml4dHVyZXNoZWx2ZXMgfX0gc2hlbGYgcm93KHMpIChmaXh0dXJlc2hlbHZlcyk8L2xpPlxuICAgICAgICAgICAgICA8bGk+e3sgaW1wYWN0LmNhc2NhZGUucGxhbm90YXNrY29tcGxpYW5jZXMgfX0gdGFzayBjb21wbGlhbmNlIHJvdyhzKSAocGxhbm90YXNrY29tcGxpYW5jZXMpPC9saT5cbiAgICAgICAgICAgICAgPGxpPnt7IGltcGFjdC5jYXNjYWRlLnByb2Nlc3NlZHRhc2tzIH19IHByb2Nlc3NlZCB0YXNrKHMpIChwcm9jZXNzZWR0YXNrcyk8L2xpPlxuICAgICAgICAgICAgICA8bGk+e3sgaW1wYWN0LmNhc2NhZGUucGxhbm9nbG9iYWxjb21tZW50cyB9fSBnbG9iYWwgY29tbWVudChzKSAocGxhbm9nbG9iYWxjb21tZW50cyk8L2xpPlxuICAgICAgICAgICAgICA8bGk+e3sgaW1wYWN0LmNhc2NhZGUucGxhbm9yZXZpc2lvbnMgfX0gcmV2aXNpb24ocykgKHBsYW5vcmV2aXNpb25zKTwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMlwiPlRvdGFsIGRvd25zdHJlYW0gcm93czoge3sgdG90YWxDYXNjYWRlUm93cyB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXdhcm5pbmcgc21hbGxcIiAqbmdJZj1cImltcGFjdC5pc0xhc3RGbG9vclwiPlxuICAgICAgICAgICAgPHN0cm9uZz5UaGlzIGlzIHRoZSBvbmx5IGZsb29yIGluIHRoaXMgcGxhbm9ncmFtLjwvc3Ryb25nPlxuICAgICAgICAgICAgRGVsZXRpbmcgaXQgd2lsbCBhbHNvIHJlbW92ZSB0aGUgcGxhbm9ncmFtIGVudHJ5IOKAlCB0aGUgcGxhbm8gd2lsbFxuICAgICAgICAgICAgZGlzYXBwZWFyIGNvbXBsZXRlbHkuIFRoZSBzdG9yZSByZWNvcmQgaXRzZWxmIHdpbGwgTk9UIGJlIGRlbGV0ZWQuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gU3VibWl0IC0tPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIChjbGljayk9XCJvblN1Ym1pdCgpXCIgW2Rpc2FibGVkXT1cIiFjYW5TdWJtaXRcIj5cbiAgICAgIHt7IGlzU3VibWl0dGluZyA/ICdEZWxldGluZy4uLicgOiAnRGVsZXRlIEZsb29yJyB9fVxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBjbGFzcz1cIm10LTMgYWxlcnRcIiAqbmdJZj1cIm1lc3NhZ2VcIlxuICAgICAgW2NsYXNzLmFsZXJ0LXN1Y2Nlc3NdPVwibWVzc2FnZVR5cGUgPT09ICdzdWNjZXNzJ1wiXG4gICAgICBbY2xhc3MuYWxlcnQtZGFuZ2VyXT1cIm1lc3NhZ2VUeXBlID09PSAnZXJyb3InXCJcbiAgICAgIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS1saW5lO1wiPlxuICAgICAge3sgbWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj5cbiJdfQ==
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWZsb29yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL3BsYW5vLXRvb2xzL2RlbGV0ZS1mbG9vci9kZWxldGUtZmxvb3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvZGVsZXRlLWZsb29yL2RlbGV0ZS1mbG9vci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sT0FBTyxFQUNQLFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdFQUFnRSxDQUFDOzs7Ozs7Ozs7QUFtRDdHLE1BQU0sT0FBTyxvQkFBb0I7SUFzQnJCO0lBQ0E7SUFDQTtJQXZCVixRQUFRLENBQVM7SUFFakIsWUFBWSxHQUFrQixFQUFFLENBQUM7SUFDakMsZUFBZSxHQUFrQixJQUFJLENBQUM7SUFDdEMsaUJBQWlCLEdBQWtCLElBQUksQ0FBQztJQUN4QyxlQUFlLEdBQVksS0FBSyxDQUFDO0lBRWpDLE1BQU0sR0FBa0IsRUFBRSxDQUFDO0lBQzNCLGVBQWUsR0FBa0IsSUFBSSxDQUFDO0lBQ3RDLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFFakMsTUFBTSxHQUF1QixJQUFJLENBQUM7SUFDbEMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUVqQyxZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLE9BQU8sR0FBVyxFQUFFLENBQUM7SUFDckIsV0FBVyxHQUF3QixTQUFTLENBQUM7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QU8sR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTNSVSxvQkFBb0I7NEZBQXBCLG9CQUFvQix3REM5RGpDLGl1TEF3SEE7OzRGRDFEYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7XHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBTdWJqZWN0LFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLWdsb2JhbFwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQgfSBmcm9tIFwiLi4vLi4vcG9wdXBzL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnRcIjtcclxuXHJcbmludGVyZmFjZSBTdG9yZU9wdGlvbiB7XHJcbiAgc3RvcmVJZDogc3RyaW5nO1xyXG4gIHN0b3JlTmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgRmxvb3JPcHRpb24ge1xyXG4gIF9pZDogc3RyaW5nO1xyXG4gIGZsb29yTnVtYmVyOiBudW1iZXI7XHJcbiAgZmxvb3JOYW1lOiBzdHJpbmc7XHJcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIEZsb29ySW1wYWN0IHtcclxuICBmbG9vcjoge1xyXG4gICAgX2lkOiBzdHJpbmc7XHJcbiAgICBmbG9vck51bWJlcjogbnVtYmVyO1xyXG4gICAgZmxvb3JOYW1lOiBzdHJpbmc7XHJcbiAgICBzdGF0dXM6IHN0cmluZztcclxuICAgIGlzUGxhbm9BcHByb3ZlZD86IGJvb2xlYW47XHJcbiAgICB2ZXJpZmljYXRpb25TdGF0dXM/OiBib29sZWFuO1xyXG4gICAgbWVyY2hSb2xsb3V0U3RhdHVzPzogYm9vbGVhbjtcclxuICAgIHZtUm9sbG91dFN0YXR1cz86IGJvb2xlYW47XHJcbiAgICBwbGFub1Byb2dyZXNzPzogbnVtYmVyO1xyXG4gIH07XHJcbiAgcGxhbm9ncmFtOiB7XHJcbiAgICBfaWQ6IHN0cmluZztcclxuICAgIHN0b3JlTmFtZTogc3RyaW5nO1xyXG4gICAgc3RvcmVJZDogc3RyaW5nO1xyXG4gICAgc3RhdHVzPzogc3RyaW5nO1xyXG4gICAgbGF5b3V0TmFtZT86IHN0cmluZztcclxuICB9O1xyXG4gIHRvdGFsRmxvb3JzOiBudW1iZXI7XHJcbiAgaXNMYXN0Rmxvb3I6IGJvb2xlYW47XHJcbiAgd2lsbERlbGV0ZVBsYW5vZ3JhbTogYm9vbGVhbjtcclxuICBjYXNjYWRlOiB7XHJcbiAgICBzdG9yZWZpeHR1cmVzOiBudW1iZXI7XHJcbiAgICBmaXh0dXJlc2hlbHZlczogbnVtYmVyO1xyXG4gICAgcGxhbm90YXNrY29tcGxpYW5jZXM6IG51bWJlcjtcclxuICAgIHByb2Nlc3NlZHRhc2tzOiBudW1iZXI7XHJcbiAgICBwbGFub2dsb2JhbGNvbW1lbnRzOiBudW1iZXI7XHJcbiAgICBwbGFub3JldmlzaW9uczogbnVtYmVyO1xyXG4gIH07XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1kZWxldGUtZmxvb3JcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2RlbGV0ZS1mbG9vci5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vZGVsZXRlLWZsb29yLmNvbXBvbmVudC5zY3NzXCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZWxldGVGbG9vckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICBzdG9yZU9wdGlvbnM6IFN0b3JlT3B0aW9uW10gPSBbXTtcclxuICBzZWxlY3RlZFN0b3JlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHNlbGVjdGVkU3RvcmVOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBpc0xvYWRpbmdTdG9yZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZmxvb3JzOiBGbG9vck9wdGlvbltdID0gW107XHJcbiAgc2VsZWN0ZWRGbG9vcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBpc0xvYWRpbmdGbG9vcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgaW1wYWN0OiBGbG9vckltcGFjdCB8IG51bGwgPSBudWxsO1xyXG4gIGlzTG9hZGluZ0ltcGFjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIG1lc3NhZ2VUeXBlOiBcInN1Y2Nlc3NcIiB8IFwiZXJyb3JcIiA9IFwic3VjY2Vzc1wiO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNiczogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXHJcbiAgICAgICAgZmlsdGVyKChkYXRhKSA9PiAhIWRhdGEpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGE/LmNsaWVudCkge1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGEuY2xpZW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXNldEFsbCgpO1xyXG4gICAgICAgIHRoaXMubG9hZFN0b3JlcygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRTdG9yZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY2xpZW50SWQpIHJldHVybjtcclxuICAgIHRoaXMuaXNMb2FkaW5nU3RvcmVzID0gdHJ1ZTtcclxuICAgIHRoaXMuc2JzLmdldEFsbFN0b3Jlcyh0aGlzLmNsaWVudElkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnN0b3JlT3B0aW9ucyA9IChyZXM/LmRhdGEgfHwgW10pLm1hcCgoczogYW55KSA9PiAoe1xyXG4gICAgICAgICAgc3RvcmVJZDogcy5zdG9yZUlkLFxyXG4gICAgICAgICAgc3RvcmVOYW1lOiBzLnN0b3JlTmFtZSxcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdTdG9yZXMgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXHJcbiAgICAgICAgICBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGxvYWQgc3RvcmVzLlwiLFxyXG4gICAgICAgICAgXCJlcnJvclwiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdTdG9yZXMgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25TdG9yZVNlbGVjdGVkKHN0b3JlSWQ6IHN0cmluZyB8IG51bGwpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUlkID0gc3RvcmVJZDtcclxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZU9wdGlvbnMuZmluZCgocykgPT4gcy5zdG9yZUlkID09PSBzdG9yZUlkKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZU5hbWUgPSBzdG9yZT8uc3RvcmVOYW1lID8/IG51bGw7XHJcbiAgICB0aGlzLnJlc2V0Rmxvb3JTdGF0ZSgpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTdG9yZUlkKSB7XHJcbiAgICAgIHRoaXMubG9hZEZsb29ycygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldEZsb29yU3RhdGUoKSB7XHJcbiAgICB0aGlzLmZsb29ycyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZsb29ySWQgPSBudWxsO1xyXG4gICAgdGhpcy5pbXBhY3QgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldEFsbCgpIHtcclxuICAgIHRoaXMuc3RvcmVPcHRpb25zID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVJZCA9IG51bGw7XHJcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmVOYW1lID0gbnVsbDtcclxuICAgIHRoaXMucmVzZXRGbG9vclN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBsb2FkRmxvb3JzKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkU3RvcmVJZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5pc0xvYWRpbmdGbG9vcnMgPSB0cnVlO1xyXG4gICAgdGhpcy5zYnMuZ2V0U3RvcmVGbG9vcnNMaXN0KHRoaXMuc2VsZWN0ZWRTdG9yZUlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByYXc6IGFueVtdID0gcmVzPy5kYXRhIHx8IFtdO1xyXG4gICAgICAgIHRoaXMuZmxvb3JzID0gcmF3XHJcbiAgICAgICAgICAubWFwKChmKSA9PiAoe1xyXG4gICAgICAgICAgICBfaWQ6IGYuX2lkLFxyXG4gICAgICAgICAgICBmbG9vck51bWJlcjogZi5mbG9vck51bWJlcixcclxuICAgICAgICAgICAgZmxvb3JOYW1lOiBmLmZsb29yTmFtZSxcclxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGBGbG9vciAke2YuZmxvb3JOdW1iZXJ9IOKAlCAke2YuZmxvb3JOYW1lfWAsXHJcbiAgICAgICAgICB9KSlcclxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmZsb29yTnVtYmVyIC0gYi5mbG9vck51bWJlcik7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdGbG9vcnMgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoXHJcbiAgICAgICAgICBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IFwiRmFpbGVkIHRvIGxvYWQgZmxvb3JzLlwiLFxyXG4gICAgICAgICAgXCJlcnJvclwiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdGbG9vcnMgPSBmYWxzZTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25GbG9vclNlbGVjdGVkKGZsb29ySWQ6IHN0cmluZyB8IG51bGwpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGbG9vcklkID0gZmxvb3JJZDtcclxuICAgIHRoaXMuaW1wYWN0ID0gbnVsbDtcclxuICAgIGlmIChmbG9vcklkKSB7XHJcbiAgICAgIHRoaXMubG9hZEltcGFjdChmbG9vcklkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEltcGFjdChmbG9vcklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nSW1wYWN0ID0gdHJ1ZTtcclxuICAgIHRoaXMuc2JzLmdldEZsb29yRGVsZXRlSW1wYWN0KHsgZmxvb3JJZCB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmltcGFjdCA9IHJlcz8uZGF0YSB8fCBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nSW1wYWN0ID0gZmFsc2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNob3dNZXNzYWdlKFxyXG4gICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBsb2FkIGZsb29yIGRldGFpbHMuXCIsXHJcbiAgICAgICAgICBcImVycm9yXCIsXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZ0ltcGFjdCA9IGZhbHNlO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRTdGF0dXMoc3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGlmICghc3RhdHVzKSByZXR1cm4gXCItLVwiO1xyXG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gICAgICBkcmFmdDogXCJEcmFmdFwiLFxyXG4gICAgICBhbGxvY2F0aW9uUGVuZGluZzogXCJBbGxvY2F0aW9uIFBlbmRpbmdcIixcclxuICAgICAgY29tcGxldGVkOiBcIkNvbXBsZXRlZFwiLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBtYXBbc3RhdHVzXSB8fCBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRCb29sKHY6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBcIlllc1wiIDogXCJOb1wiO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsQ2FzY2FkZVJvd3MoKTogbnVtYmVyIHtcclxuICAgIGlmICghdGhpcy5pbXBhY3QpIHJldHVybiAwO1xyXG4gICAgY29uc3QgYyA9IHRoaXMuaW1wYWN0LmNhc2NhZGU7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBjLnN0b3JlZml4dHVyZXMgK1xyXG4gICAgICBjLmZpeHR1cmVzaGVsdmVzICtcclxuICAgICAgYy5wbGFub3Rhc2tjb21wbGlhbmNlcyArXHJcbiAgICAgIGMucHJvY2Vzc2VkdGFza3MgK1xyXG4gICAgICBjLnBsYW5vZ2xvYmFsY29tbWVudHMgK1xyXG4gICAgICBjLnBsYW5vcmV2aXNpb25zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhblN1Ym1pdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICEhdGhpcy5zZWxlY3RlZEZsb29ySWQgJiZcclxuICAgICAgISF0aGlzLmltcGFjdCAmJlxyXG4gICAgICAhdGhpcy5pc1N1Ym1pdHRpbmcgJiZcclxuICAgICAgIXRoaXMuaXNMb2FkaW5nSW1wYWN0XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0IHx8ICF0aGlzLmltcGFjdCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGlzTGFzdCA9IHRoaXMuaW1wYWN0LmlzTGFzdEZsb29yO1xyXG4gICAgY29uc3QgZmxvb3IgPSB0aGlzLmltcGFjdC5mbG9vcjtcclxuICAgIGNvbnN0IHBsYW5vID0gdGhpcy5pbXBhY3QucGxhbm9ncmFtO1xyXG4gICAgY29uc3QgYyA9IHRoaXMuaW1wYWN0LmNhc2NhZGU7XHJcblxyXG4gICAgY29uc3Qgc3VtbWFyeTogc3RyaW5nW10gPSBbXTtcclxuICAgIHN1bW1hcnkucHVzaChgU3RvcmU6ICR7cGxhbm8uc3RvcmVOYW1lID8/IFwiLS1cIn1gKTtcclxuICAgIHN1bW1hcnkucHVzaChcclxuICAgICAgYEZsb29yICR7Zmxvb3IuZmxvb3JOdW1iZXJ9IOKAlCAke2Zsb29yLmZsb29yTmFtZX0gWyR7dGhpcy5mb3JtYXRTdGF0dXMoZmxvb3Iuc3RhdHVzKX1dYCxcclxuICAgICk7XHJcbiAgICBzdW1tYXJ5LnB1c2goXHJcbiAgICAgIGBDYXNjYWRlOiAke2Muc3RvcmVmaXh0dXJlc30gZml4dHVyZXMsICR7Yy5maXh0dXJlc2hlbHZlc30gc2hlbHZlcywgJHtjLnBsYW5vdGFza2NvbXBsaWFuY2VzfSBjb21wbGlhbmNlLCAke2MucHJvY2Vzc2VkdGFza3N9IHRhc2socyksICR7Yy5wbGFub2dsb2JhbGNvbW1lbnRzfSBjb21tZW50KHMpLCAke2MucGxhbm9yZXZpc2lvbnN9IHJldmlzaW9uKHMpYCxcclxuICAgICk7XHJcbiAgICBpZiAoaXNMYXN0KSB7XHJcbiAgICAgIHN1bW1hcnkucHVzaChcclxuICAgICAgICBcIlRoaXMgaXMgdGhlIE9OTFkgZmxvb3IgaW4gdGhpcyBwbGFub2dyYW0uIERlbGV0aW5nIGl0IHdpbGwgUkVNT1ZFIFRIRSBFTlRJUkUgUExBTk9HUkFNLiBUaGUgc3RvcmUgZW50cnkgaXRzZWxmIHdpbGwgbm90IGJlIHRvdWNoZWQuXCIsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBzdW1tYXJ5LnB1c2goXCJUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLlwiKTtcclxuXHJcbiAgICBjb25zdCBmaXJzdFRpdGxlID0gaXNMYXN0XHJcbiAgICAgID8gXCJEZWxldGUgcGxhbm9ncmFtIGVudGlyZWx5P1wiXHJcbiAgICAgIDogXCJEZWxldGUgdGhpcyBmbG9vcj9cIjtcclxuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybShmaXJzdFRpdGxlLCBzdW1tYXJ5LmpvaW4oXCJcXG5cIikpO1xyXG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcclxuXHJcbiAgICBpZiAoaXNMYXN0KSB7XHJcbiAgICAgIGNvbnN0IGRvdWJsZUNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY29uZmlybShcclxuICAgICAgICBcIkZpbmFsIGNvbmZpcm1hdGlvblwiLFxyXG4gICAgICAgIGBZb3UgYXJlIGFib3V0IHRvIHBlcm1hbmVudGx5IGRlbGV0ZSB0aGUgcGxhbm9ncmFtIGZvciBcIiR7cGxhbm8uc3RvcmVOYW1lfVwiLiBUaGlzIHdpcGVzIHRoZSBmbG9vciBhbmQgdGhlIHBsYW5vZ3JhbSBtZXRhZGF0YS4gVGhlIHN0b3JlIGlzIHByZXNlcnZlZC4gUHJvY2VlZD9gLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoIWRvdWJsZUNvbmZpcm1lZCkgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc2JzXHJcbiAgICAgIC5kZWxldGVGbG9vckNhc2NhZGUoe1xyXG4gICAgICAgIGZsb29ySWQ6IHRoaXMuc2VsZWN0ZWRGbG9vcklkISxcclxuICAgICAgICBjb25maXJtTGFzdEZsb29yOiBpc0xhc3QsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlcz8uZGF0YSB8fCB7fTtcclxuICAgICAgICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgaWYgKGRhdGEucGxhbm9ncmFtRGVsZXRlZCkge1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiUGxhbm9ncmFtIHJlbW92ZWQgZW50aXJlbHlcIik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJ0cy5wdXNoKFwiRmxvb3IgZGVsZXRlZFwiKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEucmVudW1iZXJlZEZsb29ycz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgcGFydHMucHVzaChcclxuICAgICAgICAgICAgICAgIGAke2RhdGEucmVudW1iZXJlZEZsb29ycy5sZW5ndGh9IHNpYmxpbmcgZmxvb3IocykgcmVudW1iZXJlZGAsXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgZGMgPSBkYXRhLmRlbGV0ZWRDb3VudHMgfHwge307XHJcbiAgICAgICAgICBwYXJ0cy5wdXNoKFxyXG4gICAgICAgICAgICBgQ2xlYW5lZDogJHtkYy5zdG9yZWZpeHR1cmVzIHx8IDB9IGZpeHR1cmVzLCAke2RjLmZpeHR1cmVzaGVsdmVzIHx8IDB9IHNoZWx2ZXMsICR7ZGMucGxhbm90YXNrY29tcGxpYW5jZXMgfHwgMH0gY29tcGxpYW5jZSwgJHtkYy5wcm9jZXNzZWR0YXNrcyB8fCAwfSB0YXNrKHMpLCAke2RjLnBsYW5vZ2xvYmFsY29tbWVudHMgfHwgMH0gY29tbWVudChzKSwgJHtkYy5wbGFub3JldmlzaW9ucyB8fCAwfSByZXZpc2lvbihzKWAsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShwYXJ0cy5qb2luKFwiLiBcIiksIFwic3VjY2Vzc1wiKTtcclxuICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnJlc2V0Rmxvb3JTdGF0ZSgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdG9yZUlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZEZsb29ycygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShcclxuICAgICAgICAgICAgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCBcIkZhaWxlZCB0byBkZWxldGUgZmxvb3IuXCIsXHJcbiAgICAgICAgICAgIFwiZXJyb3JcIixcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtKHRpdGxlOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSB0aXRsZTtcclxuICAgICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XHJcbiAgICAgIHJlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maXJtTGFiZWwgPSBcIkRlbGV0ZVwiO1xyXG4gICAgICByZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlybUNsYXNzID0gXCJidG4tZGFuZ2VyXCI7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZi5yZXN1bHQ7XHJcbiAgICAgIHJldHVybiByZXN1bHQgPT09IFwib2tcIjtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93TWVzc2FnZShtc2c6IHN0cmluZywgdHlwZTogXCJzdWNjZXNzXCIgfCBcImVycm9yXCIpIHtcclxuICAgIHRoaXMubWVzc2FnZSA9IG1zZztcclxuICAgIHRoaXMubWVzc2FnZVR5cGUgPSB0eXBlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5tZXNzYWdlID0gXCJcIiksIDYwMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJkZWxldGUtZmxvb3IgcC0zXCI+XHJcbiAgPGxpYi10b29sLXBhZ2UtaGVhZGVyXHJcbiAgICB0aXRsZT1cIkRlbGV0ZSBGbG9vclwiXHJcbiAgICBkZXNjcmlwdGlvbj1cIlJlbW92ZXMgYSBmbG9vciBhbmQgZXZlcnkgcm93IHRoYXQgcmVmZXJlbmNlcyBpdCDigJQgZml4dHVyZXMsIHNoZWx2ZXMsIHRhc2sgY29tcGxpYW5jZSwgcHJvY2Vzc2VkIHRhc2tzLCBjb21tZW50cywgYW5kIHJldmlzaW9ucy4gSWYgdGhpcyBpcyB0aGUgb25seSBmbG9vciwgdGhlIGVudGlyZSBwbGFub2dyYW0gaXMgcmVtb3ZlZC4gVGhlIHN0b3JlIGVudHJ5IGlzIG5ldmVyIHRvdWNoZWQuXCJcclxuICA+PC9saWItdG9vbC1wYWdlLWhlYWRlcj5cclxuICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTRcIiBzdHlsZT1cIm1heC13aWR0aDogNzIwcHg7XCI+XHJcblxyXG4gICAgPCEtLSBTdG9yZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgbGFiZWw9XCJTdG9yZVwiXHJcbiAgICAgICAgW2lkRmllbGRdPVwiJ3N0b3JlSWQnXCJcclxuICAgICAgICBbbmFtZUZpZWxkXT1cIidzdG9yZU5hbWUnXCJcclxuICAgICAgICBbZGF0YV09XCJzdG9yZU9wdGlvbnNcIlxyXG4gICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRTdG9yZUlkXCJcclxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblN0b3JlU2VsZWN0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIiAqbmdJZj1cImlzTG9hZGluZ1N0b3Jlc1wiPkxvYWRpbmcgc3RvcmVzLi4uPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEZsb29yIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cInNlbGVjdGVkU3RvcmVJZFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nRmxvb3JzOyBlbHNlIGZsb29yUGlja2VyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5Mb2FkaW5nIGZsb29ycy4uLjwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNmbG9vclBpY2tlcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmxvb3JzLmxlbmd0aCA+IDA7IGVsc2Ugbm9GbG9vcnNcIj5cclxuICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgIGxhYmVsPVwiRmxvb3JcIlxyXG4gICAgICAgICAgICBbaWRGaWVsZF09XCInX2lkJ1wiXHJcbiAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2Rpc3BsYXlOYW1lJ1wiXHJcbiAgICAgICAgICAgIFtkYXRhXT1cImZsb29yc1wiXHJcbiAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRmxvb3JJZFwiXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmxvb3JTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub0Zsb29ycz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+Tm8gZmxvb3JzIGZvdW5kIGZvciB0aGlzIHN0b3JlLjwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN0YXR1cyArIGNhc2NhZGUgcHJldmlldyAtLT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEZsb29ySWRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ0ltcGFjdDsgZWxzZSBpbXBhY3RCbG9ja1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+TG9hZGluZyBmbG9vciBkZXRhaWxzLi4uPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2ltcGFjdEJsb2NrPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbXBhY3RcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHAtMyByb3VuZGVkIGluZm8tYmxvY2tcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBneC0zIGd5LTIgc21hbGxcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrXCI+Rmxvb3Igc3RhdHVzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGZvcm1hdFN0YXR1cyhpbXBhY3QuZmxvb3Iuc3RhdHVzKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrXCI+UGxhbm9ncmFtIHN0YXR1czwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBmb3JtYXRTdGF0dXMoaW1wYWN0LnBsYW5vZ3JhbS5zdGF0dXMpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5QbGFubyBhcHByb3ZlZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBmb3JtYXRCb29sKGltcGFjdC5mbG9vci5pc1BsYW5vQXBwcm92ZWQpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5WZXJpZmljYXRpb24gZG9uZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBmb3JtYXRCb29sKGltcGFjdC5mbG9vci52ZXJpZmljYXRpb25TdGF0dXMpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5NZXJjaCByb2xsb3V0IGRvbmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgZm9ybWF0Qm9vbChpbXBhY3QuZmxvb3IubWVyY2hSb2xsb3V0U3RhdHVzKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZCBkLWJsb2NrXCI+Vk0gcm9sbG91dCBkb25lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGZvcm1hdEJvb2woaW1wYWN0LmZsb29yLnZtUm9sbG91dFN0YXR1cykgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGQtYmxvY2tcIj5Ub3RhbCBmbG9vcnMgaW4gdGhpcyBwbGFub2dyYW08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+e3sgaW1wYWN0LnRvdGFsRmxvb3JzIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHAtMyByb3VuZGVkIGNhc2NhZGUtYmxvY2tcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIG1iLTJcIj5XaWxsIGRlbGV0ZTwvZGl2PlxyXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJzbWFsbCBtYi0wIHBzLTNcIj5cclxuICAgICAgICAgICAgICA8bGk+MSBmbG9vciAoc3RvcmVsYXlvdXRzKTwvbGk+XHJcbiAgICAgICAgICAgICAgPGxpPnt7IGltcGFjdC5jYXNjYWRlLnN0b3JlZml4dHVyZXMgfX0gZml4dHVyZShzKSAoc3RvcmVmaXh0dXJlcyk8L2xpPlxyXG4gICAgICAgICAgICAgIDxsaT57eyBpbXBhY3QuY2FzY2FkZS5maXh0dXJlc2hlbHZlcyB9fSBzaGVsZiByb3cocykgKGZpeHR1cmVzaGVsdmVzKTwvbGk+XHJcbiAgICAgICAgICAgICAgPGxpPnt7IGltcGFjdC5jYXNjYWRlLnBsYW5vdGFza2NvbXBsaWFuY2VzIH19IHRhc2sgY29tcGxpYW5jZSByb3cocykgKHBsYW5vdGFza2NvbXBsaWFuY2VzKTwvbGk+XHJcbiAgICAgICAgICAgICAgPGxpPnt7IGltcGFjdC5jYXNjYWRlLnByb2Nlc3NlZHRhc2tzIH19IHByb2Nlc3NlZCB0YXNrKHMpIChwcm9jZXNzZWR0YXNrcyk8L2xpPlxyXG4gICAgICAgICAgICAgIDxsaT57eyBpbXBhY3QuY2FzY2FkZS5wbGFub2dsb2JhbGNvbW1lbnRzIH19IGdsb2JhbCBjb21tZW50KHMpIChwbGFub2dsb2JhbGNvbW1lbnRzKTwvbGk+XHJcbiAgICAgICAgICAgICAgPGxpPnt7IGltcGFjdC5jYXNjYWRlLnBsYW5vcmV2aXNpb25zIH19IHJldmlzaW9uKHMpIChwbGFub3JldmlzaW9ucyk8L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0yXCI+VG90YWwgZG93bnN0cmVhbSByb3dzOiB7eyB0b3RhbENhc2NhZGVSb3dzIH19PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZyBzbWFsbFwiICpuZ0lmPVwiaW1wYWN0LmlzTGFzdEZsb29yXCI+XHJcbiAgICAgICAgICAgIDxzdHJvbmc+VGhpcyBpcyB0aGUgb25seSBmbG9vciBpbiB0aGlzIHBsYW5vZ3JhbS48L3N0cm9uZz5cclxuICAgICAgICAgICAgRGVsZXRpbmcgaXQgd2lsbCBhbHNvIHJlbW92ZSB0aGUgcGxhbm9ncmFtIGVudHJ5IOKAlCB0aGUgcGxhbm8gd2lsbFxyXG4gICAgICAgICAgICBkaXNhcHBlYXIgY29tcGxldGVseS4gVGhlIHN0b3JlIHJlY29yZCBpdHNlbGYgd2lsbCBOT1QgYmUgZGVsZXRlZC5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSBTdWJtaXQgLS0+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiIFtkaXNhYmxlZF09XCIhY2FuU3VibWl0XCI+XHJcbiAgICAgIHt7IGlzU3VibWl0dGluZyA/ICdEZWxldGluZy4uLicgOiAnRGVsZXRlIEZsb29yJyB9fVxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm10LTMgYWxlcnRcIiAqbmdJZj1cIm1lc3NhZ2VcIlxyXG4gICAgICBbY2xhc3MuYWxlcnQtc3VjY2Vzc109XCJtZXNzYWdlVHlwZSA9PT0gJ3N1Y2Nlc3MnXCJcclxuICAgICAgW2NsYXNzLmFsZXJ0LWRhbmdlcl09XCJtZXNzYWdlVHlwZSA9PT0gJ2Vycm9yJ1wiXHJcbiAgICAgIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS1saW5lO1wiPlxyXG4gICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG4iXX0=
@@ -125,10 +125,10 @@ export class LayoutTouchupComponent {
125
125
  });
126
126
  }
127
127
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LayoutTouchupComponent, deps: [{ token: i1.StoreBuilderService }, { token: i2.GlobalStateService }, { token: i3.ToastService }, { token: i4.Router }], target: i0.ɵɵFactoryTarget.Component });
128
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LayoutTouchupComponent, selector: "lib-layout-touchup", ngImport: i0, template: "<div class=\"touchup-selector\">\n <lib-tool-page-header\n title=\"Layout Touchup\"\n description=\"Reposition or resize existing walls, fixtures, entrances and other elements, or tweak individual fixture details \u2014 without invalidating any verification responses.\"\n ></lib-tool-page-header>\n\n <div class=\"row g-3\">\n <div class=\"col-md-6\">\n <lib-reactive-select\n label=\"Store\"\n [idField]=\"'id'\"\n [nameField]=\"'label'\"\n [data]=\"storeOptions\"\n [search]=\"true\"\n [ngModel]=\"selectedStore?.id\"\n (ngModelChange)=\"onStoreChange($event)\">\n </lib-reactive-select>\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\n <div class=\"text-muted small mt-1\" *ngIf=\"!isLoadingStores\">\n Active stores with a planogram only.\n </div>\n </div>\n\n <div class=\"col-md-6\" *ngIf=\"selectedStore\">\n <ng-container *ngIf=\"isLoadingFloor; else floorPicker\">\n <div class=\"text-muted small\">Loading floors...</div>\n </ng-container>\n <ng-template #floorPicker>\n <lib-reactive-select\n label=\"Floor\"\n [idField]=\"'id'\"\n [nameField]=\"'label'\"\n [data]=\"floorOptions\"\n [search]=\"false\"\n [ngModel]=\"selectedFloorId\"\n (ngModelChange)=\"selectedFloorId = $event\">\n </lib-reactive-select>\n </ng-template>\n </div>\n </div>\n\n <div class=\"mt-4 d-flex justify-content-end\">\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!selectedFloorId || isLoadingFloor\"\n (click)=\"openEditor()\">\n Open Editor\n </button>\n </div>\n</div>\n", styles: [".touchup-selector{max-width:960px}.touchup-selector h4{font-size:18px;font-weight:600;color:#101828}\n"], dependencies: [{ kind: "component", type: i5.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel", "disabled"], outputs: ["actionClick"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.ToolPageHeaderComponent, selector: "lib-tool-page-header", inputs: ["title", "description", "backLink"] }] });
128
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LayoutTouchupComponent, selector: "lib-layout-touchup", ngImport: i0, template: "<div class=\"touchup-selector\">\r\n <lib-tool-page-header\r\n title=\"Layout Touchup\"\r\n description=\"Reposition or resize existing walls, fixtures, entrances and other elements, or tweak individual fixture details \u2014 without invalidating any verification responses.\"\r\n ></lib-tool-page-header>\r\n\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStore?.id\"\r\n (ngModelChange)=\"onStoreChange($event)\">\r\n </lib-reactive-select>\r\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\r\n <div class=\"text-muted small mt-1\" *ngIf=\"!isLoadingStores\">\r\n Active stores with a planogram only.\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6\" *ngIf=\"selectedStore\">\r\n <ng-container *ngIf=\"isLoadingFloor; else floorPicker\">\r\n <div class=\"text-muted small\">Loading floors...</div>\r\n </ng-container>\r\n <ng-template #floorPicker>\r\n <lib-reactive-select\r\n label=\"Floor\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"floorOptions\"\r\n [search]=\"false\"\r\n [ngModel]=\"selectedFloorId\"\r\n (ngModelChange)=\"selectedFloorId = $event\">\r\n </lib-reactive-select>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mt-4 d-flex justify-content-end\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"!selectedFloorId || isLoadingFloor\"\r\n (click)=\"openEditor()\">\r\n Open Editor\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".touchup-selector{max-width:960px}.touchup-selector h4{font-size:18px;font-weight:600;color:#101828}\n"], dependencies: [{ kind: "component", type: i5.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel", "disabled"], outputs: ["actionClick"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.ToolPageHeaderComponent, selector: "lib-tool-page-header", inputs: ["title", "description", "backLink"] }] });
129
129
  }
130
130
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LayoutTouchupComponent, decorators: [{
131
131
  type: Component,
132
- args: [{ selector: "lib-layout-touchup", template: "<div class=\"touchup-selector\">\n <lib-tool-page-header\n title=\"Layout Touchup\"\n description=\"Reposition or resize existing walls, fixtures, entrances and other elements, or tweak individual fixture details \u2014 without invalidating any verification responses.\"\n ></lib-tool-page-header>\n\n <div class=\"row g-3\">\n <div class=\"col-md-6\">\n <lib-reactive-select\n label=\"Store\"\n [idField]=\"'id'\"\n [nameField]=\"'label'\"\n [data]=\"storeOptions\"\n [search]=\"true\"\n [ngModel]=\"selectedStore?.id\"\n (ngModelChange)=\"onStoreChange($event)\">\n </lib-reactive-select>\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\n <div class=\"text-muted small mt-1\" *ngIf=\"!isLoadingStores\">\n Active stores with a planogram only.\n </div>\n </div>\n\n <div class=\"col-md-6\" *ngIf=\"selectedStore\">\n <ng-container *ngIf=\"isLoadingFloor; else floorPicker\">\n <div class=\"text-muted small\">Loading floors...</div>\n </ng-container>\n <ng-template #floorPicker>\n <lib-reactive-select\n label=\"Floor\"\n [idField]=\"'id'\"\n [nameField]=\"'label'\"\n [data]=\"floorOptions\"\n [search]=\"false\"\n [ngModel]=\"selectedFloorId\"\n (ngModelChange)=\"selectedFloorId = $event\">\n </lib-reactive-select>\n </ng-template>\n </div>\n </div>\n\n <div class=\"mt-4 d-flex justify-content-end\">\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [disabled]=\"!selectedFloorId || isLoadingFloor\"\n (click)=\"openEditor()\">\n Open Editor\n </button>\n </div>\n</div>\n", styles: [".touchup-selector{max-width:960px}.touchup-selector h4{font-size:18px;font-weight:600;color:#101828}\n"] }]
132
+ args: [{ selector: "lib-layout-touchup", template: "<div class=\"touchup-selector\">\r\n <lib-tool-page-header\r\n title=\"Layout Touchup\"\r\n description=\"Reposition or resize existing walls, fixtures, entrances and other elements, or tweak individual fixture details \u2014 without invalidating any verification responses.\"\r\n ></lib-tool-page-header>\r\n\r\n <div class=\"row g-3\">\r\n <div class=\"col-md-6\">\r\n <lib-reactive-select\r\n label=\"Store\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"storeOptions\"\r\n [search]=\"true\"\r\n [ngModel]=\"selectedStore?.id\"\r\n (ngModelChange)=\"onStoreChange($event)\">\r\n </lib-reactive-select>\r\n <div class=\"text-muted small mt-1\" *ngIf=\"isLoadingStores\">Loading stores...</div>\r\n <div class=\"text-muted small mt-1\" *ngIf=\"!isLoadingStores\">\r\n Active stores with a planogram only.\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6\" *ngIf=\"selectedStore\">\r\n <ng-container *ngIf=\"isLoadingFloor; else floorPicker\">\r\n <div class=\"text-muted small\">Loading floors...</div>\r\n </ng-container>\r\n <ng-template #floorPicker>\r\n <lib-reactive-select\r\n label=\"Floor\"\r\n [idField]=\"'id'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"floorOptions\"\r\n [search]=\"false\"\r\n [ngModel]=\"selectedFloorId\"\r\n (ngModelChange)=\"selectedFloorId = $event\">\r\n </lib-reactive-select>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mt-4 d-flex justify-content-end\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"!selectedFloorId || isLoadingFloor\"\r\n (click)=\"openEditor()\">\r\n Open Editor\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".touchup-selector{max-width:960px}.touchup-selector h4{font-size:18px;font-weight:600;color:#101828}\n"] }]
133
133
  }], ctorParameters: () => [{ type: i1.StoreBuilderService }, { type: i2.GlobalStateService }, { type: i3.ToastService }, { type: i4.Router }] });
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LXRvdWNodXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvbGF5b3V0LXRvdWNodXAvbGF5b3V0LXRvdWNodXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvbGF5b3V0LXRvdWNodXAvbGF5b3V0LXRvdWNodXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7QUFhZDs7Ozs7Ozs7Ozs7R0FXRztBQU1ILE1BQU0sT0FBTyxzQkFBc0I7SUFZdkI7SUFDQTtJQUNBO0lBQ0E7SUFkRixRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUV2QyxRQUFRLENBQVM7SUFDakIsWUFBWSxHQUF5QixFQUFFLENBQUM7SUFDeEMsYUFBYSxHQUE4QixJQUFJLENBQUM7SUFDaEQsWUFBWSxHQUFvQyxFQUFFLENBQUM7SUFDbkQsZUFBZSxHQUFXLEVBQUUsQ0FBQztJQUM3QixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFdkIsWUFDVSxVQUErQixFQUMvQixFQUFzQixFQUN0QixLQUFtQixFQUNuQixNQUFjO1FBSGQsZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFDL0IsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixX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QUNMLENBQUM7d0dBOUdVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDBEQ3RDbkMsMnVEQW1EQTs7NEZEYmEsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBTdWJqZWN0LFxuICB0YWtlVW50aWwsXG59IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xuXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xuXG5pbnRlcmZhY2UgU3RvcmVUb3VjaHVwT3B0aW9uIHtcbiAgaWQ6IHN0cmluZzsgLy8gcGxhbm9JZFxuICBsYWJlbDogc3RyaW5nOyAvLyBzdG9yZU5hbWVcbiAgc3RvcmVJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMYXlvdXQgVG91Y2h1cCDigJQgaW50ZXJuYWwgdG9vbCBzZWxlY3Rvci5cbiAqXG4gKiBUd28tc3RlcCBzZWxlY3RvciAoU3RvcmUg4oaSIEZsb29yKS4gT24gXCJPcGVuIEVkaXRvclwiLCBuYXZpZ2F0ZXMgdG8gdGhlXG4gKiBleGlzdGluZyBtYW5hZ2UtcGxhbm9ncmFtIHJvdXRlIHdpdGggYHRvdWNodXA9MWAgcXVlcnkgcGFyYW0uIFRoZSBleGlzdGluZ1xuICogTWFuYWdlU3RvcmVQbGFub0NvbXBvbmVudCBkZXRlY3RzIHRoaXMgYW5kIHN3aXRjaGVzIHRvIHRvdWNodXAgYmVoYXZpb3VyOlxuICogICAtIHN0YXR1cy1hZmZlY3RpbmcgYnV0dG9ucyAocHVibGlzaCAvIGFzc2lnbiAvIHJlZG8gLyByZXZva2UpIGhpZGRlblxuICogICAtIFNhdmUgY2FsbHMgL21hbmFnZVBsYW5vL3VwZGF0ZUxheW91dFRvdWNodXAgKG5vIHRhc2sgY2FzY2FkZSlcbiAqXG4gKiBObyBjYW52YXMgcmVuZGVyaW5nIG9yIGZpeHR1cmUgZWRpdG9yIGxpdmVzIGhlcmUg4oCUIHRoZSBleGlzdGluZyBlZGl0LXBsYW5vXG4gKiBzdXJmYWNlIElTIHRoZSBlZGl0b3IsIHNvIHRoZSB2aXN1YWwgaXMgaWRlbnRpY2FsIHRvIHRoZSB2ZXJpZmljYXRpb24gZmxvdy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImxpYi1sYXlvdXQtdG91Y2h1cFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2xheW91dC10b3VjaHVwLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsOiBcIi4vbGF5b3V0LXRvdWNodXAuY29tcG9uZW50LnNjc3NcIixcbn0pXG5leHBvcnQgY2xhc3MgTGF5b3V0VG91Y2h1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgc3RvcmVPcHRpb25zOiBTdG9yZVRvdWNodXBPcHRpb25bXSA9IFtdO1xuICBzZWxlY3RlZFN0b3JlOiBTdG9yZVRvdWNodXBPcHRpb24gfCBudWxsID0gbnVsbDtcbiAgZmxvb3JPcHRpb25zOiB7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XG4gIHNlbGVjdGVkRmxvb3JJZDogc3RyaW5nID0gXCJcIjtcbiAgaXNMb2FkaW5nU3RvcmVzID0gZmFsc2U7XG4gIGlzTG9hZGluZ0Zsb29yID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICAgIGZpbHRlcigoZCkgPT4gISFkKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPVxuICAgICAgICAgIGRhdGE/LmNsaWVudCA/P1xuICAgICAgICAgIEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSBhcyBzdHJpbmcpPy5jbGllbnQ7XG4gICAgICAgIHRoaXMubG9hZFN0b3JlcygpO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBsb2FkU3RvcmVzKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nU3RvcmVzID0gdHJ1ZTtcbiAgICB0aGlzLmFwaVNlcnZpY2VcbiAgICAgIC5nZXRTdG9yZXNGb3JUb3VjaHVwKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBCRSByZXR1cm5zIGFjdGl2ZSBzdG9yZXMgd2l0aCBleGFjdGx5IG9uZSBwbGFubzsgYGlkYCBpcyBwbGFub0lkLlxuICAgICAgICAgIHRoaXMuc3RvcmVPcHRpb25zID0gcmVzPy5kYXRhID8/IFtdO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RvcmVzID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGxvYWQgc3RvcmVzXCIpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RvcmVzID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIG9uU3RvcmVDaGFuZ2UocGxhbm9JZDogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IG9wdCA9IHRoaXMuc3RvcmVPcHRpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHBsYW5vSWQpO1xuICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSA9IG9wdCA/PyBudWxsO1xuICAgIHRoaXMuZmxvb3JPcHRpb25zID0gW107XG4gICAgdGhpcy5zZWxlY3RlZEZsb29ySWQgPSBcIlwiO1xuICAgIGlmICghb3B0KSByZXR1cm47XG4gICAgdGhpcy5sb2FkRmxvb3JzRm9yUGxhbm8ob3B0LmlkKTtcbiAgfVxuXG4gIGxvYWRGbG9vcnNGb3JQbGFubyhwbGFub0lkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmlzTG9hZGluZ0Zsb29yID0gdHJ1ZTtcbiAgICB0aGlzLmFwaVNlcnZpY2VcbiAgICAgIC5nZXRTdG9yZUZpeHR1cmVzKHsgaWQ6IFtwbGFub0lkXSwgdHJlZVZpZXc6IHRydWUgfSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFubyA9IHJlcz8uZGF0YT8uWzBdO1xuICAgICAgICAgIGlmICghcGxhbm8/LmZsb29ycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoXCJObyBmbG9vcnMgZm91bmQgZm9yIHRoaXMgcGxhbm9cIik7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ0Zsb29yID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmxvb3JPcHRpb25zID0gcGxhbm8uZmxvb3JzLm1hcCgoZjogYW55KSA9PiAoe1xuICAgICAgICAgICAgaWQ6IGYuX2lkLFxuICAgICAgICAgICAgbGFiZWw6IGBGbG9vciAke2YuZmxvb3JOdW19YCxcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgaWYgKHRoaXMuZmxvb3JPcHRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29ySWQgPSB0aGlzLmZsb29yT3B0aW9uc1swXS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmdGbG9vciA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBsb2FkIGZsb29yc1wiKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ0Zsb29yID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIG9wZW5FZGl0b3IoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkU3RvcmU/LmlkIHx8ICF0aGlzLnNlbGVjdGVkRmxvb3JJZCkge1xuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiUGljayBhIHN0b3JlIGFuZCBmbG9vciBmaXJzdFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTmF2aWdhdGUgdG8gdGhlIGRlZGljYXRlZCBUb3VjaHVwRWRpdG9yQ29tcG9uZW50IHJvdXRlIChmdWxsIGNsb25lIG9mXG4gICAgLy8gbWFuYWdlLXBsYW5vZ3JhbSB3aXRoIHZlcmlmaWNhdGlvbiBVSSBzdHJpcHBlZCArIHNhdmUgcmVyb3V0ZWQgdG9cbiAgICAvLyAvbWFuYWdlUGxhbm8vdXBkYXRlTGF5b3V0VG91Y2h1cCkuIFNhbWUgcXVlcnktcGFyYW0gY29udHJhY3QgYXMgdGhlXG4gICAgLy8gdmVyaWZpY2F0aW9uIGZsb3cgdXNlcyBmb3IgcGxhbm9JZCAvIGZsb29ySWQuXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL21hbmFnZS9wbGFub2dyYW0vbGF5b3V0LXRvdWNodXAtZWRpdG9yXCJdLCB7XG4gICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICBwbGFub0lkOiB0aGlzLnNlbGVjdGVkU3RvcmUuaWQsXG4gICAgICAgIGZsb29ySWQ6IHRoaXMuc2VsZWN0ZWRGbG9vcklkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRvdWNodXAtc2VsZWN0b3JcIj5cbiAgPGxpYi10b29sLXBhZ2UtaGVhZGVyXG4gICAgdGl0bGU9XCJMYXlvdXQgVG91Y2h1cFwiXG4gICAgZGVzY3JpcHRpb249XCJSZXBvc2l0aW9uIG9yIHJlc2l6ZSBleGlzdGluZyB3YWxscywgZml4dHVyZXMsIGVudHJhbmNlcyBhbmQgb3RoZXIgZWxlbWVudHMsIG9yIHR3ZWFrIGluZGl2aWR1YWwgZml4dHVyZSBkZXRhaWxzIOKAlCB3aXRob3V0IGludmFsaWRhdGluZyBhbnkgdmVyaWZpY2F0aW9uIHJlc3BvbnNlcy5cIlxuICA+PC9saWItdG9vbC1wYWdlLWhlYWRlcj5cblxuICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcbiAgICAgICAgbGFiZWw9XCJTdG9yZVwiXG4gICAgICAgIFtpZEZpZWxkXT1cIidpZCdcIlxuICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxuICAgICAgICBbZGF0YV09XCJzdG9yZU9wdGlvbnNcIlxuICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZFN0b3JlPy5pZFwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGwgbXQtMVwiICpuZ0lmPVwiaXNMb2FkaW5nU3RvcmVzXCI+TG9hZGluZyBzdG9yZXMuLi48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIiAqbmdJZj1cIiFpc0xvYWRpbmdTdG9yZXNcIj5cbiAgICAgICAgQWN0aXZlIHN0b3JlcyB3aXRoIGEgcGxhbm9ncmFtIG9ubHkuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiICpuZ0lmPVwic2VsZWN0ZWRTdG9yZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ0Zsb29yOyBlbHNlIGZsb29yUGlja2VyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+TG9hZGluZyBmbG9vcnMuLi48L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNmbG9vclBpY2tlcj5cbiAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3RcbiAgICAgICAgICBsYWJlbD1cIkZsb29yXCJcbiAgICAgICAgICBbaWRGaWVsZF09XCInaWQnXCJcbiAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxuICAgICAgICAgIFtkYXRhXT1cImZsb29yT3B0aW9uc1wiXG4gICAgICAgICAgW3NlYXJjaF09XCJmYWxzZVwiXG4gICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGbG9vcklkXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEZsb29ySWQgPSAkZXZlbnRcIj5cbiAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm10LTQgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRGbG9vcklkIHx8IGlzTG9hZGluZ0Zsb29yXCJcbiAgICAgIChjbGljayk9XCJvcGVuRWRpdG9yKClcIj5cbiAgICAgIE9wZW4gRWRpdG9yXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LXRvdWNodXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvbGF5b3V0LXRvdWNodXAvbGF5b3V0LXRvdWNodXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvcGxhbm8tdG9vbHMvbGF5b3V0LXRvdWNodXAvbGF5b3V0LXRvdWNodXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUNMLFlBQVksRUFDWixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7QUFhZDs7Ozs7Ozs7Ozs7R0FXRztBQU1ILE1BQU0sT0FBTyxzQkFBc0I7SUFZdkI7SUFDQTtJQUNBO0lBQ0E7SUFkRixRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUV2QyxRQUFRLENBQVM7SUFDakIsWUFBWSxHQUF5QixFQUFFLENBQUM7SUFDeEMsYUFBYSxHQUE4QixJQUFJLENBQUM7SUFDaEQsWUFBWSxHQUFvQyxFQUFFLENBQUM7SUFDbkQsZUFBZSxHQUFXLEVBQUUsQ0FBQztJQUM3QixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFdkIsWUFDVSxVQUErQixFQUMvQixFQUFzQixFQUN0QixLQUFtQixFQUNuQixNQUFjO1FBSGQsZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFDL0IsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixX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QUNMLENBQUM7d0dBOUdVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDBEQ3RDbkMsaTFEQW1EQTs7NEZEYmEsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7XHJcbiAgZGVib3VuY2VUaW1lLFxyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBTdWJqZWN0LFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1nbG9iYWxcIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuXHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlXCI7XHJcblxyXG5pbnRlcmZhY2UgU3RvcmVUb3VjaHVwT3B0aW9uIHtcclxuICBpZDogc3RyaW5nOyAvLyBwbGFub0lkXHJcbiAgbGFiZWw6IHN0cmluZzsgLy8gc3RvcmVOYW1lXHJcbiAgc3RvcmVJZD86IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIExheW91dCBUb3VjaHVwIOKAlCBpbnRlcm5hbCB0b29sIHNlbGVjdG9yLlxyXG4gKlxyXG4gKiBUd28tc3RlcCBzZWxlY3RvciAoU3RvcmUg4oaSIEZsb29yKS4gT24gXCJPcGVuIEVkaXRvclwiLCBuYXZpZ2F0ZXMgdG8gdGhlXHJcbiAqIGV4aXN0aW5nIG1hbmFnZS1wbGFub2dyYW0gcm91dGUgd2l0aCBgdG91Y2h1cD0xYCBxdWVyeSBwYXJhbS4gVGhlIGV4aXN0aW5nXHJcbiAqIE1hbmFnZVN0b3JlUGxhbm9Db21wb25lbnQgZGV0ZWN0cyB0aGlzIGFuZCBzd2l0Y2hlcyB0byB0b3VjaHVwIGJlaGF2aW91cjpcclxuICogICAtIHN0YXR1cy1hZmZlY3RpbmcgYnV0dG9ucyAocHVibGlzaCAvIGFzc2lnbiAvIHJlZG8gLyByZXZva2UpIGhpZGRlblxyXG4gKiAgIC0gU2F2ZSBjYWxscyAvbWFuYWdlUGxhbm8vdXBkYXRlTGF5b3V0VG91Y2h1cCAobm8gdGFzayBjYXNjYWRlKVxyXG4gKlxyXG4gKiBObyBjYW52YXMgcmVuZGVyaW5nIG9yIGZpeHR1cmUgZWRpdG9yIGxpdmVzIGhlcmUg4oCUIHRoZSBleGlzdGluZyBlZGl0LXBsYW5vXHJcbiAqIHN1cmZhY2UgSVMgdGhlIGVkaXRvciwgc28gdGhlIHZpc3VhbCBpcyBpZGVudGljYWwgdG8gdGhlIHZlcmlmaWNhdGlvbiBmbG93LlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLWxheW91dC10b3VjaHVwXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9sYXlvdXQtdG91Y2h1cC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vbGF5b3V0LXRvdWNodXAuY29tcG9uZW50LnNjc3NcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIExheW91dFRvdWNodXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgc3RvcmVPcHRpb25zOiBTdG9yZVRvdWNodXBPcHRpb25bXSA9IFtdO1xyXG4gIHNlbGVjdGVkU3RvcmU6IFN0b3JlVG91Y2h1cE9wdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gIGZsb29yT3B0aW9uczogeyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xyXG4gIHNlbGVjdGVkRmxvb3JJZDogc3RyaW5nID0gXCJcIjtcclxuICBpc0xvYWRpbmdTdG9yZXMgPSBmYWxzZTtcclxuICBpc0xvYWRpbmdGbG9vciA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXHJcbiAgICAgICAgZmlsdGVyKChkKSA9PiAhIWQpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNsaWVudElkID1cclxuICAgICAgICAgIGRhdGE/LmNsaWVudCA/P1xyXG4gICAgICAgICAgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIGFzIHN0cmluZyk/LmNsaWVudDtcclxuICAgICAgICB0aGlzLmxvYWRTdG9yZXMoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbG9hZFN0b3JlcygpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nU3RvcmVzID0gdHJ1ZTtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVzRm9yVG91Y2h1cCgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAvLyBCRSByZXR1cm5zIGFjdGl2ZSBzdG9yZXMgd2l0aCBleGFjdGx5IG9uZSBwbGFubzsgYGlkYCBpcyBwbGFub0lkLlxyXG4gICAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMgPSByZXM/LmRhdGEgPz8gW107XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ1N0b3JlcyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBsb2FkIHN0b3Jlc1wiKTtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RvcmVzID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblN0b3JlQ2hhbmdlKHBsYW5vSWQ6IHN0cmluZyB8IG51bGwpIHtcclxuICAgIGNvbnN0IG9wdCA9IHRoaXMuc3RvcmVPcHRpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHBsYW5vSWQpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN0b3JlID0gb3B0ID8/IG51bGw7XHJcbiAgICB0aGlzLmZsb29yT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZsb29ySWQgPSBcIlwiO1xyXG4gICAgaWYgKCFvcHQpIHJldHVybjtcclxuICAgIHRoaXMubG9hZEZsb29yc0ZvclBsYW5vKG9wdC5pZCk7XHJcbiAgfVxyXG5cclxuICBsb2FkRmxvb3JzRm9yUGxhbm8ocGxhbm9JZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZ0Zsb29yID0gdHJ1ZTtcclxuICAgIHRoaXMuYXBpU2VydmljZVxyXG4gICAgICAuZ2V0U3RvcmVGaXh0dXJlcyh7IGlkOiBbcGxhbm9JZF0sIHRyZWVWaWV3OiB0cnVlIH0pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwbGFubyA9IHJlcz8uZGF0YT8uWzBdO1xyXG4gICAgICAgICAgaWYgKCFwbGFubz8uZmxvb3JzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiTm8gZmxvb3JzIGZvdW5kIGZvciB0aGlzIHBsYW5vXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ0Zsb29yID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZmxvb3JPcHRpb25zID0gcGxhbm8uZmxvb3JzLm1hcCgoZjogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICBpZDogZi5faWQsXHJcbiAgICAgICAgICAgIGxhYmVsOiBgRmxvb3IgJHtmLmZsb29yTnVtfWAsXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5mbG9vck9wdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcklkID0gdGhpcy5mbG9vck9wdGlvbnNbMF0uaWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ0Zsb29yID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGxvYWQgZmxvb3JzXCIpO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmdGbG9vciA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb3BlbkVkaXRvcigpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZFN0b3JlPy5pZCB8fCAhdGhpcy5zZWxlY3RlZEZsb29ySWQpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiUGljayBhIHN0b3JlIGFuZCBmbG9vciBmaXJzdFwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gTmF2aWdhdGUgdG8gdGhlIGRlZGljYXRlZCBUb3VjaHVwRWRpdG9yQ29tcG9uZW50IHJvdXRlIChmdWxsIGNsb25lIG9mXHJcbiAgICAvLyBtYW5hZ2UtcGxhbm9ncmFtIHdpdGggdmVyaWZpY2F0aW9uIFVJIHN0cmlwcGVkICsgc2F2ZSByZXJvdXRlZCB0b1xyXG4gICAgLy8gL21hbmFnZVBsYW5vL3VwZGF0ZUxheW91dFRvdWNodXApLiBTYW1lIHF1ZXJ5LXBhcmFtIGNvbnRyYWN0IGFzIHRoZVxyXG4gICAgLy8gdmVyaWZpY2F0aW9uIGZsb3cgdXNlcyBmb3IgcGxhbm9JZCAvIGZsb29ySWQuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvbWFuYWdlL3BsYW5vZ3JhbS9sYXlvdXQtdG91Y2h1cC1lZGl0b3JcIl0sIHtcclxuICAgICAgcXVlcnlQYXJhbXM6IHtcclxuICAgICAgICBwbGFub0lkOiB0aGlzLnNlbGVjdGVkU3RvcmUuaWQsXHJcbiAgICAgICAgZmxvb3JJZDogdGhpcy5zZWxlY3RlZEZsb29ySWQsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInRvdWNodXAtc2VsZWN0b3JcIj5cclxuICA8bGliLXRvb2wtcGFnZS1oZWFkZXJcclxuICAgIHRpdGxlPVwiTGF5b3V0IFRvdWNodXBcIlxyXG4gICAgZGVzY3JpcHRpb249XCJSZXBvc2l0aW9uIG9yIHJlc2l6ZSBleGlzdGluZyB3YWxscywgZml4dHVyZXMsIGVudHJhbmNlcyBhbmQgb3RoZXIgZWxlbWVudHMsIG9yIHR3ZWFrIGluZGl2aWR1YWwgZml4dHVyZSBkZXRhaWxzIOKAlCB3aXRob3V0IGludmFsaWRhdGluZyBhbnkgdmVyaWZpY2F0aW9uIHJlc3BvbnNlcy5cIlxyXG4gID48L2xpYi10b29sLXBhZ2UtaGVhZGVyPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgbGFiZWw9XCJTdG9yZVwiXHJcbiAgICAgICAgW2lkRmllbGRdPVwiJ2lkJ1wiXHJcbiAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICBbZGF0YV09XCJzdG9yZU9wdGlvbnNcIlxyXG4gICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRTdG9yZT8uaWRcIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIiAqbmdJZj1cImlzTG9hZGluZ1N0b3Jlc1wiPkxvYWRpbmcgc3RvcmVzLi4uPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIiAqbmdJZj1cIiFpc0xvYWRpbmdTdG9yZXNcIj5cclxuICAgICAgICBBY3RpdmUgc3RvcmVzIHdpdGggYSBwbGFub2dyYW0gb25seS5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIiAqbmdJZj1cInNlbGVjdGVkU3RvcmVcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ0Zsb29yOyBlbHNlIGZsb29yUGlja2VyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5Mb2FkaW5nIGZsb29ycy4uLjwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLXRlbXBsYXRlICNmbG9vclBpY2tlcj5cclxuICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdFxyXG4gICAgICAgICAgbGFiZWw9XCJGbG9vclwiXHJcbiAgICAgICAgICBbaWRGaWVsZF09XCInaWQnXCJcclxuICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICBbZGF0YV09XCJmbG9vck9wdGlvbnNcIlxyXG4gICAgICAgICAgW3NlYXJjaF09XCJmYWxzZVwiXHJcbiAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEZsb29ySWRcIlxyXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VsZWN0ZWRGbG9vcklkID0gJGV2ZW50XCI+XHJcbiAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJtdC00IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRGbG9vcklkIHx8IGlzTG9hZGluZ0Zsb29yXCJcclxuICAgICAgKGNsaWNrKT1cIm9wZW5FZGl0b3IoKVwiPlxyXG4gICAgICBPcGVuIEVkaXRvclxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=