tango-app-ui-store-builder 1.0.32 → 1.0.33

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 (19) hide show
  1. package/esm2022/lib/components/manage-plano/popups/create-planogram/create-planogram.component.mjs +21 -55
  2. package/esm2022/lib/components/manage-plano/rollout-table/rollout-table.component.mjs +4 -2
  3. package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +15 -9
  4. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +76 -223
  5. package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +2 -1
  6. package/esm2022/lib/services/store-builder.service.mjs +1 -10
  7. package/esm2022/lib/tango-store-builder-routing.module.mjs +1 -6
  8. package/esm2022/lib/tango-store-builder.module.mjs +4 -1
  9. package/esm2022/lib/tango-store-plano.module.mjs +20 -18
  10. package/fesm2022/tango-app-ui-store-builder.mjs +591 -2244
  11. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  12. package/lib/components/manage-plano/popups/create-planogram/create-planogram.component.d.ts +5 -21
  13. package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +2 -2
  14. package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +4 -4
  15. package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +2 -11
  16. package/lib/services/store-builder.service.d.ts +0 -3
  17. package/package.json +1 -1
  18. package/esm2022/lib/components/collection-update-ai/collection-update-ai.component.mjs +0 -1486
  19. package/lib/components/collection-update-ai/collection-update-ai.component.d.ts +0 -82
@@ -1,5 +1,5 @@
1
1
  import { Component, Input } from "@angular/core";
2
- import { FormsModule, ReactiveFormsModule, } from "@angular/forms";
2
+ import { FormsModule, ReactiveFormsModule } from "@angular/forms";
3
3
  import { ReactiveSelectComponent } from "../../../reactive-select/reactive-select.component";
4
4
  import { firstValueFrom } from "rxjs";
5
5
  import { FileUploadComponent } from "../../../file-upload/file-upload.component";
@@ -9,13 +9,10 @@ import * as i1 from "@ng-bootstrap/ng-bootstrap";
9
9
  import * as i2 from "../../../../services/store-builder.service";
10
10
  import * as i3 from "tango-app-ui-shared";
11
11
  import * as i4 from "@angular/forms";
12
- import * as i5 from "@angular/router";
13
12
  export class CreatePlanogramComponent {
14
13
  activeModal;
15
14
  storeBuilderService;
16
15
  toastService;
17
- fb;
18
- router;
19
16
  clientId;
20
17
  selectedStore;
21
18
  selectedFloor;
@@ -28,31 +25,16 @@ export class CreatePlanogramComponent {
28
25
  ];
29
26
  selectedStoreFloors = [];
30
27
  isLayoutExist = false;
31
- isCADProcessing = false;
32
- isCreateStoreMode = false;
33
- createStoreForm;
34
- storeTypeList = [
35
- { label: "High Street", value: "HighStreet" },
36
- { label: "Mall", value: "mall" },
37
- { label: "Kiosk", value: "kiosk" },
38
- ];
39
- businessTypeList = [
40
- { label: "COCO", value: "coco" },
41
- { label: "COFO", value: "cofo" },
42
- { label: "FOFO", value: "fofo" },
43
- { label: "FOCO", value: "foco" },
44
- ];
45
- constructor(activeModal, storeBuilderService, toastService, fb, router) {
28
+ isProcessing = false;
29
+ constructor(activeModal, storeBuilderService, toastService) {
46
30
  this.activeModal = activeModal;
47
31
  this.storeBuilderService = storeBuilderService;
48
32
  this.toastService = toastService;
49
- this.fb = fb;
50
- this.router = router;
51
33
  }
52
34
  async ngOnInit() {
53
35
  await this.getStoreList();
54
36
  }
55
- get isValidToCreatePlano() {
37
+ get isValidToCreate() {
56
38
  return this.selectedStore && this.selectedFloor && this.selectedFile;
57
39
  }
58
40
  async getStoreList() {
@@ -86,53 +68,37 @@ export class CreatePlanogramComponent {
86
68
  }
87
69
  onFileChange(file) {
88
70
  this.selectedFile = file;
71
+ if (file) {
72
+ console.log("DXF selected:", file);
73
+ }
74
+ else {
75
+ console.log("DXF cleared");
76
+ }
89
77
  }
90
- async onCreateLayoutPlano() {
91
- if (!this.isValidToCreatePlano)
78
+ async onCreate() {
79
+ if (!this.isValidToCreate)
92
80
  return;
93
81
  try {
94
- this.isCADProcessing = true;
82
+ this.isProcessing = true;
95
83
  const planoRes = await firstValueFrom(this.storeBuilderService.createPlanoFromCAD(this.selectedFile, this.selectedStore, this.selectedFloor));
96
84
  if (!planoRes?.data)
97
85
  return;
98
86
  this.activeModal.close(planoRes?.data);
99
87
  }
100
88
  catch (error) {
101
- this.toastService.getErrorToast(error?.error?.error?.errMsg ?? "Failed to extract plano from CAD file.");
89
+ this.toastService.getErrorToast(error.error.error);
102
90
  console.log("@@ ~ onCreate [ERR]:", error);
103
91
  }
104
92
  finally {
105
- this.isCADProcessing = false;
93
+ this.isProcessing = false;
106
94
  }
107
95
  }
108
- async onCreateStore() {
109
- // console.log("@@ ~ this.createStoreForm:", this.createStoreForm.value);
110
- }
111
- addNewStore() {
112
- // this.isCreateStoreMode = true;
113
- // this.createStoreForm = this.fb.group({
114
- // storeName: ["", Validators.required],
115
- // businessType: ["", Validators.required],
116
- // storeType: ["", Validators.required],
117
- // address: ["", Validators.required],
118
- // country: ["", Validators.required],
119
- // state: ["", Validators.required],
120
- // city: ["", Validators.required],
121
- // zipCode: ["", Validators.required],
122
- // });
123
- const urlTree = this.router.createUrlTree(["/manage/stores/add-single-store"]);
124
- const url = this.router.serializeUrl(urlTree);
125
- window.open(url, "_blank");
126
- }
96
+ onClickCreateStore() { }
127
97
  onCancel() {
128
98
  this.activeModal.dismiss();
129
99
  }
130
- onBack() {
131
- this.createStoreForm = null;
132
- this.isCreateStoreMode = false;
133
- }
134
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.StoreBuilderService }, { token: i3.ToastService }, { token: i4.FormBuilder }, { token: i5.Router }], target: i0.ɵɵFactoryTarget.Component });
135
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreatePlanogramComponent, isStandalone: true, selector: "app-create-planogram", inputs: { clientId: "clientId" }, ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name\" />\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\"></div>\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"zipCode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"zipCode\" formControlName=\"zipCode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('zipCode')?.touched && createStoreForm.get('zipCode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('zipCode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isCADProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isCADProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isCADProcessing\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n Create\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isCADProcessing\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isCADProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isCADProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
100
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.StoreBuilderService }, { token: i3.ToastService }], target: i0.ɵɵFactoryTarget.Component });
101
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CreatePlanogramComponent, isStandalone: true, selector: "app-create-planogram", inputs: { clientId: "clientId" }, ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"onClickCreateStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isProcessing\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n\r\n </div>\r\n\r\n <div class=\"modal-actions\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreate || isProcessing\" (click)=\"onCreate()\">\r\n <span *ngIf=\"!isProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
136
102
  }
137
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, decorators: [{
138
104
  type: Component,
@@ -142,8 +108,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
142
108
  ReactiveSelectComponent,
143
109
  FileUploadComponent,
144
110
  NgIf,
145
- ], template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name\" />\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\"></div>\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"zipCode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"zipCode\" formControlName=\"zipCode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('zipCode')?.touched && createStoreForm.get('zipCode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('zipCode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isCADProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isCADProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isCADProcessing\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n Create\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isCADProcessing\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isCADProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isCADProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
146
- }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.StoreBuilderService }, { type: i3.ToastService }, { type: i4.FormBuilder }, { type: i5.Router }], propDecorators: { clientId: [{
111
+ ], template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"onClickCreateStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isProcessing\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n\r\n </div>\r\n\r\n <div class=\"modal-actions\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreate || isProcessing\" (click)=\"onCreate()\">\r\n <span *ngIf=\"!isProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
112
+ }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.StoreBuilderService }, { type: i3.ToastService }], propDecorators: { clientId: [{
147
113
  type: Input
148
114
  }] } });
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBRUwsV0FBVyxFQUNYLG1CQUFtQixHQUVwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBRTdGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakYsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7O0FBaUJ2QyxNQUFNLE9BQU8sd0JBQXdCO0lBK0N6QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBbERELFFBQVEsQ0FBUztJQUMxQixhQUFhLENBQVM7SUFDdEIsYUFBYSxDQUFTO0lBQ3RCLFlBQVksR0FBZ0IsSUFBSSxDQUFDO0lBRWpDLFNBQVMsR0FHSCxFQUFFLENBQUM7SUFFVCxTQUFTLEdBR0g7UUFDSixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUM5QixFQUFF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Q3pDLDBDQUEwQztRQUMxQyw2Q0FBNkM7UUFDN0MsMENBQTBDO1FBQzFDLHdDQUF3QztRQUN4Qyx3Q0FBd0M7UUFDeEMsc0NBQXNDO1FBQ3RDLHFDQUFxQztRQUNyQyx3Q0FBd0M7UUFDeEMsTUFBTTtRQUVOLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQzt3R0E5SlUsd0JBQXdCOzRGQUF4Qix3QkFBd0Isa0hDN0JyQyxpalBBZ0lNLHNuQ0QxR0YsV0FBVyxtM0JBQ1gsbUJBQW1CLGdWQUNuQix1QkFBdUIseU5BQ3ZCLG1CQUFtQix1R0FDbkIsSUFBSTs7NEZBR0ssd0JBQXdCO2tCQWJwQyxTQUFTOytCQUNFLHNCQUFzQixjQUdwQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixJQUFJO3FCQUNMOytMQUdRLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1zTW9kdWxlLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBOZ0lmIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtY3JlYXRlLXBsYW5vZ3JhbVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBGaWxlVXBsb2FkQ29tcG9uZW50LFxyXG4gICAgTmdJZixcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlUGxhbm9ncmFtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkU3RvcmU6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW107XHJcblxyXG4gIGZsb29yTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJGbG9vciAxXCIsIHZhbHVlOiAxIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDJcIiwgdmFsdWU6IDIgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgM1wiLCB2YWx1ZTogMyB9LFxyXG4gIF07XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVGbG9vcnM6IGFueSA9IFtdO1xyXG5cclxuICBpc0xheW91dEV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDQURQcm9jZXNzaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDcmVhdGVTdG9yZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY3JlYXRlU3RvcmVGb3JtOiBhbnk7XHJcbiAgc3RvcmVUeXBlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJIaWdoIFN0cmVldFwiLCB2YWx1ZTogXCJIaWdoU3RyZWV0XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiTWFsbFwiLCB2YWx1ZTogXCJtYWxsXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiS2lvc2tcIiwgdmFsdWU6IFwia2lvc2tcIiB9LFxyXG4gIF07XHJcblxyXG4gIGJ1c2luZXNzVHlwZUxpc3Q6IHtcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6IFwiQ09DT1wiLCB2YWx1ZTogXCJjb2NvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiQ09GT1wiLCB2YWx1ZTogXCJjb2ZvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRk9GT1wiLCB2YWx1ZTogXCJmb2ZvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRk9DT1wiLCB2YWx1ZTogXCJmb2NvXCIgfSxcclxuICBdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6Um91dGVyLFxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmdldFN0b3JlTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVmFsaWRUb0NyZWF0ZVBsYW5vKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTdG9yZSAmJiB0aGlzLnNlbGVjdGVkRmxvb3IgJiYgdGhpcy5zZWxlY3RlZEZpbGU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTdG9yZUxpc3QoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzdG9yZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRBbGxTdG9yZXModGhpcy5jbGllbnRJZClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yZUxpc3QgPSBzdG9yZXM/LmRhdGE/Lm1hcCgoczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgbGFiZWw6IHMuc3RvcmVOYW1lLCB2YWx1ZTogcy5zdG9yZUlkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFN0b3JlTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdG9yZUNoYW5nZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZsb29yczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldFN0b3JlRmxvb3JzTGlzdCh0aGlzLnNlbGVjdGVkU3RvcmUpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycyA9IGZsb29ycz8uZGF0YSA/PyBbXTtcclxuICAgICAgdGhpcy5vbkZsb29yQ2hhbmdlKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3RvcmVMaXN0IFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZsb29yQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGbG9vcikge1xyXG4gICAgICB0aGlzLmlzTGF5b3V0RXhpc3QgPSB0aGlzLnNlbGVjdGVkU3RvcmVGbG9vcnMuc29tZShcclxuICAgICAgICAoZjogYW55KSA9PiBmLmZsb29yTnVtYmVyID09PSB0aGlzLnNlbGVjdGVkRmxvb3JcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWxlQ2hhbmdlKGZpbGU6IEZpbGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNyZWF0ZUxheW91dFBsYW5vKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRUb0NyZWF0ZVBsYW5vKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5pc0NBRFByb2Nlc3NpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgY29uc3QgcGxhbm9SZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5jcmVhdGVQbGFub0Zyb21DQUQoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZSEsXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3JcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoIXBsYW5vUmVzPy5kYXRhKSByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKHBsYW5vUmVzPy5kYXRhKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnJvcj8uZXJyb3I/LmVycm9yPy5lcnJNc2cgPz8gXCJGYWlsZWQgdG8gZXh0cmFjdCBwbGFubyBmcm9tIENBRCBmaWxlLlwiXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBvbkNyZWF0ZSBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0NBRFByb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ3JlYXRlU3RvcmUoKSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIkBAIH4gdGhpcy5jcmVhdGVTdG9yZUZvcm06XCIsIHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFkZE5ld1N0b3JlKCkge1xyXG4gICAgLy8gdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IHRydWU7XHJcbiAgICAvLyB0aGlzLmNyZWF0ZVN0b3JlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgLy8gICBzdG9yZU5hbWU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIC8vICAgYnVzaW5lc3NUeXBlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAvLyAgIHN0b3JlVHlwZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgLy8gICBhZGRyZXNzOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAvLyAgIGNvdW50cnk6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIC8vICAgc3RhdGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIC8vICAgY2l0eTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgLy8gICB6aXBDb2RlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbXCIvbWFuYWdlL3N0b3Jlcy9hZGQtc2luZ2xlLXN0b3JlXCJdKTtcclxuXHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodXJsVHJlZSk7XHJcbiAgICB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIpO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmRpc21pc3MoKTtcclxuICB9XHJcblxyXG4gIG9uQmFjaygpe1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0gPSBudWxsO1xyXG4gICAgdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtd3JhcHBlclwiPlxyXG4gIDxoMyBjbGFzcz1cIm1iLTRcIj5DcmVhdGUgc3RvcmUgbGF5b3V0L3BsYW4gZnJvbSBDQUQ8L2gzPlxyXG4gIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNyZWF0ZVN0b3JlRm9ybVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+U3RvcmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RvcmVOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVOYW1lXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHN0b3JlIG5hbWVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBTdG9yZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImJ1c2luZXNzVHlwZUxpc3RcIlxyXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBidXNpbmVzcyB0eXBlJ1wiIGZvcm1Db250cm9sTmFtZT1cImJ1c2luZXNzVHlwZVwiPlxyXG4gICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic3RvcmVUeXBlTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IHN0b3JlIHR5cGUnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVUeXBlXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc1wiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+QWRkcmVzczwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc1wiIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhbmQgZW50ZXIgYWRkcmVzc1wiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2FkZHJlc3MnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50cnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb3VudHJ5XCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlN0YXRlPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXRlXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBTdGF0ZVwiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIFN0YXRlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjaXR5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5DaXR5IC8gVG93bjwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY2l0eVwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENpdHkgLyBUb3duXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnY2l0eScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQ2l0eSAvIFRvd24gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInppcENvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBpbiAvIFppcCBDb2RlPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ6aXBDb2RlXCIgZm9ybUNvbnRyb2xOYW1lPVwiemlwQ29kZVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIC8gWmlwIENvZGVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3ppcENvZGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCd6aXBDb2RlJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3ppcENvZGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBQaW4gLyBaaXAgQ29kZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuICB9XHJcbiAgQGVsc2Uge1xyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtzZWFyY2hdPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTdG9yZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgW2RhdGFdPVwic3RvcmVMaXN0XCIgW2xhYmVsXT1cIidTZWxlY3Qgc3RvcmUnXCIgW2FjdGlvbl09XCJ0cnVlXCIgKGFjdGlvbkNsaWNrKT1cImFkZE5ld1N0b3JlKClcIlxyXG4gICAgICAgICAgW2FjdGlvbkxhYmVsXT1cIidDcmVhdGUgbmV3IHN0b3JlJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc0NBRFByb2Nlc3NpbmdcIj5cclxuICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmxvb3JcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZmxvb3JMaXN0XCJcclxuICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmxvb3JDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc0NBRFByb2Nlc3NpbmdcIj5cclxuICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWV4aXN0LXdyYXBwZXJcIiBbY2xhc3Muc2hvd109XCJpc0xheW91dEV4aXN0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtZXhpc3Qtd2FybmluZyBtYi00XCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTkuOTk5NjUgNi42NjY2N1YxME05Ljk5OTY1IDEzLjMzMzNIMTAuMDA4TTguNTc0NjUgMi4zODMzNEwxLjUxNjMyIDE0LjE2NjdDMS4zNzA3OSAxNC40MTg3IDEuMjkzNzkgMTQuNzA0NCAxLjI5Mjk4IDE0Ljk5NTRDMS4yOTIxNiAxNS4yODY1IDEuMzY3NTYgMTUuNTcyNiAxLjUxMTY3IDE1LjgyNTRDMS42NTU3OSAxNi4wNzgzIDEuODYzNTkgMTYuMjg5IDIuMTE0NDEgMTYuNDM2NkMyLjM2NTIzIDE2LjU4NDEgMi42NTAzMiAxNi42NjM1IDIuOTQxMzIgMTYuNjY2N0gxNy4wNThDMTcuMzQ5IDE2LjY2MzUgMTcuNjM0MSAxNi41ODQxIDE3Ljg4NDkgMTYuNDM2NkMxOC4xMzU3IDE2LjI4OSAxOC4zNDM1IDE2LjA3ODMgMTguNDg3NiAxNS44MjU0QzE4LjYzMTcgMTUuNTcyNiAxOC43MDcxIDE1LjI4NjUgMTguNzA2MyAxNC45OTU0QzE4LjcwNTUgMTQuNzA0NCAxOC42Mjg1IDE0LjQxODcgMTguNDgzIDE0LjE2NjdMMTEuNDI0NyAyLjM4MzM0QzExLjI3NjEgMi4xMzg0MyAxMS4wNjY5IDEuOTM1OTQgMTAuODE3MyAxLjc5NTQxQzEwLjU2NzcgMS42NTQ4OCAxMC4yODYxIDEuNTgxMDUgOS45OTk2NSAxLjU4MTA1QzkuNzEzMjEgMS41ODEwNSA5LjQzMTU5IDEuNjU0ODggOS4xODE5OSAxLjc5NTQxQzguOTMyMzggMS45MzU5NCA4LjcyMzIxIDIuMTM4NDMgOC41NzQ2NSAyLjM4MzM0WlwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiNGMDQ0MzhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgVGhpcyBzdG9yZSBhbHJlYWR5IGhhcyBhIEZsb29yIHt7c2VsZWN0ZWRGbG9vcn19IHBsYW5vZ3JhbS4gT3ZlcndyaXRlIGl0PyBUaGlzIGNhbuKAmXQgYmUgdW5kb25lLlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgIDxmaWxlLXVwbG9hZCBbZGlzYWJsZWRdPVwiaXNDQURQcm9jZXNzaW5nXCIgKGZpbGVDaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIj48L2ZpbGUtdXBsb2FkPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYWN0aW9uc1wiPlxyXG4gICAgQGlmKGlzQ3JlYXRlU3RvcmVNb2RlKXtcclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgbWUtYXV0b1wiIChjbGljayk9XCJvbkJhY2soKVwiPkJhY2s8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiY3JlYXRlU3RvcmVGb3JtLmludmFsaWRcIiAoY2xpY2spPVwib25DcmVhdGVTdG9yZSgpXCI+XHJcbiAgICAgICAgQ3JlYXRlXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgfUBlbHNlIHtcclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiIWlzVmFsaWRUb0NyZWF0ZVBsYW5vIHx8IGlzQ0FEUHJvY2Vzc2luZ1wiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlTGF5b3V0UGxhbm8oKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ0FEUHJvY2Vzc2luZ1wiPlxyXG4gICAgICAgICAge3tpc0xheW91dEV4aXN0ID8gICdPdmVyd3JpdGUnIDogJ0NyZWF0ZSd9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cImlzQ0FEUHJvY2Vzc2luZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFN0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7OztBQWdCdkMsTUFBTSxPQUFPLHdCQUF3QjtJQTBCekI7SUFDQTtJQUNBO0lBM0JELFFBQVEsQ0FBUztJQUMxQixhQUFhLENBQVM7SUFDdEIsYUFBYSxDQUFTO0lBQ3RCLFlBQVksR0FBZ0IsSUFBSSxDQUFDO0lBRWpDLFNBQVMsR0FHSCxFQUFFLENBQUM7SUFFVCxTQUFTLEdBR0g7UUFDSixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUM5QixFQUFFLEtBQUssRUFBRSxT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QyxZQUFhLEVBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxhQUFhLENBQ25CLENBQ0YsQ0FBQztZQUVGLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSTtnQkFBRSxPQUFPO1lBRTVCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QztRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1QztnQkFBUztZQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixLQUFJLENBQUM7SUFFdkIsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDN0IsQ0FBQzt3R0FoSFUsd0JBQXdCOzRGQUF4Qix3QkFBd0Isa0hDdkJyQyx5eEZBNENNLHNuQ0Q1QkYsV0FBVyw4VkFDWCxtQkFBbUIsK0JBQ25CLHVCQUF1Qix5TkFDdkIsbUJBQW1CLHVHQUNuQixJQUFJOzs0RkFHSyx3QkFBd0I7a0JBYnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBR3BCLElBQUksV0FDUDt3QkFDUCxXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3dCQUN2QixtQkFBbUI7d0JBQ25CLElBQUk7cUJBQ0w7Z0pBR1EsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFJlYWN0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL3JlYWN0aXZlLXNlbGVjdC9yZWFjdGl2ZS1zZWxlY3QuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFN0b3JlQnVpbGRlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgRmlsZVVwbG9hZENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgTmdJZiB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSBcInRhbmdvLWFwcC11aS1zaGFyZWRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1jcmVhdGUtcGxhbm9ncmFtXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9jcmVhdGUtcGxhbm9ncmFtLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9jcmVhdGUtcGxhbm9ncmFtLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCxcclxuICAgIEZpbGVVcGxvYWRDb21wb25lbnQsXHJcbiAgICBOZ0lmLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVQbGFub2dyYW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRTdG9yZTogc3RyaW5nO1xyXG4gIHNlbGVjdGVkRmxvb3I6IG51bWJlcjtcclxuICBzZWxlY3RlZEZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgc3RvcmVMaXN0OiB7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9W10gPSBbXTtcclxuXHJcbiAgZmxvb3JMaXN0OiB7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IG51bWJlcjtcclxuICB9W10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDFcIiwgdmFsdWU6IDEgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgMlwiLCB2YWx1ZTogMiB9LFxyXG4gICAgeyBsYWJlbDogXCJGbG9vciAzXCIsIHZhbHVlOiAzIH0sXHJcbiAgXTtcclxuXHJcbiAgc2VsZWN0ZWRTdG9yZUZsb29yczogYW55ID0gW107XHJcblxyXG4gIGlzTGF5b3V0RXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTdG9yZUxpc3QoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1ZhbGlkVG9DcmVhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFN0b3JlICYmIHRoaXMuc2VsZWN0ZWRGbG9vciAmJiB0aGlzLnNlbGVjdGVkRmlsZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFN0b3JlTGlzdCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldEFsbFN0b3Jlcyh0aGlzLmNsaWVudElkKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnN0b3JlTGlzdCA9IHN0b3Jlcz8uZGF0YT8ubWFwKChzOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4geyBsYWJlbDogcy5zdG9yZU5hbWUsIHZhbHVlOiBzLnN0b3JlSWQgfTtcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3RvcmVMaXN0IFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblN0b3JlQ2hhbmdlKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmxvb3JzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0U3RvcmVGbG9vcnNMaXN0KHRoaXMuc2VsZWN0ZWRTdG9yZSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlRmxvb3JzID0gZmxvb3JzPy5kYXRhID8/IFtdO1xyXG4gICAgICB0aGlzLm9uRmxvb3JDaGFuZ2UoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRTdG9yZUxpc3QgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRmxvb3JDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yKSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycy5zb21lKFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuZmxvb3JOdW1iZXIgPT09IHRoaXMuc2VsZWN0ZWRGbG9vclxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDaGFuZ2UoZmlsZTogRmlsZSB8IG51bGwpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gZmlsZTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRFhGIHNlbGVjdGVkOlwiLCBmaWxlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRFhGIGNsZWFyZWRcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNyZWF0ZSgpIHtcclxuICAgIGlmICghdGhpcy5pc1ZhbGlkVG9DcmVhdGUpIHJldHVybjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IHRydWU7XHJcblxyXG4gICAgICBjb25zdCBwbGFub1JlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZVBsYW5vRnJvbUNBRChcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlISxcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSxcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vclxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghcGxhbm9SZXM/LmRhdGEpIHJldHVybjtcclxuXHJcbiAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UocGxhbm9SZXM/LmRhdGEpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVycm9yLmVycm9yLmVycm9yKTtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IG9uQ3JlYXRlIFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DbGlja0NyZWF0ZVN0b3JlKCkge31cclxuXHJcbiAgb25DYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmRpc21pc3MoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLXdyYXBwZXJcIj5cclxuICA8aDMgY2xhc3M9XCJtYi00XCI+Q3JlYXRlIHN0b3JlIGxheW91dC9wbGFuIGZyb20gQ0FEPC9oMz5cclxuICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbc2VhcmNoXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU3RvcmVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICBbZGF0YV09XCJzdG9yZUxpc3RcIiBbbGFiZWxdPVwiJ1NlbGVjdCBzdG9yZSdcIiBbYWN0aW9uXT1cInRydWVcIiAoYWN0aW9uQ2xpY2spPVwib25DbGlja0NyZWF0ZVN0b3JlKClcIlxyXG4gICAgICAgIFthY3Rpb25MYWJlbF09XCInQ3JlYXRlIG5ldyBzdG9yZSdcIiAobmdNb2RlbENoYW5nZSk9XCJvblN0b3JlQ2hhbmdlKClcIiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCI+XHJcbiAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRGbG9vclwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJmbG9vckxpc3RcIlxyXG4gICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmxvb3JDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIj5cclxuICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImxheW91dC1leGlzdC13cmFwcGVyXCIgW2NsYXNzLnNob3ddPVwiaXNMYXlvdXRFeGlzdFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImxheW91dC1leGlzdC13YXJuaW5nIG1iLTRcIj5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgPHBhdGhcclxuICAgICAgICAgIGQ9XCJNOS45OTk2NSA2LjY2NjY3VjEwTTkuOTk5NjUgMTMuMzMzM0gxMC4wMDhNOC41NzQ2NSAyLjM4MzM0TDEuNTE2MzIgMTQuMTY2N0MxLjM3MDc5IDE0LjQxODcgMS4yOTM3OSAxNC43MDQ0IDEuMjkyOTggMTQuOTk1NEMxLjI5MjE2IDE1LjI4NjUgMS4zNjc1NiAxNS41NzI2IDEuNTExNjcgMTUuODI1NEMxLjY1NTc5IDE2LjA3ODMgMS44NjM1OSAxNi4yODkgMi4xMTQ0MSAxNi40MzY2QzIuMzY1MjMgMTYuNTg0MSAyLjY1MDMyIDE2LjY2MzUgMi45NDEzMiAxNi42NjY3SDE3LjA1OEMxNy4zNDkgMTYuNjYzNSAxNy42MzQxIDE2LjU4NDEgMTcuODg0OSAxNi40MzY2QzE4LjEzNTcgMTYuMjg5IDE4LjM0MzUgMTYuMDc4MyAxOC40ODc2IDE1LjgyNTRDMTguNjMxNyAxNS41NzI2IDE4LjcwNzEgMTUuMjg2NSAxOC43MDYzIDE0Ljk5NTRDMTguNzA1NSAxNC43MDQ0IDE4LjYyODUgMTQuNDE4NyAxOC40ODMgMTQuMTY2N0wxMS40MjQ3IDIuMzgzMzRDMTEuMjc2MSAyLjEzODQzIDExLjA2NjkgMS45MzU5NCAxMC44MTczIDEuNzk1NDFDMTAuNTY3NyAxLjY1NDg4IDEwLjI4NjEgMS41ODEwNSA5Ljk5OTY1IDEuNTgxMDVDOS43MTMyMSAxLjU4MTA1IDkuNDMxNTkgMS42NTQ4OCA5LjE4MTk5IDEuNzk1NDFDOC45MzIzOCAxLjkzNTk0IDguNzIzMjEgMi4xMzg0MyA4LjU3NDY1IDIuMzgzMzRaXCJcclxuICAgICAgICAgIHN0cm9rZT1cIiNGMDQ0MzhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgPC9zdmc+XHJcblxyXG4gICAgICBUaGlzIHN0b3JlIGFscmVhZHkgaGFzIGEgRmxvb3Ige3tzZWxlY3RlZEZsb29yfX0gcGxhbm9ncmFtLiBPdmVyd3JpdGUgaXQ/IFRoaXMgY2Fu4oCZdCBiZSB1bmRvbmUuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgIDxmaWxlLXVwbG9hZCBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCIgKGZpbGVDaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIj48L2ZpbGUtdXBsb2FkPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWFjdGlvbnNcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IFwiIFtkaXNhYmxlZF09XCIhaXNWYWxpZFRvQ3JlYXRlIHx8IGlzUHJvY2Vzc2luZ1wiIChjbGljayk9XCJvbkNyZWF0ZSgpXCI+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiIWlzUHJvY2Vzc2luZ1wiPlxyXG4gICAgICAgIHt7aXNMYXlvdXRFeGlzdCA/ICAnT3ZlcndyaXRlJyA6ICdDcmVhdGUnfX1cclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgPHN2ZyAqbmdJZj1cImlzUHJvY2Vzc2luZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicGF0aFwiIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==