tango-app-ui-store-builder 1.0.47 → 1.0.49
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.
- package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +39 -19
- package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +233 -138
- package/esm2022/lib/components/fixture-template/template-assign-stores/preview-modal/preview-modal.component.mjs +4 -2
- package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +4 -2
- package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +40 -4
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-summary/template-summary.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +108 -79
- package/esm2022/lib/components/fixture-template-tree/fixture-template-tree.component.mjs +7 -3
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +4 -2
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +27 -4
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +10 -14
- package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +3 -3
- package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +4 -2
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.mjs +11 -5
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-locator.component.mjs +14 -9
- package/esm2022/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.mjs +39 -7
- package/esm2022/lib/components/planogram/merch-compliance/zone-products/zone-products.component.mjs +18 -5
- package/esm2022/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.mjs +68 -0
- package/esm2022/lib/components/planogram/plano-analytics/date-range-picker/date-range-picker.component.mjs +5 -5
- package/esm2022/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.mjs +649 -0
- package/esm2022/lib/components/planogram/plano-analytics/plano-analytics.component.mjs +1197 -25
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +14 -7
- package/esm2022/lib/components/planogram/plano-overview/plano-comparison/plano-comparison.component.mjs +8 -4
- package/esm2022/lib/components/planogram/plano-overview/plano-overview.component.mjs +17 -9
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +3 -3
- package/esm2022/lib/components/store-plano/store-plano-tree-view/store-plano-tree-view.component.mjs +3 -2
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +4 -2
- package/esm2022/lib/interfaces/fixture-library.interface.mjs +1 -1
- package/esm2022/lib/services/store-builder.service.mjs +4 -1
- package/esm2022/lib/tango-store-builder.module.mjs +8 -2
- package/fesm2022/tango-app-ui-store-builder.mjs +2996 -834
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/create-fixture/create-fixture.component.d.ts +15 -14
- package/lib/components/fixture-template/template-basic-details/template-basic-details.component.d.ts +2 -0
- package/lib/components/fixture-template/template-vms/template-vms.component.d.ts +12 -12
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +2 -2
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +4 -4
- package/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.d.ts +2 -0
- package/lib/components/manage-store-plano/template-vms/template-vms.component.d.ts +0 -1
- package/lib/components/planogram/merch-compliance/product-locator/misplaced-product-fixture/misplaced-product-fixture.component.d.ts +4 -2
- package/lib/components/planogram/merch-compliance/product-locator/product-locator.component.d.ts +3 -2
- package/lib/components/planogram/merch-compliance/product-locator/product-zone-locator/product-zone-locator.component.d.ts +10 -3
- package/lib/components/planogram/merch-compliance/zone-products/zone-products.component.d.ts +4 -2
- package/lib/components/planogram/plano-analytics/analytics-popup/analytics-popup.component.d.ts +25 -0
- package/lib/components/planogram/plano-analytics/fixture-analytics/fixture-analytics.component.d.ts +94 -0
- package/lib/components/planogram/plano-analytics/plano-analytics.component.d.ts +76 -3
- package/lib/components/planogram/plano-details-parent/plano-details-parent.component.d.ts +3 -2
- package/lib/interfaces/fixture-library.interface.d.ts +1 -1
- package/lib/services/store-builder.service.d.ts +1 -0
- package/lib/tango-store-builder.module.d.ts +26 -24
- package/package.json +1 -1
package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs
CHANGED
|
@@ -754,10 +754,10 @@ export class TemplateProductsComponent {
|
|
|
754
754
|
this.ps.fixtureTemplateDetails.next({ ...this.ps.fixtureTemplateDetails.value, ignoreUpdate: false });
|
|
755
755
|
}
|
|
756
756
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TemplateProductsComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.PlanoDataService }, { token: i4.ToastService }, { token: i5.GlobalStateService }, { token: i6.NgbModal }, { token: i5.PageInfoService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
757
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TemplateProductsComponent, isStandalone: true, selector: "lib-template-products", ngImport: i0, template: "<section id=\"fixture-template-products\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!-- ====================================Left Column==================================== -->\r\n <div class=\"cols col\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" [class.disabled-click]=\"!isEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let library of ['brand', 'product']\">\r\n <button\r\n class=\"nav-link w-100\"\r\n [class.active]=\"selectedLibrary === library\"\r\n (click)=\"selectedLibrary = library\"\r\n [attr.aria-current]=\"selectedLibrary === library ? 'page' : null\"\r\n >\r\n {{ library | titlecase }} Library\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"selectedLibrary === 'brand'\">\r\n <div *ngIf=\"selectedLevel !== 'spot'\">\r\n <h2>Add products by brand level</h2>\r\n <p>Place the product brand in the designated placement area.</p>\r\n </div>\r\n <!-- Fixture level within Brand Library -->\r\n <form [formGroup]=\"fixtureLevelForm\" *ngIf=\"selectedLevel === 'fixture'\">\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"brandsList\"\r\n [idField]=\"'brandName'\"\r\n [nameField]=\"'brandName'\"\r\n [placeholder]=\"'Select brands'\"\r\n formControlName=\"productBrandName\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n <!-- <ng-container\r\n *ngIf=\"fixtureLevelForm.get('productBrandName')?.touched && fixtureLevelForm.get('productBrandName')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"fixtureLevelForm.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [items]=\"categoriesList\"\r\n [placeholder]=\"'Select categories'\"\r\n formControlName=\"productCategory\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n </div>\r\n </form>\r\n\r\n <!-- Section level within Brand Library -->\r\n <form [formGroup]=\"sectionLevelForm\" *ngIf=\"selectedLevel === 'section'\">\r\n <div formArrayName=\"section\" class=\"array-wrapper\">\r\n <div *ngFor=\"let section of sectionArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">SECTION {{ i + 1 }}</h6>\r\n <svg\r\n [class.disabled-click]=\"!isEditMode\"\r\n *ngIf=\"i !== 0\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeSection(i)\"\r\n class=\"cursor-pointer\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zone\" class=\"form-label mb-1\">Section label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"label\" formControlName=\"zone\" />\r\n\r\n <ng-container *ngIf=\"section.get('zone')?.touched && section.get('zone')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('required')\"> Section name is required. </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('whitespace')\">\r\n Section name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('notUnique')\"> Duplicate section name. </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"shelves\" class=\"form-label mb-1\">Pick the shelf(s) for section {{ i + 1 }}</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"shelvesList\"\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n formControlName=\"shelves\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n <ng-container *ngIf=\"section.get('shelves')?.touched && section.get('shelves')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('shelves')?.hasError('required')\"> Pick the shelf(s) </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"brandsList\"\r\n [idField]=\"'brandName'\"\r\n [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"section.get('productBrandName')?.touched && section.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('section' + i) ?? []\"\r\n formControlName=\"productCategory\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n <span\r\n [ngbTooltip]=\"\r\n isAllShelvesUsedInSections\r\n ? 'All shelves are assigned. No shelves available for new sections.'\r\n : 'You cannot create more sections than the total shelves available.'\r\n \"\r\n [disableTooltip]=\"\r\n sectionArray.length < (fixtureTemplateDetails?.shelfConfig?.length ?? 0) && !isAllShelvesUsedInSections\r\n \"\r\n >\r\n <button\r\n [disabled]=\"\r\n sectionArray.length >= (fixtureTemplateDetails?.shelfConfig?.length ?? 0) || isAllShelvesUsedInSections\r\n \"\r\n class=\"btn btn-outline text-end\"\r\n (click)=\"addSection()\"\r\n >\r\n Add section\r\n </button>\r\n </span>\r\n </div>\r\n </form>\r\n\r\n <!-- Shelf level within Brand Library -->\r\n <form [formGroup]=\"shelfLevelForm\" *ngIf=\"selectedLevel === 'shelf'\">\r\n <div formArrayName=\"shelf\" class=\"array-wrapper\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <h6 class=\"shelf-title\">SHELF {{ i + 1 }}</h6>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"brandsList\"\r\n [idField]=\"'brandName'\"\r\n [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"shelf.get('productBrandName')?.touched && shelf.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('shelf' + i) ?? []\"\r\n formControlName=\"productCategory\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!-- Spot level within Brand Library -->\r\n <!-- <form [formGroup]=\"spotLevelForm\" *ngIf=\"selectedLevel === 'spot'\">Spot level Form</form> -->\r\n <div\r\n *ngIf=\"selectedLevel === 'spot'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\"\r\n style=\"height: 50vh\"\r\n >\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Coming soon for all levels -->\r\n <div\r\n *ngIf=\"selectedLibrary === 'product'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center mt-5\"\r\n >\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Start adding product from brand library</p>\r\n </div>\r\n </div>\r\n\r\n <!-- =======================================Right Column =======================================-->\r\n <div class=\"cols col-8\">\r\n <h6>Product brand placements</h6>\r\n\r\n <ul class=\"nav nav-tabs custom-tabs d-flex mt-4\" [class.disabled-click]=\"!isEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let level of ['fixture', 'section', 'shelf', 'spot']\">\r\n <button\r\n class=\"nav-link w-100\"\r\n [class.active]=\"selectedLevel === level\"\r\n (click)=\"setTab(level)\"\r\n [attr.aria-current]=\"selectedLevel === level ? 'page' : null\"\r\n >\r\n {{ level | titlecase }} level\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'fixture'\">\r\n <div id=\"fixture-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div\r\n id=\"brand-category\"\r\n class=\"brand-category\"\r\n *ngIf=\"fixtureLevelForm?.get('productBrandName')?.value?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'section'\">\r\n <div id=\"section-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" id=\"section-body-block\">\r\n <!---------------------------------------------------------------------->\r\n <!-- <div id=\"body-loader\">\r\n <div class=\"loader\"></div>\r\n </div> -->\r\n <!---------------------------------------------------------------------->\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n <!---------------------------------------------------------------------->\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'shelf'\">\r\n <div id=\"shelf-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!---------------------------------------------------------------------->\r\n <div\r\n [id]=\"'brand-category' + i\"\r\n class=\"brand-category\"\r\n *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\" *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\">\r\n <ng-container *ngFor=\"let b of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <ng-container *ngFor=\"let b of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n <!---------------------------------------------------------------------->\r\n\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'spot'\">\r\n <div class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\" style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Try Fixture, Section, and Shelf levels</p>\r\n </div>\r\n\r\n <!-- <div id=\"spot-level\" class=\"d-flex justify-content-center\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureWidth?.value }}{{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureLength?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf \">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product \"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block \">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product \"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-products-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}.custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}.custom-tabs .nav-link.active{background:var(--Primary-50, #eaf8ff)}.nav-item{text-align:center}.nav-item:last-child .nav-link{border:none}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px;border:1px solid white}#fixture-level .body-block{position:relative}#fixture-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(-50%,-50%);transition:all .3s ease;cursor:pointer}#fixture-level .brand,#fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-level .category{margin-top:12px}#section-level .body-block{position:relative}#section-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#section-level .brand,#section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#section-level .separator{margin:0 4px;font-weight:600}#section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#shelf-level .body-block{position:relative}#shelf-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#shelf-level .brand,#shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#shelf-level .separator{margin:0 4px;font-weight:600}\n"], dependencies: [{ kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "component", type: MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField"] }] });
|
|
757
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TemplateProductsComponent, isStandalone: true, selector: "lib-template-products", ngImport: i0, template: "<section id=\"fixture-template-products\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!-- ====================================Left Column==================================== -->\r\n <div class=\"cols col\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" [class.disabled-click]=\"!isEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let library of ['brand', 'product']\">\r\n <button class=\"nav-link w-100\" [class.active]=\"selectedLibrary === library\"\r\n (click)=\"selectedLibrary = library\" [attr.aria-current]=\"selectedLibrary === library ? 'page' : null\">\r\n {{ library | titlecase }} Library\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"selectedLibrary === 'brand'\">\r\n <div *ngIf=\"selectedLevel !== 'spot'\">\r\n <h2>Add products by brand level</h2>\r\n <p>Place the product brand in the designated placement area.</p>\r\n </div>\r\n <!-- Fixture level within Brand Library -->\r\n <form [formGroup]=\"fixtureLevelForm\" *ngIf=\"selectedLevel === 'fixture'\">\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n [placeholder]=\"'Select brands'\" formControlName=\"productBrandName\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container\r\n *ngIf=\"fixtureLevelForm.get('productBrandName')?.touched && fixtureLevelForm.get('productBrandName')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"fixtureLevelForm.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\" [items]=\"categoriesList\"\r\n [placeholder]=\"'Select categories'\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </form>\r\n\r\n <!-- Section level within Brand Library -->\r\n <form [formGroup]=\"sectionLevelForm\" *ngIf=\"selectedLevel === 'section'\">\r\n <div formArrayName=\"section\" class=\"array-wrapper\">\r\n <div *ngFor=\"let section of sectionArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">SECTION {{ i + 1 }}</h6>\r\n <svg [class.disabled-click]=\"!isEditMode\" *ngIf=\"i !== 0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeSection(i)\" class=\"cursor-pointer\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zone\" class=\"form-label mb-1\">Section label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"label\" formControlName=\"zone\" />\r\n\r\n <ng-container *ngIf=\"section.get('zone')?.touched && section.get('zone')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('required')\"> Section name is\r\n required. </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('whitespace')\">\r\n Section name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('notUnique')\"> Duplicate section name.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"shelves\" class=\"form-label mb-1\">Pick the shelf(s) for section {{ i + 1 }}</label>\r\n <multiselect-chip-dropdown [items]=\"shelvesList\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n formControlName=\"shelves\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <ng-container *ngIf=\"section.get('shelves')?.touched && section.get('shelves')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('shelves')?.hasError('required')\"> Pick the shelf(s)\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"section.get('productBrandName')?.touched && section.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('section' + i) ?? []\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n <span [ngbTooltip]=\"\r\n isAllShelvesUsedInSections\r\n ? 'All shelves are assigned. No shelves available for new sections.'\r\n : 'You cannot create more sections than the total shelves available.'\r\n \" [disableTooltip]=\"\r\n sectionArray.length < (fixtureTemplateDetails?.shelfConfig?.length ?? 0) && !isAllShelvesUsedInSections\r\n \">\r\n <button [disabled]=\"\r\n sectionArray.length >= (fixtureTemplateDetails?.shelfConfig?.length ?? 0) || isAllShelvesUsedInSections\r\n \" class=\"btn btn-outline text-end\" (click)=\"addSection()\">\r\n Add section\r\n </button>\r\n </span>\r\n </div>\r\n </form>\r\n\r\n <!-- Shelf level within Brand Library -->\r\n <form [formGroup]=\"shelfLevelForm\" *ngIf=\"selectedLevel === 'shelf'\">\r\n <div formArrayName=\"shelf\" class=\"array-wrapper\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <h6 class=\"shelf-title\">SHELF {{ i + 1 }}</h6>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"shelf.get('productBrandName')?.touched && shelf.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('shelf' + i) ?? []\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!-- Spot level within Brand Library -->\r\n <!-- <form [formGroup]=\"spotLevelForm\" *ngIf=\"selectedLevel === 'spot'\">Spot level Form</form> -->\r\n <div *ngIf=\"selectedLevel === 'spot'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\" style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Coming soon for all levels -->\r\n <div *ngIf=\"selectedLibrary === 'product'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center mt-5\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Start adding product from brand library</p>\r\n </div>\r\n </div>\r\n\r\n <!-- =======================================Right Column =======================================-->\r\n <div class=\"cols col-8\">\r\n <h6>Product brand placements</h6>\r\n\r\n <ul class=\"nav nav-tabs custom-tabs d-flex mt-4\" [class.disabled-click]=\"!isEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let level of ['fixture', 'section', 'shelf', 'spot']\">\r\n <button class=\"nav-link w-100\" [class.active]=\"selectedLevel === level\" (click)=\"setTab(level)\"\r\n [attr.aria-current]=\"selectedLevel === level ? 'page' : null\">\r\n {{ level | titlecase }} level\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'fixture'\">\r\n <div id=\"fixture-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div id=\"brand-category\" class=\"brand-category\"\r\n *ngIf=\"fixtureLevelForm?.get('productBrandName')?.value?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'section'\">\r\n <div id=\"section-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" id=\"section-body-block\">\r\n <!---------------------------------------------------------------------->\r\n <!-- <div id=\"body-loader\">\r\n <div class=\"loader\"></div>\r\n </div> -->\r\n <!---------------------------------------------------------------------->\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n <!---------------------------------------------------------------------->\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'shelf'\">\r\n <div id=\"shelf-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!---------------------------------------------------------------------->\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\"\r\n *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\" *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\">\r\n <ng-container\r\n *ngFor=\"let b of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\" class=\"separator\"> -\r\n </span>\r\n <span class=\"category\" *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <ng-container\r\n *ngFor=\"let b of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container\r\n *ngFor=\"let c of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container\r\n *ngFor=\"let c of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n <!---------------------------------------------------------------------->\r\n\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'spot'\">\r\n <div class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\"\r\n style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Try Fixture, Section, and Shelf levels</p>\r\n </div>\r\n\r\n <!-- <div id=\"spot-level\" class=\"d-flex justify-content-center\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureWidth?.value }}{{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureLength?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf \">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product \"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block \">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product \"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-products-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}.custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}.custom-tabs .nav-link.active{background:var(--Primary-50, #eaf8ff)}.nav-item{text-align:center}.nav-item:last-child .nav-link{border:none}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px;border:1px solid white}#fixture-level .body-block{position:relative}#fixture-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(-50%,-50%);transition:all .3s ease;cursor:pointer}#fixture-level .brand,#fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-level .category{margin-top:12px}#section-level .body-block{position:relative}#section-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#section-level .brand,#section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#section-level .separator{margin:0 4px;font-weight:600}#section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#shelf-level .body-block{position:relative}#shelf-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#shelf-level .brand,#shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#shelf-level .separator{margin:0 4px;font-weight:600}\n"], dependencies: [{ kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "component", type: MultiselectChipDropdownComponent, selector: "multiselect-chip-dropdown", inputs: ["idField", "nameField", "placeholder", "items", "search", "searchField"] }] });
|
|
758
758
|
}
|
|
759
759
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TemplateProductsComponent, decorators: [{
|
|
760
760
|
type: Component,
|
|
761
|
-
args: [{ selector: 'lib-template-products', standalone: true, imports: [NgbTooltip, FormsModule, ReactiveFormsModule, CommonModule, NgbAccordionModule, MultiselectChipDropdownComponent], template: "<section id=\"fixture-template-products\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!-- ====================================Left Column==================================== -->\r\n <div class=\"cols col\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" [class.disabled-click]=\"!isEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let library of ['brand', 'product']\">\r\n <button\r\n class=\"nav-link w-100\"\r\n [class.active]=\"selectedLibrary === library\"\r\n (click)=\"selectedLibrary = library\"\r\n [attr.aria-current]=\"selectedLibrary === library ? 'page' : null\"\r\n >\r\n {{ library | titlecase }} Library\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"selectedLibrary === 'brand'\">\r\n <div *ngIf=\"selectedLevel !== 'spot'\">\r\n <h2>Add products by brand level</h2>\r\n <p>Place the product brand in the designated placement area.</p>\r\n </div>\r\n <!-- Fixture level within Brand Library -->\r\n <form [formGroup]=\"fixtureLevelForm\" *ngIf=\"selectedLevel === 'fixture'\">\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"brandsList\"\r\n [idField]=\"'brandName'\"\r\n [nameField]=\"'brandName'\"\r\n [placeholder]=\"'Select brands'\"\r\n formControlName=\"productBrandName\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n <!-- <ng-container\r\n *ngIf=\"fixtureLevelForm.get('productBrandName')?.touched && fixtureLevelForm.get('productBrandName')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"fixtureLevelForm.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [items]=\"categoriesList\"\r\n [placeholder]=\"'Select categories'\"\r\n formControlName=\"productCategory\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n </div>\r\n </form>\r\n\r\n <!-- Section level within Brand Library -->\r\n <form [formGroup]=\"sectionLevelForm\" *ngIf=\"selectedLevel === 'section'\">\r\n <div formArrayName=\"section\" class=\"array-wrapper\">\r\n <div *ngFor=\"let section of sectionArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">SECTION {{ i + 1 }}</h6>\r\n <svg\r\n [class.disabled-click]=\"!isEditMode\"\r\n *ngIf=\"i !== 0\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeSection(i)\"\r\n class=\"cursor-pointer\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zone\" class=\"form-label mb-1\">Section label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"label\" formControlName=\"zone\" />\r\n\r\n <ng-container *ngIf=\"section.get('zone')?.touched && section.get('zone')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('required')\"> Section name is required. </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('whitespace')\">\r\n Section name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('notUnique')\"> Duplicate section name. </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"shelves\" class=\"form-label mb-1\">Pick the shelf(s) for section {{ i + 1 }}</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"shelvesList\"\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n formControlName=\"shelves\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n <ng-container *ngIf=\"section.get('shelves')?.touched && section.get('shelves')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('shelves')?.hasError('required')\"> Pick the shelf(s) </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"brandsList\"\r\n [idField]=\"'brandName'\"\r\n [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"section.get('productBrandName')?.touched && section.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('section' + i) ?? []\"\r\n formControlName=\"productCategory\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n <span\r\n [ngbTooltip]=\"\r\n isAllShelvesUsedInSections\r\n ? 'All shelves are assigned. No shelves available for new sections.'\r\n : 'You cannot create more sections than the total shelves available.'\r\n \"\r\n [disableTooltip]=\"\r\n sectionArray.length < (fixtureTemplateDetails?.shelfConfig?.length ?? 0) && !isAllShelvesUsedInSections\r\n \"\r\n >\r\n <button\r\n [disabled]=\"\r\n sectionArray.length >= (fixtureTemplateDetails?.shelfConfig?.length ?? 0) || isAllShelvesUsedInSections\r\n \"\r\n class=\"btn btn-outline text-end\"\r\n (click)=\"addSection()\"\r\n >\r\n Add section\r\n </button>\r\n </span>\r\n </div>\r\n </form>\r\n\r\n <!-- Shelf level within Brand Library -->\r\n <form [formGroup]=\"shelfLevelForm\" *ngIf=\"selectedLevel === 'shelf'\">\r\n <div formArrayName=\"shelf\" class=\"array-wrapper\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <h6 class=\"shelf-title\">SHELF {{ i + 1 }}</h6>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown\r\n [items]=\"brandsList\"\r\n [idField]=\"'brandName'\"\r\n [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"shelf.get('productBrandName')?.touched && shelf.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('shelf' + i) ?? []\"\r\n formControlName=\"productCategory\"\r\n [search]=\"true\"\r\n ></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!-- Spot level within Brand Library -->\r\n <!-- <form [formGroup]=\"spotLevelForm\" *ngIf=\"selectedLevel === 'spot'\">Spot level Form</form> -->\r\n <div\r\n *ngIf=\"selectedLevel === 'spot'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\"\r\n style=\"height: 50vh\"\r\n >\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Coming soon for all levels -->\r\n <div\r\n *ngIf=\"selectedLibrary === 'product'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center mt-5\"\r\n >\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Start adding product from brand library</p>\r\n </div>\r\n </div>\r\n\r\n <!-- =======================================Right Column =======================================-->\r\n <div class=\"cols col-8\">\r\n <h6>Product brand placements</h6>\r\n\r\n <ul class=\"nav nav-tabs custom-tabs d-flex mt-4\" [class.disabled-click]=\"!isEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let level of ['fixture', 'section', 'shelf', 'spot']\">\r\n <button\r\n class=\"nav-link w-100\"\r\n [class.active]=\"selectedLevel === level\"\r\n (click)=\"setTab(level)\"\r\n [attr.aria-current]=\"selectedLevel === level ? 'page' : null\"\r\n >\r\n {{ level | titlecase }} level\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'fixture'\">\r\n <div id=\"fixture-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div\r\n id=\"brand-category\"\r\n class=\"brand-category\"\r\n *ngIf=\"fixtureLevelForm?.get('productBrandName')?.value?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'section'\">\r\n <div id=\"section-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" id=\"section-body-block\">\r\n <!---------------------------------------------------------------------->\r\n <!-- <div id=\"body-loader\">\r\n <div class=\"loader\"></div>\r\n </div> -->\r\n <!---------------------------------------------------------------------->\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n <!---------------------------------------------------------------------->\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'shelf'\">\r\n <div id=\"shelf-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!---------------------------------------------------------------------->\r\n <div\r\n [id]=\"'brand-category' + i\"\r\n class=\"brand-category\"\r\n *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\"\r\n >\r\n <span class=\"brand\" *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\">\r\n <ng-container *ngFor=\"let b of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <ng-container *ngFor=\"let b of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let c of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n <!---------------------------------------------------------------------->\r\n\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'spot'\">\r\n <div class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\" style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Try Fixture, Section, and Shelf levels</p>\r\n </div>\r\n\r\n <!-- <div id=\"spot-level\" class=\"d-flex justify-content-center\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureWidth?.value }}{{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureLength?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf \">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product \"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block \">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product \"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-products-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}.custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}.custom-tabs .nav-link.active{background:var(--Primary-50, #eaf8ff)}.nav-item{text-align:center}.nav-item:last-child .nav-link{border:none}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px;border:1px solid white}#fixture-level .body-block{position:relative}#fixture-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(-50%,-50%);transition:all .3s ease;cursor:pointer}#fixture-level .brand,#fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-level .category{margin-top:12px}#section-level .body-block{position:relative}#section-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#section-level .brand,#section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#section-level .separator{margin:0 4px;font-weight:600}#section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#shelf-level .body-block{position:relative}#shelf-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#shelf-level .brand,#shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#shelf-level .separator{margin:0 4px;font-weight:600}\n"] }]
|
|
761
|
+
args: [{ selector: 'lib-template-products', standalone: true, imports: [NgbTooltip, FormsModule, ReactiveFormsModule, CommonModule, NgbAccordionModule, MultiselectChipDropdownComponent], template: "<section id=\"fixture-template-products\" *ngIf=\"!isPageLoading\">\r\n <div class=\"row gap-4 builder\">\r\n <!-- ====================================Left Column==================================== -->\r\n <div class=\"cols col\">\r\n <ul class=\"nav nav-tabs custom-tabs d-flex\" [class.disabled-click]=\"!isEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let library of ['brand', 'product']\">\r\n <button class=\"nav-link w-100\" [class.active]=\"selectedLibrary === library\"\r\n (click)=\"selectedLibrary = library\" [attr.aria-current]=\"selectedLibrary === library ? 'page' : null\">\r\n {{ library | titlecase }} Library\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <div *ngIf=\"selectedLibrary === 'brand'\">\r\n <div *ngIf=\"selectedLevel !== 'spot'\">\r\n <h2>Add products by brand level</h2>\r\n <p>Place the product brand in the designated placement area.</p>\r\n </div>\r\n <!-- Fixture level within Brand Library -->\r\n <form [formGroup]=\"fixtureLevelForm\" *ngIf=\"selectedLevel === 'fixture'\">\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n [placeholder]=\"'Select brands'\" formControlName=\"productBrandName\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container\r\n *ngIf=\"fixtureLevelForm.get('productBrandName')?.touched && fixtureLevelForm.get('productBrandName')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"fixtureLevelForm.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\" [items]=\"categoriesList\"\r\n [placeholder]=\"'Select categories'\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </form>\r\n\r\n <!-- Section level within Brand Library -->\r\n <form [formGroup]=\"sectionLevelForm\" *ngIf=\"selectedLevel === 'section'\">\r\n <div formArrayName=\"section\" class=\"array-wrapper\">\r\n <div *ngFor=\"let section of sectionArray?.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">SECTION {{ i + 1 }}</h6>\r\n <svg [class.disabled-click]=\"!isEditMode\" *ngIf=\"i !== 0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" (click)=\"removeSection(i)\" class=\"cursor-pointer\">\r\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"zone\" class=\"form-label mb-1\">Section label</label>\r\n <input type=\"text\" class=\"form-control\" id=\"label\" formControlName=\"zone\" />\r\n\r\n <ng-container *ngIf=\"section.get('zone')?.touched && section.get('zone')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('required')\"> Section name is\r\n required. </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('whitespace')\">\r\n Section name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"section.get('zone')?.hasError('notUnique')\"> Duplicate section name.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"shelves\" class=\"form-label mb-1\">Pick the shelf(s) for section {{ i + 1 }}</label>\r\n <multiselect-chip-dropdown [items]=\"shelvesList\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n formControlName=\"shelves\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <ng-container *ngIf=\"section.get('shelves')?.touched && section.get('shelves')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('shelves')?.hasError('required')\"> Pick the shelf(s)\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"section.get('productBrandName')?.touched && section.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"section.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('section' + i) ?? []\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"w-100 d-flex justify-content-end mt-4\">\r\n <span [ngbTooltip]=\"\r\n isAllShelvesUsedInSections\r\n ? 'All shelves are assigned. No shelves available for new sections.'\r\n : 'You cannot create more sections than the total shelves available.'\r\n \" [disableTooltip]=\"\r\n sectionArray.length < (fixtureTemplateDetails?.shelfConfig?.length ?? 0) && !isAllShelvesUsedInSections\r\n \">\r\n <button [disabled]=\"\r\n sectionArray.length >= (fixtureTemplateDetails?.shelfConfig?.length ?? 0) || isAllShelvesUsedInSections\r\n \" class=\"btn btn-outline text-end\" (click)=\"addSection()\">\r\n Add section\r\n </button>\r\n </span>\r\n </div>\r\n </form>\r\n\r\n <!-- Shelf level within Brand Library -->\r\n <form [formGroup]=\"shelfLevelForm\" *ngIf=\"selectedLevel === 'shelf'\">\r\n <div formArrayName=\"shelf\" class=\"array-wrapper\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-container\">\r\n <!-- [ngStyle]=\"{ 'border-color': shelfColors[i].bg }\" -->\r\n <h6 class=\"shelf-title\">SHELF {{ i + 1 }}</h6>\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productBrandName\" class=\"form-label mb-1\">Brand</label>\r\n <multiselect-chip-dropdown [items]=\"brandsList\" [idField]=\"'brandName'\" [nameField]=\"'brandName'\"\r\n formControlName=\"productBrandName\" [search]=\"true\"></multiselect-chip-dropdown>\r\n <!-- <ng-container *ngIf=\"shelf.get('productBrandName')?.touched && shelf.get('productBrandName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productBrandName')?.hasError('required')\">\r\n Please select product brand\r\n </small>\r\n </ng-container> -->\r\n </div>\r\n\r\n <div class=\"form-group mb-4\">\r\n <label for=\"productCategory\" class=\"form-label mb-1\">Product category</label>\r\n <multiselect-chip-dropdown [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [items]=\"categoriesListMap.get('shelf' + i) ?? []\" formControlName=\"productCategory\"\r\n [search]=\"true\"></multiselect-chip-dropdown>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!-- Spot level within Brand Library -->\r\n <!-- <form [formGroup]=\"spotLevelForm\" *ngIf=\"selectedLevel === 'spot'\">Spot level Form</form> -->\r\n <div *ngIf=\"selectedLevel === 'spot'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\" style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet.</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Coming soon for all levels -->\r\n <div *ngIf=\"selectedLibrary === 'product'\"\r\n class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center mt-5\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Start adding product from brand library</p>\r\n </div>\r\n </div>\r\n\r\n <!-- =======================================Right Column =======================================-->\r\n <div class=\"cols col-8\">\r\n <h6>Product brand placements</h6>\r\n\r\n <ul class=\"nav nav-tabs custom-tabs d-flex mt-4\" [class.disabled-click]=\"!isEditMode\">\r\n <li class=\"nav-item flex-fill\" *ngFor=\"let level of ['fixture', 'section', 'shelf', 'spot']\">\r\n <button class=\"nav-link w-100\" [class.active]=\"selectedLevel === level\" (click)=\"setTab(level)\"\r\n [attr.aria-current]=\"selectedLevel === level ? 'page' : null\">\r\n {{ level | titlecase }} level\r\n </button>\r\n </li>\r\n </ul>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'fixture'\">\r\n <div id=\"fixture-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureWidth?.value\r\n }\r\n \"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div id=\"brand-category\" class=\"brand-category\"\r\n *ngIf=\"fixtureLevelForm?.get('productBrandName')?.value?.length\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\">\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n <span class=\"badge draft me-1\">\r\n {{ b }}\r\n </span>\r\n </ng-container>\r\n </span>\r\n <span class=\"category\" *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container *ngFor=\"let b of fixtureLevelForm?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"fixtureLevelForm?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container *ngFor=\"let c of fixtureLevelForm?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'section'\">\r\n <div id=\"section-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>{{ fixtureTemplateDetails?.header?.label }}</p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" id=\"section-body-block\">\r\n <!---------------------------------------------------------------------->\r\n <!-- <div id=\"body-loader\">\r\n <div class=\"loader\"></div>\r\n </div> -->\r\n <!---------------------------------------------------------------------->\r\n @for (item of sectionByZones; track $index) {\r\n <div [id]=\"'brand-category' + $index\" class=\"brand-category\" [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"badge draft me-1\">\r\n {{ item.zone }}\r\n </span>\r\n <div class=\"w-100 d-flex justify-content-center\">\r\n <span class=\"brand\" *ngIf=\"item?.section?.brands?.length\">\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n <span *ngIf=\"item?.section?.categories?.length\" class=\"separator\"> - </span>\r\n <span class=\"category\" *ngIf=\"item?.section?.categories?.length\">\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n @for (b of item?.section?.brands;track $index; let last = $last) {\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n <p *ngIf=\"item?.section?.categories?.length\">\r\n <b>Categories: </b>\r\n @for (c of item?.section?.categories;track $index; let last = $last) {\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n }\r\n </p>\r\n </div>\r\n </ng-template>\r\n }\r\n <!---------------------------------------------------------------------->\r\n\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'shelf'\">\r\n <div id=\"shelf-level\" class=\"d-flex justify-content-center\">\r\n <!-- Vertical arrows -->\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureLength?.value }}{{ fixtureTemplateDetails?.fixtureLength?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <!-- Horizontal arrows -->\r\n <ng-container\r\n *ngTemplateOutlet=\"dimensionArrows; context: { value: fixtureTemplateDetails?.fixtureWidth?.value }\"></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header block -->\r\n <div class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <!-- Body block -->\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n <!---------------------------------------------------------------------->\r\n <div [id]=\"'brand-category' + i\" class=\"brand-category\"\r\n *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\"\r\n [ngbTooltip]=\"brandCategoryTooltip\">\r\n <span class=\"brand\" *ngIf=\"shelfArray.controls[i]?.get('productBrandName')?.value?.length\">\r\n <ng-container\r\n *ngFor=\"let b of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n <span *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\" class=\"separator\"> -\r\n </span>\r\n <span class=\"category\" *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <ng-container\r\n *ngFor=\"let b of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ b }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <ng-template #brandCategoryTooltip>\r\n <div>\r\n <p>\r\n <b>Brands: </b>\r\n <ng-container\r\n *ngFor=\"let c of shelfArray.controls[i]?.get('productBrandName')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n <p *ngIf=\"shelfArray.controls[i]?.get('productCategory')?.value?.length\">\r\n <b>Categories: </b>\r\n <ng-container\r\n *ngFor=\"let c of shelfArray.controls[i]?.get('productCategory')?.value; let last = last\">\r\n {{ c }}\r\n <ng-container *ngIf=\"!last\">, </ng-container>\r\n </ng-container>\r\n </p>\r\n </div>\r\n </ng-template>\r\n <!---------------------------------------------------------------------->\r\n\r\n <!-- [NOTE] below block is identified by the function using 'lastElement' getter in DOM manipulation. \r\n So keep this block always at the bottom of this ngFor loop -->\r\n @if(item.shelfType ==='tray'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product\"></div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer block -->\r\n <div class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\">\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedLevel === 'spot'\">\r\n <div class=\"d-flex flex-column w-100 justify-content-center align-items-center text-center\"\r\n style=\"height: 50vh\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M37 37L32.65 32.65M35 27C35 31.4183 31.4183 35 27 35C22.5817 35 19 31.4183 19 27C19 22.5817 22.5817 19 27 19C31.4183 19 35 22.5817 35 27Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"mt-5 mb-2\">Coming soon</h3>\r\n <p>This feature is not available yet. Try Fixture, Section, and Shelf levels</p>\r\n </div>\r\n\r\n <!-- <div id=\"spot-level\" class=\"d-flex justify-content-center\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span>{{ fixtureTemplateDetails?.fixtureWidth?.value }}{{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: fixtureTemplateDetails?.fixtureLength?.value\r\n }\r\n \"\r\n ></ng-container>\r\n\r\n <div class=\"wall-viewport\">\r\n <div\r\n class=\"header-block\"\r\n *ngIf=\"fixtureTemplateDetails?.header?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <p>\r\n {{ fixtureTemplateDetails?.header?.label }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"body-block\" *ngIf=\"(fixtureTemplateDetails?.shelfConfig?.length ?? 0) > 0\">\r\n <div *ngFor=\"let item of fixtureTemplateDetails?.shelfConfig; let i = index\">\r\n @if(item.shelfType ==='shelf'){\r\n <div [id]=\"item.shelfType + (i + 1)\" class=\"block shelf \">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product \"></div>\r\n </div>\r\n }@else {\r\n <div [id]=\"item.shelfType! + (i + 1)\" class=\"block \">\r\n <div *ngFor=\"let product of [].constructor(item.trayRows)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.productPerShelf)\" class=\"product \"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"footer-block\"\r\n *ngIf=\"fixtureTemplateDetails?.footer?.isEnabled && fixtureTemplateDetails?.fixtureType === 'wall'\"\r\n >\r\n <div class=\"sub-footer left-box\"></div>\r\n <div class=\"sub-footer right-box\"></div>\r\n <p>{{ fixtureTemplateDetails?.footer?.label }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"fixture-template-products-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span>{{ value }} {{ fixtureTemplateDetails?.fixtureWidth?.unit }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.badge.draft{color:#009bf3;background:#eaf8ff}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.custom-tabs{border-radius:8px;border:1px solid var(--Gray-300, #d0d5dd);overflow:hidden;margin-bottom:24px}.custom-tabs .nav-link{border-radius:0%;color:#495057;padding:.75rem 1rem;background-color:#fff;text-align:center;border-right:1px solid var(--Gray-300, #d0d5dd);transition:all ease .2s;font-weight:500}.custom-tabs .nav-link.active{background:var(--Primary-50, #eaf8ff)}.nav-item{text-align:center}.nav-item:last-child .nav-link{border:none}.footer-block{position:relative;box-sizing:border-box;justify-content:space-between!important}.footer-block p{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background-color:#f2f4f7;z-index:1}.sub-footer{position:relative;width:48%}.array-wrapper{border-radius:4px;background:var(--Gray-50, #f9fafb);padding:16px}.array-container{border-radius:6px;padding:12px;background:#fff;margin-bottom:12px;border:1px solid white}#fixture-level .body-block{position:relative}#fixture-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid var(--Primary-200, #99daff);background:var(--White, #fff);top:50%;left:50%;transform:translate(-50%,-50%);transition:all .3s ease;cursor:pointer}#fixture-level .brand,#fixture-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis}#fixture-level .category{margin-top:12px}#section-level .body-block{position:relative}#section-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer}#section-level .brand,#section-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#section-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#section-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#section-level .separator{margin:0 4px;font-weight:600}#section-level #body-loader{height:100%;width:100%;position:absolute;display:flex;justify-content:center;align-items:center;z-index:1;background:#fff3;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(10px)}#section-level #body-loader .loader{width:30px;height:30px;border:4px solid #f3f3f3;border-top:4px solid #00a3ff;border-radius:50%;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#shelf-level .body-block{position:relative}#shelf-level .brand-category{position:absolute;max-width:90%;min-width:123px;overflow:hidden;padding:8px 4px;border-radius:2px;border:1.12px solid;transition:all .3s ease;display:flex;justify-content:center;cursor:pointer}#shelf-level .brand,#shelf-level .category{white-space:nowrap;overflow:hidden;display:block;text-overflow:ellipsis;max-width:fit-content;width:100%}#shelf-level .brand{color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:400;line-height:18px;margin:0}#shelf-level .category{color:var(--Gray-800, #1d2939);font-size:12px;font-style:normal;font-weight:600;line-height:18px;margin:0}#shelf-level .separator{margin:0 4px;font-weight:600}\n"] }]
|
|
762
762
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.PlanoDataService }, { type: i4.ToastService }, { type: i5.GlobalStateService }, { type: i6.NgbModal }, { type: i5.PageInfoService }, { type: i0.ChangeDetectorRef }] });
|
|
763
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtcHJvZHVjdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvZml4dHVyZS10ZW1wbGF0ZS90ZW1wbGF0ZS1wcm9kdWN0cy90ZW1wbGF0ZS1wcm9kdWN0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9maXh0dXJlLXRlbXBsYXRlL3RlbXBsYXRlLXByb2R1Y3RzL3RlbXBsYXRlLXByb2R1Y3RzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQW9CLFNBQVMsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFxQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQVksVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoSCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUNuSCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQzs7Ozs7Ozs7O0FBU3ZILE1BQU0sT0FBTyx5QkFBeUI7SUFxQzFCO0lBQ0E7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bk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBOZ2JBY2NvcmRpb25Nb2R1bGUsIE5nYk1vZGFsLCBOZ2JUb29sdGlwIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzLCBTZWN0aW9uQ29uZmlnLCBTaGVsZkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZml4dHVyZS10ZW1wbGF0ZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBEcm9wZG93bklGIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9wbGFuby1nZW5lcmFsLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wbGFuby1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCcmFuZERldGFpbHMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL3ZtLWxpYnJhcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgU0hFTEZfQ09MT1JTIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS9maXh0dXJlLXRlbXBsYXRlLmRhdGEnO1xyXG5pbXBvcnQgeyBnZW5lcmFsVmFsaWRhdG9yLCByZ2JUb0hleCwgdW5pcXVlRmllbGRJbkZvcm1BcnJheVZhbGlkYXRvciB9IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9ucy9wbGFuby5mdW5jdGlvbic7XHJcbmltcG9ydCB7IENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcG9wdXBzL2NvbXBsZXRlLWNvbmZpcm1hdGlvbi9jb21wbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTXVsdGlzZWxlY3RDaGlwRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duL211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24uY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRlbXBsYXRlLXByb2R1Y3RzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUtcHJvZHVjdHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90ZW1wbGF0ZS1wcm9kdWN0cy5jb21wb25lbnQuc2NzcycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTmdiVG9vbHRpcCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZSwgTmdiQWNjb3JkaW9uTW9kdWxlLCBNdWx0aXNlbGVjdENoaXBEcm9wZG93bkNvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlUHJvZHVjdHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzOiBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzIHwgbnVsbDtcclxuICBzZWxlY3RlZExldmVsOiAnZml4dHVyZScgfCAnc2VjdGlvbicgfCAnc2hlbGYnIHwgJ3Nwb3QnIHwgc3RyaW5nID0gJ2ZpeHR1cmUnO1xyXG5cclxuICBzZWxlY3RlZExpYnJhcnk6ICdwcm9kdWN0JyB8ICdicmFuZCcgfCBzdHJpbmcgPSAnYnJhbmQnO1xyXG5cclxuICBpc1BhZ2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGJyYW5kc0xpc3Q6IEJyYW5kRGV0YWlsc1tdID0gW11cclxuICBjYXRlZ29yaWVzTGlzdDogRHJvcGRvd25JRltdID0gW11cclxuICBjYXRlZ29yaWVzTGlzdE1hcDogTWFwPHN0cmluZywgRHJvcGRvd25JRltdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgc2hlbHZlc0xpc3Q6IERyb3Bkb3duSUZbXTtcclxuXHJcbiAgZml4dHVyZUxldmVsRm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlY3Rpb25MZXZlbEZvcm06IEZvcm1Hcm91cDtcclxuICBzaGVsZkxldmVsRm9ybTogRm9ybUdyb3VwO1xyXG4gIHNwb3RMZXZlbEZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgc2hlbGZDb2xvcnMgPSBTSEVMRl9DT0xPUlM7XHJcblxyXG4gIHNlY3Rpb25CeVpvbmVzOiB7XHJcbiAgICB6b25lOiBzdHJpbmcsXHJcbiAgICBzZWN0aW9uOiB7XHJcbiAgICAgIGJyYW5kczogc3RyaW5nW10sXHJcbiAgICAgIGNhdGVnb3JpZXM6IHN0cmluZ1tdLFxyXG4gICAgICBzaGVsdmVzOiBzdHJpbmdbXSxcclxuICAgICAgc2hlbGZEaXZzOiAoSFRNTEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkKVtdXHJcbiAgICB9XHJcbiAgfVtdID0gW11cclxuXHJcbiAgcHJpdmF0ZSBpc1ZpZXdwb3J0SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcHM6IFBsYW5vRGF0YVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5nYk1vZGFsOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICkgeyB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZShhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5icmFuZHNMaXN0ID0gZSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMucHMuZmV0Y2hCcmFuZHNMaXN0KHRoaXMuY2xpZW50SWQpO1xyXG5cclxuICAgICAgICB0aGlzLnBzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZmlsdGVyKGRhdGEgPT4gIWRhdGE/Lmlnbm9yZVVwZGF0ZSkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyA9IGRhdGE7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUGFnZUxvYWRpbmcpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2hlbHZlc0xpc3QgPSB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKGUpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBgJHtlPy5zaGVsZlR5cGU/LnRvVXBwZXJDYXNlKCl9ICR7ZT8uc2hlbGZOdW1iZXJ9YCxcclxuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogYCR7ZT8uc2hlbGZUeXBlfSAke2U/LnNoZWxmTnVtYmVyfWAsXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSA/PyBbXVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRUYWJCeUxldmVsKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpeHR1cmVMZXZlbEZvcm0oKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0U2VjdGlvbkxldmVsRm9ybSgpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRTaGVsZkxldmVsRm9ybSgpXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFNwb3RMZXZlbEZvcm0oKTtcclxuICAgICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuVG9BbGxGb3JtQ2hhbmdlcygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbU1hcFxyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZShwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzRWRpdE1vZGUgPSBwYXJhbXMuZ2V0KCdpc0VkaXQnKSA9PT0gJ3RydWUnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaGVsZkxldmVsRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICB0aGlzLnNwb3RMZXZlbEZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2hlbGZMZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuc3BvdExldmVsRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnBzLmZpeHR1cmVUZW1wbGF0ZUZvcm0kXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB0aGlzLnN1Ym1pdEZvcm0oZGF0YSkpO1xyXG4gICAgICB9KTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiUHJvZHVjdHNcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAgeyB0aXRsZTogXCJQbGFub2dyYW1cIiwgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiRml4dHVyZSBUZW1wbGF0ZVwiLCBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL2ZpeHR1cmUtdGVtcGxhdGVzXCIsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiXCIsIHBhdGg6IFwiXCIsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzVmlld3BvcnRJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzVmlld3BvcnRJbml0aWFsaXplZCA9IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGFiQnlMZXZlbCgpIHtcclxuICAgIHN3aXRjaCAodGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsKSB7XHJcbiAgICAgIGNhc2UgJ0wxJzpcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTGV2ZWwgPSAnZml4dHVyZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0wyJzpcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTGV2ZWwgPSAnc2hlbGYnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdMMyc6XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExldmVsID0gJ3NlY3Rpb24nO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdMNCc6XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExldmVsID0gJ3Nwb3QnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IGxldmVsOiB0aGlzLnNlbGVjdGVkTGV2ZWwgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMZXZlbEJ5VGFiKCkge1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSAnZml4dHVyZSc6XHJcbiAgICAgICAgcmV0dXJuICdMMSc7XHJcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxyXG4gICAgICAgIHJldHVybiAnTDMnO1xyXG4gICAgICBjYXNlICdzaGVsZic6XHJcbiAgICAgICAgcmV0dXJuICdMMic7XHJcbiAgICAgIGNhc2UgJ3Nwb3QnOlxyXG4gICAgICAgIHJldHVybiAnTDQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEZpeHR1cmVMZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLmZpeHR1cmVMZXZlbEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW3RoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdEJyYW5kTmFtZV0sXHJcbiAgICAgIHByb2R1Y3RDYXRlZ29yeTogW3RoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdENhdGVnb3J5XVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RCcmFuZE5hbWU/LmZvckVhY2goZSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLmJyYW5kc0xpc3QuZmluZChiID0+IGIuYnJhbmROYW1lID09PSBlKT8uY2F0ZWdvcnk/Lm1hcChjID0+IHsgcmV0dXJuIHsgXCJsYWJlbFwiOiBjLCBcInZhbHVlXCI6IGMgfSB9KSA/PyBbXVxyXG4gICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3QsIC4uLmNhdGVnb3JpZXNdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVMZXZlbEZvcm0uZ2V0KFwicHJvZHVjdEJyYW5kTmFtZVwiKT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodjogc3RyaW5nW10pID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gW107XHJcbiAgICAgICAgdi5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IHRoaXMuYnJhbmRzTGlzdC5maW5kKGIgPT4gYi5icmFuZE5hbWUgPT09IGUpPy5jYXRlZ29yeT8ubWFwKGMgPT4geyByZXR1cm4geyBcImxhYmVsXCI6IGMsIFwidmFsdWVcIjogYyB9IH0pID8/IFtdXHJcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3QsIC4uLmNhdGVnb3JpZXNdXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbGlkQ2F0ZWdvcnlJZHMgPSB0aGlzLmNhdGVnb3JpZXNMaXN0Py5tYXAoYyA9PiBjLnZhbHVlKSA/PyBbXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2F0U2VsZWN0aW9uID0gdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZSB8fCBbXTtcclxuICAgICAgICBjb25zdCBuZXdDYXRTZWxlY3Rpb24gPSBjdXJyZW50Q2F0U2VsZWN0aW9uLmZpbHRlcigoaWQ6IGFueSkgPT4gdmFsaWRDYXRlZ29yeUlkcy5pbmNsdWRlcyhpZCkpO1xyXG4gICAgICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8uc2V0VmFsdWUobmV3Q2F0U2VsZWN0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZShjID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKSlcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG4gIH1cclxuXHJcbiAgaW5pdFNlY3Rpb25MZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2VjdGlvbjogdGhpcy5mYi5hcnJheShbXSwgdW5pcXVlRmllbGRJbkZvcm1BcnJheVZhbGlkYXRvcignem9uZScpKSxcclxuICAgIH0pXHJcblxyXG4gICAgY29uc3Qgc2VjdGlvbkdyb3VwQXJyYXkgPSB0aGlzLmdyb3VwU2hlbHZlc0J5Wm9uZSh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnID8/IFtdKTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXBBcnJheS5mb3JFYWNoKChzLCBpKSA9PiB0aGlzLmFkZFNlY3Rpb24ocywgaSkpO1xyXG5cclxuICAgIGlmIChzZWN0aW9uR3JvdXBBcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5hZGRTZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXMgPSBzZWN0aW9uR3JvdXBBcnJheS5tYXAoKHNlKSA9PiBzZT8uc2hlbHZlcz8ubWFwKHMgPT4gcykpLmZsYXQoKTtcclxuXHJcbiAgICB0aGlzLnNoZWx2ZXNMaXN0ID0gdGhpcy5zaGVsdmVzTGlzdC5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICBkaXNhYmxlZDogYWxsU2VjdGlvblNoZWx2ZXM/LmluY2x1ZGVzKGAke2l0ZW0/LnZhbHVlfWApXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VjdGlvbkFycmF5LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHM6IFNlY3Rpb25Db25maWdbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFsbFNlY3Rpb25TaGVsdmVzID0gcy5tYXAoKHNlKSA9PiBzZT8uc2hlbHZlcz8ubWFwKHMgPT4gcykpLmZsYXQoKTtcclxuICAgICAgICB0aGlzLnNoZWx2ZXNMaXN0ID0gdGhpcy5zaGVsdmVzTGlzdC5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogYWxsU2VjdGlvblNoZWx2ZXM/LmluY2x1ZGVzKGAke2l0ZW0/LnZhbHVlfWApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbGxTaGVsdmVzVXNlZEluU2VjdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGVsdmVzTGlzdC5maWx0ZXIocyA9PiAhcy5kaXNhYmxlZCkubGVuZ3RoIDw9IDA7XHJcbiAgfVxyXG5cclxuICBpbml0U2hlbGZMZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLnNoZWxmTGV2ZWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHNoZWxmOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8uZm9yRWFjaCgoZSwgaSkgPT4gdGhpcy5hZGRTaGVsZihlLCBpKSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHRoaXMuc2hlbGZMZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgfVxyXG5cclxuICBpbml0U3BvdExldmVsRm9ybSgpIHtcclxuICAgIHRoaXMuc3BvdExldmVsRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBicmFuZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcHJvZHVjdENhdGVnb3J5OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICB9KVxyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLnNwb3RMZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgfVxyXG5cclxuICBzZXRUYWIodGFiOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMZXZlbCA9IHRhYjtcclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICBxdWVyeVBhcmFtczogeyBsZXZlbDogdGhpcy5zZWxlY3RlZExldmVsIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXHJcbiAgICAgIHJlcGxhY2VVcmw6IHRydWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSk7XHJcbiAgICB0aGlzLnVwZGF0ZUNoYW5nZXNUb0xvY2FsKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hlbGZBcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbGZMZXZlbEZvcm0uZ2V0KCdzaGVsZicpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBzZWN0aW9uQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLnNlY3Rpb25MZXZlbEZvcm0uZ2V0KCdzZWN0aW9uJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgYWRkU2VjdGlvbihzZWN0aW9uPzogU2VjdGlvbkNvbmZpZywgaTogbnVtYmVyID0gdGhpcy5zZWN0aW9uQXJyYXkuY29udHJvbHMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBzZWN0aW9uR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgem9uZTogW3NlY3Rpb24/LnpvbmUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBnZW5lcmFsVmFsaWRhdG9yKCldXSxcclxuICAgICAgc2hlbHZlczogW3NlY3Rpb24/LnNoZWx2ZXMgPz8gW10sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwcm9kdWN0QnJhbmROYW1lOiBbc2VjdGlvbj8ucHJvZHVjdEJyYW5kTmFtZV0sXHJcbiAgICAgIHByb2R1Y3RDYXRlZ29yeTogW3NlY3Rpb24/LnByb2R1Y3RDYXRlZ29yeSA/PyAnJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlY3Rpb25BcnJheS5wdXNoKHNlY3Rpb25Hcm91cCk7XHJcblxyXG4gICAgY29uc3QgbWFwSWQgPSBgc2VjdGlvbiR7aX1gO1xyXG4gICAgc2VjdGlvbj8ucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLmJyYW5kc0xpc3QuZmluZChiID0+IGIuYnJhbmROYW1lID09PSBlKT8uY2F0ZWdvcnk/Lm1hcChjID0+IHsgcmV0dXJuIHsgXCJsYWJlbFwiOiBjLCBcInZhbHVlXCI6IGMgfSB9KSA/PyBbXVxyXG4gICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChtYXBJZCwgWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KG1hcElkKSA/PyBbXSwgLi4uY2F0ZWdvcmllc10pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2VjdGlvbkxpc3RlbmVyKHNlY3Rpb25Hcm91cCwgbWFwSWQpO1xyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY6IFNoZWxmQ29uZmlnLCBpOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW3NoZWxmPy5wcm9kdWN0QnJhbmROYW1lXSxcclxuICAgICAgcHJvZHVjdENhdGVnb3J5OiBbc2hlbGY/LnByb2R1Y3RDYXRlZ29yeSA/PyAnJyxdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucHVzaChzaGVsZkdyb3VwKTtcclxuXHJcbiAgICBjb25zdCBtYXBJZCA9IGBzaGVsZiR7aX1gXHJcbiAgICBzaGVsZj8ucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLmJyYW5kc0xpc3QuZmluZChiID0+IGIuYnJhbmROYW1lID09PSBlKT8uY2F0ZWdvcnk/Lm1hcChjID0+IHsgcmV0dXJuIHsgXCJsYWJlbFwiOiBjLCBcInZhbHVlXCI6IGMgfSB9KSA/PyBbXVxyXG4gICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChtYXBJZCwgWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KG1hcElkKSA/PyBbXSwgLi4uY2F0ZWdvcmllc10pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2hlbGZMaXN0ZW5lcihzaGVsZkdyb3VwLCBtYXBJZCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gIH1cclxuXHJcbiAgc2V0dXBTaGVsZkxpc3RlbmVyKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgaTogc3RyaW5nKSB7XHJcbiAgICBzaGVsZkdyb3VwLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKGJyYW5kcyA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5zZXQoaSwgW10pO1xyXG4gICAgICAgIGJyYW5kcy5mb3JFYWNoKChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLmJyYW5kc0xpc3QuZmluZChiID0+IGIuYnJhbmROYW1lID09PSBlKT8uY2F0ZWdvcnk/Lm1hcChjID0+IHsgcmV0dXJuIHsgXCJsYWJlbFwiOiBjLCBcInZhbHVlXCI6IGMgfSB9KSA/PyBbXVxyXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5zZXQoaSwgWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KGkpID8/IFtdLCAuLi5jYXRlZ29yaWVzXSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gUmVzZXQgY2F0ZWdvcnkgc2VsZWN0aW9uIGlmIHByZXZpb3VzbHkgc2VsZWN0ZWQgY2F0ZWdvcmllcyBhcmUgbm8gbG9uZ2VyIHZhbGlkXHJcbiAgICAgICAgY29uc3QgdmFsaWRDYXRlZ29yeUlkcyA9IHRoaXMuY2F0ZWdvcmllc0xpc3RNYXA/LmdldChpKT8ubWFwKGMgPT4gYy52YWx1ZSkgPz8gW107XHJcbiAgICAgICAgY29uc3QgY3VycmVudENhdFNlbGVjdGlvbiA9IHNoZWxmR3JvdXAuZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWUgfHwgW107XHJcbiAgICAgICAgY29uc3QgbmV3Q2F0U2VsZWN0aW9uID0gY3VycmVudENhdFNlbGVjdGlvbi5maWx0ZXIoKGlkOiBhbnkpID0+IHZhbGlkQ2F0ZWdvcnlJZHMuaW5jbHVkZXMoaWQpKTtcclxuICAgICAgICBzaGVsZkdyb3VwLmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnNldFZhbHVlKG5ld0NhdFNlbGVjdGlvbiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBzaGVsZkdyb3VwLmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYyA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZXR1cFNlY3Rpb25MaXN0ZW5lcihzZWN0aW9uR3JvdXA6IEZvcm1Hcm91cCwgaTogc3RyaW5nKSB7XHJcbiAgICBzZWN0aW9uR3JvdXAuZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYnJhbmRzID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChpLCBbXSk7XHJcbiAgICAgICAgYnJhbmRzLmZvckVhY2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IHRoaXMuYnJhbmRzTGlzdC5maW5kKGIgPT4gYi5icmFuZE5hbWUgPT09IGUpPy5jYXRlZ29yeT8ubWFwKGMgPT4geyByZXR1cm4geyBcImxhYmVsXCI6IGMsIFwidmFsdWVcIjogYyB9IH0pID8/IFtdXHJcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChpLCBbLi4udGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5nZXQoaSkgPz8gW10sIC4uLmNhdGVnb3JpZXNdKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBSZXNldCBjYXRlZ29yeSBzZWxlY3Rpb24gaWYgcHJldmlvdXNseSBzZWxlY3RlZCBjYXRlZ29yaWVzIGFyZSBubyBsb25nZXIgdmFsaWRcclxuICAgICAgICBjb25zdCB2YWxpZENhdGVnb3J5SWRzID0gdGhpcy5jYXRlZ29yaWVzTGlzdE1hcD8uZ2V0KGkpPy5tYXAoYyA9PiBjLnZhbHVlKSA/PyBbXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2F0U2VsZWN0aW9uID0gc2VjdGlvbkdyb3VwLmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IG5ld0NhdFNlbGVjdGlvbiA9IGN1cnJlbnRDYXRTZWxlY3Rpb24uZmlsdGVyKChpZDogYW55KSA9PiB2YWxpZENhdGVnb3J5SWRzLmluY2x1ZGVzKGlkKSk7XHJcbiAgICAgICAgc2VjdGlvbkdyb3VwLmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnNldFZhbHVlKG5ld0NhdFNlbGVjdGlvbiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXAuZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZShjID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSlcclxuICAgICAgfSlcclxuXHJcbiAgICBzZWN0aW9uR3JvdXAuZ2V0KCdzaGVsdmVzJyk/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUocyA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpXHJcbiAgICAgIH0pXHJcblxyXG4gICAgc2VjdGlvbkdyb3VwLmdldCgnem9uZScpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2VjdGlvbihpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWN0aW9uQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1CeUxldmVsKCkge1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSAnZml4dHVyZSc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZml4dHVyZUxldmVsRm9ybTtcclxuICAgICAgY2FzZSAnc2VjdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbkxldmVsRm9ybTtcclxuICAgICAgY2FzZSAnc2hlbGYnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNoZWxmTGV2ZWxGb3JtO1xyXG4gICAgICBjYXNlICdzcG90JzpcclxuICAgICAgICByZXR1cm4gdGhpcy5zcG90TGV2ZWxGb3JtO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLmZpeHR1cmVMZXZlbEZvcm07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRDb2xvclRvU2hlbHZlcygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGxldmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5zZWxlY3RlZExldmVsfS1sZXZlbGApO1xyXG4gICAgaWYgKCFsZXZlbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgYm9kaWVzID0gbGV2ZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5ib2R5LWJsb2NrJyk7XHJcbiAgICBpZiAoIWJvZGllcykgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGJvZHlDaGlsZHJlbiA9IEFycmF5LmZyb20oYm9kaWVzLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdO1xyXG5cclxuICAgIGNvbnN0IHNoZWxmRGl2cyA9IGJvZHlDaGlsZHJlblxyXG4gICAgICAubWFwKGRpdiA9PiB7XHJcbiAgICAgICAgY29uc3QgbGFzdCA9IGRpdi5sYXN0RWxlbWVudENoaWxkO1xyXG4gICAgICAgIHJldHVybiBsYXN0ICYmIGxhc3QudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGl2JyA/IGxhc3QgYXMgSFRNTEVsZW1lbnQgOiBudWxsO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKChkKTogZCBpcyBIVE1MRWxlbWVudCA9PiAhIWQpO1xyXG5cclxuICAgIGlmICghc2hlbGZEaXZzLmxlbmd0aCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSwgMTAwKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZExldmVsKSB7XHJcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOiB7XHJcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RTZXF1ZW50aWFsU2VjdGlvbihzaGVsZkRpdnMpO1xyXG5cclxuICAgICAgICBjb25zdCBzZWN0aW9uQXJyYXkgPSB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LnZhbHVlPy5zZWN0aW9uIGFzIFNlY3Rpb25Db25maWdbXSA/PyBbXTtcclxuICAgICAgICBjb25zdCBhbGxTZWN0aW9uU2hlbHZlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgc2VjdGlvbkFycmF5LmZvckVhY2goKHNlLCBpKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzaGVsZklkcyA9IHNlLnNoZWx2ZXM/Lm1hcChzaCA9PiBzaC5yZXBsYWNlKC9cXHMvZywgXCJcIikudG9Mb3dlckNhc2UoKSkgPz8gW107XHJcbiAgICAgICAgICBhbGxTZWN0aW9uU2hlbHZlcy5wdXNoKC4uLnNoZWxmSWRzKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzZWNEaXZzID0gc2hlbGZEaXZzLmZpbHRlcihpdGVtID0+IHNoZWxmSWRzLmluY2x1ZGVzKGl0ZW0uaWQpKTtcclxuICAgICAgICAgIHNlY0RpdnMuZm9yRWFjaChkID0+IGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVuYXNzaWduZWRTaGVsdmVzID0gc2hlbGZEaXZzLmZpbHRlcihpdGVtID0+ICFhbGxTZWN0aW9uU2hlbHZlcy5pbmNsdWRlcyhpdGVtLmlkKSk7XHJcbiAgICAgICAgdW5hc3NpZ25lZFNoZWx2ZXMuZm9yRWFjaChkID0+IGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3doaXRlJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25Cb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb24tYm9keS1ibG9jaycpO1xyXG4gICAgICAgIGlmIChzZWN0aW9uQm9keSkge1xyXG4gICAgICAgICAgbGV0IHNlY3Rpb25Hcm91cEhlaWdodCA9IDA7XHJcblxyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VjdGlvbkJ5Wm9uZXMuZm9yRWFjaCgoc3osIGkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2VjdGlvbkhlaWdodCA9IHN6LnNlY3Rpb24uc2hlbGZEaXZzLnJlZHVjZSgoaCwgZCkgPT4gaCArIChkPy5vZmZzZXRIZWlnaHQgPz8gMCksIDApO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uV2lkdGggPSBzei5zZWN0aW9uLnNoZWxmRGl2c1swXT8ub2Zmc2V0V2lkdGggPz8gMzQ1O1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBiYyA9IHNlY3Rpb25Cb2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAjYnJhbmQtY2F0ZWdvcnkke2l9YCk7XHJcbiAgICAgICAgICAgICAgaWYgKGJjKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWNCZyA9IHJnYlRvSGV4KHN6LnNlY3Rpb24uc2hlbGZEaXZzWzBdPy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzLmZpbmQoYyA9PiBjLmJnID09PSBzZWNCZykgPz8gdGhpcy5zaGVsZkNvbG9yc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS5ib3JkZXJDb2xvciA9IGNvbG9yLmJvcmRlcjtcclxuICAgICAgICAgICAgICAgIGJjLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmJztcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1ggPSAoY3VycmVudFNlY3Rpb25XaWR0aCAtIGJjLm9mZnNldFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1kgPSAoKGN1cnJlbnRTZWN0aW9uSGVpZ2h0IC0gYmMub2Zmc2V0SGVpZ2h0KSAvIDIpICsgc2VjdGlvbkdyb3VwSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWH1weCwgJHtiY1l9cHgpYDtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uR3JvdXBIZWlnaHQgKz0gY3VycmVudFNlY3Rpb25IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgJ3NoZWxmJzpcclxuICAgICAgICBib2R5Q2hpbGRyZW4uZm9yRWFjaCgoZGl2LCBpKSA9PiB7XHJcbiAgICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuXHJcbiAgICAgICAgICBjb25zdCBiYyA9IGRpdi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgI2JyYW5kLWNhdGVnb3J5JHtpfWApO1xyXG4gICAgICAgICAgaWYgKGJjKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJjWCA9IChkaXYub2Zmc2V0V2lkdGggLSBiYy5vZmZzZXRXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgICBjb25zdCBiY1kgPSAoZGl2Lm9mZnNldEhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS5ib3JkZXJDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbaV0uYm9yZGVyO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLnRleHRCZztcclxuICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWH1weCwgJHtiY1l9cHgpYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2ZpeHR1cmUnOlxyXG4gICAgICBjYXNlICdzcG90JzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBzaGVsZkRpdnMuZm9yRWFjaChkID0+IGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1swXS5iZyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY29uc3RydWN0U2VxdWVudGlhbFNlY3Rpb24oc2hlbGZEaXZzOiAoSFRNTEVsZW1lbnQgfCBudWxsKVtdKSB7XHJcbiAgICBjb25zdCBzaGVsZkNvbmZpZ3M6IFNoZWxmQ29uZmlnW10gPSB0aGlzLmFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyh0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LnZhbHVlPy5zZWN0aW9uIGFzIFNlY3Rpb25Db25maWdbXSk7XHJcbiAgICBjb25zdCBuZXdTZWN0aW9uQnlab25lcyA9IFtdO1xyXG5cclxuICAgIGxldCBwWm9uZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc2hlbGZDb25maWdzKSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzLnpvbmUgfHwgJyc7XHJcbiAgICAgIGNvbnN0IHNoZWxmSWQgPSBgJHtzLnNoZWxmVHlwZX0ke3Muc2hlbGZOdW1iZXJ9YDtcclxuICAgICAgY29uc3Qgc2hlbGZEaXYgPSBzaGVsZkRpdnMuZmluZChkID0+IGQ/LmlkID09PSBzaGVsZklkKTtcclxuXHJcbiAgICAgIGlmICh6b25lID09PSAnJykgY29udGludWU7XHJcbiAgICAgIGlmICh6b25lICE9PSBwWm9uZSkge1xyXG4gICAgICAgIG5ld1NlY3Rpb25CeVpvbmVzLnB1c2goe1xyXG4gICAgICAgICAgem9uZSxcclxuICAgICAgICAgIHNlY3Rpb246IHtcclxuICAgICAgICAgICAgYnJhbmRzOiBzLnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHMucHJvZHVjdENhdGVnb3J5ID8/IFtdLFxyXG4gICAgICAgICAgICBzaGVsdmVzOiBbc2hlbGZJZF0sXHJcbiAgICAgICAgICAgIHNoZWxmRGl2czogW3NoZWxmRGl2XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBab25lID0gem9uZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uLnNoZWx2ZXMucHVzaChzaGVsZklkKTtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uLnNoZWxmRGl2cy5wdXNoKHNoZWxmRGl2KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VjdGlvbkJ5Wm9uZXMgPSBbLi4ubmV3U2VjdGlvbkJ5Wm9uZXNdXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsbFNoZWxmQWRkVG9TZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbHZlc0xpc3QuZXZlcnkocyA9PiBzLmRpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIGdldFBheWxvYWRCeUxldmVsKHN0YXR1czogc3RyaW5nKTogRml4dHVyZVRlbXBsYXRlRGV0YWlscyB8IG51bGwge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybUJ5TGV2ZWwoKTtcclxuICAgIGNvbnN0IGxldmVsID0gdGhpcy5nZXRMZXZlbEJ5VGFiKCk7XHJcblxyXG4gICAgaWYgKGZvcm0uaW52YWxpZCB8fCAodGhpcy5zZWxlY3RlZExldmVsID09PSAnc2VjdGlvbicgJiYgIXRoaXMuaXNBbGxTaGVsZkFkZFRvU2VjdGlvbikpIHtcclxuICAgICAgZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgICBjb25zdCBlcnJvck1zZyA9IGZvcm0uaW52YWxpZFxyXG4gICAgICAgID8gXCJGb3JtIGlzIGludmFsaWRcIlxyXG4gICAgICAgIDogXCJBc3NpZ24gYWxsIHNoZWx2ZXMgdG8gYSBzZWN0aW9uXCI7XHJcblxyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyb3JNc2cpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSAnZml4dHVyZSc6XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3QgY29uZmlnOiBTaGVsZkNvbmZpZ1tdID0gdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4ucyxcclxuICAgICAgICAgICAgICB6b25lOiAnJyxcclxuICAgICAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBbXSxcclxuICAgICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMhLFxyXG4gICAgICAgICAgICBmaXh0dXJlTmFtZTogdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTmFtZT8udHJpbSgpLFxyXG4gICAgICAgICAgICAvLyBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgaXNFZGl0ZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBbLi4uZm9ybT8udmFsdWUucHJvZHVjdEJyYW5kTmFtZV0sXHJcbiAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogWy4uLmZvcm0/LnZhbHVlLnByb2R1Y3RDYXRlZ29yeV1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnN0IGNvbmZpZzogU2hlbGZDb25maWdbXSA9IHRoaXMuYXBwbHlTZWN0aW9uQ29uZmlnVG9TaGVsdmVzKHRoaXMuc2VjdGlvbkxldmVsRm9ybT8udmFsdWU/LnNlY3Rpb24gYXMgU2VjdGlvbkNvbmZpZ1tdKTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAgIGZpeHR1cmVOYW1lOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVOYW1lPy50cmltKCksXHJcbiAgICAgICAgICAgIC8vIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICBpc0VkaXRlZDogdHJ1ZSxcclxuICAgICAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbGV2ZWwsXHJcbiAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgICAgICBzaGVsZkNvbmZpZzogY29uZmlnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlICdzaGVsZic6XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3QgY29uZmlnOiBTaGVsZkNvbmZpZ1tdID0gdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4ucyxcclxuICAgICAgICAgICAgICB6b25lOiAnJyxcclxuICAgICAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBmb3JtPy52YWx1ZT8uc2hlbGZbaV0/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBmb3JtPy52YWx1ZT8uc2hlbGZbaV0/LnByb2R1Y3RDYXRlZ29yeSA/PyBbXSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSkgPz8gW107XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4udGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzISxcclxuICAgICAgICAgICAgZml4dHVyZU5hbWU6IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZU5hbWU/LnRyaW0oKSxcclxuICAgICAgICAgICAgLy8gc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgIGlzRWRpdGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW10sXHJcbiAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWdcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIGNhc2UgJ3Nwb3QnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMhLFxyXG4gICAgICAgICAgZml4dHVyZU5hbWU6IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZU5hbWU/LnRyaW0oKSxcclxuICAgICAgICAgIC8vIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbGV2ZWwsXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBbXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICBpc0VkaXRlZDogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtQ29tcGxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSAnQ29tcGxldGUgdGVtcGxhdGUnO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSAnVGVtcGxhdGUgaXMgbm93IHJlYWR5IHRvIGFzc2lnbiBpdCB0byB0aGUgc3RvcmUgYnV0IHN0aWxsIHlvdSBjYW4gY29tZSBhZ2FpbiBhbnkgdGltZSBhbmQgZWRpdCB0aGlzIHRlbXBsYXRlLic7XHJcbiAgICAvLyBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ub3RlID0gJ1lvdSBjYW5cXCd0IGVkaXQgaXQgb25jZSBhc3NpZ25lZCB0byB0aGUgdGVtcGxhdGUuJztcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHN1Ym1pdEZvcm0oZGF0YTogeyBzdGF0dXM6IHN0cmluZywgZ29CYWNrOiBib29sZWFuIH0pIHtcclxuICAgIGNvbnN0IGV0ID0gdGhpcy5wcy5maXh0dXJlVGVtcGxhdGVFcnJvclRhYnM7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBheWxvYWQ6IEZpeHR1cmVUZW1wbGF0ZURldGFpbHMgfCBudWxsID0gdGhpcy5nZXRQYXlsb2FkQnlMZXZlbChkYXRhLnN0YXR1cyk7XHJcbiAgICBpZiAoIXBheWxvYWQpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXQuYmFzaWNEZXRhaWxzIHx8IGV0LnByb2R1Y3RzIHx8IGV0LnZtcykgcmV0dXJuO1xyXG5cclxuICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1Db21wbGV0aW9uKCkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBzLnN1Ym1pdEZpeHR1cmVUZW1wbGF0ZURldGFpbHMoeyAuLi5wYXlsb2FkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCkgfSwgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLl9pZCEpO1xyXG5cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXHJcbiAgICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIixcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFwiRml4dHVyZSB0ZW1wbGF0ZSBkZXRhaWxzIHVwZGF0ZWQuXCIpO1xyXG4gICAgICBpZiAoZGF0YS5nb0JhY2spIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2ZpeHR1cmUtdGVtcGxhdGVzJ10pXHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHtcclxuICAgICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvbWFuYWdlL3BsYW5vZ3JhbS9maXh0dXJlLXRlbXBsYXRlL2Fzc2lnbi1zdG9yZXNcIl0sIHtcclxuICAgICAgICAvLyAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwicHJlc2VydmVcIixcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdyb3VwU2hlbHZlc0J5Wm9uZShpbnB1dDogU2hlbGZDb25maWdbXSk6IFNlY3Rpb25Db25maWdbXSB7XHJcbiAgICBjb25zdCB6b25lTWFwOiB7IFt6b25lOiBzdHJpbmddOiBTZWN0aW9uQ29uZmlnIH0gPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpIHtcclxuICAgICAgY29uc3Qgem9uZSA9IGl0ZW0/LnpvbmUgPz8gJyc7XHJcbiAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtpdGVtLnNoZWxmVHlwZX0gJHtpdGVtLnNoZWxmTnVtYmVyfWA7XHJcblxyXG4gICAgICBpZiAoem9uZSA9PT0gJycpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCF6b25lTWFwW3pvbmVdKSB7XHJcbiAgICAgICAgem9uZU1hcFt6b25lXSA9IHtcclxuICAgICAgICAgIHNoZWx2ZXM6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDMnID8gaXRlbS5wcm9kdWN0QnJhbmROYW1lIDogW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wzJyA/IGl0ZW0ucHJvZHVjdENhdGVnb3J5IDogW10sXHJcbiAgICAgICAgICB6b25lOiB6b25lXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgem9uZU1hcFt6b25lXT8uc2hlbHZlcz8ucHVzaChzaGVsZkxhYmVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh6b25lTWFwKTtcclxuICB9XHJcblxyXG4gIGFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyhcclxuICAgIHNlY3Rpb25zOiBTZWN0aW9uQ29uZmlnW11cclxuICApOiBTaGVsZkNvbmZpZ1tdIHtcclxuICAgIGNvbnN0IHNlY3Rpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgUGljazxTZWN0aW9uQ29uZmlnLCAnem9uZScgfCAncHJvZHVjdEJyYW5kTmFtZScgfCAncHJvZHVjdENhdGVnb3J5Jz4+KCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XHJcbiAgICAgIGZvciAoY29uc3Qgc2hlbGZMYWJlbCBvZiBzZWN0aW9uLnNoZWx2ZXMhKSB7XHJcbiAgICAgICAgc2VjdGlvbk1hcC5zZXQoc2hlbGZMYWJlbCwge1xyXG4gICAgICAgICAgem9uZTogc2VjdGlvbi56b25lLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogc2VjdGlvbi5wcm9kdWN0QnJhbmROYW1lLFxyXG4gICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBzZWN0aW9uLnByb2R1Y3RDYXRlZ29yeVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXBwbHkgb3ZlcnJpZGVzIHRvIG1hdGNoaW5nIHNoZWx2ZXNcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoc2hlbGYgPT4ge1xyXG4gICAgICBjb25zdCBzaGVsZkxhYmVsID0gYCR7c2hlbGYuc2hlbGZUeXBlfSAke3NoZWxmLnNoZWxmTnVtYmVyfWA7XHJcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gc2VjdGlvbk1hcC5nZXQoc2hlbGZMYWJlbCk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLnNoZWxmLFxyXG4gICAgICAgIHpvbmU6IG92ZXJyaWRlPy56b25lIHx8ICcnLFxyXG4gICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IG92ZXJyaWRlPy5wcm9kdWN0QnJhbmROYW1lID8/IFtdLFxyXG4gICAgICAgIHByb2R1Y3RDYXRlZ29yeTogb3ZlcnJpZGU/LnByb2R1Y3RDYXRlZ29yeSA/PyBbXVxyXG4gICAgICB9O1xyXG4gICAgfSkgPz8gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RlblRvQWxsRm9ybUNoYW5nZXMoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUNoYW5nZXNUb0xvY2FsKCk7XHJcblxyXG4gICAgY29uc3QgZm9ybXNUb1dhdGNoID0gW1xyXG4gICAgICB0aGlzLmZpeHR1cmVMZXZlbEZvcm0sXHJcbiAgICAgIHRoaXMuc2VjdGlvbkxldmVsRm9ybSxcclxuICAgICAgdGhpcy5zaGVsZkxldmVsRm9ybSxcclxuICAgICAgdGhpcy5zcG90TGV2ZWxGb3JtXHJcbiAgICBdO1xyXG5cclxuICAgIGZvcm1zVG9XYXRjaC5mb3JFYWNoKGZvcm0gPT4ge1xyXG4gICAgICBpZiAoIWZvcm0pIHJldHVybjtcclxuICAgICAgaWYgKHRoaXMucHMuZml4dHVyZVRlbXBsYXRlRXJyb3JUYWJzLnByb2R1Y3RzKSBmb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgZm9ybS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFuZ2VzVG9Mb2NhbCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2hhbmdlc1RvTG9jYWwoKSB7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtQnlMZXZlbCgpO1xyXG4gICAgY29uc3QgdmFsID0gZm9ybS52YWx1ZTtcclxuXHJcbiAgICBsZXQgcGF5bG9hZDogRml4dHVyZVRlbXBsYXRlRGV0YWlscyB8IG51bGw7XHJcblxyXG4gICAgY29uc3QgbGV2ZWwgPSB0aGlzLmdldExldmVsQnlUYWIoKTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRMZXZlbCkge1xyXG4gICAgICBjYXNlICdmaXh0dXJlJzpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb25zdCBjb25maWc6IFNoZWxmQ29uZmlnW10gPSB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKHMsIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAuLi5zLFxyXG4gICAgICAgICAgICAgIHpvbmU6ICcnLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pID8/IFtdO1xyXG5cclxuICAgICAgICAgIHBheWxvYWQgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBbLi4udmFsLnByb2R1Y3RCcmFuZE5hbWVdLFxyXG4gICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFsuLi52YWwucHJvZHVjdENhdGVnb3J5XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlICdzZWN0aW9uJzpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb25zdCBjb25maWc6IFNoZWxmQ29uZmlnW10gPSB0aGlzLmFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyh2YWwuc2VjdGlvbiBhcyBTZWN0aW9uQ29uZmlnW10pO1xyXG4gICAgICAgICAgcGF5bG9hZCA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzISxcclxuICAgICAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbGV2ZWwsXHJcbiAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgICAgICBzaGVsZkNvbmZpZzogY29uZmlnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIGNhc2UgJ3NoZWxmJzpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb25zdCBjb25maWc6IFNoZWxmQ29uZmlnW10gPSB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKHMsIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAuLi5zLFxyXG4gICAgICAgICAgICAgIHpvbmU6ICcnLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IHZhbC5zaGVsZltpXT8ucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IHZhbC5zaGVsZltpXT8ucHJvZHVjdENhdGVnb3J5ID8/IFtdLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICAgICAgICBwYXlsb2FkID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMhLFxyXG4gICAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW10sXHJcbiAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWdcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSAnc3BvdCc6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcGF5bG9hZCA9IHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBbXVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMubmV4dCh7IC4uLnBheWxvYWQsIGlnbm9yZVVwZGF0ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5wcy5maXh0dXJlVGVtcGxhdGVFcnJvclRhYnMucHJvZHVjdHMgPVxyXG4gICAgICAgIGZvcm0uaW52YWxpZCB8fCAodGhpcy5zZWxlY3RlZExldmVsID09PSAnc2VjdGlvbicgJiYgIXRoaXMuaXNBbGxTaGVsZkFkZFRvU2VjdGlvbik7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBjbGVhblVwRW1wdHlTZWN0aW9ucygpIHtcclxuICAgIGNvbnN0IHNoZWxmQ29uZmlnczogU2hlbGZDb25maWdbXSA9IHRoaXMuYXBwbHlTZWN0aW9uQ29uZmlnVG9TaGVsdmVzKHRoaXMuc2VjdGlvbkxldmVsRm9ybT8udmFsdWU/LnNlY3Rpb24gYXMgU2VjdGlvbkNvbmZpZ1tdKTtcclxuICAgIGNvbnN0IG5ld1NlY3Rpb25CeVpvbmVzID0gW107XHJcblxyXG4gICAgbGV0IHBab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcyBvZiBzaGVsZkNvbmZpZ3MpIHtcclxuICAgICAgY29uc3Qgem9uZSA9IHMuem9uZSB8fCAnJztcclxuICAgICAgY29uc3Qgc2hlbGZJZCA9IGAke3Muc2hlbGZUeXBlfSR7cy5zaGVsZk51bWJlcn1gO1xyXG5cclxuICAgICAgaWYgKHpvbmUgPT09ICcnKSBjb250aW51ZTtcclxuICAgICAgaWYgKHpvbmUgIT09IHBab25lKSB7XHJcbiAgICAgICAgbmV3U2VjdGlvbkJ5Wm9uZXMucHVzaCh7XHJcbiAgICAgICAgICB6b25lLFxyXG4gICAgICAgICAgc2VjdGlvbjoge1xyXG4gICAgICAgICAgICBicmFuZHM6IHMucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogcy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgICAgIHNoZWx2ZXM6IFtzaGVsZklkXSxcclxuICAgICAgICAgICAgc2hlbGZEaXZzOiBbXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBab25lID0gem9uZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uLnNoZWx2ZXMucHVzaChzaGVsZklkKTtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uLnNoZWxmRGl2cyA9IFtdXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlY3Rpb25CeVpvbmVzID0gWy4uLm5ld1NlY3Rpb25CeVpvbmVzXVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIHRoaXMuY2xlYW5VcEVtcHR5U2VjdGlvbnMoKTtcclxuICAgIHRoaXMucHMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KHsgLi4udGhpcy5wcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLnZhbHVlLCBpZ25vcmVVcGRhdGU6IGZhbHNlIH0pO1xyXG4gIH1cclxufVxyXG5cclxuIiwiPHNlY3Rpb24gaWQ9XCJmaXh0dXJlLXRlbXBsYXRlLXByb2R1Y3RzXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiPlxyXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1MZWZ0IENvbHVtbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgZC1mbGV4XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCIgKm5nRm9yPVwibGV0IGxpYnJhcnkgb2YgWydicmFuZCcsICdwcm9kdWN0J11cIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGluayB3LTEwMFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRMaWJyYXJ5ID09PSBsaWJyYXJ5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkTGlicmFyeSA9IGxpYnJhcnlcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwic2VsZWN0ZWRMaWJyYXJ5ID09PSBsaWJyYXJ5ID8gJ3BhZ2UnIDogbnVsbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGxpYnJhcnkgfCB0aXRsZWNhc2UgfX0gTGlicmFyeVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgPC91bD5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZExpYnJhcnkgPT09ICdicmFuZCdcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCAhPT0gJ3Nwb3QnXCI+XHJcbiAgICAgICAgICA8aDI+QWRkIHByb2R1Y3RzIGJ5IGJyYW5kIGxldmVsPC9oMj5cclxuICAgICAgICAgIDxwPlBsYWNlIHRoZSBwcm9kdWN0IGJyYW5kIGluIHRoZSBkZXNpZ25hdGVkIHBsYWNlbWVudCBhcmVhLjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEZpeHR1cmUgbGV2ZWwgd2l0aGluIEJyYW5kIExpYnJhcnkgIC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZml4dHVyZUxldmVsRm9ybVwiICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ2ZpeHR1cmUnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcm9kdWN0QnJhbmROYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5CcmFuZDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cImJyYW5kc0xpc3RcIlxyXG4gICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBicmFuZHMnXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0QnJhbmROYW1lXCJcclxuICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICA+PC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnRvdWNoZWQgJiYgZml4dHVyZUxldmVsRm9ybS5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiZml4dHVyZUxldmVsRm9ybS5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgcHJvZHVjdCBicmFuZFxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHJvZHVjdENhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5Qcm9kdWN0IGNhdGVnb3J5PC9sYWJlbD5cclxuICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd25cclxuICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCJcclxuICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgIFtpdGVtc109XCJjYXRlZ29yaWVzTGlzdFwiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgY2F0ZWdvcmllcydcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuXHJcbiAgICAgICAgPCEtLSBTZWN0aW9uIGxldmVsIHdpdGhpbiBCcmFuZCBMaWJyYXJ5IC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2VjdGlvbkxldmVsRm9ybVwiICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3NlY3Rpb24nXCI+XHJcbiAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzZWN0aW9uXCIgY2xhc3M9XCJhcnJheS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2Ygc2VjdGlvbkFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImFycmF5LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyAnYm9yZGVyLWNvbG9yJzogc2hlbGZDb2xvcnNbaV0uYmcgfVwiIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+U0VDVElPTiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSAhPT0gMFwiXHJcbiAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2VjdGlvbihpKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzk4QTJCM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ6b25lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TZWN0aW9uIGxhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJsYWJlbFwiIGZvcm1Db250cm9sTmFtZT1cInpvbmVcIiAvPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy50b3VjaGVkICYmIHNlY3Rpb24uZ2V0KCd6b25lJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNlY3Rpb24uZ2V0KCd6b25lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+IFNlY3Rpb24gbmFtZSBpcyByZXF1aXJlZC4gPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNlY3Rpb24uZ2V0KCd6b25lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICBTZWN0aW9uIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNlY3Rpb24uZ2V0KCd6b25lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNlY3Rpb24uZ2V0KCd6b25lJyk/Lmhhc0Vycm9yKCdub3RVbmlxdWUnKVwiPiBEdXBsaWNhdGUgc2VjdGlvbiBuYW1lLiA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzaGVsdmVzXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5QaWNrIHRoZSBzaGVsZihzKSBmb3Igc2VjdGlvbiB7eyBpICsgMSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICBbaXRlbXNdPVwic2hlbHZlc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2hlbHZlc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICA+PC9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY3Rpb24uZ2V0KCdzaGVsdmVzJyk/LnRvdWNoZWQgJiYgc2VjdGlvbi5nZXQoJ3NoZWx2ZXMnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3NoZWx2ZXMnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj4gUGljayB0aGUgc2hlbGYocykgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHJvZHVjdEJyYW5kTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+QnJhbmQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImJyYW5kc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCInYnJhbmROYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2JyYW5kTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0QnJhbmROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgW3NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgID48L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWN0aW9uLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy50b3VjaGVkICYmIHNlY3Rpb24uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNlY3Rpb24uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUGxlYXNlIHNlbGVjdCBwcm9kdWN0IGJyYW5kXHJcbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcm9kdWN0Q2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlByb2R1Y3QgY2F0ZWdvcnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd25cclxuICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJjYXRlZ29yaWVzTGlzdE1hcC5nZXQoJ3NlY3Rpb24nICsgaSkgPz8gW11cIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgbXQtNFwiPlxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cIlxyXG4gICAgICAgICAgICAgICAgaXNBbGxTaGVsdmVzVXNlZEluU2VjdGlvbnNcclxuICAgICAgICAgICAgICAgICAgPyAnQWxsIHNoZWx2ZXMgYXJlIGFzc2lnbmVkLiBObyBzaGVsdmVzIGF2YWlsYWJsZSBmb3IgbmV3IHNlY3Rpb25zLidcclxuICAgICAgICAgICAgICAgICAgOiAnWW91IGNhbm5vdCBjcmVhdGUgbW9yZSBzZWN0aW9ucyB0aGFuIHRoZSB0b3RhbCBzaGVsdmVzIGF2YWlsYWJsZS4nXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZVRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uQXJyYXkubGVuZ3RoIDwgKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgJiYgIWlzQWxsU2hlbHZlc1VzZWRJblNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcclxuICAgICAgICAgICAgICAgICAgc2VjdGlvbkFycmF5Lmxlbmd0aCA+PSAoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lmxlbmd0aCA/PyAwKSB8fCBpc0FsbFNoZWx2ZXNVc2VkSW5TZWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtZW5kXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRTZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEFkZCBzZWN0aW9uXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuXHJcbiAgICAgICAgPCEtLSBTaGVsZiBsZXZlbCB3aXRoaW4gQnJhbmQgTGlicmFyeSAtLT5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInNoZWxmTGV2ZWxGb3JtXCIgKm5nSWY9XCJzZWxlY3RlZExldmVsID09PSAnc2hlbGYnXCI+XHJcbiAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzaGVsZlwiIGNsYXNzPVwiYXJyYXktd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzaGVsZiBvZiBzaGVsZkFycmF5Py5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImFycmF5LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyAnYm9yZGVyLWNvbG9yJzogc2hlbGZDb2xvcnNbaV0uYmcgfVwiIC0tPlxyXG4gICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+U0hFTEYge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcm9kdWN0QnJhbmROYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5CcmFuZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiYnJhbmRzTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInYnJhbmROYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RCcmFuZE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInNoZWxmLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy50b3VjaGVkICYmIHNoZWxmLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IHByb2R1Y3QgYnJhbmRcclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UHJvZHVjdCBjYXRlZ29yeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93blxyXG4gICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNhdGVnb3JpZXNMaXN0TWFwLmdldCgnc2hlbGYnICsgaSkgPz8gW11cIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcblxyXG4gICAgICAgIDwhLS0gU3BvdCBsZXZlbCB3aXRoaW4gQnJhbmQgTGlicmFyeSAtLT5cclxuICAgICAgICA8IS0tIDxmb3JtIFtmb3JtR3JvdXBdPVwic3BvdExldmVsRm9ybVwiICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3Nwb3QnXCI+U3BvdCBsZXZlbCBGb3JtPC9mb3JtPiAtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzcG90J1wiXHJcbiAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiXHJcbiAgICAgICAgICBzdHlsZT1cImhlaWdodDogNTB2aFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTM3IDM3TDMyLjY1IDMyLjY1TTM1IDI3QzM1IDMxLjQxODMgMzEuNDE4MyAzNSAyNyAzNUMyMi41ODE3IDM1IDE5IDMxLjQxODMgMTkgMjdDMTkgMjIuNTgxNyAyMi41ODE3IDE5IDI3IDE5QzMxLjQxODMgMTkgMzUgMjIuNTgxNyAzNSAyN1pcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibXQtNSBtYi0yXCI+Q29taW5nIHNvb248L2gzPlxyXG4gICAgICAgICAgPHA+VGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgeWV0LjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIENvbWluZyBzb29uIGZvciBhbGwgbGV2ZWxzIC0tPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJzZWxlY3RlZExpYnJhcnkgPT09ICdwcm9kdWN0J1wiXHJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gdy0xMDAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXIgbXQtNVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRUFGOEZGXCIgc3Ryb2tlLXdpZHRoPVwiOFwiIC8+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTM3IDM3TDMyLjY1IDMyLjY1TTM1IDI3QzM1IDMxLjQxODMgMzEuNDE4MyAzNSAyNyAzNUMyMi41ODE3IDM1IDE5IDMxLjQxODMgMTkgMjdDMTkgMjIuNTgxNyAyMi41ODE3IDE5IDI3IDE5QzMxLjQxODMgMTkgMzUgMjIuNTgxNyAzNSAyN1pcIlxyXG4gICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCJcclxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxoMyBjbGFzcz1cIm10LTUgbWItMlwiPkNvbWluZyBzb29uPC9oMz5cclxuICAgICAgICA8cD5UaGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSB5ZXQuIFN0YXJ0IGFkZGluZyBwcm9kdWN0IGZyb20gYnJhbmQgbGlicmFyeTwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVJpZ2h0IENvbHVtbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbC04XCI+XHJcbiAgICAgIDxoNj5Qcm9kdWN0IGJyYW5kIHBsYWNlbWVudHM8L2g2PlxyXG5cclxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIGN1c3RvbS10YWJzIGQtZmxleCBtdC00XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCIgKm5nRm9yPVwibGV0IGxldmVsIG9mIFsnZml4dHVyZScsICdzZWN0aW9uJywgJ3NoZWxmJywgJ3Nwb3QnXVwiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIHctMTAwXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZExldmVsID09PSBsZXZlbFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRUYWIobGV2ZWwpXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cInNlbGVjdGVkTGV2ZWwgPT09IGxldmVsID8gJ3BhZ2UnIDogbnVsbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGxldmVsIHwgdGl0bGVjYXNlIH19IGxldmVsXHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgICA8L3VsPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdmaXh0dXJlJ1wiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJmaXh0dXJlLWxldmVsXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgPCEtLSBWZXJ0aWNhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVydGljYWwtZGltZW5zaW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyB1cFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlIH19e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udW5pdCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8IS0tIEhvcml6b250YWwgYXJyb3dzIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FsbC12aWV3cG9ydFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBCb2R5IGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCIoZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc/Lmxlbmd0aCA/PyAwKSA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1jYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZT8ubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYiBvZiBmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBkcmFmdCBtZS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5XCIgKm5nSWY9XCJmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2JyYW5kQ2F0ZWdvcnlUb29sdGlwPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGI+QnJhbmRzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGMgb2YgZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIEBpZihpdGVtLnNoZWxmVHlwZSA9PT0nc2hlbGYnKXtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9jayBzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSEgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS50cmF5Um93cylcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzZWN0aW9uJ1wiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJzZWN0aW9uLWxldmVsXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgPCEtLSBWZXJ0aWNhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVydGljYWwtZGltZW5zaW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyB1cFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnZhbHVlIH19e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udW5pdCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8IS0tIEhvcml6b250YWwgYXJyb3dzIC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkaW1lbnNpb25BcnJvd3M7IGNvbnRleHQ6IHsgdmFsdWU6IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgfVwiXHJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8cD57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsIH19PC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEJvZHkgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiBpZD1cInNlY3Rpb24tYm9keS1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGlkPVwiYm9keS1sb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWN0aW9uQnlab25lczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCInYnJhbmQtY2F0ZWdvcnknICsgJGluZGV4XCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgZHJhZnQgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uem9uZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIiAqbmdJZj1cIml0ZW0/LnNlY3Rpb24/LmJyYW5kcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGl0ZW0/LnNlY3Rpb24/LmJyYW5kczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCIgY2xhc3M9XCJzZXBhcmF0b3JcIj4gLSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeVwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjIG9mIGl0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2JyYW5kQ2F0ZWdvcnlUb29sdGlwPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGI+QnJhbmRzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGl0ZW0/LnNlY3Rpb24/LmJyYW5kczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGIgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Yj5DYXRlZ29yaWVzOiA8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjIG9mIGl0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBbTk9URV0gYmVsb3cgYmxvY2sgaXMgaWRlbnRpZmllZCBieSB0aGUgZnVuY3Rpb24gdXNpbmcgJ2xhc3RFbGVtZW50JyBnZXR0ZXIgaW4gRE9NIG1hbmlwdWxhdGlvbi4gXHJcbiAgICAgICAgICAgICAgICAgIFNvIGtlZXAgdGhpcyBibG9jayBhbHdheXMgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIG5nRm9yIGxvb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIEBpZihpdGVtLnNoZWxmVHlwZSA9PT0nc2hlbGYnKXtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9jayBzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSEgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS50cmF5Um93cylcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEZvb3RlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzaGVsZidcIj5cclxuICAgICAgICA8ZGl2IGlkPVwic2hlbGYtbGV2ZWxcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8IS0tIFZlcnRpY2FsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRpbWVuc2lvbkFycm93czsgY29udGV4dDogeyB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZSB9XCJcclxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhbGwtdmlld3BvcnRcIj5cclxuICAgICAgICAgICAgICA8IS0tIEhlYWRlciBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhlYWRlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICB7eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQm9keSBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1ibG9ja1wiICpuZ0lmPVwiKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgPiAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCInYnJhbmQtY2F0ZWdvcnknICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU/Lmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGIgb2Ygc2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiIGNsYXNzPVwic2VwYXJhdG9yXCI+IC0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cInNoZWxmQXJyYXkuY29udHJvbHNbaV0/LmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGIgb2Ygc2hlbGZBcnJheS5jb250cm9sc1tpXT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIHNoZWxmQXJyYXkuY29udHJvbHNbaV0/LmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFtOT1RFXSBiZWxvdyBibG9jayBpcyBpZGVudGlmaWVkIGJ5IHRoZSBmdW5jdGlvbiB1c2luZyAnbGFzdEVsZW1lbnQnIGdldHRlciBpbiBET00gbWFuaXB1bGF0aW9uLiBcclxuICAgICAgICAgICAgICAgICAgU28ga2VlcCB0aGlzIGJsb2NrIGFsd2F5cyBhdCB0aGUgYm90dG9tIG9mIHRoaXMgbmdGb3IgbG9vcCAtLT5cclxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSdzaGVsZicpe1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnRyYXlSb3dzKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRm9vdGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ3Nwb3QnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiIHN0eWxlPVwiaGVpZ2h0OiA1MHZoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMzcgMzdMMzIuNjUgMzIuNjVNMzUgMjdDMzUgMzEuNDE4MyAzMS40MTgzIDM1IDI3IDM1QzIyLjU4MTcgMzUgMTkgMzEuNDE4MyAxOSAyN0MxOSAyMi41ODE3IDIyLjU4MTcgMTkgMjcgMTlDMzEuNDE4MyAxOSAzNSAyMi41ODE3IDM1IDI3WlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJtdC01IG1iLTJcIj5Db21pbmcgc29vbjwvaDM+XHJcbiAgICAgICAgICA8cD5UaGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSB5ZXQuIFRyeSBGaXh0dXJlLCBTZWN0aW9uLCBhbmQgU2hlbGYgbGV2ZWxzPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIDxkaXYgaWQ9XCJzcG90LWxldmVsXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgdXBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnZhbHVlIH19e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uQXJyb3dzO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FsbC12aWV3cG9ydFwiPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cIihmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/IDApID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICBAaWYoaXRlbS5zaGVsZlR5cGUgPT09J3NoZWxmJyl7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlICsgKGkgKyAxKVwiIGNsYXNzPVwiYmxvY2sgc2hlbGYgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0ICBcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1AZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0ICBcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48c2VjdGlvbiBpZD1cImZpeHR1cmUtdGVtcGxhdGUtcHJvZHVjdHMtc2tlbGV0b25cIiAqbmdJZj1cImlzUGFnZUxvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPCEtLSBDb21tb24gZGltZW5zaW9uIGFycm93cyAtLT5cclxuPG5nLXRlbXBsYXRlICNkaW1lbnNpb25BcnJvd3MgbGV0LWxhYmVsPVwibGFiZWxcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJob3Jpem9udGFsLWRpbWVuc2lvblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFycm93IGxlZnRcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgIDxzcGFuPnt7IHZhbHVlIH19IHt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udW5pdCB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFycm93IHJpZ2h0XCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|
|
763
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtcHJvZHVjdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvZml4dHVyZS10ZW1wbGF0ZS90ZW1wbGF0ZS1wcm9kdWN0cy90ZW1wbGF0ZS1wcm9kdWN0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9maXh0dXJlLXRlbXBsYXRlL3RlbXBsYXRlLXByb2R1Y3RzL3RlbXBsYXRlLXByb2R1Y3RzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQW9CLFNBQVMsRUFBd0MsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFxQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQVksVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFNdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoSCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUNuSCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQzs7Ozs7Ozs7O0FBU3ZILE1BQU0sT0FBTyx5QkFBeUI7SUFxQzFCO0lBQ0E7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bk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBOZ2JBY2NvcmRpb25Nb2R1bGUsIE5nYk1vZGFsLCBOZ2JUb29sdGlwIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UsIFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzLCBTZWN0aW9uQ29uZmlnLCBTaGVsZkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZml4dHVyZS10ZW1wbGF0ZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBEcm9wZG93bklGIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9wbGFuby1nZW5lcmFsLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFBsYW5vRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wbGFuby1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCcmFuZERldGFpbHMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL3ZtLWxpYnJhcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgU0hFTEZfQ09MT1JTIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS9maXh0dXJlLXRlbXBsYXRlLmRhdGEnO1xyXG5pbXBvcnQgeyBnZW5lcmFsVmFsaWRhdG9yLCByZ2JUb0hleCwgdW5pcXVlRmllbGRJbkZvcm1BcnJheVZhbGlkYXRvciB9IGZyb20gJy4uLy4uLy4uL2Z1bmN0aW9ucy9wbGFuby5mdW5jdGlvbic7XHJcbmltcG9ydCB7IENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcG9wdXBzL2NvbXBsZXRlLWNvbmZpcm1hdGlvbi9jb21wbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTXVsdGlzZWxlY3RDaGlwRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9tdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duL211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24uY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXRlbXBsYXRlLXByb2R1Y3RzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUtcHJvZHVjdHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90ZW1wbGF0ZS1wcm9kdWN0cy5jb21wb25lbnQuc2NzcycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTmdiVG9vbHRpcCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZSwgTmdiQWNjb3JkaW9uTW9kdWxlLCBNdWx0aXNlbGVjdENoaXBEcm9wZG93bkNvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlUHJvZHVjdHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcbiAgY2xpZW50SWQ6IHN0cmluZztcclxuICBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzOiBGaXh0dXJlVGVtcGxhdGVEZXRhaWxzIHwgbnVsbDtcclxuICBzZWxlY3RlZExldmVsOiAnZml4dHVyZScgfCAnc2VjdGlvbicgfCAnc2hlbGYnIHwgJ3Nwb3QnIHwgc3RyaW5nID0gJ2ZpeHR1cmUnO1xyXG5cclxuICBzZWxlY3RlZExpYnJhcnk6ICdwcm9kdWN0JyB8ICdicmFuZCcgfCBzdHJpbmcgPSAnYnJhbmQnO1xyXG5cclxuICBpc1BhZ2VMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGJyYW5kc0xpc3Q6IEJyYW5kRGV0YWlsc1tdID0gW11cclxuICBjYXRlZ29yaWVzTGlzdDogRHJvcGRvd25JRltdID0gW11cclxuICBjYXRlZ29yaWVzTGlzdE1hcDogTWFwPHN0cmluZywgRHJvcGRvd25JRltdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgc2hlbHZlc0xpc3Q6IERyb3Bkb3duSUZbXTtcclxuXHJcbiAgZml4dHVyZUxldmVsRm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlY3Rpb25MZXZlbEZvcm06IEZvcm1Hcm91cDtcclxuICBzaGVsZkxldmVsRm9ybTogRm9ybUdyb3VwO1xyXG4gIHNwb3RMZXZlbEZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgc2hlbGZDb2xvcnMgPSBTSEVMRl9DT0xPUlM7XHJcblxyXG4gIHNlY3Rpb25CeVpvbmVzOiB7XHJcbiAgICB6b25lOiBzdHJpbmcsXHJcbiAgICBzZWN0aW9uOiB7XHJcbiAgICAgIGJyYW5kczogc3RyaW5nW10sXHJcbiAgICAgIGNhdGVnb3JpZXM6IHN0cmluZ1tdLFxyXG4gICAgICBzaGVsdmVzOiBzdHJpbmdbXSxcclxuICAgICAgc2hlbGZEaXZzOiAoSFRNTEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkKVtdXHJcbiAgICB9XHJcbiAgfVtdID0gW11cclxuXHJcbiAgcHJpdmF0ZSBpc1ZpZXdwb3J0SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcHM6IFBsYW5vRGF0YVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5nYk1vZGFsOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICkgeyB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZShhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpO1xyXG4gICAgICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHMuYnJhbmRzTGlzdFxyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5icmFuZHNMaXN0ID0gZSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMucHMuZmV0Y2hCcmFuZHNMaXN0KHRoaXMuY2xpZW50SWQpO1xyXG5cclxuICAgICAgICB0aGlzLnBzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZmlsdGVyKGRhdGEgPT4gIWRhdGE/Lmlnbm9yZVVwZGF0ZSkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyA9IGRhdGE7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUGFnZUxvYWRpbmcpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2hlbHZlc0xpc3QgPSB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKGUpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBgJHtlPy5zaGVsZlR5cGU/LnRvVXBwZXJDYXNlKCl9ICR7ZT8uc2hlbGZOdW1iZXJ9YCxcclxuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogYCR7ZT8uc2hlbGZUeXBlfSAke2U/LnNoZWxmTnVtYmVyfWAsXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSA/PyBbXVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZXRUYWJCeUxldmVsKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpeHR1cmVMZXZlbEZvcm0oKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0U2VjdGlvbkxldmVsRm9ybSgpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRTaGVsZkxldmVsRm9ybSgpXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFNwb3RMZXZlbEZvcm0oKTtcclxuICAgICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuVG9BbGxGb3JtQ2hhbmdlcygpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbU1hcFxyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZShwYXJhbXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzRWRpdE1vZGUgPSBwYXJhbXMuZ2V0KCdpc0VkaXQnKSA9PT0gJ3RydWUnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaGVsZkxldmVsRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICB0aGlzLnNwb3RMZXZlbEZvcm0/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2hlbGZMZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuc3BvdExldmVsRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnBzLmZpeHR1cmVUZW1wbGF0ZUZvcm0kXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB0aGlzLnN1Ym1pdEZvcm0oZGF0YSkpO1xyXG4gICAgICB9KTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiUHJvZHVjdHNcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAgeyB0aXRsZTogXCJQbGFub2dyYW1cIiwgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiRml4dHVyZSBUZW1wbGF0ZVwiLCBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL2ZpeHR1cmUtdGVtcGxhdGVzXCIsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiXCIsIHBhdGg6IFwiXCIsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzVmlld3BvcnRJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmlzVmlld3BvcnRJbml0aWFsaXplZCA9IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGFiQnlMZXZlbCgpIHtcclxuICAgIHN3aXRjaCAodGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsKSB7XHJcbiAgICAgIGNhc2UgJ0wxJzpcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTGV2ZWwgPSAnZml4dHVyZSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0wyJzpcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTGV2ZWwgPSAnc2hlbGYnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdMMyc6XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExldmVsID0gJ3NlY3Rpb24nO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdMNCc6XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZExldmVsID0gJ3Nwb3QnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IGxldmVsOiB0aGlzLnNlbGVjdGVkTGV2ZWwgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMZXZlbEJ5VGFiKCkge1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSAnZml4dHVyZSc6XHJcbiAgICAgICAgcmV0dXJuICdMMSc7XHJcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxyXG4gICAgICAgIHJldHVybiAnTDMnO1xyXG4gICAgICBjYXNlICdzaGVsZic6XHJcbiAgICAgICAgcmV0dXJuICdMMic7XHJcbiAgICAgIGNhc2UgJ3Nwb3QnOlxyXG4gICAgICAgIHJldHVybiAnTDQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEZpeHR1cmVMZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLmZpeHR1cmVMZXZlbEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW3RoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdEJyYW5kTmFtZV0sXHJcbiAgICAgIHByb2R1Y3RDYXRlZ29yeTogW3RoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdENhdGVnb3J5XVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnByb2R1Y3RCcmFuZE5hbWU/LmZvckVhY2goZSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLmJyYW5kc0xpc3QuZmluZChiID0+IGIuYnJhbmROYW1lID09PSBlKT8uY2F0ZWdvcnk/Lm1hcChjID0+IHsgcmV0dXJuIHsgXCJsYWJlbFwiOiBjLCBcInZhbHVlXCI6IGMgfSB9KSA/PyBbXVxyXG4gICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3QsIC4uLmNhdGVnb3JpZXNdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVMZXZlbEZvcm0uZ2V0KFwicHJvZHVjdEJyYW5kTmFtZVwiKT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodjogc3RyaW5nW10pID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gW107XHJcbiAgICAgICAgdi5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IHRoaXMuYnJhbmRzTGlzdC5maW5kKGIgPT4gYi5icmFuZE5hbWUgPT09IGUpPy5jYXRlZ29yeT8ubWFwKGMgPT4geyByZXR1cm4geyBcImxhYmVsXCI6IGMsIFwidmFsdWVcIjogYyB9IH0pID8/IFtdXHJcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0ID0gWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3QsIC4uLmNhdGVnb3JpZXNdXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHZhbGlkQ2F0ZWdvcnlJZHMgPSB0aGlzLmNhdGVnb3JpZXNMaXN0Py5tYXAoYyA9PiBjLnZhbHVlKSA/PyBbXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2F0U2VsZWN0aW9uID0gdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZSB8fCBbXTtcclxuICAgICAgICBjb25zdCBuZXdDYXRTZWxlY3Rpb24gPSBjdXJyZW50Q2F0U2VsZWN0aW9uLmZpbHRlcigoaWQ6IGFueSkgPT4gdmFsaWRDYXRlZ29yeUlkcy5pbmNsdWRlcyhpZCkpO1xyXG4gICAgICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8uc2V0VmFsdWUobmV3Q2F0U2VsZWN0aW9uLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZml4dHVyZUxldmVsRm9ybT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZShjID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKSlcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgdGhpcy5maXh0dXJlTGV2ZWxGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG4gIH1cclxuXHJcbiAgaW5pdFNlY3Rpb25MZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLnNlY3Rpb25MZXZlbEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgc2VjdGlvbjogdGhpcy5mYi5hcnJheShbXSwgdW5pcXVlRmllbGRJbkZvcm1BcnJheVZhbGlkYXRvcignem9uZScpKSxcclxuICAgIH0pXHJcblxyXG4gICAgY29uc3Qgc2VjdGlvbkdyb3VwQXJyYXkgPSB0aGlzLmdyb3VwU2hlbHZlc0J5Wm9uZSh0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnID8/IFtdKTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXBBcnJheS5mb3JFYWNoKChzLCBpKSA9PiB0aGlzLmFkZFNlY3Rpb24ocywgaSkpO1xyXG5cclxuICAgIGlmIChzZWN0aW9uR3JvdXBBcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5hZGRTZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWxsU2VjdGlvblNoZWx2ZXMgPSBzZWN0aW9uR3JvdXBBcnJheS5tYXAoKHNlKSA9PiBzZT8uc2hlbHZlcz8ubWFwKHMgPT4gcykpLmZsYXQoKTtcclxuXHJcbiAgICB0aGlzLnNoZWx2ZXNMaXN0ID0gdGhpcy5zaGVsdmVzTGlzdC5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICBkaXNhYmxlZDogYWxsU2VjdGlvblNoZWx2ZXM/LmluY2x1ZGVzKGAke2l0ZW0/LnZhbHVlfWApXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VjdGlvbkFycmF5LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHM6IFNlY3Rpb25Db25maWdbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFsbFNlY3Rpb25TaGVsdmVzID0gcy5tYXAoKHNlKSA9PiBzZT8uc2hlbHZlcz8ubWFwKHMgPT4gcykpLmZsYXQoKTtcclxuICAgICAgICB0aGlzLnNoZWx2ZXNMaXN0ID0gdGhpcy5zaGVsdmVzTGlzdC5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogYWxsU2VjdGlvblNoZWx2ZXM/LmluY2x1ZGVzKGAke2l0ZW0/LnZhbHVlfWApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbGxTaGVsdmVzVXNlZEluU2VjdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaGVsdmVzTGlzdC5maWx0ZXIocyA9PiAhcy5kaXNhYmxlZCkubGVuZ3RoIDw9IDA7XHJcbiAgfVxyXG5cclxuICBpbml0U2hlbGZMZXZlbEZvcm0oKSB7XHJcbiAgICB0aGlzLnNoZWxmTGV2ZWxGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHNoZWxmOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8uZm9yRWFjaCgoZSwgaSkgPT4gdGhpcy5hZGRTaGVsZihlLCBpKSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRWRpdE1vZGUpIHRoaXMuc2hlbGZMZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgfVxyXG5cclxuICBpbml0U3BvdExldmVsRm9ybSgpIHtcclxuICAgIHRoaXMuc3BvdExldmVsRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBicmFuZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgcHJvZHVjdENhdGVnb3J5OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICB9KVxyXG5cclxuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSB0aGlzLnNwb3RMZXZlbEZvcm0/LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXHJcbiAgfVxyXG5cclxuICBzZXRUYWIodGFiOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRMZXZlbCA9IHRhYjtcclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICBxdWVyeVBhcmFtczogeyBsZXZlbDogdGhpcy5zZWxlY3RlZExldmVsIH0sXHJcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXHJcbiAgICAgIHJlcGxhY2VVcmw6IHRydWUsXHJcbiAgICB9KTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSk7XHJcbiAgICB0aGlzLnVwZGF0ZUNoYW5nZXNUb0xvY2FsKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hlbGZBcnJheSgpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbGZMZXZlbEZvcm0uZ2V0KCdzaGVsZicpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBzZWN0aW9uQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLnNlY3Rpb25MZXZlbEZvcm0uZ2V0KCdzZWN0aW9uJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgYWRkU2VjdGlvbihzZWN0aW9uPzogU2VjdGlvbkNvbmZpZywgaTogbnVtYmVyID0gdGhpcy5zZWN0aW9uQXJyYXkuY29udHJvbHMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCBzZWN0aW9uR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgem9uZTogW3NlY3Rpb24/LnpvbmUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBnZW5lcmFsVmFsaWRhdG9yKCldXSxcclxuICAgICAgc2hlbHZlczogW3NlY3Rpb24/LnNoZWx2ZXMgPz8gW10sIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwcm9kdWN0QnJhbmROYW1lOiBbc2VjdGlvbj8ucHJvZHVjdEJyYW5kTmFtZV0sXHJcbiAgICAgIHByb2R1Y3RDYXRlZ29yeTogW3NlY3Rpb24/LnByb2R1Y3RDYXRlZ29yeSA/PyAnJ10sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlY3Rpb25BcnJheS5wdXNoKHNlY3Rpb25Hcm91cCk7XHJcblxyXG4gICAgY29uc3QgbWFwSWQgPSBgc2VjdGlvbiR7aX1gO1xyXG4gICAgc2VjdGlvbj8ucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLmJyYW5kc0xpc3QuZmluZChiID0+IGIuYnJhbmROYW1lID09PSBlKT8uY2F0ZWdvcnk/Lm1hcChjID0+IHsgcmV0dXJuIHsgXCJsYWJlbFwiOiBjLCBcInZhbHVlXCI6IGMgfSB9KSA/PyBbXVxyXG4gICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChtYXBJZCwgWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KG1hcElkKSA/PyBbXSwgLi4uY2F0ZWdvcmllc10pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2VjdGlvbkxpc3RlbmVyKHNlY3Rpb25Hcm91cCwgbWFwSWQpO1xyXG4gIH1cclxuXHJcbiAgYWRkU2hlbGYoc2hlbGY6IFNoZWxmQ29uZmlnLCBpOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW3NoZWxmPy5wcm9kdWN0QnJhbmROYW1lXSxcclxuICAgICAgcHJvZHVjdENhdGVnb3J5OiBbc2hlbGY/LnByb2R1Y3RDYXRlZ29yeSA/PyAnJyxdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucHVzaChzaGVsZkdyb3VwKTtcclxuXHJcbiAgICBjb25zdCBtYXBJZCA9IGBzaGVsZiR7aX1gXHJcbiAgICBzaGVsZj8ucHJvZHVjdEJyYW5kTmFtZT8uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLmJyYW5kc0xpc3QuZmluZChiID0+IGIuYnJhbmROYW1lID09PSBlKT8uY2F0ZWdvcnk/Lm1hcChjID0+IHsgcmV0dXJuIHsgXCJsYWJlbFwiOiBjLCBcInZhbHVlXCI6IGMgfSB9KSA/PyBbXVxyXG4gICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChtYXBJZCwgWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KG1hcElkKSA/PyBbXSwgLi4uY2F0ZWdvcmllc10pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2hlbGZMaXN0ZW5lcihzaGVsZkdyb3VwLCBtYXBJZCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gIH1cclxuXHJcbiAgc2V0dXBTaGVsZkxpc3RlbmVyKHNoZWxmR3JvdXA6IEZvcm1Hcm91cCwgaTogc3RyaW5nKSB7XHJcbiAgICBzaGVsZkdyb3VwLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKGJyYW5kcyA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5zZXQoaSwgW10pO1xyXG4gICAgICAgIGJyYW5kcy5mb3JFYWNoKChlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSB0aGlzLmJyYW5kc0xpc3QuZmluZChiID0+IGIuYnJhbmROYW1lID09PSBlKT8uY2F0ZWdvcnk/Lm1hcChjID0+IHsgcmV0dXJuIHsgXCJsYWJlbFwiOiBjLCBcInZhbHVlXCI6IGMgfSB9KSA/PyBbXVxyXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5zZXQoaSwgWy4uLnRoaXMuY2F0ZWdvcmllc0xpc3RNYXAuZ2V0KGkpID8/IFtdLCAuLi5jYXRlZ29yaWVzXSlcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gUmVzZXQgY2F0ZWdvcnkgc2VsZWN0aW9uIGlmIHByZXZpb3VzbHkgc2VsZWN0ZWQgY2F0ZWdvcmllcyBhcmUgbm8gbG9uZ2VyIHZhbGlkXHJcbiAgICAgICAgY29uc3QgdmFsaWRDYXRlZ29yeUlkcyA9IHRoaXMuY2F0ZWdvcmllc0xpc3RNYXA/LmdldChpKT8ubWFwKGMgPT4gYy52YWx1ZSkgPz8gW107XHJcbiAgICAgICAgY29uc3QgY3VycmVudENhdFNlbGVjdGlvbiA9IHNoZWxmR3JvdXAuZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWUgfHwgW107XHJcbiAgICAgICAgY29uc3QgbmV3Q2F0U2VsZWN0aW9uID0gY3VycmVudENhdFNlbGVjdGlvbi5maWx0ZXIoKGlkOiBhbnkpID0+IHZhbGlkQ2F0ZWdvcnlJZHMuaW5jbHVkZXMoaWQpKTtcclxuICAgICAgICBzaGVsZkdyb3VwLmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnNldFZhbHVlKG5ld0NhdFNlbGVjdGlvbiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBzaGVsZkdyb3VwLmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYyA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZXR1cFNlY3Rpb25MaXN0ZW5lcihzZWN0aW9uR3JvdXA6IEZvcm1Hcm91cCwgaTogc3RyaW5nKSB7XHJcbiAgICBzZWN0aW9uR3JvdXAuZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoYnJhbmRzID0+IHtcclxuICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChpLCBbXSk7XHJcbiAgICAgICAgYnJhbmRzLmZvckVhY2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IHRoaXMuYnJhbmRzTGlzdC5maW5kKGIgPT4gYi5icmFuZE5hbWUgPT09IGUpPy5jYXRlZ29yeT8ubWFwKGMgPT4geyByZXR1cm4geyBcImxhYmVsXCI6IGMsIFwidmFsdWVcIjogYyB9IH0pID8/IFtdXHJcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXNMaXN0TWFwLnNldChpLCBbLi4udGhpcy5jYXRlZ29yaWVzTGlzdE1hcC5nZXQoaSkgPz8gW10sIC4uLmNhdGVnb3JpZXNdKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBSZXNldCBjYXRlZ29yeSBzZWxlY3Rpb24gaWYgcHJldmlvdXNseSBzZWxlY3RlZCBjYXRlZ29yaWVzIGFyZSBubyBsb25nZXIgdmFsaWRcclxuICAgICAgICBjb25zdCB2YWxpZENhdGVnb3J5SWRzID0gdGhpcy5jYXRlZ29yaWVzTGlzdE1hcD8uZ2V0KGkpPy5tYXAoYyA9PiBjLnZhbHVlKSA/PyBbXTtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2F0U2VsZWN0aW9uID0gc2VjdGlvbkdyb3VwLmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IG5ld0NhdFNlbGVjdGlvbiA9IGN1cnJlbnRDYXRTZWxlY3Rpb24uZmlsdGVyKChpZDogYW55KSA9PiB2YWxpZENhdGVnb3J5SWRzLmluY2x1ZGVzKGlkKSk7XHJcbiAgICAgICAgc2VjdGlvbkdyb3VwLmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnNldFZhbHVlKG5ld0NhdFNlbGVjdGlvbiwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hZGRDb2xvclRvU2hlbHZlcygpKVxyXG4gICAgICB9KTtcclxuXHJcbiAgICBzZWN0aW9uR3JvdXAuZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZShjID0+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSlcclxuICAgICAgfSlcclxuXHJcbiAgICBzZWN0aW9uR3JvdXAuZ2V0KCdzaGVsdmVzJyk/LnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUocyA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpXHJcbiAgICAgIH0pXHJcblxyXG4gICAgc2VjdGlvbkdyb3VwLmdldCgnem9uZScpPy52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2VjdGlvbihpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0TW9kZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWN0aW9uQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFkZENvbG9yVG9TaGVsdmVzKCkpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZvcm1CeUxldmVsKCkge1xyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSAnZml4dHVyZSc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZml4dHVyZUxldmVsRm9ybTtcclxuICAgICAgY2FzZSAnc2VjdGlvbic6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbkxldmVsRm9ybTtcclxuICAgICAgY2FzZSAnc2hlbGYnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnNoZWxmTGV2ZWxGb3JtO1xyXG4gICAgICBjYXNlICdzcG90JzpcclxuICAgICAgICByZXR1cm4gdGhpcy5zcG90TGV2ZWxGb3JtO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLmZpeHR1cmVMZXZlbEZvcm07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRDb2xvclRvU2hlbHZlcygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGxldmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7dGhpcy5zZWxlY3RlZExldmVsfS1sZXZlbGApO1xyXG4gICAgaWYgKCFsZXZlbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgYm9kaWVzID0gbGV2ZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy5ib2R5LWJsb2NrJyk7XHJcbiAgICBpZiAoIWJvZGllcykgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGJvZHlDaGlsZHJlbiA9IEFycmF5LmZyb20oYm9kaWVzLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdO1xyXG5cclxuICAgIGNvbnN0IHNoZWxmRGl2cyA9IGJvZHlDaGlsZHJlblxyXG4gICAgICAubWFwKGRpdiA9PiB7XHJcbiAgICAgICAgY29uc3QgbGFzdCA9IGRpdi5sYXN0RWxlbWVudENoaWxkO1xyXG4gICAgICAgIHJldHVybiBsYXN0ICYmIGxhc3QudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGl2JyA/IGxhc3QgYXMgSFRNTEVsZW1lbnQgOiBudWxsO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKChkKTogZCBpcyBIVE1MRWxlbWVudCA9PiAhIWQpO1xyXG5cclxuICAgIGlmICghc2hlbGZEaXZzLmxlbmd0aCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWRkQ29sb3JUb1NoZWx2ZXMoKSwgMTAwKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZExldmVsKSB7XHJcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOiB7XHJcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RTZXF1ZW50aWFsU2VjdGlvbihzaGVsZkRpdnMpO1xyXG5cclxuICAgICAgICBjb25zdCBzZWN0aW9uQXJyYXkgPSB0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LnZhbHVlPy5zZWN0aW9uIGFzIFNlY3Rpb25Db25maWdbXSA/PyBbXTtcclxuICAgICAgICBjb25zdCBhbGxTZWN0aW9uU2hlbHZlczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAgICAgc2VjdGlvbkFycmF5LmZvckVhY2goKHNlLCBpKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzaGVsZklkcyA9IHNlLnNoZWx2ZXM/Lm1hcChzaCA9PiBzaC5yZXBsYWNlKC9cXHMvZywgXCJcIikudG9Mb3dlckNhc2UoKSkgPz8gW107XHJcbiAgICAgICAgICBhbGxTZWN0aW9uU2hlbHZlcy5wdXNoKC4uLnNoZWxmSWRzKTtcclxuXHJcbiAgICAgICAgICBjb25zdCBzZWNEaXZzID0gc2hlbGZEaXZzLmZpbHRlcihpdGVtID0+IHNoZWxmSWRzLmluY2x1ZGVzKGl0ZW0uaWQpKTtcclxuICAgICAgICAgIHNlY0RpdnMuZm9yRWFjaChkID0+IGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVuYXNzaWduZWRTaGVsdmVzID0gc2hlbGZEaXZzLmZpbHRlcihpdGVtID0+ICFhbGxTZWN0aW9uU2hlbHZlcy5pbmNsdWRlcyhpdGVtLmlkKSk7XHJcbiAgICAgICAgdW5hc3NpZ25lZFNoZWx2ZXMuZm9yRWFjaChkID0+IGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3doaXRlJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25Cb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY3Rpb24tYm9keS1ibG9jaycpO1xyXG4gICAgICAgIGlmIChzZWN0aW9uQm9keSkge1xyXG4gICAgICAgICAgbGV0IHNlY3Rpb25Hcm91cEhlaWdodCA9IDA7XHJcblxyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VjdGlvbkJ5Wm9uZXMuZm9yRWFjaCgoc3osIGkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2VjdGlvbkhlaWdodCA9IHN6LnNlY3Rpb24uc2hlbGZEaXZzLnJlZHVjZSgoaCwgZCkgPT4gaCArIChkPy5vZmZzZXRIZWlnaHQgPz8gMCksIDApO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWN0aW9uV2lkdGggPSBzei5zZWN0aW9uLnNoZWxmRGl2c1swXT8ub2Zmc2V0V2lkdGggPz8gMzQ1O1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBiYyA9IHNlY3Rpb25Cb2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGAjYnJhbmQtY2F0ZWdvcnkke2l9YCk7XHJcbiAgICAgICAgICAgICAgaWYgKGJjKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWNCZyA9IHJnYlRvSGV4KHN6LnNlY3Rpb24uc2hlbGZEaXZzWzBdPy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzLmZpbmQoYyA9PiBjLmJnID09PSBzZWNCZykgPz8gdGhpcy5zaGVsZkNvbG9yc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBiYy5zdHlsZS5ib3JkZXJDb2xvciA9IGNvbG9yLmJvcmRlcjtcclxuICAgICAgICAgICAgICAgIGJjLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmJztcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1ggPSAoY3VycmVudFNlY3Rpb25XaWR0aCAtIGJjLm9mZnNldFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBiY1kgPSAoKGN1cnJlbnRTZWN0aW9uSGVpZ2h0IC0gYmMub2Zmc2V0SGVpZ2h0KSAvIDIpICsgc2VjdGlvbkdyb3VwSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWH1weCwgJHtiY1l9cHgpYDtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uR3JvdXBIZWlnaHQgKz0gY3VycmVudFNlY3Rpb25IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgJ3NoZWxmJzpcclxuICAgICAgICBib2R5Q2hpbGRyZW4uZm9yRWFjaCgoZGl2LCBpKSA9PiB7XHJcbiAgICAgICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1tpXS5iZztcclxuXHJcbiAgICAgICAgICBjb25zdCBiYyA9IGRpdi5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgI2JyYW5kLWNhdGVnb3J5JHtpfWApO1xyXG4gICAgICAgICAgaWYgKGJjKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJjWCA9IChkaXYub2Zmc2V0V2lkdGggLSBiYy5vZmZzZXRXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgICBjb25zdCBiY1kgPSAoZGl2Lm9mZnNldEhlaWdodCAtIGJjLm9mZnNldEhlaWdodCkgLyAyO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS5ib3JkZXJDb2xvciA9IHRoaXMuc2hlbGZDb2xvcnNbaV0uYm9yZGVyO1xyXG4gICAgICAgICAgICBiYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnNoZWxmQ29sb3JzW2ldLnRleHRCZztcclxuICAgICAgICAgICAgYmMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2JjWH1weCwgJHtiY1l9cHgpYDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2ZpeHR1cmUnOlxyXG4gICAgICBjYXNlICdzcG90JzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBzaGVsZkRpdnMuZm9yRWFjaChkID0+IGQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5zaGVsZkNvbG9yc1swXS5iZyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY29uc3RydWN0U2VxdWVudGlhbFNlY3Rpb24oc2hlbGZEaXZzOiAoSFRNTEVsZW1lbnQgfCBudWxsKVtdKSB7XHJcbiAgICBjb25zdCBzaGVsZkNvbmZpZ3M6IFNoZWxmQ29uZmlnW10gPSB0aGlzLmFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyh0aGlzLnNlY3Rpb25MZXZlbEZvcm0/LnZhbHVlPy5zZWN0aW9uIGFzIFNlY3Rpb25Db25maWdbXSk7XHJcbiAgICBjb25zdCBuZXdTZWN0aW9uQnlab25lcyA9IFtdO1xyXG5cclxuICAgIGxldCBwWm9uZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICBmb3IgKGNvbnN0IHMgb2Ygc2hlbGZDb25maWdzKSB7XHJcbiAgICAgIGNvbnN0IHpvbmUgPSBzLnpvbmUgfHwgJyc7XHJcbiAgICAgIGNvbnN0IHNoZWxmSWQgPSBgJHtzLnNoZWxmVHlwZX0ke3Muc2hlbGZOdW1iZXJ9YDtcclxuICAgICAgY29uc3Qgc2hlbGZEaXYgPSBzaGVsZkRpdnMuZmluZChkID0+IGQ/LmlkID09PSBzaGVsZklkKTtcclxuXHJcbiAgICAgIGlmICh6b25lID09PSAnJykgY29udGludWU7XHJcbiAgICAgIGlmICh6b25lICE9PSBwWm9uZSkge1xyXG4gICAgICAgIG5ld1NlY3Rpb25CeVpvbmVzLnB1c2goe1xyXG4gICAgICAgICAgem9uZSxcclxuICAgICAgICAgIHNlY3Rpb246IHtcclxuICAgICAgICAgICAgYnJhbmRzOiBzLnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHMucHJvZHVjdENhdGVnb3J5ID8/IFtdLFxyXG4gICAgICAgICAgICBzaGVsdmVzOiBbc2hlbGZJZF0sXHJcbiAgICAgICAgICAgIHNoZWxmRGl2czogW3NoZWxmRGl2XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBab25lID0gem9uZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uLnNoZWx2ZXMucHVzaChzaGVsZklkKTtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uLnNoZWxmRGl2cy5wdXNoKHNoZWxmRGl2KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VjdGlvbkJ5Wm9uZXMgPSBbLi4ubmV3U2VjdGlvbkJ5Wm9uZXNdXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsbFNoZWxmQWRkVG9TZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hlbHZlc0xpc3QuZXZlcnkocyA9PiBzLmRpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIGdldFBheWxvYWRCeUxldmVsKHN0YXR1czogc3RyaW5nKTogRml4dHVyZVRlbXBsYXRlRGV0YWlscyB8IG51bGwge1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMuZ2V0Rm9ybUJ5TGV2ZWwoKTtcclxuICAgIGNvbnN0IGxldmVsID0gdGhpcy5nZXRMZXZlbEJ5VGFiKCk7XHJcblxyXG4gICAgaWYgKGZvcm0uaW52YWxpZCB8fCAodGhpcy5zZWxlY3RlZExldmVsID09PSAnc2VjdGlvbicgJiYgIXRoaXMuaXNBbGxTaGVsZkFkZFRvU2VjdGlvbikpIHtcclxuICAgICAgZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgICBjb25zdCBlcnJvck1zZyA9IGZvcm0uaW52YWxpZFxyXG4gICAgICAgID8gXCJGb3JtIGlzIGludmFsaWRcIlxyXG4gICAgICAgIDogXCJBc3NpZ24gYWxsIHNoZWx2ZXMgdG8gYSBzZWN0aW9uXCI7XHJcblxyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyb3JNc2cpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3dpdGNoICh0aGlzLnNlbGVjdGVkTGV2ZWwpIHtcclxuICAgICAgY2FzZSAnZml4dHVyZSc6XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3QgY29uZmlnOiBTaGVsZkNvbmZpZ1tdID0gdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4ucyxcclxuICAgICAgICAgICAgICB6b25lOiAnJyxcclxuICAgICAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBbXSxcclxuICAgICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMhLFxyXG4gICAgICAgICAgICBmaXh0dXJlTmFtZTogdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTmFtZT8udHJpbSgpLFxyXG4gICAgICAgICAgICAvLyBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgaXNFZGl0ZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBbLi4uZm9ybT8udmFsdWUucHJvZHVjdEJyYW5kTmFtZV0sXHJcbiAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogWy4uLmZvcm0/LnZhbHVlLnByb2R1Y3RDYXRlZ29yeV1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnN0IGNvbmZpZzogU2hlbGZDb25maWdbXSA9IHRoaXMuYXBwbHlTZWN0aW9uQ29uZmlnVG9TaGVsdmVzKHRoaXMuc2VjdGlvbkxldmVsRm9ybT8udmFsdWU/LnNlY3Rpb24gYXMgU2VjdGlvbkNvbmZpZ1tdKTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAgIGZpeHR1cmVOYW1lOiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVOYW1lPy50cmltKCksXHJcbiAgICAgICAgICAgIC8vIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICBpc0VkaXRlZDogdHJ1ZSxcclxuICAgICAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbGV2ZWwsXHJcbiAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgICAgICBzaGVsZkNvbmZpZzogY29uZmlnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlICdzaGVsZic6XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3QgY29uZmlnOiBTaGVsZkNvbmZpZ1tdID0gdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubWFwKChzLCBpKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4ucyxcclxuICAgICAgICAgICAgICB6b25lOiAnJyxcclxuICAgICAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBmb3JtPy52YWx1ZT8uc2hlbGZbaV0/LnByb2R1Y3RCcmFuZE5hbWUgPz8gW10sXHJcbiAgICAgICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBmb3JtPy52YWx1ZT8uc2hlbGZbaV0/LnByb2R1Y3RDYXRlZ29yeSA/PyBbXSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSkgPz8gW107XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4udGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzISxcclxuICAgICAgICAgICAgZml4dHVyZU5hbWU6IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZU5hbWU/LnRyaW0oKSxcclxuICAgICAgICAgICAgLy8gc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgIGlzRWRpdGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW10sXHJcbiAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWdcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIGNhc2UgJ3Nwb3QnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMhLFxyXG4gICAgICAgICAgZml4dHVyZU5hbWU6IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZU5hbWU/LnRyaW0oKSxcclxuICAgICAgICAgIC8vIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbGV2ZWwsXHJcbiAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBbXSxcclxuICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICBpc0VkaXRlZDogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtQ29tcGxldGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKENvbXBsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSAnQ29tcGxldGUgdGVtcGxhdGUnO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSAnVGVtcGxhdGUgaXMgbm93IHJlYWR5IHRvIGFzc2lnbiBpdCB0byB0aGUgc3RvcmUgYnV0IHN0aWxsIHlvdSBjYW4gY29tZSBhZ2FpbiBhbnkgdGltZSBhbmQgZWRpdCB0aGlzIHRlbXBsYXRlLic7XHJcbiAgICAvLyBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5ub3RlID0gJ1lvdSBjYW5cXCd0IGVkaXQgaXQgb25jZSBhc3NpZ25lZCB0byB0aGUgdGVtcGxhdGUuJztcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHN1Ym1pdEZvcm0oZGF0YTogeyBzdGF0dXM6IHN0cmluZywgZ29CYWNrOiBib29sZWFuIH0pIHtcclxuICAgIGNvbnN0IGV0ID0gdGhpcy5wcy5maXh0dXJlVGVtcGxhdGVFcnJvclRhYnM7XHJcbiAgICBpZiAoIXRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHBheWxvYWQ6IEZpeHR1cmVUZW1wbGF0ZURldGFpbHMgfCBudWxsID0gdGhpcy5nZXRQYXlsb2FkQnlMZXZlbChkYXRhLnN0YXR1cyk7XHJcbiAgICBpZiAoIXBheWxvYWQpIHJldHVybjtcclxuXHJcbiAgICBpZiAoZXQuYmFzaWNEZXRhaWxzIHx8IGV0LnByb2R1Y3RzIHx8IGV0LnZtcykgcmV0dXJuO1xyXG5cclxuICAgIGlmIChkYXRhLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1Db21wbGV0aW9uKCkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBzLnN1Ym1pdEZpeHR1cmVUZW1wbGF0ZURldGFpbHMoeyAuLi5wYXlsb2FkLCB1cGRhdGVkQXQ6IG5ldyBEYXRlKERhdGUubm93KCkpLnRvSVNPU3RyaW5nKCkgfSwgdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLl9pZCEpO1xyXG5cclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXHJcbiAgICAgICAgcXVlcnlQYXJhbXM6IHsgaXNFZGl0OiBmYWxzZSB9LFxyXG4gICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIixcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KFwiRml4dHVyZSB0ZW1wbGF0ZSBkZXRhaWxzIHVwZGF0ZWQuXCIpO1xyXG4gICAgICBpZiAoZGF0YS5nb0JhY2spIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2ZpeHR1cmUtdGVtcGxhdGVzJ10pXHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHtcclxuICAgICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvbWFuYWdlL3BsYW5vZ3JhbS9maXh0dXJlLXRlbXBsYXRlL2Fzc2lnbi1zdG9yZXNcIl0sIHtcclxuICAgICAgICAvLyAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwicHJlc2VydmVcIixcclxuICAgICAgICAvLyB9KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdyb3VwU2hlbHZlc0J5Wm9uZShpbnB1dDogU2hlbGZDb25maWdbXSk6IFNlY3Rpb25Db25maWdbXSB7XHJcbiAgICBjb25zdCB6b25lTWFwOiB7IFt6b25lOiBzdHJpbmddOiBTZWN0aW9uQ29uZmlnIH0gPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpIHtcclxuICAgICAgY29uc3Qgem9uZSA9IGl0ZW0/LnpvbmUgPz8gJyc7XHJcbiAgICAgIGNvbnN0IHNoZWxmTGFiZWwgPSBgJHtpdGVtLnNoZWxmVHlwZX0gJHtpdGVtLnNoZWxmTnVtYmVyfWA7XHJcblxyXG4gICAgICBpZiAoem9uZSA9PT0gJycpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCF6b25lTWFwW3pvbmVdKSB7XHJcbiAgICAgICAgem9uZU1hcFt6b25lXSA9IHtcclxuICAgICAgICAgIHNoZWx2ZXM6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogdGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5wcm9kdWN0UmVzb2x1dGlvbkxldmVsID09PSAnTDMnID8gaXRlbS5wcm9kdWN0QnJhbmROYW1lIDogW10sXHJcbiAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IHRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscz8ucHJvZHVjdFJlc29sdXRpb25MZXZlbCA9PT0gJ0wzJyA/IGl0ZW0ucHJvZHVjdENhdGVnb3J5IDogW10sXHJcbiAgICAgICAgICB6b25lOiB6b25lXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgem9uZU1hcFt6b25lXT8uc2hlbHZlcz8ucHVzaChzaGVsZkxhYmVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh6b25lTWFwKTtcclxuICB9XHJcblxyXG4gIGFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyhcclxuICAgIHNlY3Rpb25zOiBTZWN0aW9uQ29uZmlnW11cclxuICApOiBTaGVsZkNvbmZpZ1tdIHtcclxuICAgIGNvbnN0IHNlY3Rpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgUGljazxTZWN0aW9uQ29uZmlnLCAnem9uZScgfCAncHJvZHVjdEJyYW5kTmFtZScgfCAncHJvZHVjdENhdGVnb3J5Jz4+KCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XHJcbiAgICAgIGZvciAoY29uc3Qgc2hlbGZMYWJlbCBvZiBzZWN0aW9uLnNoZWx2ZXMhKSB7XHJcbiAgICAgICAgc2VjdGlvbk1hcC5zZXQoc2hlbGZMYWJlbCwge1xyXG4gICAgICAgICAgem9uZTogc2VjdGlvbi56b25lLFxyXG4gICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogc2VjdGlvbi5wcm9kdWN0QnJhbmROYW1lLFxyXG4gICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBzZWN0aW9uLnByb2R1Y3RDYXRlZ29yeVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQXBwbHkgb3ZlcnJpZGVzIHRvIG1hdGNoaW5nIHNoZWx2ZXNcclxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoc2hlbGYgPT4ge1xyXG4gICAgICBjb25zdCBzaGVsZkxhYmVsID0gYCR7c2hlbGYuc2hlbGZUeXBlfSAke3NoZWxmLnNoZWxmTnVtYmVyfWA7XHJcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gc2VjdGlvbk1hcC5nZXQoc2hlbGZMYWJlbCk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIC4uLnNoZWxmLFxyXG4gICAgICAgIHpvbmU6IG92ZXJyaWRlPy56b25lIHx8ICcnLFxyXG4gICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IG92ZXJyaWRlPy5wcm9kdWN0QnJhbmROYW1lID8/IFtdLFxyXG4gICAgICAgIHByb2R1Y3RDYXRlZ29yeTogb3ZlcnJpZGU/LnByb2R1Y3RDYXRlZ29yeSA/PyBbXVxyXG4gICAgICB9O1xyXG4gICAgfSkgPz8gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RlblRvQWxsRm9ybUNoYW5nZXMoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZUNoYW5nZXNUb0xvY2FsKCk7XHJcblxyXG4gICAgY29uc3QgZm9ybXNUb1dhdGNoID0gW1xyXG4gICAgICB0aGlzLmZpeHR1cmVMZXZlbEZvcm0sXHJcbiAgICAgIHRoaXMuc2VjdGlvbkxldmVsRm9ybSxcclxuICAgICAgdGhpcy5zaGVsZkxldmVsRm9ybSxcclxuICAgICAgdGhpcy5zcG90TGV2ZWxGb3JtXHJcbiAgICBdO1xyXG5cclxuICAgIGZvcm1zVG9XYXRjaC5mb3JFYWNoKGZvcm0gPT4ge1xyXG4gICAgICBpZiAoIWZvcm0pIHJldHVybjtcclxuICAgICAgaWYgKHRoaXMucHMuZml4dHVyZVRlbXBsYXRlRXJyb3JUYWJzLnByb2R1Y3RzKSBmb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgZm9ybS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDaGFuZ2VzVG9Mb2NhbCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2hhbmdlc1RvTG9jYWwoKSB7XHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtQnlMZXZlbCgpO1xyXG4gICAgY29uc3QgdmFsID0gZm9ybS52YWx1ZTtcclxuXHJcbiAgICBsZXQgcGF5bG9hZDogRml4dHVyZVRlbXBsYXRlRGV0YWlscyB8IG51bGw7XHJcblxyXG4gICAgY29uc3QgbGV2ZWwgPSB0aGlzLmdldExldmVsQnlUYWIoKTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuc2VsZWN0ZWRMZXZlbCkge1xyXG4gICAgICBjYXNlICdmaXh0dXJlJzpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb25zdCBjb25maWc6IFNoZWxmQ29uZmlnW10gPSB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKHMsIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAuLi5zLFxyXG4gICAgICAgICAgICAgIHpvbmU6ICcnLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pID8/IFtdO1xyXG5cclxuICAgICAgICAgIHBheWxvYWQgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgICAgIHByb2R1Y3RSZXNvbHV0aW9uTGV2ZWw6IGxldmVsLFxyXG4gICAgICAgICAgICBwcm9kdWN0QnJhbmROYW1lOiBbLi4udmFsLnByb2R1Y3RCcmFuZE5hbWVdLFxyXG4gICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFsuLi52YWwucHJvZHVjdENhdGVnb3J5XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlICdzZWN0aW9uJzpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb25zdCBjb25maWc6IFNoZWxmQ29uZmlnW10gPSB0aGlzLmFwcGx5U2VjdGlvbkNvbmZpZ1RvU2hlbHZlcyh2YWwuc2VjdGlvbiBhcyBTZWN0aW9uQ29uZmlnW10pO1xyXG4gICAgICAgICAgcGF5bG9hZCA9IHtcclxuICAgICAgICAgICAgLi4udGhpcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzISxcclxuICAgICAgICAgICAgcHJvZHVjdFJlc29sdXRpb25MZXZlbDogbGV2ZWwsXHJcbiAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IFtdLFxyXG4gICAgICAgICAgICBzaGVsZkNvbmZpZzogY29uZmlnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIGNhc2UgJ3NoZWxmJzpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb25zdCBjb25maWc6IFNoZWxmQ29uZmlnW10gPSB0aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5tYXAoKHMsIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAuLi5zLFxyXG4gICAgICAgICAgICAgIHpvbmU6ICcnLFxyXG4gICAgICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IHZhbC5zaGVsZltpXT8ucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnk6IHZhbC5zaGVsZltpXT8ucHJvZHVjdENhdGVnb3J5ID8/IFtdLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSA/PyBbXTtcclxuXHJcbiAgICAgICAgICBwYXlsb2FkID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMhLFxyXG4gICAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgICAgcHJvZHVjdEJyYW5kTmFtZTogW10sXHJcbiAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeTogW10sXHJcbiAgICAgICAgICAgIHNoZWxmQ29uZmlnOiBjb25maWdcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSAnc3BvdCc6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcGF5bG9hZCA9IHtcclxuICAgICAgICAgIC4uLnRoaXMuZml4dHVyZVRlbXBsYXRlRGV0YWlscyEsXHJcbiAgICAgICAgICBwcm9kdWN0UmVzb2x1dGlvbkxldmVsOiBsZXZlbCxcclxuICAgICAgICAgIHByb2R1Y3RCcmFuZE5hbWU6IFtdLFxyXG4gICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBbXVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBzLmZpeHR1cmVUZW1wbGF0ZURldGFpbHMubmV4dCh7IC4uLnBheWxvYWQsIGlnbm9yZVVwZGF0ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5wcy5maXh0dXJlVGVtcGxhdGVFcnJvclRhYnMucHJvZHVjdHMgPVxyXG4gICAgICAgIGZvcm0uaW52YWxpZCB8fCAodGhpcy5zZWxlY3RlZExldmVsID09PSAnc2VjdGlvbicgJiYgIXRoaXMuaXNBbGxTaGVsZkFkZFRvU2VjdGlvbik7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBjbGVhblVwRW1wdHlTZWN0aW9ucygpIHtcclxuICAgIGNvbnN0IHNoZWxmQ29uZmlnczogU2hlbGZDb25maWdbXSA9IHRoaXMuYXBwbHlTZWN0aW9uQ29uZmlnVG9TaGVsdmVzKHRoaXMuc2VjdGlvbkxldmVsRm9ybT8udmFsdWU/LnNlY3Rpb24gYXMgU2VjdGlvbkNvbmZpZ1tdKTtcclxuICAgIGNvbnN0IG5ld1NlY3Rpb25CeVpvbmVzID0gW107XHJcblxyXG4gICAgbGV0IHBab25lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcyBvZiBzaGVsZkNvbmZpZ3MpIHtcclxuICAgICAgY29uc3Qgem9uZSA9IHMuem9uZSB8fCAnJztcclxuICAgICAgY29uc3Qgc2hlbGZJZCA9IGAke3Muc2hlbGZUeXBlfSR7cy5zaGVsZk51bWJlcn1gO1xyXG5cclxuICAgICAgaWYgKHpvbmUgPT09ICcnKSBjb250aW51ZTtcclxuICAgICAgaWYgKHpvbmUgIT09IHBab25lKSB7XHJcbiAgICAgICAgbmV3U2VjdGlvbkJ5Wm9uZXMucHVzaCh7XHJcbiAgICAgICAgICB6b25lLFxyXG4gICAgICAgICAgc2VjdGlvbjoge1xyXG4gICAgICAgICAgICBicmFuZHM6IHMucHJvZHVjdEJyYW5kTmFtZSA/PyBbXSxcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogcy5wcm9kdWN0Q2F0ZWdvcnkgPz8gW10sXHJcbiAgICAgICAgICAgIHNoZWx2ZXM6IFtzaGVsZklkXSxcclxuICAgICAgICAgICAgc2hlbGZEaXZzOiBbXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBab25lID0gem9uZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uLnNoZWx2ZXMucHVzaChzaGVsZklkKTtcclxuICAgICAgICBuZXdTZWN0aW9uQnlab25lc1tuZXdTZWN0aW9uQnlab25lcy5sZW5ndGggLSAxXS5zZWN0aW9uLnNoZWxmRGl2cyA9IFtdXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlY3Rpb25CeVpvbmVzID0gWy4uLm5ld1NlY3Rpb25CeVpvbmVzXVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIHRoaXMuY2xlYW5VcEVtcHR5U2VjdGlvbnMoKTtcclxuICAgIHRoaXMucHMuZml4dHVyZVRlbXBsYXRlRGV0YWlscy5uZXh0KHsgLi4udGhpcy5wcy5maXh0dXJlVGVtcGxhdGVEZXRhaWxzLnZhbHVlLCBpZ25vcmVVcGRhdGU6IGZhbHNlIH0pO1xyXG4gIH1cclxufVxyXG5cclxuIiwiPHNlY3Rpb24gaWQ9XCJmaXh0dXJlLXRlbXBsYXRlLXByb2R1Y3RzXCIgKm5nSWY9XCIhaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZ2FwLTQgYnVpbGRlclwiPlxyXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1MZWZ0IENvbHVtbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xzIGNvbFwiPlxyXG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgY3VzdG9tLXRhYnMgZC1mbGV4XCIgW2NsYXNzLmRpc2FibGVkLWNsaWNrXT1cIiFpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW0gZmxleC1maWxsXCIgKm5nRm9yPVwibGV0IGxpYnJhcnkgb2YgWydicmFuZCcsICdwcm9kdWN0J11cIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGluayB3LTEwMFwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRMaWJyYXJ5ID09PSBsaWJyYXJ5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkTGlicmFyeSA9IGxpYnJhcnlcIiBbYXR0ci5hcmlhLWN1cnJlbnRdPVwic2VsZWN0ZWRMaWJyYXJ5ID09PSBsaWJyYXJ5ID8gJ3BhZ2UnIDogbnVsbFwiPlxyXG4gICAgICAgICAgICB7eyBsaWJyYXJ5IHwgdGl0bGVjYXNlIH19IExpYnJhcnlcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgIDwvdWw+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRMaWJyYXJ5ID09PSAnYnJhbmQnXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgIT09ICdzcG90J1wiPlxyXG4gICAgICAgICAgPGgyPkFkZCBwcm9kdWN0cyBieSBicmFuZCBsZXZlbDwvaDI+XHJcbiAgICAgICAgICA8cD5QbGFjZSB0aGUgcHJvZHVjdCBicmFuZCBpbiB0aGUgZGVzaWduYXRlZCBwbGFjZW1lbnQgYXJlYS48L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBGaXh0dXJlIGxldmVsIHdpdGhpbiBCcmFuZCBMaWJyYXJ5ICAtLT5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpeHR1cmVMZXZlbEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdmaXh0dXJlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicHJvZHVjdEJyYW5kTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+QnJhbmQ8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93biBbaXRlbXNdPVwiYnJhbmRzTGlzdFwiIFtpZEZpZWxkXT1cIidicmFuZE5hbWUnXCIgW25hbWVGaWVsZF09XCInYnJhbmROYW1lJ1wiXHJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgYnJhbmRzJ1wiIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RCcmFuZE5hbWVcIlxyXG4gICAgICAgICAgICAgIFtzZWFyY2hdPVwidHJ1ZVwiPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlTGV2ZWxGb3JtLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy50b3VjaGVkICYmIGZpeHR1cmVMZXZlbEZvcm0uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LmludmFsaWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IHByb2R1Y3QgYnJhbmRcclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UHJvZHVjdCBjYXRlZ29yeTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbaXRlbXNdPVwiY2F0ZWdvcmllc0xpc3RcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IGNhdGVnb3JpZXMnXCIgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdENhdGVnb3J5XCJcclxuICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIj48L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcblxyXG4gICAgICAgIDwhLS0gU2VjdGlvbiBsZXZlbCB3aXRoaW4gQnJhbmQgTGlicmFyeSAtLT5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInNlY3Rpb25MZXZlbEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzZWN0aW9uJ1wiPlxyXG4gICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwic2VjdGlvblwiIGNsYXNzPVwiYXJyYXktd3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIHNlY3Rpb25BcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImFycmF5LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyAnYm9yZGVyLWNvbG9yJzogc2hlbGZDb2xvcnNbaV0uYmcgfVwiIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+U0VDVElPTiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiICpuZ0lmPVwiaSAhPT0gMFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiAoY2xpY2spPVwicmVtb3ZlU2VjdGlvbihpKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlNlY3Rpb24gbGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImxhYmVsXCIgZm9ybUNvbnRyb2xOYW1lPVwiem9uZVwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY3Rpb24uZ2V0KCd6b25lJyk/LnRvdWNoZWQgJiYgc2VjdGlvbi5nZXQoJ3pvbmUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3pvbmUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj4gU2VjdGlvbiBuYW1lIGlzXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQuIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VjdGlvbiBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnem9uZScpPy5oYXNFcnJvcignbm90VW5pcXVlJylcIj4gRHVwbGljYXRlIHNlY3Rpb24gbmFtZS5cclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic2hlbHZlc1wiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UGljayB0aGUgc2hlbGYocykgZm9yIHNlY3Rpb24ge3sgaSArIDEgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24gW2l0ZW1zXT1cInNoZWx2ZXNMaXN0XCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNoZWx2ZXNcIiBbc2VhcmNoXT1cInRydWVcIj48L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VjdGlvbi5nZXQoJ3NoZWx2ZXMnKT8udG91Y2hlZCAmJiBzZWN0aW9uLmdldCgnc2hlbHZlcycpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzZWN0aW9uLmdldCgnc2hlbHZlcycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPiBQaWNrIHRoZSBzaGVsZihzKVxyXG4gICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcm9kdWN0QnJhbmROYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5CcmFuZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93biBbaXRlbXNdPVwiYnJhbmRzTGlzdFwiIFtpZEZpZWxkXT1cIidicmFuZE5hbWUnXCIgW25hbWVGaWVsZF09XCInYnJhbmROYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RCcmFuZE5hbWVcIiBbc2VhcmNoXT1cInRydWVcIj48L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWN0aW9uLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy50b3VjaGVkICYmIHNlY3Rpb24uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNlY3Rpb24uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUGxlYXNlIHNlbGVjdCBwcm9kdWN0IGJyYW5kXHJcbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIG1iLTRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwcm9kdWN0Q2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlByb2R1Y3QgY2F0ZWdvcnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG11bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24gW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJjYXRlZ29yaWVzTGlzdE1hcC5nZXQoJ3NlY3Rpb24nICsgaSkgPz8gW11cIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIj48L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTRcIj5cclxuICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICBpc0FsbFNoZWx2ZXNVc2VkSW5TZWN0aW9uc1xyXG4gICAgICAgICAgICAgICAgICA/ICdBbGwgc2hlbHZlcyBhcmUgYXNzaWduZWQuIE5vIHNoZWx2ZXMgYXZhaWxhYmxlIGZvciBuZXcgc2VjdGlvbnMuJ1xyXG4gICAgICAgICAgICAgICAgICA6ICdZb3UgY2Fubm90IGNyZWF0ZSBtb3JlIHNlY3Rpb25zIHRoYW4gdGhlIHRvdGFsIHNoZWx2ZXMgYXZhaWxhYmxlLidcclxuICAgICAgICAgICAgICBcIiBbZGlzYWJsZVRvb2x0aXBdPVwiXHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uQXJyYXkubGVuZ3RoIDwgKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgJiYgIWlzQWxsU2hlbHZlc1VzZWRJblNlY3Rpb25zXHJcbiAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHNlY3Rpb25BcnJheS5sZW5ndGggPj0gKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgfHwgaXNBbGxTaGVsdmVzVXNlZEluU2VjdGlvbnNcclxuICAgICAgICAgICAgICAgIFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtZW5kXCIgKGNsaWNrKT1cImFkZFNlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgQWRkIHNlY3Rpb25cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICA8IS0tIFNoZWxmIGxldmVsIHdpdGhpbiBCcmFuZCBMaWJyYXJ5IC0tPlxyXG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwic2hlbGZMZXZlbEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzaGVsZidcIj5cclxuICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInNoZWxmXCIgY2xhc3M9XCJhcnJheS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiYXJyYXktY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7ICdib3JkZXItY29sb3InOiBzaGVsZkNvbG9yc1tpXS5iZyB9XCIgLS0+XHJcbiAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TSEVMRiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RCcmFuZE5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkJyYW5kPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtdWx0aXNlbGVjdC1jaGlwLWRyb3Bkb3duIFtpdGVtc109XCJicmFuZHNMaXN0XCIgW2lkRmllbGRdPVwiJ2JyYW5kTmFtZSdcIiBbbmFtZUZpZWxkXT1cIidicmFuZE5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvZHVjdEJyYW5kTmFtZVwiIFtzZWFyY2hdPVwidHJ1ZVwiPjwvbXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInNoZWxmLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy50b3VjaGVkICYmIHNoZWxmLmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IHByb2R1Y3QgYnJhbmRcclxuICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInByb2R1Y3RDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+UHJvZHVjdCBjYXRlZ29yeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8bXVsdGlzZWxlY3QtY2hpcC1kcm9wZG93biBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImNhdGVnb3JpZXNMaXN0TWFwLmdldCgnc2hlbGYnICsgaSkgPz8gW11cIiBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2F0ZWdvcnlcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VhcmNoXT1cInRydWVcIj48L211bHRpc2VsZWN0LWNoaXAtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9mb3JtPlxyXG5cclxuICAgICAgICA8IS0tIFNwb3QgbGV2ZWwgd2l0aGluIEJyYW5kIExpYnJhcnkgLS0+XHJcbiAgICAgICAgPCEtLSA8Zm9ybSBbZm9ybUdyb3VwXT1cInNwb3RMZXZlbEZvcm1cIiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzcG90J1wiPlNwb3QgbGV2ZWwgRm9ybTwvZm9ybT4gLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzcG90J1wiXHJcbiAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiB3LTEwMCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlclwiIHN0eWxlPVwiaGVpZ2h0OiA1MHZoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNMzcgMzdMMzIuNjUgMzIuNjVNMzUgMjdDMzUgMzEuNDE4MyAzMS40MTgzIDM1IDI3IDM1QzIyLjU4MTcgMzUgMTkgMzEuNDE4MyAxOSAyN0MxOSAyMi41ODE3IDIyLjU4MTcgMTkgMjcgMTlDMzEuNDE4MyAxOSAzNSAyMi41ODE3IDM1IDI3WlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJtdC01IG1iLTJcIj5Db21pbmcgc29vbjwvaDM+XHJcbiAgICAgICAgICA8cD5UaGlzIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSB5ZXQuPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gQ29taW5nIHNvb24gZm9yIGFsbCBsZXZlbHMgLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZExpYnJhcnkgPT09ICdwcm9kdWN0J1wiXHJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gdy0xMDAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXIgbXQtNVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNFQUY4RkZcIiBzdHJva2Utd2lkdGg9XCI4XCIgLz5cclxuICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgIGQ9XCJNMzcgMzdMMzIuNjUgMzIuNjVNMzUgMjdDMzUgMzEuNDE4MyAzMS40MTgzIDM1IDI3IDM1QzIyLjU4MTcgMzUgMTkgMzEuNDE4MyAxOSAyN0MxOSAyMi41ODE3IDIyLjU4MTcgMTkgMjcgMTlDMzEuNDE4MyAxOSAzNSAyMi41ODE3IDM1IDI3WlwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aDMgY2xhc3M9XCJtdC01IG1iLTJcIj5Db21pbmcgc29vbjwvaDM+XHJcbiAgICAgICAgPHA+VGhpcyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUgeWV0LiBTdGFydCBhZGRpbmcgcHJvZHVjdCBmcm9tIGJyYW5kIGxpYnJhcnk8L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1SaWdodCBDb2x1bW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29scyBjb2wtOFwiPlxyXG4gICAgICA8aDY+UHJvZHVjdCBicmFuZCBwbGFjZW1lbnRzPC9oNj5cclxuXHJcbiAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXYtdGFicyBjdXN0b20tdGFicyBkLWZsZXggbXQtNFwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIGZsZXgtZmlsbFwiICpuZ0Zvcj1cImxldCBsZXZlbCBvZiBbJ2ZpeHR1cmUnLCAnc2VjdGlvbicsICdzaGVsZicsICdzcG90J11cIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtbGluayB3LTEwMFwiIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRMZXZlbCA9PT0gbGV2ZWxcIiAoY2xpY2spPVwic2V0VGFiKGxldmVsKVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJzZWxlY3RlZExldmVsID09PSBsZXZlbCA/ICdwYWdlJyA6IG51bGxcIj5cclxuICAgICAgICAgICAge3sgbGV2ZWwgfCB0aXRsZWNhc2UgfX0gbGV2ZWxcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgIDwvdWw+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRMZXZlbCA9PT0gJ2ZpeHR1cmUnXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cImZpeHR1cmUtbGV2ZWxcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8IS0tIFZlcnRpY2FsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbkFycm93cztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBcIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICB7eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQm9keSBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1ibG9ja1wiICpuZ0lmPVwiKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgPiAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiYnJhbmQtY2F0ZWdvcnlcIiBjbGFzcz1cImJyYW5kLWNhdGVnb3J5XCJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU/Lmxlbmd0aFwiIFtuZ2JUb29sdGlwXT1cImJyYW5kQ2F0ZWdvcnlUb29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBiIG9mIGZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGRyYWZ0IG1lLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnlcIiAqbmdJZj1cImZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjIG9mIGZpeHR1cmVMZXZlbEZvcm0/LmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGIgb2YgZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0QnJhbmROYW1lJyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiZml4dHVyZUxldmVsRm9ybT8uZ2V0KCdwcm9kdWN0Q2F0ZWdvcnknKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGI+Q2F0ZWdvcmllczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBmaXh0dXJlTGV2ZWxGb3JtPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uc2hlbGZDb25maWc7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgQGlmKGl0ZW0uc2hlbGZUeXBlID09PSd0cmF5Jyl7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnRyYXlSb3dzKVwiIGNsYXNzPVwidHJheSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5wcm9kdWN0UGVyU2hlbGYpXCIgY2xhc3M9XCJwcm9kdWN0XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSEgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9jayBzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gRm9vdGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5mb290ZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciBsZWZ0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgcmlnaHQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8cD57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5mb290ZXI/LmxhYmVsIH19PC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZExldmVsID09PSAnc2VjdGlvbidcIj5cclxuICAgICAgICA8ZGl2IGlkPVwic2VjdGlvbi1sZXZlbFwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgIDwhLS0gVmVydGljYWwgYXJyb3dzIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgdXBcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy52YWx1ZSB9fXt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVMZW5ndGg/LnVuaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgZG93blwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPCEtLSBIb3Jpem9udGFsIGFycm93cyAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGltZW5zaW9uQXJyb3dzOyBjb250ZXh0OiB7IHZhbHVlOiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnZhbHVlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmhlYWRlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gQm9keSBibG9jayAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1ibG9ja1wiIGlkPVwic2VjdGlvbi1ib2R5LWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgaWQ9XCJib2R5LWxvYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNlY3Rpb25CeVpvbmVzOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiJ2JyYW5kLWNhdGVnb3J5JyArICRpbmRleFwiIGNsYXNzPVwiYnJhbmQtY2F0ZWdvcnlcIiBbbmdiVG9vbHRpcF09XCJicmFuZENhdGVnb3J5VG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgZHJhZnQgbWUtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS56b25lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZFwiICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uYnJhbmRzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYiBvZiBpdGVtPy5zZWN0aW9uPy5icmFuZHM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8uc2VjdGlvbj8uY2F0ZWdvcmllcz8ubGVuZ3RoXCIgY2xhc3M9XCJzZXBhcmF0b3JcIj4gLSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5XCIgKm5nSWY9XCJpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYyBvZiBpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzO3RyYWNrICRpbmRleDsgbGV0IGxhc3QgPSAkbGFzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNicmFuZENhdGVnb3J5VG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJyYW5kczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGl0ZW0/LnNlY3Rpb24/LmJyYW5kczt0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtPy5zZWN0aW9uPy5jYXRlZ29yaWVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+Q2F0ZWdvcmllczogPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjIG9mIGl0ZW0/LnNlY3Rpb24/LmNhdGVnb3JpZXM7dHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gW05PVEVdIGJlbG93IGJsb2NrIGlzIGlkZW50aWZpZWQgYnkgdGhlIGZ1bmN0aW9uIHVzaW5nICdsYXN0RWxlbWVudCcgZ2V0dGVyIGluIERPTSBtYW5pcHVsYXRpb24uIFxyXG4gICAgICAgICAgICAgICAgICBTbyBrZWVwIHRoaXMgYmxvY2sgYWx3YXlzIGF0IHRoZSBib3R0b20gb2YgdGhpcyBuZ0ZvciBsb29wIC0tPlxyXG4gICAgICAgICAgICAgICAgICBAaWYoaXRlbS5zaGVsZlR5cGUgPT09J3RyYXknKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBGb290ZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzaGVsZidcIj5cclxuICAgICAgICA8ZGl2IGlkPVwic2hlbGYtbGV2ZWxcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8IS0tIFZlcnRpY2FsIGFycm93cyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy51bml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBhcnJvd3MgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRpbWVuc2lvbkFycm93czsgY29udGV4dDogeyB2YWx1ZTogZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy52YWx1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FsbC12aWV3cG9ydFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gSGVhZGVyIGJsb2NrIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIEJvZHkgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktYmxvY2tcIiAqbmdJZj1cIihmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZz8ubGVuZ3RoID8/IDApID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5zaGVsZkNvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidicmFuZC1jYXRlZ29yeScgKyBpXCIgY2xhc3M9XCJicmFuZC1jYXRlZ29yeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU/Lmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiYnJhbmRDYXRlZ29yeVRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kXCIgKm5nSWY9XCJzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYiBvZiBzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RCcmFuZE5hbWUnKT8udmFsdWU7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBiIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZT8ubGVuZ3RoXCIgY2xhc3M9XCJzZXBhcmF0b3JcIj4gLVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5XCIgKm5nSWY9XCJzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBiIG9mIHNoZWxmQXJyYXkuY29udHJvbHNbaV0/LmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYiB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxhc3RcIj4sIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYnJhbmRDYXRlZ29yeVRvb2x0aXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj5CcmFuZHM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjIG9mIHNoZWxmQXJyYXkuY29udHJvbHNbaV0/LmdldCgncHJvZHVjdEJyYW5kTmFtZScpPy52YWx1ZTsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGFzdFwiPiwgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzaGVsZkFycmF5LmNvbnRyb2xzW2ldPy5nZXQoJ3Byb2R1Y3RDYXRlZ29yeScpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNhdGVnb3JpZXM6IDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjIG9mIHNoZWxmQXJyYXkuY29udHJvbHNbaV0/LmdldCgncHJvZHVjdENhdGVnb3J5Jyk/LnZhbHVlOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+LCA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gW05PVEVdIGJlbG93IGJsb2NrIGlzIGlkZW50aWZpZWQgYnkgdGhlIGZ1bmN0aW9uIHVzaW5nICdsYXN0RWxlbWVudCcgZ2V0dGVyIGluIERPTSBtYW5pcHVsYXRpb24uIFxyXG4gICAgICAgICAgICAgICAgICBTbyBrZWVwIHRoaXMgYmxvY2sgYWx3YXlzIGF0IHRoZSBib3R0b20gb2YgdGhpcyBuZ0ZvciBsb29wIC0tPlxyXG4gICAgICAgICAgICAgICAgICBAaWYoaXRlbS5zaGVsZlR5cGUgPT09J3RyYXknKXtcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpZF09XCJpdGVtLnNoZWxmVHlwZSArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0udHJheVJvd3MpXCIgY2xhc3M9XCJ0cmF5IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIml0ZW0uc2hlbGZUeXBlISArIChpICsgMSlcIiBjbGFzcz1cImJsb2NrIHNoZWxmXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0ucHJvZHVjdFBlclNoZWxmKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBGb290ZXIgYmxvY2sgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1ibG9ja1wiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8uaXNFbmFibGVkICYmIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVUeXBlID09PSAnd2FsbCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIGxlZnQtYm94XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWZvb3RlciByaWdodC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZvb3Rlcj8ubGFiZWwgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTGV2ZWwgPT09ICdzcG90J1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gdy0xMDAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDUwdmhcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjREFGMUZGXCIgLz5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRUFGOEZGXCIgc3Ryb2tlLXdpZHRoPVwiOFwiIC8+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgZD1cIk0zNyAzN0wzMi42NSAzMi42NU0zNSAyN0MzNSAzMS40MTgzIDMxLjQxODMgMzUgMjcgMzVDMjIuNTgxNyAzNSAxOSAzMS40MTgzIDE5IDI3QzE5IDIyLjU4MTcgMjIuNTgxNyAxOSAyNyAxOUMzMS40MTgzIDE5IDM1IDIyLjU4MTcgMzUgMjdaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDxoMyBjbGFzcz1cIm10LTUgbWItMlwiPkNvbWluZyBzb29uPC9oMz5cclxuICAgICAgICAgIDxwPlRoaXMgZmVhdHVyZSBpcyBub3QgYXZhaWxhYmxlIHlldC4gVHJ5IEZpeHR1cmUsIFNlY3Rpb24sIGFuZCBTaGVsZiBsZXZlbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gPGRpdiBpZD1cInNwb3QtbGV2ZWxcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVydGljYWwtZGltZW5zaW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyB1cFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPnt7IGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgfX17eyBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlV2lkdGg/LnVuaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgZG93blwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXHJcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlTGVuZ3RoPy52YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItYmxvY2tcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5oZWFkZXI/LmlzRW5hYmxlZCAmJiBmaXh0dXJlVGVtcGxhdGVEZXRhaWxzPy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uaGVhZGVyPy5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1ibG9ja1wiICpuZ0lmPVwiKGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnPy5sZW5ndGggPz8gMCkgPiAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpeHR1cmVUZW1wbGF0ZURldGFpbHM/LnNoZWxmQ29uZmlnOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIEBpZihpdGVtLnNoZWxmVHlwZSA9PT0nc2hlbGYnKXtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUgKyAoaSArIDEpXCIgY2xhc3M9XCJibG9jayBzaGVsZiAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3QgIFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgPGRpdiBbaWRdPVwiaXRlbS5zaGVsZlR5cGUhICsgKGkgKyAxKVwiIGNsYXNzPVwiYmxvY2sgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS50cmF5Um93cylcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLnByb2R1Y3RQZXJTaGVsZilcIiBjbGFzcz1cInByb2R1Y3QgIFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9vdGVyLWJsb2NrXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5pc0VuYWJsZWQgJiYgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVR5cGUgPT09ICd3YWxsJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1mb290ZXIgbGVmdC1ib3hcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItZm9vdGVyIHJpZ2h0LWJveFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHA+e3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZm9vdGVyPy5sYWJlbCB9fTwvcD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjxzZWN0aW9uIGlkPVwiZml4dHVyZS10ZW1wbGF0ZS1wcm9kdWN0cy1za2VsZXRvblwiICpuZ0lmPVwiaXNQYWdlTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48IS0tIENvbW1vbiBkaW1lbnNpb24gYXJyb3dzIC0tPlxyXG48bmctdGVtcGxhdGUgI2RpbWVuc2lvbkFycm93cyBsZXQtbGFiZWw9XCJsYWJlbFwiIGxldC12YWx1ZT1cInZhbHVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhvcml6b250YWwtZGltZW5zaW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgbGVmdFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgICAgPHNwYW4+e3sgdmFsdWUgfX0ge3sgZml4dHVyZVRlbXBsYXRlRGV0YWlscz8uZml4dHVyZVdpZHRoPy51bml0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgcmlnaHRcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|