tango-app-ui-manage-settings 3.7.48 → 3.7.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/configurations/configurations.component.mjs +13 -48
- package/esm2022/lib/components/configurations/footfall-configuration/footfall-configuration.component.mjs +3 -3
- package/esm2022/lib/components/configurations/ticket-configuration/ticket-configuration.component.mjs +7 -101
- package/esm2022/lib/components/documents/brand-documents/brand-documents.component.mjs +21 -5
- package/esm2022/lib/services/client-api.service.mjs +1 -11
- package/esm2022/lib/tango-manage-settings.module.mjs +3 -6
- package/fesm2022/tango-app-ui-manage-settings.mjs +49 -301
- package/fesm2022/tango-app-ui-manage-settings.mjs.map +1 -1
- package/lib/components/configurations/configurations.component.d.ts +0 -3
- package/lib/components/configurations/ticket-configuration/ticket-configuration.component.d.ts +2 -28
- package/lib/components/documents/brand-documents/brand-documents.component.d.ts +5 -0
- package/lib/services/client-api.service.d.ts +0 -4
- package/lib/tango-manage-settings.module.d.ts +12 -13
- package/package.json +1 -1
- package/esm2022/lib/components/configurations/trax-configuration/trax-configuration.component.mjs +0 -136
- package/lib/components/configurations/trax-configuration/trax-configuration.component.d.ts +0 -50
|
@@ -857,11 +857,11 @@ export class FootfallConfigurationComponent {
|
|
|
857
857
|
return match?.label || '';
|
|
858
858
|
}
|
|
859
859
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FootfallConfigurationComponent, deps: [{ token: i1.FormBuilder }, { token: i2.GlobalStateService }, { token: i3.ClientApiService }, { token: i4.NgbModal }, { token: i5.ToastService }], target: i0.ɵɵFactoryTarget.Component });
|
|
860
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FootfallConfigurationComponent, selector: "lib-footfall-configuration", host: { listeners: { "document:click": "closeMenus()" } }, viewQueries: [{ propertyName: "categoryModalTpl", first: true, predicate: ["categoryModal"], descendants: true }, { propertyName: "deleteCategoryModalTpl", first: true, predicate: ["deleteCategoryModal"], descendants: true }, { propertyName: "resetConfirmationModalTpl", first: true, predicate: ["resetConfirmationModal"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\n <div class=\"d-flex justify-content-end\">\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline py-3 align-items-end\">\n <span class=\"me-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clip-path=\"url(#clip0_2579_25125)\">\n <path\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_2579_25125\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>Edit Details\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- Approver Configuration -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-1\">Approver configuration</h5>\n <p class=\"ff-section-desc mb-4\">\n Set level of revisions required for a store raised tickets\n </p>\n\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\n class=\"approver-option d-flex flex-column\"\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\n\n <label class=\"custom-checkbox align-items-start\"\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\n <span class=\"checkmark\"></span>\n <div class=\"label-text\">\n <div class=\"title\">\n {{ rev.get('actionType')?.value | titlecase }}\n </div>\n <div class=\"desc text-muted\">\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\n footfall.</span>\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\n check.</span>\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\n </ng-container>\n </div>\n </div>\n </label>\n\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Store SPOC Ticket Creation -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-3\">Store SPOC Ticket Creation</h5>\n\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\n <label class=\"mb-0\">\n Allow store SPOC to create tickets only for the last\n </label>\n\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\n spocTicketCreationdays[0] }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\n (click)=\"selectAllowTicketCreation($event, day)\">\n {{ day }}\n </button>\n </div>\n </div>\n\n <span class=\"mb-0\">Days</span>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Ticket Auto-close -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex align-items-center mb-2\">\n <h5 class=\"ff-section-title m-0\">Ticket Auto-close</h5>\n\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\n <span class=\"slider round\"></span>\n </label>\n </div>\n\n <div class=\"d-flex align-items-center mt-2\">\n <span class=\"mb-0\">\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\n </span>\n\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\n (click)=\"selectAutoCloseAccuracy($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Footfall Directory Limitations -->\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\n <div>\n <h5 class=\"ff-section-title m-0\">Footfall directory limitations</h5>\n <p class=\"ff-section-desc mb-2\">\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\n </p>\n </div>\n\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\n (click)=\"openCategoryModal('add')\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span>Add New</span>\n </button>\n </div>\n\n <!-- Category Cards Grid -->\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\n <div class=\"category-card-header\">\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\n height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <g clip-path=\"url(#clip0_1162_24621)\">\n <path\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24621\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\n height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\n <path\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1162_24650)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24650\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </div>\n <div class=\"category-name\">\n {{ tag.get('name')?.value }}\n </div>\n <button\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\n [disabled]=\"isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\n fill=\"#475467\" />\n <path\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\n fill=\"#475467\" />\n <path\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\n fill=\"#475467\" />\n </svg>\n </button>\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\n </div>\n </div>\n\n <div class=\"category-percentage-section\">\n <div class=\"position-relative ff-select-wrapper compact\"\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleLimitDropdown($event, i)\">\n <span>{{ tag.get('value')?.value || 0 }}%</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectLimitValue($event, i, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Overall limitation: combined cap across all tag types (saved to API as overallLimitation, e.g. \"30%\") -->\n <div class=\"mt-4 ff-overall-limitation\">\n <h6 class=\"ff-section-title m-0\">Overall limitations</h6>\n <p class=\"ff-section-desc mb-2\">\n Combined maximum limitation across all non-Purchaser tags\n </p>\n <div class=\"position-relative ff-select-wrapper compact\"\n [class.open]=\"isOverallLimitationDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleOverallLimitationDropdown($event)\">\n <span>{{ overallLimitationLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isOverallLimitationDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectOverallLimitation($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\n\n <!-- Store Requests -->\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\n <div>\n <h5 class=\"ff-section-title mb-2\">Store Requests</h5>\n <p class=\"ff-section-desc mb-0\">\n Below stores have requested to raise a ticket after breaching the configured limit\n <span class=\"info-icon\">i</span>\n </p>\n </div>\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\n <span>Reset</span>\n </button>\n </div>\n\n <!-- Restriction Criteria -->\n <div class=\"restriction-criteria mb-4\">\n <label class=\"mb-3 d-block\">\n Restrict ticket creation for any store that:\n </label>\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\n <span>Has raised more than</span>\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\n [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\n <span>\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\n </span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\n (click)=\"selectTicketCount($event, c)\">\n {{ c }}\n </button>\n </div>\n </div>\n <span>tickets in the calender</span>\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\n <span>{{ selectedDaysLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\n (click)=\"selectStoreDays($event, opt)\">\n {{ opt.label }}\n </button>\n </div>\n </div>\n <span>based on configured conditions\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n placement=\"top\" [ngbTooltip]=\"conditionsTooltip\" tooltipClass=\"conditions-tooltip\">\n <g clip-path=\"url(#clip0_1432_80035)\">\n <path\n d=\"M8.00065 10.6666V7.99992M8.00065 5.33325H8.00732M14.6673 7.99992C14.6673 11.6818 11.6826 14.6666 8.00065 14.6666C4.31875 14.6666 1.33398 11.6818 1.33398 7.99992C1.33398 4.31802 4.31875 1.33325 8.00065 1.33325C11.6826 1.33325 14.6673 4.31802 14.6673 7.99992Z\"\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1432_80035\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <ng-template #conditionsTooltip>\n <div style=\"text-align: left; font-size: 12px; line-height: 1.6;\">\n <b>1.</b> Delta between Store/AOM accuracy and Central Ops/Tango accuracy exceeds 10%<br>\n <b>2.</b> The overall accuracy after all reviews is greater than 85%.<br>\n <b>3.</b> Overall the Number of Images (Footfall) marked for validation in the ticket by the\n Store is Less than equal to 10\n </div>\n </ng-template>\n </div>\n </div>\n\n <!-- Store Requests Table -->\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\n <table class=\"table table-hover store-requests-table-content\">\n <thead>\n <tr>\n <th class=\"checkbox-column\">\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\n (change)=\"toggleSelectAll($event)\" />\n <span class=\"checkmark-select\"></span>\n\n </label>\n </th>\n <th class=\"sortable store-name-column\">\n <div class=\"d-flex align-items-center\">\n <span>Select all stores ({{ storeList?.length || 0 }})</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </th>\n <th class=\"sortable\">\n Raised on\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"sortable\">\n Last raised(Approved)\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"sortable\">\n No of Time Raised\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let store of storeList\">\n <td class=\"checkbox-column\">\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\n <span class=\"checkmark-select\"></span>\n </label>\n </td>\n <td>{{ store.storeName }}</td>\n <td>{{ store.raisedOn }}</td>\n <td>{{ store.lastApproved || '-' }}</td>\n <td>{{ store.totalRaised }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <ng-template #emptyStoreRequests>\n <div class=\"empty-store-state text-center\">\n <div class=\"empty-store-icon mb-3\">\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\n </svg>\n </div>\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\n </div>\n </ng-template>\n </div>\n\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\n\n <!-- Send Ticket to Tango -->\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-1\">Send Ticket to Tango</h5>\n <div class=\"d-flex align-items-center mt-2\">\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\n [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\n (click)=\"selectSendTicketTango($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer Actions -->\n <div *ngIf=\"!isEdit\">\n <div class=\"mb-5 w-100 footer-seperator\"></div>\n <div class=\"d-flex justify-content-end\">\n <a type=\"button\" class=\"btn btn-outline mt-1 pt-3 me-4\" (click)=\"onCancel()\">Cancel</a>\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\n </div>\n </div>\n\n <!-- Category Modal -->\n <ng-template #categoryModal>\n <div class=\"modal-header border-0 pb-0\">\n <h5 class=\"modal-title\">\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\n </h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\n </div>\n <div class=\"modal-body category-modal-body\">\n <form [formGroup]=\"categoryForm\">\n <div class=\"mb-3\">\n <label class=\"form-label text-muted\">Icon</label>\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\n <span class=\"d-inline-flex align-items-center gap-2\">\n <span class=\"category-icon\"\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\n <ng-container\n [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_icon_housekeeping\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </span>\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\n </span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\n *ngFor=\"let icon of categoryIcons\"\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\n <ng-container [ngSwitch]=\"icon.value\">\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1162_24650)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24650\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </span>\n <span>{{ icon.label }}</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <label class=\"form-label text-muted\">Category Name</label>\n <input type=\"text\" class=\"form-control\"\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\n placeholder=\"Enter your new category\" formControlName=\"name\" />\n <small class=\"text-danger\"\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\n Category name is required.\n </small>\n <small class=\"text-danger\"\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\n Category name already exists.\n </small>\n </div>\n\n <div class=\"mb-2\">\n <label class=\"form-label text-muted\">Limitation</label>\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectCategoryLimitValue($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div class=\"modal-footer border-0 pt-0\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\n </button>\n </div>\n </ng-template>\n\n <!-- Delete Confirmation Modal -->\n <ng-template #deleteCategoryModal>\n <div class=\"modal-body text-center p-4\">\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\n <p class=\"mb-4 text-muted\">\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\n </p>\n <div class=\"d-flex justify-content-center gap-3\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\n </div>\n </div>\n </ng-template>\n\n <!-- Reset Store Requests Confirmation Modal -->\n <ng-template #resetConfirmationModal>\n <div class=\"modal-body text-center p-4\">\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\n <p class=\"mb-4 text-muted\">\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\n </p>\n <div class=\"d-flex justify-content-center gap-3\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\n </div>\n </div>\n </ng-template>\n\n</form>\n", styles: ["::ng-deep .conditions-tooltip .tooltip-inner{max-width:450px;text-align:left;padding:10px 14px;font-size:12px;line-height:1.6}form{padding:32px 20px;border-radius:16px;font-family:Inter,Segoe UI,sans-serif}.ff-section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 1px 4px #0f172a0a}.ff-section-title{font-size:16px;font-weight:600;color:#101828}.ff-section-desc{font-size:13px;color:#667085}.ff-divider{margin:8px 24px;border-color:#e4e7ec}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:18px;width:18px;min-width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;border:1px solid #e5e7eb;border-radius:10px;padding:12px;background-color:#fff;box-shadow:0 1px 3px #1018280f;position:relative;display:flex;flex-direction:column;gap:12px}.category-card-header{display:flex;align-items:center;gap:10px}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.ff-overall-limitation .ff-select-wrapper.compact{width:160px;min-width:160px;max-width:160px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.duplicateTag{background:#4755691f;color:#475569}.employeeTag{background:#3b82f61f;color:#3b82f6}.houseKeepingTag{background:#22c55e1f;color:#22c55e}.junkTag{background:#ef44441f;color:#ef4444}.purpleTag{background:#7c3aed1f;color:#7c3aed}.orangeTag{background:#ea580c1f;color:#ea580c}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.tango-label{font-size:13px;color:#475467;font-weight:500}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:7px;top:3px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.store-requests-table-content thead{background:linear-gradient(180deg,#f0f6ff,#f7f9fc)}.store-requests-table-content thead th{padding:14px 16px;font-weight:600;font-size:12px;color:#475467;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;vertical-align:middle;text-transform:uppercase;letter-spacing:.04em}.store-requests-table-content tbody td{padding:14px 16px;font-size:13px;color:#344054;border-bottom:1px solid #f2f4f7;vertical-align:middle}.store-requests-table-content tbody tr{transition:background .15s}.store-requests-table-content tbody tr:hover{background-color:#f8fbff}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2;background:#f0f6ff}.checkbox-column{width:50px;padding-left:16px!important;padding-right:0!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#e8eef8}.sort-icon{opacity:.5;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:240px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px dashed #c7d7f0;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }] });
|
|
860
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FootfallConfigurationComponent, selector: "lib-footfall-configuration", host: { listeners: { "document:click": "closeMenus()" } }, viewQueries: [{ propertyName: "categoryModalTpl", first: true, predicate: ["categoryModal"], descendants: true }, { propertyName: "deleteCategoryModalTpl", first: true, predicate: ["deleteCategoryModal"], descendants: true }, { propertyName: "resetConfirmationModalTpl", first: true, predicate: ["resetConfirmationModal"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\r\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\r\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\r\n <div class=\"d-flex justify-content-end\">\r\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline py-3 align-items-end\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_2579_25125)\">\r\n <path\r\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2579_25125\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>Edit Details\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Approver Configuration -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-1\">Approver configuration</h5>\r\n <p class=\"ff-section-desc mb-4\">\r\n Set level of revisions required for a store raised tickets\r\n </p>\r\n\r\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"approver-option d-flex flex-column\"\r\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n\r\n <label class=\"custom-checkbox align-items-start\"\r\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\r\n <span class=\"checkmark\"></span>\r\n <div class=\"label-text\">\r\n <div class=\"title\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </div>\r\n <div class=\"desc text-muted\">\r\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\r\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\r\n footfall.</span>\r\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\r\n check.</span>\r\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Store SPOC Ticket Creation -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-3\">Store SPOC Ticket Creation</h5>\r\n\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <label class=\"mb-0\">\r\n Allow store SPOC to create tickets only for the last\r\n </label>\r\n\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\r\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\r\n spocTicketCreationdays[0] }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\r\n (click)=\"selectAllowTicketCreation($event, day)\">\r\n {{ day }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <span class=\"mb-0\">Days</span>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Ticket Auto-close -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <h5 class=\"ff-section-title m-0\">Ticket Auto-close</h5>\r\n\r\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\r\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <span class=\"mb-0\">\r\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\r\n </span>\r\n\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\r\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\r\n (click)=\"selectAutoCloseAccuracy($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Footfall Directory Limitations -->\r\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <div>\r\n <h5 class=\"ff-section-title m-0\">Footfall directory limitations</h5>\r\n <p class=\"ff-section-desc mb-2\">\r\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\r\n </p>\r\n </div>\r\n\r\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\r\n (click)=\"openCategoryModal('add')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>Add New</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Category Cards Grid -->\r\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\r\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\r\n <div class=\"category-card-header\">\r\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\r\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\r\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\r\n height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1162_24621)\">\r\n <path\r\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\r\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24621\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\r\n <path\r\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\r\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <div class=\"category-name\">\r\n {{ tag.get('name')?.value }}\r\n </div>\r\n <button\r\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\r\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\r\n [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n </button>\r\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"category-percentage-section\">\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleLimitDropdown($event, i)\">\r\n <span>{{ tag.get('value')?.value || 0 }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectLimitValue($event, i, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Overall limitation: combined cap across all tag types (saved to API as overallLimitation, e.g. \"30%\") -->\r\n <div class=\"mt-4 ff-overall-limitation\">\r\n <h6 class=\"ff-section-title m-0\">Overall limitations</h6>\r\n <p class=\"ff-section-desc mb-2\">\r\n Combined maximum limitation across all non-Purchaser tags\r\n </p>\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"isOverallLimitationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleOverallLimitationDropdown($event)\">\r\n <span>{{ overallLimitationLabel }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isOverallLimitationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectOverallLimitation($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n\r\n <!-- Store Requests -->\r\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div>\r\n <h5 class=\"ff-section-title mb-2\">Store Requests</h5>\r\n <p class=\"ff-section-desc mb-0\">\r\n Below stores have requested to raise a ticket after breaching the configured limit\r\n <span class=\"info-icon\">i</span>\r\n </p>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\r\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\r\n <span>Reset</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Restriction Criteria -->\r\n <div class=\"restriction-criteria mb-4\">\r\n <label class=\"mb-3 d-block\">\r\n Restrict ticket creation for any store that:\r\n </label>\r\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\r\n <span>Has raised more than</span>\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\r\n <span>\r\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\r\n (click)=\"selectTicketCount($event, c)\">\r\n {{ c }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>tickets in the calender</span>\r\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\r\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\r\n <span>{{ selectedDaysLabel }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\r\n (click)=\"selectStoreDays($event, opt)\">\r\n {{ opt.label }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>based on configured conditions\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n placement=\"top\" [ngbTooltip]=\"conditionsTooltip\" tooltipClass=\"conditions-tooltip\">\r\n <g clip-path=\"url(#clip0_1432_80035)\">\r\n <path\r\n d=\"M8.00065 10.6666V7.99992M8.00065 5.33325H8.00732M14.6673 7.99992C14.6673 11.6818 11.6826 14.6666 8.00065 14.6666C4.31875 14.6666 1.33398 11.6818 1.33398 7.99992C1.33398 4.31802 4.31875 1.33325 8.00065 1.33325C11.6826 1.33325 14.6673 4.31802 14.6673 7.99992Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1432_80035\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <ng-template #conditionsTooltip>\r\n <div style=\"text-align: left; font-size: 12px; line-height: 1.6;\">\r\n <b>1.</b> Delta between Store/AOM accuracy and Central Ops/Tango accuracy exceeds 10%<br>\r\n <b>2.</b> The overall accuracy after all reviews is greater than 85%.<br>\r\n <b>3.</b> Overall the Number of Images (Footfall) marked for validation in the ticket by the\r\n Store is Less than equal to 10\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Requests Table -->\r\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\r\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\r\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\r\n <table class=\"table table-hover store-requests-table-content\">\r\n <thead>\r\n <tr>\r\n <th class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\r\n (change)=\"toggleSelectAll($event)\" />\r\n <span class=\"checkmark-select\"></span>\r\n\r\n </label>\r\n </th>\r\n <th class=\"sortable store-name-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <span>Select all stores ({{ storeList?.length || 0 }})</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th class=\"sortable\">\r\n Raised on\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n Last raised(Approved)\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n No of Time Raised\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let store of storeList\">\r\n <td class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\r\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\r\n <span class=\"checkmark-select\"></span>\r\n </label>\r\n </td>\r\n <td>{{ store.storeName }}</td>\r\n <td>{{ store.raisedOn }}</td>\r\n <td>{{ store.lastApproved || '-' }}</td>\r\n <td>{{ store.totalRaised }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <ng-template #emptyStoreRequests>\r\n <div class=\"empty-store-state text-center\">\r\n <div class=\"empty-store-icon mb-3\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n\r\n <!-- Send Ticket to Tango -->\r\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-1\">Send Ticket to Tango</h5>\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\r\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\r\n (click)=\"selectSendTicketTango($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div *ngIf=\"!isEdit\">\r\n <div class=\"mb-5 w-100 footer-seperator\"></div>\r\n <div class=\"d-flex justify-content-end\">\r\n <a type=\"button\" class=\"btn btn-outline mt-1 pt-3 me-4\" (click)=\"onCancel()\">Cancel</a>\r\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Modal -->\r\n <ng-template #categoryModal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <h5 class=\"modal-title\">\r\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\r\n </h5>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\r\n </div>\r\n <div class=\"modal-body category-modal-body\">\r\n <form [formGroup]=\"categoryForm\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Icon</label>\r\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\r\n <span class=\"d-inline-flex align-items-center gap-2\">\r\n <span class=\"category-icon\"\r\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <ng-container\r\n [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_icon_housekeeping\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\r\n *ngFor=\"let icon of categoryIcons\"\r\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\r\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\r\n <ng-container [ngSwitch]=\"icon.value\">\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span>{{ icon.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Category Name</label>\r\n <input type=\"text\" class=\"form-control\"\r\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\r\n placeholder=\"Enter your new category\" formControlName=\"name\" />\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\r\n Category name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\r\n Category name already exists.\r\n </small>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label text-muted\">Limitation</label>\r\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\r\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectCategoryLimitValue($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"modal-footer border-0 pt-0\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\r\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Delete Confirmation Modal -->\r\n <ng-template #deleteCategoryModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\r\n <p class=\"mb-4 text-muted\">\r\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Reset Store Requests Confirmation Modal -->\r\n <ng-template #resetConfirmationModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\r\n <p class=\"mb-4 text-muted\">\r\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\r\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</form>\r\n", styles: ["::ng-deep .conditions-tooltip .tooltip-inner{max-width:450px;text-align:left;padding:10px 14px;font-size:12px;line-height:1.6}form{padding:32px 20px;border-radius:16px;font-family:Inter,Segoe UI,sans-serif}.ff-section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 1px 4px #0f172a0a}.ff-section-title{font-size:16px;font-weight:600;color:#101828}.ff-section-desc{font-size:13px;color:#667085}.ff-divider{margin:8px 24px;border-color:#e4e7ec}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:18px;width:18px;min-width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;border:1px solid #e5e7eb;border-radius:10px;padding:12px;background-color:#fff;box-shadow:0 1px 3px #1018280f;position:relative;display:flex;flex-direction:column;gap:12px}.category-card-header{display:flex;align-items:center;gap:10px}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.ff-overall-limitation .ff-select-wrapper.compact{width:160px;min-width:160px;max-width:160px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.duplicateTag{background:#4755691f;color:#475569}.employeeTag{background:#3b82f61f;color:#3b82f6}.houseKeepingTag{background:#22c55e1f;color:#22c55e}.junkTag{background:#ef44441f;color:#ef4444}.purpleTag{background:#7c3aed1f;color:#7c3aed}.orangeTag{background:#ea580c1f;color:#ea580c}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.tango-label{font-size:13px;color:#475467;font-weight:500}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:7px;top:3px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.store-requests-table-content thead{background:linear-gradient(180deg,#f0f6ff,#f7f9fc)}.store-requests-table-content thead th{padding:14px 16px;font-weight:600;font-size:12px;color:#475467;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;vertical-align:middle;text-transform:uppercase;letter-spacing:.04em}.store-requests-table-content tbody td{padding:14px 16px;font-size:13px;color:#344054;border-bottom:1px solid #f2f4f7;vertical-align:middle}.store-requests-table-content tbody tr{transition:background .15s}.store-requests-table-content tbody tr:hover{background-color:#f8fbff}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2;background:#f0f6ff}.checkbox-column{width:50px;padding-left:16px!important;padding-right:0!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#e8eef8}.sort-icon{opacity:.5;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:240px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px dashed #c7d7f0;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TitleCasePipe, name: "titlecase" }] });
|
|
861
861
|
}
|
|
862
862
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FootfallConfigurationComponent, decorators: [{
|
|
863
863
|
type: Component,
|
|
864
|
-
args: [{ selector: 'lib-footfall-configuration', template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\n <div class=\"d-flex justify-content-end\">\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline py-3 align-items-end\">\n <span class=\"me-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clip-path=\"url(#clip0_2579_25125)\">\n <path\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_2579_25125\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>Edit Details\n </button>\n </div>\n </div>\n </ng-container>\n\n <!-- Approver Configuration -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-1\">Approver configuration</h5>\n <p class=\"ff-section-desc mb-4\">\n Set level of revisions required for a store raised tickets\n </p>\n\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\n class=\"approver-option d-flex flex-column\"\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\n\n <label class=\"custom-checkbox align-items-start\"\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\n <span class=\"checkmark\"></span>\n <div class=\"label-text\">\n <div class=\"title\">\n {{ rev.get('actionType')?.value | titlecase }}\n </div>\n <div class=\"desc text-muted\">\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\n footfall.</span>\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\n check.</span>\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\n </ng-container>\n </div>\n </div>\n </label>\n\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Store SPOC Ticket Creation -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-3\">Store SPOC Ticket Creation</h5>\n\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\n <label class=\"mb-0\">\n Allow store SPOC to create tickets only for the last\n </label>\n\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\n spocTicketCreationdays[0] }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\n (click)=\"selectAllowTicketCreation($event, day)\">\n {{ day }}\n </button>\n </div>\n </div>\n\n <span class=\"mb-0\">Days</span>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Ticket Auto-close -->\n <div class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex align-items-center mb-2\">\n <h5 class=\"ff-section-title m-0\">Ticket Auto-close</h5>\n\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\n <span class=\"slider round\"></span>\n </label>\n </div>\n\n <div class=\"d-flex align-items-center mt-2\">\n <span class=\"mb-0\">\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\n </span>\n\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\n (click)=\"selectAutoCloseAccuracy($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\">\n\n <!-- Footfall Directory Limitations -->\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\n <div>\n <h5 class=\"ff-section-title m-0\">Footfall directory limitations</h5>\n <p class=\"ff-section-desc mb-2\">\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\n </p>\n </div>\n\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\n (click)=\"openCategoryModal('add')\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span>Add New</span>\n </button>\n </div>\n\n <!-- Category Cards Grid -->\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\n <div class=\"category-card-header\">\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\n height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <g clip-path=\"url(#clip0_1162_24621)\">\n <path\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24621\">\n <rect width=\"12\" height=\"12\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\n height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\n <path\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1162_24650)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24650\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\n fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </div>\n <div class=\"category-name\">\n {{ tag.get('name')?.value }}\n </div>\n <button\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\n [disabled]=\"isEdit\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\n viewBox=\"0 0 24 24\">\n <path\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\n fill=\"#475467\" />\n <path\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\n fill=\"#475467\" />\n <path\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\n fill=\"#475467\" />\n </svg>\n </button>\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\n </div>\n </div>\n\n <div class=\"category-percentage-section\">\n <div class=\"position-relative ff-select-wrapper compact\"\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleLimitDropdown($event, i)\">\n <span>{{ tag.get('value')?.value || 0 }}%</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectLimitValue($event, i, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Overall limitation: combined cap across all tag types (saved to API as overallLimitation, e.g. \"30%\") -->\n <div class=\"mt-4 ff-overall-limitation\">\n <h6 class=\"ff-section-title m-0\">Overall limitations</h6>\n <p class=\"ff-section-desc mb-2\">\n Combined maximum limitation across all non-Purchaser tags\n </p>\n <div class=\"position-relative ff-select-wrapper compact\"\n [class.open]=\"isOverallLimitationDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\"\n (click)=\"toggleOverallLimitationDropdown($event)\">\n <span>{{ overallLimitationLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isOverallLimitationDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectOverallLimitation($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\n\n <!-- Store Requests -->\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-4 ff-section-card\">\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\n <div>\n <h5 class=\"ff-section-title mb-2\">Store Requests</h5>\n <p class=\"ff-section-desc mb-0\">\n Below stores have requested to raise a ticket after breaching the configured limit\n <span class=\"info-icon\">i</span>\n </p>\n </div>\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\n <span>Reset</span>\n </button>\n </div>\n\n <!-- Restriction Criteria -->\n <div class=\"restriction-criteria mb-4\">\n <label class=\"mb-3 d-block\">\n Restrict ticket creation for any store that:\n </label>\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\n <span>Has raised more than</span>\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\n [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\n <span>\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\n </span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\n (click)=\"selectTicketCount($event, c)\">\n {{ c }}\n </button>\n </div>\n </div>\n <span>tickets in the calender</span>\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\n <span>{{ selectedDaysLabel }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\n (click)=\"selectStoreDays($event, opt)\">\n {{ opt.label }}\n </button>\n </div>\n </div>\n <span>based on configured conditions\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n placement=\"top\" [ngbTooltip]=\"conditionsTooltip\" tooltipClass=\"conditions-tooltip\">\n <g clip-path=\"url(#clip0_1432_80035)\">\n <path\n d=\"M8.00065 10.6666V7.99992M8.00065 5.33325H8.00732M14.6673 7.99992C14.6673 11.6818 11.6826 14.6666 8.00065 14.6666C4.31875 14.6666 1.33398 11.6818 1.33398 7.99992C1.33398 4.31802 4.31875 1.33325 8.00065 1.33325C11.6826 1.33325 14.6673 4.31802 14.6673 7.99992Z\"\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1432_80035\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </span>\n <ng-template #conditionsTooltip>\n <div style=\"text-align: left; font-size: 12px; line-height: 1.6;\">\n <b>1.</b> Delta between Store/AOM accuracy and Central Ops/Tango accuracy exceeds 10%<br>\n <b>2.</b> The overall accuracy after all reviews is greater than 85%.<br>\n <b>3.</b> Overall the Number of Images (Footfall) marked for validation in the ticket by the\n Store is Less than equal to 10\n </div>\n </ng-template>\n </div>\n </div>\n\n <!-- Store Requests Table -->\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\n <table class=\"table table-hover store-requests-table-content\">\n <thead>\n <tr>\n <th class=\"checkbox-column\">\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\n (change)=\"toggleSelectAll($event)\" />\n <span class=\"checkmark-select\"></span>\n\n </label>\n </th>\n <th class=\"sortable store-name-column\">\n <div class=\"d-flex align-items-center\">\n <span>Select all stores ({{ storeList?.length || 0 }})</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </th>\n <th class=\"sortable\">\n Raised on\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"sortable\">\n Last raised(Approved)\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n <th class=\"sortable\">\n No of Time Raised\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\n fill=\"none\" class=\"ms-1 sort-icon\">\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let store of storeList\">\n <td class=\"checkbox-column\">\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\n <span class=\"checkmark-select\"></span>\n </label>\n </td>\n <td>{{ store.storeName }}</td>\n <td>{{ store.raisedOn }}</td>\n <td>{{ store.lastApproved || '-' }}</td>\n <td>{{ store.totalRaised }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <ng-template #emptyStoreRequests>\n <div class=\"empty-store-state text-center\">\n <div class=\"empty-store-icon mb-3\">\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\n </svg>\n </div>\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\n </div>\n </ng-template>\n </div>\n\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\n\n <!-- Send Ticket to Tango -->\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\n <h5 class=\"ff-section-title mb-1\">Send Ticket to Tango</h5>\n <div class=\"d-flex align-items-center mt-2\">\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\n [class.disabled]=\"isEdit\">\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\n (click)=\"selectSendTicketTango($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Footer Actions -->\n <div *ngIf=\"!isEdit\">\n <div class=\"mb-5 w-100 footer-seperator\"></div>\n <div class=\"d-flex justify-content-end\">\n <a type=\"button\" class=\"btn btn-outline mt-1 pt-3 me-4\" (click)=\"onCancel()\">Cancel</a>\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\n </div>\n </div>\n\n <!-- Category Modal -->\n <ng-template #categoryModal>\n <div class=\"modal-header border-0 pb-0\">\n <h5 class=\"modal-title\">\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\n </h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\n </div>\n <div class=\"modal-body category-modal-body\">\n <form [formGroup]=\"categoryForm\">\n <div class=\"mb-3\">\n <label class=\"form-label text-muted\">Icon</label>\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\n <span class=\"d-inline-flex align-items-center gap-2\">\n <span class=\"category-icon\"\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\n <ng-container\n [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_icon_housekeeping\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </span>\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\n </span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\n *ngFor=\"let icon of categoryIcons\"\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\n <ng-container [ngSwitch]=\"icon.value\">\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\n <path\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_1162_24650)\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\n fill=\"currentColor\" />\n </g>\n <defs>\n <clipPath id=\"clip0_1162_24650\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-container>\n </span>\n <span>{{ icon.label }}</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-3\">\n <label class=\"form-label text-muted\">Category Name</label>\n <input type=\"text\" class=\"form-control\"\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\n placeholder=\"Enter your new category\" formControlName=\"name\" />\n <small class=\"text-danger\"\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\n Category name is required.\n </small>\n <small class=\"text-danger\"\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\n Category name already exists.\n </small>\n </div>\n\n <div class=\"mb-2\">\n <label class=\"form-label text-muted\">Limitation</label>\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\n (click)=\"selectCategoryLimitValue($event, p)\">\n {{ p }}%\n </button>\n </div>\n </div>\n </div>\n </form>\n </div>\n <div class=\"modal-footer border-0 pt-0\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\n </button>\n </div>\n </ng-template>\n\n <!-- Delete Confirmation Modal -->\n <ng-template #deleteCategoryModal>\n <div class=\"modal-body text-center p-4\">\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\n <p class=\"mb-4 text-muted\">\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\n </p>\n <div class=\"d-flex justify-content-center gap-3\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\n </div>\n </div>\n </ng-template>\n\n <!-- Reset Store Requests Confirmation Modal -->\n <ng-template #resetConfirmationModal>\n <div class=\"modal-body text-center p-4\">\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\n <p class=\"mb-4 text-muted\">\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\n </p>\n <div class=\"d-flex justify-content-center gap-3\">\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\n </div>\n </div>\n </ng-template>\n\n</form>\n", styles: ["::ng-deep .conditions-tooltip .tooltip-inner{max-width:450px;text-align:left;padding:10px 14px;font-size:12px;line-height:1.6}form{padding:32px 20px;border-radius:16px;font-family:Inter,Segoe UI,sans-serif}.ff-section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 1px 4px #0f172a0a}.ff-section-title{font-size:16px;font-weight:600;color:#101828}.ff-section-desc{font-size:13px;color:#667085}.ff-divider{margin:8px 24px;border-color:#e4e7ec}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:18px;width:18px;min-width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;border:1px solid #e5e7eb;border-radius:10px;padding:12px;background-color:#fff;box-shadow:0 1px 3px #1018280f;position:relative;display:flex;flex-direction:column;gap:12px}.category-card-header{display:flex;align-items:center;gap:10px}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.ff-overall-limitation .ff-select-wrapper.compact{width:160px;min-width:160px;max-width:160px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.duplicateTag{background:#4755691f;color:#475569}.employeeTag{background:#3b82f61f;color:#3b82f6}.houseKeepingTag{background:#22c55e1f;color:#22c55e}.junkTag{background:#ef44441f;color:#ef4444}.purpleTag{background:#7c3aed1f;color:#7c3aed}.orangeTag{background:#ea580c1f;color:#ea580c}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.tango-label{font-size:13px;color:#475467;font-weight:500}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:7px;top:3px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.store-requests-table-content thead{background:linear-gradient(180deg,#f0f6ff,#f7f9fc)}.store-requests-table-content thead th{padding:14px 16px;font-weight:600;font-size:12px;color:#475467;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;vertical-align:middle;text-transform:uppercase;letter-spacing:.04em}.store-requests-table-content tbody td{padding:14px 16px;font-size:13px;color:#344054;border-bottom:1px solid #f2f4f7;vertical-align:middle}.store-requests-table-content tbody tr{transition:background .15s}.store-requests-table-content tbody tr:hover{background-color:#f8fbff}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2;background:#f0f6ff}.checkbox-column{width:50px;padding-left:16px!important;padding-right:0!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#e8eef8}.sort-icon{opacity:.5;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:240px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px dashed #c7d7f0;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}\n"] }]
|
|
864
|
+
args: [{ selector: 'lib-footfall-configuration', template: "<form [formGroup]=\"footfallDirConfigurationForm\" class=\"container-fluid\">\r\n <ng-container *ngIf=\"(gs.userAccess | async)?.Global_Configuration_isEdit\">\r\n <div *ngIf=\"isEdit\" class=\"col-12 mb-5\">\r\n <div class=\"d-flex justify-content-end\">\r\n <button (click)=\"toggleForm();\" type=\"button\" class=\"btn btn-outline py-3 align-items-end\">\r\n <span class=\"me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_2579_25125)\">\r\n <path\r\n d=\"M14.167 2.49993C14.3859 2.28106 14.6457 2.10744 14.9317 1.98899C15.2176 1.87054 15.5241 1.80957 15.8337 1.80957C16.1432 1.80957 16.4497 1.87054 16.7357 1.98899C17.0216 2.10744 17.2815 2.28106 17.5003 2.49993C17.7192 2.7188 17.8928 2.97863 18.0113 3.2646C18.1297 3.55057 18.1907 3.85706 18.1907 4.16659C18.1907 4.47612 18.1297 4.78262 18.0113 5.06859C17.8928 5.35455 17.7192 5.61439 17.5003 5.83326L6.25033 17.0833L1.66699 18.3333L2.91699 13.7499L14.167 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2579_25125\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>Edit Details\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Approver Configuration -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-1\">Approver configuration</h5>\r\n <p class=\"ff-section-desc mb-4\">\r\n Set level of revisions required for a store raised tickets\r\n </p>\r\n\r\n <div formArrayName=\"revision\" class=\"d-flex flex-wrap gap-5\">\r\n <div *ngFor=\"let rev of revisionArray.controls; let i = index\" [formGroupName]=\"i\"\r\n class=\"approver-option d-flex flex-column\"\r\n [class.disabled-option]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n\r\n <label class=\"custom-checkbox align-items-start\"\r\n [class.disabled-checkbox]=\"(rev.get('actionType')?.value === 'approver' && isApproverDisabled) || (rev.get('actionType')?.value === 'tango' && isTangoDisabled)\">\r\n <input type=\"checkbox\" formControlName=\"isChecked\" [id]=\"'action-' + i\" />\r\n <span class=\"checkmark\"></span>\r\n <div class=\"label-text\">\r\n <div class=\"title\">\r\n {{ rev.get('actionType')?.value | titlecase }}\r\n </div>\r\n <div class=\"desc text-muted\">\r\n <ng-container [ngSwitch]=\"rev.get('actionType')?.value\">\r\n <span *ngSwitchCase=\"'reviewer'\">The ticket undergoes a single review to verify\r\n footfall.</span>\r\n <span *ngSwitchCase=\"'approver'\">The ticket undergoes a final review after the initial\r\n check.</span>\r\n <span *ngSwitchCase=\"'tango'\">Finalize tickets and update footfall count.</span>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </label>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Store SPOC Ticket Creation -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-3\">Store SPOC Ticket Creation</h5>\r\n\r\n <div class=\"d-flex align-items-center flex-wrap gap-2\">\r\n <label class=\"mb-0\">\r\n Allow store SPOC to create tickets only for the last\r\n </label>\r\n\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\"\r\n [class.open]=\"isAllowTicketCreationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleAllowTicketCreationDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('allowTicketCreation')?.value ||\r\n spocTicketCreationdays[0] }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAllowTicketCreationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let day of spocTicketCreationdays\"\r\n (click)=\"selectAllowTicketCreation($event, day)\">\r\n {{ day }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <span class=\"mb-0\">Days</span>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Ticket Auto-close -->\r\n <div class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex align-items-center mb-2\">\r\n <h5 class=\"ff-section-title m-0\">Ticket Auto-close</h5>\r\n\r\n <label class=\"switch m-0 ms-3\" [class.disabled]=\"isEdit\">\r\n <input type=\"checkbox\" formControlName=\"isAutoCloseEnable\" [disabled]=\"isEdit\">\r\n <span class=\"slider round\"></span>\r\n </label>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <span class=\"mb-0\">\r\n Ticket should be auto-closed, if the created ticket accuracy is greater than or equal to\r\n </span>\r\n\r\n <div class=\"position-relative ff-select-wrapper compact ms-2\" [class.open]=\"isAutoCloseDropdownOpen\"\r\n [class.disabled]=\"isEdit || !footfallDirConfigurationForm.get('isAutoCloseEnable')?.value\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleAutoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('autoCloseAccuracy')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isAutoCloseDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of accuracyPercentageList\"\r\n (click)=\"selectAutoCloseAccuracy($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\">\r\n\r\n <!-- Footfall Directory Limitations -->\r\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex justify-content-between align-items-center mb-1\">\r\n <div>\r\n <h5 class=\"ff-section-title m-0\">Footfall directory limitations</h5>\r\n <p class=\"ff-section-desc mb-2\">\r\n Set maximum limitation for stores to tag non-Purchasers from Total Footfall\r\n </p>\r\n </div>\r\n\r\n <button type=\"button\" [disabled]=\"isEdit\" class=\"add-new-btn d-inline-flex align-items-center gap-2\"\r\n (click)=\"openCategoryModal('add')\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33334V12.6667M3.33334 8H12.6667\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span>Add New</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Category Cards Grid -->\r\n <div formArrayName=\"taggingLimitation\" class=\"category-grid mt-3\">\r\n <div *ngFor=\"let tag of tagLimits.controls; let i = index\" [formGroupName]=\"i\" class=\"category-card\">\r\n <div class=\"category-card-header\">\r\n <div class=\"category-icon\" [ngClass]=\"tag.get('iconName')?.value\">\r\n <ng-container [ngSwitch]=\"tag.get('iconName')?.value\">\r\n <svg *ngSwitchCase=\"'duplicateTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\"\r\n height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1162_24621)\">\r\n <path\r\n d=\"M2.5 7.5H2C1.73478 7.5 1.48043 7.39464 1.29289 7.20711C1.10536 7.01957 1 6.76522 1 6.5V2C1 1.73478 1.10536 1.48043 1.29289 1.29289C1.48043 1.10536 1.73478 1 2 1H6.5C6.76522 1 7.01957 1.10536 7.20711 1.29289C7.39464 1.48043 7.5 1.73478 7.5 2V2.5M5.5 4.5H10C10.5523 4.5 11 4.94772 11 5.5V10C11 10.5523 10.5523 11 10 11H5.5C4.94772 11 4.5 10.5523 4.5 10V5.5C4.5 4.94772 4.94772 4.5 5.5 4.5Z\"\r\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24621\">\r\n <rect width=\"12\" height=\"12\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'employeeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\r\n <path\r\n d=\"M11.1667 12.5V11.1667C11.1667 10.4594 10.8857 9.78115 10.3856 9.28105C9.88552 8.78095 9.20724 8.5 8.5 8.5H3.16667C2.45942 8.5 1.78115 8.78095 1.28105 9.28105C0.780952 9.78115 0.5 10.4594 0.5 11.1667V12.5M15.1667 12.5V11.1667C15.1662 10.5758 14.9696 10.0018 14.6076 9.53488C14.2456 9.06791 13.7388 8.73438 13.1667 8.58667M10.5 0.586667C11.0736 0.733534 11.582 1.06713 11.9451 1.53487C12.3082 2.00261 12.5052 2.57789 12.5052 3.17C12.5052 3.76211 12.3082 4.33739 11.9451 4.80513C11.582 5.27287 11.0736 5.60647 10.5 5.75333M8.5 3.16667C8.5 4.63943 7.30609 5.83333 5.83333 5.83333C4.36057 5.83333 3.16667 4.63943 3.16667 3.16667C3.16667 1.69391 4.36057 0.5 5.83333 0.5C7.30609 0.5 8.5 1.69391 8.5 3.16667Z\"\r\n stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </div>\r\n <div class=\"category-name\">\r\n {{ tag.get('name')?.value }}\r\n </div>\r\n <button\r\n *ngIf=\"(tag.get('iconName')?.value !== 'duplicateTag' && tag.get('iconName')?.value !== 'employeeTag')\"\r\n type=\"button\" class=\"category-menu-btn\" (click)=\"toggleCategoryMenu($event, i)\"\r\n [disabled]=\"isEdit\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" fill=\"none\"\r\n viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12C11 12.5523 11.4477 13 12 13Z\"\r\n fill=\"#475467\" />\r\n <path\r\n d=\"M12 21C12.5523 21 13 20.5523 13 20C13 19.4477 12.5523 19 12 19C11.4477 19 11 19.4477 11 20C11 20.5523 11.4477 21 12 21Z\"\r\n fill=\"#475467\" />\r\n </svg>\r\n </button>\r\n <div class=\"category-menu\" *ngIf=\"activeMenuIndex === i\">\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'edit', i)\">Edit Name</button>\r\n <button type=\"button\" (click)=\"onCategoryMenuAction($event, 'delete', i)\">Delete</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"category-percentage-section\">\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"openLimitDropdownIndex === i\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleLimitDropdown($event, i)\">\r\n <span>{{ tag.get('value')?.value || 0 }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"openLimitDropdownIndex === i\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectLimitValue($event, i, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Overall limitation: combined cap across all tag types (saved to API as overallLimitation, e.g. \"30%\") -->\r\n <div class=\"mt-4 ff-overall-limitation\">\r\n <h6 class=\"ff-section-title m-0\">Overall limitations</h6>\r\n <p class=\"ff-section-desc mb-2\">\r\n Combined maximum limitation across all non-Purchaser tags\r\n </p>\r\n <div class=\"position-relative ff-select-wrapper compact\"\r\n [class.open]=\"isOverallLimitationDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\"\r\n (click)=\"toggleOverallLimitationDropdown($event)\">\r\n <span>{{ overallLimitationLabel }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isOverallLimitationDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectOverallLimitation($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n\r\n <!-- Store Requests -->\r\n <div formGroupName=\"accuracyBreach\" class=\"card p-4 mb-4 ff-section-card\">\r\n <div class=\"d-flex justify-content-between align-items-start mb-4\">\r\n <div>\r\n <h5 class=\"ff-section-title mb-2\">Store Requests</h5>\r\n <p class=\"ff-section-desc mb-0\">\r\n Below stores have requested to raise a ticket after breaching the configured limit\r\n <span class=\"info-icon\">i</span>\r\n </p>\r\n </div>\r\n <button type=\"button\" class=\"btn btn-primary reset-btn d-inline-flex align-items-center gap-2\"\r\n *ngIf=\"!isEdit\" [disabled]=\"isResetDisabled\" (click)=\"openResetConfirmationModal()\" aria-live=\"polite\">\r\n <span>Reset</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Restriction Criteria -->\r\n <div class=\"restriction-criteria mb-4\">\r\n <label class=\"mb-3 d-block\">\r\n Restrict ticket creation for any store that:\r\n </label>\r\n <div class=\"d-flex align-items-center flex-nowrap gap-2\">\r\n <span>Has raised more than</span>\r\n <div class=\"position-relative ff-select-wrapper compact\" [class.open]=\"isTicketCountDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleTicketCountDropdown($event)\">\r\n <span>\r\n {{ footfallDirConfigurationForm.get('accuracyBreach.ticketCount')?.value || 1 }}\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isTicketCountDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let c of [1, 2, 3, 4, 5]\"\r\n (click)=\"selectTicketCount($event, c)\">\r\n {{ c }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>tickets in the calender</span>\r\n <div class=\"position-relative ff-select-wrapper compact store-days-select\"\r\n [class.open]=\"isStoreDaysDropdownOpen\" [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleStoreDaysDropdown($event)\">\r\n <span>{{ selectedDaysLabel }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isStoreDaysDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let opt of daysOptions\"\r\n (click)=\"selectStoreDays($event, opt)\">\r\n {{ opt.label }}\r\n </button>\r\n </div>\r\n </div>\r\n <span>based on configured conditions\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n placement=\"top\" [ngbTooltip]=\"conditionsTooltip\" tooltipClass=\"conditions-tooltip\">\r\n <g clip-path=\"url(#clip0_1432_80035)\">\r\n <path\r\n d=\"M8.00065 10.6666V7.99992M8.00065 5.33325H8.00732M14.6673 7.99992C14.6673 11.6818 11.6826 14.6666 8.00065 14.6666C4.31875 14.6666 1.33398 11.6818 1.33398 7.99992C1.33398 4.31802 4.31875 1.33325 8.00065 1.33325C11.6826 1.33325 14.6673 4.31802 14.6673 7.99992Z\"\r\n stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1432_80035\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </span>\r\n <ng-template #conditionsTooltip>\r\n <div style=\"text-align: left; font-size: 12px; line-height: 1.6;\">\r\n <b>1.</b> Delta between Store/AOM accuracy and Central Ops/Tango accuracy exceeds 10%<br>\r\n <b>2.</b> The overall accuracy after all reviews is greater than 85%.<br>\r\n <b>3.</b> Overall the Number of Images (Footfall) marked for validation in the ticket by the\r\n Store is Less than equal to 10\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Requests Table -->\r\n <div class=\"store-requests-table\" [class.disabled]=\"isEdit\"\r\n *ngIf=\"storeList?.length > 0; else emptyStoreRequests\">\r\n <div class=\"table-responsive\" [ngClass]=\"{'store-table-scroll': storeList?.length > 5}\">\r\n <table class=\"table table-hover store-requests-table-content\">\r\n <thead>\r\n <tr>\r\n <th class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" [disabled]=\"isEdit\"\r\n (change)=\"toggleSelectAll($event)\" />\r\n <span class=\"checkmark-select\"></span>\r\n\r\n </label>\r\n </th>\r\n <th class=\"sortable store-name-column\">\r\n <div class=\"d-flex align-items-center\">\r\n <span>Select all stores ({{ storeList?.length || 0 }})</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" class=\"ms-2 dropdown-arrow\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th class=\"sortable\">\r\n Raised on\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n Last raised(Approved)\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th class=\"sortable\">\r\n No of Time Raised\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\"\r\n fill=\"none\" class=\"ms-1 sort-icon\">\r\n <path d=\"M3 4.5L6 1.5L9 4.5M3 7.5L6 10.5L9 7.5\" stroke=\"#344054\"\r\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let store of storeList\">\r\n <td class=\"checkbox-column\">\r\n <label class=\"custom-checkbox-select d-flex align-items-center mb-0\">\r\n <input #cb type=\"checkbox\" [checked]=\"isStoreSelected(store)\" [disabled]=\"isEdit\"\r\n (change)=\"toggleStoreSelection(store, cb.checked)\" />\r\n <span class=\"checkmark-select\"></span>\r\n </label>\r\n </td>\r\n <td>{{ store.storeName }}</td>\r\n <td>{{ store.raisedOn }}</td>\r\n <td>{{ store.lastApproved || '-' }}</td>\r\n <td>{{ store.totalRaised }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <ng-template #emptyStoreRequests>\r\n <div class=\"empty-store-state text-center\">\r\n <div class=\"empty-store-icon mb-3\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M8.94629 21.1995C8.645 21.2313 8.33828 21.2502 8.02734 21.2502C7.85782 21.2502 7.69052 21.2434 7.52539 21.2336V31.6067C7.52539 33.0347 8.70837 34.2258 10.1963 34.2258H29.8008C31.2888 34.2258 32.4717 33.0347 32.4717 31.6067V21.2346C32.3098 21.2438 32.1459 21.2502 31.9814 21.2502C31.6675 21.2502 31.3569 21.2323 31.0508 21.1995V28.9875H8.94629V21.1995ZM30.9277 5.77368H9.06934C8.89197 5.77368 8.73671 5.86647 8.65918 5.98755L8.65723 5.9895L5.14746 11.4729L5.05273 11.6204C3.82719 13.7402 5.0918 16.4671 7.44336 16.7766C7.64428 16.8011 7.83403 16.8157 8.02148 16.8157C9.25156 16.8157 10.3395 16.287 11.0967 15.4651L12.0186 14.4641L12.9375 15.468C13.6864 16.2861 14.7731 16.8157 16.0107 16.8157C17.2428 16.8156 18.3347 16.2854 19.083 15.468L20.0049 14.4612L20.9268 15.468C21.6751 16.2855 22.7668 16.8157 23.999 16.8157C25.2312 16.8157 26.3229 16.2854 27.0713 15.468L27.9932 14.4612L28.915 15.468C29.6634 16.2855 30.756 16.8157 31.9883 16.8157C32.1697 16.8157 32.3648 16.8018 32.5645 16.7776H32.5635C34.9572 16.4571 36.2254 13.6075 34.8574 11.4729L34.8564 11.4739L31.3398 5.99048L31.3389 5.98755C31.2614 5.86628 31.1053 5.77368 30.9277 5.77368Z\"\r\n stroke=\"#009BF3\" stroke-width=\"2.5\" />\r\n </svg>\r\n </div>\r\n <p class=\"mb-0 fw-semibold text-muted\">No reset request from store</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <hr class=\"ff-divider\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n\r\n <!-- Send Ticket to Tango -->\r\n <div *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\" class=\"card p-4 mb-4 ff-section-card\">\r\n <h5 class=\"ff-section-title mb-1\">Send Ticket to Tango</h5>\r\n <div class=\"d-flex align-items-center mt-2\">\r\n <label class=\"me-2 mb-0 tango-label\">Send ticket to Tango if accuracy falls below</label>\r\n <div class=\"position-relative ff-select-wrapper compact ms-0\" [class.open]=\"issendTangoDropdownOpen\"\r\n [class.disabled]=\"isEdit\">\r\n <button type=\"button\" class=\"ff-select-toggle small\" (click)=\"toggleSendTangoCloseDropdown($event)\">\r\n <span>{{ footfallDirConfigurationForm.get('tangoReview')?.value || '1%' }}</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"issendTangoDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of sendTicketTango\"\r\n (click)=\"selectSendTicketTango($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Actions -->\r\n <div *ngIf=\"!isEdit\">\r\n <div class=\"mb-5 w-100 footer-seperator\"></div>\r\n <div class=\"d-flex justify-content-end\">\r\n <a type=\"button\" class=\"btn btn-outline mt-1 pt-3 me-4\" (click)=\"onCancel()\">Cancel</a>\r\n <a type=\"submit\" class=\"btn btn-primary px-4\" (click)=\"onSubmit()\"><span>Save Changes</span></a>\r\n </div>\r\n </div>\r\n\r\n <!-- Category Modal -->\r\n <ng-template #categoryModal>\r\n <div class=\"modal-header border-0 pb-0\">\r\n <h5 class=\"modal-title\">\r\n {{ categoryModalMode === 'add' ? 'Add New Category' : 'Edit Category' }}\r\n </h5>\r\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"closeCategoryModal()\"></button>\r\n </div>\r\n <div class=\"modal-body category-modal-body\">\r\n <form [formGroup]=\"categoryForm\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Icon</label>\r\n <div class=\"ff-select-wrapper icon-select\" [class.open]=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryIconDropdown($event)\">\r\n <span class=\"d-inline-flex align-items-center gap-2\">\r\n <span class=\"category-icon\"\r\n [ngClass]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <ng-container\r\n [ngSwitch]=\"categoryForm.get('iconName')?.value || baseCategoryIcons[0]?.value\">\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_icon_housekeeping)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_icon_housekeeping\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span class=\"icon-label\">{{ selectedCategoryIconLabel }}</span>\r\n </span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryIconDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option d-flex align-items-center gap-2\"\r\n *ngFor=\"let icon of categoryIcons\"\r\n (click)=\"selectCategoryIconFromDropdown($event, icon.value)\">\r\n <span class=\"category-icon\" [ngClass]=\"icon.value\">\r\n <ng-container [ngSwitch]=\"icon.value\">\r\n <svg *ngSwitchCase=\"'purpleTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'orangeTag'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"18\"\r\n height=\"18\" fill=\"none\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M20.7071 13.2929L11.4142 4H4V11.4142L13.2929 20.7071C13.6834 21.0976 14.3166 21.0976 14.7071 20.7071L20.7071 14.7071C21.0976 14.3166 21.0976 13.6834 20.7071 13.2929Z\"\r\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path d=\"M7 7H7.01\" stroke=\"currentColor\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg *ngSwitchCase=\"'houseKeepingTag'\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <g clip-path=\"url(#clip0_1162_24650)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M7.04983 0.544947C7.74738 -0.181649 8.87829 -0.181649 9.57584 0.544947L15.4697 6.6844C16.1672 7.41101 16.1672 8.58904 15.4697 9.31565L9.57584 15.4551C8.87829 16.1816 7.74738 16.1816 7.04983 15.4551L5.36562 13.7007L3.82179 15.3088C3.12426 16.0354 1.99334 16.0354 1.2958 15.3088C0.598272 14.5823 0.598272 13.4042 1.2958 12.6777L2.83964 11.0695L1.15596 9.31565C0.458429 8.58904 0.458429 7.41101 1.15596 6.6844L7.04983 0.544947ZM8.73381 1.42203C8.50129 1.17983 8.1243 1.17983 7.89178 1.42203L3.68165 5.80762L10.4175 12.8242L14.6277 8.43854C14.8602 8.19634 14.8602 7.80363 14.6277 7.56151L11.6805 4.49143L10.6981 5.51469C10.4656 5.75689 10.0887 5.75689 9.85614 5.51469C9.62363 5.27249 9.62363 4.87981 9.85614 4.63761L10.8384 3.61435L9.99665 2.73746L7.611 5.22252C7.37849 5.46471 7.00149 5.46471 6.76897 5.22252C6.53646 4.98032 6.53646 4.58763 6.76897 4.34544L9.15462 1.86038L8.73381 1.42203ZM9.57552 13.7012L2.83966 6.6847L1.99796 7.56151C1.76544 7.80363 1.76544 8.19634 1.99796 8.43854L7.89178 14.578C8.1243 14.8202 8.50129 14.8202 8.73381 14.578L9.57552 13.7012ZM3.68156 11.9466L2.1378 13.5547C1.90529 13.7969 1.90529 14.1896 2.1378 14.4318C2.37031 14.674 2.74729 14.674 2.9798 14.4318L4.52355 12.8237L3.68156 11.9466Z\"\r\n fill=\"currentColor\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1162_24650\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg *ngSwitchCase=\"'junkTag'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2 4.00004H3.33333M3.33333 4.00004H14M3.33333 4.00004V13.3334C3.33333 13.687 3.47381 14.0261 3.72386 14.2762C3.97391 14.5262 4.31304 14.6667 4.66667 14.6667H11.3333C11.687 14.6667 12.0261 14.5262 12.2761 14.2762C12.5262 14.0261 12.6667 13.687 12.6667 13.3334V4.00004H3.33333ZM5.33333 4.00004V2.66671C5.33333 2.31309 5.47381 1.97395 5.72386 1.7239C5.97391 1.47385 6.31304 1.33337 6.66667 1.33337H9.33333C9.68696 1.33337 10.0261 1.47385 10.2761 1.7239C10.5262 1.97395 10.6667 2.31309 10.6667 2.66671V4.00004M6.66667 7.33337V11.3334M9.33333 7.33337V11.3334\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n </span>\r\n <span>{{ icon.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-3\">\r\n <label class=\"form-label text-muted\">Category Name</label>\r\n <input type=\"text\" class=\"form-control\"\r\n [class.is-invalid]=\"categoryForm.get('name')?.invalid && categoryForm.get('name')?.touched\"\r\n placeholder=\"Enter your new category\" formControlName=\"name\" />\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('required') && categoryForm.get('name')?.touched\">\r\n Category name is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"categoryForm.get('name')?.hasError('duplicate') && categoryForm.get('name')?.touched\">\r\n Category name already exists.\r\n </small>\r\n </div>\r\n\r\n <div class=\"mb-2\">\r\n <label class=\"form-label text-muted\">Limitation</label>\r\n <div class=\"ff-select-wrapper\" [class.open]=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-toggle\" (click)=\"toggleCategoryLimitDropdown($event)\">\r\n <span>{{ categoryForm.get('limit')?.value || percentageList[0] }}%</span>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 6L8 10L12 6\" stroke=\"#475467\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n <div class=\"ff-select-menu\" *ngIf=\"isCategoryLimitDropdownOpen\">\r\n <button type=\"button\" class=\"ff-select-option\" *ngFor=\"let p of percentageList\"\r\n (click)=\"selectCategoryLimitValue($event, p)\">\r\n {{ p }}%\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"modal-footer border-0 pt-0\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeCategoryModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"submitCategoryForm()\">\r\n {{ categoryModalMode === 'add' ? 'Create' : 'Save' }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Delete Confirmation Modal -->\r\n <ng-template #deleteCategoryModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Confirmation</h5>\r\n <p class=\"mb-4 text-muted\">\r\n You're about to delete <span class=\"fw-semibold\">{{ categoryPendingDeleteName }}</span> category.\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeDeleteModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-danger\" (click)=\"confirmDeleteCategory()\">Delete</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Reset Store Requests Confirmation Modal -->\r\n <ng-template #resetConfirmationModal>\r\n <div class=\"modal-body text-center p-4\">\r\n <h5 class=\"fw-semibold mb-2\">Reset Store Requests</h5>\r\n <p class=\"mb-4 text-muted\">\r\n Are you sure you want to proceed with resetting the selected <span class=\"fw-semibold\">{{\r\n resetRequest.arrayOfStores.length }}</span> store(s) requests?\r\n </p>\r\n <div class=\"d-flex justify-content-center gap-3\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"closeResetModal()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"confirmResetStoreRequest()\">Reset</button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n</form>\r\n", styles: ["::ng-deep .conditions-tooltip .tooltip-inner{max-width:450px;text-align:left;padding:10px 14px;font-size:12px;line-height:1.6}form{padding:32px 20px;border-radius:16px;font-family:Inter,Segoe UI,sans-serif}.ff-section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;box-shadow:0 1px 4px #0f172a0a}.ff-section-title{font-size:16px;font-weight:600;color:#101828}.ff-section-desc{font-size:13px;color:#667085}.ff-divider{margin:8px 24px;border-color:#e4e7ec}.form-check{display:flex;align-items:center;gap:10px}.form-check-input{width:42px;height:22px;cursor:pointer;accent-color:#2563eb;border:1px solid #d1d5db;transition:all .2s ease-in-out}.form-check-input:checked{background-color:#2563eb;border-color:#2563eb}.form-check-input:disabled{opacity:.6;cursor:not-allowed}input[type=radio].form-check-input{width:16px;height:16px;accent-color:#2563eb}input[type=radio]:checked{border-color:#2563eb}select.form-select{border:1px solid #d1d5db;border-radius:8px;height:38px;font-size:14px;color:#374151;padding:6px 10px;outline:none;transition:.2s}select.form-select:focus{border-color:#2563eb;box-shadow:0 0 0 3px #2563eb1a}.btn-outline{background-color:#fff;border:1px solid #d1d5db;color:#374151;padding:6px 16px;border-radius:8px;transition:all .2s}.btn-outline:hover{background:#f9fafb}.btn-primary{background-color:#2563eb;border:none;color:#fff;border-radius:8px;padding:6px 16px;transition:.2s}.btn-primary:hover{background-color:#1e40af}.approver-option{display:flex;flex-direction:column;justify-content:flex-start;width:220px}.custom-checkbox{position:relative;display:flex;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.custom-checkbox input[type=checkbox]{position:absolute;opacity:0;cursor:pointer}.custom-checkbox .checkmark{height:18px;width:18px;min-width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease}.custom-checkbox input:checked~.checkmark{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.label-text{display:flex;flex-direction:column}.label-text .title{font-weight:600;color:#101828}.label-text .desc{font-size:13px;color:#667085;margin-top:2px;max-width:190px;line-height:1.4}.custom-checkbox input:not(:checked)~.label-text .desc{opacity:.6}.approver-option.disabled-option{opacity:.6;pointer-events:none}.approver-option.disabled-option .custom-checkbox.disabled-checkbox{cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .checkmark{background-color:#f3f4f6;border-color:#d1d5dd;cursor:not-allowed}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark{background-color:#f3f4f6;border-color:#d1d5dd}.approver-option.disabled-option .custom-checkbox.disabled-checkbox input:checked~.checkmark:after{content:\"\";position:absolute;left:7px;top:2px;width:5px;height:10px;border:solid #9ca3af;border-width:0 2px 2px 0;transform:rotate(45deg);opacity:.5}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .title{color:#9ca3af}.approver-option.disabled-option .custom-checkbox.disabled-checkbox .label-text .desc{color:#d1d5dd}.switch{position:relative;display:inline-block;width:44px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ddd;transition:.3s;border-radius:22px}.slider:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}input:checked+.slider{background-color:#4c9aff}input:checked+.slider:before{transform:translate(21px)}.switch.disabled{opacity:.6;cursor:not-allowed;pointer-events:none}.switch.disabled .slider{cursor:not-allowed;background-color:#e5e7eb}.switch.disabled input:checked+.slider{background-color:#7dd3fc}.category-grid{display:flex;flex-wrap:wrap;gap:12px}.category-card{min-width:180px;border:1px solid #e5e7eb;border-radius:10px;padding:12px;background-color:#fff;box-shadow:0 1px 3px #1018280f;position:relative;display:flex;flex-direction:column;gap:12px}.category-card-header{display:flex;align-items:center;gap:10px}.category-icon{width:32px;height:32px;min-width:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.category-name{font-weight:500;color:#101828;font-size:14px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-percentage-section{width:100%}.category-percentage-section .ff-select-wrapper.compact{width:100%;min-width:auto}.category-percentage-section .ff-select-toggle.small{width:100%;min-height:36px;padding:6px 10px;font-size:13px}.ff-overall-limitation .ff-select-wrapper.compact{width:160px;min-width:160px;max-width:160px}.category-menu-btn{border:none;background:transparent;padding:4px;line-height:1;cursor:pointer;flex-shrink:0;margin-left:4px;display:inline-flex;align-items:center;justify-content:center}.category-menu-btn:disabled{cursor:default}.category-menu{position:absolute;top:48px;right:16px;background:#fff;border:1px solid #e4e7ec;border-radius:10px;box-shadow:0 12px 30px #0f172a26;min-width:140px;z-index:5;padding:4px}.category-menu button{width:100%;text-align:left;background:transparent;border:none;padding:8px 10px;border-radius:8px;font-size:13px;color:#101828}.category-menu button:hover{background:#f4f7fb}.duplicateTag{background:#4755691f;color:#475569}.employeeTag{background:#3b82f61f;color:#3b82f6}.houseKeepingTag{background:#22c55e1f;color:#22c55e}.junkTag{background:#ef44441f;color:#ef4444}.purpleTag{background:#7c3aed1f;color:#7c3aed}.orangeTag{background:#ea580c1f;color:#ea580c}.add-new-btn{background:#fff;border:1px solid #d0d5dd;border-radius:10px;padding:5px 13px;font-size:14px;font-weight:600;color:#101828;transition:all .2s ease;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:0 1px 2px #1018280d}.add-new-btn:hover:not(:disabled){background:#f9fafb;border-color:#004aad;color:#004aad;box-shadow:0 2px 4px #10182814}.add-new-btn:active:not(:disabled){background:#f4f7fb;transform:translateY(1px);box-shadow:0 1px 2px #1018280d}.add-new-btn:disabled{opacity:.6;cursor:not-allowed;background:#f9fafb;border-color:#e5e7eb;color:#9ca3af}.add-new-btn svg{transition:transform .2s ease;flex-shrink:0}.add-new-btn:hover:not(:disabled) svg{transform:rotate(90deg)}.info-icon{display:inline-flex;justify-content:center;align-items:center;width:18px;height:18px;font-size:11px;font-weight:600;border-radius:50%;background:#f3f3f3;color:#555;cursor:pointer;margin-left:6px;border:1.5px solid #8a8a8a}.tango-label{font-size:13px;color:#475467;font-weight:500}.store-requests-section{background:#fff;border:1px solid #e5e7eb;border-radius:10px}.reset-btn{border-width:1px;border-color:#d0d5dd;color:#004aad;font-weight:600;padding:6px 18px;background-color:#fff;transition:all .2s ease}.reset-btn svg path{stroke:currentColor}.reset-btn .spinner-border{color:#004aad}.reset-btn:disabled{opacity:.6;cursor:not-allowed}.reset-btn:not(:disabled):hover{background-color:#f4f7fb;border-color:#004aad;box-shadow:0 1px 2px #1018280f}.restriction-criteria{padding:16px 0;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb}.custom-checkbox-select{position:relative;display:flex;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-checkbox-select input[type=checkbox]{position:absolute;opacity:0;cursor:pointer;width:0;height:0}.checkmark-select{height:18px;width:18px;border:none;outline:1px solid var(--primary-600, #00A3FF);border-radius:4px;display:inline-block;background:var(--primary-50, #EAF8FF);transition:all .2s ease;position:relative}.custom-checkbox-select input:checked~.checkmark-select{background-color:var(--primary-50, #EAF8FF);border-color:var(--primary-600, #00A3FF)}.custom-checkbox-select input:checked~.checkmark-select:after{content:\"\";position:absolute;left:7px;top:3px;width:5px;height:10px;border:solid #00A3FF;border-width:0 2px 2px 0;transform:rotate(45deg)}.dropdown-arrow{cursor:pointer;transition:transform .2s}.dropdown-arrow:hover{transform:translateY(2px)}.store-requests-table{margin-top:16px;position:relative;border:1px solid #e5e7eb;border-radius:10px;overflow:hidden}.store-requests-table.disabled{pointer-events:none;opacity:.6;-webkit-user-select:none;user-select:none}.store-requests-table-content{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:0}.store-requests-table-content thead{background:linear-gradient(180deg,#f0f6ff,#f7f9fc)}.store-requests-table-content thead th{padding:14px 16px;font-weight:600;font-size:12px;color:#475467;text-align:left;border-bottom:1px solid #e5e7eb;white-space:nowrap;vertical-align:middle;text-transform:uppercase;letter-spacing:.04em}.store-requests-table-content tbody td{padding:14px 16px;font-size:13px;color:#344054;border-bottom:1px solid #f2f4f7;vertical-align:middle}.store-requests-table-content tbody tr{transition:background .15s}.store-requests-table-content tbody tr:hover{background-color:#f8fbff}.store-requests-table-content tbody tr:last-child td{border-bottom:none}.store-table-scroll{max-height:360px;overflow-y:auto}.store-table-scroll table{margin-bottom:0}.store-table-scroll .store-requests-table-content thead th{position:sticky;top:0;z-index:2;background:#f0f6ff}.checkbox-column{width:50px;padding-left:16px!important;padding-right:0!important}.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative}.sortable:hover{background-color:#e8eef8}.sort-icon{opacity:.5;transition:opacity .2s}.sortable:hover .sort-icon{opacity:1}.store-name-column{min-width:240px}.store-name-column .column-header{justify-content:space-between}.store-name-column .select-all-row{padding-top:8px;margin-top:8px;border-top:1px solid #e5e7eb}.empty-store-state{border:1px dashed #c7d7f0;border-radius:12px;padding:40px 16px;background:#f9fbff;display:flex;flex-direction:column;align-items:center;justify-content:center}.empty-store-icon{display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;background:#2e90fa1f}.store-days-select .ff-select-toggle{min-width:99px}.store-days-select .ff-select-toggle span{white-space:nowrap}.ff-select-wrapper{width:100%;position:relative}.ff-select-wrapper.compact{width:auto;min-width:80px}.ff-select-wrapper.disabled{pointer-events:none;opacity:.7}.ff-select-wrapper.open .ff-select-toggle svg{transform:rotate(180deg)}.ff-select-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid #d0d5dd;border-radius:10px;padding:8px 12px;background:#fff;font-weight:600;color:#101828;min-height:40px}.ff-select-toggle.small{min-height:36px;padding:6px 10px;font-size:13px}.ff-select-toggle svg{transition:transform .2s ease}.ff-select-menu{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#fff;border:1px solid #e4e7ec;border-radius:12px;box-shadow:0 16px 40px #0f172a26;max-height:220px;overflow-y:auto;z-index:15;padding:4px}.ff-select-option{width:100%;text-align:left;border:none;background:transparent;padding:8px 10px;border-radius:8px;font-size:14px;color:#101828}.ff-select-option:hover{background:#f4f7fb}.category-modal-body .form-control,.category-modal-body .form-select{border-radius:10px;min-height:44px}.category-modal-body .form-label{font-size:13px}.category-modal-body .text-danger{font-size:12px}.custom-modal{border-radius:16px;padding:10px 20px 20px;background:#fff;box-shadow:0 10px 40px #00000014;width:500px}.field-label{color:#8b8b8b;font-size:14px;margin-bottom:4px;display:block}.input-box{width:100%;height:46px;border:1px solid #e5e7eb;border-radius:10px;padding:0 14px;font-size:15px;background:#f8fafc;display:flex;align-items:center}.input-box:focus-within{border-color:#4daeff;background:#fff;box-shadow:0 0 0 2px #4daeff26}.icon-row{display:flex}.icon-box{width:60px;cursor:pointer;justify-content:space-between}.clean-select{border:none;width:100%;height:100%;background:transparent;font-size:15px;outline:none}.select-box{padding:0}.button-area{display:flex;justify-content:space-between;gap:15px}.btn-cancel{width:50%;height:46px;border-radius:10px;border:1px solid #dbdbdb;background:#fff;font-weight:500;cursor:pointer}.btn-create{width:50%;height:46px;border-radius:10px;border:none;background:#0094ff;color:#fff;font-weight:600;cursor:pointer}.btn-create:hover{background:#007bdb}.card .btn-outline.btn-sm{padding:6px 10px;border-radius:8px}\n"] }]
|
|
865
865
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.GlobalStateService }, { type: i3.ClientApiService }, { type: i4.NgbModal }, { type: i5.ToastService }], propDecorators: { categoryModalTpl: [{
|
|
866
866
|
type: ViewChild,
|
|
867
867
|
args: ['categoryModal']
|
|
@@ -875,4 +875,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
875
875
|
type: HostListener,
|
|
876
876
|
args: ['document:click']
|
|
877
877
|
}] } });
|
|
878
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sOEJBQThCO0lBeURyQjtJQUNYO0lBQ0M7SUFDQTtJQUNBO0lBNURWLDRCQUE0QixDQUFhO0lBQ3hCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLFlBQVksR0FBbUY7UUFDN0YsUUFBUSxFQUFFLEVBQUU7UUFDWixhQUFhLEVBQUUsRUFBRTtLQUNsQixDQUFDO0lBQ0Ysc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDOUIsc0JBQXNCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLGVBQWUsR0FBYSxFQUFFLENBQUM7SUFDL0IsZUFBZSxHQUFhLEVBQUUsQ0FBQztJQUMvQixNQUFNLEdBQVksSUFBSSxDQUFDO0lBQ3ZCLE9BQU8sQ0FBUztJQUNoQixTQUFTLEdBQVEsRUFBRSxDQUFDO0lBQ3BCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsWUFBWSxDQUFhO0lBQ3pCLGlCQUFpQixHQUFtQixLQUFLLENBQUM7SUFDMUMsb0JBQW9CLEdBQWtCLElBQUksQ0FBQztJQUMzQyxnQkFBZ0IsR0FBdUIsSUFBSSxDQUFDO0lBQzVDLGNBQWMsR0FBdUIsSUFBSSxDQUFDO0lBQzFDLGFBQWEsR0FBdUIsSUFBSSxDQUFDO0lBQ3pDLHFCQUFxQixHQUFrQixJQUFJLENBQUM7SUFDNUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDO0lBQy9CLGVBQWUsR0FBa0IsSUFBSSxDQUFDO0lBQ3RDLHNCQUFzQixHQUFrQixJQUFJLENBQUM7SUFDN0MsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztJQUNuQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDaEMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztJQUNsQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDaEMsV0FBVyxHQUF1QztRQUNoRCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtRQUMvQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtLQUM5QixDQUFDO0lBQ0YsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLGlDQUFpQyxHQUFHLEtBQUssQ0FBQztJQUMxQywrQkFBK0IsR0FBRyxLQUFLLENBQUM7SUFDaEMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQy9CLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUNyQixpQkFBaUIsR0FBTztRQUMvQiwyQ0FBMkM7UUFDM0MsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7UUFDM0MsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7S0FDNUMsQ0FBQztJQUVPLHVCQUF1QixHQUFHO1FBQ2pDLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUU7UUFDcEQsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDcEMsQ0FBQztJQUVGLGtCQUFrQixHQUFRLEVBQUUsQ0FBQztJQUNELGdCQUFnQixDQUFvQjtJQUM5QixzQkFBc0IsQ0FBb0I7SUFDdkMseUJBQXlCLENBQW9CO0lBRWxGLFlBQW9CLEVBQWUsRUFDMUIsRUFBc0IsRUFDckIsVUFBNEIsRUFDNUIsWUFBc0IsRUFDdEIsS0FBbUI7UUFKVCxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQzFCLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQ3JCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4RSxJQUFJLENBQUMsRUFBRTtnQkFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQTtnQkFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLG1EQUFtRDtnQkFDbkQscUNBQXFDO2FBQ3RDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5RSxJQUFJLEdBQUcsRUFBRTtnQkFDUCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssMEJBQTBCLEVBQUU7b0JBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUMxQjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsOERBQThEO0lBQzlELHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QsTUFBTTtJQUNOLDRGQUE0RjtJQUM1Rix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGtFQUFrRTtJQUNsRSxrRUFBa0U7SUFDbEUsMkVBQTJFO0lBQzNFLHFEQUFxRDtJQUNyRCxZQUFZO0lBQ1osVUFBVTtJQUNWLFNBQVM7SUFDVCx3QkFBd0I7SUFDeEIsK0RBQStEO0lBQy9ELFFBQVE7SUFDUixRQUFRO0lBQ1IsSUFBSTtJQUVKLGtCQUFrQixDQUFDLEtBQWE7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFQSxxQkFBcUIsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsdUJBQXVCLENBQUMsR0FBVztRQUNqQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBVztRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELFFBQVE7UUFDTixrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDM0IsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDMUIsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkIsaUJBQWlCLEVBQUMsRUFBRTtZQUNwQixpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEMsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUM1QixXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxFQUFFO2dCQUNSLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNmLENBQUM7WUFDRixXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDbEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFTO1FBQ2pCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixpQkFBaUI7UUFDakIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQWMsQ0FBQztRQUNyRixhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNsQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMzRSxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQscUVBQXFFO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQWMsQ0FBQztRQUN6RixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEdBQUcsQ0FBQztZQUNqRixJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQyxvREFBb0Q7WUFDcEQsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDdkQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEcsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxHQUFHLENBQUM7WUFDeEYsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMseUVBQXlFO1lBQ3pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFXLEVBQUUsT0FBWSxFQUFFLEVBQUU7Z0JBQzlFLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO29CQUN0QyxPQUFPLE1BQU0sQ0FBQztpQkFDZjtnQkFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtvQkFDcEMsT0FBTyxPQUFPLENBQUM7aUJBQ2hCO2dCQUNELE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3JELENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVULElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDekQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFDdEMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hHLENBQUMsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUVELDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQztnQkFDbEUsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVztnQkFDNUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLElBQUk7Z0JBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVE7YUFDdkMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsQ0FBQztZQUMzQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQztZQUNsRCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLElBQUksS0FBSztZQUNsRCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLElBQUksS0FBSztZQUNsRCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLElBQUksRUFBRTtZQUMvQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLO1NBQ3ZDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1Qyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQW9CLEVBQUUsS0FBYztRQUNwRCxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDdEUsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRXJFLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBYyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUN6QixRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2pGLElBQUksRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNoRixLQUFLLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7YUFDbkUsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ3pDLElBQUksRUFBRSxFQUFFO2dCQUNSLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzthQUM5QixDQUFDLENBQUM7U0FDSjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDcEUsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSTtZQUNWLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFO1lBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQyxPQUFPO1NBQ1I7UUFFRCxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMxRCxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4QyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDdkQsT0FBTztTQUNSO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQ3JFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssV0FBVyxDQUFDLFdBQVcsRUFBRTtZQUNwRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQzFDLENBQUM7UUFFRixJQUFJLGNBQWMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzdCLE9BQU87U0FDUjtRQUVELG1DQUFtQztRQUNuQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEtBQUssUUFBUSxDQUN6QyxDQUFDO1lBRUYsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7Z0JBQzNFLE9BQU87YUFDUjtTQUNGO2FBQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7WUFDbEYsa0ZBQWtGO1lBQ2xGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxvQkFBb0IsQ0FDOUUsQ0FBQztZQUVGLElBQUksWUFBWSxFQUFFO2dCQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2dCQUMzRSxPQUFPO2FBQ1I7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLEtBQUssRUFBRTtZQUNwQyxxREFBcUQ7WUFDckQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7U0FDOUQ7YUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7WUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFjLENBQUM7WUFDaEYsYUFBYSxDQUFDLFVBQVUsQ0FBQztnQkFDdkIsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNwQixRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtRQUNELElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQWE7UUFDbkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQWMsQ0FBQztRQUM1RCxJQUFJLENBQUMseUJBQXlCLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLElBQUksZUFBZSxDQUFDO1FBQ3JGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ3hFLFFBQVEsRUFBRSxJQUFJO1lBQ2QsSUFBSSxFQUFFLElBQUk7WUFDVixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLElBQUksRUFBRTtZQUN2QyxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxTQUFpQjtRQUNsQyxtQ0FBbUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssS0FBSyxFQUFFO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FDMUMsQ0FBQztZQUVGLElBQUksWUFBWSxFQUFFO2dCQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2dCQUMzRSxPQUFPO2FBQ1I7U0FDRjthQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQ2xGLGtGQUFrRjtZQUNsRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQy9FLENBQUM7WUFFRixJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0RBQWdELENBQUMsQ0FBQztnQkFDM0UsT0FBTzthQUNSO1NBQ0Y7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGtCQUFrQixDQUFDLEtBQVksRUFBRSxLQUFhO1FBQzVDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN2RSxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBWSxFQUFFLE1BQXlCLEVBQUUsS0FBYTtRQUN6RSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdkM7YUFBTTtZQUNMLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUM3QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFZLEVBQUUsS0FBYSxFQUFFLEtBQWE7UUFDekQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7SUFDckMsQ0FBQztJQUVELDJCQUEyQixDQUFDLEtBQVk7UUFDdEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUN2RSxDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FBWSxFQUFFLEtBQWE7UUFDbEQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxLQUFZO1FBQ2xDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDN0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3ZCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxDQUFDO0lBRUQsNEJBQTRCLENBQUMsS0FBWTtRQUN2QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQy9ELENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUNqRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPO1NBQ1I7UUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUM5QixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELHFCQUFxQixDQUFDLEtBQVksRUFBRSxLQUFhO1FBQy9DLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPO1NBQ1I7UUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUM5QixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQVk7UUFDcEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztJQUNuRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsS0FBWSxFQUFFLEtBQWE7UUFDM0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7SUFDekMsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQVk7UUFDbEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUMvRCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVksRUFBRSxNQUF3QztRQUNwRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPO1NBQ1I7UUFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDekYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sS0FBSyxFQUFFLEtBQUssSUFBSSxPQUFPLENBQUM7SUFDakMsQ0FBQztJQUVELDJCQUEyQixDQUFDLEtBQVk7UUFDdEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQywyQkFBMkIsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUN2RSxDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBWSxFQUFFLEtBQWE7UUFDN0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTztTQUNSO1FBQ0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDOUIsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCxpQ0FBaUMsQ0FBQyxLQUFZO1FBQzVDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsaUNBQWlDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUM7SUFDbkYsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQVksRUFBRSxLQUFhO1FBQ25ELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU87U0FDUjtRQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsaUNBQWlDLEdBQUcsS0FBSyxDQUFDO0lBQ2pELENBQUM7SUFFRCwrQkFBK0IsQ0FBQyxLQUFZO1FBQzFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsK0JBQStCLEdBQUcsQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUM7SUFDL0UsQ0FBQztJQUVELHVCQUF1QixDQUFDLEtBQVksRUFBRSxLQUFhO1FBQ2pELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU87U0FDUjtRQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO1FBQ2pFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLCtCQUErQixHQUFHLEtBQUssQ0FBQztJQUMvQyxDQUFDO0lBRUQsOEZBQThGO0lBQzlGLElBQUksc0JBQXNCO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDaEYsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDOUMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7UUFDbEYsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7UUFFbEYsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFO1lBQ3hCLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQ3pELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEQsMkRBQTJEO1lBQzNELE9BQU8sZUFBZSxFQUFFLFFBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQztTQUN0RDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixxQ0FBcUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2hFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNELEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUNyRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0QsVUFBVTtRQUNSLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEtBQUssQ0FBQztRQUMvQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxLQUFLLENBQUM7SUFDL0MsQ0FBQztJQUVELDBCQUEwQixDQUFDLEtBQVk7UUFDckMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQywwQkFBMEIsR0FBRyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQztJQUNyRSxDQUFDO0lBRUQsOEJBQThCLENBQUMsS0FBWSxFQUFFLFNBQWlCO1FBQzVELEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztJQUMxQyxDQUFDO0lBRUQsNEJBQTRCLENBQUMsT0FBZTtRQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzlGLHlGQUF5RjtZQUN2RixJQUFJLEVBQUMsQ0FBQyxHQUFRLEVBQUMsRUFBRTtnQkFDakIsSUFBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksSUFBRSxLQUFLLEVBQUM7b0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUM7aUJBQ3BDO3FCQUFJO29CQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2lCQUNyQjtZQUNGLENBQUM7WUFDQSxLQUFLLEVBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwRCxDQUFDO1NBQ0gsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUdELFVBQVU7SUFDVixJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFjLENBQUM7SUFDeEUsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBYyxDQUFDO0lBQ2pGLENBQUM7SUFHRCxjQUFjLENBQUMsVUFBa0IsRUFBRSxTQUFrQjtRQUNuRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQztZQUN4QixTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUM7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQUUsSUFBYSxFQUFFLEdBQVk7UUFDdkYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDZCxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ1osR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQVUsRUFBRSxPQUFnQjtRQUMvQyxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1NBQ2hHO2FBQU0sSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQ3hFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQ25DLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsS0FBVTtRQUN4QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDdkcsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxlQUFlLENBQUMsS0FBWTtRQUMxQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksT0FBTyxFQUFFO1lBQ1gsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pELE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2FBQzdCLENBQUMsQ0FBQyxDQUFDO1lBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDNUQ7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDOUM7SUFDSCxDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBRTVFLElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN2RDtRQUVELElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRTtZQUN4QixtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFO2dCQUNyQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wseUNBQXlDO2dCQUN6QyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3pEO1lBRUQsbURBQW1EO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7Z0JBQ2pDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQzNGLElBQUksT0FBTyxFQUFFO3dCQUNYLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7cUJBQ3pEO3lCQUFNO3dCQUNMLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7d0JBQ3pELFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztxQkFDakU7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQzthQUNyQztTQUNGO0lBQ0gsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQiwrREFBK0Q7WUFDL0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7WUFDbEYsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7WUFFbEYseUVBQXlFO1lBQ3pFLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFO2dCQUM3RCxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDakU7WUFFRCxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0Msb0ZBQW9GO1lBQ3BGLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1NBQ25DO2FBQU07WUFDTCxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUMsMkRBQTJEO1lBQzNELDZEQUE2RDtZQUM3RCxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUNuQztJQUNILENBQUM7SUFDRCxnQ0FBZ0M7SUFDaEMsMEJBQTBCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUMvRCxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUMxRSxRQUFRLEVBQUUsSUFBSTtZQUNkLElBQUksRUFBRSxJQUFJO1lBQ1YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLHdCQUF3QjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDL0QsT0FBTztTQUNSO1FBQ0QsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO2FBQ3ZELElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUMsQ0FBQyxHQUFRLEVBQUMsRUFBRTtnQkFDakIsSUFBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksSUFBRSxLQUFLLEVBQUM7b0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUM7b0JBQ25DLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7aUJBQ2xFO3FCQUFJO29CQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2lCQUM3RDtnQkFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzlDLENBQUM7WUFDQSxLQUFLLEVBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsaUNBQWlDLENBQUMsQ0FBQztnQkFDNUQsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRCxDQUFDO1NBQ0gsQ0FBQyxDQUFBO0lBQ0gsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxpQkFBaUI7UUFDZixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3BGLENBQUM7SUFFRCxRQUFRO1FBQ04sbURBQW1EO1FBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZGLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNyQixTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7YUFDakQ7U0FDRjtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUE7UUFDM0csb0VBQW9FO1FBQ3BFLG9EQUFvRDtRQUNwRCxtRkFBbUY7UUFDbkYsc0JBQXNCO1FBQ3RCLHdCQUF3QjtRQUN4Qiw0QkFBNEI7UUFDNUIsaUNBQWlDO1FBQ2pDLG9DQUFvQztRQUNwQyxTQUFTO1FBQ1QsSUFBSTtRQUNKLG9CQUFvQjtRQUNwQix5Q0FBeUM7UUFDekMsK0JBQStCO1FBQy9CLEtBQUs7UUFDSCxnQkFBZ0I7UUFDaEIsd0NBQXdDO1FBQ3hDLDhDQUE4QztRQUM5QyxtREFBbUQ7UUFDbkQsSUFBSTtRQUNKLHNDQUFzQztRQUN0QyxtRUFBbUU7UUFDbkUsV0FBVztRQUNYLCtCQUErQjtRQUMvQixNQUFNO1FBQ04saUJBQWlCO1FBQ2pCLDRCQUE0QjtRQUM1Qiw2REFBNkQ7UUFDN0QsbUVBQW1FO1FBQ25FLHVGQUF1RjtRQUN2RixpQkFBaUI7UUFDakIsaUZBQWlGO1FBQ2pGLFVBQVU7UUFDVixTQUFTO1FBQ1Qsd0JBQXdCO1FBQ3hCLGdGQUFnRjtRQUNoRix3RUFBd0U7UUFDeEUsU0FBUztRQUNULE9BQU87SUFDWCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFBO1FBQ3RHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxTQUFvRCxFQUFFO1FBQzlFLE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFO1lBQzVCLGFBQWEsRUFBRSxNQUFNO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRW5ELG9EQUFvRDtRQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRyx1RUFBdUU7UUFDdkUsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7WUFDM0UsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUN6RixpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUM7U0FDNUU7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDM0MsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMzQjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUkseUJBQXlCO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzlGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztRQUN0RSxPQUFPLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBOTZCVSw4QkFBOEI7NEZBQTlCLDhCQUE4QixzZENqQjNDLHM5bERBcXJCQTs7NEZEcHFCYSw4QkFBOEI7a0JBUDFDLFNBQVM7K0JBQ0UsNEJBQTRCO2tNQTJEVixnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZTtnQkFDUSxzQkFBc0I7c0JBQXZELFNBQVM7dUJBQUMscUJBQXFCO2dCQUNLLHlCQUF5QjtzQkFBN0QsU0FBUzt1QkFBQyx3QkFBd0I7Z0JBZ2pCbkMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCwgTmdiTW9kYWxSZWYgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1mb290ZmFsbC1jb25maWd1cmF0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEZvb3RmYWxsQ29uZmlndXJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybSE6IEZvcm1Hcm91cDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICByZXNldFJlcXVlc3Q6IHsgY2xpZW50SWQ6IHN0cmluZzsgYXJyYXlPZlN0b3JlczogeyBzdG9yZUlkOiBzdHJpbmc7IGRhdGVTdHJpbmc6IHN0cmluZyB9W10gfSA9IHtcclxuICAgIGNsaWVudElkOiAnJyxcclxuICAgIGFycmF5T2ZTdG9yZXM6IFtdXHJcbiAgfTtcclxuICBzcG9jVGlja2V0Q3JlYXRpb25kYXlzID0gWzEsIDIsIDNdO1xyXG4gIHBlcmNlbnRhZ2VMaXN0OiBudW1iZXJbXSA9IFtdO1xyXG4gIGFjY3VyYWN5UGVyY2VudGFnZUxpc3Q6IG51bWJlcltdID0gW107XHJcbiAgc3RvcmVUaWNrZXREYXlzOiBudW1iZXJbXSA9IFtdO1xyXG4gIHNlbmRUaWNrZXRUYW5nbzogbnVtYmVyW10gPSBbXTtcclxuICBpc0VkaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGNsaWVuSWQ6IHN0cmluZztcclxuICBzdG9yZUxpc3Q6IGFueSA9IFtdO1xyXG4gIGlzUmVzZXR0aW5nID0gZmFsc2U7XHJcbiAgY2F0ZWdvcnlGb3JtITogRm9ybUdyb3VwO1xyXG4gIGNhdGVnb3J5TW9kYWxNb2RlOiAnYWRkJyB8ICdlZGl0JyA9ICdhZGQnO1xyXG4gIGVkaXRpbmdDYXRlZ29yeUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBjYXRlZ29yeU1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xyXG4gIGRlbGV0ZU1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xyXG4gIHJlc2V0TW9kYWxSZWY6IE5nYk1vZGFsUmVmIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlUb0RlbGV0ZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBjYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgYWN0aXZlTWVudUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBvcGVuTGltaXREcm9wZG93bkluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBpc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBpc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBpc1RpY2tldENvdW50RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNTdG9yZURheXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBkYXlzT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6ICdNb250aCcsIHZhbHVlOiAnMzAnIH0sXHJcbiAgICB7IGxhYmVsOiAnV2VlaycsIHZhbHVlOiAnNycgfVxyXG4gIF07XHJcbiAgaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNPdmVyYWxsTGltaXRhdGlvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmV2aXNpb25EZXBzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICByZWFkb25seSBtYXhDYXRlZ29yeUNvdW50ID0gNTtcclxuICByZWFkb25seSBiYXNlQ2F0ZWdvcnlJY29uczphbnkgPSBbXHJcbiAgICAvLyB7IGxhYmVsOiAnQmx1ZSBUYWcnLCB2YWx1ZTogJ2JsdWVUYWcnIH0sXHJcbiAgICB7IGxhYmVsOiAnUHVycGxlIFRhZycsIHZhbHVlOiAncHVycGxlVGFnJyB9LFxyXG4gICAgeyBsYWJlbDogJ09yYW5nZSBUYWcnLCB2YWx1ZTogJ29yYW5nZVRhZycgfVxyXG4gIF07XHJcblxyXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxDYXRlZ29yeUljb25zID0gW1xyXG4gICAgeyBsYWJlbDogJ0hvdXNlIEtlZXBpbmcnLCB2YWx1ZTogJ2hvdXNlS2VlcGluZ1RhZycgfSxcclxuICAgIHsgbGFiZWw6ICdKdW5rJywgdmFsdWU6ICdqdW5rVGFnJyB9XHJcbiAgXTtcclxuXHJcbiAgZm9vdGZhbGxDb25maWdEYXRhOiBhbnkgPSBbXTtcclxuICBAVmlld0NoaWxkKCdjYXRlZ29yeU1vZGFsJykgY2F0ZWdvcnlNb2RhbFRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZGVsZXRlQ2F0ZWdvcnlNb2RhbCcpIGRlbGV0ZUNhdGVnb3J5TW9kYWxUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Jlc2V0Q29uZmlybWF0aW9uTW9kYWwnKSByZXNldENvbmZpcm1hdGlvbk1vZGFsVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogQ2xpZW50QXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSkge1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50SWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW5JZCA9IGVcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdC5jbGllbnRJZCA9IGU7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKGUpO1xyXG4gICAgICAgIC8vIExvYWQgZm9vdGZhbGwgZGV0YWlscyB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIC8vIHRoaXMubG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhlKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0Q2F0ZWdvcnlGb3JtKCk7XHJcbiAgICB0aGlzLmxvYWRGb3JtKCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGF5T3B0aW9ucyg0NSk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGlyTGltaXRhdGlvbigxMDApO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyg5NSk7XHJcbiAgICB0aGlzLnNlbmRUaWNrZXRUb1RhbmdvKDEwMCk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBpZiAocmVzLnR5cGUgPT09ICdpbnB1dCcgJiYgcmVzLmZvcm0gPT09ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnKSB7XHJcbiAgICAgICAgICB0aGlzLnBhdGNoRm9ybShyZXMudmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgZm9vdGZhbGwgZGV0YWlscyBmcm9tIEFQSSB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAqIFRoaXMgZW5zdXJlcyBjbGllbklkIGlzIHNldCBiZWZvcmUgbWFraW5nIHRoZSBBUEkgY2FsbFxyXG4gICAqL1xyXG4gIC8vIHByaXZhdGUgbG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhjbGllbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICBpZiAoIWNsaWVudElkKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbERldGFpbHMoY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHJlcykge1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2coJ0Zvb3RmYWxsIERpcmVjdG9yeSBDb25maWdzIGRhdGEgOjonLCByZXMpO1xyXG4gIC8vICAgICAgICAgaWYgKHJlcz8uZGF0YSAmJiByZXM/LmRhdGE/LmZvb3RmYWxsRGlyZWN0b3J5Q29uZmlncykge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSA9IHJlcz8uZGF0YT8uZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzO1xyXG4gIC8vICAgICAgICAgICB0aGlzLnBhdGNoRm9ybSh0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9vdGZhbGwgZGV0YWlsczonLCBlcnIpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIGdlbmVyYXRlRGF5T3B0aW9ucyhjb3VudDogbnVtYmVyKSB7XHJcbiAgdGhpcy5zdG9yZVRpY2tldERheXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gaSArIDEpO1xyXG4gfVxyXG5cclxuICBnZW5lcmF0ZURpckxpbWl0YXRpb24oY291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5wZXJjZW50YWdlTGlzdCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5hY2N1cmFjeVBlcmNlbnRhZ2VMaXN0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBzZW5kVGlja2V0VG9UYW5nbyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZW5kVGlja2V0VGFuZ28gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIGxvYWRGb3JtKCkge1xyXG4gICAgLy8gaW5pdGlhbGl6ZSBmb3JtXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcmV2aXNpb246IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhbGxvd1RpY2tldENyZWF0aW9uOiBbbnVsbF0sXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBbZmFsc2VdLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogWycnXSxcclxuICAgICAgb3ZlcmFsbExpbWl0YXRpb246JycsXHJcbiAgICAgIHRhZ2dpbmdMaW1pdGF0aW9uOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgYWNjdXJhY3lCcmVhY2g6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIHRpY2tldENvdW50OiBbJyddLFxyXG4gICAgICAgIGRheXM6IFtdLFxyXG4gICAgICAgIGFjY3VyYWN5OiBbJyddXHJcbiAgICAgIH0pLFxyXG4gICAgICB0YW5nb1JldmlldzogWycnXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwYXRjaEZvcm0oZGF0YTogYW55KSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybjtcclxuICAgIC8vIHBhdGNoIHJldmlzaW9uXHJcbiAgICBjb25zdCByZXZpc2lvbkFycmF5ID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgncmV2aXNpb24nKSBhcyBGb3JtQXJyYXk7XHJcbiAgICByZXZpc2lvbkFycmF5LmNsZWFyKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnJldmlzaW9uKSkge1xyXG4gICAgICBkYXRhLnJldmlzaW9uLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIHJldmlzaW9uQXJyYXkucHVzaCh0aGlzLmNyZWF0ZVJldmlzaW9uKGl0ZW0uYWN0aW9uVHlwZSwgaXRlbS5pc0NoZWNrZWQpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcGF0Y2ggdGFnZ2luZ0xpbWl0YXRpb24gLS0gYmFzZWQgb24gbmV3IGtleSBmb3JtYXQgXCJlZmZlY3RpdmVGcm9tXCJcclxuICAgIGNvbnN0IHRhZ0FycmF5ID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgndGFnZ2luZ0xpbWl0YXRpb24nKSBhcyBGb3JtQXJyYXk7XHJcbiAgICB0YWdBcnJheS5jbGVhcigpO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24pICYmIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uPy5sZW5ndGggPiAwICYmIFxyXG4gICAgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAvLyBPbmx5IG9uZSBjb25maWcgcHJlc2VudCDigJMgdXNlIGl0cyB2YWx1ZXMgZGlyZWN0bHlcclxuICAgICAgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb25bMF0/LnZhbHVlcz8uZm9yRWFjaCgodGFnOiBhbnkpID0+IHtcclxuICAgICAgICB0YWdBcnJheS5wdXNoKHRoaXMuY3JlYXRlVGFnTGltaXQodGFnPy50eXBlLCB0YWc/LnZhbHVlLCB0YWc/Lmljb25OYW1lLCB0YWc/Lm5hbWUsIHRhZz8ua2V5KSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uKSAmJiBkYXRhPy50YWdnaW5nTGltaXRhdGlvbj8ubGVuZ3RoID4gMCAmJiBcclxuICAgIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uPy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIC8vIE11bHRpcGxlIGNvbmZpZ3MgcHJlc2VudCDigJMgcGljayB0aGUgb25lIHdpdGggbGF0ZXN0IGVmZmVjdGl2ZUZyb20gZGF0ZVxyXG4gICAgICBjb25zdCBsYXRlc3RFbnRyeSA9IGRhdGEudGFnZ2luZ0xpbWl0YXRpb24ucmVkdWNlKChsYXRlc3Q6IGFueSwgY3VycmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50IHx8ICFjdXJyZW50LmVmZmVjdGl2ZUZyb20pIHtcclxuICAgICAgICAgIHJldHVybiBsYXRlc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbGF0ZXN0IHx8ICFsYXRlc3QuZWZmZWN0aXZlRnJvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoY3VycmVudC5lZmZlY3RpdmVGcm9tKTtcclxuICAgICAgICBjb25zdCBsYXRlc3REYXRlID0gbmV3IERhdGUobGF0ZXN0LmVmZmVjdGl2ZUZyb20pO1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50RGF0ZSA+IGxhdGVzdERhdGUgPyBjdXJyZW50IDogbGF0ZXN0O1xyXG4gICAgICB9LCBudWxsKTtcclxuXHJcbiAgICAgIGlmIChsYXRlc3RFbnRyeSAmJiBBcnJheS5pc0FycmF5KGxhdGVzdEVudHJ5LnZhbHVlcykpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZWZmZWN0aXZlRnJvbTonLCBsYXRlc3RFbnRyeS5lZmZlY3RpdmVGcm9tKTtcclxuICAgICAgICBsYXRlc3RFbnRyeS52YWx1ZXMuZm9yRWFjaCgodGFnOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRhZ0FycmF5LnB1c2godGhpcy5jcmVhdGVUYWdMaW1pdCh0YWc/LnR5cGUsIHRhZz8udmFsdWUsIHRhZz8uaWNvbk5hbWUsIHRhZz8ubmFtZSwgdGFnPy5rZXkpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHBhdGNoIGFjY3VyYWN5QnJlYWNoIGdyb3VwXHJcbiAgICBpZiAoZGF0YS5hY2N1cmFjeUJyZWFjaCkge1xyXG4gICAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaCcpPy5wYXRjaFZhbHVlKHtcclxuICAgICAgICB0aWNrZXRDb3VudDogZGF0YS5hY2N1cmFjeUJyZWFjaC50aWNrZXRDb3VudCxcclxuICAgICAgICBkYXlzOiBkYXRhLmFjY3VyYWN5QnJlYWNoLmRheXMgPz8gJzMwJyxcclxuICAgICAgICBhY2N1cmFjeTogZGF0YS5hY2N1cmFjeUJyZWFjaC5hY2N1cmFjeVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwYXRjaCBzaW1wbGUgZmllbGRzXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgIGFsbG93VGlja2V0Q3JlYXRpb246IGRhdGEuYWxsb3dUaWNrZXRDcmVhdGlvbiA/PyAzLFxyXG4gICAgICBpc0F1dG9DbG9zZUVuYWJsZTogZGF0YS5pc0F1dG9DbG9zZUVuYWJsZSA/PyBmYWxzZSxcclxuICAgICAgYXV0b0Nsb3NlQWNjdXJhY3k6IGRhdGEuYXV0b0Nsb3NlQWNjdXJhY3kgPz8gJzk1JScsXHJcbiAgICAgIG92ZXJhbGxMaW1pdGF0aW9uOiBkYXRhLm92ZXJhbGxMaW1pdGF0aW9uID8/ICcnLFxyXG4gICAgICB0YW5nb1JldmlldzogZGF0YS50YW5nb1JldmlldyA/PyAnODUlJ1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZGlzYWJsZSgpO1xyXG4gICAgLy8gQXBwbHkgZGVwZW5kZW5jeSBsb2dpY1xyXG4gICAgdGhpcy5oYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpO1xyXG4gIH1cclxuXHJcbiAgb3BlbkNhdGVnb3J5TW9kYWwobW9kZTogJ2FkZCcgfCAnZWRpdCcsIGluZGV4PzogbnVtYmVyKSB7XHJcbiAgICBpZiAobW9kZSA9PT0gJ2FkZCcgJiYgdGhpcy5pc0NhdGVnb3J5TGltaXRSZWFjaGVkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdNYXhpbXVtIENhdGVnb3J5IGNyZWF0aW9uIGxpbWl0IHJlYWNoZWQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID0gbW9kZTtcclxuICAgIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gaW5kZXggOiBudWxsO1xyXG5cclxuICAgIGlmIChtb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBjYXRlZ29yeUdyb3VwID0gdGhpcy50YWdMaW1pdHMuYXQodGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgICB0aGlzLmNhdGVnb3J5Rm9ybS5zZXRWYWx1ZSh7XHJcbiAgICAgICAgaWNvbk5hbWU6IGNhdGVnb3J5R3JvdXAuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCB0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdLnZhbHVlLFxyXG4gICAgICAgIG5hbWU6IGNhdGVnb3J5R3JvdXAuZ2V0KCduYW1lJyk/LnZhbHVlIHx8IGNhdGVnb3J5R3JvdXAuZ2V0KCd0eXBlJyk/LnZhbHVlIHx8ICcnLFxyXG4gICAgICAgIGxpbWl0OiBjYXRlZ29yeUdyb3VwLmdldCgndmFsdWUnKT8udmFsdWUgfHwgdGhpcy5wZXJjZW50YWdlTGlzdFswXVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2F0ZWdvcnlGb3JtLnJlc2V0KHtcclxuICAgICAgICBpY29uTmFtZTogdGhpcy5iYXNlQ2F0ZWdvcnlJY29uc1swXS52YWx1ZSxcclxuICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICBsaW1pdDogdGhpcy5wZXJjZW50YWdlTGlzdFswXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhdGVnb3J5TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuY2F0ZWdvcnlNb2RhbFRwbCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogJ21kJyxcclxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxyXG4gICAgICBrZXlib2FyZDogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRDYXRlZ29yeUZvcm0oKSB7XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeUZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLmNhdGVnb3J5Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IGljb25OYW1lLCBuYW1lLCBsaW1pdCB9ID0gdGhpcy5jYXRlZ29yeUZvcm0udmFsdWU7XHJcbiAgICBjb25zdCB0cmltbWVkTmFtZSA9IChuYW1lIHx8ICcnKS50cmltKCk7XHJcblxyXG4gICAgaWYgKCF0cmltbWVkTmFtZSkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NhdGVnb3J5IG5hbWUgaXMgcmVxdWlyZWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkdXBsaWNhdGVJbmRleCA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLmZpbmRJbmRleCgoY3RybCwgaWR4KSA9PlxyXG4gICAgICAoY3RybC5nZXQoJ25hbWUnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkgfHwgXHJcbiAgICAgICBjdHJsLmdldCgndHlwZScpPy52YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gdHJpbW1lZE5hbWUudG9Mb3dlckNhc2UoKSkgJiZcclxuICAgICAgaWR4ICE9PSAodGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCA/PyAtMSlcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGR1cGxpY2F0ZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICBjb25zdCBuYW1lQ29udHJvbCA9IHRoaXMuY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpO1xyXG4gICAgICBuYW1lQ29udHJvbD8uc2V0RXJyb3JzKHsgZHVwbGljYXRlOiB0cnVlIH0pO1xyXG4gICAgICBuYW1lQ29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgaWNvbk5hbWUgYWxyZWFkeSBleGlzdHNcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJykge1xyXG4gICAgICBjb25zdCBleGlzdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kKChjdHJsKSA9PiBcclxuICAgICAgICBjdHJsLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgPT09IGljb25OYW1lXHJcbiAgICAgICk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoZXhpc3RpbmdJY29uKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdUaGlzIGljb24gaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgY2F0ZWdvcnkuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2F0ZWdvcnlNb2RhbE1vZGUgPT09ICdlZGl0JyAmJiB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIEluIGVkaXQgbW9kZSwgY2hlY2sgaWYgaWNvbiBpcyB1c2VkIGJ5IGFub3RoZXIgY2F0ZWdvcnkgKGV4Y2x1ZGluZyBjdXJyZW50IG9uZSlcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCwgaWR4KSA9PiBcclxuICAgICAgICBjdHJsLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgPT09IGljb25OYW1lICYmIGlkeCAhPT0gdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleFxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJykge1xyXG4gICAgICAvLyBHZW5lcmF0ZSB0eXBlIGZyb20gbmFtZSAobG93ZXJjYXNlLCByZW1vdmUgc3BhY2VzKVxyXG4gICAgICBjb25zdCB0eXBlID0gdHJpbW1lZE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcclxuICAgICAgY29uc3Qga2V5ID0gdHlwZS5jaGFyQXQoMCk7XHJcbiAgICAgIHRoaXMudGFnTGltaXRzLnB1c2godGhpcy5jcmVhdGVUYWdMaW1pdCh0eXBlLCBOdW1iZXIobGltaXQpLCBpY29uTmFtZSwgdHJpbW1lZE5hbWUsIGtleSkpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgY3JlYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgY2F0ZWdvcnlHcm91cCA9IHRoaXMudGFnTGltaXRzLmF0KHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY2F0ZWdvcnlHcm91cC5wYXRjaFZhbHVlKHtcclxuICAgICAgICBuYW1lOiB0cmltbWVkTmFtZSxcclxuICAgICAgICB2YWx1ZTogTnVtYmVyKGxpbWl0KSxcclxuICAgICAgICBpY29uTmFtZTogaWNvbk5hbWVcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdDYXRlZ29yeSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsb3NlQ2F0ZWdvcnlNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VDYXRlZ29yeU1vZGFsKCkge1xyXG4gICAgaWYgKHRoaXMuY2F0ZWdvcnlNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLmNhdGVnb3J5TW9kYWxSZWYuY2xvc2UoKTtcclxuICAgICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvcGVuRGVsZXRlQ2F0ZWdvcnlNb2RhbChpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmNhdGVnb3J5VG9EZWxldGVJbmRleCA9IGluZGV4O1xyXG4gICAgY29uc3QgY2F0ZWdvcnlHcm91cCA9IHRoaXMudGFnTGltaXRzLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICB0aGlzLmNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgPSBjYXRlZ29yeUdyb3VwLmdldCgnbmFtZScpPy52YWx1ZSB8fCAndGhpcyBjYXRlZ29yeSc7XHJcbiAgICB0aGlzLmRlbGV0ZU1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmRlbGV0ZUNhdGVnb3J5TW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdzbScsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1EZWxldGVDYXRlZ29yeSgpIHtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5VG9EZWxldGVJbmRleCA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnRhZ0xpbWl0cy5yZW1vdmVBdCh0aGlzLmNhdGVnb3J5VG9EZWxldGVJbmRleCk7XHJcbiAgICB0aGlzLmNhdGVnb3J5VG9EZWxldGVJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLmNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgPSAnJztcclxuICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdDYXRlZ29yeSBkZWxldGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgIHRoaXMuY2xvc2VEZWxldGVNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VEZWxldGVNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLmRlbGV0ZU1vZGFsUmVmKSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlTW9kYWxSZWYuY2xvc2UoKTtcclxuICAgICAgdGhpcy5kZWxldGVNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgPSAnJztcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdGVnb3J5SWNvbihpY29uVmFsdWU6IHN0cmluZykge1xyXG4gICAgLy8gQ2hlY2sgaWYgaWNvbk5hbWUgYWxyZWFkeSBleGlzdHNcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJykge1xyXG4gICAgICBjb25zdCBleGlzdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kKChjdHJsKSA9PiBcclxuICAgICAgICBjdHJsLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgPT09IGljb25WYWx1ZVxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBJbiBlZGl0IG1vZGUsIGNoZWNrIGlmIGljb24gaXMgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5IChleGNsdWRpbmcgY3VycmVudCBvbmUpXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWNvbiA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLmZpbmQoKGN0cmwsIGlkeCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uVmFsdWUgJiYgaWR4ICE9PSB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4XHJcbiAgICAgICk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoZXhpc3RpbmdJY29uKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdUaGlzIGljb24gaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgY2F0ZWdvcnkuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuY2F0ZWdvcnlGb3JtLmdldCgnaWNvbk5hbWUnKT8uc2V0VmFsdWUoaWNvblZhbHVlKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNhdGVnb3J5TWVudShldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5hY3RpdmVNZW51SW5kZXggPSB0aGlzLmFjdGl2ZU1lbnVJbmRleCA9PT0gaW5kZXggPyBudWxsIDogaW5kZXg7XHJcbiAgfVxyXG5cclxuICBvbkNhdGVnb3J5TWVudUFjdGlvbihldmVudDogRXZlbnQsIGFjdGlvbjogJ2VkaXQnIHwgJ2RlbGV0ZScsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5hY3RpdmVNZW51SW5kZXggPSBudWxsO1xyXG4gICAgaWYgKGFjdGlvbiA9PT0gJ2VkaXQnKSB7XHJcbiAgICAgIHRoaXMub3BlbkNhdGVnb3J5TW9kYWwoJ2VkaXQnLCBpbmRleCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5EZWxldGVDYXRlZ29yeU1vZGFsKGluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUxpbWl0RHJvcGRvd24oZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPT09IGluZGV4ID8gbnVsbCA6IGluZGV4O1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0TGltaXRWYWx1ZShldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9ICh0aGlzLnRhZ0xpbWl0cy5hdChpbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMub3BlbkxpbWl0RHJvcGRvd25JbmRleCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeUxpbWl0RHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gIXRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0ZWdvcnlMaW1pdFZhbHVlKGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jYXRlZ29yeUZvcm0uZ2V0KCdsaW1pdCcpO1xyXG4gICAgY29udHJvbD8uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbD8ubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBdXRvQ2xvc2VEcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzQXV0b0Nsb3NlRW5hYmxlZCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2lzQXV0b0Nsb3NlRW5hYmxlJyk/LnZhbHVlO1xyXG4gICAgaWYgKCFpc0F1dG9DbG9zZUVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0F1dG9DbG9zZURyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VuZFRhbmdvQ2xvc2VEcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW4gPSAhdGhpcy5pc3NlbmRUYW5nb0Ryb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdEF1dG9DbG9zZUFjY3VyYWN5KGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYXV0b0Nsb3NlQWNjdXJhY3knKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb250cm9sLnNldFZhbHVlKGAke3ZhbHVlfSVgKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc0F1dG9DbG9zZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U2VuZFRpY2tldFRhbmdvKGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgndGFuZ29SZXZpZXcnKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb250cm9sLnNldFZhbHVlKGAke3ZhbHVlfSVgKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc3NlbmRUYW5nb0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVGlja2V0Q291bnREcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9ICF0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RUaWNrZXRDb3VudChldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3RvcmVEYXlzRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gIXRoaXMuaXNTdG9yZURheXNEcm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdG9yZURheXMoZXZlbnQ6IEV2ZW50LCBvcHRpb246IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC5kYXlzJyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShvcHRpb24udmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWREYXlzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLmRheXMnKT8udmFsdWU7XHJcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF5c09wdGlvbnMuZmluZChvcHQgPT4gb3B0LnZhbHVlID09PSBjdXJyZW50VmFsdWUpO1xyXG4gICAgcmV0dXJuIG1hdGNoPy5sYWJlbCB8fCAnTW9udGgnO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3RvcmVBY2N1cmFjeURyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSAhdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdG9yZUFjY3VyYWN5KGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWNjdXJhY3lCcmVhY2guYWNjdXJhY3knKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb250cm9sLnNldFZhbHVlKGAke3ZhbHVlfSVgKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gIXRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWxsb3dUaWNrZXRDcmVhdGlvbihldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FsbG93VGlja2V0Q3JlYXRpb24nKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU92ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzT3ZlcmFsbExpbWl0YXRpb25Ecm9wZG93bk9wZW4gPSAhdGhpcy5pc092ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0T3ZlcmFsbExpbWl0YXRpb24oZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdvdmVyYWxsTGltaXRhdGlvbicpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUoYCR7dmFsdWV9JWApOyAvLyBBUEkgZXhwZWN0cyBhIHN0cmluZyBsaWtlIFwiMzAlXCJcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc092ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3ZlcmFsbC1saW1pdGF0aW9uIGRyb3Bkb3duIChlLmcuIFwiMzAlXCIgb3IgYSBwbGFjZWhvbGRlciB3aGVuIGVtcHR5KS5cclxuICBnZXQgb3ZlcmFsbExpbWl0YXRpb25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdvdmVyYWxsTGltaXRhdGlvbicpPy52YWx1ZTtcclxuICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlIDogJ1NlbGVjdCc7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRhZ0xpbWl0cy5sZW5ndGggPj0gdGhpcy5tYXhDYXRlZ29yeUNvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQXBwcm92ZXJEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgIFxyXG4gICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyKSB7XHJcbiAgICAgIGNvbnN0IHJldmlld2VyQ2hlY2tlZCA9IHJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlO1xyXG4gICAgICBjb25zdCBhcHByb3ZlckNvbnRyb2wgPSBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpO1xyXG4gICAgICAvLyBDaGVjayBpZiBhcHByb3ZlciBpcyBkaXNhYmxlZCBPUiByZXZpZXdlciBpcyBub3QgY2hlY2tlZFxyXG4gICAgICByZXR1cm4gYXBwcm92ZXJDb250cm9sPy5kaXNhYmxlZCB8fCAhcmV2aWV3ZXJDaGVja2VkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVGFuZ29EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIC8vIFRhbmdvIGFsd2F5cyBzaG93cyBkaXNhYmxlZCBkZXNpZ25cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgdGhpcy5jYXRlZ29yeUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgaWNvbk5hbWU6IFt0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdLnZhbHVlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzApXV0sXHJcbiAgICAgIGxpbWl0OiBbdGhpcy5wZXJjZW50YWdlTGlzdFswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxyXG4gIGNsb3NlTWVudXMoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1lbnVJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzT3ZlcmFsbExpbWl0YXRpb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNhdGVnb3J5SWNvbkRyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuID0gIXRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDYXRlZ29yeUljb25Gcm9tRHJvcGRvd24oZXZlbnQ6IEV2ZW50LCBpY29uVmFsdWU6IHN0cmluZykge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNlbGVjdENhdGVnb3J5SWNvbihpY29uVmFsdWUpO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xpZW50TWFwcGVkU3RvcmVzRGV0YWlscyhjbGllbklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZvb3RmYWxsU3RvcmVSYWlzZURldGFpbHMoY2xpZW5JZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIC8vIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbERldGFpbHMoY2xpZW5JZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDoocmVzOiBhbnkpPT57XHJcbiAgICAgICAgaWYocmVzICYmIHJlcy5jb2RlPT0nMjAwJyl7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IHJlcz8uZGF0YT8ucmVzdWx0O1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOihlcnIpPT57XHJcbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBzdG9yZSBsaXN0JywgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gaGVscGVyc1xyXG4gIGdldCByZXZpc2lvbkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgncmV2aXNpb24nKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgdGFnTGltaXRzKCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgndGFnZ2luZ0xpbWl0YXRpb24nKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlUmV2aXNpb24oYWN0aW9uVHlwZTogc3RyaW5nLCBpc0NoZWNrZWQ6IGJvb2xlYW4pOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBhY3Rpb25UeXBlOiBbYWN0aW9uVHlwZV0sXHJcbiAgICAgIGlzQ2hlY2tlZDogW2lzQ2hlY2tlZF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlVGFnTGltaXQodHlwZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyLCBpY29uTmFtZTogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBrZXk/OiBzdHJpbmcpOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB0eXBlOiBbdHlwZV0sXHJcbiAgICAgIHZhbHVlOiBbdmFsdWVdLFxyXG4gICAgICB1bml0OiBbJyUnXSxcclxuICAgICAgaWNvbk5hbWU6IFtpY29uTmFtZV0sXHJcbiAgICAgIG5hbWU6IFtuYW1lXSxcclxuICAgICAga2V5OiBba2V5XVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTdG9yZVNlbGVjdGlvbihzdG9yZTogYW55LCBjaGVja2VkOiBib29sZWFuKSB7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdC5jbGllbnRJZCA9IHRoaXMuY2xpZW5JZDtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5wdXNoKHsgc3RvcmVJZDogc3RvcmUuc3RvcmVJZCwgZGF0ZVN0cmluZzogc3RvcmUuZGF0ZVN0cmluZyB9KTtcclxuICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzID0gdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5maWx0ZXIoXHJcbiAgICAgICAgKHMpID0+IHMuc3RvcmVJZCAhPT0gc3RvcmUuc3RvcmVJZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNTdG9yZVNlbGVjdGVkKHN0b3JlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLnNvbWUociA9PiByLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZUxpc3QubGVuZ3RoID4gMCAmJiB0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLmxlbmd0aCA9PT0gdGhpcy5zdG9yZUxpc3QubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLy8gc2VsZWN0IGFsbCBzdG9yZXMgcmVxdWVzdCBsaXN0IGhhbmRsZXJcclxuICB0b2dnbGVTZWxlY3RBbGwoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSB0YXJnZXQuY2hlY2tlZDtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkU3RvcmVzID0gdGhpcy5zdG9yZUxpc3QubWFwKChzdG9yZTogYW55KSA9PiAoe1xyXG4gICAgICAgIHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsXHJcbiAgICAgICAgZGF0ZVN0cmluZzogc3RvcmUuZGF0ZVN0cmluZ1xyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0ID0gdGhpcy5idWlsZFJlc2V0UGF5bG9hZChzZWxlY3RlZFN0b3Jlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdCA9IHRoaXMuYnVpbGRSZXNldFBheWxvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVJldmlzaW9uRGVwZW5kZW5jaWVzKCkge1xyXG4gICAgY29uc3QgcmV2aXNpb25zID0gdGhpcy5yZXZpc2lvbkFycmF5LmNvbnRyb2xzO1xyXG4gICAgY29uc3QgcmV2aWV3ZXIgPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdyZXZpZXdlcicpO1xyXG4gICAgY29uc3QgYXBwcm92ZXIgPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdhcHByb3ZlcicpO1xyXG4gICAgY29uc3QgdGFuZ28gPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICd0YW5nbycpO1xyXG5cclxuICAgIGlmICh0YW5nbykge1xyXG4gICAgICB0YW5nby5nZXQoJ2lzQ2hlY2tlZCcpPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmV2aWV3ZXIgJiYgYXBwcm92ZXIpIHtcclxuICAgICAgLy8gZGlzYWJsZSBhcHByb3ZlciBpbml0aWFsbHkgaWYgcmV2aWV3ZXIgdW5jaGVja2VkXHJcbiAgICAgIGlmICghcmV2aWV3ZXIuZ2V0KCdpc0NoZWNrZWQnKT8udmFsdWUpIHtcclxuICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICBhcHByb3Zlci5wYXRjaFZhbHVlKHsgaXNDaGVja2VkOiBmYWxzZSB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZW5hYmxlIGFwcHJvdmVyIGlmIHJldmlld2VyIGlzIGNoZWNrZWRcclxuICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBsaXN0ZW4gcmV2aWV3ZXIgY2hlY2tib3ggY2hhbmdlIChvbmx5IHdpcmUgb25jZSlcclxuICAgICAgaWYgKCF0aGlzLnJldmlzaW9uRGVwc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgcmV2aWV3ZXIuZ2V0KCdpc0NoZWNrZWQnKT8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgICAgICAgIGFwcHJvdmVyLmdldCgnaXNDaGVja2VkJyk/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgYXBwcm92ZXIucGF0Y2hWYWx1ZSh7IGlzQ2hlY2tlZDogZmFsc2UgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmV2aXNpb25EZXBzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0VkaXQgPSAhdGhpcy5pc0VkaXQ7XHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIC8vIEZpcnN0LCBlbnN1cmUgYXBwcm92ZXIgc3RhdGUgaXMgY29ycmVjdCBiZWZvcmUgZW5hYmxpbmcgZm9ybVxyXG4gICAgICBjb25zdCByZXZpc2lvbnMgPSB0aGlzLnJldmlzaW9uQXJyYXkuY29udHJvbHM7XHJcbiAgICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgICAgY29uc3QgYXBwcm92ZXIgPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdhcHByb3ZlcicpO1xyXG4gICAgICBcclxuICAgICAgLy8gSWYgcmV2aWV3ZXIgaXMgdW5jaGVja2VkLCBlbnN1cmUgYXBwcm92ZXIgaXMgdW5jaGVja2VkIGJlZm9yZSBlbmFibGluZ1xyXG4gICAgICBpZiAocmV2aWV3ZXIgJiYgYXBwcm92ZXIgJiYgIXJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgYXBwcm92ZXIucGF0Y2hWYWx1ZSh7IGlzQ2hlY2tlZDogZmFsc2UgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIC8vIFJlLWFwcGx5IHJldmlzaW9uIGRlcGVuZGVuY2llcyBhZnRlciBlbmFibGluZyB0byBlbnN1cmUgYXBwcm92ZXIgc3RhdGUgaXMgY29ycmVjdFxyXG4gICAgICB0aGlzLmhhbmRsZVJldmlzaW9uRGVwZW5kZW5jaWVzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAvLyBSZS1hcHBseSByZXZpc2lvbiBkZXBlbmRlbmNpZXMgc28gVGFuZ28gcmVtYWlucyBkaXNhYmxlZFxyXG4gICAgICAvLyBhbmQgQXBwcm92ZXIgZm9sbG93cyBSZXZpZXdlciBpbiBib3RoIHZpZXcgYW5kIGVkaXQgbW9kZXMuXHJcbiAgICAgIHRoaXMuaGFuZGxlUmV2aXNpb25EZXBlbmRlbmNpZXMoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gT3BlbiByZXNldCBjb25maXJtYXRpb24gbW9kYWxcclxuICBvcGVuUmVzZXRDb25maXJtYXRpb25Nb2RhbCgpIHtcclxuICAgIGlmICghdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfHwgdGhpcy5pc1Jlc2V0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc2V0TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMucmVzZXRDb25maXJtYXRpb25Nb2RhbFRwbCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogJ3NtJyxcclxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxyXG4gICAgICBrZXlib2FyZDogZmFsc2VcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2UgcmVzZXQgY29uZmlybWF0aW9uIG1vZGFsXHJcbiAgY2xvc2VSZXNldE1vZGFsKCkge1xyXG4gICAgaWYgKHRoaXMucmVzZXRNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLnJlc2V0TW9kYWxSZWYuY2xvc2UoKTtcclxuICAgICAgdGhpcy5yZXNldE1vZGFsUmVmID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENvbmZpcm0gYW5kIHByb2NlZWQgd2l0aCByZXNldFxyXG4gIGNvbmZpcm1SZXNldFN0b3JlUmVxdWVzdCgpIHtcclxuICAgIGlmICghdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfHwgdGhpcy5pc1Jlc2V0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBDbG9zZSBtb2RhbCBpbW1lZGlhdGVseVxyXG4gICAgdGhpcy5jbG9zZVJlc2V0TW9kYWwoKTtcclxuICAgIFxyXG4gICAgLy8gUHJvY2VlZCB3aXRoIHJlc2V0IG9wZXJhdGlvblxyXG4gICAgdGhpcy5pc1Jlc2V0dGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UucmVzZXRTdG9yZVJlcXVlc3RMaXN0KHRoaXMucmVzZXRSZXF1ZXN0KVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNSZXNldHRpbmcgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgIClcclxuICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OihyZXM6IGFueSk9PntcclxuICAgICAgaWYocmVzICYmIHJlcy5jb2RlPT0nMjAwJyl7XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICB0aGlzLmdldENsaWVudE1hcHBlZFN0b3Jlc0RldGFpbHModGhpcy5jbGllbklkKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnU3RvcmUgcmVxdWVzdHMgcmVzZXQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIHJlc2V0IHN0b3JlIHJlcXVlc3RzLicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0ID0gdGhpcy5idWlsZFJlc2V0UGF5bG9hZCgpO1xyXG4gICAgIH0sXHJcbiAgICAgIGVycm9yOihlcnIpPT57XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0Vycm9yIHJlc2V0dGluZyBzdG9yZSByZXF1ZXN0cy4nKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBzdG9yZSBsaXN0JywgZXJyKTtcclxuICAgICAgfSxcclxuICAgfSlcclxuICB9XHJcblxyXG4gIC8vIHRvIHJlc2V0IHN0b3JlIGxpc3QgKGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaWYgbmVlZGVkKVxyXG4gIHJlc2V0U3RvcmVSZXF1ZXN0KCkge1xyXG4gICAgdGhpcy5vcGVuUmVzZXRDb25maXJtYXRpb25Nb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzUmVzZXREaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfHwgdGhpcy5pc1Jlc2V0dGluZyB8fCB0aGlzLmlzRWRpdDtcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgLy8gRW5zdXJlIFRhbmdvIGNoZWNrYm94IGlzIGFsd2F5cyB0cnVlIHdoZW4gc2F2aW5nXHJcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZS5yZXZpc2lvbikpIHtcclxuICAgICAgY29uc3QgdGFuZ29JbmRleCA9IGZvcm1WYWx1ZS5yZXZpc2lvbi5maW5kSW5kZXgoKHI6IGFueSkgPT4gcj8uYWN0aW9uVHlwZSA9PT0gJ3RhbmdvJyk7XHJcbiAgICAgIGlmICh0YW5nb0luZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIGZvcm1WYWx1ZS5yZXZpc2lvblt0YW5nb0luZGV4XS5pc0NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygndXBkYXRlIGZvcm0gY29uZmlnID4+JywgZm9ybVZhbHVlKTtcclxuICAgIHRoaXMuYXBpU2VydmljZS5jbGllbnRGb3JtRGF0YS5uZXh0KHsgdmFsdWU6IGZvcm1WYWx1ZSwgdHlwZTogJ3N1Ym1pdCcsIGZvcm06ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnIH0pXHJcbiAgICAvLyBjb25zdCBmb3JtVmFsdWUgPSB7IC4uLnRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS52YWx1ZSB9O1xyXG4gICAgLy8gaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uKSkge1xyXG4gICAgLy8gICBmb3JtVmFsdWUudGFnZ2luZ0xpbWl0YXRpb24gPSBmb3JtVmFsdWUudGFnZ2luZ0xpbWl0YXRpb24ubWFwKCh0YWc6IGFueSkgPT4gKHtcclxuICAgIC8vICAgICB0eXBlOiB0YWcudHlwZSxcclxuICAgIC8vICAgICB2YWx1ZTogdGFnLnZhbHVlLFxyXG4gICAgLy8gICAgIHVuaXQ6IHRhZy51bml0IHx8ICclJ1xyXG4gICAgLy8gICAgIC8vIGljb25OYW1lOiB0YWcuaWNvbk5hbWUsXHJcbiAgICAvLyAgICAgLy8gbmFtZTogdGFnLm5hbWUgfHwgdGFnLnR5cGVcclxuICAgIC8vICAgfSkpO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gY29uc3QgcGF5bG9hZCA9IHtcclxuICAgIC8vICAgZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzOiBmb3JtVmFsdWUsXHJcbiAgICAvLyAgIHJlcXVlc3Q6IHRoaXMucmVzZXRSZXF1ZXN0XHJcbiAgICAvLyB9O1xyXG4gICAgICAvLyBjb25zdCBvYmogPSB7XHJcbiAgICAgIC8vICAgdGFuZ29SZXZpZXc6IGZvcm1WYWx1ZS50YW5nb1JldmlldyxcclxuICAgICAgLy8gICBhY2N1cmFjeUJyZWFjaDogZm9ybVZhbHVlLmFjY3VyYWN5QnJlYWNoLFxyXG4gICAgICAvLyAgIHRhZ2dpbmdMaW1pdGF0aW9uOiBmb3JtVmFsdWUudGFnZ2luZ0xpbWl0YXRpb25cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBjb25zb2xlLmxvZygnRmluYWwgUGF5bG9hZDonLCBvYmopO1xyXG4gICAgICAvLyB0aGlzLmFwaVNlcnZpY2UudXBkYXRlRm9vdGZhbGxEaXJlY3RvcnlDb25maWcob2JqLCB0aGlzLmNsaWVuSWQpXHJcbiAgICAgIC8vICAgLnBpcGUoXHJcbiAgICAgIC8vICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICAgLy8gICApXHJcbiAgICAgIC8vICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIC8vICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgLy8gICAgICAgY29uc29sZS5sb2coJ3NhdmUgZm9vdGZhbGwgY29uZmlnIGRldGFpbHMgPj4nLCByZXMpO1xyXG4gICAgICAvLyAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09ICcyMDAnICYmIHJlcy5zdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgIC8vICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ2Zvb3RmYWxsIGNvbmZpZyBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgICAvLyAgICAgICB9IGVsc2Uge1xyXG4gICAgICAvLyAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIHVwZGF0ZSBmb290ZmFsbCBjb25maWcgZGV0YWlscy4nKTtcclxuICAgICAgLy8gICAgICAgfVxyXG4gICAgICAvLyAgICAgfSxcclxuICAgICAgLy8gICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgIC8vICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRXJyb3IgaW4gdXBkYXRpbmcgZm9vdGZhbGwgY29uZmlnIGRldGFpbHMuJyk7XHJcbiAgICAgIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHVwZGF0ZUZvb3RmYWxsRGlyZWN0b3J5Q29uZmlnIDonLCBlcnIpO1xyXG4gICAgICAvLyAgICAgfSxcclxuICAgICAgLy8gICB9KVxyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEubmV4dCh7IHZhbHVlOiBudWxsLCB0eXBlOiAnY2FuY2VsJywgZm9ybTogJ2Zvb3RmYWxsRGlyZWN0b3J5Q29uZmlncycgfSlcclxuICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLnRvZ2dsZUZvcm0oKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFJlc2V0UGF5bG9hZChzdG9yZXM6IHsgc3RvcmVJZDogc3RyaW5nOyBkYXRlU3RyaW5nOiBzdHJpbmcgfVtdID0gW10pIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVuSWQgPz8gJycsXHJcbiAgICAgIGFycmF5T2ZTdG9yZXM6IHN0b3Jlc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldCBjYXRlZ29yeUljb25zKCk6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBhdmFpbGFibGVJY29ucyA9IFsuLi50aGlzLmJhc2VDYXRlZ29yeUljb25zXTtcclxuICAgIFxyXG4gICAgLy8gQ2hlY2sgd2hpY2ggYWRkaXRpb25hbCBpY29ucyBhcmUgY3VycmVudGx5IGluIHVzZVxyXG4gICAgY29uc3QgdXNlZEljb25zID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMubWFwKGN0cmwgPT4gY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICBcclxuICAgIC8vIElmIGVkaXRpbmcsIGV4Y2x1ZGUgdGhlIGN1cnJlbnQgaWNvbiBiZWluZyBlZGl0ZWQgZnJvbSB0aGUgdXNlZCBsaXN0XHJcbiAgICBsZXQgdXNlZEljb25zRm9yQ2hlY2sgPSBbLi4udXNlZEljb25zXTtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBlZGl0aW5nSWNvbiA9IHRoaXMudGFnTGltaXRzLmF0KHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXgpPy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlO1xyXG4gICAgICB1c2VkSWNvbnNGb3JDaGVjayA9IHVzZWRJY29uc0ZvckNoZWNrLmZpbHRlcihpY29uID0+IGljb24gIT09IGVkaXRpbmdJY29uKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWRkIGhvdXNlS2VlcGluZ1RhZyBhbmQganVua1RhZyBpZiB0aGV5J3JlIG5vdCBpbiB1c2VcclxuICAgIHRoaXMuYWRkaXRpb25hbENhdGVnb3J5SWNvbnMuZm9yRWFjaChpY29uID0+IHtcclxuICAgICAgaWYgKCF1c2VkSWNvbnNGb3JDaGVjay5pbmNsdWRlcyhpY29uLnZhbHVlKSkge1xyXG4gICAgICAgIGF2YWlsYWJsZUljb25zLnB1c2goaWNvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXZhaWxhYmxlSWNvbnM7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRDYXRlZ29yeUljb25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2F0ZWdvcnlGb3JtPy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlIHx8IHRoaXMuYmFzZUNhdGVnb3J5SWNvbnNbMF0/LnZhbHVlO1xyXG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmNhdGVnb3J5SWNvbnMuZmluZChpY29uID0+IGljb24udmFsdWUgPT09IGN1cnJlbnQpO1xyXG4gICAgcmV0dXJuIG1hdGNoPy5sYWJlbCB8fCAnJztcclxuICB9XHJcblxyXG59XHJcblxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm1cIiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uR2xvYmFsX0NvbmZpZ3VyYXRpb25faXNFZGl0XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRcIiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVGb3JtKCk7XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHB5LTMgYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8yNTc5XzI1MTI1KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC4xNjcgMi40OTk5M0MxNC4zODU5IDIuMjgxMDYgMTQuNjQ1NyAyLjEwNzQ0IDE0LjkzMTcgMS45ODg5OUMxNS4yMTc2IDEuODcwNTQgMTUuNTI0MSAxLjgwOTU3IDE1LjgzMzcgMS44MDk1N0MxNi4xNDMyIDEuODA5NTcgMTYuNDQ5NyAxLjg3MDU0IDE2LjczNTcgMS45ODg5OUMxNy4wMjE2IDIuMTA3NDQgMTcuMjgxNSAyLjI4MTA2IDE3LjUwMDMgMi40OTk5M0MxNy43MTkyIDIuNzE4OCAxNy44OTI4IDIuOTc4NjMgMTguMDExMyAzLjI2NDZDMTguMTI5NyAzLjU1MDU3IDE4LjE5MDcgMy44NTcwNiAxOC4xOTA3IDQuMTY2NTlDMTguMTkwNyA0LjQ3NjEyIDE4LjEyOTcgNC43ODI2MiAxOC4wMTEzIDUuMDY4NTlDMTcuODkyOCA1LjM1NDU1IDE3LjcxOTIgNS42MTQzOSAxNy41MDAzIDUuODMzMjZMNi4yNTAzMyAxNy4wODMzTDEuNjY2OTkgMTguMzMzM0wyLjkxNjk5IDEzLjc0OTlMMTQuMTY3IDIuNDk5OTNaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8yNTc5XzI1MTI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+RWRpdCBEZXRhaWxzXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEFwcHJvdmVyIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQgcC00IG1iLTQgZmYtc2VjdGlvbi1jYXJkXCI+XG4gICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbWItMVwiPkFwcHJvdmVyIGNvbmZpZ3VyYXRpb248L2g1PlxuICAgICAgICA8cCBjbGFzcz1cImZmLXNlY3Rpb24tZGVzYyBtYi00XCI+XG4gICAgICAgICAgICBTZXQgbGV2ZWwgb2YgcmV2aXNpb25zIHJlcXVpcmVkIGZvciBhIHN0b3JlIHJhaXNlZCB0aWNrZXRzXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJyZXZpc2lvblwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBnYXAtNVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmV2IG9mIHJldmlzaW9uQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFwcHJvdmVyLW9wdGlvbiBkLWZsZXggZmxleC1jb2x1bW5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1vcHRpb25dPVwiKHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdhcHByb3ZlcicgJiYgaXNBcHByb3ZlckRpc2FibGVkKSB8fCAocmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3RhbmdvJyAmJiBpc1RhbmdvRGlzYWJsZWQpXCI+XG5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3ggYWxpZ24taXRlbXMtc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY2hlY2tib3hdPVwiKHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdhcHByb3ZlcicgJiYgaXNBcHByb3ZlckRpc2FibGVkKSB8fCAocmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSA9PT0gJ3RhbmdvJyAmJiBpc1RhbmdvRGlzYWJsZWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0NoZWNrZWRcIiBbaWRdPVwiJ2FjdGlvbi0nICsgaVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2ttYXJrXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYyB0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicmV2LmdldCgnYWN0aW9uVHlwZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3Jldmlld2VyJ1wiPlRoZSB0aWNrZXQgdW5kZXJnb2VzIGEgc2luZ2xlIHJldmlldyB0byB2ZXJpZnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvb3RmYWxsLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidhcHByb3ZlcidcIj5UaGUgdGlja2V0IHVuZGVyZ29lcyBhIGZpbmFsIHJldmlldyBhZnRlciB0aGUgaW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2suPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3RhbmdvJ1wiPkZpbmFsaXplIHRpY2tldHMgYW5kIHVwZGF0ZSBmb290ZmFsbCBjb3VudC48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGhyIGNsYXNzPVwiZmYtZGl2aWRlclwiPlxuXG4gICAgPCEtLSBTdG9yZSBTUE9DIFRpY2tldCBDcmVhdGlvbiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cbiAgICAgICAgPGg1IGNsYXNzPVwiZmYtc2VjdGlvbi10aXRsZSBtYi0zXCI+U3RvcmUgU1BPQyBUaWNrZXQgQ3JlYXRpb248L2g1PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMlwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMFwiPlxuICAgICAgICAgICAgICAgIEFsbG93IHN0b3JlIFNQT0MgdG8gY3JlYXRlIHRpY2tldHMgb25seSBmb3IgdGhlIGxhc3RcbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0IG1zLTJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlblwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FsbG93VGlja2V0Q3JlYXRpb24nKT8udmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwb2NUaWNrZXRDcmVhdGlvbmRheXNbMF0gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHNwb2NUaWNrZXRDcmVhdGlvbmRheXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbG93VGlja2V0Q3JlYXRpb24oJGV2ZW50LCBkYXkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi0wXCI+RGF5czwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8aHIgY2xhc3M9XCJmZi1kaXZpZGVyXCI+XG5cbiAgICA8IS0tIFRpY2tldCBBdXRvLWNsb3NlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG0tMFwiPlRpY2tldCBBdXRvLWNsb3NlPC9oNT5cblxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3dpdGNoIG0tMCBtcy0zXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0F1dG9DbG9zZUVuYWJsZVwiIFtkaXNhYmxlZF09XCJpc0VkaXRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNsaWRlciByb3VuZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItMFwiPlxuICAgICAgICAgICAgICAgIFRpY2tldCBzaG91bGQgYmUgYXV0by1jbG9zZWQsIGlmIHRoZSBjcmVhdGVkIHRpY2tldCBhY2N1cmFjeSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3QgbXMtMlwiIFtjbGFzcy5vcGVuXT1cImlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0IHx8ICFmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnaXNBdXRvQ2xvc2VFbmFibGUnKT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlQXV0b0Nsb3NlRHJvcGRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYXV0b0Nsb3NlQWNjdXJhY3knKT8udmFsdWUgfHwgJzElJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2YgYWNjdXJhY3lQZXJjZW50YWdlTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXV0b0Nsb3NlQWNjdXJhY3koJGV2ZW50LCBwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcCB9fSVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8aHIgY2xhc3M9XCJmZi1kaXZpZGVyXCI+XG5cbiAgICA8IS0tIEZvb3RmYWxsIERpcmVjdG9yeSBMaW1pdGF0aW9ucyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCIgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbS0wXCI+Rm9vdGZhbGwgZGlyZWN0b3J5IGxpbWl0YXRpb25zPC9oNT5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZmLXNlY3Rpb24tZGVzYyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIFNldCBtYXhpbXVtIGxpbWl0YXRpb24gZm9yIHN0b3JlcyB0byB0YWcgbm9uLVB1cmNoYXNlcnMgZnJvbSBUb3RhbCBGb290ZmFsbFxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXNFZGl0XCIgY2xhc3M9XCJhZGQtbmV3LWJ0biBkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DYXRlZ29yeU1vZGFsKCdhZGQnKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggMy4zMzMzNFYxMi42NjY3TTMuMzMzMzQgOEgxMi42NjY3XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4+QWRkIE5ldzwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIENhdGVnb3J5IENhcmRzIEdyaWQgLS0+XG4gICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInRhZ2dpbmdMaW1pdGF0aW9uXCIgY2xhc3M9XCJjYXRlZ29yeS1ncmlkIG10LTNcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhZyBvZiB0YWdMaW1pdHMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJjYXRlZ29yeS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWNhcmQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1pY29uXCIgW25nQ2xhc3NdPVwidGFnLmdldCgnaWNvbk5hbWUnKT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2R1cGxpY2F0ZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTE2Ml8yNDYyMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjUgNy41SDJDMS43MzQ3OCA3LjUgMS40ODA0MyA3LjM5NDY0IDEuMjkyODkgNy4yMDcxMUMxLjEwNTM2IDcuMDE5NTcgMSA2Ljc2NTIyIDEgNi41VjJDMSAxLjczNDc4IDEuMTA1MzYgMS40ODA0MyAxLjI5Mjg5IDEuMjkyODlDMS40ODA0MyAxLjEwNTM2IDEuNzM0NzggMSAyIDFINi41QzYuNzY1MjIgMSA3LjAxOTU3IDEuMTA1MzYgNy4yMDcxMSAxLjI5Mjg5QzcuMzk0NjQgMS40ODA0MyA3LjUgMS43MzQ3OCA3LjUgMlYyLjVNNS41IDQuNUgxMEMxMC41NTIzIDQuNSAxMSA0Ljk0NzcyIDExIDUuNVYxMEMxMSAxMC41NTIzIDEwLjU1MjMgMTEgMTAgMTFINS41QzQuOTQ3NzIgMTEgNC41IDEwLjU1MjMgNC41IDEwVjUuNUM0LjUgNC45NDc3MiA0Ljk0NzcyIDQuNSA1LjUgNC41WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzExNjJfMjQ2MjFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2VtcGxveWVlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDE2IDEzXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuMTY2NyAxMi41VjExLjE2NjdDMTEuMTY2NyAxMC40NTk0IDEwLjg4NTcgOS43ODExNSAxMC4zODU2IDkuMjgxMDVDOS44ODU1MiA4Ljc4MDk1IDkuMjA3MjQgOC41IDguNSA4LjVIMy4xNjY2N0MyLjQ1OTQyIDguNSAxLjc4MTE1IDguNzgwOTUgMS4yODEwNSA5LjI4MTA1QzAuNzgwOTUyIDkuNzgxMTUgMC41IDEwLjQ1OTQgMC41IDExLjE2NjdWMTIuNU0xNS4xNjY3IDEyLjVWMTEuMTY2N0MxNS4xNjYyIDEwLjU3NTggMTQuOTY5NiAxMC4wMDE4IDE0LjYwNzYgOS41MzQ4OEMxNC4yNDU2IDkuMDY3OTEgMTMuNzM4OCA4LjczNDM4IDEzLjE2NjcgOC41ODY2N00xMC41IDAuNTg2NjY3QzExLjA3MzYgMC43MzM1MzQgMTEuNTgyIDEuMDY3MTMgMTEuOTQ1MSAxLjUzNDg3QzEyLjMwODIgMi4wMDI2MSAxMi41MDUyIDIuNTc3ODkgMTIuNTA1MiAzLjE3QzEyLjUwNTIgMy43NjIxMSAxMi4zMDgyIDQuMzM3MzkgMTEuOTQ1MSA0LjgwNTEzQzExLjU4MiA1LjI3Mjg3IDExLjA3MzYgNS42MDY0NyAxMC41IDUuNzUzMzNNOC41IDMuMTY2NjdDOC41IDQuNjM5NDMgNy4zMDYwOSA1LjgzMzMzIDUuODMzMzMgNS44MzMzM0M0LjM2MDU3IDUuODMzMzMgMy4xNjY2NyA0LjYzOTQzIDMuMTY2NjcgMy4xNjY2N0MzLjE2NjY3IDEuNjkzOTEgNC4zNjA1NyAwLjUgNS44MzMzMyAwLjVDNy4zMDYwOSAwLjUgOC41IDEuNjkzOTEgOC41IDMuMTY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInaG91c2VLZWVwaW5nVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMTYyXzI0NjUwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4wNDk4MyAwLjU0NDk0N0M3Ljc0NzM4IC0wLjE4MTY0OSA4Ljg3ODI5IC0wLjE4MTY0OSA5LjU3NTg0IDAuNTQ0OTQ3TDE1LjQ2OTcgNi42ODQ0QzE2LjE2NzIgNy40MTEwMSAxNi4xNjcyIDguNTg5MDQgMTUuNDY5NyA5LjMxNTY1TDkuNTc1ODQgMTUuNDU1MUM4Ljg3ODI5IDE2LjE4MTYgNy43NDczOCAxNi4xODE2IDcuMDQ5ODMgMTUuNDU1MUw1LjM2NTYyIDEzLjcwMDdMMy44MjE3OSAxNS4zMDg4QzMuMTI0MjYgMTYuMDM1NCAxLjk5MzM0IDE2LjAzNTQgMS4yOTU4IDE1LjMwODhDMC41OTgyNzIgMTQuNTgyMyAwLjU5ODI3MiAxMy40MDQyIDEuMjk1OCAxMi42Nzc3TDIuODM5NjQgMTEuMDY5NUwxLjE1NTk2IDkuMzE1NjVDMC40NTg0MjkgOC41ODkwNCAwLjQ1ODQyOSA3LjQxMTAxIDEuMTU1OTYgNi42ODQ0TDcuMDQ5ODMgMC41NDQ5NDdaTTguNzMzODEgMS40MjIwM0M4LjUwMTI5IDEuMTc5ODMgOC4xMjQzIDEuMTc5ODMgNy44OTE3OCAxLjQyMjAzTDMuNjgxNjUgNS44MDc2MkwxMC40MTc1IDEyLjgyNDJMMTQuNjI3NyA4LjQzODU0QzE0Ljg2MDIgOC4xOTYzNCAxNC44NjAyIDcuODAzNjMgMTQuNjI3NyA3LjU2MTUxTDExLjY4MDUgNC40OTE0M0wxMC42OTgxIDUuNTE0NjlDMTAuNDY1NiA1Ljc1Njg5IDEwLjA4ODcgNS43NTY4OSA5Ljg1NjE0IDUuNTE0NjlDOS42MjM2MyA1LjI3MjQ5IDkuNjIzNjMgNC44Nzk4MSA5Ljg1NjE0IDQuNjM3NjFMMTAuODM4NCAzLjYxNDM1TDkuOTk2NjUgMi43Mzc0Nkw3LjYxMSA1LjIyMjUyQzcuMzc4NDkgNS40NjQ3MSA3LjAwMTQ5IDUuNDY0NzEgNi43Njg5NyA1LjIyMjUyQzYuNTM2NDYgNC45ODAzMiA2LjUzNjQ2IDQuNTg3NjMgNi43Njg5NyA0LjM0NTQ0TDkuMTU0NjIgMS44NjAzOEw4LjczMzgxIDEuNDIyMDNaTTkuNTc1NTIgMTMuNzAxMkwyLjgzOTY2IDYuNjg0N0wxLjk5Nzk2IDcuNTYxNTFDMS43NjU0NCA3LjgwMzYzIDEuNzY1NDQgOC4xOTYzNCAxLjk5Nzk2IDguNDM4NTRMNy44OTE3OCAxNC41NzhDOC4xMjQzIDE0LjgyMDIgOC41MDEyOSAxNC44MjAyIDguNzMzODEgMTQuNTc4TDkuNTc1NTIgMTMuNzAxMlpNMy42ODE1NiAxMS45NDY2TDIuMTM3OCAxMy41NTQ3QzEuOTA1MjkgMTMuNzk2OSAxLjkwNTI5IDE0LjE4OTYgMi4xMzc4IDE0LjQzMThDMi4zNzAzMSAxNC42NzQgMi43NDcyOSAxNC42NzQgMi45Nzk4IDE0LjQzMThMNC41MjM1NSAxMi44MjM3TDMuNjgxNTYgMTEuOTQ2NlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTE2Ml8yNDY1MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInanVua1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIgNC4wMDAwNEgzLjMzMzMzTTMuMzMzMzMgNC4wMDAwNEgxNE0zLjMzMzMzIDQuMDAwMDRWMTMuMzMzNEMzLjMzMzMzIDEzLjY4NyAzLjQ3MzgxIDE0LjAyNjEgMy43MjM4NiAxNC4yNzYyQzMuOTczOTEgMTQuNTI2MiA0LjMxMzA0IDE0LjY2NjcgNC42NjY2NyAxNC42NjY3SDExLjMzMzNDMTEuNjg3IDE0LjY2NjcgMTIuMDI2MSAxNC41MjYyIDEyLjI3NjEgMTQuMjc2MkMxMi41MjYyIDE0LjAyNjEgMTIuNjY2NyAxMy42ODcgMTIuNjY2NyAxMy4zMzM0VjQuMDAwMDRIMy4zMzMzM1pNNS4zMzMzMyA0LjAwMDA0VjIuNjY2NzFDNS4zMzMzMyAyLjMxMzA5IDUuNDczODEgMS45NzM5NSA1LjcyMzg2IDEuNzIzOUM1Ljk3MzkxIDEuNDczODUgNi4zMTMwNCAxLjMzMzM3IDYuNjY2NjcgMS4zMzMzN0g5LjMzMzMzQzkuNjg2OTYgMS4zMzMzNyAxMC4wMjYxIDEuNDczODUgMTAuMjc2MSAxLjcyMzlDMTAuNTI2MiAxLjk3Mzk1IDEwLjY2NjcgMi4zMTMwOSAxMC42NjY3IDIuNjY2NzFWNC4wMDAwNE02LjY2NjY3IDcuMzMzMzdWMTEuMzMzNE05LjMzMzMzIDcuMzMzMzdWMTEuMzMzNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCIncHVycGxlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidvcmFuZ2VUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGFnLmdldCgnbmFtZScpPy52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIodGFnLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgIT09ICdkdXBsaWNhdGVUYWcnICYmIHRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlICE9PSAnZW1wbG95ZWVUYWcnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYXRlZ29yeS1tZW51LWJ0blwiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeU1lbnUoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNUMxMi41NTIzIDUgMTMgNC41NTIyOCAxMyA0QzEzIDMuNDQ3NzIgMTIuNTUyMyAzIDEyIDNDMTEuNDQ3NyAzIDExIDMuNDQ3NzIgMTEgNEMxMSA0LjU1MjI4IDExLjQ0NzcgNSAxMiA1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDEzQzEyLjU1MjMgMTMgMTMgMTIuNTUyMyAxMyAxMkMxMyAxMS40NDc3IDEyLjU1MjMgMTEgMTIgMTFDMTEuNDQ3NyAxMSAxMSAxMS40NDc3IDExIDEyQzExIDEyLjU1MjMgMTEuNDQ3NyAxMyAxMiAxM1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiAyMUMxMi41NTIzIDIxIDEzIDIwLjU1MjMgMTMgMjBDMTMgMTkuNDQ3NyAxMi41NTIzIDE5IDEyIDE5QzExLjQ0NzcgMTkgMTEgMTkuNDQ3NyAxMSAyMEMxMSAyMC41NTIzIDExLjQ0NzcgMjEgMTIgMjFaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktbWVudVwiICpuZ0lmPVwiYWN0aXZlTWVudUluZGV4ID09PSBpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYXRlZ29yeU1lbnVBY3Rpb24oJGV2ZW50LCAnZWRpdCcsIGkpXCI+RWRpdCBOYW1lPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYXRlZ29yeU1lbnVBY3Rpb24oJGV2ZW50LCAnZGVsZXRlJywgaSlcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktcGVyY2VudGFnZS1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cIm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPT09IGlcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVMaW1pdERyb3Bkb3duKCRldmVudCwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0YWcuZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCAwIH19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwib3BlbkxpbWl0RHJvcGRvd25JbmRleCA9PT0gaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHBlcmNlbnRhZ2VMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExpbWl0VmFsdWUoJGV2ZW50LCBpLCBwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gT3ZlcmFsbCBsaW1pdGF0aW9uOiBjb21iaW5lZCBjYXAgYWNyb3NzIGFsbCB0YWcgdHlwZXMgKHNhdmVkIHRvIEFQSSBhcyBvdmVyYWxsTGltaXRhdGlvbiwgZS5nLiBcIjMwJVwiKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgZmYtb3ZlcmFsbC1saW1pdGF0aW9uXCI+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG0tMFwiPk92ZXJhbGwgbGltaXRhdGlvbnM8L2g2PlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmZi1zZWN0aW9uLWRlc2MgbWItMlwiPlxuICAgICAgICAgICAgICAgIENvbWJpbmVkIG1heGltdW0gbGltaXRhdGlvbiBhY3Jvc3MgYWxsIG5vbi1QdXJjaGFzZXIgdGFnc1xuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlIGZmLXNlbGVjdC13cmFwcGVyIGNvbXBhY3RcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzT3ZlcmFsbExpbWl0YXRpb25Ecm9wZG93bk9wZW5cIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU92ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBvdmVyYWxsTGltaXRhdGlvbkxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc092ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHBlcmNlbnRhZ2VMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RPdmVyYWxsTGltaXRhdGlvbigkZXZlbnQsIHApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxociBjbGFzcz1cImZmLWRpdmlkZXJcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxuXG4gICAgPCEtLSBTdG9yZSBSZXF1ZXN0cyAtLT5cbiAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJhY2N1cmFjeUJyZWFjaFwiIGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1zdGFydCBtYi00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbWItMlwiPlN0b3JlIFJlcXVlc3RzPC9oNT5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZmLXNlY3Rpb24tZGVzYyBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgIEJlbG93IHN0b3JlcyBoYXZlIHJlcXVlc3RlZCB0byByYWlzZSBhIHRpY2tldCBhZnRlciBicmVhY2hpbmcgdGhlIGNvbmZpZ3VyZWQgbGltaXRcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmZvLWljb25cIj5pPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcmVzZXQtYnRuIGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0VkaXRcIiBbZGlzYWJsZWRdPVwiaXNSZXNldERpc2FibGVkXCIgKGNsaWNrKT1cIm9wZW5SZXNldENvbmZpcm1hdGlvbk1vZGFsKClcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5SZXNldDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc3RyaWN0aW9uIENyaXRlcmlhIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdHJpY3Rpb24tY3JpdGVyaWEgbWItNFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMyBkLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgUmVzdHJpY3QgdGlja2V0IGNyZWF0aW9uIGZvciBhbnkgc3RvcmUgdGhhdDpcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LW5vd3JhcCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPkhhcyByYWlzZWQgbW9yZSB0aGFuPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0XCIgW2NsYXNzLm9wZW5dPVwiaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZVRpY2tldENvdW50RHJvcGRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50Jyk/LnZhbHVlIHx8IDEgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IGMgb2YgWzEsIDIsIDMsIDQsIDVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGlja2V0Q291bnQoJGV2ZW50LCBjKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3Bhbj50aWNrZXRzIGluIHRoZSBjYWxlbmRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBzdG9yZS1kYXlzLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzU3RvcmVEYXlzRHJvcGRvd25PcGVuXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlU3RvcmVEYXlzRHJvcGRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2VsZWN0ZWREYXlzTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzU3RvcmVEYXlzRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0IG9mIGRheXNPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U3RvcmVEYXlzKCRldmVudCwgb3B0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuPmJhc2VkIG9uIGNvbmZpZ3VyZWQgY29uZGl0aW9uc1xuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCIgW25nYlRvb2x0aXBdPVwiY29uZGl0aW9uc1Rvb2x0aXBcIiB0b29sdGlwQ2xhc3M9XCJjb25kaXRpb25zLXRvb2x0aXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTQzMl84MDAzNSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwNjUgMTAuNjY2NlY3Ljk5OTkyTTguMDAwNjUgNS4zMzMyNUg4LjAwNzMyTTE0LjY2NzMgNy45OTk5MkMxNC42NjczIDExLjY4MTggMTEuNjgyNiAxNC42NjY2IDguMDAwNjUgMTQuNjY2NkM0LjMxODc1IDE0LjY2NjYgMS4zMzM5OCAxMS42ODE4IDEuMzMzOTggNy45OTk5MkMxLjMzMzk4IDQuMzE4MDIgNC4zMTg3NSAxLjMzMzI1IDguMDAwNjUgMS4zMzMyNUMxMS42ODI2IDEuMzMzMjUgMTQuNjY3MyA0LjMxODAyIDE0LjY2NzMgNy45OTk5MlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xNDMyXzgwMDM1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29uZGl0aW9uc1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxLjY7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj4xLjwvYj4gRGVsdGEgYmV0d2VlbiBTdG9yZS9BT00gYWNjdXJhY3kgYW5kIENlbnRyYWwgT3BzL1RhbmdvIGFjY3VyYWN5IGV4Y2VlZHMgMTAlPGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+Mi48L2I+IFRoZSBvdmVyYWxsIGFjY3VyYWN5IGFmdGVyIGFsbCByZXZpZXdzIGlzIGdyZWF0ZXIgdGhhbiA4NSUuPGJyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGI+My48L2I+IE92ZXJhbGwgdGhlIE51bWJlciBvZiBJbWFnZXMgKEZvb3RmYWxsKSBtYXJrZWQgZm9yIHZhbGlkYXRpb24gaW4gdGhlIHRpY2tldCBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIGlzIExlc3MgdGhhbiBlcXVhbCB0byAxMFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU3RvcmUgUmVxdWVzdHMgVGFibGUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1yZXF1ZXN0cy10YWJsZVwiIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIlxuICAgICAgICAgICAgKm5nSWY9XCJzdG9yZUxpc3Q/Lmxlbmd0aCA+IDA7IGVsc2UgZW1wdHlTdG9yZVJlcXVlc3RzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIFtuZ0NsYXNzXT1cInsnc3RvcmUtdGFibGUtc2Nyb2xsJzogc3RvcmVMaXN0Py5sZW5ndGggPiA1fVwiPlxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLWhvdmVyIHN0b3JlLXJlcXVlc3RzLXRhYmxlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNoZWNrYm94LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jaGVja2JveC1zZWxlY3QgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmstc2VsZWN0XCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlIHN0b3JlLW5hbWUtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2VsZWN0IGFsbCBzdG9yZXMgKHt7IHN0b3JlTGlzdD8ubGVuZ3RoIHx8IDAgfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1zLTIgZHJvcGRvd24tYXJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhaXNlZCBvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDEuNUw5IDQuNU0zIDcuNUw2IDEwLjVMOSA3LjVcIiBzdHJva2U9XCIjMzQ0MDU0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgcmFpc2VkKEFwcHJvdmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDEuNUw5IDQuNU0zIDcuNUw2IDEwLjVMOSA3LjVcIiBzdHJva2U9XCIjMzQ0MDU0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIG9mIFRpbWUgUmFpc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1zLTEgc29ydC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgMS41TDkgNC41TTMgNy41TDYgMTAuNUw5IDcuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHN0b3JlIG9mIHN0b3JlTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNoZWNrYm94LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtc2VsZWN0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNjYiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1N0b3JlU2VsZWN0ZWQoc3RvcmUpXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTdG9yZVNlbGVjdGlvbihzdG9yZSwgY2IuY2hlY2tlZClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmstc2VsZWN0XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnN0b3JlTmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnJhaXNlZE9uIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgc3RvcmUubGFzdEFwcHJvdmVkIHx8ICctJyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnRvdGFsUmFpc2VkIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eVN0b3JlUmVxdWVzdHM+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RvcmUtc3RhdGUgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktc3RvcmUtaWNvbiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguOTQ2MjkgMjEuMTk5NUM4LjY0NSAyMS4yMzEzIDguMzM4MjggMjEuMjUwMiA4LjAyNzM0IDIxLjI1MDJDNy44NTc4MiAyMS4yNTAyIDcuNjkwNTIgMjEuMjQzNCA3LjUyNTM5IDIxLjIzMzZWMzEuNjA2N0M3LjUyNTM5IDMzLjAzNDcgOC43MDgzNyAzNC4yMjU4IDEwLjE5NjMgMzQuMjI1OEgyOS44MDA4QzMxLjI4ODggMzQuMjI1OCAzMi40NzE3IDMzLjAzNDcgMzIuNDcxNyAzMS42MDY3VjIxLjIzNDZDMzIuMzA5OCAyMS4yNDM4IDMyLjE0NTkgMjEuMjUwMiAzMS45ODE0IDIxLjI1MDJDMzEuNjY3NSAyMS4yNTAyIDMxLjM1NjkgMjEuMjMyMyAzMS4wNTA4IDIxLjE5OTVWMjguOTg3NUg4Ljk0NjI5VjIxLjE5OTVaTTMwLjkyNzcgNS43NzM2OEg5LjA2OTM0QzguODkxOTcgNS43NzM2OCA4LjczNjcxIDUuODY2NDcgOC42NTkxOCA1Ljk4NzU1TDguNjU3MjMgNS45ODk1TDUuMTQ3NDYgMTEuNDcyOUw1LjA1MjczIDExLjYyMDRDMy44MjcxOSAxMy43NDAyIDUuMDkxOCAxNi40NjcxIDcuNDQzMzYgMTYuNzc2NkM3LjY0NDI4IDE2LjgwMTEgNy44MzQwMyAxNi44MTU3IDguMDIxNDggMTYuODE1N0M5LjI1MTU2IDE2LjgxNTcgMTAuMzM5NSAxNi4yODcgMTEuMDk2NyAxNS40NjUxTDEyLjAxODYgMTQuNDY0MUwxMi45Mzc1IDE1LjQ2OEMxMy42ODY0IDE2LjI4NjEgMTQuNzczMSAxNi44MTU3IDE2LjAxMDcgMTYuODE1N0MxNy4yNDI4IDE2LjgxNTYgMTguMzM0NyAxNi4yODU0IDE5LjA4MyAxNS40NjhMMjAuMDA0OSAxNC40NjEyTDIwLjkyNjggMTUuNDY4QzIxLjY3NTEgMTYuMjg1NSAyMi43NjY4IDE2LjgxNTcgMjMuOTk5IDE2LjgxNTdDMjUuMjMxMiAxNi44MTU3IDI2LjMyMjkgMTYuMjg1NCAyNy4wNzEzIDE1LjQ2OEwyNy45OTMyIDE0LjQ2MTJMMjguOTE1IDE1LjQ2OEMyOS42NjM0IDE2LjI4NTUgMzAuNzU2IDE2LjgxNTcgMzEuOTg4MyAxNi44MTU3QzMyLjE2OTcgMTYuODE1NyAzMi4zNjQ4IDE2LjgwMTggMzIuNTY0NSAxNi43Nzc2SDMyLjU2MzVDMzQuOTU3MiAxNi40NTcxIDM2LjIyNTQgMTMuNjA3NSAzNC44NTc0IDExLjQ3MjlMMzQuODU2NCAxMS40NzM5TDMxLjMzOTggNS45OTA0OEwzMS4zMzg5IDUuOTg3NTVDMzEuMjYxNCA1Ljg2NjI4IDMxLjEwNTMgNS43NzM2OCAzMC45Mjc3IDUuNzczNjhaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIGZ3LXNlbWlib2xkIHRleHQtbXV0ZWRcIj5ObyByZXNldCByZXF1ZXN0IGZyb20gc3RvcmU8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cblxuICAgIDxociBjbGFzcz1cImZmLWRpdmlkZXJcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxuXG4gICAgPCEtLSBTZW5kIFRpY2tldCB0byBUYW5nbyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCIgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxuICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG1iLTFcIj5TZW5kIFRpY2tldCB0byBUYW5nbzwvaDU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1lLTIgbWItMCB0YW5nby1sYWJlbFwiPlNlbmQgdGlja2V0IHRvIFRhbmdvIGlmIGFjY3VyYWN5IGZhbGxzIGJlbG93PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0IG1zLTBcIiBbY2xhc3Mub3Blbl09XCJpc3NlbmRUYW5nb0Ryb3Bkb3duT3BlblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiIChjbGljayk9XCJ0b2dnbGVTZW5kVGFuZ29DbG9zZURyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhbmdvUmV2aWV3Jyk/LnZhbHVlIHx8ICcxJScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzc2VuZFRhbmdvRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHNlbmRUaWNrZXRUYW5nb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0U2VuZFRpY2tldFRhbmdvKCRldmVudCwgcClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb290ZXIgQWN0aW9ucyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItNSB3LTEwMCBmb290ZXItc2VwZXJhdG9yXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIG10LTEgcHQtMyBtZS00XCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2E+XG4gICAgICAgICAgICA8YSB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcHgtNFwiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+PHNwYW4+U2F2ZSBDaGFuZ2VzPC9zcGFuPjwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENhdGVnb3J5IE1vZGFsIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjY2F0ZWdvcnlNb2RhbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBib3JkZXItMCBwYi0wXCI+XG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJyA/ICdBZGQgTmV3IENhdGVnb3J5JyA6ICdFZGl0IENhdGVnb3J5JyB9fVxuICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNsb3NlQ2F0ZWdvcnlNb2RhbCgpXCI+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBjYXRlZ29yeS1tb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNhdGVnb3J5Rm9ybVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkljb248L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LXdyYXBwZXIgaWNvbi1zZWxlY3RcIiBbY2xhc3Mub3Blbl09XCJpc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlXCIgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3J5SWNvbkRyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjYXRlZ29yeUZvcm0uZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCBiYXNlQ2F0ZWdvcnlJY29uc1swXT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiY2F0ZWdvcnlGb3JtLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgYmFzZUNhdGVnb3J5SWNvbnNbMF0/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3B1cnBsZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ29yYW5nZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2hvdXNlS2VlcGluZ1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfaWNvbl9ob3VzZWtlZXBpbmcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjA0OTgzIDAuNTQ0OTQ3QzcuNzQ3MzggLTAuMTgxNjQ5IDguODc4MjkgLTAuMTgxNjQ5IDkuNTc1ODQgMC41NDQ5NDdMMTUuNDY5NyA2LjY4NDRDMTYuMTY3MiA3LjQxMTAxIDE2LjE2NzIgOC41ODkwNCAxNS40Njk3IDkuMzE1NjVMOS41NzU4NCAxNS40NTUxQzguODc4MjkgMTYuMTgxNiA3Ljc0NzM4IDE2LjE4MTYgNy4wNDk4MyAxNS40NTUxTDUuMzY1NjIgMTMuNzAwN0wzLjgyMTc5IDE1LjMwODhDMy4xMjQyNiAxNi4wMzU0IDEuOTkzMzQgMTYuMDM1NCAxLjI5NTggMTUuMzA4OEMwLjU5ODI3MiAxNC41ODIzIDAuNTk4MjcyIDEzLjQwNDIgMS4yOTU4IDEyLjY3NzdMMi44Mzk2NCAxMS4wNjk1TDEuMTU1OTYgOS4zMTU2NUMwLjQ1ODQyOSA4LjU4OTA0IDAuNDU4NDI5IDcuNDExMDEgMS4xNTU5NiA2LjY4NDRMNy4wNDk4MyAwLjU0NDk0N1pNOC43MzM4MSAxLjQyMjAzQzguNTAxMjkgMS4xNzk4MyA4LjEyNDMgMS4xNzk4MyA3Ljg5MTc4IDEuNDIyMDNMMy42ODE2NSA1LjgwNzYyTDEwLjQxNzUgMTIuODI0MkwxNC42Mjc3IDguNDM4NTRDMTQuODYwMiA4LjE5NjM0IDE0Ljg2MDIgNy44MDM2MyAxNC42Mjc3IDcuNTYxNTFMMTEuNjgwNSA0LjQ5MTQzTDEwLjY5ODEgNS41MTQ2OUMxMC40NjU2IDUuNzU2ODkgMTAuMDg4NyA1Ljc1Njg5IDkuODU2MTQgNS41MTQ2OUM5LjYyMzYzIDUuMjcyNDkgOS42MjM2MyA0Ljg3OTgxIDkuODU2MTQgNC42Mzc2MUwxMC44Mzg0IDMuNjE0MzVMOS45OTY2NSAyLjczNzQ2TDcuNjExIDUuMjIyNTJDNy4zNzg0OSA1LjQ2NDcxIDcuMDAxNDkgNS40NjQ3MSA2Ljc2ODk3IDUuMjIyNTJDNi41MzY0NiA0Ljk4MDMyIDYuNTM2NDYgNC41ODc2MyA2Ljc2ODk3IDQuMzQ1NDRMOS4xNTQ2MiAxLjg2MDM4TDguNzMzODEgMS40MjIwM1pNOS41NzU1MiAxMy43MDEyTDIuODM5NjYgNi42ODQ3TDEuOTk3OTYgNy41NjE1MUMxLjc2NTQ0IDcuODAzNjMgMS43NjU0NCA4LjE5NjM0IDEuOTk3OTYgOC40Mzg1NEw3Ljg5MTc4IDE0LjU3OEM4LjEyNDMgMTQuODIwMiA4LjUwMTI5IDE0LjgyMDIgOC43MzM4MSAxNC41NzhMOS41NzU1MiAxMy43MDEyWk0zLjY4MTU2IDExLjk0NjZMMi4xMzc4IDEzLjU1NDdDMS45MDUyOSAxMy43OTY5IDEuOTA1MjkgMTQuMTg5NiAyLjEzNzggMTQuNDMxOEMyLjM3MDMxIDE0LjY3NCAyLjc0NzI5IDE0LjY3NCAyLjk3OTggMTQuNDMxOEw0LjUyMzU1IDEyLjgyMzdMMy42ODE1NiAxMS45NDY2WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF9pY29uX2hvdXNla2VlcGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2p1bmtUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWxhYmVsXCI+e3sgc2VsZWN0ZWRDYXRlZ29yeUljb25MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjYXRlZ29yeUljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5SWNvbkZyb21Ecm9wZG93bigkZXZlbnQsIGljb24udmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiIFtuZ0NsYXNzXT1cImljb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImljb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCIncHVycGxlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInb3JhbmdlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjAuNzA3MSAxMy4yOTI5TDExLjQxNDIgNEg0VjExLjQxNDJMMTMuMjkyOSAyMC43MDcxQzEzLjY4MzQgMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTQuNzA3MSAyMC43MDcxTDIwLjcwNzEgMTQuNzA3MUMyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxMy42ODM0IDIwLjcwNzEgMTMuMjkyOVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyA3SDcuMDFcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInaG91c2VLZWVwaW5nVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMTYyXzI0NjUwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4wNDk4MyAwLjU0NDk0N0M3Ljc0NzM4IC0wLjE4MTY0OSA4Ljg3ODI5IC0wLjE4MTY0OSA5LjU3NTg0IDAuNTQ0OTQ3TDE1LjQ2OTcgNi42ODQ0QzE2LjE2NzIgNy40MTEwMSAxNi4xNjcyIDguNTg5MDQgMTUuNDY5NyA5LjMxNTY1TDkuNTc1ODQgMTUuNDU1MUM4Ljg3ODI5IDE2LjE4MTYgNy43NDczOCAxNi4xODE2IDcuMDQ5ODMgMTUuNDU1MUw1LjM2NTYyIDEzLjcwMDdMMy44MjE3OSAxNS4zMDg4QzMuMTI0MjYgMTYuMDM1NCAxLjk5MzM0IDE2LjAzNTQgMS4yOTU4IDE1LjMwODhDMC41OTgyNzIgMTQuNTgyMyAwLjU5ODI3MiAxMy40MDQyIDEuMjk1OCAxMi42Nzc3TDIuODM5NjQgMTEuMDY5NUwxLjE1NTk2IDkuMzE1NjVDMC40NTg0MjkgOC41ODkwNCAwLjQ1ODQyOSA3LjQxMTAxIDEuMTU1OTYgNi42ODQ0TDcuMDQ5ODMgMC41NDQ5NDdaTTguNzMzODEgMS40MjIwM0M4LjUwMTI5IDEuMTc5ODMgOC4xMjQzIDEuMTc5ODMgNy44OTE3OCAxLjQyMjAzTDMuNjgxNjUgNS44MDc2MkwxMC40MTc1IDEyLjgyNDJMMTQuNjI3NyA4LjQzODU0QzE0Ljg2MDIgOC4xOTYzNCAxNC44NjAyIDcuODAzNjMgMTQuNjI3NyA3LjU2MTUxTDExLjY4MDUgNC40OTE0M0wxMC42OTgxIDUuNTE0NjlDMTAuNDY1NiA1Ljc1Njg5IDEwLjA4ODcgNS43NTY4OSA5Ljg1NjE0IDUuNTE0NjlDOS42MjM2MyA1LjI3MjQ5IDkuNjIzNjMgNC44Nzk4MSA5Ljg1NjE0IDQuNjM3NjFMMTAuODM4NCAzLjYxNDM1TDkuOTk2NjUgMi43Mzc0Nkw3LjYxMSA1LjIyMjUyQzcuMzc4NDkgNS40NjQ3MSA3LjAwMTQ5IDUuNDY0NzEgNi43Njg5NyA1LjIyMjUyQzYuNTM2NDYgNC45ODAzMiA2LjUzNjQ2IDQuNTg3NjMgNi43Njg5NyA0LjM0NTQ0TDkuMTU0NjIgMS44NjAzOEw4LjczMzgxIDEuNDIyMDNaTTkuNTc1NTIgMTMuNzAxMkwyLjgzOTY2IDYuNjg0N0wxLjk5Nzk2IDcuNTYxNTFDMS43NjU0NCA3LjgwMzYzIDEuNzY1NDQgOC4xOTYzNCAxLjk5Nzk2IDguNDM4NTRMNy44OTE3OCAxNC41NzhDOC4xMjQzIDE0LjgyMDIgOC41MDEyOSAxNC44MjAyIDguNzMzODEgMTQuNTc4TDkuNTc1NTIgMTMuNzAxMlpNMy42ODE1NiAxMS45NDY2TDIuMTM3OCAxMy41NTQ3QzEuOTA1MjkgMTMuNzk2OSAxLjkwNTI5IDE0LjE4OTYgMi4xMzc4IDE0LjQzMThDMi4zNzAzMSAxNC42NzQgMi43NDcyOSAxNC42NzQgMi45Nzk4IDE0LjQzMThMNC41MjM1NSAxMi44MjM3TDMuNjgxNTYgMTEuOTQ2NlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTE2Ml8yNDY1MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2p1bmtUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaWNvbi5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkNhdGVnb3J5IE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LmludmFsaWQgJiYgY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy50b3VjaGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBuZXcgY2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgbmFtZSBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdkdXBsaWNhdGUnKSAmJiBjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LnRvdWNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5IG5hbWUgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHRleHQtbXV0ZWRcIj5MaW1pdGF0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC13cmFwcGVyXCIgW2NsYXNzLm9wZW5dPVwiaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGVcIiAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnlMaW1pdERyb3Bkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjYXRlZ29yeUZvcm0uZ2V0KCdsaW1pdCcpPy52YWx1ZSB8fCBwZXJjZW50YWdlTGlzdFswXSB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBwIG9mIHBlcmNlbnRhZ2VMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5TGltaXRWYWx1ZSgkZXZlbnQsIHApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIGJvcmRlci0wIHB0LTBcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImNsb3NlQ2F0ZWdvcnlNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzdWJtaXRDYXRlZ29yeUZvcm0oKVwiPlxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJyA/ICdDcmVhdGUnIDogJ1NhdmUnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gRGVsZXRlIENvbmZpcm1hdGlvbiBNb2RhbCAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2RlbGV0ZUNhdGVnb3J5TW9kYWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHRleHQtY2VudGVyIHAtNFwiPlxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctc2VtaWJvbGQgbWItMlwiPkNvbmZpcm1hdGlvbjwvaDU+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTQgdGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgIFlvdSdyZSBhYm91dCB0byBkZWxldGUgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7IGNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgfX08L3NwYW4+IGNhdGVnb3J5LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VEZWxldGVNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIChjbGljayk9XCJjb25maXJtRGVsZXRlQ2F0ZWdvcnkoKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIFJlc2V0IFN0b3JlIFJlcXVlc3RzIENvbmZpcm1hdGlvbiBNb2RhbCAtLT5cbiAgICA8bmctdGVtcGxhdGUgI3Jlc2V0Q29uZmlybWF0aW9uTW9kYWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHRleHQtY2VudGVyIHAtNFwiPlxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctc2VtaWJvbGQgbWItMlwiPlJlc2V0IFN0b3JlIFJlcXVlc3RzPC9oNT5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItNCB0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCByZXNldHRpbmcgdGhlIHNlbGVjdGVkIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57e1xuICAgICAgICAgICAgICAgICAgICByZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfX08L3NwYW4+IHN0b3JlKHMpIHJlcXVlc3RzP1xuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VSZXNldE1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjb25maXJtUmVzZXRTdG9yZVJlcXVlc3QoKVwiPlJlc2V0PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuPC9mb3JtPlxuIl19
|
|
878
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL2Zvb3RmYWxsLWNvbmZpZ3VyYXRpb24vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQVcxQyxNQUFNLE9BQU8sOEJBQThCO0lBeURyQjtJQUNYO0lBQ0M7SUFDQTtJQUNBO0lBNURWLDRCQUE0QixDQUFhO0lBQ3hCLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLFlBQVksR0FBbUY7UUFDN0YsUUFBUSxFQUFFLEVBQUU7UUFDWixhQUFhLEVBQUUsRUFBRTtLQUNsQixDQUFDO0lBQ0Ysc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDOUIsc0JBQXNCLEdBQWEsRUFBRSxDQUFDO0lBQ3RD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Q0UsNEJBQTRCO2tNQTJEVixnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZTtnQkFDUSxzQkFBc0I7c0JBQXZELFNBQVM7dUJBQUMscUJBQXFCO2dCQUNLLHlCQUF5QjtzQkFBN0QsU0FBUzt1QkFBQyx3QkFBd0I7Z0JBZ2pCbkMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCwgTmdiTW9kYWxSZWYgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1mb290ZmFsbC1jb25maWd1cmF0aW9uJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm9vdGZhbGwtY29uZmlndXJhdGlvbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEZvb3RmYWxsQ29uZmlndXJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybSE6IEZvcm1Hcm91cDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICByZXNldFJlcXVlc3Q6IHsgY2xpZW50SWQ6IHN0cmluZzsgYXJyYXlPZlN0b3JlczogeyBzdG9yZUlkOiBzdHJpbmc7IGRhdGVTdHJpbmc6IHN0cmluZyB9W10gfSA9IHtcclxuICAgIGNsaWVudElkOiAnJyxcclxuICAgIGFycmF5T2ZTdG9yZXM6IFtdXHJcbiAgfTtcclxuICBzcG9jVGlja2V0Q3JlYXRpb25kYXlzID0gWzEsIDIsIDNdO1xyXG4gIHBlcmNlbnRhZ2VMaXN0OiBudW1iZXJbXSA9IFtdO1xyXG4gIGFjY3VyYWN5UGVyY2VudGFnZUxpc3Q6IG51bWJlcltdID0gW107XHJcbiAgc3RvcmVUaWNrZXREYXlzOiBudW1iZXJbXSA9IFtdO1xyXG4gIHNlbmRUaWNrZXRUYW5nbzogbnVtYmVyW10gPSBbXTtcclxuICBpc0VkaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGNsaWVuSWQ6IHN0cmluZztcclxuICBzdG9yZUxpc3Q6IGFueSA9IFtdO1xyXG4gIGlzUmVzZXR0aW5nID0gZmFsc2U7XHJcbiAgY2F0ZWdvcnlGb3JtITogRm9ybUdyb3VwO1xyXG4gIGNhdGVnb3J5TW9kYWxNb2RlOiAnYWRkJyB8ICdlZGl0JyA9ICdhZGQnO1xyXG4gIGVkaXRpbmdDYXRlZ29yeUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBjYXRlZ29yeU1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xyXG4gIGRlbGV0ZU1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xyXG4gIHJlc2V0TW9kYWxSZWY6IE5nYk1vZGFsUmVmIHwgbnVsbCA9IG51bGw7XHJcbiAgY2F0ZWdvcnlUb0RlbGV0ZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBjYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lID0gJyc7XHJcbiAgYWN0aXZlTWVudUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBvcGVuTGltaXREcm9wZG93bkluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBpc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBpc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIGlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBpc1RpY2tldENvdW50RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNTdG9yZURheXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICBkYXlzT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6ICdNb250aCcsIHZhbHVlOiAnMzAnIH0sXHJcbiAgICB7IGxhYmVsOiAnV2VlaycsIHZhbHVlOiAnNycgfVxyXG4gIF07XHJcbiAgaXNTdG9yZUFjY3VyYWN5RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgaXNPdmVyYWxsTGltaXRhdGlvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmV2aXNpb25EZXBzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICByZWFkb25seSBtYXhDYXRlZ29yeUNvdW50ID0gNTtcclxuICByZWFkb25seSBiYXNlQ2F0ZWdvcnlJY29uczphbnkgPSBbXHJcbiAgICAvLyB7IGxhYmVsOiAnQmx1ZSBUYWcnLCB2YWx1ZTogJ2JsdWVUYWcnIH0sXHJcbiAgICB7IGxhYmVsOiAnUHVycGxlIFRhZycsIHZhbHVlOiAncHVycGxlVGFnJyB9LFxyXG4gICAgeyBsYWJlbDogJ09yYW5nZSBUYWcnLCB2YWx1ZTogJ29yYW5nZVRhZycgfVxyXG4gIF07XHJcblxyXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxDYXRlZ29yeUljb25zID0gW1xyXG4gICAgeyBsYWJlbDogJ0hvdXNlIEtlZXBpbmcnLCB2YWx1ZTogJ2hvdXNlS2VlcGluZ1RhZycgfSxcclxuICAgIHsgbGFiZWw6ICdKdW5rJywgdmFsdWU6ICdqdW5rVGFnJyB9XHJcbiAgXTtcclxuXHJcbiAgZm9vdGZhbGxDb25maWdEYXRhOiBhbnkgPSBbXTtcclxuICBAVmlld0NoaWxkKCdjYXRlZ29yeU1vZGFsJykgY2F0ZWdvcnlNb2RhbFRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZGVsZXRlQ2F0ZWdvcnlNb2RhbCcpIGRlbGV0ZUNhdGVnb3J5TW9kYWxUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Jlc2V0Q29uZmlybWF0aW9uTW9kYWwnKSByZXNldENvbmZpcm1hdGlvbk1vZGFsVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogQ2xpZW50QXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSkge1xyXG4gICAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50SWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW5JZCA9IGVcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdC5jbGllbnRJZCA9IGU7XHJcbiAgICAgICAgdGhpcy5nZXRDbGllbnRNYXBwZWRTdG9yZXNEZXRhaWxzKGUpO1xyXG4gICAgICAgIC8vIExvYWQgZm9vdGZhbGwgZGV0YWlscyB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIC8vIHRoaXMubG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhlKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0Q2F0ZWdvcnlGb3JtKCk7XHJcbiAgICB0aGlzLmxvYWRGb3JtKCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGF5T3B0aW9ucyg0NSk7XHJcbiAgICB0aGlzLmdlbmVyYXRlRGlyTGltaXRhdGlvbigxMDApO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyg5NSk7XHJcbiAgICB0aGlzLnNlbmRUaWNrZXRUb1RhbmdvKDEwMCk7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICBpZiAocmVzLnR5cGUgPT09ICdpbnB1dCcgJiYgcmVzLmZvcm0gPT09ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnKSB7XHJcbiAgICAgICAgICB0aGlzLnBhdGNoRm9ybShyZXMudmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgZm9vdGZhbGwgZGV0YWlscyBmcm9tIEFQSSB3aGVuIGNsaWVudElkIGlzIGF2YWlsYWJsZVxyXG4gICAqIFRoaXMgZW5zdXJlcyBjbGllbklkIGlzIHNldCBiZWZvcmUgbWFraW5nIHRoZSBBUEkgY2FsbFxyXG4gICAqL1xyXG4gIC8vIHByaXZhdGUgbG9hZEZvb3RmYWxsQ29uZmlnRGV0YWlscyhjbGllbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgLy8gICBpZiAoIWNsaWVudElkKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbERldGFpbHMoY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gIC8vICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgLy8gICAgICAgaWYgKHJlcykge1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2coJ0Zvb3RmYWxsIERpcmVjdG9yeSBDb25maWdzIGRhdGEgOjonLCByZXMpO1xyXG4gIC8vICAgICAgICAgaWYgKHJlcz8uZGF0YSAmJiByZXM/LmRhdGE/LmZvb3RmYWxsRGlyZWN0b3J5Q29uZmlncykge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSA9IHJlcz8uZGF0YT8uZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzO1xyXG4gIC8vICAgICAgICAgICB0aGlzLnBhdGNoRm9ybSh0aGlzLmZvb3RmYWxsQ29uZmlnRGF0YSk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9vdGZhbGwgZGV0YWlsczonLCBlcnIpO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIGdlbmVyYXRlRGF5T3B0aW9ucyhjb3VudDogbnVtYmVyKSB7XHJcbiAgdGhpcy5zdG9yZVRpY2tldERheXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gaSArIDEpO1xyXG4gfVxyXG5cclxuICBnZW5lcmF0ZURpckxpbWl0YXRpb24oY291bnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5wZXJjZW50YWdlTGlzdCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUFjY3VyYWN5T3B0aW9ucyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5hY2N1cmFjeVBlcmNlbnRhZ2VMaXN0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbWF4IH0sIChfLCBpKSA9PiBpICsgMSk7XHJcbiAgfVxyXG5cclxuICBzZW5kVGlja2V0VG9UYW5nbyhtYXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZW5kVGlja2V0VGFuZ28gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXggfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIGxvYWRGb3JtKCkge1xyXG4gICAgLy8gaW5pdGlhbGl6ZSBmb3JtXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcmV2aXNpb246IHRoaXMuZmIuYXJyYXkoW10pLFxyXG4gICAgICBhbGxvd1RpY2tldENyZWF0aW9uOiBbbnVsbF0sXHJcbiAgICAgIGlzQXV0b0Nsb3NlRW5hYmxlOiBbZmFsc2VdLFxyXG4gICAgICBhdXRvQ2xvc2VBY2N1cmFjeTogWycnXSxcclxuICAgICAgb3ZlcmFsbExpbWl0YXRpb246JycsXHJcbiAgICAgIHRhZ2dpbmdMaW1pdGF0aW9uOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgICAgYWNjdXJhY3lCcmVhY2g6IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIHRpY2tldENvdW50OiBbJyddLFxyXG4gICAgICAgIGRheXM6IFtdLFxyXG4gICAgICAgIGFjY3VyYWN5OiBbJyddXHJcbiAgICAgIH0pLFxyXG4gICAgICB0YW5nb1JldmlldzogWycnXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwYXRjaEZvcm0oZGF0YTogYW55KSB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybjtcclxuICAgIC8vIHBhdGNoIHJldmlzaW9uXHJcbiAgICBjb25zdCByZXZpc2lvbkFycmF5ID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgncmV2aXNpb24nKSBhcyBGb3JtQXJyYXk7XHJcbiAgICByZXZpc2lvbkFycmF5LmNsZWFyKCk7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnJldmlzaW9uKSkge1xyXG4gICAgICBkYXRhLnJldmlzaW9uLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIHJldmlzaW9uQXJyYXkucHVzaCh0aGlzLmNyZWF0ZVJldmlzaW9uKGl0ZW0uYWN0aW9uVHlwZSwgaXRlbS5pc0NoZWNrZWQpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcGF0Y2ggdGFnZ2luZ0xpbWl0YXRpb24gLS0gYmFzZWQgb24gbmV3IGtleSBmb3JtYXQgXCJlZmZlY3RpdmVGcm9tXCJcclxuICAgIGNvbnN0IHRhZ0FycmF5ID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgndGFnZ2luZ0xpbWl0YXRpb24nKSBhcyBGb3JtQXJyYXk7XHJcbiAgICB0YWdBcnJheS5jbGVhcigpO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24pICYmIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uPy5sZW5ndGggPiAwICYmIFxyXG4gICAgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb24/Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAvLyBPbmx5IG9uZSBjb25maWcgcHJlc2VudCDigJMgdXNlIGl0cyB2YWx1ZXMgZGlyZWN0bHlcclxuICAgICAgZGF0YT8udGFnZ2luZ0xpbWl0YXRpb25bMF0/LnZhbHVlcz8uZm9yRWFjaCgodGFnOiBhbnkpID0+IHtcclxuICAgICAgICB0YWdBcnJheS5wdXNoKHRoaXMuY3JlYXRlVGFnTGltaXQodGFnPy50eXBlLCB0YWc/LnZhbHVlLCB0YWc/Lmljb25OYW1lLCB0YWc/Lm5hbWUsIHRhZz8ua2V5KSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uKSAmJiBkYXRhPy50YWdnaW5nTGltaXRhdGlvbj8ubGVuZ3RoID4gMCAmJiBcclxuICAgIGRhdGE/LnRhZ2dpbmdMaW1pdGF0aW9uPy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIC8vIE11bHRpcGxlIGNvbmZpZ3MgcHJlc2VudCDigJMgcGljayB0aGUgb25lIHdpdGggbGF0ZXN0IGVmZmVjdGl2ZUZyb20gZGF0ZVxyXG4gICAgICBjb25zdCBsYXRlc3RFbnRyeSA9IGRhdGEudGFnZ2luZ0xpbWl0YXRpb24ucmVkdWNlKChsYXRlc3Q6IGFueSwgY3VycmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50IHx8ICFjdXJyZW50LmVmZmVjdGl2ZUZyb20pIHtcclxuICAgICAgICAgIHJldHVybiBsYXRlc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbGF0ZXN0IHx8ICFsYXRlc3QuZWZmZWN0aXZlRnJvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoY3VycmVudC5lZmZlY3RpdmVGcm9tKTtcclxuICAgICAgICBjb25zdCBsYXRlc3REYXRlID0gbmV3IERhdGUobGF0ZXN0LmVmZmVjdGl2ZUZyb20pO1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50RGF0ZSA+IGxhdGVzdERhdGUgPyBjdXJyZW50IDogbGF0ZXN0O1xyXG4gICAgICB9LCBudWxsKTtcclxuXHJcbiAgICAgIGlmIChsYXRlc3RFbnRyeSAmJiBBcnJheS5pc0FycmF5KGxhdGVzdEVudHJ5LnZhbHVlcykpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZWZmZWN0aXZlRnJvbTonLCBsYXRlc3RFbnRyeS5lZmZlY3RpdmVGcm9tKTtcclxuICAgICAgICBsYXRlc3RFbnRyeS52YWx1ZXMuZm9yRWFjaCgodGFnOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRhZ0FycmF5LnB1c2godGhpcy5jcmVhdGVUYWdMaW1pdCh0YWc/LnR5cGUsIHRhZz8udmFsdWUsIHRhZz8uaWNvbk5hbWUsIHRhZz8ubmFtZSwgdGFnPy5rZXkpKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHBhdGNoIGFjY3VyYWN5QnJlYWNoIGdyb3VwXHJcbiAgICBpZiAoZGF0YS5hY2N1cmFjeUJyZWFjaCkge1xyXG4gICAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaCcpPy5wYXRjaFZhbHVlKHtcclxuICAgICAgICB0aWNrZXRDb3VudDogZGF0YS5hY2N1cmFjeUJyZWFjaC50aWNrZXRDb3VudCxcclxuICAgICAgICBkYXlzOiBkYXRhLmFjY3VyYWN5QnJlYWNoLmRheXMgPz8gJzMwJyxcclxuICAgICAgICBhY2N1cmFjeTogZGF0YS5hY2N1cmFjeUJyZWFjaC5hY2N1cmFjeVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwYXRjaCBzaW1wbGUgZmllbGRzXHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgIGFsbG93VGlja2V0Q3JlYXRpb246IGRhdGEuYWxsb3dUaWNrZXRDcmVhdGlvbiA/PyAzLFxyXG4gICAgICBpc0F1dG9DbG9zZUVuYWJsZTogZGF0YS5pc0F1dG9DbG9zZUVuYWJsZSA/PyBmYWxzZSxcclxuICAgICAgYXV0b0Nsb3NlQWNjdXJhY3k6IGRhdGEuYXV0b0Nsb3NlQWNjdXJhY3kgPz8gJzk1JScsXHJcbiAgICAgIG92ZXJhbGxMaW1pdGF0aW9uOiBkYXRhLm92ZXJhbGxMaW1pdGF0aW9uID8/ICcnLFxyXG4gICAgICB0YW5nb1JldmlldzogZGF0YS50YW5nb1JldmlldyA/PyAnODUlJ1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZGlzYWJsZSgpO1xyXG4gICAgLy8gQXBwbHkgZGVwZW5kZW5jeSBsb2dpY1xyXG4gICAgdGhpcy5oYW5kbGVSZXZpc2lvbkRlcGVuZGVuY2llcygpO1xyXG4gIH1cclxuXHJcbiAgb3BlbkNhdGVnb3J5TW9kYWwobW9kZTogJ2FkZCcgfCAnZWRpdCcsIGluZGV4PzogbnVtYmVyKSB7XHJcbiAgICBpZiAobW9kZSA9PT0gJ2FkZCcgJiYgdGhpcy5pc0NhdGVnb3J5TGltaXRSZWFjaGVkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdNYXhpbXVtIENhdGVnb3J5IGNyZWF0aW9uIGxpbWl0IHJlYWNoZWQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID0gbW9kZTtcclxuICAgIHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggPSB0eXBlb2YgaW5kZXggPT09ICdudW1iZXInID8gaW5kZXggOiBudWxsO1xyXG5cclxuICAgIGlmIChtb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBjYXRlZ29yeUdyb3VwID0gdGhpcy50YWdMaW1pdHMuYXQodGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCkgYXMgRm9ybUdyb3VwO1xyXG4gICAgICB0aGlzLmNhdGVnb3J5Rm9ybS5zZXRWYWx1ZSh7XHJcbiAgICAgICAgaWNvbk5hbWU6IGNhdGVnb3J5R3JvdXAuZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCB0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdLnZhbHVlLFxyXG4gICAgICAgIG5hbWU6IGNhdGVnb3J5R3JvdXAuZ2V0KCduYW1lJyk/LnZhbHVlIHx8IGNhdGVnb3J5R3JvdXAuZ2V0KCd0eXBlJyk/LnZhbHVlIHx8ICcnLFxyXG4gICAgICAgIGxpbWl0OiBjYXRlZ29yeUdyb3VwLmdldCgndmFsdWUnKT8udmFsdWUgfHwgdGhpcy5wZXJjZW50YWdlTGlzdFswXVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2F0ZWdvcnlGb3JtLnJlc2V0KHtcclxuICAgICAgICBpY29uTmFtZTogdGhpcy5iYXNlQ2F0ZWdvcnlJY29uc1swXS52YWx1ZSxcclxuICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICBsaW1pdDogdGhpcy5wZXJjZW50YWdlTGlzdFswXVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhdGVnb3J5TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuY2F0ZWdvcnlNb2RhbFRwbCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogJ21kJyxcclxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxyXG4gICAgICBrZXlib2FyZDogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRDYXRlZ29yeUZvcm0oKSB7XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeUZvcm0uaW52YWxpZCkge1xyXG4gICAgICB0aGlzLmNhdGVnb3J5Rm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IGljb25OYW1lLCBuYW1lLCBsaW1pdCB9ID0gdGhpcy5jYXRlZ29yeUZvcm0udmFsdWU7XHJcbiAgICBjb25zdCB0cmltbWVkTmFtZSA9IChuYW1lIHx8ICcnKS50cmltKCk7XHJcblxyXG4gICAgaWYgKCF0cmltbWVkTmFtZSkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NhdGVnb3J5IG5hbWUgaXMgcmVxdWlyZWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkdXBsaWNhdGVJbmRleCA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLmZpbmRJbmRleCgoY3RybCwgaWR4KSA9PlxyXG4gICAgICAoY3RybC5nZXQoJ25hbWUnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09IHRyaW1tZWROYW1lLnRvTG93ZXJDYXNlKCkgfHwgXHJcbiAgICAgICBjdHJsLmdldCgndHlwZScpPy52YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gdHJpbW1lZE5hbWUudG9Mb3dlckNhc2UoKSkgJiZcclxuICAgICAgaWR4ICE9PSAodGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCA/PyAtMSlcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGR1cGxpY2F0ZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICBjb25zdCBuYW1lQ29udHJvbCA9IHRoaXMuY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpO1xyXG4gICAgICBuYW1lQ29udHJvbD8uc2V0RXJyb3JzKHsgZHVwbGljYXRlOiB0cnVlIH0pO1xyXG4gICAgICBuYW1lQ29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgaWNvbk5hbWUgYWxyZWFkeSBleGlzdHNcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJykge1xyXG4gICAgICBjb25zdCBleGlzdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kKChjdHJsKSA9PiBcclxuICAgICAgICBjdHJsLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgPT09IGljb25OYW1lXHJcbiAgICAgICk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoZXhpc3RpbmdJY29uKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdUaGlzIGljb24gaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgY2F0ZWdvcnkuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2F0ZWdvcnlNb2RhbE1vZGUgPT09ICdlZGl0JyAmJiB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4ICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIEluIGVkaXQgbW9kZSwgY2hlY2sgaWYgaWNvbiBpcyB1c2VkIGJ5IGFub3RoZXIgY2F0ZWdvcnkgKGV4Y2x1ZGluZyBjdXJyZW50IG9uZSlcclxuICAgICAgY29uc3QgZXhpc3RpbmdJY29uID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMuZmluZCgoY3RybCwgaWR4KSA9PiBcclxuICAgICAgICBjdHJsLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgPT09IGljb25OYW1lICYmIGlkeCAhPT0gdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleFxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJykge1xyXG4gICAgICAvLyBHZW5lcmF0ZSB0eXBlIGZyb20gbmFtZSAobG93ZXJjYXNlLCByZW1vdmUgc3BhY2VzKVxyXG4gICAgICBjb25zdCB0eXBlID0gdHJpbW1lZE5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcclxuICAgICAgY29uc3Qga2V5ID0gdHlwZS5jaGFyQXQoMCk7XHJcbiAgICAgIHRoaXMudGFnTGltaXRzLnB1c2godGhpcy5jcmVhdGVUYWdMaW1pdCh0eXBlLCBOdW1iZXIobGltaXQpLCBpY29uTmFtZSwgdHJpbW1lZE5hbWUsIGtleSkpO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnQ2F0ZWdvcnkgY3JlYXRlZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXggIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgY2F0ZWdvcnlHcm91cCA9IHRoaXMudGFnTGltaXRzLmF0KHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXgpIGFzIEZvcm1Hcm91cDtcclxuICAgICAgY2F0ZWdvcnlHcm91cC5wYXRjaFZhbHVlKHtcclxuICAgICAgICBuYW1lOiB0cmltbWVkTmFtZSxcclxuICAgICAgICB2YWx1ZTogTnVtYmVyKGxpbWl0KSxcclxuICAgICAgICBpY29uTmFtZTogaWNvbk5hbWVcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdDYXRlZ29yeSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsb3NlQ2F0ZWdvcnlNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VDYXRlZ29yeU1vZGFsKCkge1xyXG4gICAgaWYgKHRoaXMuY2F0ZWdvcnlNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLmNhdGVnb3J5TW9kYWxSZWYuY2xvc2UoKTtcclxuICAgICAgdGhpcy5jYXRlZ29yeU1vZGFsUmVmID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvcGVuRGVsZXRlQ2F0ZWdvcnlNb2RhbChpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmNhdGVnb3J5VG9EZWxldGVJbmRleCA9IGluZGV4O1xyXG4gICAgY29uc3QgY2F0ZWdvcnlHcm91cCA9IHRoaXMudGFnTGltaXRzLmF0KGluZGV4KSBhcyBGb3JtR3JvdXA7XHJcbiAgICB0aGlzLmNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgPSBjYXRlZ29yeUdyb3VwLmdldCgnbmFtZScpPy52YWx1ZSB8fCAndGhpcyBjYXRlZ29yeSc7XHJcbiAgICB0aGlzLmRlbGV0ZU1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmRlbGV0ZUNhdGVnb3J5TW9kYWxUcGwsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsXHJcbiAgICAgIHNpemU6ICdzbScsXHJcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcclxuICAgICAga2V5Ym9hcmQ6IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvbmZpcm1EZWxldGVDYXRlZ29yeSgpIHtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5VG9EZWxldGVJbmRleCA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnRhZ0xpbWl0cy5yZW1vdmVBdCh0aGlzLmNhdGVnb3J5VG9EZWxldGVJbmRleCk7XHJcbiAgICB0aGlzLmNhdGVnb3J5VG9EZWxldGVJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLmNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgPSAnJztcclxuICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdDYXRlZ29yeSBkZWxldGVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgIHRoaXMuY2xvc2VEZWxldGVNb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VEZWxldGVNb2RhbCgpIHtcclxuICAgIGlmICh0aGlzLmRlbGV0ZU1vZGFsUmVmKSB7XHJcbiAgICAgIHRoaXMuZGVsZXRlTW9kYWxSZWYuY2xvc2UoKTtcclxuICAgICAgdGhpcy5kZWxldGVNb2RhbFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhdGVnb3J5UGVuZGluZ0RlbGV0ZU5hbWUgPSAnJztcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdGVnb3J5SWNvbihpY29uVmFsdWU6IHN0cmluZykge1xyXG4gICAgLy8gQ2hlY2sgaWYgaWNvbk5hbWUgYWxyZWFkeSBleGlzdHNcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnYWRkJykge1xyXG4gICAgICBjb25zdCBleGlzdGluZ0ljb24gPSB0aGlzLnRhZ0xpbWl0cy5jb250cm9scy5maW5kKChjdHJsKSA9PiBcclxuICAgICAgICBjdHJsLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgPT09IGljb25WYWx1ZVxyXG4gICAgICApO1xyXG4gICAgICBcclxuICAgICAgaWYgKGV4aXN0aW5nSWNvbikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVGhpcyBpY29uIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5LicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBJbiBlZGl0IG1vZGUsIGNoZWNrIGlmIGljb24gaXMgdXNlZCBieSBhbm90aGVyIGNhdGVnb3J5IChleGNsdWRpbmcgY3VycmVudCBvbmUpXHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWNvbiA9IHRoaXMudGFnTGltaXRzLmNvbnRyb2xzLmZpbmQoKGN0cmwsIGlkeCkgPT4gXHJcbiAgICAgICAgY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlID09PSBpY29uVmFsdWUgJiYgaWR4ICE9PSB0aGlzLmVkaXRpbmdDYXRlZ29yeUluZGV4XHJcbiAgICAgICk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoZXhpc3RpbmdJY29uKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdUaGlzIGljb24gaXMgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgY2F0ZWdvcnkuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuY2F0ZWdvcnlGb3JtLmdldCgnaWNvbk5hbWUnKT8uc2V0VmFsdWUoaWNvblZhbHVlKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNhdGVnb3J5TWVudShldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5hY3RpdmVNZW51SW5kZXggPSB0aGlzLmFjdGl2ZU1lbnVJbmRleCA9PT0gaW5kZXggPyBudWxsIDogaW5kZXg7XHJcbiAgfVxyXG5cclxuICBvbkNhdGVnb3J5TWVudUFjdGlvbihldmVudDogRXZlbnQsIGFjdGlvbjogJ2VkaXQnIHwgJ2RlbGV0ZScsIGluZGV4OiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5hY3RpdmVNZW51SW5kZXggPSBudWxsO1xyXG4gICAgaWYgKGFjdGlvbiA9PT0gJ2VkaXQnKSB7XHJcbiAgICAgIHRoaXMub3BlbkNhdGVnb3J5TW9kYWwoJ2VkaXQnLCBpbmRleCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5EZWxldGVDYXRlZ29yeU1vZGFsKGluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUxpbWl0RHJvcGRvd24oZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPT09IGluZGV4ID8gbnVsbCA6IGluZGV4O1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0TGltaXRWYWx1ZShldmVudDogRXZlbnQsIGluZGV4OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9ICh0aGlzLnRhZ0xpbWl0cy5hdChpbmRleCkgYXMgRm9ybUdyb3VwKS5nZXQoJ3ZhbHVlJyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMub3BlbkxpbWl0RHJvcGRvd25JbmRleCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDYXRlZ29yeUxpbWl0RHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gIXRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0ZWdvcnlMaW1pdFZhbHVlKGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jYXRlZ29yeUZvcm0uZ2V0KCdsaW1pdCcpO1xyXG4gICAgY29udHJvbD8uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgY29udHJvbD8ubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUxpbWl0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBdXRvQ2xvc2VEcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzQXV0b0Nsb3NlRW5hYmxlZCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2lzQXV0b0Nsb3NlRW5hYmxlJyk/LnZhbHVlO1xyXG4gICAgaWYgKCFpc0F1dG9DbG9zZUVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0F1dG9DbG9zZURyb3Bkb3duT3BlbiA9ICF0aGlzLmlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VuZFRhbmdvQ2xvc2VEcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNzZW5kVGFuZ29Ecm9wZG93bk9wZW4gPSAhdGhpcy5pc3NlbmRUYW5nb0Ryb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdEF1dG9DbG9zZUFjY3VyYWN5KGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYXV0b0Nsb3NlQWNjdXJhY3knKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb250cm9sLnNldFZhbHVlKGAke3ZhbHVlfSVgKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc0F1dG9DbG9zZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U2VuZFRpY2tldFRhbmdvKGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgndGFuZ29SZXZpZXcnKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb250cm9sLnNldFZhbHVlKGAke3ZhbHVlfSVgKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc3NlbmRUYW5nb0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlVGlja2V0Q291bnREcm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9ICF0aGlzLmlzVGlja2V0Q291bnREcm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RUaWNrZXRDb3VudChldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50Jyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3RvcmVEYXlzRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gIXRoaXMuaXNTdG9yZURheXNEcm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdG9yZURheXMoZXZlbnQ6IEV2ZW50LCBvcHRpb246IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdhY2N1cmFjeUJyZWFjaC5kYXlzJyk7XHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29udHJvbC5zZXRWYWx1ZShvcHRpb24udmFsdWUpO1xyXG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLmlzU3RvcmVEYXlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWREYXlzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLmRheXMnKT8udmFsdWU7XHJcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF5c09wdGlvbnMuZmluZChvcHQgPT4gb3B0LnZhbHVlID09PSBjdXJyZW50VmFsdWUpO1xyXG4gICAgcmV0dXJuIG1hdGNoPy5sYWJlbCB8fCAnTW9udGgnO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3RvcmVBY2N1cmFjeURyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc0VkaXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSAhdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdG9yZUFjY3VyYWN5KGV2ZW50OiBFdmVudCwgdmFsdWU6IG51bWJlcikge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWNjdXJhY3lCcmVhY2guYWNjdXJhY3knKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb250cm9sLnNldFZhbHVlKGAke3ZhbHVlfSVgKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bihldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gIXRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0QWxsb3dUaWNrZXRDcmVhdGlvbihldmVudDogRXZlbnQsIHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FsbG93VGlja2V0Q3JlYXRpb24nKTtcclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU92ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzT3ZlcmFsbExpbWl0YXRpb25Ecm9wZG93bk9wZW4gPSAhdGhpcy5pc092ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0T3ZlcmFsbExpbWl0YXRpb24oZXZlbnQ6IEV2ZW50LCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdvdmVyYWxsTGltaXRhdGlvbicpO1xyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnRyb2wuc2V0VmFsdWUoYCR7dmFsdWV9JWApOyAvLyBBUEkgZXhwZWN0cyBhIHN0cmluZyBsaWtlIFwiMzAlXCJcclxuICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcclxuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5pc092ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3ZlcmFsbC1saW1pdGF0aW9uIGRyb3Bkb3duIChlLmcuIFwiMzAlXCIgb3IgYSBwbGFjZWhvbGRlciB3aGVuIGVtcHR5KS5cclxuICBnZXQgb3ZlcmFsbExpbWl0YXRpb25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0KCdvdmVyYWxsTGltaXRhdGlvbicpPy52YWx1ZTtcclxuICAgIHJldHVybiB2YWx1ZSA/IHZhbHVlIDogJ1NlbGVjdCc7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNDYXRlZ29yeUxpbWl0UmVhY2hlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRhZ0xpbWl0cy5sZW5ndGggPj0gdGhpcy5tYXhDYXRlZ29yeUNvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQXBwcm92ZXJEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJldmlzaW9ucyA9IHRoaXMucmV2aXNpb25BcnJheS5jb250cm9scztcclxuICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgIGNvbnN0IGFwcHJvdmVyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInKTtcclxuICAgIFxyXG4gICAgaWYgKHJldmlld2VyICYmIGFwcHJvdmVyKSB7XHJcbiAgICAgIGNvbnN0IHJldmlld2VyQ2hlY2tlZCA9IHJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlO1xyXG4gICAgICBjb25zdCBhcHByb3ZlckNvbnRyb2wgPSBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpO1xyXG4gICAgICAvLyBDaGVjayBpZiBhcHByb3ZlciBpcyBkaXNhYmxlZCBPUiByZXZpZXdlciBpcyBub3QgY2hlY2tlZFxyXG4gICAgICByZXR1cm4gYXBwcm92ZXJDb250cm9sPy5kaXNhYmxlZCB8fCAhcmV2aWV3ZXJDaGVja2VkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVGFuZ29EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIC8vIFRhbmdvIGFsd2F5cyBzaG93cyBkaXNhYmxlZCBkZXNpZ25cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q2F0ZWdvcnlGb3JtKCkge1xyXG4gICAgdGhpcy5jYXRlZ29yeUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgaWNvbk5hbWU6IFt0aGlzLmJhc2VDYXRlZ29yeUljb25zWzBdLnZhbHVlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMzApXV0sXHJcbiAgICAgIGxpbWl0OiBbdGhpcy5wZXJjZW50YWdlTGlzdFswXSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxyXG4gIGNsb3NlTWVudXMoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1lbnVJbmRleCA9IG51bGw7XHJcbiAgICB0aGlzLm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPSBudWxsO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBdXRvQ2xvc2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNUaWNrZXRDb3VudERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlRGF5c0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N0b3JlQWNjdXJhY3lEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzc2VuZFRhbmdvRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzT3ZlcmFsbExpbWl0YXRpb25Ecm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNhdGVnb3J5SWNvbkRyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLmlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuID0gIXRoaXMuaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW47XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDYXRlZ29yeUljb25Gcm9tRHJvcGRvd24oZXZlbnQ6IEV2ZW50LCBpY29uVmFsdWU6IHN0cmluZykge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNlbGVjdENhdGVnb3J5SWNvbihpY29uVmFsdWUpO1xyXG4gICAgdGhpcy5pc0NhdGVnb3J5SWNvbkRyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xpZW50TWFwcGVkU3RvcmVzRGV0YWlscyhjbGllbklkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3RvcmVMaXN0ID0gW107XHJcbiAgICAgdGhpcy5hcGlTZXJ2aWNlLmdldEZvb3RmYWxsU3RvcmVSYWlzZURldGFpbHMoY2xpZW5JZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIC8vIHRoaXMuYXBpU2VydmljZS5nZXRGb290ZmFsbERldGFpbHMoY2xpZW5JZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDoocmVzOiBhbnkpPT57XHJcbiAgICAgICAgaWYocmVzICYmIHJlcy5jb2RlPT0nMjAwJyl7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IHJlcz8uZGF0YT8ucmVzdWx0O1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOihlcnIpPT57XHJcbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBzdG9yZSBsaXN0JywgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gaGVscGVyc1xyXG4gIGdldCByZXZpc2lvbkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgncmV2aXNpb24nKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXQgdGFnTGltaXRzKCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgndGFnZ2luZ0xpbWl0YXRpb24nKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuXHJcbiAgY3JlYXRlUmV2aXNpb24oYWN0aW9uVHlwZTogc3RyaW5nLCBpc0NoZWNrZWQ6IGJvb2xlYW4pOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBhY3Rpb25UeXBlOiBbYWN0aW9uVHlwZV0sXHJcbiAgICAgIGlzQ2hlY2tlZDogW2lzQ2hlY2tlZF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlVGFnTGltaXQodHlwZTogc3RyaW5nLCB2YWx1ZTogbnVtYmVyLCBpY29uTmFtZTogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBrZXk/OiBzdHJpbmcpOiBGb3JtR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICB0eXBlOiBbdHlwZV0sXHJcbiAgICAgIHZhbHVlOiBbdmFsdWVdLFxyXG4gICAgICB1bml0OiBbJyUnXSxcclxuICAgICAgaWNvbk5hbWU6IFtpY29uTmFtZV0sXHJcbiAgICAgIG5hbWU6IFtuYW1lXSxcclxuICAgICAga2V5OiBba2V5XVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTdG9yZVNlbGVjdGlvbihzdG9yZTogYW55LCBjaGVja2VkOiBib29sZWFuKSB7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdC5jbGllbnRJZCA9IHRoaXMuY2xpZW5JZDtcclxuICAgICAgdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5wdXNoKHsgc3RvcmVJZDogc3RvcmUuc3RvcmVJZCwgZGF0ZVN0cmluZzogc3RvcmUuZGF0ZVN0cmluZyB9KTtcclxuICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzID0gdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5maWx0ZXIoXHJcbiAgICAgICAgKHMpID0+IHMuc3RvcmVJZCAhPT0gc3RvcmUuc3RvcmVJZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNTdG9yZVNlbGVjdGVkKHN0b3JlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLnNvbWUociA9PiByLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZUxpc3QubGVuZ3RoID4gMCAmJiB0aGlzLnJlc2V0UmVxdWVzdC5hcnJheU9mU3RvcmVzLmxlbmd0aCA9PT0gdGhpcy5zdG9yZUxpc3QubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLy8gc2VsZWN0IGFsbCBzdG9yZXMgcmVxdWVzdCBsaXN0IGhhbmRsZXJcclxuICB0b2dnbGVTZWxlY3RBbGwoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IGNoZWNrZWQgPSB0YXJnZXQuY2hlY2tlZDtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkU3RvcmVzID0gdGhpcy5zdG9yZUxpc3QubWFwKChzdG9yZTogYW55KSA9PiAoe1xyXG4gICAgICAgIHN0b3JlSWQ6IHN0b3JlLnN0b3JlSWQsXHJcbiAgICAgICAgZGF0ZVN0cmluZzogc3RvcmUuZGF0ZVN0cmluZ1xyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0ID0gdGhpcy5idWlsZFJlc2V0UGF5bG9hZChzZWxlY3RlZFN0b3Jlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlc2V0UmVxdWVzdCA9IHRoaXMuYnVpbGRSZXNldFBheWxvYWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVJldmlzaW9uRGVwZW5kZW5jaWVzKCkge1xyXG4gICAgY29uc3QgcmV2aXNpb25zID0gdGhpcy5yZXZpc2lvbkFycmF5LmNvbnRyb2xzO1xyXG4gICAgY29uc3QgcmV2aWV3ZXIgPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdyZXZpZXdlcicpO1xyXG4gICAgY29uc3QgYXBwcm92ZXIgPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdhcHByb3ZlcicpO1xyXG4gICAgY29uc3QgdGFuZ28gPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICd0YW5nbycpO1xyXG5cclxuICAgIGlmICh0YW5nbykge1xyXG4gICAgICB0YW5nby5nZXQoJ2lzQ2hlY2tlZCcpPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmV2aWV3ZXIgJiYgYXBwcm92ZXIpIHtcclxuICAgICAgLy8gZGlzYWJsZSBhcHByb3ZlciBpbml0aWFsbHkgaWYgcmV2aWV3ZXIgdW5jaGVja2VkXHJcbiAgICAgIGlmICghcmV2aWV3ZXIuZ2V0KCdpc0NoZWNrZWQnKT8udmFsdWUpIHtcclxuICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICBhcHByb3Zlci5wYXRjaFZhbHVlKHsgaXNDaGVja2VkOiBmYWxzZSB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZW5hYmxlIGFwcHJvdmVyIGlmIHJldmlld2VyIGlzIGNoZWNrZWRcclxuICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBsaXN0ZW4gcmV2aWV3ZXIgY2hlY2tib3ggY2hhbmdlIChvbmx5IHdpcmUgb25jZSlcclxuICAgICAgaWYgKCF0aGlzLnJldmlzaW9uRGVwc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgcmV2aWV3ZXIuZ2V0KCdpc0NoZWNrZWQnKT8udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgICAgICAgIGFwcHJvdmVyLmdldCgnaXNDaGVja2VkJyk/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcHByb3Zlci5nZXQoJ2lzQ2hlY2tlZCcpPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgYXBwcm92ZXIucGF0Y2hWYWx1ZSh7IGlzQ2hlY2tlZDogZmFsc2UgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmV2aXNpb25EZXBzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0VkaXQgPSAhdGhpcy5pc0VkaXQ7XHJcbiAgICBpZiAoIXRoaXMuaXNFZGl0KSB7XHJcbiAgICAgIC8vIEZpcnN0LCBlbnN1cmUgYXBwcm92ZXIgc3RhdGUgaXMgY29ycmVjdCBiZWZvcmUgZW5hYmxpbmcgZm9ybVxyXG4gICAgICBjb25zdCByZXZpc2lvbnMgPSB0aGlzLnJldmlzaW9uQXJyYXkuY29udHJvbHM7XHJcbiAgICAgIGNvbnN0IHJldmlld2VyID0gcmV2aXNpb25zLmZpbmQoKHIpID0+IHIuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAncmV2aWV3ZXInKTtcclxuICAgICAgY29uc3QgYXBwcm92ZXIgPSByZXZpc2lvbnMuZmluZCgocikgPT4gci5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICdhcHByb3ZlcicpO1xyXG4gICAgICBcclxuICAgICAgLy8gSWYgcmV2aWV3ZXIgaXMgdW5jaGVja2VkLCBlbnN1cmUgYXBwcm92ZXIgaXMgdW5jaGVja2VkIGJlZm9yZSBlbmFibGluZ1xyXG4gICAgICBpZiAocmV2aWV3ZXIgJiYgYXBwcm92ZXIgJiYgIXJldmlld2VyLmdldCgnaXNDaGVja2VkJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgYXBwcm92ZXIucGF0Y2hWYWx1ZSh7IGlzQ2hlY2tlZDogZmFsc2UgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZW5hYmxlKCk7XHJcbiAgICAgIC8vIFJlLWFwcGx5IHJldmlzaW9uIGRlcGVuZGVuY2llcyBhZnRlciBlbmFibGluZyB0byBlbnN1cmUgYXBwcm92ZXIgc3RhdGUgaXMgY29ycmVjdFxyXG4gICAgICB0aGlzLmhhbmRsZVJldmlzaW9uRGVwZW5kZW5jaWVzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZGlzYWJsZSgpO1xyXG4gICAgICAvLyBSZS1hcHBseSByZXZpc2lvbiBkZXBlbmRlbmNpZXMgc28gVGFuZ28gcmVtYWlucyBkaXNhYmxlZFxyXG4gICAgICAvLyBhbmQgQXBwcm92ZXIgZm9sbG93cyBSZXZpZXdlciBpbiBib3RoIHZpZXcgYW5kIGVkaXQgbW9kZXMuXHJcbiAgICAgIHRoaXMuaGFuZGxlUmV2aXNpb25EZXBlbmRlbmNpZXMoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gT3BlbiByZXNldCBjb25maXJtYXRpb24gbW9kYWxcclxuICBvcGVuUmVzZXRDb25maXJtYXRpb25Nb2RhbCgpIHtcclxuICAgIGlmICghdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfHwgdGhpcy5pc1Jlc2V0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc2V0TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMucmVzZXRDb25maXJtYXRpb25Nb2RhbFRwbCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogJ3NtJyxcclxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxyXG4gICAgICBrZXlib2FyZDogZmFsc2VcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2UgcmVzZXQgY29uZmlybWF0aW9uIG1vZGFsXHJcbiAgY2xvc2VSZXNldE1vZGFsKCkge1xyXG4gICAgaWYgKHRoaXMucmVzZXRNb2RhbFJlZikge1xyXG4gICAgICB0aGlzLnJlc2V0TW9kYWxSZWYuY2xvc2UoKTtcclxuICAgICAgdGhpcy5yZXNldE1vZGFsUmVmID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENvbmZpcm0gYW5kIHByb2NlZWQgd2l0aCByZXNldFxyXG4gIGNvbmZpcm1SZXNldFN0b3JlUmVxdWVzdCgpIHtcclxuICAgIGlmICghdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfHwgdGhpcy5pc1Jlc2V0dGluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBDbG9zZSBtb2RhbCBpbW1lZGlhdGVseVxyXG4gICAgdGhpcy5jbG9zZVJlc2V0TW9kYWwoKTtcclxuICAgIFxyXG4gICAgLy8gUHJvY2VlZCB3aXRoIHJlc2V0IG9wZXJhdGlvblxyXG4gICAgdGhpcy5pc1Jlc2V0dGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UucmVzZXRTdG9yZVJlcXVlc3RMaXN0KHRoaXMucmVzZXRSZXF1ZXN0KVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNSZXNldHRpbmcgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgIClcclxuICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OihyZXM6IGFueSk9PntcclxuICAgICAgaWYocmVzICYmIHJlcy5jb2RlPT0nMjAwJyl7XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSByZXM/LmRhdGE/LnJlc3VsdDtcclxuICAgICAgICB0aGlzLmdldENsaWVudE1hcHBlZFN0b3Jlc0RldGFpbHModGhpcy5jbGllbklkKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnU3RvcmUgcmVxdWVzdHMgcmVzZXQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLnN0b3JlTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIHJlc2V0IHN0b3JlIHJlcXVlc3RzLicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVzZXRSZXF1ZXN0ID0gdGhpcy5idWlsZFJlc2V0UGF5bG9hZCgpO1xyXG4gICAgIH0sXHJcbiAgICAgIGVycm9yOihlcnIpPT57XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0Vycm9yIHJlc2V0dGluZyBzdG9yZSByZXF1ZXN0cy4nKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBzdG9yZSBsaXN0JywgZXJyKTtcclxuICAgICAgfSxcclxuICAgfSlcclxuICB9XHJcblxyXG4gIC8vIHRvIHJlc2V0IHN0b3JlIGxpc3QgKGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaWYgbmVlZGVkKVxyXG4gIHJlc2V0U3RvcmVSZXF1ZXN0KCkge1xyXG4gICAgdGhpcy5vcGVuUmVzZXRDb25maXJtYXRpb25Nb2RhbCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzUmVzZXREaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5yZXNldFJlcXVlc3QuYXJyYXlPZlN0b3Jlcy5sZW5ndGggfHwgdGhpcy5pc1Jlc2V0dGluZyB8fCB0aGlzLmlzRWRpdDtcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgLy8gRW5zdXJlIFRhbmdvIGNoZWNrYm94IGlzIGFsd2F5cyB0cnVlIHdoZW4gc2F2aW5nXHJcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZS5yZXZpc2lvbikpIHtcclxuICAgICAgY29uc3QgdGFuZ29JbmRleCA9IGZvcm1WYWx1ZS5yZXZpc2lvbi5maW5kSW5kZXgoKHI6IGFueSkgPT4gcj8uYWN0aW9uVHlwZSA9PT0gJ3RhbmdvJyk7XHJcbiAgICAgIGlmICh0YW5nb0luZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIGZvcm1WYWx1ZS5yZXZpc2lvblt0YW5nb0luZGV4XS5pc0NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygndXBkYXRlIGZvcm0gY29uZmlnID4+JywgZm9ybVZhbHVlKTtcclxuICAgIHRoaXMuYXBpU2VydmljZS5jbGllbnRGb3JtRGF0YS5uZXh0KHsgdmFsdWU6IGZvcm1WYWx1ZSwgdHlwZTogJ3N1Ym1pdCcsIGZvcm06ICdmb290ZmFsbERpcmVjdG9yeUNvbmZpZ3MnIH0pXHJcbiAgICAvLyBjb25zdCBmb3JtVmFsdWUgPSB7IC4uLnRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS52YWx1ZSB9O1xyXG4gICAgLy8gaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlLnRhZ2dpbmdMaW1pdGF0aW9uKSkge1xyXG4gICAgLy8gICBmb3JtVmFsdWUudGFnZ2luZ0xpbWl0YXRpb24gPSBmb3JtVmFsdWUudGFnZ2luZ0xpbWl0YXRpb24ubWFwKCh0YWc6IGFueSkgPT4gKHtcclxuICAgIC8vICAgICB0eXBlOiB0YWcudHlwZSxcclxuICAgIC8vICAgICB2YWx1ZTogdGFnLnZhbHVlLFxyXG4gICAgLy8gICAgIHVuaXQ6IHRhZy51bml0IHx8ICclJ1xyXG4gICAgLy8gICAgIC8vIGljb25OYW1lOiB0YWcuaWNvbk5hbWUsXHJcbiAgICAvLyAgICAgLy8gbmFtZTogdGFnLm5hbWUgfHwgdGFnLnR5cGVcclxuICAgIC8vICAgfSkpO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gY29uc3QgcGF5bG9hZCA9IHtcclxuICAgIC8vICAgZm9vdGZhbGxEaXJlY3RvcnlDb25maWdzOiBmb3JtVmFsdWUsXHJcbiAgICAvLyAgIHJlcXVlc3Q6IHRoaXMucmVzZXRSZXF1ZXN0XHJcbiAgICAvLyB9O1xyXG4gICAgICAvLyBjb25zdCBvYmogPSB7XHJcbiAgICAgIC8vICAgdGFuZ29SZXZpZXc6IGZvcm1WYWx1ZS50YW5nb1JldmlldyxcclxuICAgICAgLy8gICBhY2N1cmFjeUJyZWFjaDogZm9ybVZhbHVlLmFjY3VyYWN5QnJlYWNoLFxyXG4gICAgICAvLyAgIHRhZ2dpbmdMaW1pdGF0aW9uOiBmb3JtVmFsdWUudGFnZ2luZ0xpbWl0YXRpb25cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBjb25zb2xlLmxvZygnRmluYWwgUGF5bG9hZDonLCBvYmopO1xyXG4gICAgICAvLyB0aGlzLmFwaVNlcnZpY2UudXBkYXRlRm9vdGZhbGxEaXJlY3RvcnlDb25maWcob2JqLCB0aGlzLmNsaWVuSWQpXHJcbiAgICAgIC8vICAgLnBpcGUoXHJcbiAgICAgIC8vICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICAgLy8gICApXHJcbiAgICAgIC8vICAgLnN1YnNjcmliZSh7XHJcbiAgICAgIC8vICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgLy8gICAgICAgY29uc29sZS5sb2coJ3NhdmUgZm9vdGZhbGwgY29uZmlnIGRldGFpbHMgPj4nLCByZXMpO1xyXG4gICAgICAvLyAgICAgICBpZiAocmVzICYmIHJlcy5jb2RlID09ICcyMDAnICYmIHJlcy5zdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgIC8vICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ2Zvb3RmYWxsIGNvbmZpZyBkZXRhaWxzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgICAvLyAgICAgICB9IGVsc2Uge1xyXG4gICAgICAvLyAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRmFpbGVkIHRvIHVwZGF0ZSBmb290ZmFsbCBjb25maWcgZGV0YWlscy4nKTtcclxuICAgICAgLy8gICAgICAgfVxyXG4gICAgICAvLyAgICAgfSxcclxuICAgICAgLy8gICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgIC8vICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRXJyb3IgaW4gdXBkYXRpbmcgZm9vdGZhbGwgY29uZmlnIGRldGFpbHMuJyk7XHJcbiAgICAgIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIHVwZGF0ZUZvb3RmYWxsRGlyZWN0b3J5Q29uZmlnIDonLCBlcnIpO1xyXG4gICAgICAvLyAgICAgfSxcclxuICAgICAgLy8gICB9KVxyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuY2xpZW50Rm9ybURhdGEubmV4dCh7IHZhbHVlOiBudWxsLCB0eXBlOiAnY2FuY2VsJywgZm9ybTogJ2Zvb3RmYWxsRGlyZWN0b3J5Q29uZmlncycgfSlcclxuICAgIHRoaXMuZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLnRvZ2dsZUZvcm0oKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFJlc2V0UGF5bG9hZChzdG9yZXM6IHsgc3RvcmVJZDogc3RyaW5nOyBkYXRlU3RyaW5nOiBzdHJpbmcgfVtdID0gW10pIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVuSWQgPz8gJycsXHJcbiAgICAgIGFycmF5T2ZTdG9yZXM6IHN0b3Jlc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldCBjYXRlZ29yeUljb25zKCk6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBhdmFpbGFibGVJY29ucyA9IFsuLi50aGlzLmJhc2VDYXRlZ29yeUljb25zXTtcclxuICAgIFxyXG4gICAgLy8gQ2hlY2sgd2hpY2ggYWRkaXRpb25hbCBpY29ucyBhcmUgY3VycmVudGx5IGluIHVzZVxyXG4gICAgY29uc3QgdXNlZEljb25zID0gdGhpcy50YWdMaW1pdHMuY29udHJvbHMubWFwKGN0cmwgPT4gY3RybC5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICBcclxuICAgIC8vIElmIGVkaXRpbmcsIGV4Y2x1ZGUgdGhlIGN1cnJlbnQgaWNvbiBiZWluZyBlZGl0ZWQgZnJvbSB0aGUgdXNlZCBsaXN0XHJcbiAgICBsZXQgdXNlZEljb25zRm9yQ2hlY2sgPSBbLi4udXNlZEljb25zXTtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TW9kYWxNb2RlID09PSAnZWRpdCcgJiYgdGhpcy5lZGl0aW5nQ2F0ZWdvcnlJbmRleCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBlZGl0aW5nSWNvbiA9IHRoaXMudGFnTGltaXRzLmF0KHRoaXMuZWRpdGluZ0NhdGVnb3J5SW5kZXgpPy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlO1xyXG4gICAgICB1c2VkSWNvbnNGb3JDaGVjayA9IHVzZWRJY29uc0ZvckNoZWNrLmZpbHRlcihpY29uID0+IGljb24gIT09IGVkaXRpbmdJY29uKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQWRkIGhvdXNlS2VlcGluZ1RhZyBhbmQganVua1RhZyBpZiB0aGV5J3JlIG5vdCBpbiB1c2VcclxuICAgIHRoaXMuYWRkaXRpb25hbENhdGVnb3J5SWNvbnMuZm9yRWFjaChpY29uID0+IHtcclxuICAgICAgaWYgKCF1c2VkSWNvbnNGb3JDaGVjay5pbmNsdWRlcyhpY29uLnZhbHVlKSkge1xyXG4gICAgICAgIGF2YWlsYWJsZUljb25zLnB1c2goaWNvbik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICByZXR1cm4gYXZhaWxhYmxlSWNvbnM7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRDYXRlZ29yeUljb25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2F0ZWdvcnlGb3JtPy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlIHx8IHRoaXMuYmFzZUNhdGVnb3J5SWNvbnNbMF0/LnZhbHVlO1xyXG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmNhdGVnb3J5SWNvbnMuZmluZChpY29uID0+IGljb24udmFsdWUgPT09IGN1cnJlbnQpO1xyXG4gICAgcmV0dXJuIG1hdGNoPy5sYWJlbCB8fCAnJztcclxuICB9XHJcblxyXG59XHJcblxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvb3RmYWxsRGlyQ29uZmlndXJhdGlvbkZvcm1cIiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5HbG9iYWxfQ29uZmlndXJhdGlvbl9pc0VkaXRcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0XCIgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInRvZ2dsZUZvcm0oKTtcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcHktMyBhbGlnbi1pdGVtcy1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzI1NzlfMjUxMjUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC4xNjcgMi40OTk5M0MxNC4zODU5IDIuMjgxMDYgMTQuNjQ1NyAyLjEwNzQ0IDE0LjkzMTcgMS45ODg5OUMxNS4yMTc2IDEuODcwNTQgMTUuNTI0MSAxLjgwOTU3IDE1LjgzMzcgMS44MDk1N0MxNi4xNDMyIDEuODA5NTcgMTYuNDQ5NyAxLjg3MDU0IDE2LjczNTcgMS45ODg5OUMxNy4wMjE2IDIuMTA3NDQgMTcuMjgxNSAyLjI4MTA2IDE3LjUwMDMgMi40OTk5M0MxNy43MTkyIDIuNzE4OCAxNy44OTI4IDIuOTc4NjMgMTguMDExMyAzLjI2NDZDMTguMTI5NyAzLjU1MDU3IDE4LjE5MDcgMy44NTcwNiAxOC4xOTA3IDQuMTY2NTlDMTguMTkwNyA0LjQ3NjEyIDE4LjEyOTcgNC43ODI2MiAxOC4wMTEzIDUuMDY4NTlDMTcuODkyOCA1LjM1NDU1IDE3LjcxOTIgNS42MTQzOSAxNy41MDAzIDUuODMzMjZMNi4yNTAzMyAxNy4wODMzTDEuNjY2OTkgMTguMzMzM0wyLjkxNjk5IDEzLjc0OTlMMTQuMTY3IDIuNDk5OTNaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMjU3OV8yNTEyNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5FZGl0IERldGFpbHNcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwhLS0gQXBwcm92ZXIgQ29uZmlndXJhdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxyXG4gICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbWItMVwiPkFwcHJvdmVyIGNvbmZpZ3VyYXRpb248L2g1PlxyXG4gICAgICAgIDxwIGNsYXNzPVwiZmYtc2VjdGlvbi1kZXNjIG1iLTRcIj5cclxuICAgICAgICAgICAgU2V0IGxldmVsIG9mIHJldmlzaW9ucyByZXF1aXJlZCBmb3IgYSBzdG9yZSByYWlzZWQgdGlja2V0c1xyXG4gICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwicmV2aXNpb25cIiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAgZ2FwLTVcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmV2IG9mIHJldmlzaW9uQXJyYXkuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwcm92ZXItb3B0aW9uIGQtZmxleCBmbGV4LWNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtb3B0aW9uXT1cIihyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInICYmIGlzQXBwcm92ZXJEaXNhYmxlZCkgfHwgKHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICd0YW5nbycgJiYgaXNUYW5nb0Rpc2FibGVkKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1c3RvbS1jaGVja2JveCBhbGlnbi1pdGVtcy1zdGFydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkLWNoZWNrYm94XT1cIihyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlID09PSAnYXBwcm92ZXInICYmIGlzQXBwcm92ZXJEaXNhYmxlZCkgfHwgKHJldi5nZXQoJ2FjdGlvblR5cGUnKT8udmFsdWUgPT09ICd0YW5nbycgJiYgaXNUYW5nb0Rpc2FibGVkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0NoZWNrZWRcIiBbaWRdPVwiJ2FjdGlvbi0nICsgaVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzYyB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJyZXYuZ2V0KCdhY3Rpb25UeXBlJyk/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidyZXZpZXdlcidcIj5UaGUgdGlja2V0IHVuZGVyZ29lcyBhIHNpbmdsZSByZXZpZXcgdG8gdmVyaWZ5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvb3RmYWxsLjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2FwcHJvdmVyJ1wiPlRoZSB0aWNrZXQgdW5kZXJnb2VzIGEgZmluYWwgcmV2aWV3IGFmdGVyIHRoZSBpbml0aWFsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrLjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3RhbmdvJ1wiPkZpbmFsaXplIHRpY2tldHMgYW5kIHVwZGF0ZSBmb290ZmFsbCBjb3VudC48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8aHIgY2xhc3M9XCJmZi1kaXZpZGVyXCI+XHJcblxyXG4gICAgPCEtLSBTdG9yZSBTUE9DIFRpY2tldCBDcmVhdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxyXG4gICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbWItM1wiPlN0b3JlIFNQT0MgVGlja2V0IENyZWF0aW9uPC9oNT5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwIGdhcC0yXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTBcIj5cclxuICAgICAgICAgICAgICAgIEFsbG93IHN0b3JlIFNQT0MgdG8gY3JlYXRlIHRpY2tldHMgb25seSBmb3IgdGhlIGxhc3RcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0IG1zLTJcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLm9wZW5dPVwiaXNBbGxvd1RpY2tldENyZWF0aW9uRHJvcGRvd25PcGVuXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWxsb3dUaWNrZXRDcmVhdGlvbkRyb3Bkb3duKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnYWxsb3dUaWNrZXRDcmVhdGlvbicpPy52YWx1ZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcG9jVGlja2V0Q3JlYXRpb25kYXlzWzBdIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc0FsbG93VGlja2V0Q3JlYXRpb25Ecm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHNwb2NUaWNrZXRDcmVhdGlvbmRheXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QWxsb3dUaWNrZXRDcmVhdGlvbigkZXZlbnQsIGRheSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5IH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLTBcIj5EYXlzPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGhyIGNsYXNzPVwiZmYtZGl2aWRlclwiPlxyXG5cclxuICAgIDwhLS0gVGlja2V0IEF1dG8tY2xvc2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbS0wXCI+VGlja2V0IEF1dG8tY2xvc2U8L2g1PlxyXG5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3dpdGNoIG0tMCBtcy0zXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImlzQXV0b0Nsb3NlRW5hYmxlXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbGlkZXIgcm91bmRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICBUaWNrZXQgc2hvdWxkIGJlIGF1dG8tY2xvc2VkLCBpZiB0aGUgY3JlYXRlZCB0aWNrZXQgYWNjdXJhY3kgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0IG1zLTJcIiBbY2xhc3Mub3Blbl09XCJpc0F1dG9DbG9zZURyb3Bkb3duT3BlblwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0IHx8ICFmb290ZmFsbERpckNvbmZpZ3VyYXRpb25Gb3JtLmdldCgnaXNBdXRvQ2xvc2VFbmFibGUnKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiIChjbGljayk9XCJ0b2dnbGVBdXRvQ2xvc2VEcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2F1dG9DbG9zZUFjY3VyYWN5Jyk/LnZhbHVlIHx8ICcxJScgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQXV0b0Nsb3NlRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2YgYWNjdXJhY3lQZXJjZW50YWdlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBdXRvQ2xvc2VBY2N1cmFjeSgkZXZlbnQsIHApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8aHIgY2xhc3M9XCJmZi1kaXZpZGVyXCI+XHJcblxyXG4gICAgPCEtLSBGb290ZmFsbCBEaXJlY3RvcnkgTGltaXRhdGlvbnMgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCIgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbS0wXCI+Rm9vdGZhbGwgZGlyZWN0b3J5IGxpbWl0YXRpb25zPC9oNT5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmYtc2VjdGlvbi1kZXNjIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICBTZXQgbWF4aW11bSBsaW1pdGF0aW9uIGZvciBzdG9yZXMgdG8gdGFnIG5vbi1QdXJjaGFzZXJzIGZyb20gVG90YWwgRm9vdGZhbGxcclxuICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXNFZGl0XCIgY2xhc3M9XCJhZGQtbmV3LWJ0biBkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNhdGVnb3J5TW9kYWwoJ2FkZCcpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggMy4zMzMzNFYxMi42NjY3TTMuMzMzMzQgOEgxMi42NjY3XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+QWRkIE5ldzwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQ2F0ZWdvcnkgQ2FyZHMgR3JpZCAtLT5cclxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJ0YWdnaW5nTGltaXRhdGlvblwiIGNsYXNzPVwiY2F0ZWdvcnktZ3JpZCBtdC0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhZyBvZiB0YWdMaW1pdHMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJjYXRlZ29yeS1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaWNvblwiIFtuZ0NsYXNzXT1cInRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInZHVwbGljYXRlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMTE2Ml8yNDYyMSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMi41IDcuNUgyQzEuNzM0NzggNy41IDEuNDgwNDMgNy4zOTQ2NCAxLjI5Mjg5IDcuMjA3MTFDMS4xMDUzNiA3LjAxOTU3IDEgNi43NjUyMiAxIDYuNVYyQzEgMS43MzQ3OCAxLjEwNTM2IDEuNDgwNDMgMS4yOTI4OSAxLjI5Mjg5QzEuNDgwNDMgMS4xMDUzNiAxLjczNDc4IDEgMiAxSDYuNUM2Ljc2NTIyIDEgNy4wMTk1NyAxLjEwNTM2IDcuMjA3MTEgMS4yOTI4OUM3LjM5NDY0IDEuNDgwNDMgNy41IDEuNzM0NzggNy41IDJWMi41TTUuNSA0LjVIMTBDMTAuNTUyMyA0LjUgMTEgNC45NDc3MiAxMSA1LjVWMTBDMTEgMTAuNTUyMyAxMC41NTIzIDExIDEwIDExSDUuNUM0Ljk0NzcyIDExIDQuNSAxMC41NTIzIDQuNSAxMFY1LjVDNC41IDQuOTQ3NzIgNC45NDc3MiA0LjUgNS41IDQuNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzExNjJfMjQ2MjFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2VtcGxveWVlVGFnJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTYgMTNcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuMTY2NyAxMi41VjExLjE2NjdDMTEuMTY2NyAxMC40NTk0IDEwLjg4NTcgOS43ODExNSAxMC4zODU2IDkuMjgxMDVDOS44ODU1MiA4Ljc4MDk1IDkuMjA3MjQgOC41IDguNSA4LjVIMy4xNjY2N0MyLjQ1OTQyIDguNSAxLjc4MTE1IDguNzgwOTUgMS4yODEwNSA5LjI4MTA1QzAuNzgwOTUyIDkuNzgxMTUgMC41IDEwLjQ1OTQgMC41IDExLjE2NjdWMTIuNU0xNS4xNjY3IDEyLjVWMTEuMTY2N0MxNS4xNjYyIDEwLjU3NTggMTQuOTY5NiAxMC4wMDE4IDE0LjYwNzYgOS41MzQ4OEMxNC4yNDU2IDkuMDY3OTEgMTMuNzM4OCA4LjczNDM4IDEzLjE2NjcgOC41ODY2N00xMC41IDAuNTg2NjY3QzExLjA3MzYgMC43MzM1MzQgMTEuNTgyIDEuMDY3MTMgMTEuOTQ1MSAxLjUzNDg3QzEyLjMwODIgMi4wMDI2MSAxMi41MDUyIDIuNTc3ODkgMTIuNTA1MiAzLjE3QzEyLjUwNTIgMy43NjIxMSAxMi4zMDgyIDQuMzM3MzkgMTEuOTQ1MSA0LjgwNTEzQzExLjU4MiA1LjI3Mjg3IDExLjA3MzYgNS42MDY0NyAxMC41IDUuNzUzMzNNOC41IDMuMTY2NjdDOC41IDQuNjM5NDMgNy4zMDYwOSA1LjgzMzMzIDUuODMzMzMgNS44MzMzM0M0LjM2MDU3IDUuODMzMzMgMy4xNjY2NyA0LjYzOTQzIDMuMTY2NjcgMy4xNjY2N0MzLjE2NjY3IDEuNjkzOTEgNC4zNjA1NyAwLjUgNS44MzMzMyAwLjVDNy4zMDYwOSAwLjUgOC41IDEuNjkzOTEgOC41IDMuMTY2NjdaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidob3VzZUtlZXBpbmdUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMTYyXzI0NjUwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMDQ5ODMgMC41NDQ5NDdDNy43NDczOCAtMC4xODE2NDkgOC44NzgyOSAtMC4xODE2NDkgOS41NzU4NCAwLjU0NDk0N0wxNS40Njk3IDYuNjg0NEMxNi4xNjcyIDcuNDExMDEgMTYuMTY3MiA4LjU4OTA0IDE1LjQ2OTcgOS4zMTU2NUw5LjU3NTg0IDE1LjQ1NTFDOC44NzgyOSAxNi4xODE2IDcuNzQ3MzggMTYuMTgxNiA3LjA0OTgzIDE1LjQ1NTFMNS4zNjU2MiAxMy43MDA3TDMuODIxNzkgMTUuMzA4OEMzLjEyNDI2IDE2LjAzNTQgMS45OTMzNCAxNi4wMzU0IDEuMjk1OCAxNS4zMDg4QzAuNTk4MjcyIDE0LjU4MjMgMC41OTgyNzIgMTMuNDA0MiAxLjI5NTggMTIuNjc3N0wyLjgzOTY0IDExLjA2OTVMMS4xNTU5NiA5LjMxNTY1QzAuNDU4NDI5IDguNTg5MDQgMC40NTg0MjkgNy40MTEwMSAxLjE1NTk2IDYuNjg0NEw3LjA0OTgzIDAuNTQ0OTQ3Wk04LjczMzgxIDEuNDIyMDNDOC41MDEyOSAxLjE3OTgzIDguMTI0MyAxLjE3OTgzIDcuODkxNzggMS40MjIwM0wzLjY4MTY1IDUuODA3NjJMMTAuNDE3NSAxMi44MjQyTDE0LjYyNzcgOC40Mzg1NEMxNC44NjAyIDguMTk2MzQgMTQuODYwMiA3LjgwMzYzIDE0LjYyNzcgNy41NjE1MUwxMS42ODA1IDQuNDkxNDNMMTAuNjk4MSA1LjUxNDY5QzEwLjQ2NTYgNS43NTY4OSAxMC4wODg3IDUuNzU2ODkgOS44NTYxNCA1LjUxNDY5QzkuNjIzNjMgNS4yNzI0OSA5LjYyMzYzIDQuODc5ODEgOS44NTYxNCA0LjYzNzYxTDEwLjgzODQgMy42MTQzNUw5Ljk5NjY1IDIuNzM3NDZMNy42MTEgNS4yMjI1MkM3LjM3ODQ5IDUuNDY0NzEgNy4wMDE0OSA1LjQ2NDcxIDYuNzY4OTcgNS4yMjI1MkM2LjUzNjQ2IDQuOTgwMzIgNi41MzY0NiA0LjU4NzYzIDYuNzY4OTcgNC4zNDU0NEw5LjE1NDYyIDEuODYwMzhMOC43MzM4MSAxLjQyMjAzWk05LjU3NTUyIDEzLjcwMTJMMi44Mzk2NiA2LjY4NDdMMS45OTc5NiA3LjU2MTUxQzEuNzY1NDQgNy44MDM2MyAxLjc2NTQ0IDguMTk2MzQgMS45OTc5NiA4LjQzODU0TDcuODkxNzggMTQuNTc4QzguMTI0MyAxNC44MjAyIDguNTAxMjkgMTQuODIwMiA4LjczMzgxIDE0LjU3OEw5LjU3NTUyIDEzLjcwMTJaTTMuNjgxNTYgMTEuOTQ2NkwyLjEzNzggMTMuNTU0N0MxLjkwNTI5IDEzLjc5NjkgMS45MDUyOSAxNC4xODk2IDIuMTM3OCAxNC40MzE4QzIuMzcwMzEgMTQuNjc0IDIuNzQ3MjkgMTQuNjc0IDIuOTc5OCAxNC40MzE4TDQuNTIzNTUgMTIuODIzN0wzLjY4MTU2IDExLjk0NjZaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTE2Ml8yNDY1MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInanVua1RhZydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIgNC4wMDAwNEgzLjMzMzMzTTMuMzMzMzMgNC4wMDAwNEgxNE0zLjMzMzMzIDQuMDAwMDRWMTMuMzMzNEMzLjMzMzMzIDEzLjY4NyAzLjQ3MzgxIDE0LjAyNjEgMy43MjM4NiAxNC4yNzYyQzMuOTczOTEgMTQuNTI2MiA0LjMxMzA0IDE0LjY2NjcgNC42NjY2NyAxNC42NjY3SDExLjMzMzNDMTEuNjg3IDE0LjY2NjcgMTIuMDI2MSAxNC41MjYyIDEyLjI3NjEgMTQuMjc2MkMxMi41MjYyIDE0LjAyNjEgMTIuNjY2NyAxMy42ODcgMTIuNjY2NyAxMy4zMzM0VjQuMDAwMDRIMy4zMzMzM1pNNS4zMzMzMyA0LjAwMDA0VjIuNjY2NzFDNS4zMzMzMyAyLjMxMzA5IDUuNDczODEgMS45NzM5NSA1LjcyMzg2IDEuNzIzOUM1Ljk3MzkxIDEuNDczODUgNi4zMTMwNCAxLjMzMzM3IDYuNjY2NjcgMS4zMzMzN0g5LjMzMzMzQzkuNjg2OTYgMS4zMzMzNyAxMC4wMjYxIDEuNDczODUgMTAuMjc2MSAxLjcyMzlDMTAuNTI2MiAxLjk3Mzk1IDEwLjY2NjcgMi4zMTMwOSAxMC42NjY3IDIuNjY2NzFWNC4wMDAwNE02LjY2NjY3IDcuMzMzMzdWMTEuMzMzNE05LjMzMzMzIDcuMzMzMzdWMTEuMzMzNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3B1cnBsZVRhZydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIwLjcwNzEgMTMuMjkyOUwxMS40MTQyIDRINFYxMS40MTQyTDEzLjI5MjkgMjAuNzA3MUMxMy42ODM0IDIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDE0LjcwNzEgMjAuNzA3MUwyMC43MDcxIDE0LjcwNzFDMjEuMDk3NiAxNC4zMTY2IDIxLjA5NzYgMTMuNjgzNCAyMC43MDcxIDEzLjI5MjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcgN0g3LjAxXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidvcmFuZ2VUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGFnLmdldCgnbmFtZScpPy52YWx1ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIodGFnLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgIT09ICdkdXBsaWNhdGVUYWcnICYmIHRhZy5nZXQoJ2ljb25OYW1lJyk/LnZhbHVlICE9PSAnZW1wbG95ZWVUYWcnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNhdGVnb3J5LW1lbnUtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3J5TWVudSgkZXZlbnQsIGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRWRpdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNUMxMi41NTIzIDUgMTMgNC41NTIyOCAxMyA0QzEzIDMuNDQ3NzIgMTIuNTUyMyAzIDEyIDNDMTEuNDQ3NyAzIDExIDMuNDQ3NzIgMTEgNEMxMSA0LjU1MjI4IDExLjQ0NzcgNSAxMiA1WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyIDEzQzEyLjU1MjMgMTMgMTMgMTIuNTUyMyAxMyAxMkMxMyAxMS40NDc3IDEyLjU1MjMgMTEgMTIgMTFDMTEuNDQ3NyAxMSAxMSAxMS40NDc3IDExIDEyQzExIDEyLjU1MjMgMTEuNDQ3NyAxMyAxMiAxM1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMiAyMUMxMi41NTIzIDIxIDEzIDIwLjU1MjMgMTMgMjBDMTMgMTkuNDQ3NyAxMi41NTIzIDE5IDEyIDE5QzExLjQ0NzcgMTkgMTEgMTkuNDQ3NyAxMSAyMEMxMSAyMC41NTIzIDExLjQ0NzcgMjEgMTIgMjFaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1tZW51XCIgKm5nSWY9XCJhY3RpdmVNZW51SW5kZXggPT09IGlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2F0ZWdvcnlNZW51QWN0aW9uKCRldmVudCwgJ2VkaXQnLCBpKVwiPkVkaXQgTmFtZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYXRlZ29yeU1lbnVBY3Rpb24oJGV2ZW50LCAnZGVsZXRlJywgaSlcIj5EZWxldGU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1wZXJjZW50YWdlLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cIm9wZW5MaW1pdERyb3Bkb3duSW5kZXggPT09IGlcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZSBzbWFsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGltaXREcm9wZG93bigkZXZlbnQsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB0YWcuZ2V0KCd2YWx1ZScpPy52YWx1ZSB8fCAwIH19JTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwib3BlbkxpbWl0RHJvcGRvd25JbmRleCA9PT0gaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2YgcGVyY2VudGFnZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMaW1pdFZhbHVlKCRldmVudCwgaSwgcClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIE92ZXJhbGwgbGltaXRhdGlvbjogY29tYmluZWQgY2FwIGFjcm9zcyBhbGwgdGFnIHR5cGVzIChzYXZlZCB0byBBUEkgYXMgb3ZlcmFsbExpbWl0YXRpb24sIGUuZy4gXCIzMCVcIikgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgZmYtb3ZlcmFsbC1saW1pdGF0aW9uXCI+XHJcbiAgICAgICAgICAgIDxoNiBjbGFzcz1cImZmLXNlY3Rpb24tdGl0bGUgbS0wXCI+T3ZlcmFsbCBsaW1pdGF0aW9uczwvaDY+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZmYtc2VjdGlvbi1kZXNjIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIENvbWJpbmVkIG1heGltdW0gbGltaXRhdGlvbiBhY3Jvc3MgYWxsIG5vbi1QdXJjaGFzZXIgdGFnc1xyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuXT1cImlzT3ZlcmFsbExpbWl0YXRpb25Ecm9wZG93bk9wZW5cIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPdmVyYWxsTGltaXRhdGlvbkRyb3Bkb3duKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBvdmVyYWxsTGltaXRhdGlvbkxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc092ZXJhbGxMaW1pdGF0aW9uRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2YgcGVyY2VudGFnZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3ZlcmFsbExpbWl0YXRpb24oJGV2ZW50LCBwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwIH19JVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGhyIGNsYXNzPVwiZmYtZGl2aWRlclwiICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCI+XHJcblxyXG4gICAgPCEtLSBTdG9yZSBSZXF1ZXN0cyAtLT5cclxuICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImFjY3VyYWN5QnJlYWNoXCIgY2xhc3M9XCJjYXJkIHAtNCBtYi00IGZmLXNlY3Rpb24tY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgbWItNFwiPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiZmYtc2VjdGlvbi10aXRsZSBtYi0yXCI+U3RvcmUgUmVxdWVzdHM8L2g1PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmZi1zZWN0aW9uLWRlc2MgbWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEJlbG93IHN0b3JlcyBoYXZlIHJlcXVlc3RlZCB0byByYWlzZSBhIHRpY2tldCBhZnRlciBicmVhY2hpbmcgdGhlIGNvbmZpZ3VyZWQgbGltaXRcclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluZm8taWNvblwiPmk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByZXNldC1idG4gZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNFZGl0XCIgW2Rpc2FibGVkXT1cImlzUmVzZXREaXNhYmxlZFwiIChjbGljayk9XCJvcGVuUmVzZXRDb25maXJtYXRpb25Nb2RhbCgpXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5SZXNldDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUmVzdHJpY3Rpb24gQ3JpdGVyaWEgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc3RyaWN0aW9uLWNyaXRlcmlhIG1iLTRcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMyBkLWJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICBSZXN0cmljdCB0aWNrZXQgY3JlYXRpb24gZm9yIGFueSBzdG9yZSB0aGF0OlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LW5vd3JhcCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+SGFzIHJhaXNlZCBtb3JlIHRoYW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdFwiIFtjbGFzcy5vcGVuXT1cImlzVGlja2V0Q291bnREcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc0VkaXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlVGlja2V0Q291bnREcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ2FjY3VyYWN5QnJlYWNoLnRpY2tldENvdW50Jyk/LnZhbHVlIHx8IDEgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJpc1RpY2tldENvdW50RHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBjIG9mIFsxLCAyLCAzLCA0LCA1XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGlja2V0Q291bnQoJGV2ZW50LCBjKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYyB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+dGlja2V0cyBpbiB0aGUgY2FsZW5kZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZmYtc2VsZWN0LXdyYXBwZXIgY29tcGFjdCBzdG9yZS1kYXlzLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9wZW5dPVwiaXNTdG9yZURheXNEcm9wZG93bk9wZW5cIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlIHNtYWxsXCIgKGNsaWNrKT1cInRvZ2dsZVN0b3JlRGF5c0Ryb3Bkb3duKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2VsZWN0ZWREYXlzTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNDc1NDY3XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzU3RvcmVEYXlzRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCBvcHQgb2YgZGF5c09wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0b3JlRGF5cygkZXZlbnQsIG9wdClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+YmFzZWQgb24gY29uZmlndXJlZCBjb25kaXRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCIgW25nYlRvb2x0aXBdPVwiY29uZGl0aW9uc1Rvb2x0aXBcIiB0b29sdGlwQ2xhc3M9XCJjb25kaXRpb25zLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xNDMyXzgwMDM1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMDAwNjUgMTAuNjY2NlY3Ljk5OTkyTTguMDAwNjUgNS4zMzMyNUg4LjAwNzMyTTE0LjY2NzMgNy45OTk5MkMxNC42NjczIDExLjY4MTggMTEuNjgyNiAxNC42NjY2IDguMDAwNjUgMTQuNjY2NkM0LjMxODc1IDE0LjY2NjYgMS4zMzM5OCAxMS42ODE4IDEuMzMzOTggNy45OTk5MkMxLjMzMzk4IDQuMzE4MDIgNC4zMTg3NSAxLjMzMzI1IDguMDAwNjUgMS4zMzMyNUMxMS42ODI2IDEuMzMzMjUgMTQuNjY3MyA0LjMxODAyIDE0LjY2NzMgNy45OTk5MlpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzE0MzJfODAwMzVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25kaXRpb25zVG9vbHRpcD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgZm9udC1zaXplOiAxMnB4OyBsaW5lLWhlaWdodDogMS42O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj4xLjwvYj4gRGVsdGEgYmV0d2VlbiBTdG9yZS9BT00gYWNjdXJhY3kgYW5kIENlbnRyYWwgT3BzL1RhbmdvIGFjY3VyYWN5IGV4Y2VlZHMgMTAlPGJyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Yj4yLjwvYj4gVGhlIG92ZXJhbGwgYWNjdXJhY3kgYWZ0ZXIgYWxsIHJldmlld3MgaXMgZ3JlYXRlciB0aGFuIDg1JS48YnI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiPjMuPC9iPiBPdmVyYWxsIHRoZSBOdW1iZXIgb2YgSW1hZ2VzIChGb290ZmFsbCkgbWFya2VkIGZvciB2YWxpZGF0aW9uIGluIHRoZSB0aWNrZXQgYnkgdGhlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIGlzIExlc3MgdGhhbiBlcXVhbCB0byAxMFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU3RvcmUgUmVxdWVzdHMgVGFibGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLXJlcXVlc3RzLXRhYmxlXCIgW2NsYXNzLmRpc2FibGVkXT1cImlzRWRpdFwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwic3RvcmVMaXN0Py5sZW5ndGggPiAwOyBlbHNlIGVtcHR5U3RvcmVSZXF1ZXN0c1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIFtuZ0NsYXNzXT1cInsnc3RvcmUtdGFibGUtc2Nyb2xsJzogc3RvcmVMaXN0Py5sZW5ndGggPiA1fVwiPlxyXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgc3RvcmUtcmVxdWVzdHMtdGFibGUtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2hlY2tib3gtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtc2VsZWN0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkXCIgW2Rpc2FibGVkXT1cImlzRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKCRldmVudClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2ttYXJrLXNlbGVjdFwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlIHN0b3JlLW5hbWUtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlNlbGVjdCBhbGwgc3RvcmVzICh7eyBzdG9yZUxpc3Q/Lmxlbmd0aCB8fCAwIH19KTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIGNsYXNzPVwibXMtMiBkcm9wZG93bi1hcnJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic29ydGFibGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWlzZWQgb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1zLTEgc29ydC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA0LjVMNiAxLjVMOSA0LjVNMyA3LjVMNiAxMC41TDkgNy41XCIgc3Ryb2tlPVwiIzM0NDA1NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdCByYWlzZWQoQXBwcm92ZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgMS41TDkgNC41TTMgNy41TDYgMTAuNUw5IDcuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzb3J0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIG9mIFRpbWUgUmFpc2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtcy0xIHNvcnQtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNC41TDYgMS41TDkgNC41TTMgNy41TDYgMTAuNUw5IDcuNVwiIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgc3RvcmUgb2Ygc3RvcmVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjaGVja2JveC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXN0b20tY2hlY2tib3gtc2VsZWN0IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI2NiIHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzU3RvcmVTZWxlY3RlZChzdG9yZSlcIiBbZGlzYWJsZWRdPVwiaXNFZGl0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU3RvcmVTZWxlY3Rpb24oc3RvcmUsIGNiLmNoZWNrZWQpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja21hcmstc2VsZWN0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnN0b3JlTmFtZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgc3RvcmUucmFpc2VkT24gfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLmxhc3RBcHByb3ZlZCB8fCAnLScgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7IHN0b3JlLnRvdGFsUmFpc2VkIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eVN0b3JlUmVxdWVzdHM+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdG9yZS1zdGF0ZSB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXN0b3JlLWljb24gbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04Ljk0NjI5IDIxLjE5OTVDOC42NDUgMjEuMjMxMyA4LjMzODI4IDIxLjI1MDIgOC4wMjczNCAyMS4yNTAyQzcuODU3ODIgMjEuMjUwMiA3LjY5MDUyIDIxLjI0MzQgNy41MjUzOSAyMS4yMzM2VjMxLjYwNjdDNy41MjUzOSAzMy4wMzQ3IDguNzA4MzcgMzQuMjI1OCAxMC4xOTYzIDM0LjIyNThIMjkuODAwOEMzMS4yODg4IDM0LjIyNTggMzIuNDcxNyAzMy4wMzQ3IDMyLjQ3MTcgMzEuNjA2N1YyMS4yMzQ2QzMyLjMwOTggMjEuMjQzOCAzMi4xNDU5IDIxLjI1MDIgMzEuOTgxNCAyMS4yNTAyQzMxLjY2NzUgMjEuMjUwMiAzMS4zNTY5IDIxLjIzMjMgMzEuMDUwOCAyMS4xOTk1VjI4Ljk4NzVIOC45NDYyOVYyMS4xOTk1Wk0zMC45Mjc3IDUuNzczNjhIOS4wNjkzNEM4Ljg5MTk3IDUuNzczNjggOC43MzY3MSA1Ljg2NjQ3IDguNjU5MTggNS45ODc1NUw4LjY1NzIzIDUuOTg5NUw1LjE0NzQ2IDExLjQ3MjlMNS4wNTI3MyAxMS42MjA0QzMuODI3MTkgMTMuNzQwMiA1LjA5MTggMTYuNDY3MSA3LjQ0MzM2IDE2Ljc3NjZDNy42NDQyOCAxNi44MDExIDcuODM0MDMgMTYuODE1NyA4LjAyMTQ4IDE2LjgxNTdDOS4yNTE1NiAxNi44MTU3IDEwLjMzOTUgMTYuMjg3IDExLjA5NjcgMTUuNDY1MUwxMi4wMTg2IDE0LjQ2NDFMMTIuOTM3NSAxNS40NjhDMTMuNjg2NCAxNi4yODYxIDE0Ljc3MzEgMTYuODE1NyAxNi4wMTA3IDE2LjgxNTdDMTcuMjQyOCAxNi44MTU2IDE4LjMzNDcgMTYuMjg1NCAxOS4wODMgMTUuNDY4TDIwLjAwNDkgMTQuNDYxMkwyMC45MjY4IDE1LjQ2OEMyMS42NzUxIDE2LjI4NTUgMjIuNzY2OCAxNi44MTU3IDIzLjk5OSAxNi44MTU3QzI1LjIzMTIgMTYuODE1NyAyNi4zMjI5IDE2LjI4NTQgMjcuMDcxMyAxNS40NjhMMjcuOTkzMiAxNC40NjEyTDI4LjkxNSAxNS40NjhDMjkuNjYzNCAxNi4yODU1IDMwLjc1NiAxNi44MTU3IDMxLjk4ODMgMTYuODE1N0MzMi4xNjk3IDE2LjgxNTcgMzIuMzY0OCAxNi44MDE4IDMyLjU2NDUgMTYuNzc3NkgzMi41NjM1QzM0Ljk1NzIgMTYuNDU3MSAzNi4yMjU0IDEzLjYwNzUgMzQuODU3NCAxMS40NzI5TDM0Ljg1NjQgMTEuNDczOUwzMS4zMzk4IDUuOTkwNDhMMzEuMzM4OSA1Ljk4NzU1QzMxLjI2MTQgNS44NjYyOCAzMS4xMDUzIDUuNzczNjggMzAuOTI3NyA1Ljc3MzY4WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDA5QkYzXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIGZ3LXNlbWlib2xkIHRleHQtbXV0ZWRcIj5ObyByZXNldCByZXF1ZXN0IGZyb20gc3RvcmU8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8aHIgY2xhc3M9XCJmZi1kaXZpZGVyXCIgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8udXNlclR5cGUgPT09ICd0YW5nbydcIj5cclxuXHJcbiAgICA8IS0tIFNlbmQgVGlja2V0IHRvIFRhbmdvIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiIGNsYXNzPVwiY2FyZCBwLTQgbWItNCBmZi1zZWN0aW9uLWNhcmRcIj5cclxuICAgICAgICA8aDUgY2xhc3M9XCJmZi1zZWN0aW9uLXRpdGxlIG1iLTFcIj5TZW5kIFRpY2tldCB0byBUYW5nbzwvaDU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMlwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtZS0yIG1iLTAgdGFuZ28tbGFiZWxcIj5TZW5kIHRpY2tldCB0byBUYW5nbyBpZiBhY2N1cmFjeSBmYWxscyBiZWxvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSBmZi1zZWxlY3Qtd3JhcHBlciBjb21wYWN0IG1zLTBcIiBbY2xhc3Mub3Blbl09XCJpc3NlbmRUYW5nb0Ryb3Bkb3duT3BlblwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNFZGl0XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZmLXNlbGVjdC10b2dnbGUgc21hbGxcIiAoY2xpY2spPVwidG9nZ2xlU2VuZFRhbmdvQ2xvc2VEcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZm9vdGZhbGxEaXJDb25maWd1cmF0aW9uRm9ybS5nZXQoJ3RhbmdvUmV2aWV3Jyk/LnZhbHVlIHx8ICcxJScgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzc2VuZFRhbmdvRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2Ygc2VuZFRpY2tldFRhbmdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFNlbmRUaWNrZXRUYW5nbygkZXZlbnQsIHApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEZvb3RlciBBY3Rpb25zIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIiFpc0VkaXRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItNSB3LTEwMCBmb290ZXItc2VwZXJhdG9yXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgIDxhIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtdC0xIHB0LTMgbWUtNFwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9hPlxyXG4gICAgICAgICAgICA8YSB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcHgtNFwiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+PHNwYW4+U2F2ZSBDaGFuZ2VzPC9zcGFuPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ2F0ZWdvcnkgTW9kYWwgLS0+XHJcbiAgICA8bmctdGVtcGxhdGUgI2NhdGVnb3J5TW9kYWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBib3JkZXItMCBwYi0wXCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBjYXRlZ29yeU1vZGFsTW9kZSA9PT0gJ2FkZCcgPyAnQWRkIE5ldyBDYXRlZ29yeScgOiAnRWRpdCBDYXRlZ29yeScgfX1cclxuICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwiY2xvc2VDYXRlZ29yeU1vZGFsKClcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBjYXRlZ29yeS1tb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY2F0ZWdvcnlGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkljb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3Qtd3JhcHBlciBpY29uLXNlbGVjdFwiIFtjbGFzcy5vcGVuXT1cImlzQ2F0ZWdvcnlJY29uRHJvcGRvd25PcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LXRvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeUljb25Ecm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY2F0ZWdvcnlGb3JtLmdldCgnaWNvbk5hbWUnKT8udmFsdWUgfHwgYmFzZUNhdGVnb3J5SWNvbnNbMF0/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N3aXRjaF09XCJjYXRlZ29yeUZvcm0uZ2V0KCdpY29uTmFtZScpPy52YWx1ZSB8fCBiYXNlQ2F0ZWdvcnlJY29uc1swXT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidwdXJwbGVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidvcmFuZ2VUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidob3VzZUtlZXBpbmdUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF9pY29uX2hvdXNla2VlcGluZylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjA0OTgzIDAuNTQ0OTQ3QzcuNzQ3MzggLTAuMTgxNjQ5IDguODc4MjkgLTAuMTgxNjQ5IDkuNTc1ODQgMC41NDQ5NDdMMTUuNDY5NyA2LjY4NDRDMTYuMTY3MiA3LjQxMTAxIDE2LjE2NzIgOC41ODkwNCAxNS40Njk3IDkuMzE1NjVMOS41NzU4NCAxNS40NTUxQzguODc4MjkgMTYuMTgxNiA3Ljc0NzM4IDE2LjE4MTYgNy4wNDk4MyAxNS40NTUxTDUuMzY1NjIgMTMuNzAwN0wzLjgyMTc5IDE1LjMwODhDMy4xMjQyNiAxNi4wMzU0IDEuOTkzMzQgMTYuMDM1NCAxLjI5NTggMTUuMzA4OEMwLjU5ODI3MiAxNC41ODIzIDAuNTk4MjcyIDEzLjQwNDIgMS4yOTU4IDEyLjY3NzdMMi44Mzk2NCAxMS4wNjk1TDEuMTU1OTYgOS4zMTU2NUMwLjQ1ODQyOSA4LjU4OTA0IDAuNDU4NDI5IDcuNDExMDEgMS4xNTU5NiA2LjY4NDRMNy4wNDk4MyAwLjU0NDk0N1pNOC43MzM4MSAxLjQyMjAzQzguNTAxMjkgMS4xNzk4MyA4LjEyNDMgMS4xNzk4MyA3Ljg5MTc4IDEuNDIyMDNMMy42ODE2NSA1LjgwNzYyTDEwLjQxNzUgMTIuODI0MkwxNC42Mjc3IDguNDM4NTRDMTQuODYwMiA4LjE5NjM0IDE0Ljg2MDIgNy44MDM2MyAxNC42Mjc3IDcuNTYxNTFMMTEuNjgwNSA0LjQ5MTQzTDEwLjY5ODEgNS41MTQ2OUMxMC40NjU2IDUuNzU2ODkgMTAuMDg4NyA1Ljc1Njg5IDkuODU2MTQgNS41MTQ2OUM5LjYyMzYzIDUuMjcyNDkgOS42MjM2MyA0Ljg3OTgxIDkuODU2MTQgNC42Mzc2MUwxMC44Mzg0IDMuNjE0MzVMOS45OTY2NSAyLjczNzQ2TDcuNjExIDUuMjIyNTJDNy4zNzg0OSA1LjQ2NDcxIDcuMDAxNDkgNS40NjQ3MSA2Ljc2ODk3IDUuMjIyNTJDNi41MzY0NiA0Ljk4MDMyIDYuNTM2NDYgNC41ODc2MyA2Ljc2ODk3IDQuMzQ1NDRMOS4xNTQ2MiAxLjg2MDM4TDguNzMzODEgMS40MjIwM1pNOS41NzU1MiAxMy43MDEyTDIuODM5NjYgNi42ODQ3TDEuOTk3OTYgNy41NjE1MUMxLjc2NTQ0IDcuODAzNjMgMS43NjU0NCA4LjE5NjM0IDEuOTk3OTYgOC40Mzg1NEw3Ljg5MTc4IDE0LjU3OEM4LjEyNDMgMTQuODIwMiA4LjUwMTI5IDE0LjgyMDIgOC43MzM4MSAxNC41NzhMOS41NzU1MiAxMy43MDEyWk0zLjY4MTU2IDExLjk0NjZMMi4xMzc4IDEzLjU1NDdDMS45MDUyOSAxMy43OTY5IDEuOTA1MjkgMTQuMTg5NiAyLjEzNzggMTQuNDMxOEMyLjM3MDMxIDE0LjY3NCAyLjc0NzI5IDE0LjY3NCAyLjk3OTggMTQuNDMxOEw0LjUyMzU1IDEyLjgyMzdMMy42ODE1NiAxMS45NDY2WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwX2ljb25faG91c2VrZWVwaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwid2hpdGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ2p1bmtUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yIDQuMDAwMDRIMy4zMzMzM00zLjMzMzMzIDQuMDAwMDRIMTRNMy4zMzMzMyA0LjAwMDA0VjEzLjMzMzRDMy4zMzMzMyAxMy42ODcgMy40NzM4MSAxNC4wMjYxIDMuNzIzODYgMTQuMjc2MkMzLjk3MzkxIDE0LjUyNjIgNC4zMTMwNCAxNC42NjY3IDQuNjY2NjcgMTQuNjY2N0gxMS4zMzMzQzExLjY4NyAxNC42NjY3IDEyLjAyNjEgMTQuNTI2MiAxMi4yNzYxIDE0LjI3NjJDMTIuNTI2MiAxNC4wMjYxIDEyLjY2NjcgMTMuNjg3IDEyLjY2NjcgMTMuMzMzNFY0LjAwMDA0SDMuMzMzMzNaTTUuMzMzMzMgNC4wMDAwNFYyLjY2NjcxQzUuMzMzMzMgMi4zMTMwOSA1LjQ3MzgxIDEuOTczOTUgNS43MjM4NiAxLjcyMzlDNS45NzM5MSAxLjQ3Mzg1IDYuMzEzMDQgMS4zMzMzNyA2LjY2NjY3IDEuMzMzMzdIOS4zMzMzM0M5LjY4Njk2IDEuMzMzMzcgMTAuMDI2MSAxLjQ3Mzg1IDEwLjI3NjEgMS43MjM5QzEwLjUyNjIgMS45NzM5NSAxMC42NjY3IDIuMzEzMDkgMTAuNjY2NyAyLjY2NjcxVjQuMDAwMDRNNi42NjY2NyA3LjMzMzM3VjExLjMzMzRNOS4zMzMzMyA3LjMzMzM3VjExLjMzMzRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWxhYmVsXCI+e3sgc2VsZWN0ZWRDYXRlZ29yeUljb25MYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDZMOCAxMEwxMiA2XCIgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZi1zZWxlY3QtbWVudVwiICpuZ0lmPVwiaXNDYXRlZ29yeUljb25Ecm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmYtc2VsZWN0LW9wdGlvbiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjYXRlZ29yeUljb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2F0ZWdvcnlJY29uRnJvbURyb3Bkb3duKCRldmVudCwgaWNvbi52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5LWljb25cIiBbbmdDbGFzc109XCJpY29uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImljb24udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidwdXJwbGVUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidvcmFuZ2VUYWcnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yMC43MDcxIDEzLjI5MjlMMTEuNDE0MiA0SDRWMTEuNDE0MkwxMy4yOTI5IDIwLjcwNzFDMTMuNjgzNCAyMS4wOTc2IDE0LjMxNjYgMjEuMDk3NiAxNC43MDcxIDIwLjcwNzFMMjAuNzA3MSAxNC43MDcxQzIxLjA5NzYgMTQuMzE2NiAyMS4wOTc2IDEzLjY4MzQgMjAuNzA3MSAxMy4yOTI5WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDdINy4wMVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidob3VzZUtlZXBpbmdUYWcnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8xMTYyXzI0NjUwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMDQ5ODMgMC41NDQ5NDdDNy43NDczOCAtMC4xODE2NDkgOC44NzgyOSAtMC4xODE2NDkgOS41NzU4NCAwLjU0NDk0N0wxNS40Njk3IDYuNjg0NEMxNi4xNjcyIDcuNDExMDEgMTYuMTY3MiA4LjU4OTA0IDE1LjQ2OTcgOS4zMTU2NUw5LjU3NTg0IDE1LjQ1NTFDOC44NzgyOSAxNi4xODE2IDcuNzQ3MzggMTYuMTgxNiA3LjA0OTgzIDE1LjQ1NTFMNS4zNjU2MiAxMy43MDA3TDMuODIxNzkgMTUuMzA4OEMzLjEyNDI2IDE2LjAzNTQgMS45OTMzNCAxNi4wMzU0IDEuMjk1OCAxNS4zMDg4QzAuNTk4MjcyIDE0LjU4MjMgMC41OTgyNzIgMTMuNDA0MiAxLjI5NTggMTIuNjc3N0wyLjgzOTY0IDExLjA2OTVMMS4xNTU5NiA5LjMxNTY1QzAuNDU4NDI5IDguNTg5MDQgMC40NTg0MjkgNy40MTEwMSAxLjE1NTk2IDYuNjg0NEw3LjA0OTgzIDAuNTQ0OTQ3Wk04LjczMzgxIDEuNDIyMDNDOC41MDEyOSAxLjE3OTgzIDguMTI0MyAxLjE3OTgzIDcuODkxNzggMS40MjIwM0wzLjY4MTY1IDUuODA3NjJMMTAuNDE3NSAxMi44MjQyTDE0LjYyNzcgOC40Mzg1NEMxNC44NjAyIDguMTk2MzQgMTQuODYwMiA3LjgwMzYzIDE0LjYyNzcgNy41NjE1MUwxMS42ODA1IDQuNDkxNDNMMTAuNjk4MSA1LjUxNDY5QzEwLjQ2NTYgNS43NTY4OSAxMC4wODg3IDUuNzU2ODkgOS44NTYxNCA1LjUxNDY5QzkuNjIzNjMgNS4yNzI0OSA5LjYyMzYzIDQuODc5ODEgOS44NTYxNCA0LjYzNzYxTDEwLjgzODQgMy42MTQzNUw5Ljk5NjY1IDIuNzM3NDZMNy42MTEgNS4yMjI1MkM3LjM3ODQ5IDUuNDY0NzEgNy4wMDE0OSA1LjQ2NDcxIDYuNzY4OTcgNS4yMjI1MkM2LjUzNjQ2IDQuOTgwMzIgNi41MzY0NiA0LjU4NzYzIDYuNzY4OTcgNC4zNDU0NEw5LjE1NDYyIDEuODYwMzhMOC43MzM4MSAxLjQyMjAzWk05LjU3NTUyIDEzLjcwMTJMMi44Mzk2NiA2LjY4NDdMMS45OTc5NiA3LjU2MTUxQzEuNzY1NDQgNy44MDM2MyAxLjc2NTQ0IDguMTk2MzQgMS45OTc5NiA4LjQzODU0TDcuODkxNzggMTQuNTc4QzguMTI0MyAxNC44MjAyIDguNTAxMjkgMTQuODIwMiA4LjczMzgxIDE0LjU3OEw5LjU3NTUyIDEzLjcwMTJaTTMuNjgxNTYgMTEuOTQ2NkwyLjEzNzggMTMuNTU0N0MxLjkwNTI5IDEzLjc5NjkgMS45MDUyOSAxNC4xODk2IDIuMTM3OCAxNC40MzE4QzIuMzcwMzEgMTQuNjc0IDIuNzQ3MjkgMTQuNjc0IDIuOTc5OCAxNC40MzE4TDQuNTIzNTUgMTIuODIzN0wzLjY4MTU2IDExLjk0NjZaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfMTE2Ml8yNDY1MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidqdW5rVGFnJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMiA0LjAwMDA0SDMuMzMzMzNNMy4zMzMzMyA0LjAwMDA0SDE0TTMuMzMzMzMgNC4wMDAwNFYxMy4zMzM0QzMuMzMzMzMgMTMuNjg3IDMuNDczODEgMTQuMDI2MSAzLjcyMzg2IDE0LjI3NjJDMy45NzM5MSAxNC41MjYyIDQuMzEzMDQgMTQuNjY2NyA0LjY2NjY3IDE0LjY2NjdIMTEuMzMzM0MxMS42ODcgMTQuNjY2NyAxMi4wMjYxIDE0LjUyNjIgMTIuMjc2MSAxNC4yNzYyQzEyLjUyNjIgMTQuMDI2MSAxMi42NjY3IDEzLjY4NyAxMi42NjY3IDEzLjMzMzRWNC4wMDAwNEgzLjMzMzMzWk01LjMzMzMzIDQuMDAwMDRWMi42NjY3MUM1LjMzMzMzIDIuMzEzMDkgNS40NzM4MSAxLjk3Mzk1IDUuNzIzODYgMS43MjM5QzUuOTczOTEgMS40NzM4NSA2LjMxMzA0IDEuMzMzMzcgNi42NjY2NyAxLjMzMzM3SDkuMzMzMzNDOS42ODY5NiAxLjMzMzM3IDEwLjAyNjEgMS40NzM4NSAxMC4yNzYxIDEuNzIzOUMxMC41MjYyIDEuOTczOTUgMTAuNjY2NyAyLjMxMzA5IDEwLjY2NjcgMi42NjY3MVY0LjAwMDA0TTYuNjY2NjcgNy4zMzMzN1YxMS4zMzM0TTkuMzMzMzMgNy4zMzMzN1YxMS4zMzM0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGljb24ubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgdGV4dC1tdXRlZFwiPkNhdGVnb3J5IE5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy5pbnZhbGlkICYmIGNhdGVnb3J5Rm9ybS5nZXQoJ25hbWUnKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBuZXcgY2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2F0ZWdvcnlGb3JtLmdldCgnbmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/Lmhhc0Vycm9yKCdkdXBsaWNhdGUnKSAmJiBjYXRlZ29yeUZvcm0uZ2V0KCduYW1lJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcnkgbmFtZSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHRleHQtbXV0ZWRcIj5MaW1pdGF0aW9uPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LXdyYXBwZXJcIiBbY2xhc3Mub3Blbl09XCJpc0NhdGVnb3J5TGltaXREcm9wZG93bk9wZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3QtdG9nZ2xlXCIgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3J5TGltaXREcm9wZG93bigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjYXRlZ29yeUZvcm0uZ2V0KCdsaW1pdCcpPy52YWx1ZSB8fCBwZXJjZW50YWdlTGlzdFswXSB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA2TDggMTBMMTIgNlwiIHN0cm9rZT1cIiM0NzU0NjdcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmYtc2VsZWN0LW1lbnVcIiAqbmdJZj1cImlzQ2F0ZWdvcnlMaW1pdERyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmZi1zZWxlY3Qtb3B0aW9uXCIgKm5nRm9yPVwibGV0IHAgb2YgcGVyY2VudGFnZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDYXRlZ29yeUxpbWl0VmFsdWUoJGV2ZW50LCBwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHAgfX0lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXIgYm9yZGVyLTAgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJjbG9zZUNhdGVnb3J5TW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzdWJtaXRDYXRlZ29yeUZvcm0oKVwiPlxyXG4gICAgICAgICAgICAgICAge3sgY2F0ZWdvcnlNb2RhbE1vZGUgPT09ICdhZGQnID8gJ0NyZWF0ZScgOiAnU2F2ZScgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDwhLS0gRGVsZXRlIENvbmZpcm1hdGlvbiBNb2RhbCAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGVsZXRlQ2F0ZWdvcnlNb2RhbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSB0ZXh0LWNlbnRlciBwLTRcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwiZnctc2VtaWJvbGQgbWItMlwiPkNvbmZpcm1hdGlvbjwvaDU+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItNCB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICBZb3UncmUgYWJvdXQgdG8gZGVsZXRlIDxzcGFuIGNsYXNzPVwiZnctc2VtaWJvbGRcIj57eyBjYXRlZ29yeVBlbmRpbmdEZWxldGVOYW1lIH19PC9zcGFuPiBjYXRlZ29yeS5cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImNsb3NlRGVsZXRlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIChjbGljayk9XCJjb25maXJtRGVsZXRlQ2F0ZWdvcnkoKVwiPkRlbGV0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPCEtLSBSZXNldCBTdG9yZSBSZXF1ZXN0cyBDb25maXJtYXRpb24gTW9kYWwgLS0+XHJcbiAgICA8bmctdGVtcGxhdGUgI3Jlc2V0Q29uZmlybWF0aW9uTW9kYWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgdGV4dC1jZW50ZXIgcC00XCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cImZ3LXNlbWlib2xkIG1iLTJcIj5SZXNldCBTdG9yZSBSZXF1ZXN0czwvaDU+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItNCB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZCB3aXRoIHJlc2V0dGluZyB0aGUgc2VsZWN0ZWQgPHNwYW4gY2xhc3M9XCJmdy1zZW1pYm9sZFwiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzZXRSZXF1ZXN0LmFycmF5T2ZTdG9yZXMubGVuZ3RoIH19PC9zcGFuPiBzdG9yZShzKSByZXF1ZXN0cz9cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCIgKGNsaWNrKT1cImNsb3NlUmVzZXRNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjb25maXJtUmVzZXRTdG9yZVJlcXVlc3QoKVwiPlJlc2V0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwvZm9ybT5cclxuIl19
|