tango-app-ui-manage-users 3.7.0-alpha.8 → 3.7.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/tango-manage-users/add-user-popup/add-user-popup.component.mjs +5 -4
- package/esm2022/lib/components/tango-manage-users/assign-store-popup/assign-store-popup.component.mjs +7 -7
- package/esm2022/lib/components/tango-manage-users/brand-user/brand-user.component.mjs +4 -4
- package/esm2022/lib/components/tango-manage-users/user-table/alert-popup/alert-popup.component.mjs +27 -7
- package/esm2022/lib/components/tango-manage-users/user-table/user-table.component.mjs +3 -3
- package/esm2022/lib/components-v2/add-users/add-users.component.mjs +185 -44
- package/esm2022/lib/components-v2/teams-creation/teams-creation.component.mjs +26 -6
- package/esm2022/lib/components-v2/teams-list/teams-list.component.mjs +13 -4
- package/esm2022/lib/components-v2/viewteams-list/viewteams-list.component.mjs +4 -6
- package/esm2022/lib/services/user.service.mjs +1 -7
- package/esm2022/lib/services-v2/manage-users.service.mjs +6 -1
- package/fesm2022/tango-app-ui-manage-users.mjs +325 -139
- package/fesm2022/tango-app-ui-manage-users.mjs.map +1 -1
- package/lib/components/tango-manage-users/user-table/alert-popup/alert-popup.component.d.ts +5 -1
- package/lib/components-v2/add-users/add-users.component.d.ts +3 -1
- package/lib/services/user.service.d.ts +0 -1
- package/lib/services-v2/manage-users.service.d.ts +1 -0
- package/package.json +1 -1
|
@@ -448,10 +448,10 @@ export class AssignStorePopupComponent {
|
|
|
448
448
|
.subscribe({
|
|
449
449
|
next: (res) => {
|
|
450
450
|
if (res && res.code == 200) {
|
|
451
|
-
this.ts.getSuccessToast(
|
|
451
|
+
this.ts.getSuccessToast(`Stores Assigned to User Successfully!`);
|
|
452
452
|
}
|
|
453
453
|
else {
|
|
454
|
-
this.ts.getErrorToast(`Unable to assign
|
|
454
|
+
this.ts.getErrorToast(`Unable to assign Stores to User!`);
|
|
455
455
|
}
|
|
456
456
|
this.activeModal.close('submit');
|
|
457
457
|
},
|
|
@@ -477,10 +477,10 @@ export class AssignStorePopupComponent {
|
|
|
477
477
|
.subscribe({
|
|
478
478
|
next: (res) => {
|
|
479
479
|
if (res && res.code == 200) {
|
|
480
|
-
this.ts.getSuccessToast(
|
|
480
|
+
this.ts.getSuccessToast(`Stores Assigned to User Successfully!`);
|
|
481
481
|
}
|
|
482
482
|
else {
|
|
483
|
-
this.ts.getErrorToast(`Unable to
|
|
483
|
+
this.ts.getErrorToast(`Unable to Assign Stores to User!`);
|
|
484
484
|
}
|
|
485
485
|
this.activeModal.close('submit');
|
|
486
486
|
},
|
|
@@ -531,13 +531,13 @@ export class AssignStorePopupComponent {
|
|
|
531
531
|
this.activeModal.close('submit');
|
|
532
532
|
}
|
|
533
533
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignStorePopupComponent, deps: [{ token: i1.UserService }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3.NgbActiveModal }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
534
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AssignStorePopupComponent, selector: "lib-assign-store-popup", inputs: { user: "user" }, host: { listeners: { "document:click": "onClick($event)" } }, viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "afterValidation", first: true, predicate: ["afterValidation"], descendants: true }], ngImport: i0, template: "<div class=\"card assign-store py-0 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5\">\r\n <!-- <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/assign-adduser.svg\">\r\n </div> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\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 d=\"M32 37V35C32 33.9391 31.5786 32.9217 30.8284 32.1716C30.0783 31.4214 29.0609 31 28 31H21C19.9391 31 18.9217 31.4214 18.1716 32.1716C17.4214 32.9217 17 33.9391 17 35V37M36 24V30M39 27H33M28.5 23C28.5 25.2091 26.7091 27 24.5 27C22.2909 27 20.5 25.2091 20.5 23C20.5 20.7909 22.2909 19 24.5 19C26.7091 19 28.5 20.7909 28.5 23Z\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n </div>\r\n <a class=\"title mb-3\">Assign {{(select ==='clusters' ? 'as lead to' : 'as user to') | titlecase}}</a>\r\n <!-- <span class=\"sub-title my-2\">Please assign the {{select === 'stores' ? 'store' :(select ==='users' ? 'user' : 'cluster')}}</span> -->\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap \">\r\n\r\n <li class=\"nav-item nav-item1\" (click)=\"select='stores'; storesType($event)\">\r\n <a [ngClass]=\"select === 'stores' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer tab-title me-6\">Stores</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"select='clusters'; storesType($event)\"><a\r\n [ngClass]=\"select === 'clusters' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border tab-title me-6\">Cluster</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"select='teams'; storesType($event)\"><a\r\n [ngClass]=\"select === 'teams' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border tab-title me-6\">Teams</a>\r\n </li>\r\n </ul>\r\n <div *ngIf=\"select ==='stores'\" class=\"w-100 my-5\">\r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[0]?.Stores?.length)\">\r\n Select Stores\r\n </div>\r\n <lib-group-select [items]=\"dataObject[0]?.Stores\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeId'\" (selected)=\"onstoreSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[0]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n <div *ngIf=\"select ==='clusters'\" class=\"w-100 my-5\"> \r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[1]?.clusters?.length)\">\r\n Select cluster\r\n </div>\r\n <lib-group-select [items]=\"dataObject[1]?.clusters\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'clusterName'\"\r\n [idField]=\"'clusterName'\" (selected)=\"ongroupSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[1]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n <div *ngIf=\"select ==='teams'\" class=\"w-100 my-5\"> \r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[2]?.teams?.length)\">\r\n Select Stores\r\n </div>\r\n <lib-group-select [items]=\"dataObject[2]?.teams\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'teamName'\"\r\n [idField]=\"'teamName'\" (selected)=\"onTeamsSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[2]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n\r\n <h2 class=\"store-info fw-bold\">\r\n @if(select ==='stores') {\r\n Store \r\n } @else if(select ==='clusters') {\r\n Cluster\r\n }@else if(select ==='teams') {\r\n Teams\r\n }\r\n Information\r\n </h2>\r\n\r\n <section *ngIf=\"select ==='stores'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th>SPOC Name</th>\r\n <th>Store ID</th>\r\n <th>Application ID</th>\r\n <th>Location</th>\r\n </tr>\r\n </thead>\r\n <tbody> \r\n <tr *ngFor=\"let store of stores;let i=index\">\r\n <td>{{store?.spocName}}</td>\r\n <td>{{store?.storeId}}</td>\r\n <td>{{store?.appId}}</td>\r\n <td>{{store?.location}}</td>\r\n </tr> \r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[0].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned to the above stores.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='clusters'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th class=\"ms-5\">Cluster Name</th>\r\n <th>Stores</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let cluster of this.selectedValuesArray[1];let i=index;\">\r\n <td class=\"ms-5\">{{cluster?.clusterName}}</td>\r\n <td>{{cluster?.storeNames}} <span *ngIf=\"cluster?.storeListCount > 2\" class=\"justify-content-center align-items-center blend-mode ms-3\">+{{cluster?.storeListCount - 2}}</span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[1].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned as a member to the above\r\n clusters.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='teams'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th class=\"ms-5\">Team Name</th>\r\n <th>Users</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let team of this.selectedValuesArray[2];let i=index;\">\r\n <td class=\"ms-5\">{{team?.teamName}}</td>\r\n <td>{{team?.userNames}} <span *ngIf=\"team?.userListCount > 2\" class=\"justify-content-center align-items-center blend-mode ms-3\">+{{team?.userListCount - 2}}</span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[2].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned as a member to the above\r\n teams.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='stores'\" class=\"w-100\">\r\n <div class=\"position-relative my-5\">\r\n <hr class=\"hr m-0 border border-gray-400 border-1\">\r\n <div class=\"position-absolute position-or px-10\">or</div>\r\n </div>\r\n <div class=\"d-flex justify-content-start align-items-center\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ol class=\"custom-ordered-list text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple stores to users at once.</li>\r\n <li class=\"user-text my-2\"><span class=\"user-text\">Download the template here - </span>\r\n <a class=\"ms-1\" href=\"../../../assets/files/storeListTemplate.xlsx\" download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"template ms-2\">Download Template</span>\r\n </a>\r\n </li>\r\n <li class=\"user-text my-3\">Add your data to the Template File</li>\r\n <li class=\"user-text my-3\">Upload it below for processing</li> \r\n </ol>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 ms-3 right-bar py-5 d-flex justify-content-center align-items-center flex-column\" >\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\" value=\"personal\"\r\n class=\"btn-check\"\r\n (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"persona\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n <div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload</span>\r\n <!-- <span class=\"ms-2\">or drag and drop</span> -->\r\n </div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </span>\r\n </label>\r\n </div>\r\n </section>\r\n\r\n <div class=\"d-flex mb-10 w-100 mt-10\" role=\"cluster\">\r\n <button class=\"btn btn-outline w-100 mx-3\" (click)=\"closeModal()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 mx-3\" (click)=\"onSubmit()\">Submit</button>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Bulk Assign</span></div>\r\n </div>\r\n <div class=\"card-body pt-0 popup-scroll\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div >You're about to assign {{getStoreCounts(excelData)}} {{getStoreCounts(excelData) > 1 ? 'Stores' : 'Store'}}. Are you sure want to proceed?</div>\r\n \r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 d-flex justify-content-end flex-wrap gap-2 pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup();model.close()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"proceedSubmit();model.close()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"file1.click();\">Reupload</button>\r\n <input style=\"display: none;;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n (change)=\"onUpload($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".assign-store .form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.assign-store .store-info{color:var(--Gray-700, #344054)!important;font-size:18px!important;font-weight:600;line-height:28px}.assign-store .table-title{line-height:24px!important;color:var(--Gray-500, #344054)!important;font-size:16px!important;font-weight:500!important}.assign-store .table-sub{line-height:30px!important;color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important}.assign-store .bg-assign-user{border-radius:4px;border-left:2px solid var(--Primary-600, #00A3FF);background:var(--Primary-25, #F6FCFF);height:68px;padding:6px 8px 6px 16px}.assign-store td{padding:16px 24px!important}.assign-store .blend-mode{mix-blend-mode:multiply;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);text-align:center;font-size:12px;font-weight:500;line-height:18px;padding:2px 8px}.scroll{overflow-y:auto;overflow-x:hidden}.radio-custom{opacity:0;position:absolute}.radio-custom,.radio-custom-label{display:inline-block;vertical-align:middle;margin:5px 0;cursor:pointer}.radio-custom-label{position:relative}.radio-custom+.radio-custom-label:before{content:\"\";background:#fff;border:2px solid #00A3FF;display:inline-block;vertical-align:middle;width:20px;height:20px;padding:2px;margin-right:10px;text-align:center}.radio-custom+.radio-custom-label:before{border-radius:50%}.radio-custom:checked+.radio-custom-label:before{background:#00a3ff;box-shadow:inset 0 0 0 4.5px #eaf8ff}.text-muted{content:\"\";margin-top:5.1px;border-radius:50%;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);display:inline-block;vertical-align:middle;width:20px;height:20px;padding:2px;margin-left:0;text-align:center}.ms-0{margin-left:-.75rem!important}.dropdown1 .dropdown-title{color:var(--Gray-900, #101828);font-size:16px;font-weight:600;line-height:24px}.dropdown1 .dropdown{position:relative;display:inline-block}.dropdown1 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.dropdown1 .dropdown-content{z-index:1;padding:0;min-height:auto!important;max-height:285px!important;overflow:auto;border-radius:12px;background:var(--White, #FFF);box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;width:90%}.dropdown1 .dropdown-content label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.dropdown1 .dropdown-content a{color:#000;padding:12px 16px;text-decoration:none;display:block}.dropdown1 .dropdown button{padding:10px;font-size:16px;cursor:pointer}.dropdown1 input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.dropdown1 input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}.dropdown1 input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.nav-item1 .nav-link1.active{border:none;border-radius:0;background:var(--Primary-50, #EAF8FF);border-bottom:2px solid #009BF3!important;padding:12px}.nav-item1 .nav-link1:hover{border:none}.user-text{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.right-bar{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD)}.click-upload{color:var(--Primary-700, #009BF3)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.position-or{left:50%;top:-10px;background:#fff;transform:translate(-50%)}.subtitle{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.config-heading{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:400;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.popup-scroll{min-height:auto;max-height:400px;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.GroupSelectComponent, selector: "lib-group-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "pipe", type: i4.TitleCasePipe, name: "titlecase" }] });
|
|
534
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AssignStorePopupComponent, selector: "lib-assign-store-popup", inputs: { user: "user" }, host: { listeners: { "document:click": "onClick($event)" } }, viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "afterValidation", first: true, predicate: ["afterValidation"], descendants: true }], ngImport: i0, template: "<div class=\"card assign-store py-0 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5\">\r\n <!-- <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/assign-adduser.svg\">\r\n </div> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\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 d=\"M32 37V35C32 33.9391 31.5786 32.9217 30.8284 32.1716C30.0783 31.4214 29.0609 31 28 31H21C19.9391 31 18.9217 31.4214 18.1716 32.1716C17.4214 32.9217 17 33.9391 17 35V37M36 24V30M39 27H33M28.5 23C28.5 25.2091 26.7091 27 24.5 27C22.2909 27 20.5 25.2091 20.5 23C20.5 20.7909 22.2909 19 24.5 19C26.7091 19 28.5 20.7909 28.5 23Z\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n </div>\r\n <a class=\"title mb-3\">Assign {{(select ==='clusters' ? 'as lead to' : 'as user to') | titlecase}}</a>\r\n <!-- <span class=\"sub-title my-2\">Please assign the {{select === 'stores' ? 'store' :(select ==='users' ? 'user' : 'cluster')}}</span> -->\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap \">\r\n\r\n <li class=\"nav-item nav-item1\" (click)=\"select='stores'; storesType($event)\">\r\n <a [ngClass]=\"select === 'stores' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer tab-title me-6\">Stores</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"select='clusters'; storesType($event)\"><a\r\n [ngClass]=\"select === 'clusters' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border tab-title me-6\">Cluster</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"select='teams'; storesType($event)\"><a\r\n [ngClass]=\"select === 'teams' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border tab-title me-6\">Teams</a>\r\n </li>\r\n </ul>\r\n <div *ngIf=\"select ==='stores'\" class=\"w-100 my-5\">\r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[0]?.Stores?.length)\">\r\n Select Stores\r\n </div>\r\n <lib-group-select [items]=\"dataObject[0]?.Stores\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeId'\" (selected)=\"onstoreSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[0]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n <div *ngIf=\"select ==='clusters'\" class=\"w-100 my-5\"> \r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[1]?.clusters?.length)\">\r\n Select cluster\r\n </div>\r\n <lib-group-select [items]=\"dataObject[1]?.clusters\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'clusterName'\"\r\n [idField]=\"'clusterName'\" (selected)=\"ongroupSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[1]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n <div *ngIf=\"select ==='teams'\" class=\"w-100 my-5\"> \r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[2]?.teams?.length)\">\r\n Select Stores\r\n </div>\r\n <lib-group-select [items]=\"dataObject[2]?.teams\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'teamName'\"\r\n [idField]=\"'teamName'\" (selected)=\"onTeamsSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[2]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n\r\n <h2 class=\"store-info fw-bold\">\r\n @if(select ==='stores') {\r\n Store \r\n } @else if(select ==='clusters') {\r\n Cluster\r\n }@else if(select ==='teams') {\r\n Teams\r\n }\r\n Information\r\n </h2>\r\n\r\n <section *ngIf=\"select ==='stores'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th>SPOC Name</th>\r\n <th>Store ID</th>\r\n <th>Application ID</th>\r\n <th>Location</th>\r\n </tr>\r\n </thead>\r\n <tbody> \r\n <tr *ngFor=\"let store of stores;let i=index\">\r\n <td>{{store?.spocName}}</td>\r\n <td>{{store?.storeId}}</td>\r\n <td>{{store?.appId}}</td>\r\n <td>{{store?.location}}</td>\r\n </tr> \r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[0].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned to the above stores.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='clusters'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th class=\"ms-5\">Cluster Name</th>\r\n <th>Stores</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let cluster of this.selectedValuesArray[1];let i=index;\">\r\n <td class=\"ms-5\">{{cluster?.clusterName}}</td>\r\n <td>{{cluster?.storeNames}} <span *ngIf=\"cluster?.storeListCount > 2\" class=\"justify-content-center align-items-center blend-mode ms-3\">+{{cluster?.storeListCount - 2}}</span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[1].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned as a member to the above\r\n clusters.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='teams'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th class=\"ms-5\">Team Name</th>\r\n <th>Users</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let team of this.selectedValuesArray[2];let i=index;\">\r\n <td class=\"ms-5\">{{team?.teamName}}</td>\r\n <td>{{team?.userNames}} <span *ngIf=\"team?.userListCount > 2\" class=\"justify-content-center align-items-center blend-mode ms-3\">+{{team?.userListCount - 2}}</span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[2].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned as a member to the above\r\n teams.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='stores'\" class=\"w-100\">\r\n <div class=\"position-relative my-5\">\r\n <hr class=\"hr m-0 border border-gray-400 border-1\">\r\n <div class=\"position-absolute position-or px-10\">or</div>\r\n </div>\r\n <div class=\"d-flex justify-content-start align-items-center\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ol class=\"custom-ordered-list text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple stores to users at once.</li>\r\n <li class=\"user-text my-2\"><span class=\"user-text\">Download the template here - </span>\r\n <a class=\"ms-1\" href=\"../../../assets/files/storeListTemplate.xlsx\" download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"template ms-2\">Download Template</span>\r\n </a>\r\n </li>\r\n <li class=\"user-text my-3\">Add your data to the Template File</li>\r\n <li class=\"user-text my-3\">Upload it below for processing</li> \r\n </ol>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 ms-3 right-bar py-5 d-flex justify-content-center align-items-center flex-column\" >\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\" value=\"personal\"\r\n class=\"btn-check\"\r\n (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"persona\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n <div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload</span>\r\n <!-- <span class=\"ms-2\">or drag and drop</span> -->\r\n </div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </span>\r\n </label>\r\n </div>\r\n </section>\r\n\r\n <div class=\"d-flex mb-10 w-100 mt-10\" role=\"cluster\">\r\n <button class=\"btn btn-outline w-100 mx-3\" (click)=\"closeModal()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 mx-3\" (click)=\"onSubmit()\">Submit</button>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Bulk Assign</span></div>\r\n </div>\r\n <div class=\"card-body pt-0 popup-scroll\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div [ngClass]=\"excelError \r\n ? 'fw-semibold text-error w-100 error-heading' \r\n : 'fw-semibold w-100 config-heading'\">\r\n {{ excelError?.error?.length || 0 }}\r\n </div>\r\n <div [ngClass]=\"excelError \r\n ? 'fw-semibold text-error mt-1 excel-error' \r\n : 'fw-semibold subtitle mt-1'\">\r\n Error\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div >You're about to assign {{getStoreCounts(excelData)}} {{getStoreCounts(excelData) > 1 ? 'Stores' : 'Store'}}. Are you sure want to proceed?</div>\r\n \r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 d-flex justify-content-end flex-wrap gap-2 pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup();model.close()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"proceedSubmit();model.close()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"file1.click();\">Reupload</button>\r\n <input style=\"display: none;;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n (change)=\"onUpload($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".assign-store .form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.assign-store .store-info{color:var(--Gray-700, #344054)!important;font-size:18px!important;font-weight:600;line-height:28px}.assign-store .table-title{line-height:24px!important;color:var(--Gray-500, #344054)!important;font-size:16px!important;font-weight:500!important}.assign-store .table-sub{line-height:30px!important;color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important}.assign-store .bg-assign-user{border-radius:4px;border-left:2px solid var(--Primary-600, #00A3FF);background:var(--Primary-25, #F6FCFF);height:68px;padding:6px 8px 6px 16px}.assign-store td{padding:16px 24px!important}.assign-store .blend-mode{mix-blend-mode:multiply;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);text-align:center;font-size:12px;font-weight:500;line-height:18px;padding:2px 8px}.scroll{overflow-y:auto;overflow-x:hidden}.radio-custom{opacity:0;position:absolute}.radio-custom,.radio-custom-label{display:inline-block;vertical-align:middle;margin:5px 0;cursor:pointer}.radio-custom-label{position:relative}.radio-custom+.radio-custom-label:before{content:\"\";background:#fff;border:2px solid #00A3FF;display:inline-block;vertical-align:middle;width:20px;height:20px;padding:2px;margin-right:10px;text-align:center}.radio-custom+.radio-custom-label:before{border-radius:50%}.radio-custom:checked+.radio-custom-label:before{background:#00a3ff;box-shadow:inset 0 0 0 4.5px #eaf8ff}.text-muted{content:\"\";margin-top:5.1px;border-radius:50%;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);display:inline-block;vertical-align:middle;width:20px;height:20px;padding:2px;margin-left:0;text-align:center}.ms-0{margin-left:-.75rem!important}.dropdown1 .dropdown-title{color:var(--Gray-900, #101828);font-size:16px;font-weight:600;line-height:24px}.dropdown1 .dropdown{position:relative;display:inline-block}.dropdown1 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.dropdown1 .dropdown-content{z-index:1;padding:0;min-height:auto!important;max-height:285px!important;overflow:auto;border-radius:12px;background:var(--White, #FFF);box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;width:90%}.dropdown1 .dropdown-content label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.dropdown1 .dropdown-content a{color:#000;padding:12px 16px;text-decoration:none;display:block}.dropdown1 .dropdown button{padding:10px;font-size:16px;cursor:pointer}.dropdown1 input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.dropdown1 input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}.dropdown1 input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.nav-item1 .nav-link1.active{border:none;border-radius:0;background:var(--Primary-50, #EAF8FF);border-bottom:2px solid #009BF3!important;padding:12px}.nav-item1 .nav-link1:hover{border:none}.user-text{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.right-bar{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD)}.click-upload{color:var(--Primary-700, #009BF3)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.position-or{left:50%;top:-10px;background:#fff;transform:translate(-50%)}.subtitle{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.config-heading{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:400;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.popup-scroll{min-height:auto;max-height:400px;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.GroupSelectComponent, selector: "lib-group-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "pipe", type: i4.TitleCasePipe, name: "titlecase" }] });
|
|
535
535
|
}
|
|
536
536
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AssignStorePopupComponent, decorators: [{
|
|
537
537
|
type: Component,
|
|
538
538
|
args: [{ selector: "lib-assign-store-popup", host: {
|
|
539
539
|
'(document:click)': 'onClick($event)',
|
|
540
|
-
}, template: "<div class=\"card assign-store py-0 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5\">\r\n <!-- <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/assign-adduser.svg\">\r\n </div> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\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 d=\"M32 37V35C32 33.9391 31.5786 32.9217 30.8284 32.1716C30.0783 31.4214 29.0609 31 28 31H21C19.9391 31 18.9217 31.4214 18.1716 32.1716C17.4214 32.9217 17 33.9391 17 35V37M36 24V30M39 27H33M28.5 23C28.5 25.2091 26.7091 27 24.5 27C22.2909 27 20.5 25.2091 20.5 23C20.5 20.7909 22.2909 19 24.5 19C26.7091 19 28.5 20.7909 28.5 23Z\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n </div>\r\n <a class=\"title mb-3\">Assign {{(select ==='clusters' ? 'as lead to' : 'as user to') | titlecase}}</a>\r\n <!-- <span class=\"sub-title my-2\">Please assign the {{select === 'stores' ? 'store' :(select ==='users' ? 'user' : 'cluster')}}</span> -->\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap \">\r\n\r\n <li class=\"nav-item nav-item1\" (click)=\"select='stores'; storesType($event)\">\r\n <a [ngClass]=\"select === 'stores' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer tab-title me-6\">Stores</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"select='clusters'; storesType($event)\"><a\r\n [ngClass]=\"select === 'clusters' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border tab-title me-6\">Cluster</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"select='teams'; storesType($event)\"><a\r\n [ngClass]=\"select === 'teams' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border tab-title me-6\">Teams</a>\r\n </li>\r\n </ul>\r\n <div *ngIf=\"select ==='stores'\" class=\"w-100 my-5\">\r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[0]?.Stores?.length)\">\r\n Select Stores\r\n </div>\r\n <lib-group-select [items]=\"dataObject[0]?.Stores\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeId'\" (selected)=\"onstoreSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[0]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n <div *ngIf=\"select ==='clusters'\" class=\"w-100 my-5\"> \r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[1]?.clusters?.length)\">\r\n Select cluster\r\n </div>\r\n <lib-group-select [items]=\"dataObject[1]?.clusters\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'clusterName'\"\r\n [idField]=\"'clusterName'\" (selected)=\"ongroupSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[1]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n <div *ngIf=\"select ==='teams'\" class=\"w-100 my-5\"> \r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[2]?.teams?.length)\">\r\n Select Stores\r\n </div>\r\n <lib-group-select [items]=\"dataObject[2]?.teams\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'teamName'\"\r\n [idField]=\"'teamName'\" (selected)=\"onTeamsSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[2]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n\r\n <h2 class=\"store-info fw-bold\">\r\n @if(select ==='stores') {\r\n Store \r\n } @else if(select ==='clusters') {\r\n Cluster\r\n }@else if(select ==='teams') {\r\n Teams\r\n }\r\n Information\r\n </h2>\r\n\r\n <section *ngIf=\"select ==='stores'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th>SPOC Name</th>\r\n <th>Store ID</th>\r\n <th>Application ID</th>\r\n <th>Location</th>\r\n </tr>\r\n </thead>\r\n <tbody> \r\n <tr *ngFor=\"let store of stores;let i=index\">\r\n <td>{{store?.spocName}}</td>\r\n <td>{{store?.storeId}}</td>\r\n <td>{{store?.appId}}</td>\r\n <td>{{store?.location}}</td>\r\n </tr> \r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[0].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned to the above stores.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='clusters'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th class=\"ms-5\">Cluster Name</th>\r\n <th>Stores</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let cluster of this.selectedValuesArray[1];let i=index;\">\r\n <td class=\"ms-5\">{{cluster?.clusterName}}</td>\r\n <td>{{cluster?.storeNames}} <span *ngIf=\"cluster?.storeListCount > 2\" class=\"justify-content-center align-items-center blend-mode ms-3\">+{{cluster?.storeListCount - 2}}</span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[1].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned as a member to the above\r\n clusters.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='teams'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th class=\"ms-5\">Team Name</th>\r\n <th>Users</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let team of this.selectedValuesArray[2];let i=index;\">\r\n <td class=\"ms-5\">{{team?.teamName}}</td>\r\n <td>{{team?.userNames}} <span *ngIf=\"team?.userListCount > 2\" class=\"justify-content-center align-items-center blend-mode ms-3\">+{{team?.userListCount - 2}}</span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[2].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned as a member to the above\r\n teams.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='stores'\" class=\"w-100\">\r\n <div class=\"position-relative my-5\">\r\n <hr class=\"hr m-0 border border-gray-400 border-1\">\r\n <div class=\"position-absolute position-or px-10\">or</div>\r\n </div>\r\n <div class=\"d-flex justify-content-start align-items-center\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ol class=\"custom-ordered-list text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple stores to users at once.</li>\r\n <li class=\"user-text my-2\"><span class=\"user-text\">Download the template here - </span>\r\n <a class=\"ms-1\" href=\"../../../assets/files/storeListTemplate.xlsx\" download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"template ms-2\">Download Template</span>\r\n </a>\r\n </li>\r\n <li class=\"user-text my-3\">Add your data to the Template File</li>\r\n <li class=\"user-text my-3\">Upload it below for processing</li> \r\n </ol>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 ms-3 right-bar py-5 d-flex justify-content-center align-items-center flex-column\" >\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\" value=\"personal\"\r\n class=\"btn-check\"\r\n (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"persona\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n <div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload</span>\r\n <!-- <span class=\"ms-2\">or drag and drop</span> -->\r\n </div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </span>\r\n </label>\r\n </div>\r\n </section>\r\n\r\n <div class=\"d-flex mb-10 w-100 mt-10\" role=\"cluster\">\r\n <button class=\"btn btn-outline w-100 mx-3\" (click)=\"closeModal()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 mx-3\" (click)=\"onSubmit()\">Submit</button>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Bulk Assign</span></div>\r\n </div>\r\n <div class=\"card-body pt-0 popup-scroll\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div >You're about to assign {{getStoreCounts(excelData)}} {{getStoreCounts(excelData) > 1 ? 'Stores' : 'Store'}}. Are you sure want to proceed?</div>\r\n \r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 d-flex justify-content-end flex-wrap gap-2 pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup();model.close()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"proceedSubmit();model.close()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"file1.click();\">Reupload</button>\r\n <input style=\"display: none;;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n (change)=\"onUpload($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".assign-store .form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.assign-store .store-info{color:var(--Gray-700, #344054)!important;font-size:18px!important;font-weight:600;line-height:28px}.assign-store .table-title{line-height:24px!important;color:var(--Gray-500, #344054)!important;font-size:16px!important;font-weight:500!important}.assign-store .table-sub{line-height:30px!important;color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important}.assign-store .bg-assign-user{border-radius:4px;border-left:2px solid var(--Primary-600, #00A3FF);background:var(--Primary-25, #F6FCFF);height:68px;padding:6px 8px 6px 16px}.assign-store td{padding:16px 24px!important}.assign-store .blend-mode{mix-blend-mode:multiply;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);text-align:center;font-size:12px;font-weight:500;line-height:18px;padding:2px 8px}.scroll{overflow-y:auto;overflow-x:hidden}.radio-custom{opacity:0;position:absolute}.radio-custom,.radio-custom-label{display:inline-block;vertical-align:middle;margin:5px 0;cursor:pointer}.radio-custom-label{position:relative}.radio-custom+.radio-custom-label:before{content:\"\";background:#fff;border:2px solid #00A3FF;display:inline-block;vertical-align:middle;width:20px;height:20px;padding:2px;margin-right:10px;text-align:center}.radio-custom+.radio-custom-label:before{border-radius:50%}.radio-custom:checked+.radio-custom-label:before{background:#00a3ff;box-shadow:inset 0 0 0 4.5px #eaf8ff}.text-muted{content:\"\";margin-top:5.1px;border-radius:50%;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);display:inline-block;vertical-align:middle;width:20px;height:20px;padding:2px;margin-left:0;text-align:center}.ms-0{margin-left:-.75rem!important}.dropdown1 .dropdown-title{color:var(--Gray-900, #101828);font-size:16px;font-weight:600;line-height:24px}.dropdown1 .dropdown{position:relative;display:inline-block}.dropdown1 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.dropdown1 .dropdown-content{z-index:1;padding:0;min-height:auto!important;max-height:285px!important;overflow:auto;border-radius:12px;background:var(--White, #FFF);box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;width:90%}.dropdown1 .dropdown-content label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.dropdown1 .dropdown-content a{color:#000;padding:12px 16px;text-decoration:none;display:block}.dropdown1 .dropdown button{padding:10px;font-size:16px;cursor:pointer}.dropdown1 input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.dropdown1 input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}.dropdown1 input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.nav-item1 .nav-link1.active{border:none;border-radius:0;background:var(--Primary-50, #EAF8FF);border-bottom:2px solid #009BF3!important;padding:12px}.nav-item1 .nav-link1:hover{border:none}.user-text{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.right-bar{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD)}.click-upload{color:var(--Primary-700, #009BF3)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.position-or{left:50%;top:-10px;background:#fff;transform:translate(-50%)}.subtitle{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.config-heading{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:400;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.popup-scroll{min-height:auto;max-height:400px;overflow-y:auto}\n"] }]
|
|
540
|
+
}, template: "<div class=\"card assign-store py-0 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5\">\r\n <!-- <div class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/assign-adduser.svg\">\r\n </div> -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\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 d=\"M32 37V35C32 33.9391 31.5786 32.9217 30.8284 32.1716C30.0783 31.4214 29.0609 31 28 31H21C19.9391 31 18.9217 31.4214 18.1716 32.1716C17.4214 32.9217 17 33.9391 17 35V37M36 24V30M39 27H33M28.5 23C28.5 25.2091 26.7091 27 24.5 27C22.2909 27 20.5 25.2091 20.5 23C20.5 20.7909 22.2909 19 24.5 19C26.7091 19 28.5 20.7909 28.5 23Z\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n </div>\r\n <a class=\"title mb-3\">Assign {{(select ==='clusters' ? 'as lead to' : 'as user to') | titlecase}}</a>\r\n <!-- <span class=\"sub-title my-2\">Please assign the {{select === 'stores' ? 'store' :(select ==='users' ? 'user' : 'cluster')}}</span> -->\r\n <ul class=\"nav nav-stretch nav-line-tabs1 nav-line-tabs border-transparent flex-nowrap \">\r\n\r\n <li class=\"nav-item nav-item1\" (click)=\"select='stores'; storesType($event)\">\r\n <a [ngClass]=\"select === 'stores' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer tab-title me-6\">Stores</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"select='clusters'; storesType($event)\"><a\r\n [ngClass]=\"select === 'clusters' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border tab-title me-6\">Cluster</a>\r\n </li>\r\n <li class=\"nav-item nav-item1\" (click)=\"select='teams'; storesType($event)\"><a\r\n [ngClass]=\"select === 'teams' ? 'active' : ''\"\r\n class=\"nav-link nav-link1 cursor-pointer no-border tab-title me-6\">Teams</a>\r\n </li>\r\n </ul>\r\n <div *ngIf=\"select ==='stores'\" class=\"w-100 my-5\">\r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[0]?.Stores?.length)\">\r\n Select Stores\r\n </div>\r\n <lib-group-select [items]=\"dataObject[0]?.Stores\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeId'\" (selected)=\"onstoreSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[0]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n <div *ngIf=\"select ==='clusters'\" class=\"w-100 my-5\"> \r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[1]?.clusters?.length)\">\r\n Select cluster\r\n </div>\r\n <lib-group-select [items]=\"dataObject[1]?.clusters\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'clusterName'\"\r\n [idField]=\"'clusterName'\" (selected)=\"ongroupSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[1]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n <div *ngIf=\"select ==='teams'\" class=\"w-100 my-5\"> \r\n <div class=\"select-wrapper\">\r\n <div class=\"placeholder-overlay\" *ngIf=\"!(dataObject[2]?.teams?.length)\">\r\n Select Stores\r\n </div>\r\n <lib-group-select [items]=\"dataObject[2]?.teams\" [disabled]=\"false\" [multi]=\"true\" [searchField]=\"'teamName'\"\r\n [idField]=\"'teamName'\" (selected)=\"onTeamsSelect($event)\"\r\n [selectedValues]=\"selectedValuesArray[2]\">\r\n </lib-group-select>\r\n </div>\r\n </div>\r\n\r\n <h2 class=\"store-info fw-bold\">\r\n @if(select ==='stores') {\r\n Store \r\n } @else if(select ==='clusters') {\r\n Cluster\r\n }@else if(select ==='teams') {\r\n Teams\r\n }\r\n Information\r\n </h2>\r\n\r\n <section *ngIf=\"select ==='stores'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th>SPOC Name</th>\r\n <th>Store ID</th>\r\n <th>Application ID</th>\r\n <th>Location</th>\r\n </tr>\r\n </thead>\r\n <tbody> \r\n <tr *ngFor=\"let store of stores;let i=index\">\r\n <td>{{store?.spocName}}</td>\r\n <td>{{store?.storeId}}</td>\r\n <td>{{store?.appId}}</td>\r\n <td>{{store?.location}}</td>\r\n </tr> \r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[0].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned to the above stores.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='clusters'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th class=\"ms-5\">Cluster Name</th>\r\n <th>Stores</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let cluster of this.selectedValuesArray[1];let i=index;\">\r\n <td class=\"ms-5\">{{cluster?.clusterName}}</td>\r\n <td>{{cluster?.storeNames}} <span *ngIf=\"cluster?.storeListCount > 2\" class=\"justify-content-center align-items-center blend-mode ms-3\">+{{cluster?.storeListCount - 2}}</span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[1].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned as a member to the above\r\n clusters.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='teams'\" class=\"w-100\">\r\n <div class=\"table-responsive h-200px mb-3 scroll\">\r\n <table class=\"table bottom-border mt-2 mb-4\">\r\n <thead>\r\n <tr>\r\n <th class=\"ms-5\">Team Name</th>\r\n <th>Users</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let team of this.selectedValuesArray[2];let i=index;\">\r\n <td class=\"ms-5\">{{team?.teamName}}</td>\r\n <td>{{team?.userNames}} <span *ngIf=\"team?.userListCount > 2\" class=\"justify-content-center align-items-center blend-mode ms-3\">+{{team?.userListCount - 2}}</span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (selectedValuesArray[2].length) {\r\n <div class=\"d-flex align-items-center bg-assign-user w-100 mb-5 mx-2\">\r\n <span><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\" />\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\" />\r\n <path\r\n d=\"M23.3327 24V22.6667C23.3327 21.9594 23.0517 21.2811 22.5516 20.781C22.0515 20.281 21.3733 20 20.666 20H15.3327C14.6254 20 13.9472 20.281 13.4471 20.781C12.947 21.2811 12.666 21.9594 12.666 22.6667V24M20.666 14.6667C20.666 16.1394 19.4721 17.3333 17.9993 17.3333C16.5266 17.3333 15.3327 16.1394 15.3327 14.6667C15.3327 13.1939 16.5266 12 17.9993 12C19.4721 12 20.666 13.1939 20.666 14.6667Z\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span class=\"mt-2 form-check-label ms-5\">The user {{user?.userName}} is assigned as a member to the above\r\n teams.</span>\r\n </div>\r\n }\r\n </section>\r\n <section *ngIf=\"select ==='stores'\" class=\"w-100\">\r\n <div class=\"position-relative my-5\">\r\n <hr class=\"hr m-0 border border-gray-400 border-1\">\r\n <div class=\"position-absolute position-or px-10\">or</div>\r\n </div>\r\n <div class=\"d-flex justify-content-start align-items-center\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ol class=\"custom-ordered-list text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple stores to users at once.</li>\r\n <li class=\"user-text my-2\"><span class=\"user-text\">Download the template here - </span>\r\n <a class=\"ms-1\" href=\"../../../assets/files/storeListTemplate.xlsx\" download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M5.83333 8.33333L10 12.5M10 12.5L14.1667 8.33333M10 12.5V2.5\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"template ms-2\">Download Template</span>\r\n </a>\r\n </li>\r\n <li class=\"user-text my-3\">Add your data to the Template File</li>\r\n <li class=\"user-text my-3\">Upload it below for processing</li> \r\n </ol>\r\n </div>\r\n </div>\r\n <div class=\"mt-3 ms-3 right-bar py-5 d-flex justify-content-center align-items-center flex-column\" >\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\" value=\"personal\"\r\n class=\"btn-check\"\r\n (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"persona\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n <div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload</span>\r\n <!-- <span class=\"ms-2\">or drag and drop</span> -->\r\n </div>\r\n <div class=\"nodata-sub\">the data added template file for processing.</div>\r\n </span>\r\n </label>\r\n </div>\r\n </section>\r\n\r\n <div class=\"d-flex mb-10 w-100 mt-10\" role=\"cluster\">\r\n <button class=\"btn btn-outline w-100 mx-3\" (click)=\"closeModal()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 mx-3\" (click)=\"onSubmit()\">Submit</button>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Bulk Assign</span></div>\r\n </div>\r\n <div class=\"card-body pt-0 popup-scroll\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-70px\">\r\n <div [ngClass]=\"excelError \r\n ? 'fw-semibold text-error w-100 error-heading' \r\n : 'fw-semibold w-100 config-heading'\">\r\n {{ excelError?.error?.length || 0 }}\r\n </div>\r\n <div [ngClass]=\"excelError \r\n ? 'fw-semibold text-error mt-1 excel-error' \r\n : 'fw-semibold subtitle mt-1'\">\r\n Error\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div >You're about to assign {{getStoreCounts(excelData)}} {{getStoreCounts(excelData) > 1 ? 'Stores' : 'Store'}}. Are you sure want to proceed?</div>\r\n \r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 d-flex justify-content-end flex-wrap gap-2 pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup();model.close()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"proceedSubmit();model.close()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"file1.click();\">Reupload</button>\r\n <input style=\"display: none;;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\" accept = \".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\r\n (change)=\"onUpload($event)\" />\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".assign-store .form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.assign-store .store-info{color:var(--Gray-700, #344054)!important;font-size:18px!important;font-weight:600;line-height:28px}.assign-store .table-title{line-height:24px!important;color:var(--Gray-500, #344054)!important;font-size:16px!important;font-weight:500!important}.assign-store .table-sub{line-height:30px!important;color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important}.assign-store .bg-assign-user{border-radius:4px;border-left:2px solid var(--Primary-600, #00A3FF);background:var(--Primary-25, #F6FCFF);height:68px;padding:6px 8px 6px 16px}.assign-store td{padding:16px 24px!important}.assign-store .blend-mode{mix-blend-mode:multiply;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);text-align:center;font-size:12px;font-weight:500;line-height:18px;padding:2px 8px}.scroll{overflow-y:auto;overflow-x:hidden}.radio-custom{opacity:0;position:absolute}.radio-custom,.radio-custom-label{display:inline-block;vertical-align:middle;margin:5px 0;cursor:pointer}.radio-custom-label{position:relative}.radio-custom+.radio-custom-label:before{content:\"\";background:#fff;border:2px solid #00A3FF;display:inline-block;vertical-align:middle;width:20px;height:20px;padding:2px;margin-right:10px;text-align:center}.radio-custom+.radio-custom-label:before{border-radius:50%}.radio-custom:checked+.radio-custom-label:before{background:#00a3ff;box-shadow:inset 0 0 0 4.5px #eaf8ff}.text-muted{content:\"\";margin-top:5.1px;border-radius:50%;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);display:inline-block;vertical-align:middle;width:20px;height:20px;padding:2px;margin-left:0;text-align:center}.ms-0{margin-left:-.75rem!important}.dropdown1 .dropdown-title{color:var(--Gray-900, #101828);font-size:16px;font-weight:600;line-height:24px}.dropdown1 .dropdown{position:relative;display:inline-block}.dropdown1 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}.dropdown1 .dropdown-content{z-index:1;padding:0;min-height:auto!important;max-height:285px!important;overflow:auto;border-radius:12px;background:var(--White, #FFF);box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;width:90%}.dropdown1 .dropdown-content label{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.dropdown1 .dropdown-content a{color:#000;padding:12px 16px;text-decoration:none;display:block}.dropdown1 .dropdown button{padding:10px;font-size:16px;cursor:pointer}.dropdown1 input[type=checkbox]{width:16px!important;height:16px!important;margin:-3px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}.dropdown1 input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}.dropdown1 input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.nav-item1 .nav-link1.active{border:none;border-radius:0;background:var(--Primary-50, #EAF8FF);border-bottom:2px solid #009BF3!important;padding:12px}.nav-item1 .nav-link1:hover{border:none}.user-text{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.right-bar{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD)}.click-upload{color:var(--Primary-700, #009BF3)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.position-or{left:50%;top:-10px;background:#fff;transform:translate(-50%)}.subtitle{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.config-heading{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.table-header{color:var(--Gray-800, #1D2939);font-size:16px;font-weight:400;line-height:24px}.text-error{color:var(--Error-700, #B42318)!important;font-size:14px;font-weight:500;line-height:20px}.excel-error{color:var(--Error-600, #D92D20);font-size:14px;font-weight:500;line-height:20px}.error-heading{color:var(--Error-600, #D92D20);font-size:20px;font-weight:500;line-height:30px}.border-error{border:1px solid var(--Error-300, #FDA29B)!important;background:var(--Error-25, #FFFBFA)!important}.popup-card{border-radius:6px;border:1px solid var(--Gray-300, #D0D5DD);background:#fff;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}.popup-scroll{min-height:auto;max-height:400px;overflow-y:auto}\n"] }]
|
|
541
541
|
}], ctorParameters: () => [{ type: i1.UserService }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3.NgbActiveModal }, { type: i3.NgbModal }], propDecorators: { user: [{
|
|
542
542
|
type: Input
|
|
543
543
|
}], inputFile: [{
|
|
@@ -547,4 +547,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
547
547
|
type: ViewChild,
|
|
548
548
|
args: ['afterValidation']
|
|
549
549
|
}] } });
|
|
550
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLXN0b3JlLXBvcHVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS11c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvdGFuZ28tbWFuYWdlLXVzZXJzL2Fzc2lnbi1zdG9yZS1wb3B1cC9hc3NpZ24tc3RvcmUtcG9wdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXVzZXJzL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1tYW5hZ2UtdXNlcnMvYXNzaWduLXN0b3JlLXBvcHVwL2Fzc2lnbi1zdG9yZS1wb3B1cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFDRyxTQUFTLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBWSxJQUFJLEVBQUUsS0FBSyxFQUFhLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBV3hELE1BQU0sT0FBTyx5QkFBeUI7SUFtQjFCO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUF0QkQsSUFBSSxDQUFNO0lBQ25CLE1BQU0sR0FBVyxRQUFRLENBQUM7SUFDMUIsTUFBTSxHQUFVLEVBQUUsQ0FBQztJQUNuQixRQUFRLEdBQVUsRUFBRSxDQUFDO0lBQ3JCLEtBQUssR0FBTyxFQUFFLENBQUM7SUFDZixjQUFjLENBQU07SUFDcEIsUUFBUSxDQUFjO0lBQ3RCLFFBQVEsQ0FBTTtJQUNkLFFBQVEsQ0FBUztJQUNqQixrQkFBa0IsQ0FBSTtJQUN0QixvQkFBb0IsQ0FBSTtJQUN4QixpQkFBaUIsQ0FBSztJQUNFLFNBQVMsQ0FBYTtJQUNoQixlQUFlLENBQU07SUFFbkQsV0FBVyxDQUFNO0lBRWpCLFlBQ1UsV0FBd0IsRUFDeEIsRUFBcUIsRUFDckIsRUFBZ0IsRUFDakIsV0FBMkIsRUFDMUIsWUFB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QUcsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBRSxDQUFDO1lBQ3ZFLElBQUksTUFBTSxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7YUFDaEM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDO0lBQ3hGLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQzt3R0F0a0JVLHlCQUF5Qjs0RkFBekIseUJBQXlCLG1XQ3JCdEMsay9uQkErUmM7OzRGRDFRRCx5QkFBeUI7a0JBVHJDLFNBQVM7K0JBQ0Usd0JBQXdCLFFBSTVCO3dCQUNKLGtCQUFrQixFQUFFLGlCQUFpQjtxQkFDdEM7K0xBR1EsSUFBSTtzQkFBWixLQUFLO2dCQVlrQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1EsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LCBWaWV3Q2hpbGQsRWxlbWVudFJlZlxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCwgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IFdvcmtCb29rLCByZWFkLCB1dGlscywgV29ya1NoZWV0IH0gZnJvbSBcInhsc3hcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImxpYi1hc3NpZ24tc3RvcmUtcG9wdXBcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL2Fzc2lnbi1zdG9yZS1wb3B1cC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vYXNzaWduLXN0b3JlLXBvcHVwLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1ob3N0LW1ldGFkYXRhLXByb3BlcnR5XHJcbiAgaG9zdDoge1xyXG4gICAgJyhkb2N1bWVudDpjbGljayknOiAnb25DbGljaygkZXZlbnQpJyxcclxuICB9LFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNzaWduU3RvcmVQb3B1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgdXNlcjogYW55O1xyXG4gIHNlbGVjdDogc3RyaW5nID0gXCJzdG9yZXNcIjtcclxuICBzdG9yZXM6IGFueVtdID0gW107XHJcbiAgY2x1c3RlcnM6IGFueVtdID0gW107XHJcbiAgdGVhbXM6YW55W109W107XHJcbiAgJGhlYWRlckZpbHRlcnM6IGFueTtcclxuICBtb2RhbFJlZjogTmdiTW9kYWxSZWY7XHJcbiAgdXNlckRhdGE6IGFueTtcclxuICB1c2VyVHlwZTogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVGV4dHN0b3JlczphbnlcclxuICBzZWxlY3RlZFRleHRjbHVzdGVyczphbnlcclxuICBzZWxlY3RlZFRleHR0ZWFtczogYW55XHJcbiAgQFZpZXdDaGlsZChcImlucHV0RmlsZVwiKSBpbnB1dEZpbGU6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnYWZ0ZXJWYWxpZGF0aW9uJykgYWZ0ZXJWYWxpZGF0aW9uOiBhbnk7XHJcblxyXG4gIHVwbG9hZFBvcFVwOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgdHM6IFRvYXN0U2VydmljZSxcclxuICAgIHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWxcclxuICApIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2UuZGF0YVN1YmplY3Quc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMudXNlckRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMudXNlclR5cGUgPSBkYXRhID09IFwiVGFuZ28gVXNlclwiID8gXCJ0YW5nb1wiIDogXCJjbGllbnRcIjtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSB8fCBcIlwiKTtcclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIHRoaXMuJGhlYWRlckZpbHRlcnMgPSBkYXRhO1xyXG4gICAgfSBlbHNlIGlmKCFkYXRhKXtcclxuICAgICAgbGV0IHVzZXI6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICcnKTtcclxuICAgICAgdGhpcy4kaGVhZGVyRmlsdGVycyA9IHVzZXI7XHJcbiAgICAgIHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50ID0gdXNlci5jbGllbnRJZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5nZXRBc3NpZ25TdG9yZUxpc3QoKTtcclxuICAgIHRoaXMuZ2V0Y2x1c3Rlckxpc3QoKTtcclxuICAgIHRoaXMuZ2V0dGVhbXNMaXN0KCkgICAgXHJcbiAgfVxyXG5cclxuICBsb2FkVXNlckFzc2lnbkRldGFpbHMoKSB7XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgIC5nZXRVc2VyQXNzaWduRGF0YSh7XHJcbiAgICAgICAgZW1haWw6IHRoaXMudXNlci5lbWFpbCwgICAgICBcclxuICAgICAgfSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTZWxlY3RlZFN0b3JlcyhyZXMuZGF0YS5zdG9yZXMpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTZWxlY3RlZGNsdXN0ZXJzKHJlcy5kYXRhLmNsdXN0ZXJzKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkU2VsZWN0ZWR0ZWFtcyhyZXMuZGF0YS50ZWFtcyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4geyAgICAgICAgXHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEFzc2lnblN0b3JlTGlzdCgpIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgLmdldEFzc2lnblN0b3Jlcyh7IGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YU9iamVjdFswXS5TdG9yZXMgPSByZXMuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFVzZXJBc3NpZ25EZXRhaWxzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhT2JqZWN0WzBdLlN0b3JlcyA9IFtdO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHt9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldGNsdXN0ZXJMaXN0KCkge1xyXG4gICAgdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAuZ2V0QXNzaWduY2x1c3RlcnMoeyBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgfSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFPYmplY3RbMV0uY2x1c3RlcnMgPSByZXMuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YU9iamVjdFsxXS5jbHVzdGVycyA9IFtdO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHt9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgZ2V0dGVhbXNMaXN0KCkge1xyXG4gICAgdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAuZ2V0QXNzaWdudGVhbXMoeyBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQsIHVzZXJFbWFpbDp0aGlzLnVzZXI/LmVtYWlsIH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhT2JqZWN0WzJdLnRlYW1zID0gcmVzLmRhdGEucmVzdWx0O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gaWYgKHRoaXMudXNlci5hc3NpZ25lZFZhbHVlKSB7XHJcbiAgICAgICAgICAgIC8vICAgdGhpcy5sb2FkU2VsZWN0ZWR0ZWFtcyh0aGlzLnVzZXIuYXNzaWduZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFPYmplY3RbMl0uY2x1c3RlcnMgPSBbXTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7fSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdG9yZXNUeXBlKGU6IGFueSkge1xyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICAgIC8vIHRoaXMucmVzZXRjbHVzdGVycygpO1xyXG4gICAgLy8gdGhpcy5yZXNldFN0b3JlKCk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3QgPT0gXCJzdG9yZXNcIikge1xyXG4gICAgICBpZih0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0ubGVuZ3RoPT0wKXtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dHN0b3JlcyA9IFwiU2VsZWN0IFN0b3Jlc1wiO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dHN0b3JlcyA9IGAke3RoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5sZW5ndGh9IFN0b3JlcyBTZWxlY3RlZGA7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZih0aGlzLnNlbGVjdCA9PSdjbHVzdGVycycpIHtcclxuICAgICAgaWYodGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdLmxlbmd0aD09MCl7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRleHRjbHVzdGVycyA9IFwiU2VsZWN0IENsdXN0ZXJzXCI7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0Y2x1c3RlcnMgPSBgJHt0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMV0ubGVuZ3RofSBDbHVzdGVycyBTZWxlY3RlZGA7XHJcbiAgICAgIH0gICAgICBcclxuICAgIH1lbHNlIGlmKHRoaXMuc2VsZWN0ID09J3RlYW1zJykge1xyXG4gICAgICBpZih0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0ubGVuZ3RoPT0wKXtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dHRlYW1zID0gXCJTZWxlY3QgVGVhbXNcIjtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRleHR0ZWFtcyA9IGAke3RoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXS5sZW5ndGh9IFRlYW1zIFNlbGVjdGVkYDtcclxuICAgICAgfSAgICAgIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRTdG9yZSgpIHtcclxuICAgIHRoaXMuZGF0YU9iamVjdFswXS5TdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuc3RvcmVzID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0gPSBbXTtcclxuICB9XHJcblxyXG4gIHJlc2V0Y2x1c3RlcnMoKSB7XHJcbiAgICB0aGlzLmRhdGFPYmplY3RbMV0uY2x1c3RlcnMgPSBbXTtcclxuICAgIHRoaXMuY2x1c3RlcnMgPSBbXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXSA9IFtdO1xyXG4gIH1cclxuICByZXNldFRlYW1zKCkge1xyXG4gICAgdGhpcy5kYXRhT2JqZWN0WzJdLnRlYW1zID0gW107XHJcbiAgICB0aGlzLnRlYW1zID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0gPSBbXTtcclxuICB9XHJcbiAgT3BlbmRyb3Bkb3duOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZGF0YU9iamVjdDogYW55W10gPSBbXHJcbiAgICB7IERlc2NyaXB0aW9uOiBcIlN0b3Jlc1wiLCBTdG9yZXM6IFtdIH0sXHJcbiAgICB7IERlc2NyaXB0aW9uOiBcIkNsdXN0ZXJzXCIsIGNsdXN0ZXJzOiBbXSB9LFxyXG4gICAgeyBEZXNjcmlwdGlvbjogXCJUZWFtc1wiLCB0ZWFtczogW10gfSxcclxuXHJcbiAgXTtcclxuICBzZWxlY3RlZFZhbHVlc0FycmF5OiBhbnlbXSA9IFtbXSwgW10sW11dO1xyXG4gIHNlbGVjdGVkVGV4dDogc3RyaW5nO1xyXG5cclxuICBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIXRhcmdldC5jbG9zZXN0KFwiLmRyb3Bkb3duMVwiKSkge1xyXG4gICAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0YXJnZXQuY2xvc2VzdChcIi5kcm9wZG93bi1jb250ZW50XCIpKSB7XHJcbiAgICAgIHRoaXMuZGF0YU9iamVjdC5mb3JFYWNoKChpdGVtOiBhbnksIGk6IGFueSkgPT4ge1xyXG4gICAgICAgIGl0ZW0uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgRHJvcGRvd24odmFsdWU6IGFueSwgaW5kZXg6IG51bWJlciwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5kYXRhT2JqZWN0LmZvckVhY2goKGl0ZW06IGFueSwgaTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpICE9PSBpbmRleCkge1xyXG4gICAgICAgIGl0ZW0uaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5kYXRhT2JqZWN0W2luZGV4XS5pc09wZW4gPSAhdGhpcy5kYXRhT2JqZWN0W2luZGV4XS5pc09wZW47XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDaGVja2JveFN0b3JlcyhcclxuICAgIGV2ZW50OiBhbnksXHJcbiAgICBzdG9yZTogYW55LFxyXG4gICAgaW5kZXg6IG51bWJlcixcclxuICAgIHN1YkluZGV4OiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IHN0b3JlcyA9IHRoaXMuZGF0YU9iamVjdFswXS5TdG9yZXM7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0gPSB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0gfHwgW107XHJcblxyXG4gICAgaWYgKHN0b3JlID09PSBcIlNlbGVjdCBBbGxcIikge1xyXG4gICAgICBjb25zdCBjaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICAgIHN0b3Jlcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IChpdGVtLmNoZWNrZWQgPSBjaGVja2VkKSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSA9IGNoZWNrZWQgPyBbLi4uc3RvcmVzXSA6IFtdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICAgIGNvbnN0IHN0b3JlSW5kZXggPSB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0uZmluZEluZGV4KFxyXG4gICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0uc3RvcmVOYW1lID09PSBzdG9yZS5zdG9yZU5hbWVcclxuICAgICAgKTtcclxuICAgICAgaXNDaGVja2VkXHJcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0ucHVzaChzdG9yZSlcclxuICAgICAgICA6IHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5zcGxpY2Uoc3RvcmVJbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuZGF0YU9iamVjdFtpbmRleF0uU3RvcmVzW3N1YkluZGV4XS5jaGVja2VkID0gaXNDaGVja2VkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdEFsbENoZWNrZWQgPSBzdG9yZXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gaXRlbS5jaGVja2VkKTtcclxuICAgIChcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNlbGVjdGFsbCR7aW5kZXh9YCkgYXMgSFRNTElucHV0RWxlbWVudFxyXG4gICAgKT8uc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCBTdHJpbmcoc2VsZWN0QWxsQ2hlY2tlZCkpO1xyXG4gICAgKFxyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgb3B0aW9uJHtzdG9yZS5zdG9yZU5hbWV9YCkgYXMgSFRNTElucHV0RWxlbWVudFxyXG4gICAgKT8uc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCBTdHJpbmcoZXZlbnQudGFyZ2V0LmNoZWNrZWQpKTtcclxuXHJcbiAgICB0aGlzLmxvYWRUYWJsZSh0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZFRleHRzdG9yZXMgPSBgJHt0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0ubGVuZ3RofSBTdG9yZXMgU2VsZWN0ZWRgO1xyXG4gIH1cclxuICB0b2dnbGVDaGVja2JveFRlYW1zKFxyXG4gICAgZXZlbnQ6IGFueSxcclxuICAgIHRlYW06IGFueSxcclxuICAgIGluZGV4OiBudW1iZXIsXHJcbiAgICBzdWJJbmRleDogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBcclxuICAgIGNvbnN0IHRlYW1zID0gdGhpcy5kYXRhT2JqZWN0WzJdLnRlYW1zO1xyXG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdID0gdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdIHx8IFtdO1xyXG5cclxuICAgIGlmICh0ZWFtID09PSBcIlNlbGVjdCBBbGxcIikge1xyXG4gICAgICBjb25zdCBjaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICAgIHRlYW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4gKGl0ZW0uY2hlY2tlZCA9IGNoZWNrZWQpKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdID0gY2hlY2tlZCA/IFsuLi50ZWFtc10gOiBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xyXG4gICAgICBjb25zdCBzdG9yZUluZGV4ID0gdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdLmZpbmRJbmRleChcclxuICAgICAgICAoaXRlbTogYW55KSA9PiBpdGVtLnVzZXJOYW1lID09PSB0ZWFtLnVzZXJOYW1lXHJcbiAgICAgICk7XHJcbiAgICAgIGlzQ2hlY2tlZFxyXG4gICAgICAgID8gdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdLnB1c2godGVhbSlcclxuICAgICAgICA6IHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXS5zcGxpY2Uoc3RvcmVJbmRleCwgMSk7XHJcbiAgICAgIHRoaXMuZGF0YU9iamVjdFtpbmRleF0udGVhbXNbc3ViSW5kZXhdLmNoZWNrZWQgPSBpc0NoZWNrZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0QWxsQ2hlY2tlZCA9IHRlYW1zLmV2ZXJ5KChpdGVtOiBhbnkpID0+IGl0ZW0uY2hlY2tlZCk7XHJcbiAgICAoXHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzZWxlY3RhbGwke2luZGV4fWApIGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICAgICk/LnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgU3RyaW5nKHNlbGVjdEFsbENoZWNrZWQpKTtcclxuICAgIChcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYG9wdGlvbiR7dGVhbXMuc3RvcmVOYW1lfWApIGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICAgICk/LnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgU3RyaW5nKGV2ZW50LnRhcmdldC5jaGVja2VkKSk7XHJcblxyXG4gICAgdGhpcy5sb2FkVGFibGUodGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRUZXh0dGVhbXMgPSBgJHt0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0ubGVuZ3RofSBUZWFtcyBTZWxlY3RlZGA7XHJcbiAgfVxyXG5cclxuICBsb2FkVGFibGUodmFsdWVzOiBhbnlbXSkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ID09IFwic3RvcmVzXCIpIHtcclxuICAgICAgdGhpcy5zdG9yZXMgPSB2YWx1ZXM7XHJcbiAgICB9IGVsc2UgaWYodGhpcy5zZWxlY3QgPT0gXCJjbHVzdGVyc1wiKSB7XHJcbiAgICAgIHRoaXMuY2x1c3RlcnMgPSB2YWx1ZXM7XHJcbiAgICB9ZWxzZSBpZih0aGlzLnNlbGVjdCA9PSBcInRlYW1zXCIpIHtcclxuICAgICAgdGhpcy50ZWFtcyA9IHZhbHVlcztcclxuICAgIH1cclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgb25zdG9yZVNlbGVjdChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0gID0gZXZlbnRcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBvbmdyb3VwU2VsZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXSAgPSBldmVudFxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfSAgXHJcbiAgb25UZWFtc1NlbGVjdChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0gID0gZXZlbnRcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBcclxuXHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAodGhpcy51c2VyLmFzc2lnbmVkVmFsdWUgJiYgdGhpcy51c2VyLmFzc2lnbmVkVmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucmVBc3NpZ25TdWJtaXQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYXNzaWduU3VibWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAgZXhjZWxFcnJvcjogYW55O1xyXG4gIGV4Y2VsRGF0YTogYW55ID0gW11cclxuICB2YWxpZGF0ZWRPdXRwdXQ6IGFueSA9IFtdO1xyXG5cclxuICBnZXRTdG9yZUNvdW50cyhkYXRhOiBhbnkpIHtcclxuXHJcbiAgICBjb25zdCB1bmlxdWVVc2VyTmFtZXMgPSBuZXcgU2V0KGRhdGE/Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtWydTdG9yZSBOYW1lL1N0b3JlIElkJ10pKTtcclxuICAgIHJldHVybiB1bmlxdWVVc2VyTmFtZXMuc2l6ZTtcclxuXHJcbiAgfVxyXG5cclxuICBmaWxlRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBhcGlEYXRhOiBhbnkgPSBbXTtcclxuXHJcbiAgb25VcGxvYWQoZTphbnkpIHtcclxuICAgIGxldCBkYXRhOiBhbnkgPSBbXTtcclxuICAgIGxldCBlcnJvcjogYW55ID0gW107XHJcbiAgICBsZXQgc2hlZXROYW1lOiBhbnkgPSAnJztcclxuXHJcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XHJcbiAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSAvXFwuKHhsc3x4bHN4fGNzdikkL2k7XHJcbiAgY29uc3QgYWxsb3dlZFR5cGVzID0gW1xyXG4gICAgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiLCBcclxuICAgIFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICBcInRleHQvY3N2XCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICBcImFwcGxpY2F0aW9uL2NzdlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gIF07XHJcblxyXG4gIGlmICghYWxsb3dlZEV4dGVuc2lvbnMudGVzdChmaWxlLm5hbWUpIHx8ICFhbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSkge1xyXG4gICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiT25seSAueGxzeCwgb3IgLmNzdiBmaWxlcyBhcmUgYWxsb3dlZC5cIik7XHJcbiAgICB0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gXCJcIjtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0OiBEYXRhVHJhbnNmZXIgPSA8RGF0YVRyYW5zZmVyPmUudGFyZ2V0O1xyXG4gICAgaWYgKHRhcmdldC5maWxlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKCEhdGFyZ2V0LmZpbGVzWzBdLm5hbWUubWF0Y2goLygueGxzfC54bHN4KS8pKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlcjogRmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgYnN0cjogc3RyaW5nID0gZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgIGNvbnN0IHdiOiBXb3JrQm9vayA9IHJlYWQoYnN0ciwgeyB0eXBlOiBcImJpbmFyeVwiIH0pO1xyXG4gICAgICAgIGNvbnN0IHdzbmFtZTogc3RyaW5nID0gd2IuU2hlZXROYW1lc1swXTtcclxuICAgICAgICBjb25zdCB3czogV29ya1NoZWV0ID0gd2IuU2hlZXRzW3dzbmFtZV07XHJcblxyXG4gICAgICAgIGRhdGEgPSB1dGlscy5zaGVldF90b19qc29uKHdzLCB7ZGVmdmFsOiBcIlwiLHJhdzp0cnVlfSk7XHJcbiAgICAgICAgdGhpcy5leGNlbERhdGEgPSBkYXRhO1xyXG4gICAgICAgIHNoZWV0TmFtZSA9IHdiLlNoZWV0TmFtZXNbMF07XHJcbiAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKHRhcmdldC5maWxlc1swXSk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBhc3luYyAoZSkgPT4ge1xyXG4gICAgICAgIGxldCBwcm9jZXNzZWRBcnJheTogYW55W10gPSBbXTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoc2hlZXROYW1lICE9IFwiU3RvcmVEYXRhXCIpIHtcclxuICAgICAgICAgIHRoaXMuZmlsZUVycm9yID0gIHRydWVcclxuICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJDYW4geW91IGNvbmZpcm0gd2hldGhlciB0aGUgc2hlZXQgbmFtZSBpcyBTdG9yZURhdGEgP1wiKTtcclxuICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiUGxlYXNlIHVwbG9hZCBhIHZhbGlkIGZpbGVcIik7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVxdWlyZWRLZXlzID0gWydTdG9yZSBOYW1lL1N0b3JlIElkJ10gLy8gTXVzdCBhbHdheXMgYmUgcHJlc2VudFxyXG4gICAgICAgIC8vIGNvbnN0IG9wdGlvbmFsS2V5cyA9IFsndXNlclBob25lJywgJ2NpdHknXSA6IFsnY2l0eSddO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBkYXRhLnNvbWUoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW0pO1xyXG4gICAgICAgICAgY29uc3QgaGFzUmVxdWlyZWRLZXlzID0gcmVxdWlyZWRLZXlzLmV2ZXJ5KGtleSA9PiBrZXlzLmluY2x1ZGVzKGtleSkpO1xyXG4gICAgICAgICAgY29uc3QgYWxsS2V5c0FyZUFsbG93ZWQgPSBrZXlzLmV2ZXJ5KGtleSA9PiBcclxuICAgICAgICAgICAgcmVxdWlyZWRLZXlzLmluY2x1ZGVzKGtleSlcclxuICAgICAgICAgICAgLy8gfHwgb3B0aW9uYWxLZXlzLmluY2x1ZGVzKGtleSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXR1cm4gaGFzUmVxdWlyZWRLZXlzICYmIGFsbEtleXNBcmVBbGxvd2VkO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdCgnUGxlYXNlIHVwbG9hZCBhIHZhbGlkIGZpbGUuJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhPy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICggIWVsZW1lbnQ/LlsnU3RvcmUgTmFtZS9TdG9yZSBJZCddIHx8IGVsZW1lbnQ/LlsnU3RvcmUgTmFtZS9TdG9yZSBJZCddID09ICcnIHx8IGVsZW1lbnQ/LlsnU3RvcmUgTmFtZS9TdG9yZSBJZCddID09IG51bGwpIHtcclxuICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCBTdG9yZSBOYW1lL1N0b3JlIElkIC0gQSR7aW5kZXggKyAyfWApXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcm9jZXNzZWRBcnJheS5wdXNoKHtcclxuICAgICAgICAgICAgICB2YWx1ZTogZGF0YVtpbmRleF1bJ1N0b3JlIE5hbWUvU3RvcmUgSWQnXVxyXG4gICAgICAgICAgICB9KSBcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZiAoZXJyb3IubGVuZ3RoKSB7XHJcbiAgICAgICAgICBjb25zdCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgIGRpc3BsYXlwcm9wOiBmYWxzZSxcclxuICAgICAgICAgICAgaW1hZ2VzcmM6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIj48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjRkVGMEM3XCIvPjxwYXRoIGQ9XCJNMjcuOTk5OCAyNC4wMDEyVjI4LjAwMTJNMjcuOTk5OCAzMi4wMDEySDI4LjAwOThNMjYuMjg5OCAxOC44NjEyTDE3LjgxOTggMzMuMDAxMkMxNy42NDUxIDMzLjMwMzYgMTcuNTUyNyAzMy42NDY1IDE3LjU1MTggMzMuOTk1N0MxNy41NTA4IDM0LjM0NDkgMTcuNjQxMyAzNC42ODgzIDE3LjgxNDIgMzQuOTkxN0MxNy45ODcxIDM1LjI5NTEgMTguMjM2NSAzNS41NDc5IDE4LjUzNzUgMzUuNzI1QzE4LjgzODUgMzUuOTAyMSAxOS4xODA2IDM1Ljk5NzMgMTkuNTI5OCAzNi4wMDEySDM2LjQ2OThDMzYuODE5IDM1Ljk5NzMgMzcuMTYxMSAzNS45MDIxIDM3LjQ2MjEgMzUuNzI1QzM3Ljc2MzEgMzUuNTQ3OSAzOC4wMTI0IDM1LjI5NTEgMzguMTg1NCAzNC45OTE3QzM4LjM1ODMgMzQuNjg4MyAzOC40NDg4IDM0LjM0NDkgMzguNDQ3OCAzMy45OTU3QzM4LjQ0NjggMzMuNjQ2NSAzOC4zNTQ0IDMzLjMwMzYgMzguMTc5OCAzMy4wMDEyTDI5LjcwOTggMTguODYxMkMyOS41MzE1IDE4LjU2NzMgMjkuMjgwNSAxOC4zMjQzIDI4Ljk4MSAxOC4xNTU3QzI4LjY4MTQgMTcuOTg3IDI4LjM0MzUgMTcuODk4NCAyNy45OTk4IDE3Ljg5ODRDMjcuNjU2IDE3Ljg5ODQgMjcuMzE4MSAxNy45ODcgMjcuMDE4NiAxOC4xNTU3QzI2LjcxOTEgMTguMzI0MyAyNi40NjggMTguNTY3MyAyNi4yODk4IDE4Ljg2MTJaXCIgc3Ryb2tlPVwiI0RDNjgwM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgICAgICB0aXRsZTogYEludmFsaWQgZGV0YWlscyFgLFxyXG4gICAgICAgICAgICBjb250ZW50OiBgUGxlYXNlIHByb3ZpZGUgY29ycmVjdCBhbmQgY29tcGxldGUgc3RvcmUgaW5mb3JtYXRpb24uYCxcclxuICAgICAgICAgICAgYnV0dG9udHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgZXJyb3I6IGVycm9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmFmdGVyVXBsbG9hZChwb3B1cGNvbnRlbnQpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLmZpbGVFcnJvcil7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBwcm9jZXNzZWRBcnJheSA9IHByb2Nlc3NlZEFycmF5Lm1hcCgoZWw6IGFueSkgPT4geyByZXR1cm4geyBzdG9yZTogZWw/LnZhbHVlIH0gfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgICAgICAgICAuYnVsa3N0b3JlQXNzaWduKHtcclxuICAgICAgICAgICAgICAgIHVzZXJFbWFpbDp0aGlzLnVzZXIuZW1haWwsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBwcm9jZXNzZWRBcnJheVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHsgXHJcbiAgICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGlEYXRhID0gcmVzPy5kYXRhPy5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSA9IHJlcz8uZGF0YT8ucmVzdWx0Lm1hcCgoZWw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlcyA9IHRoaXMuZGF0YU9iamVjdD8uWzBdPy5TdG9yZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBzdG9yZXM/LmZpbmQoKHZhbDogYW55KSA9PiB2YWwuX2lkID09PSBlbD8uX2lkKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoKGl0ZW06YW55KSA9PiBpdGVtICE9PSBudWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZnRlclVwbGxvYWQoKTtcclxuICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiVGhlIGdpdmVuIFN0b3JlIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBicmFuZFwiKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvci5jb2RlID09IDQwMCkgeyAvLyB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9wdXBjb250ZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgaW1hZ2VzcmM6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIj48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIGZpbGw9XCIjRkVGMEM3XCIvPjxwYXRoIGQ9XCJNMjcuOTk5OCAyNC4wMDEyVjI4LjAwMTJNMjcuOTk5OCAzMi4wMDEySDI4LjAwOThNMjYuMjg5OCAxOC44NjEyTDE3LjgxOTggMzMuMDAxMkMxNy42NDUxIDMzLjMwMzYgMTcuNTUyNyAzMy42NDY1IDE3LjU1MTggMzMuOTk1N0MxNy41NTA4IDM0LjM0NDkgMTcuNjQxMyAzNC42ODgzIDE3LjgxNDIgMzQuOTkxN0MxNy45ODcxIDM1LjI5NTEgMTguMjM2NSAzNS41NDc5IDE4LjUzNzUgMzUuNzI1QzE4LjgzODUgMzUuOTAyMSAxOS4xODA2IDM1Ljk5NzMgMTkuNTI5OCAzNi4wMDEySDM2LjQ2OThDMzYuODE5IDM1Ljk5NzMgMzcuMTYxMSAzNS45MDIxIDM3LjQ2MjEgMzUuNzI1QzM3Ljc2MzEgMzUuNTQ3OSAzOC4wMTI0IDM1LjI5NTEgMzguMTg1NCAzNC45OTE3QzM4LjM1ODMgMzQuNjg4MyAzOC40NDg4IDM0LjM0NDkgMzguNDQ3OCAzMy45OTU3QzM4LjQ0NjggMzMuNjQ2NSAzOC4zNTQ0IDMzLjMwMzYgMzguMTc5OCAzMy4wMDEyTDI5LjcwOTggMTguODYxMkMyOS41MzE1IDE4LjU2NzMgMjkuMjgwNSAxOC4zMjQzIDI4Ljk4MSAxOC4xNTU3QzI4LjY4MTQgMTcuOTg3IDI4LjM0MzUgMTcuODk4NCAyNy45OTk4IDE3Ljg5ODRDMjcuNjU2IDE3Ljg5ODQgMjcuMzE4MSAxNy45ODcgMjcuMDE4NiAxOC4xNTU3QzI2LjcxOTEgMTguMzI0MyAyNi40NjggMTguNTY3MyAyNi4yODk4IDE4Ljg2MTJaXCIgc3Ryb2tlPVwiI0RDNjgwM1wiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRkZGQUVCXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz48L3N2Zz5gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGBJbnZhbGlkIGRldGFpbHMhYCxcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBzdG9yZSBpbmZvcm1hdGlvbi5gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgYnV0dG9udHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIuZXJyb3IuZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZnRlclVwbGxvYWQocG9wdXBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3IuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICAvLyAkKFwiI2t0X2NyZWF0ZV9hY2NvdW50X2Zvcm1fYWNjb3VudF90eXBlX3BlcnNvbmFsXCIpLnZhbChcIlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2NlZWRTdWJtaXQoKSB7XHJcbiAgICB0aGlzLmxvYWRUYWJsZSh0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZFRleHRzdG9yZXMgPSBgJHt0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0ubGVuZ3RofSBTdG9yZXMgU2VsZWN0ZWRgO1xyXG4gIH1cclxuXHJcbiAgIGNsb3NlYWN0aXZlcG9wdXAoKSB7XHJcbiAgICAvLyB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgfVxyXG5cclxuICBhZnRlclVwbGxvYWQoZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5leGNlbEVycm9yID0gZGF0YTtcclxuICAgIGlmICh0aGlzLnVwbG9hZFBvcFVwKSB7XHJcbiAgICAgIHRoaXMudXBsb2FkUG9wVXAuZGlzbWlzcygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGxvYWRQb3BVcCA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5hZnRlclZhbGlkYXRpb24sIHsgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJywgc2l6ZTogJ2xnJywgd2luZG93Q2xhc3M6ICdjdXN0b20tbW9kYWwtd2lkdGgnIH0pXHJcbiAgfVxyXG5cclxuICBhc3NpZ25TdWJtaXQoKSB7XHJcbiAgICBcclxuICAgIHRoaXMuYXBpRGF0YSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5tYXAoKGVsOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBfaWQ6IGVsPy5faWQsXHJcbiAgICAgICAgc3RvcmVOYW1lOmVsPy5zdG9yZU5hbWUsXHJcbiAgICAgICAgc3RvcmVJZDplbD8uc3RvcmVJZFxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBkYXRhOiBbe1xyXG4gICAgICAgIHVzZXJFbWFpbDogdGhpcy51c2VyLmVtYWlsLFxyXG4gICAgICAgIHN0b3JlczogdGhpcy5hcGlEYXRhLFxyXG4gICAgICAgIGNsdXN0ZXJzOnRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXSxcclxuICAgICAgICB0ZWFtczp0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0gXHJcbiAgICAgIH1dXHJcbiAgICAgIC8vIHVzZXJJZDp0aGlzLnVzZXIuX2lkLFxyXG4gICAgICAvLyBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQsXHJcbiAgICAgIC8vIHVzZXJUeXBlOiB0aGlzLnVzZXJUeXBlLFxyXG4gICAgfSAgXHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgIC5hc3NpZ25EYXRhKHBheWxvYWQpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoYCR7dGhpcy5zZWxlY3QgPT0gJ3N0b3JlcycgPyAnU3RvcmVzJyA6ICdDbHVzdGVycyd9IEFzc2lnbmVkIHRvIFVzZXIgU3VjY2Vzc2Z1bGx5IWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGBVbmFibGUgdG8gYXNzaWduICR7dGhpcy5zZWxlY3QgPT0gJ3N0b3JlcycgPyAnc3RvcmVzJyA6ICdDbHVzdGVycyd9IHRvIHVzZXIhYClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byBBc3NpZ24gU3RvcmVzIHRvIFVzZXIhXCIpO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHt9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlQXNzaWduU3VibWl0KCkge1xyXG4gICAgbGV0IHBheWxvYWQ9IHtcclxuICAgICAgdXNlcklkOnRoaXMudXNlci5faWQsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCxcclxuICAgICAgdXNlckVtYWlsOiB0aGlzLnVzZXIuZW1haWwsXHJcbiAgICAgIHVzZXJUeXBlOiB0aGlzLnVzZXJUeXBlLFxyXG4gICAgICBzdG9yZXM6dGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzBdLFxyXG4gICAgICBjbHVzdGVyczp0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMV0sXHJcbiAgICAgIHRlYW1zOnRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXVxyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAucmVBc3NpZ25TdG9yZXMocGF5bG9hZClcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChgJHt0aGlzLnNlbGVjdCA9PSAnc3RvcmVzJyA/ICdTdG9yZXMnIDogJ0NsdXN0ZXJzJ30gQXNzaWduZWQgdG8gVXNlciBTdWNjZXNzZnVsbHkhYCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoYFVuYWJsZSB0byBhc3NpZ24gJHt0aGlzLnNlbGVjdCA9PSAnc3RvcmVzJyA/ICdzdG9yZXMnIDogJ0NsdXN0ZXJzJ30gdG8gdXNlciFgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiVW5hYmxlIHRvIEFzc2lnbiBTdG9yZXMgdG8gVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge30sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZFNlbGVjdGVkU3RvcmVzKHN0b3JlczogYW55W10pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSA9IFtdO1xyXG4gICAgdGhpcy5kYXRhT2JqZWN0WzBdLlN0b3Jlcy5mb3JFYWNoKChzdG9yZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHN0b3Jlcy5zb21lKCAoIG9iajphbnkgKSA9PiBvYmouc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCApO1xyXG4gICAgICBpZiAoZXhpc3RzKSB7ICAgICAgICBcclxuICAgICAgICBzdG9yZS5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0ucHVzaChzdG9yZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdG9yZXMgPSB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF07XHJcbiAgICB0aGlzLnNlbGVjdGVkVGV4dHN0b3JlcyA9IGAke3RoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5sZW5ndGh9IFN0b3JlcyBTZWxlY3RlZGA7XHJcbiAgfVxyXG4gIGxvYWRTZWxlY3RlZHRlYW1zKHRlYW1zOiBhbnlbXSl7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0gPSBbXTtcclxuICAgIHRoaXMuZGF0YU9iamVjdFsyXS50ZWFtcy5mb3JFYWNoKCh0ZWFtOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZXhpc3RzID0gdGVhbXMuc29tZSggKCBvYmo6YW55ICkgPT4gb2JqLl9pZCA9PT0gdGVhbS5faWQgKTtcclxuICAgICAgaWYgKGV4aXN0cykge1xyXG4gICAgICAgIHRlYW0uY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdLnB1c2godGVhbSk7XHJcbiAgICAgICAgdGhpcy50ZWFtcy5wdXNoKHRlYW0uX2lkKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRUZXh0dGVhbXMgPSBgJHt0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMV0ubGVuZ3RofSBUZWFtcyBTZWxlY3RlZGA7XHJcbiAgfVxyXG4gIGxvYWRTZWxlY3RlZGNsdXN0ZXJzKGNsdXN0ZXJzOiBhbnlbXSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdID0gW107XHJcbiAgICB0aGlzLmRhdGFPYmplY3RbMV0uY2x1c3RlcnMuZm9yRWFjaCgoY2x1c3RlcjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGNsdXN0ZXJzLnNvbWUoICggb2JqOmFueSApID0+IG9iai5faWQgPT09IGNsdXN0ZXIuX2lkICk7XHJcbiAgICAgIGlmIChleGlzdHMpIHtcclxuICAgICAgICBjbHVzdGVyLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXS5wdXNoKGNsdXN0ZXIpO1xyXG4gICAgICAgIHRoaXMuY2x1c3RlcnMucHVzaChjbHVzdGVyLl9pZClcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGV4dGNsdXN0ZXJzID0gYCR7dGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdLmxlbmd0aH0gQ2x1c3RlcnMgU2VsZWN0ZWRgO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VNb2RhbCgpIHtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZCBhc3NpZ24tc3RvcmUgcHktMCBzY3JvbGxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTVcIj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwic3ltYm9sIHN5bWJvbC03NXB4IHN5bWJvbC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgYWx0PVwiUGljXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvYXNzaWduLWFkZHVzZXIuc3ZnXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+XHJcbjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIi8+XHJcbjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+XHJcbjxwYXRoIGQ9XCJNMzIgMzdWMzVDMzIgMzMuOTM5MSAzMS41Nzg2IDMyLjkyMTcgMzAuODI4NCAzMi4xNzE2QzMwLjA3ODMgMzEuNDIxNCAyOS4wNjA5IDMxIDI4IDMxSDIxQzE5LjkzOTEgMzEgMTguOTIxNyAzMS40MjE0IDE4LjE3MTYgMzIuMTcxNkMxNy40MjE0IDMyLjkyMTcgMTcgMzMuOTM5MSAxNyAzNVYzN00zNiAyNFYzME0zOSAyN0gzM00yOC41IDIzQzI4LjUgMjUuMjA5MSAyNi43MDkxIDI3IDI0LjUgMjdDMjIuMjkwOSAyNyAyMC41IDI1LjIwOTEgMjAuNSAyM0MyMC41IDIwLjc5MDkgMjIuMjkwOSAxOSAyNC41IDE5QzI2LjcwOTEgMTkgMjguNSAyMC43OTA5IDI4LjUgMjNaXCIgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxhIGNsYXNzPVwidGl0bGUgbWItM1wiPkFzc2lnbiB7eyhzZWxlY3QgPT09J2NsdXN0ZXJzJyA/ICdhcyBsZWFkIHRvJyA6ICdhcyB1c2VyIHRvJykgfCB0aXRsZWNhc2V9fTwvYT5cclxuICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwic3ViLXRpdGxlIG15LTJcIj5QbGVhc2UgYXNzaWduIHRoZSB7e3NlbGVjdCA9PT0gJ3N0b3JlcycgPyAnc3RvcmUnIDooc2VsZWN0ID09PSd1c2VycycgPyAndXNlcicgOiAnY2x1c3RlcicpfX08L3NwYW4+IC0tPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXYtc3RyZXRjaCBuYXYtbGluZS10YWJzMSBuYXYtbGluZS10YWJzIGJvcmRlci10cmFuc3BhcmVudCBmbGV4LW5vd3JhcCBcIj5cclxuXHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIG5hdi1pdGVtMVwiIChjbGljayk9XCJzZWxlY3Q9J3N0b3Jlcyc7IHN0b3Jlc1R5cGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgW25nQ2xhc3NdPVwic2VsZWN0ID09PSAnc3RvcmVzJyA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmsgbmF2LWxpbmsxIGN1cnNvci1wb2ludGVyIHRhYi10aXRsZSBtZS02XCI+U3RvcmVzPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbTFcIiAoY2xpY2spPVwic2VsZWN0PSdjbHVzdGVycyc7IHN0b3Jlc1R5cGUoJGV2ZW50KVwiPjxhXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3QgPT09ICdjbHVzdGVycycgPyAnYWN0aXZlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIG5hdi1saW5rMSBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgdGFiLXRpdGxlIG1lLTZcIj5DbHVzdGVyPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbTFcIiAoY2xpY2spPVwic2VsZWN0PSd0ZWFtcyc7IHN0b3Jlc1R5cGUoJGV2ZW50KVwiPjxhXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3QgPT09ICd0ZWFtcycgPyAnYWN0aXZlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIG5hdi1saW5rMSBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgdGFiLXRpdGxlIG1lLTZcIj5UZWFtczwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3QgPT09J3N0b3JlcydcIiBjbGFzcz1cInctMTAwIG15LTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGxhY2Vob2xkZXItb3ZlcmxheVwiICpuZ0lmPVwiIShkYXRhT2JqZWN0WzBdPy5TdG9yZXM/Lmxlbmd0aClcIj5cclxuICAgICAgICAgICAgICAgICAgU2VsZWN0IFN0b3Jlc1xyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bGliLWdyb3VwLXNlbGVjdCBbaXRlbXNdPVwiZGF0YU9iamVjdFswXT8uU3RvcmVzXCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3N0b3JlTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidzdG9yZUlkJ1wiIChzZWxlY3RlZCk9XCJvbnN0b3JlU2VsZWN0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlc109XCJzZWxlY3RlZFZhbHVlc0FycmF5WzBdXCI+XHJcbiAgICAgICAgICAgICAgICA8L2xpYi1ncm91cC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdCA9PT0nY2x1c3RlcnMnXCIgY2xhc3M9XCJ3LTEwMCBteS01XCI+ICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyLW92ZXJsYXlcIiAqbmdJZj1cIiEoZGF0YU9iamVjdFsxXT8uY2x1c3RlcnM/Lmxlbmd0aClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBjbHVzdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1ncm91cC1zZWxlY3QgW2l0ZW1zXT1cImRhdGFPYmplY3RbMV0/LmNsdXN0ZXJzXCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ2NsdXN0ZXJOYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidjbHVzdGVyTmFtZSdcIiAoc2VsZWN0ZWQpPVwib25ncm91cFNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkVmFsdWVzQXJyYXlbMV1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1ncm91cC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3QgPT09J3RlYW1zJ1wiIGNsYXNzPVwidy0xMDAgbXktNVwiPiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbGFjZWhvbGRlci1vdmVybGF5XCIgKm5nSWY9XCIhKGRhdGFPYmplY3RbMl0/LnRlYW1zPy5sZW5ndGgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIFNlbGVjdCBTdG9yZXNcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGxpYi1ncm91cC1zZWxlY3QgW2l0ZW1zXT1cImRhdGFPYmplY3RbMl0/LnRlYW1zXCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3RlYW1OYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3RlYW1OYW1lJ1wiIChzZWxlY3RlZCk9XCJvblRlYW1zU2VsZWN0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlc109XCJzZWxlY3RlZFZhbHVlc0FycmF5WzJdXCI+XHJcbiAgICAgICAgICAgICAgICA8L2xpYi1ncm91cC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxoMiBjbGFzcz1cInN0b3JlLWluZm8gZnctYm9sZFwiPlxyXG4gICAgICAgICAgICBAaWYoc2VsZWN0ID09PSdzdG9yZXMnKSB7XHJcbiAgICAgICAgICAgICAgICBTdG9yZSBcclxuICAgICAgICAgICAgfSBAZWxzZSBpZihzZWxlY3QgPT09J2NsdXN0ZXJzJykge1xyXG4gICAgICAgICAgICAgICAgQ2x1c3RlclxyXG4gICAgICAgICAgICB9QGVsc2UgaWYoc2VsZWN0ID09PSd0ZWFtcycpIHtcclxuICAgICAgICAgICAgICAgIFRlYW1zXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgSW5mb3JtYXRpb25cclxuICAgICAgICA8L2gyPlxyXG5cclxuICAgICAgICA8c2VjdGlvbiAgKm5nSWY9XCJzZWxlY3QgPT09J3N0b3JlcydcIiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIGgtMjAwcHggbWItMyBzY3JvbGxcIj5cclxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlciAgbXQtMiBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+U1BPQyBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlN0b3JlIElEPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFwcGxpY2F0aW9uIElEPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkxvY2F0aW9uPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keT4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgc3RvcmUgb2Ygc3RvcmVzO2xldCBpPWluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tzdG9yZT8uc3BvY05hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tzdG9yZT8uc3RvcmVJZH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3N0b3JlPy5hcHBJZH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3N0b3JlPy5sb2NhdGlvbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4gICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgQGlmIChzZWxlY3RlZFZhbHVlc0FycmF5WzBdLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYmctYXNzaWduLXVzZXIgdy0xMDAgbWItNSBteC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+PHN2ZyB3aWR0aD1cIjM2XCIgaGVpZ2h0PVwiMzZcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgcng9XCIxNlwiIGZpbGw9XCIjREFGMUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIzLjMzMjcgMjRWMjIuNjY2N0MyMy4zMzI3IDIxLjk1OTQgMjMuMDUxNyAyMS4yODExIDIyLjU1MTYgMjAuNzgxQzIyLjA1MTUgMjAuMjgxIDIxLjM3MzMgMjAgMjAuNjY2IDIwSDE1LjMzMjdDMTQuNjI1NCAyMCAxMy45NDcyIDIwLjI4MSAxMy40NDcxIDIwLjc4MUMxMi45NDcgMjEuMjgxMSAxMi42NjYgMjEuOTU5NCAxMi42NjYgMjIuNjY2N1YyNE0yMC42NjYgMTQuNjY2N0MyMC42NjYgMTYuMTM5NCAxOS40NzIxIDE3LjMzMzMgMTcuOTk5MyAxNy4zMzMzQzE2LjUyNjYgMTcuMzMzMyAxNS4zMzI3IDE2LjEzOTQgMTUuMzMyNyAxNC42NjY3QzE1LjMzMjcgMTMuMTkzOSAxNi41MjY2IDEyIDE3Ljk5OTMgMTJDMTkuNDcyMSAxMiAyMC42NjYgMTMuMTkzOSAyMC42NjYgMTQuNjY2N1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXQtMiBmb3JtLWNoZWNrLWxhYmVsIG1zLTVcIj5UaGUgdXNlciB7e3VzZXI/LnVzZXJOYW1lfX0gaXMgYXNzaWduZWQgdG8gdGhlIGFib3ZlIHN0b3Jlcy48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8c2VjdGlvbiAqbmdJZj1cInNlbGVjdCA9PT0nY2x1c3RlcnMnXCIgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZSBoLTIwMHB4IG1iLTMgc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGJvdHRvbS1ib3JkZXIgbXQtMiBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtcy01XCI+Q2x1c3RlciBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlN0b3JlczwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBjbHVzdGVyIG9mIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXTtsZXQgaT1pbmRleDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibXMtNVwiPnt7Y2x1c3Rlcj8uY2x1c3Rlck5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2NsdXN0ZXI/LnN0b3JlTmFtZXN9fSA8c3BhbiAqbmdJZj1cImNsdXN0ZXI/LnN0b3JlTGlzdENvdW50ID4gMlwiIGNsYXNzPVwianVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgYmxlbmQtbW9kZSBtcy0zXCI+K3t7Y2x1c3Rlcj8uc3RvcmVMaXN0Q291bnQgLSAyfX08L3NwYW4+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYmctYXNzaWduLXVzZXIgdy0xMDAgbWItNSBteC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj48c3ZnIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMy4zMzI3IDI0VjIyLjY2NjdDMjMuMzMyNyAyMS45NTk0IDIzLjA1MTcgMjEuMjgxMSAyMi41NTE2IDIwLjc4MUMyMi4wNTE1IDIwLjI4MSAyMS4zNzMzIDIwIDIwLjY2NiAyMEgxNS4zMzI3QzE0LjYyNTQgMjAgMTMuOTQ3MiAyMC4yODEgMTMuNDQ3MSAyMC43ODFDMTIuOTQ3IDIxLjI4MTEgMTIuNjY2IDIxLjk1OTQgMTIuNjY2IDIyLjY2NjdWMjRNMjAuNjY2IDE0LjY2NjdDMjAuNjY2IDE2LjEzOTQgMTkuNDcyMSAxNy4zMzMzIDE3Ljk5OTMgMTcuMzMzM0MxNi41MjY2IDE3LjMzMzMgMTUuMzMyNyAxNi4xMzk0IDE1LjMzMjcgMTQuNjY2N0MxNS4zMzI3IDEzLjE5MzkgMTYuNTI2NiAxMiAxNy45OTkzIDEyQzE5LjQ3MjEgMTIgMjAuNjY2IDEzLjE5MzkgMjAuNjY2IDE0LjY2NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTIgZm9ybS1jaGVjay1sYWJlbCBtcy01XCI+VGhlIHVzZXIge3t1c2VyPy51c2VyTmFtZX19IGlzIGFzc2lnbmVkIGFzIGEgbWVtYmVyIHRvIHRoZSBhYm92ZVxyXG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPHNlY3Rpb24gKm5nSWY9XCJzZWxlY3QgPT09J3RlYW1zJ1wiIGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgaC0yMDBweCBtYi0zIHNjcm9sbFwiPlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBib3R0b20tYm9yZGVyIG10LTIgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibXMtNVwiPlRlYW0gTmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Vc2VyczwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB0ZWFtIG9mIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXTtsZXQgaT1pbmRleDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibXMtNVwiPnt7dGVhbT8udGVhbU5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3RlYW0/LnVzZXJOYW1lc319IDxzcGFuICpuZ0lmPVwidGVhbT8udXNlckxpc3RDb3VudCA+IDJcIiBjbGFzcz1cImp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGJsZW5kLW1vZGUgbXMtM1wiPit7e3RlYW0/LnVzZXJMaXN0Q291bnQgLSAyfX08L3NwYW4+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYmctYXNzaWduLXVzZXIgdy0xMDAgbWItNSBteC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj48c3ZnIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMy4zMzI3IDI0VjIyLjY2NjdDMjMuMzMyNyAyMS45NTk0IDIzLjA1MTcgMjEuMjgxMSAyMi41NTE2IDIwLjc4MUMyMi4wNTE1IDIwLjI4MSAyMS4zNzMzIDIwIDIwLjY2NiAyMEgxNS4zMzI3QzE0LjYyNTQgMjAgMTMuOTQ3MiAyMC4yODEgMTMuNDQ3MSAyMC43ODFDMTIuOTQ3IDIxLjI4MTEgMTIuNjY2IDIxLjk1OTQgMTIuNjY2IDIyLjY2NjdWMjRNMjAuNjY2IDE0LjY2NjdDMjAuNjY2IDE2LjEzOTQgMTkuNDcyMSAxNy4zMzMzIDE3Ljk5OTMgMTcuMzMzM0MxNi41MjY2IDE3LjMzMzMgMTUuMzMyNyAxNi4xMzk0IDE1LjMzMjcgMTQuNjY2N0MxNS4zMzI3IDEzLjE5MzkgMTYuNTI2NiAxMiAxNy45OTkzIDEyQzE5LjQ3MjEgMTIgMjAuNjY2IDEzLjE5MzkgMjAuNjY2IDE0LjY2NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTIgZm9ybS1jaGVjay1sYWJlbCBtcy01XCI+VGhlIHVzZXIge3t1c2VyPy51c2VyTmFtZX19IGlzIGFzc2lnbmVkIGFzIGEgbWVtYmVyIHRvIHRoZSBhYm92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRlYW1zLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPHNlY3Rpb24gKm5nSWY9XCJzZWxlY3QgPT09J3N0b3JlcydcIiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBteS01XCI+XHJcbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJociBtLTAgYm9yZGVyIGJvcmRlci1ncmF5LTQwMCBib3JkZXItMVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHBvc2l0aW9uLW9yIHB4LTEwXCI+b3I8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTUwMCBteS02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9sIGNsYXNzPVwiY3VzdG9tLW9yZGVyZWQtbGlzdCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGQgZnMtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ1c2VyLXRleHRcIj5Vc2UgdGhlIHRlbXBsYXRlIHRvIHVwbG9hZCBtdWx0aXBsZSBzdG9yZXMgdG8gdXNlcnMgYXQgb25jZS48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ1c2VyLXRleHQgbXktMlwiPjxzcGFuIGNsYXNzPVwidXNlci10ZXh0XCI+RG93bmxvYWQgdGhlIHRlbXBsYXRlIGhlcmUgLSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1zLTFcIiBocmVmPVwiLi4vLi4vLi4vYXNzZXRzL2ZpbGVzL3N0b3JlTGlzdFRlbXBsYXRlLnhsc3hcIiBkb3dubG9hZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU01LjgzMzMzIDguMzMzMzNMMTAgMTIuNU0xMCAxMi41TDE0LjE2NjcgOC4zMzMzM00xMCAxMi41VjIuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZW1wbGF0ZSBtcy0yXCI+RG93bmxvYWQgVGVtcGxhdGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBteS0zXCI+QWRkIHlvdXIgZGF0YSB0byB0aGUgVGVtcGxhdGUgRmlsZTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBteS0zXCI+VXBsb2FkIGl0IGJlbG93IGZvciBwcm9jZXNzaW5nPC9saT4gICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvb2w+XHJcbiAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBtcy0zIHJpZ2h0LWJhciBweS01IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiID5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwiYWNjb3VudFR5cGVcIiB0eXBlPVwicmFkaW9cIiBpZD1cImt0X2NyZWF0ZV9hY2NvdW50X2Zvcm1fYWNjb3VudF90eXBlX3BlcnNvbmFsXCIgYWNjZXB0ID0gXCIuY3N2LCBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCwgYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCIgdmFsdWU9XCJwZXJzb25hbFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1jaGVja1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgbmctcmVmbGVjdC12YWx1ZT1cInBlcnNvbmFcIiB0eXBlPVwiZmlsZVwiICNpbnB1dEZpbGUgLz5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJrdF9jcmVhdGVfYWNjb3VudF9mb3JtX2FjY291bnRfdHlwZV9wZXJzb25hbFwiIGNsYXNzPVwiIHctNTAgcC00XCI+PHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZ3LWJvbGQgdGV4dC1jZW50ZXIgdy0xMDAgZnMtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ2XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ2IDQ2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0YyRjRGN1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIzXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIHN0cm9rZT1cIiNGOUZBRkJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80MDQ3XzQwNTY2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjYuMzMzMyAyNi4zMzM0TDIzIDIzTTIzIDIzTDE5LjY2NjYgMjYuMzMzNE0yMyAyM1YzMC41TTI5Ljk5MTYgMjguMzI1QzMwLjgwNDQgMjcuODgxOSAzMS40NDY1IDI3LjE4MDggMzEuODE2NSAyNi4zMzIyQzMyLjE4NjYgMjUuNDgzNyAzMi4yNjM1IDI0LjUzNjEgMzIuMDM1MSAyMy42Mzg5QzMxLjgwNjggMjIuNzQxOCAzMS4yODYyIDIxLjk0NjMgMzAuNTU1NSAyMS4zNzc5QzI5LjgyNDggMjAuODA5NSAyOC45MjU3IDIwLjUwMDYgMjggMjAuNUgyNi45NUMyNi42OTc3IDE5LjUyNDQgMjYuMjI3NiAxOC42MTg2IDI1LjU3NDkgMTcuODUwOUMyNC45MjIyIDE3LjA4MzEgMjQuMTA0IDE2LjQ3MzIgMjMuMTgxNyAxNi4wNjcyQzIyLjI1OTQgMTUuNjYxMiAyMS4yNTcxIDE1LjQ2OTUgMjAuMjUwMSAxNS41MDY2QzE5LjI0MyAxNS41NDM3IDE4LjI1NzUgMTUuODA4NiAxNy4zNjc2IDE2LjI4MTRDMTYuNDc3NyAxNi43NTQyIDE1LjcwNjYgMTcuNDIyNiAxNS4xMTIyIDE4LjIzNjNDMTQuNTE3NyAxOS4wNTAxIDE0LjExNTUgMTkuOTg4IDEzLjkzNTggMjAuOTc5NUMxMy43NTYgMjEuOTcxMSAxMy44MDM0IDIyLjk5MDUgMTQuMDc0MyAyMy45NjExQzE0LjM0NTIgMjQuOTMxNyAxNC44MzI3IDI1LjgyODIgMTUuNSAyNi41ODM0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDA0N180MDU2NlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzIDEzKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS10aXRsZVwiPjxzcGFuIGNsYXNzPVwiY2xpY2stdXBsb2FkIGN1cnNvci1wb2ludGVyXCI+Q2xpY2sgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJtcy0yXCI+b3IgZHJhZyBhbmQgZHJvcDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViXCI+dGhlIGRhdGEgYWRkZWQgdGVtcGxhdGUgZmlsZSBmb3IgcHJvY2Vzc2luZy48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG1iLTEwIHctMTAwIG10LTEwXCIgcm9sZT1cImNsdXN0ZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMCBteC0zXCIgKGNsaWNrKT1cImNsb3NlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG14LTNcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiPlN1Ym1pdDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2FmdGVyVmFsaWRhdGlvbiBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBtdC0wXCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBtdC0zXCI+PHNwYW4gY2xhc3M9XCJjb25maWctaGVhZGluZyBmdy1zZW1pYm9sZCB3LWF1dG9cIj5CdWxrIEFzc2lnbjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB0LTAgcG9wdXAtc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTcwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPlRvdGFsIFJlY29yZHM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY2FyZCByb3VuZGVkLTMgcC0zIGZsZXgtY29sdW1uIGgtNzBweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmcgdy0xMDBcIj57e2V4Y2VsRGF0YT8ubGVuZ3RofX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIHN1YnRpdGxlIG10LTFcIj5Sb3dzIHByb2Nlc3NlZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTcwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yID8gJ2Vycm9yLWhlYWRpbmcnOicnXCIgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7ZXhjZWxFcnJvcj8uZXJyb3I/Lmxlbmd0aCB8fCAwfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJleGNlbEVycm9yID8gJ2V4Y2VsLWVycm9yJzonJ1wiIGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPkVycm9yPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWV4Y2VsRXJyb3JcIiBjbGFzcz1cInRhYmxlLWhlYWRlciBtdC01XCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiA+WW91J3JlIGFib3V0IHRvIGFzc2lnbiB7e2dldFN0b3JlQ291bnRzKGV4Y2VsRGF0YSl9fSB7e2dldFN0b3JlQ291bnRzKGV4Y2VsRGF0YSkgPiAxID8gJ1N0b3JlcycgOiAnU3RvcmUnfX0uIEFyZSB5b3Ugc3VyZSB3YW50IHRvIHByb2NlZWQ/PC9kaXY+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImV4Y2VsRXJyb3JcIiBjbGFzcz1cImZsZXgtY29sdW1uIG10LTVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctaGVhZGluZyBmdy1ib2xkXCI+SW52YWxpZCBEZXRhaWxzICE8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZSBtdC01XCI+UGxlYXNlIHByb3ZpZGUgY29ycmVjdCBpbmZvcm1hdGlvbi48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTUgdy0xMDAgcm91bmRlZC0zIGJvcmRlci1lcnJvciBtdC01IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgZXhjZWxFcnJvcj8uZXJyb3I7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIFtuZ0NsYXNzXT1cIiFsYXN0ID8gJ21iLTInIDogJydcIiBjbGFzcz1cInRleHQtZXJyb3JcIj57e2kgKyAxfX0pIHt7ZXJyb3J9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmQgZmxleC13cmFwIGdhcC0yIHB0LTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbWQgYnRuLWRlZmF1bHQgYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VhY3RpdmVwb3B1cCgpO21vZGVsLmNsb3NlKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFleGNlbEVycm9yXCIgY2xhc3M9XCJidG4gYnRuLW1kIHB5LTMgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJwcm9jZWVkU3VibWl0KCk7bW9kZWwuY2xvc2UoKVwiPlByb2NlZWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImV4Y2VsRXJyb3JcIiBjbGFzcz1cImJ0biBweS0zIGJ0bi1tZCBidG4tZGVmYXVsdCBtcy0zIGJ0bi1kYW5nZXJcIiAoY2xpY2spPVwiZmlsZTEuY2xpY2soKTtcIj5SZXVwbG9hZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lOztcIiAjZmlsZTEgdHlwZT1cImZpbGVcIiBpZD1cImt0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF8yXCIgYWNjZXB0ID0gXCIuY3N2LCBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCwgYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVXBsb2FkKCRldmVudClcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
|
|
550
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLXN0b3JlLXBvcHVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS11c2Vycy9zcmMvbGliL2NvbXBvbmVudHMvdGFuZ28tbWFuYWdlLXVzZXJzL2Fzc2lnbi1zdG9yZS1wb3B1cC9hc3NpZ24tc3RvcmUtcG9wdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXVzZXJzL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1tYW5hZ2UtdXNlcnMvYXNzaWduLXN0b3JlLXBvcHVwL2Fzc2lnbi1zdG9yZS1wb3B1cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFDRyxTQUFTLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBWSxJQUFJLEVBQUUsS0FBSyxFQUFhLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBV3hELE1BQU0sT0FBTyx5QkFBeUI7SUFtQjFCO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUF0QkQsSUFBSSxDQUFNO0lBQ25CLE1BQU0sR0FBVyxRQUFRLENBQUM7SUFDMUIsTUFBTSxHQUFVLEVBQUUsQ0FBQztJQUNuQixRQUFRLEdBQVUsRUFBRSxDQUFDO0lBQ3JCLEtBQUssR0FBTyxFQUFFLENBQUM7SUFDZixjQUFjLENBQU07SUFDcEIsUUFBUSxDQUFjO0lBQ3RCLFFBQVEsQ0FBTTtJQUNkLFFBQVEsQ0FBUztJQUNqQixrQkFBa0IsQ0FBSTtJQUN0QixvQkFBb0IsQ0FBSTtJQUN4QixpQkFBaUIsQ0FBSztJQUNFLFNBQVMsQ0FBYTtJQUNoQixlQUFlLENBQU07SUFFbkQsV0FBVyxDQUFNO0lBRWpCLFlBQ1UsV0FBd0IsRUFDeEIsRUFBcUIsRUFDckIsRUFBZ0IsRUFDakIsV0FBMkIsRUFDMUIsWUFB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QUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sb0JBQW9CLENBQUM7SUFDeEYsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDO3dHQXRrQlUseUJBQXlCOzRGQUF6Qix5QkFBeUIsbVdDckJ0Qyxtc29CQXVTYzs7NEZEbFJELHlCQUF5QjtrQkFUckMsU0FBUzsrQkFDRSx3QkFBd0IsUUFJNUI7d0JBQ0osa0JBQWtCLEVBQUUsaUJBQWlCO3FCQUN0QzsrTEFHUSxJQUFJO3NCQUFaLEtBQUs7Z0JBWWtCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDUSxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsIFZpZXdDaGlsZCxFbGVtZW50UmVmXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsLCBOZ2JNb2RhbCwgTmdiTW9kYWxSZWYgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHsgV29ya0Jvb2ssIHJlYWQsIHV0aWxzLCBXb3JrU2hlZXQgfSBmcm9tIFwieGxzeFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibGliLWFzc2lnbi1zdG9yZS1wb3B1cFwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vYXNzaWduLXN0b3JlLXBvcHVwLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9hc3NpZ24tc3RvcmUtcG9wdXAuY29tcG9uZW50LnNjc3NcIixcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWhvc3QtbWV0YWRhdGEtcHJvcGVydHlcclxuICBob3N0OiB7XHJcbiAgICAnKGRvY3VtZW50OmNsaWNrKSc6ICdvbkNsaWNrKCRldmVudCknLFxyXG4gIH0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3NpZ25TdG9yZVBvcHVwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSB1c2VyOiBhbnk7XHJcbiAgc2VsZWN0OiBzdHJpbmcgPSBcInN0b3Jlc1wiO1xyXG4gIHN0b3JlczogYW55W10gPSBbXTtcclxuICBjbHVzdGVyczogYW55W10gPSBbXTtcclxuICB0ZWFtczphbnlbXT1bXTtcclxuICAkaGVhZGVyRmlsdGVyczogYW55O1xyXG4gIG1vZGFsUmVmOiBOZ2JNb2RhbFJlZjtcclxuICB1c2VyRGF0YTogYW55O1xyXG4gIHVzZXJUeXBlOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRUZXh0c3RvcmVzOmFueVxyXG4gIHNlbGVjdGVkVGV4dGNsdXN0ZXJzOmFueVxyXG4gIHNlbGVjdGVkVGV4dHRlYW1zOiBhbnlcclxuICBAVmlld0NoaWxkKFwiaW5wdXRGaWxlXCIpIGlucHV0RmlsZTogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdhZnRlclZhbGlkYXRpb24nKSBhZnRlclZhbGlkYXRpb246IGFueTtcclxuXHJcbiAgdXBsb2FkUG9wVXA6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSB0czogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxyXG4gICkge1xyXG4gICAgdGhpcy51c2VyU2VydmljZS5kYXRhU3ViamVjdC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy51c2VyRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy51c2VyVHlwZSA9IGRhdGEgPT0gXCJUYW5nbyBVc2VyXCIgPyBcInRhbmdvXCIgOiBcImNsaWVudFwiO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICBsZXQgZGF0YTogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwiXCIpO1xyXG4gICAgaWYgKGRhdGEpIHtcclxuICAgICAgdGhpcy4kaGVhZGVyRmlsdGVycyA9IGRhdGE7XHJcbiAgICB9IGVsc2UgaWYoIWRhdGEpe1xyXG4gICAgICBsZXQgdXNlcjogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJycpO1xyXG4gICAgICB0aGlzLiRoZWFkZXJGaWx0ZXJzID0gdXNlcjtcclxuICAgICAgdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQgPSB1c2VyLmNsaWVudElkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmdldEFzc2lnblN0b3JlTGlzdCgpO1xyXG4gICAgdGhpcy5nZXRjbHVzdGVyTGlzdCgpO1xyXG4gICAgdGhpcy5nZXR0ZWFtc0xpc3QoKSAgICBcclxuICB9XHJcblxyXG4gIGxvYWRVc2VyQXNzaWduRGV0YWlscygpIHtcclxuICAgIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgLmdldFVzZXJBc3NpZ25EYXRhKHtcclxuICAgICAgICBlbWFpbDogdGhpcy51c2VyLmVtYWlsLCAgICAgIFxyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFNlbGVjdGVkU3RvcmVzKHJlcy5kYXRhLnN0b3Jlcyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFNlbGVjdGVkY2x1c3RlcnMocmVzLmRhdGEuY2x1c3RlcnMpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTZWxlY3RlZHRlYW1zKHJlcy5kYXRhLnRlYW1zKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgfSBcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7ICAgICAgICBcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXNzaWduU3RvcmVMaXN0KCkge1xyXG4gICAgdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAuZ2V0QXNzaWduU3RvcmVzKHsgY2xpZW50SWQ6IHRoaXMuJGhlYWRlckZpbHRlcnMuY2xpZW50IH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhT2JqZWN0WzBdLlN0b3JlcyA9IHJlcy5kYXRhLnJlc3VsdDtcclxuICAgICAgICAgICAgdGhpcy5sb2FkVXNlckFzc2lnbkRldGFpbHMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFPYmplY3RbMF0uU3RvcmVzID0gW107XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge30sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Y2x1c3Rlckxpc3QoKSB7XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgIC5nZXRBc3NpZ25jbHVzdGVycyh7IGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YU9iamVjdFsxXS5jbHVzdGVycyA9IHJlcy5kYXRhLnJlc3VsdDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhT2JqZWN0WzFdLmNsdXN0ZXJzID0gW107XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge30sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBnZXR0ZWFtc0xpc3QoKSB7XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgIC5nZXRBc3NpZ250ZWFtcyh7IGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCwgdXNlckVtYWlsOnRoaXMudXNlcj8uZW1haWwgfSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFPYmplY3RbMl0udGVhbXMgPSByZXMuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBpZiAodGhpcy51c2VyLmFzc2lnbmVkVmFsdWUpIHtcclxuICAgICAgICAgICAgLy8gICB0aGlzLmxvYWRTZWxlY3RlZHRlYW1zKHRoaXMudXNlci5hc3NpZ25lZFZhbHVlKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YU9iamVjdFsyXS5jbHVzdGVycyA9IFtdO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHt9LFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0b3Jlc1R5cGUoZTogYW55KSB7XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gICAgLy8gdGhpcy5yZXNldGNsdXN0ZXJzKCk7XHJcbiAgICAvLyB0aGlzLnJlc2V0U3RvcmUoKTtcclxuICAgIGlmICh0aGlzLnNlbGVjdCA9PSBcInN0b3Jlc1wiKSB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5sZW5ndGg9PTApe1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0c3RvcmVzID0gXCJTZWxlY3QgU3RvcmVzXCI7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0c3RvcmVzID0gYCR7dGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzBdLmxlbmd0aH0gU3RvcmVzIFNlbGVjdGVkYDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmKHRoaXMuc2VsZWN0ID09J2NsdXN0ZXJzJykge1xyXG4gICAgICBpZih0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMV0ubGVuZ3RoPT0wKXtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dGNsdXN0ZXJzID0gXCJTZWxlY3QgQ2x1c3RlcnNcIjtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRleHRjbHVzdGVycyA9IGAke3RoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXS5sZW5ndGh9IENsdXN0ZXJzIFNlbGVjdGVkYDtcclxuICAgICAgfSAgICAgIFxyXG4gICAgfWVsc2UgaWYodGhpcy5zZWxlY3QgPT0ndGVhbXMnKSB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXS5sZW5ndGg9PTApe1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0dGVhbXMgPSBcIlNlbGVjdCBUZWFtc1wiO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dHRlYW1zID0gYCR7dGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdLmxlbmd0aH0gVGVhbXMgU2VsZWN0ZWRgO1xyXG4gICAgICB9ICAgICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldFN0b3JlKCkge1xyXG4gICAgdGhpcy5kYXRhT2JqZWN0WzBdLlN0b3JlcyA9IFtdO1xyXG4gICAgdGhpcy5zdG9yZXMgPSBbXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRjbHVzdGVycygpIHtcclxuICAgIHRoaXMuZGF0YU9iamVjdFsxXS5jbHVzdGVycyA9IFtdO1xyXG4gICAgdGhpcy5jbHVzdGVycyA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdID0gW107XHJcbiAgfVxyXG4gIHJlc2V0VGVhbXMoKSB7XHJcbiAgICB0aGlzLmRhdGFPYmplY3RbMl0udGVhbXMgPSBbXTtcclxuICAgIHRoaXMudGVhbXMgPSBbXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXSA9IFtdO1xyXG4gIH1cclxuICBPcGVuZHJvcGRvd246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkYXRhT2JqZWN0OiBhbnlbXSA9IFtcclxuICAgIHsgRGVzY3JpcHRpb246IFwiU3RvcmVzXCIsIFN0b3JlczogW10gfSxcclxuICAgIHsgRGVzY3JpcHRpb246IFwiQ2x1c3RlcnNcIiwgY2x1c3RlcnM6IFtdIH0sXHJcbiAgICB7IERlc2NyaXB0aW9uOiBcIlRlYW1zXCIsIHRlYW1zOiBbXSB9LFxyXG5cclxuICBdO1xyXG4gIHNlbGVjdGVkVmFsdWVzQXJyYXk6IGFueVtdID0gW1tdLCBbXSxbXV07XHJcbiAgc2VsZWN0ZWRUZXh0OiBzdHJpbmc7XHJcblxyXG4gIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0LmNsb3Nlc3QoXCIuZHJvcGRvd24xXCIpKSB7XHJcbiAgICAgIHRoaXMuT3BlbmRyb3Bkb3duID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRhcmdldC5jbG9zZXN0KFwiLmRyb3Bkb3duLWNvbnRlbnRcIikpIHtcclxuICAgICAgdGhpcy5kYXRhT2JqZWN0LmZvckVhY2goKGl0ZW06IGFueSwgaTogYW55KSA9PiB7XHJcbiAgICAgICAgaXRlbS5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBEcm9wZG93bih2YWx1ZTogYW55LCBpbmRleDogbnVtYmVyLCBldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmRhdGFPYmplY3QuZm9yRWFjaCgoaXRlbTogYW55LCBpOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGkgIT09IGluZGV4KSB7XHJcbiAgICAgICAgaXRlbS5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRhdGFPYmplY3RbaW5kZXhdLmlzT3BlbiA9ICF0aGlzLmRhdGFPYmplY3RbaW5kZXhdLmlzT3BlbjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNoZWNrYm94U3RvcmVzKFxyXG4gICAgZXZlbnQ6IGFueSxcclxuICAgIHN0b3JlOiBhbnksXHJcbiAgICBpbmRleDogbnVtYmVyLFxyXG4gICAgc3ViSW5kZXg6IG51bWJlclxyXG4gICkge1xyXG4gICAgY29uc3Qgc3RvcmVzID0gdGhpcy5kYXRhT2JqZWN0WzBdLlN0b3JlcztcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSB8fCBbXTtcclxuXHJcbiAgICBpZiAoc3RvcmUgPT09IFwiU2VsZWN0IEFsbFwiKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgICAgc3RvcmVzLmZvckVhY2goKGl0ZW06IGFueSkgPT4gKGl0ZW0uY2hlY2tlZCA9IGNoZWNrZWQpKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzBdID0gY2hlY2tlZCA/IFsuLi5zdG9yZXNdIDogW107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgICAgY29uc3Qgc3RvcmVJbmRleCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5maW5kSW5kZXgoXHJcbiAgICAgICAgKGl0ZW06IGFueSkgPT4gaXRlbS5zdG9yZU5hbWUgPT09IHN0b3JlLnN0b3JlTmFtZVxyXG4gICAgICApO1xyXG4gICAgICBpc0NoZWNrZWRcclxuICAgICAgICA/IHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5wdXNoKHN0b3JlKVxyXG4gICAgICAgIDogdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzBdLnNwbGljZShzdG9yZUluZGV4LCAxKTtcclxuICAgICAgdGhpcy5kYXRhT2JqZWN0W2luZGV4XS5TdG9yZXNbc3ViSW5kZXhdLmNoZWNrZWQgPSBpc0NoZWNrZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0QWxsQ2hlY2tlZCA9IHN0b3Jlcy5ldmVyeSgoaXRlbTogYW55KSA9PiBpdGVtLmNoZWNrZWQpO1xyXG4gICAgKFxyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2VsZWN0YWxsJHtpbmRleH1gKSBhcyBIVE1MSW5wdXRFbGVtZW50XHJcbiAgICApPy5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIFN0cmluZyhzZWxlY3RBbGxDaGVja2VkKSk7XHJcbiAgICAoXHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBvcHRpb24ke3N0b3JlLnN0b3JlTmFtZX1gKSBhcyBIVE1MSW5wdXRFbGVtZW50XHJcbiAgICApPy5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIFN0cmluZyhldmVudC50YXJnZXQuY2hlY2tlZCkpO1xyXG5cclxuICAgIHRoaXMubG9hZFRhYmxlKHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGV4dHN0b3JlcyA9IGAke3RoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5sZW5ndGh9IFN0b3JlcyBTZWxlY3RlZGA7XHJcbiAgfVxyXG4gIHRvZ2dsZUNoZWNrYm94VGVhbXMoXHJcbiAgICBldmVudDogYW55LFxyXG4gICAgdGVhbTogYW55LFxyXG4gICAgaW5kZXg6IG51bWJlcixcclxuICAgIHN1YkluZGV4OiBudW1iZXJcclxuICApIHtcclxuICAgIFxyXG4gICAgY29uc3QgdGVhbXMgPSB0aGlzLmRhdGFPYmplY3RbMl0udGVhbXM7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0gPSB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0gfHwgW107XHJcblxyXG4gICAgaWYgKHRlYW0gPT09IFwiU2VsZWN0IEFsbFwiKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgICAgdGVhbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiAoaXRlbS5jaGVja2VkID0gY2hlY2tlZCkpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0gPSBjaGVja2VkID8gWy4uLnRlYW1zXSA6IFtdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICAgIGNvbnN0IHN0b3JlSW5kZXggPSB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0uZmluZEluZGV4KFxyXG4gICAgICAgIChpdGVtOiBhbnkpID0+IGl0ZW0udXNlck5hbWUgPT09IHRlYW0udXNlck5hbWVcclxuICAgICAgKTtcclxuICAgICAgaXNDaGVja2VkXHJcbiAgICAgICAgPyB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0ucHVzaCh0ZWFtKVxyXG4gICAgICAgIDogdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdLnNwbGljZShzdG9yZUluZGV4LCAxKTtcclxuICAgICAgdGhpcy5kYXRhT2JqZWN0W2luZGV4XS50ZWFtc1tzdWJJbmRleF0uY2hlY2tlZCA9IGlzQ2hlY2tlZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWxlY3RBbGxDaGVja2VkID0gdGVhbXMuZXZlcnkoKGl0ZW06IGFueSkgPT4gaXRlbS5jaGVja2VkKTtcclxuICAgIChcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNlbGVjdGFsbCR7aW5kZXh9YCkgYXMgSFRNTElucHV0RWxlbWVudFxyXG4gICAgKT8uc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCBTdHJpbmcoc2VsZWN0QWxsQ2hlY2tlZCkpO1xyXG4gICAgKFxyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgb3B0aW9uJHt0ZWFtcy5zdG9yZU5hbWV9YCkgYXMgSFRNTElucHV0RWxlbWVudFxyXG4gICAgKT8uc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCBTdHJpbmcoZXZlbnQudGFyZ2V0LmNoZWNrZWQpKTtcclxuXHJcbiAgICB0aGlzLmxvYWRUYWJsZSh0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0pO1xyXG4gICAgdGhpcy5zZWxlY3RlZFRleHR0ZWFtcyA9IGAke3RoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXS5sZW5ndGh9IFRlYW1zIFNlbGVjdGVkYDtcclxuICB9XHJcblxyXG4gIGxvYWRUYWJsZSh2YWx1ZXM6IGFueVtdKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3QgPT0gXCJzdG9yZXNcIikge1xyXG4gICAgICB0aGlzLnN0b3JlcyA9IHZhbHVlcztcclxuICAgIH0gZWxzZSBpZih0aGlzLnNlbGVjdCA9PSBcImNsdXN0ZXJzXCIpIHtcclxuICAgICAgdGhpcy5jbHVzdGVycyA9IHZhbHVlcztcclxuICAgIH1lbHNlIGlmKHRoaXMuc2VsZWN0ID09IFwidGVhbXNcIikge1xyXG4gICAgICB0aGlzLnRlYW1zID0gdmFsdWVzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvbnN0b3JlU2VsZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSAgPSBldmVudFxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIG9uZ3JvdXBTZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdICA9IGV2ZW50XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9ICBcclxuICBvblRlYW1zU2VsZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXSAgPSBldmVudFxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIFxyXG5cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIGlmICh0aGlzLnVzZXIuYXNzaWduZWRWYWx1ZSAmJiB0aGlzLnVzZXIuYXNzaWduZWRWYWx1ZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5yZUFzc2lnblN1Ym1pdCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hc3NpZ25TdWJtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICBleGNlbEVycm9yOiBhbnk7XHJcbiAgZXhjZWxEYXRhOiBhbnkgPSBbXVxyXG4gIHZhbGlkYXRlZE91dHB1dDogYW55ID0gW107XHJcblxyXG4gIGdldFN0b3JlQ291bnRzKGRhdGE6IGFueSkge1xyXG5cclxuICAgIGNvbnN0IHVuaXF1ZVVzZXJOYW1lcyA9IG5ldyBTZXQoZGF0YT8ubWFwKChpdGVtOiBhbnkpID0+IGl0ZW1bJ1N0b3JlIE5hbWUvU3RvcmUgSWQnXSkpO1xyXG4gICAgcmV0dXJuIHVuaXF1ZVVzZXJOYW1lcy5zaXplO1xyXG5cclxuICB9XHJcblxyXG4gIGZpbGVFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGFwaURhdGE6IGFueSA9IFtdO1xyXG5cclxuICBvblVwbG9hZChlOmFueSkge1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IFtdO1xyXG4gICAgbGV0IGVycm9yOiBhbnkgPSBbXTtcclxuICAgIGxldCBzaGVldE5hbWU6IGFueSA9ICcnO1xyXG5cclxuICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcclxuICBjb25zdCBhbGxvd2VkRXh0ZW5zaW9ucyA9IC9cXC4oeGxzfHhsc3h8Y3N2KSQvaTtcclxuICBjb25zdCBhbGxvd2VkVHlwZXMgPSBbXHJcbiAgICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0XCIsIFxyXG4gICAgXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgIFwidGV4dC9jc3ZcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgIFwiYXBwbGljYXRpb24vY3N2XCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgXTtcclxuXHJcbiAgaWYgKCFhbGxvd2VkRXh0ZW5zaW9ucy50ZXN0KGZpbGUubmFtZSkgfHwgIWFsbG93ZWRUeXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XHJcbiAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJPbmx5IC54bHN4LCBvciAuY3N2IGZpbGVzIGFyZSBhbGxvd2VkLlwiKTtcclxuICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgICBjb25zdCB0YXJnZXQ6IERhdGFUcmFuc2ZlciA9IDxEYXRhVHJhbnNmZXI+ZS50YXJnZXQ7XHJcbiAgICBpZiAodGFyZ2V0LmZpbGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAoISF0YXJnZXQuZmlsZXNbMF0ubmFtZS5tYXRjaCgvKC54bHN8Lnhsc3gpLykpIHtcclxuICAgICAgY29uc3QgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBic3RyOiBzdHJpbmcgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3Qgd2I6IFdvcmtCb29rID0gcmVhZChic3RyLCB7IHR5cGU6IFwiYmluYXJ5XCIgfSk7XHJcbiAgICAgICAgY29uc3Qgd3NuYW1lOiBzdHJpbmcgPSB3Yi5TaGVldE5hbWVzWzBdO1xyXG4gICAgICAgIGNvbnN0IHdzOiBXb3JrU2hlZXQgPSB3Yi5TaGVldHNbd3NuYW1lXTtcclxuXHJcbiAgICAgICAgZGF0YSA9IHV0aWxzLnNoZWV0X3RvX2pzb24od3MsIHtkZWZ2YWw6IFwiXCIscmF3OnRydWV9KTtcclxuICAgICAgICB0aGlzLmV4Y2VsRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgc2hlZXROYW1lID0gd2IuU2hlZXROYW1lc1swXTtcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodGFyZ2V0LmZpbGVzWzBdKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGFzeW5jIChlKSA9PiB7XHJcbiAgICAgICAgbGV0IHByb2Nlc3NlZEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChzaGVldE5hbWUgIT0gXCJTdG9yZURhdGFcIikge1xyXG4gICAgICAgICAgdGhpcy5maWxlRXJyb3IgPSAgdHJ1ZVxyXG4gICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChcIkNhbiB5b3UgY29uZmlybSB3aGV0aGVyIHRoZSBzaGVldCBuYW1lIGlzIFN0b3JlRGF0YSA/XCIpO1xyXG4gICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWRhdGE/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJQbGVhc2UgdXBsb2FkIGEgdmFsaWQgZmlsZVwiKTtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZXF1aXJlZEtleXMgPSBbJ1N0b3JlIE5hbWUvU3RvcmUgSWQnXSAvLyBNdXN0IGFsd2F5cyBiZSBwcmVzZW50XHJcbiAgICAgICAgLy8gY29uc3Qgb3B0aW9uYWxLZXlzID0gWyd1c2VyUGhvbmUnLCAnY2l0eSddIDogWydjaXR5J107XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgaXNWYWxpZCA9IGRhdGEuc29tZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSk7XHJcbiAgICAgICAgICBjb25zdCBoYXNSZXF1aXJlZEtleXMgPSByZXF1aXJlZEtleXMuZXZlcnkoa2V5ID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XHJcbiAgICAgICAgICBjb25zdCBhbGxLZXlzQXJlQWxsb3dlZCA9IGtleXMuZXZlcnkoa2V5ID0+IFxyXG4gICAgICAgICAgICByZXF1aXJlZEtleXMuaW5jbHVkZXMoa2V5KVxyXG4gICAgICAgICAgICAvLyB8fCBvcHRpb25hbEtleXMuaW5jbHVkZXMoa2V5KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJldHVybiBoYXNSZXF1aXJlZEtleXMgJiYgYWxsS2V5c0FyZUFsbG93ZWQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICghaXNWYWxpZCkge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdQbGVhc2UgdXBsb2FkIGEgdmFsaWQgZmlsZS4nKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGE/LmZvckVhY2goKGVsZW1lbnQ6IGFueSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCAhZWxlbWVudD8uWydTdG9yZSBOYW1lL1N0b3JlIElkJ10gfHwgZWxlbWVudD8uWydTdG9yZSBOYW1lL1N0b3JlIElkJ10gPT0gJycgfHwgZWxlbWVudD8uWydTdG9yZSBOYW1lL1N0b3JlIElkJ10gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIFN0b3JlIE5hbWUvU3RvcmUgSWQgLSBBJHtpbmRleCArIDJ9YClcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHByb2Nlc3NlZEFycmF5LnB1c2goe1xyXG4gICAgICAgICAgICAgIHZhbHVlOiBkYXRhW2luZGV4XVsnU3RvcmUgTmFtZS9TdG9yZSBJZCddXHJcbiAgICAgICAgICAgIH0pIFxyXG4gICAgICAgICAgfSBcclxuICAgICAgICB9KVxyXG4gICAgICAgIGlmIChlcnJvci5sZW5ndGgpIHtcclxuICAgICAgICAgIGNvbnN0IHBvcHVwY29udGVudCA9IHtcclxuICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgICAgICBpbWFnZXNyYzogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNGRUYwQzdcIi8+PHBhdGggZD1cIk0yNy45OTk4IDI0LjAwMTJWMjguMDAxMk0yNy45OTk4IDMyLjAwMTJIMjguMDA5OE0yNi4yODk4IDE4Ljg2MTJMMTcuODE5OCAzMy4wMDEyQzE3LjY0NTEgMzMuMzAzNiAxNy41NTI3IDMzLjY0NjUgMTcuNTUxOCAzMy45OTU3QzE3LjU1MDggMzQuMzQ0OSAxNy42NDEzIDM0LjY4ODMgMTcuODE0MiAzNC45OTE3QzE3Ljk4NzEgMzUuMjk1MSAxOC4yMzY1IDM1LjU0NzkgMTguNTM3NSAzNS43MjVDMTguODM4NSAzNS45MDIxIDE5LjE4MDYgMzUuOTk3MyAxOS41Mjk4IDM2LjAwMTJIMzYuNDY5OEMzNi44MTkgMzUuOTk3MyAzNy4xNjExIDM1LjkwMjEgMzcuNDYyMSAzNS43MjVDMzcuNzYzMSAzNS41NDc5IDM4LjAxMjQgMzUuMjk1MSAzOC4xODU0IDM0Ljk5MTdDMzguMzU4MyAzNC42ODgzIDM4LjQ0ODggMzQuMzQ0OSAzOC40NDc4IDMzLjk5NTdDMzguNDQ2OCAzMy42NDY1IDM4LjM1NDQgMzMuMzAzNiAzOC4xNzk4IDMzLjAwMTJMMjkuNzA5OCAxOC44NjEyQzI5LjUzMTUgMTguNTY3MyAyOS4yODA1IDE4LjMyNDMgMjguOTgxIDE4LjE1NTdDMjguNjgxNCAxNy45ODcgMjguMzQzNSAxNy44OTg0IDI3Ljk5OTggMTcuODk4NEMyNy42NTYgMTcuODk4NCAyNy4zMTgxIDE3Ljk4NyAyNy4wMTg2IDE4LjE1NTdDMjYuNzE5MSAxOC4zMjQzIDI2LjQ2OCAxOC41NjczIDI2LjI4OTggMTguODYxMlpcIiBzdHJva2U9XCIjREM2ODAzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNGRkZBRUJcIiBzdHJva2Utd2lkdGg9XCI4XCIvPjwvc3ZnPmAsXHJcbiAgICAgICAgICAgIHRpdGxlOiBgSW52YWxpZCBkZXRhaWxzIWAsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBzdG9yZSBpbmZvcm1hdGlvbi5gLFxyXG4gICAgICAgICAgICBidXR0b250eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMuZmlsZUVycm9yKXtcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIHByb2Nlc3NlZEFycmF5ID0gcHJvY2Vzc2VkQXJyYXkubWFwKChlbDogYW55KSA9PiB7IHJldHVybiB7IHN0b3JlOiBlbD8udmFsdWUgfSB9KTtcclxuICAgICAgICBcclxuICAgICAgICAgdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAgICAgICAgIC5idWxrc3RvcmVBc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgdXNlckVtYWlsOnRoaXMudXNlci5lbWFpbCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZEFycmF5XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4geyBcclxuICAgICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwaURhdGEgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzBdID0gcmVzPy5kYXRhPy5yZXN1bHQubWFwKChlbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVzID0gdGhpcy5kYXRhT2JqZWN0Py5bMF0/LlN0b3JlcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHN0b3Jlcz8uZmluZCgodmFsOiBhbnkpID0+IHZhbC5faWQgPT09IGVsPy5faWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcigoaXRlbTphbnkpID0+IGl0ZW0gIT09IG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFmdGVyVXBsbG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJUaGUgZ2l2ZW4gU3RvcmUgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJyYW5kXCIpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yLmNvZGUgPT0gNDAwKSB7IC8vIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5cHJvcDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZXNyYzogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNGRUYwQzdcIi8+PHBhdGggZD1cIk0yNy45OTk4IDI0LjAwMTJWMjguMDAxMk0yNy45OTk4IDMyLjAwMTJIMjguMDA5OE0yNi4yODk4IDE4Ljg2MTJMMTcuODE5OCAzMy4wMDEyQzE3LjY0NTEgMzMuMzAzNiAxNy41NTI3IDMzLjY0NjUgMTcuNTUxOCAzMy45OTU3QzE3LjU1MDggMzQuMzQ0OSAxNy42NDEzIDM0LjY4ODMgMTcuODE0MiAzNC45OTE3QzE3Ljk4NzEgMzUuMjk1MSAxOC4yMzY1IDM1LjU0NzkgMTguNTM3NSAzNS43MjVDMTguODM4NSAzNS45MDIxIDE5LjE4MDYgMzUuOTk3MyAxOS41Mjk4IDM2LjAwMTJIMzYuNDY5OEMzNi44MTkgMzUuOTk3MyAzNy4xNjExIDM1LjkwMjEgMzcuNDYyMSAzNS43MjVDMzcuNzYzMSAzNS41NDc5IDM4LjAxMjQgMzUuMjk1MSAzOC4xODU0IDM0Ljk5MTdDMzguMzU4MyAzNC42ODgzIDM4LjQ0ODggMzQuMzQ0OSAzOC40NDc4IDMzLjk5NTdDMzguNDQ2OCAzMy42NDY1IDM4LjM1NDQgMzMuMzAzNiAzOC4xNzk4IDMzLjAwMTJMMjkuNzA5OCAxOC44NjEyQzI5LjUzMTUgMTguNTY3MyAyOS4yODA1IDE4LjMyNDMgMjguOTgxIDE4LjE1NTdDMjguNjgxNCAxNy45ODcgMjguMzQzNSAxNy44OTg0IDI3Ljk5OTggMTcuODk4NEMyNy42NTYgMTcuODk4NCAyNy4zMTgxIDE3Ljk4NyAyNy4wMTg2IDE4LjE1NTdDMjYuNzE5MSAxOC4zMjQzIDI2LjQ2OCAxOC41NjczIDI2LjI4OTggMTguODYxMlpcIiBzdHJva2U9XCIjREM2ODAzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNGRkZBRUJcIiBzdHJva2Utd2lkdGg9XCI4XCIvPjwvc3ZnPmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogYEludmFsaWQgZGV0YWlscyFgLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudDogYFBsZWFzZSBwcm92aWRlIGNvcnJlY3QgYW5kIGNvbXBsZXRlIHN0b3JlIGluZm9ybWF0aW9uLmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICBidXR0b250eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVyci5lcnJvci5lcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFmdGVyVXBsbG9hZChwb3B1cGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGVyci5lcnJvci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcbiAgICAgIC8vICQoXCIja3RfY3JlYXRlX2FjY291bnRfZm9ybV9hY2NvdW50X3R5cGVfcGVyc29uYWxcIikudmFsKFwiXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvY2VlZFN1Ym1pdCgpIHtcclxuICAgIHRoaXMubG9hZFRhYmxlKHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGV4dHN0b3JlcyA9IGAke3RoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5sZW5ndGh9IFN0b3JlcyBTZWxlY3RlZGA7XHJcbiAgfVxyXG5cclxuICAgY2xvc2VhY3RpdmVwb3B1cCgpIHtcclxuICAgIC8vIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICB9XHJcblxyXG4gIGFmdGVyVXBsbG9hZChkYXRhPzogYW55KSB7XHJcbiAgICB0aGlzLmV4Y2VsRXJyb3IgPSBkYXRhO1xyXG4gICAgaWYgKHRoaXMudXBsb2FkUG9wVXApIHtcclxuICAgICAgdGhpcy51cGxvYWRQb3BVcC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwbG9hZFBvcFVwID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmFmdGVyVmFsaWRhdGlvbiwgeyBjZW50ZXJlZDogdHJ1ZSwgYmFja2Ryb3A6ICdzdGF0aWMnLCBzaXplOiAnbGcnLCB3aW5kb3dDbGFzczogJ2N1c3RvbS1tb2RhbC13aWR0aCcgfSlcclxuICB9XHJcblxyXG4gIGFzc2lnblN1Ym1pdCgpIHtcclxuICAgIFxyXG4gICAgdGhpcy5hcGlEYXRhID0gdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzBdLm1hcCgoZWw6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIF9pZDogZWw/Ll9pZCxcclxuICAgICAgICBzdG9yZU5hbWU6ZWw/LnN0b3JlTmFtZSxcclxuICAgICAgICBzdG9yZUlkOmVsPy5zdG9yZUlkXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgbGV0IHBheWxvYWQgPSB7XHJcbiAgICAgIGRhdGE6IFt7XHJcbiAgICAgICAgdXNlckVtYWlsOiB0aGlzLnVzZXIuZW1haWwsXHJcbiAgICAgICAgc3RvcmVzOiB0aGlzLmFwaURhdGEsXHJcbiAgICAgICAgY2x1c3RlcnM6dGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdLFxyXG4gICAgICAgIHRlYW1zOnRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXSBcclxuICAgICAgfV1cclxuICAgICAgLy8gdXNlcklkOnRoaXMudXNlci5faWQsXHJcbiAgICAgIC8vIGNsaWVudElkOiB0aGlzLiRoZWFkZXJGaWx0ZXJzLmNsaWVudCxcclxuICAgICAgLy8gdXNlclR5cGU6IHRoaXMudXNlclR5cGUsXHJcbiAgICB9ICBcclxuICAgIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgLmFzc2lnbkRhdGEocGF5bG9hZClcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChgU3RvcmVzIEFzc2lnbmVkIHRvIFVzZXIgU3VjY2Vzc2Z1bGx5IWApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KGBVbmFibGUgdG8gYXNzaWduIFN0b3JlcyB0byBVc2VyIWApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoXCJVbmFibGUgdG8gQXNzaWduIFN0b3JlcyB0byBVc2VyIVwiKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7fSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICByZUFzc2lnblN1Ym1pdCgpIHtcclxuICAgIGxldCBwYXlsb2FkPSB7XHJcbiAgICAgIHVzZXJJZDp0aGlzLnVzZXIuX2lkLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy4kaGVhZGVyRmlsdGVycy5jbGllbnQsXHJcbiAgICAgIHVzZXJFbWFpbDogdGhpcy51c2VyLmVtYWlsLFxyXG4gICAgICB1c2VyVHlwZTogdGhpcy51c2VyVHlwZSxcclxuICAgICAgc3RvcmVzOnRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSxcclxuICAgICAgY2x1c3RlcnM6dGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdLFxyXG4gICAgICB0ZWFtczp0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl1cclxuICAgIH1cclxuICAgIHRoaXMudXNlclNlcnZpY2VcclxuICAgICAgLnJlQXNzaWduU3RvcmVzKHBheWxvYWQpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY29kZSA9PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoYFN0b3JlcyBBc3NpZ25lZCB0byBVc2VyIFN1Y2Nlc3NmdWxseSFgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChgVW5hYmxlIHRvIEFzc2lnbiBTdG9yZXMgdG8gVXNlciFgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiVW5hYmxlIHRvIEFzc2lnbiBTdG9yZXMgdG8gVXNlciFcIik7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge30sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZFNlbGVjdGVkU3RvcmVzKHN0b3JlczogYW55W10pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXSA9IFtdO1xyXG4gICAgdGhpcy5kYXRhT2JqZWN0WzBdLlN0b3Jlcy5mb3JFYWNoKChzdG9yZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHN0b3Jlcy5zb21lKCAoIG9iajphbnkgKSA9PiBvYmouc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCApO1xyXG4gICAgICBpZiAoZXhpc3RzKSB7ICAgICAgICBcclxuICAgICAgICBzdG9yZS5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF0ucHVzaChzdG9yZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdG9yZXMgPSB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMF07XHJcbiAgICB0aGlzLnNlbGVjdGVkVGV4dHN0b3JlcyA9IGAke3RoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVswXS5sZW5ndGh9IFN0b3JlcyBTZWxlY3RlZGA7XHJcbiAgfVxyXG4gIGxvYWRTZWxlY3RlZHRlYW1zKHRlYW1zOiBhbnlbXSl7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMl0gPSBbXTtcclxuICAgIHRoaXMuZGF0YU9iamVjdFsyXS50ZWFtcy5mb3JFYWNoKCh0ZWFtOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZXhpc3RzID0gdGVhbXMuc29tZSggKCBvYmo6YW55ICkgPT4gb2JqLl9pZCA9PT0gdGVhbS5faWQgKTtcclxuICAgICAgaWYgKGV4aXN0cykge1xyXG4gICAgICAgIHRlYW0uY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzJdLnB1c2godGVhbSk7XHJcbiAgICAgICAgdGhpcy50ZWFtcy5wdXNoKHRlYW0uX2lkKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRUZXh0dGVhbXMgPSBgJHt0aGlzLnNlbGVjdGVkVmFsdWVzQXJyYXlbMV0ubGVuZ3RofSBUZWFtcyBTZWxlY3RlZGA7XHJcbiAgfVxyXG4gIGxvYWRTZWxlY3RlZGNsdXN0ZXJzKGNsdXN0ZXJzOiBhbnlbXSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdID0gW107XHJcbiAgICB0aGlzLmRhdGFPYmplY3RbMV0uY2x1c3RlcnMuZm9yRWFjaCgoY2x1c3RlcjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGNsdXN0ZXJzLnNvbWUoICggb2JqOmFueSApID0+IG9iai5faWQgPT09IGNsdXN0ZXIuX2lkICk7XHJcbiAgICAgIGlmIChleGlzdHMpIHtcclxuICAgICAgICBjbHVzdGVyLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXS5wdXNoKGNsdXN0ZXIpO1xyXG4gICAgICAgIHRoaXMuY2x1c3RlcnMucHVzaChjbHVzdGVyLl9pZClcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGV4dGNsdXN0ZXJzID0gYCR7dGhpcy5zZWxlY3RlZFZhbHVlc0FycmF5WzFdLmxlbmd0aH0gQ2x1c3RlcnMgU2VsZWN0ZWRgO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VNb2RhbCgpIHtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZCBhc3NpZ24tc3RvcmUgcHktMCBzY3JvbGxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTVcIj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwic3ltYm9sIHN5bWJvbC03NXB4IHN5bWJvbC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgYWx0PVwiUGljXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvYXNzaWduLWFkZHVzZXIuc3ZnXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+XHJcbjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIi8+XHJcbjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+XHJcbjxwYXRoIGQ9XCJNMzIgMzdWMzVDMzIgMzMuOTM5MSAzMS41Nzg2IDMyLjkyMTcgMzAuODI4NCAzMi4xNzE2QzMwLjA3ODMgMzEuNDIxNCAyOS4wNjA5IDMxIDI4IDMxSDIxQzE5LjkzOTEgMzEgMTguOTIxNyAzMS40MjE0IDE4LjE3MTYgMzIuMTcxNkMxNy40MjE0IDMyLjkyMTcgMTcgMzMuOTM5MSAxNyAzNVYzN00zNiAyNFYzME0zOSAyN0gzM00yOC41IDIzQzI4LjUgMjUuMjA5MSAyNi43MDkxIDI3IDI0LjUgMjdDMjIuMjkwOSAyNyAyMC41IDI1LjIwOTEgMjAuNSAyM0MyMC41IDIwLjc5MDkgMjIuMjkwOSAxOSAyNC41IDE5QzI2LjcwOTEgMTkgMjguNSAyMC43OTA5IDI4LjUgMjNaXCIgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxhIGNsYXNzPVwidGl0bGUgbWItM1wiPkFzc2lnbiB7eyhzZWxlY3QgPT09J2NsdXN0ZXJzJyA/ICdhcyBsZWFkIHRvJyA6ICdhcyB1c2VyIHRvJykgfCB0aXRsZWNhc2V9fTwvYT5cclxuICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwic3ViLXRpdGxlIG15LTJcIj5QbGVhc2UgYXNzaWduIHRoZSB7e3NlbGVjdCA9PT0gJ3N0b3JlcycgPyAnc3RvcmUnIDooc2VsZWN0ID09PSd1c2VycycgPyAndXNlcicgOiAnY2x1c3RlcicpfX08L3NwYW4+IC0tPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cIm5hdiBuYXYtc3RyZXRjaCBuYXYtbGluZS10YWJzMSBuYXYtbGluZS10YWJzIGJvcmRlci10cmFuc3BhcmVudCBmbGV4LW5vd3JhcCBcIj5cclxuXHJcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtIG5hdi1pdGVtMVwiIChjbGljayk9XCJzZWxlY3Q9J3N0b3Jlcyc7IHN0b3Jlc1R5cGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgW25nQ2xhc3NdPVwic2VsZWN0ID09PSAnc3RvcmVzJyA/ICdhY3RpdmUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmsgbmF2LWxpbmsxIGN1cnNvci1wb2ludGVyIHRhYi10aXRsZSBtZS02XCI+U3RvcmVzPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbTFcIiAoY2xpY2spPVwic2VsZWN0PSdjbHVzdGVycyc7IHN0b3Jlc1R5cGUoJGV2ZW50KVwiPjxhXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3QgPT09ICdjbHVzdGVycycgPyAnYWN0aXZlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIG5hdi1saW5rMSBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgdGFiLXRpdGxlIG1lLTZcIj5DbHVzdGVyPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbSBuYXYtaXRlbTFcIiAoY2xpY2spPVwic2VsZWN0PSd0ZWFtcyc7IHN0b3Jlc1R5cGUoJGV2ZW50KVwiPjxhXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3QgPT09ICd0ZWFtcycgPyAnYWN0aXZlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rIG5hdi1saW5rMSBjdXJzb3ItcG9pbnRlciBuby1ib3JkZXIgdGFiLXRpdGxlIG1lLTZcIj5UZWFtczwvYT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3QgPT09J3N0b3JlcydcIiBjbGFzcz1cInctMTAwIG15LTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGxhY2Vob2xkZXItb3ZlcmxheVwiICpuZ0lmPVwiIShkYXRhT2JqZWN0WzBdPy5TdG9yZXM/Lmxlbmd0aClcIj5cclxuICAgICAgICAgICAgICAgICAgU2VsZWN0IFN0b3Jlc1xyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bGliLWdyb3VwLXNlbGVjdCBbaXRlbXNdPVwiZGF0YU9iamVjdFswXT8uU3RvcmVzXCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3N0b3JlTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidzdG9yZUlkJ1wiIChzZWxlY3RlZCk9XCJvbnN0b3JlU2VsZWN0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlc109XCJzZWxlY3RlZFZhbHVlc0FycmF5WzBdXCI+XHJcbiAgICAgICAgICAgICAgICA8L2xpYi1ncm91cC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdCA9PT0nY2x1c3RlcnMnXCIgY2xhc3M9XCJ3LTEwMCBteS01XCI+ICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyLW92ZXJsYXlcIiAqbmdJZj1cIiEoZGF0YU9iamVjdFsxXT8uY2x1c3RlcnM/Lmxlbmd0aClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBjbHVzdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1ncm91cC1zZWxlY3QgW2l0ZW1zXT1cImRhdGFPYmplY3RbMV0/LmNsdXN0ZXJzXCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ2NsdXN0ZXJOYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidjbHVzdGVyTmFtZSdcIiAoc2VsZWN0ZWQpPVwib25ncm91cFNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cInNlbGVjdGVkVmFsdWVzQXJyYXlbMV1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpYi1ncm91cC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3QgPT09J3RlYW1zJ1wiIGNsYXNzPVwidy0xMDAgbXktNVwiPiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbGFjZWhvbGRlci1vdmVybGF5XCIgKm5nSWY9XCIhKGRhdGFPYmplY3RbMl0/LnRlYW1zPy5sZW5ndGgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIFNlbGVjdCBTdG9yZXNcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGxpYi1ncm91cC1zZWxlY3QgW2l0ZW1zXT1cImRhdGFPYmplY3RbMl0/LnRlYW1zXCIgW2Rpc2FibGVkXT1cImZhbHNlXCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3RlYW1OYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3RlYW1OYW1lJ1wiIChzZWxlY3RlZCk9XCJvblRlYW1zU2VsZWN0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlc109XCJzZWxlY3RlZFZhbHVlc0FycmF5WzJdXCI+XHJcbiAgICAgICAgICAgICAgICA8L2xpYi1ncm91cC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxoMiBjbGFzcz1cInN0b3JlLWluZm8gZnctYm9sZFwiPlxyXG4gICAgICAgICAgICBAaWYoc2VsZWN0ID09PSdzdG9yZXMnKSB7XHJcbiAgICAgICAgICAgICAgICBTdG9yZSBcclxuICAgICAgICAgICAgfSBAZWxzZSBpZihzZWxlY3QgPT09J2NsdXN0ZXJzJykge1xyXG4gICAgICAgICAgICAgICAgQ2x1c3RlclxyXG4gICAgICAgICAgICB9QGVsc2UgaWYoc2VsZWN0ID09PSd0ZWFtcycpIHtcclxuICAgICAgICAgICAgICAgIFRlYW1zXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgSW5mb3JtYXRpb25cclxuICAgICAgICA8L2gyPlxyXG5cclxuICAgICAgICA8c2VjdGlvbiAgKm5nSWY9XCJzZWxlY3QgPT09J3N0b3JlcydcIiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIGgtMjAwcHggbWItMyBzY3JvbGxcIj5cclxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlciAgbXQtMiBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+U1BPQyBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlN0b3JlIElEPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFwcGxpY2F0aW9uIElEPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkxvY2F0aW9uPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0Ym9keT4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgc3RvcmUgb2Ygc3RvcmVzO2xldCBpPWluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tzdG9yZT8uc3BvY05hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tzdG9yZT8uc3RvcmVJZH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3N0b3JlPy5hcHBJZH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3N0b3JlPy5sb2NhdGlvbn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4gICAgICAgXHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgQGlmIChzZWxlY3RlZFZhbHVlc0FycmF5WzBdLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYmctYXNzaWduLXVzZXIgdy0xMDAgbWItNSBteC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+PHN2ZyB3aWR0aD1cIjM2XCIgaGVpZ2h0PVwiMzZcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIyXCIgd2lkdGg9XCIzMlwiIGhlaWdodD1cIjMyXCIgcng9XCIxNlwiIGZpbGw9XCIjREFGMUZGXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIzLjMzMjcgMjRWMjIuNjY2N0MyMy4zMzI3IDIxLjk1OTQgMjMuMDUxNyAyMS4yODExIDIyLjU1MTYgMjAuNzgxQzIyLjA1MTUgMjAuMjgxIDIxLjM3MzMgMjAgMjAuNjY2IDIwSDE1LjMzMjdDMTQuNjI1NCAyMCAxMy45NDcyIDIwLjI4MSAxMy40NDcxIDIwLjc4MUMxMi45NDcgMjEuMjgxMSAxMi42NjYgMjEuOTU5NCAxMi42NjYgMjIuNjY2N1YyNE0yMC42NjYgMTQuNjY2N0MyMC42NjYgMTYuMTM5NCAxOS40NzIxIDE3LjMzMzMgMTcuOTk5MyAxNy4zMzMzQzE2LjUyNjYgMTcuMzMzMyAxNS4zMzI3IDE2LjEzOTQgMTUuMzMyNyAxNC42NjY3QzE1LjMzMjcgMTMuMTkzOSAxNi41MjY2IDEyIDE3Ljk5OTMgMTJDMTkuNDcyMSAxMiAyMC42NjYgMTMuMTkzOSAyMC42NjYgMTQuNjY2N1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXQtMiBmb3JtLWNoZWNrLWxhYmVsIG1zLTVcIj5UaGUgdXNlciB7e3VzZXI/LnVzZXJOYW1lfX0gaXMgYXNzaWduZWQgdG8gdGhlIGFib3ZlIHN0b3Jlcy48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8c2VjdGlvbiAqbmdJZj1cInNlbGVjdCA9PT0nY2x1c3RlcnMnXCIgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZSBoLTIwMHB4IG1iLTMgc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGJvdHRvbS1ib3JkZXIgbXQtMiBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtcy01XCI+Q2x1c3RlciBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlN0b3JlczwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBjbHVzdGVyIG9mIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXTtsZXQgaT1pbmRleDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibXMtNVwiPnt7Y2x1c3Rlcj8uY2x1c3Rlck5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2NsdXN0ZXI/LnN0b3JlTmFtZXN9fSA8c3BhbiAqbmdJZj1cImNsdXN0ZXI/LnN0b3JlTGlzdENvdW50ID4gMlwiIGNsYXNzPVwianVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgYmxlbmQtbW9kZSBtcy0zXCI+K3t7Y2x1c3Rlcj8uc3RvcmVMaXN0Q291bnQgLSAyfX08L3NwYW4+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRWYWx1ZXNBcnJheVsxXS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYmctYXNzaWduLXVzZXIgdy0xMDAgbWItNSBteC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj48c3ZnIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMy4zMzI3IDI0VjIyLjY2NjdDMjMuMzMyNyAyMS45NTk0IDIzLjA1MTcgMjEuMjgxMSAyMi41NTE2IDIwLjc4MUMyMi4wNTE1IDIwLjI4MSAyMS4zNzMzIDIwIDIwLjY2NiAyMEgxNS4zMzI3QzE0LjYyNTQgMjAgMTMuOTQ3MiAyMC4yODEgMTMuNDQ3MSAyMC43ODFDMTIuOTQ3IDIxLjI4MTEgMTIuNjY2IDIxLjk1OTQgMTIuNjY2IDIyLjY2NjdWMjRNMjAuNjY2IDE0LjY2NjdDMjAuNjY2IDE2LjEzOTQgMTkuNDcyMSAxNy4zMzMzIDE3Ljk5OTMgMTcuMzMzM0MxNi41MjY2IDE3LjMzMzMgMTUuMzMyNyAxNi4xMzk0IDE1LjMzMjcgMTQuNjY2N0MxNS4zMzI3IDEzLjE5MzkgMTYuNTI2NiAxMiAxNy45OTkzIDEyQzE5LjQ3MjEgMTIgMjAuNjY2IDEzLjE5MzkgMjAuNjY2IDE0LjY2NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTIgZm9ybS1jaGVjay1sYWJlbCBtcy01XCI+VGhlIHVzZXIge3t1c2VyPy51c2VyTmFtZX19IGlzIGFzc2lnbmVkIGFzIGEgbWVtYmVyIHRvIHRoZSBhYm92ZVxyXG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPHNlY3Rpb24gKm5nSWY9XCJzZWxlY3QgPT09J3RlYW1zJ1wiIGNsYXNzPVwidy0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgaC0yMDBweCBtYi0zIHNjcm9sbFwiPlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBib3R0b20tYm9yZGVyIG10LTIgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibXMtNVwiPlRlYW0gTmFtZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Vc2VyczwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB0ZWFtIG9mIHRoaXMuc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXTtsZXQgaT1pbmRleDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibXMtNVwiPnt7dGVhbT8udGVhbU5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e3RlYW0/LnVzZXJOYW1lc319IDxzcGFuICpuZ0lmPVwidGVhbT8udXNlckxpc3RDb3VudCA+IDJcIiBjbGFzcz1cImp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGJsZW5kLW1vZGUgbXMtM1wiPit7e3RlYW0/LnVzZXJMaXN0Q291bnQgLSAyfX08L3NwYW4+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRWYWx1ZXNBcnJheVsyXS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYmctYXNzaWduLXVzZXIgdy0xMDAgbWItNSBteC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj48c3ZnIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiIHZpZXdCb3g9XCIwIDAgMzYgMzZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMy4zMzI3IDI0VjIyLjY2NjdDMjMuMzMyNyAyMS45NTk0IDIzLjA1MTcgMjEuMjgxMSAyMi41NTE2IDIwLjc4MUMyMi4wNTE1IDIwLjI4MSAyMS4zNzMzIDIwIDIwLjY2NiAyMEgxNS4zMzI3QzE0LjYyNTQgMjAgMTMuOTQ3MiAyMC4yODEgMTMuNDQ3MSAyMC43ODFDMTIuOTQ3IDIxLjI4MTEgMTIuNjY2IDIxLjk1OTQgMTIuNjY2IDIyLjY2NjdWMjRNMjAuNjY2IDE0LjY2NjdDMjAuNjY2IDE2LjEzOTQgMTkuNDcyMSAxNy4zMzMzIDE3Ljk5OTMgMTcuMzMzM0MxNi41MjY2IDE3LjMzMzMgMTUuMzMyNyAxNi4xMzk0IDE1LjMzMjcgMTQuNjY2N0MxNS4zMzI3IDEzLjE5MzkgMTYuNTI2NiAxMiAxNy45OTkzIDEyQzE5LjQ3MjEgMTIgMjAuNjY2IDEzLjE5MzkgMjAuNjY2IDE0LjY2NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTIgZm9ybS1jaGVjay1sYWJlbCBtcy01XCI+VGhlIHVzZXIge3t1c2VyPy51c2VyTmFtZX19IGlzIGFzc2lnbmVkIGFzIGEgbWVtYmVyIHRvIHRoZSBhYm92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRlYW1zLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPHNlY3Rpb24gKm5nSWY9XCJzZWxlY3QgPT09J3N0b3JlcydcIiBjbGFzcz1cInctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBteS01XCI+XHJcbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJociBtLTAgYm9yZGVyIGJvcmRlci1ncmF5LTQwMCBib3JkZXItMVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHBvc2l0aW9uLW9yIHB4LTEwXCI+b3I8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTUwMCBteS02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9sIGNsYXNzPVwiY3VzdG9tLW9yZGVyZWQtbGlzdCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGQgZnMtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ1c2VyLXRleHRcIj5Vc2UgdGhlIHRlbXBsYXRlIHRvIHVwbG9hZCBtdWx0aXBsZSBzdG9yZXMgdG8gdXNlcnMgYXQgb25jZS48L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ1c2VyLXRleHQgbXktMlwiPjxzcGFuIGNsYXNzPVwidXNlci10ZXh0XCI+RG93bmxvYWQgdGhlIHRlbXBsYXRlIGhlcmUgLSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1zLTFcIiBocmVmPVwiLi4vLi4vLi4vYXNzZXRzL2ZpbGVzL3N0b3JlTGlzdFRlbXBsYXRlLnhsc3hcIiBkb3dubG9hZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU01LjgzMzMzIDguMzMzMzNMMTAgMTIuNU0xMCAxMi41TDE0LjE2NjcgOC4zMzMzM00xMCAxMi41VjIuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZW1wbGF0ZSBtcy0yXCI+RG93bmxvYWQgVGVtcGxhdGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBteS0zXCI+QWRkIHlvdXIgZGF0YSB0byB0aGUgVGVtcGxhdGUgRmlsZTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBteS0zXCI+VXBsb2FkIGl0IGJlbG93IGZvciBwcm9jZXNzaW5nPC9saT4gICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvb2w+XHJcbiAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBtcy0zIHJpZ2h0LWJhciBweS01IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiID5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwiYWNjb3VudFR5cGVcIiB0eXBlPVwicmFkaW9cIiBpZD1cImt0X2NyZWF0ZV9hY2NvdW50X2Zvcm1fYWNjb3VudF90eXBlX3BlcnNvbmFsXCIgYWNjZXB0ID0gXCIuY3N2LCBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCwgYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCIgdmFsdWU9XCJwZXJzb25hbFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1jaGVja1wiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgbmctcmVmbGVjdC12YWx1ZT1cInBlcnNvbmFcIiB0eXBlPVwiZmlsZVwiICNpbnB1dEZpbGUgLz5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJrdF9jcmVhdGVfYWNjb3VudF9mb3JtX2FjY291bnRfdHlwZV9wZXJzb25hbFwiIGNsYXNzPVwiIHctNTAgcC00XCI+PHNwYW5cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZ3LWJvbGQgdGV4dC1jZW50ZXIgdy0xMDAgZnMtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ2XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ2IDQ2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0YyRjRGN1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIzXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIHN0cm9rZT1cIiNGOUZBRkJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80MDQ3XzQwNTY2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjYuMzMzMyAyNi4zMzM0TDIzIDIzTTIzIDIzTDE5LjY2NjYgMjYuMzMzNE0yMyAyM1YzMC41TTI5Ljk5MTYgMjguMzI1QzMwLjgwNDQgMjcuODgxOSAzMS40NDY1IDI3LjE4MDggMzEuODE2NSAyNi4zMzIyQzMyLjE4NjYgMjUuNDgzNyAzMi4yNjM1IDI0LjUzNjEgMzIuMDM1MSAyMy42Mzg5QzMxLjgwNjggMjIuNzQxOCAzMS4yODYyIDIxLjk0NjMgMzAuNTU1NSAyMS4zNzc5QzI5LjgyNDggMjAuODA5NSAyOC45MjU3IDIwLjUwMDYgMjggMjAuNUgyNi45NUMyNi42OTc3IDE5LjUyNDQgMjYuMjI3NiAxOC42MTg2IDI1LjU3NDkgMTcuODUwOUMyNC45MjIyIDE3LjA4MzEgMjQuMTA0IDE2LjQ3MzIgMjMuMTgxNyAxNi4wNjcyQzIyLjI1OTQgMTUuNjYxMiAyMS4yNTcxIDE1LjQ2OTUgMjAuMjUwMSAxNS41MDY2QzE5LjI0MyAxNS41NDM3IDE4LjI1NzUgMTUuODA4NiAxNy4zNjc2IDE2LjI4MTRDMTYuNDc3NyAxNi43NTQyIDE1LjcwNjYgMTcuNDIyNiAxNS4xMTIyIDE4LjIzNjNDMTQuNTE3NyAxOS4wNTAxIDE0LjExNTUgMTkuOTg4IDEzLjkzNTggMjAuOTc5NUMxMy43NTYgMjEuOTcxMSAxMy44MDM0IDIyLjk5MDUgMTQuMDc0MyAyMy45NjExQzE0LjM0NTIgMjQuOTMxNyAxNC44MzI3IDI1LjgyODIgMTUuNSAyNi41ODM0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDA0N180MDU2NlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzIDEzKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YS10aXRsZVwiPjxzcGFuIGNsYXNzPVwiY2xpY2stdXBsb2FkIGN1cnNvci1wb2ludGVyXCI+Q2xpY2sgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJtcy0yXCI+b3IgZHJhZyBhbmQgZHJvcDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtc3ViXCI+dGhlIGRhdGEgYWRkZWQgdGVtcGxhdGUgZmlsZSBmb3IgcHJvY2Vzc2luZy48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG1iLTEwIHctMTAwIG10LTEwXCIgcm9sZT1cImNsdXN0ZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMCBteC0zXCIgKGNsaWNrKT1cImNsb3NlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwIG14LTNcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiPlN1Ym1pdDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2FmdGVyVmFsaWRhdGlvbiBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBtdC0wXCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBtdC0zXCI+PHNwYW4gY2xhc3M9XCJjb25maWctaGVhZGluZyBmdy1zZW1pYm9sZCB3LWF1dG9cIj5CdWxrIEFzc2lnbjwvc3Bhbj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB0LTAgcG9wdXAtc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTcwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPlRvdGFsIFJlY29yZHM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY2FyZCByb3VuZGVkLTMgcC0zIGZsZXgtY29sdW1uIGgtNzBweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmcgdy0xMDBcIj57e2V4Y2VsRGF0YT8ubGVuZ3RofX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIHN1YnRpdGxlIG10LTFcIj5Sb3dzIHByb2Nlc3NlZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWNhcmQgcm91bmRlZC0zIHAtMyBmbGV4LWNvbHVtbiBoLTcwcHhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZXhjZWxFcnJvciBcclxuICAgICAgICAgICAgICAgICAgICA/ICdmdy1zZW1pYm9sZCB0ZXh0LWVycm9yIHctMTAwIGVycm9yLWhlYWRpbmcnIFxyXG4gICAgICAgICAgICAgICAgICAgIDogJ2Z3LXNlbWlib2xkIHctMTAwIGNvbmZpZy1oZWFkaW5nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGV4Y2VsRXJyb3I/LmVycm9yPy5sZW5ndGggfHwgMCB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImV4Y2VsRXJyb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgPyAnZnctc2VtaWJvbGQgdGV4dC1lcnJvciBtdC0xIGV4Y2VsLWVycm9yJyBcclxuICAgICAgICAgICAgICAgICAgICA6ICdmdy1zZW1pYm9sZCBzdWJ0aXRsZSBtdC0xJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIEVycm9yXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZXhjZWxFcnJvclwiIGNsYXNzPVwidGFibGUtaGVhZGVyIG10LTVcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDA7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ID5Zb3UncmUgYWJvdXQgdG8gYXNzaWduIHt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKX19IHt7Z2V0U3RvcmVDb3VudHMoZXhjZWxEYXRhKSA+IDEgPyAnU3RvcmVzJyA6ICdTdG9yZSd9fS4gQXJlIHlvdSBzdXJlIHdhbnQgdG8gcHJvY2VlZD88L2Rpdj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZXhjZWxFcnJvclwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5JbnZhbGlkIERldGFpbHMgITwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGluZm9ybWF0aW9uLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNSB3LTEwMCByb3VuZGVkLTMgYm9yZGVyLWVycm9yIG10LTUgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlcnJvciBvZiBleGNlbEVycm9yPy5lcnJvcjsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCIgW25nQ2xhc3NdPVwiIWxhc3QgPyAnbWItMicgOiAnJ1wiIGNsYXNzPVwidGV4dC1lcnJvclwiPnt7aSArIDF9fSkge3tlcnJvcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBmbGV4LXdyYXAgZ2FwLTIgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBidG4tZGVmYXVsdCBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZWFjdGl2ZXBvcHVwKCk7bW9kZWwuY2xvc2UoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWV4Y2VsRXJyb3JcIiBjbGFzcz1cImJ0biBidG4tbWQgcHktMyBidG4tZGVmYXVsdCBtcy0zIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInByb2NlZWRTdWJtaXQoKTttb2RlbC5jbG9zZSgpXCI+UHJvY2VlZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZXhjZWxFcnJvclwiIGNsYXNzPVwiYnRuIHB5LTMgYnRuLW1kIGJ0bi1kZWZhdWx0IG1zLTMgYnRuLWRhbmdlclwiIChjbGljayk9XCJmaWxlMS5jbGljaygpO1wiPlJldXBsb2FkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7O1wiICNmaWxlMSB0eXBlPVwiZmlsZVwiIGlkPVwia3RfYWNjb3VudF90ZWFtX3NpemVfc2VsZWN0XzJcIiBhY2NlcHQgPSBcIi5jc3YsIGFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0LCBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25VcGxvYWQoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|