tango-app-ui-manage-settings 3.3.0-beta.6 → 3.3.0-beta.7

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.
@@ -113,7 +113,7 @@ export class BillingGroupFormComponent {
113
113
  po: [po ? po : ''],
114
114
  stores: [stores ? stores : []],
115
115
  proRata: [proRata ? proRata : 'before15'],
116
- paymentCategory: [paymentCategory ? paymentCategory : 'pre'],
116
+ paymentCategory: [paymentCategory ? paymentCategory : 'post'],
117
117
  currency: [currency ? currency : 'dollar'],
118
118
  isInstallationOneTime: [isInstallationOneTime ? isInstallationOneTime : false],
119
119
  installationFee: [{ value: installationFee ? installationFee : '', disabled: true }],
@@ -144,7 +144,7 @@ export class BillingGroupFormComponent {
144
144
  po: [''],
145
145
  stores: [[]],
146
146
  proRata: ['before15'],
147
- paymentCategory: ['pre'],
147
+ paymentCategory: ['post'],
148
148
  currency: ['dollar'],
149
149
  isInstallationOneTime: [false],
150
150
  installationFee: [{ value: '', disabled: true }],
@@ -443,11 +443,11 @@ export class BillingGroupFormComponent {
443
443
  event.preventDefault();
444
444
  }
445
445
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BillingGroupFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.PaymentSubscriptionService }, { token: i3.NgbModal }, { token: i3.NgbActiveModal }, { token: i4.ToastService }], target: i0.ɵɵFactoryTarget.Component });
446
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: BillingGroupFormComponent, selector: "lib-billing-group-form", inputs: { clientId: "clientId", groupId: "groupId", currentTab: "currentTab" }, viewQueries: [{ propertyName: "accordion", first: true, predicate: NgbAccordionDirective, descendants: true }], ngImport: i0, template: "<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n 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 <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Store', value:'store'}, {label:'GST', value:'gst'}]\"\r\n [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"after15\" value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Payment Category</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"pre\" value=\"pre\">\r\n <label class=\"form-check-label me-2\" for=\"pre\">\r\n Pre paid\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"post\" value=\"post\">\r\n <label class=\"form-check-label me-2\" for=\"post\">\r\n Post paid\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Dollar', value:'dollar'}, {label:'INR', value:'inr'}]\"\r\n [label]=\"'Currency'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('currency')?.touched || submitted) && group.get('currency')?.hasError('required')\">\r\n Currency is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isInstallationOneTime\"\r\n formControlName=\"isInstallationOneTime\"\r\n (change)=\"group.get('isInstallationOneTime')?.value ? group.get('installationFee')?.enable() : group.get('installationFee')?.disable()\">\r\n </div>\r\n <label class=\"form-check-label me-5\" for=\"isInstallationOneTime\">Installation fee (one\r\n time )</label>\r\n </div>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"number\" class=\"form-control\" id=\"installationFee\"\r\n formControlName=\"installationFee\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('installationFee')?.invalid ) && (group.get('installationFee')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('installationFee')?.touched || submitted) && group.get('installationFee')?.hasError('required')\">\r\n Installation fee is required.\r\n </small> -->\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"[{label:'Monthly', value:'monthly'}, {label:'Quarterly', value:'quarter'}, {label:'Half yearly', value:'halfYearly'}, {label:'Yearly', value:'yearly'}, ]\"\r\n [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentCycle')?.touched || submitted) && group.get('paymentCycle')?.hasError('paymentCycle')\">\r\n Payment cycle is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'30', value:30}, {label:'45', value:45}, {label:'60', value:60}, {label:'90', value:90}]\"\r\n [label]=\"'Payment Term'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentTerm')?.touched || submitted) && group.get('paymentTerm')?.hasError('required')\">\r\n Payment term is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\" id=\"after15\"\r\n value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Payment Category</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"pre\" value=\"pre\">\r\n <label class=\"form-check-label me-2\" for=\"pre\">\r\n Pre paid\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"post\" value=\"post\">\r\n <label class=\"form-check-label me-2\" for=\"post\">\r\n Post paid\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Dollar', value:'dollar'}, {label:'INR', value:'inr'}]\"\r\n [label]=\"'Currency'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('currency')?.touched || submitted) && group.get('currency')?.hasError('required')\">\r\n Currency is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isInstallationOneTime\"\r\n formControlName=\"isInstallationOneTime\"\r\n (change)=\"group.get('isInstallationOneTime')?.value ? group.get('installationFee')?.enable() : group.get('installationFee')?.disable()\">\r\n </div>\r\n <label class=\"form-check-label me-5\" for=\"isInstallationOneTime\">Installation fee (one\r\n time )</label>\r\n </div>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"number\" class=\"form-control\" id=\"installationFee\"\r\n formControlName=\"installationFee\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('installationFee')?.invalid ) && (group.get('installationFee')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('installationFee')?.touched || submitted) && group.get('installationFee')?.hasError('required')\">\r\n Installation fee is required.\r\n </small> -->\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Monthly', value:'monthly'}, {label:'Quarterly', value:'quarter'}, {label:'Half yearly', value:'halfYearly'}, {label:'Yearly', value:'yearly'}, ]\"\r\n [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentCycle')?.touched || submitted) && group.get('paymentCycle')?.hasError('paymentCycle')\">\r\n Payment cycle is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Term 30', value:30}, {label:'Term 45', value:45}, {label:'Term 60', value:60}, {label:'Term 90', value:90}]\"\r\n [label]=\"'Payment Term'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentTerm')?.touched || submitted) && group.get('paymentTerm')?.hasError('required')\">\r\n Payment term is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>", styles: [":host{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i3.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i3.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i3.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i3.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i3.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { 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.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i4.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
446
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: BillingGroupFormComponent, selector: "lib-billing-group-form", inputs: { clientId: "clientId", groupId: "groupId", currentTab: "currentTab" }, viewQueries: [{ propertyName: "accordion", first: true, predicate: NgbAccordionDirective, descendants: true }], ngImport: i0, template: "<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n 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 <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Store', value:'store'}, {label:'GST', value:'gst'}]\"\r\n [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"after15\" value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Payment Category</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"pre\" value=\"pre\">\r\n <label class=\"form-check-label me-2\" for=\"pre\">\r\n Pre paid\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"post\" value=\"post\">\r\n <label class=\"form-check-label me-2\" for=\"post\">\r\n Post paid\r\n </label>\r\n </div>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Dollar', value:'dollar'}, {label:'INR', value:'inr'}]\"\r\n [label]=\"'Currency'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('currency')?.touched || submitted) && group.get('currency')?.hasError('required')\">\r\n Currency is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isInstallationOneTime\"\r\n formControlName=\"isInstallationOneTime\"\r\n (change)=\"group.get('isInstallationOneTime')?.value ? group.get('installationFee')?.enable() : group.get('installationFee')?.disable()\">\r\n </div>\r\n <label class=\"form-check-label me-5\" for=\"isInstallationOneTime\">Installation fee (one\r\n time )</label>\r\n </div>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"number\" class=\"form-control\" id=\"installationFee\"\r\n formControlName=\"installationFee\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('installationFee')?.invalid ) && (group.get('installationFee')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('installationFee')?.touched || submitted) && group.get('installationFee')?.hasError('required')\">\r\n Installation fee is required.\r\n </small> -->\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"[{label:'Monthly', value:'monthly'}, {label:'Quarterly', value:'quarter'}, {label:'Half yearly', value:'halfYearly'}, {label:'Yearly', value:'yearly'}, ]\"\r\n [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentCycle')?.touched || submitted) && group.get('paymentCycle')?.hasError('paymentCycle')\">\r\n Payment cycle is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'30', value:30}, {label:'45', value:45}, {label:'60', value:60}, {label:'90', value:90}]\"\r\n [label]=\"'Payment Term'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentTerm')?.touched || submitted) && group.get('paymentTerm')?.hasError('required')\">\r\n Payment term is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\" id=\"after15\"\r\n value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Payment Category</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"pre\" value=\"pre\">\r\n <label class=\"form-check-label me-2\" for=\"pre\">\r\n Pre paid\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"post\" value=\"post\">\r\n <label class=\"form-check-label me-2\" for=\"post\">\r\n Post paid\r\n </label>\r\n </div>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Dollar', value:'dollar'}, {label:'INR', value:'inr'}]\"\r\n [label]=\"'Currency'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('currency')?.touched || submitted) && group.get('currency')?.hasError('required')\">\r\n Currency is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isInstallationOneTime\"\r\n formControlName=\"isInstallationOneTime\"\r\n (change)=\"group.get('isInstallationOneTime')?.value ? group.get('installationFee')?.enable() : group.get('installationFee')?.disable()\">\r\n </div>\r\n <label class=\"form-check-label me-5\" for=\"isInstallationOneTime\">Installation fee (one\r\n time )</label>\r\n </div>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"number\" class=\"form-control\" id=\"installationFee\"\r\n formControlName=\"installationFee\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('installationFee')?.invalid ) && (group.get('installationFee')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('installationFee')?.touched || submitted) && group.get('installationFee')?.hasError('required')\">\r\n Installation fee is required.\r\n </small> -->\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Monthly', value:'monthly'}, {label:'Quarterly', value:'quarter'}, {label:'Half yearly', value:'halfYearly'}, {label:'Yearly', value:'yearly'}, ]\"\r\n [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentCycle')?.touched || submitted) && group.get('paymentCycle')?.hasError('paymentCycle')\">\r\n Payment cycle is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Term 30', value:30}, {label:'Term 45', value:45}, {label:'Term 60', value:60}, {label:'Term 90', value:90}]\"\r\n [label]=\"'Payment Term'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentTerm')?.touched || submitted) && group.get('paymentTerm')?.hasError('required')\">\r\n Payment term is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>", styles: [":host{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i3.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i3.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i3.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i3.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i3.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { 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.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["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: "component", type: i4.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: i4.FiltersComponent, selector: "lib-filters", inputs: ["dataObject"], outputs: ["appliedFilters"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
447
447
  }
448
448
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: BillingGroupFormComponent, decorators: [{
449
449
  type: Component,
450
- args: [{ selector: 'lib-billing-group-form', template: "<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n 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 <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Store', value:'store'}, {label:'GST', value:'gst'}]\"\r\n [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"after15\" value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Payment Category</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"pre\" value=\"pre\">\r\n <label class=\"form-check-label me-2\" for=\"pre\">\r\n Pre paid\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"post\" value=\"post\">\r\n <label class=\"form-check-label me-2\" for=\"post\">\r\n Post paid\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Dollar', value:'dollar'}, {label:'INR', value:'inr'}]\"\r\n [label]=\"'Currency'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('currency')?.touched || submitted) && group.get('currency')?.hasError('required')\">\r\n Currency is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isInstallationOneTime\"\r\n formControlName=\"isInstallationOneTime\"\r\n (change)=\"group.get('isInstallationOneTime')?.value ? group.get('installationFee')?.enable() : group.get('installationFee')?.disable()\">\r\n </div>\r\n <label class=\"form-check-label me-5\" for=\"isInstallationOneTime\">Installation fee (one\r\n time )</label>\r\n </div>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"number\" class=\"form-control\" id=\"installationFee\"\r\n formControlName=\"installationFee\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('installationFee')?.invalid ) && (group.get('installationFee')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('installationFee')?.touched || submitted) && group.get('installationFee')?.hasError('required')\">\r\n Installation fee is required.\r\n </small> -->\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"[{label:'Monthly', value:'monthly'}, {label:'Quarterly', value:'quarter'}, {label:'Half yearly', value:'halfYearly'}, {label:'Yearly', value:'yearly'}, ]\"\r\n [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentCycle')?.touched || submitted) && group.get('paymentCycle')?.hasError('paymentCycle')\">\r\n Payment cycle is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'30', value:30}, {label:'45', value:45}, {label:'60', value:60}, {label:'90', value:90}]\"\r\n [label]=\"'Payment Term'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentTerm')?.touched || submitted) && group.get('paymentTerm')?.hasError('required')\">\r\n Payment term is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\" id=\"after15\"\r\n value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Payment Category</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"pre\" value=\"pre\">\r\n <label class=\"form-check-label me-2\" for=\"pre\">\r\n Pre paid\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"post\" value=\"post\">\r\n <label class=\"form-check-label me-2\" for=\"post\">\r\n Post paid\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Dollar', value:'dollar'}, {label:'INR', value:'inr'}]\"\r\n [label]=\"'Currency'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('currency')?.touched || submitted) && group.get('currency')?.hasError('required')\">\r\n Currency is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isInstallationOneTime\"\r\n formControlName=\"isInstallationOneTime\"\r\n (change)=\"group.get('isInstallationOneTime')?.value ? group.get('installationFee')?.enable() : group.get('installationFee')?.disable()\">\r\n </div>\r\n <label class=\"form-check-label me-5\" for=\"isInstallationOneTime\">Installation fee (one\r\n time )</label>\r\n </div>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"number\" class=\"form-control\" id=\"installationFee\"\r\n formControlName=\"installationFee\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('installationFee')?.invalid ) && (group.get('installationFee')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('installationFee')?.touched || submitted) && group.get('installationFee')?.hasError('required')\">\r\n Installation fee is required.\r\n </small> -->\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Monthly', value:'monthly'}, {label:'Quarterly', value:'quarter'}, {label:'Half yearly', value:'halfYearly'}, {label:'Yearly', value:'yearly'}, ]\"\r\n [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentCycle')?.touched || submitted) && group.get('paymentCycle')?.hasError('paymentCycle')\">\r\n Payment cycle is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Term 30', value:30}, {label:'Term 45', value:45}, {label:'Term 60', value:60}, {label:'Term 90', value:90}]\"\r\n [label]=\"'Payment Term'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentTerm')?.touched || submitted) && group.get('paymentTerm')?.hasError('required')\">\r\n Payment term is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>", styles: [":host{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"] }]
450
+ args: [{ selector: 'lib-billing-group-form', template: "<div class=\"d-flex align-items-center justify-content-between mb-5\">\r\n <div class=\"header\">\r\n Update Billing Information\r\n </div>\r\n <div>\r\n <button (click)=\"addBillingGroup()\" type=\"button\" class=\"btn-outline btn align-items-end needhelp\"><span\r\n 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 <path d=\"M10.0013 4.16602V15.8327M4.16797 9.99935H15.8346\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>Add Billing Group</button>\r\n </div>\r\n</div>\r\n\r\n\r\n<form [formGroup]=\"billingForm\">\r\n <div *ngIf=\"billingGroups.length > 1\" formArrayName=\"groups\" ngbAccordion accordion=\"NgbAccordion\"\r\n [closeOthers]=\"true\">\r\n <div *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\"\r\n [ngbAccordionItem]=\"i.toString()\" class=\"mb-5\">\r\n <div class=\"d-flex\" ngbAccordionHeader>\r\n <button type=\"button\" class=\"mainheading p-0\" ngbAccordionButton>\r\n <span class=\"me-2\">{{group.get('groupName')?.value}}</span>\r\n <span *ngIf=\"group.get('isPrimary')?.value\" class=\"primary-badge\">Primary</span>\r\n <span *ngIf=\"!group.get('isPrimary')?.value\" (click)=\"$event.stopPropagation(); onDeleteGroup(i)\"\r\n class=\"cursor-pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935L17.5 4.99935M4.16667 4.99935L4.16667 16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666L15.8333 4.99935L4.16667 4.99935ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602L11.6667 1.66602C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602L8.33333 14.166M11.6667 9.16602V14.166\"\r\n stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <div class=\"divider\"></div>\r\n </button>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody class=\"ps-0 pe-0\">\r\n <!-- [ngClass]=\"group.get('isPrimary')?.value ? 'row-cols-2' : ''\" -->\r\n <div class=\"tab row row-cols-3 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\"\r\n class=\"item\">Basic Info</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'store-selection')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'store-selection' ? 'selected' : ''\"\r\n class=\"item\">Store Selection</div>\r\n </div>\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\"\r\n class=\"item\">Settings</div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"groupName\" class=\"form-label\">Group Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"groupName\"\r\n formControlName=\"groupName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('groupName')?.invalid ) && (group.get('groupName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupName')?.touched || submitted) && group.get('groupName')?.hasError('required')\">\r\n Group name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"groupTag\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Store', value:'store'}, {label:'GST', value:'gst'}]\"\r\n [label]=\"'Group Tag*'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('groupTag')?.touched || submitted) && group.get('groupTag')?.hasError('required')\">\r\n Group tag is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n GST is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\"\r\n formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'store-selection' ? 'd-none' : ''\">\r\n <div class=\"row\">\r\n <div class=\"col-10\">\r\n <div class=\"search-input\">\r\n <span class=\"icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\"\r\n viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M11.5 10L11.43 10.73C12.41 9.59 13 8.11 13 6.5C13 2.91 10.09 0 6.5 0C2.91 0 0 2.91 0 6.5C0 10.09 2.91 13 6.5 13C8.11 13 9.59 12.41 10.73 11.43L10.2762 11.71L16 17.49L17.49 16L11.5 10ZM6.5 11C4.01 11 2 8.99 2 6.5C2 4.01 4.01 2 6.5 2C8.99 2 11 4.01 11 6.5C11 8.99 8.99 11 6.5 11Z\"\r\n fill=\"black\" fill-opacity=\"0.54\" />\r\n </svg>\r\n </span>\r\n <input (keydown.enter)=\"preventEnter($event)\" [formControl]=\"searchInput\" type=\"text\" class=\"form-control ps-14 me-2\"\r\n placeholder=\"Search Store\" autocomplete=\"off\" />\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-2\">\r\n <lib-filters *ngIf=\"filterData.length\" class=\"me-2\" [dataObject]=\"filterData\"\r\n (appliedFilters)=\"applyFilters($event)\"></lib-filters>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loaded'\">\r\n <ng-container *ngIf=\"subscribedStoreList?.length\" >\r\n <div class=\"table-responsive store-table\">\r\n <table class=\"table bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isAllStoresSelectedInGroup(i)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onSelectAllStores($event, i)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <label class=\"form-check-label\" for=\"flexCheckDefault\">\r\n <span>Store Name</span>\r\n </label>\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeName')\"\r\n [ngClass]=\"sortedColumn === 'storeName' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </th>\r\n <th>Store Id\r\n <svg class=\"cursor-pointer\" (click)=\"onSort('storeId')\"\r\n [ngClass]=\"sortedColumn === 'storeId' && sortDirection === 1 ? 'rotate' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\r\n stroke=\"#667085\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </th>\r\n <th>Products</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscribedStoreList\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <input [checked]=\"isStoreSelectedInGroup(i, data?.storeId)\"\r\n [disabled]=\"group.get('isPrimary')?.value\"\r\n (change)=\"onStoreCheck($event, i, data?.storeId)\"\r\n class=\"form-check-input cursor-pointer me-4\" type=\"checkbox\">\r\n <div class=\"store-name\">\r\n {{data?.storeName}}\r\n </div>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"store-id\">ID : {{data?.storeId}}</div>\r\n </td>\r\n\r\n <td>\r\n <div class=\"products\">\r\n <ng-container *ngFor=\"let product of data?.product\">\r\n <span *ngIf=\"product === 'tangoTraffic'\"\r\n class=\"chip me-2 mb-2\">Traffic</span>\r\n <span *ngIf=\"product === 'tangoZone'\"\r\n class=\"chip me-2 mb-2\">Zone</span>\r\n <span *ngIf=\"product === 'tangoTrax'\"\r\n class=\"chip me-2 mb-2\">Trax</span>\r\n </ng-container>\r\n\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"subscribedStoreList.length\" class=\"my-3\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div> \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!subscribedStoreList?.length\" >\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div\r\n class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\"\r\n src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(subscribedStoresApiState | async) === 'loading'\">\r\n <div class=\"shimmer-card w-100\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"after15\" value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Payment Category</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"pre\" value=\"pre\">\r\n <label class=\"form-check-label me-2\" for=\"pre\">\r\n Pre paid\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"post\" value=\"post\">\r\n <label class=\"form-check-label me-2\" for=\"post\">\r\n Post paid\r\n </label>\r\n </div>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Dollar', value:'dollar'}, {label:'INR', value:'inr'}]\"\r\n [label]=\"'Currency'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('currency')?.touched || submitted) && group.get('currency')?.hasError('required')\">\r\n Currency is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isInstallationOneTime\"\r\n formControlName=\"isInstallationOneTime\"\r\n (change)=\"group.get('isInstallationOneTime')?.value ? group.get('installationFee')?.enable() : group.get('installationFee')?.disable()\">\r\n </div>\r\n <label class=\"form-check-label me-5\" for=\"isInstallationOneTime\">Installation fee (one\r\n time )</label>\r\n </div>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"number\" class=\"form-control\" id=\"installationFee\"\r\n formControlName=\"installationFee\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('installationFee')?.invalid ) && (group.get('installationFee')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('installationFee')?.touched || submitted) && group.get('installationFee')?.hasError('required')\">\r\n Installation fee is required.\r\n </small> -->\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"[{label:'Monthly', value:'monthly'}, {label:'Quarterly', value:'quarter'}, {label:'Half yearly', value:'halfYearly'}, {label:'Yearly', value:'yearly'}, ]\"\r\n [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentCycle')?.touched || submitted) && group.get('paymentCycle')?.hasError('paymentCycle')\">\r\n Payment cycle is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'30', value:30}, {label:'45', value:45}, {label:'60', value:60}, {label:'90', value:90}]\"\r\n [label]=\"'Payment Term'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentTerm')?.touched || submitted) && group.get('paymentTerm')?.hasError('required')\">\r\n Payment term is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"onCancel(i)\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"billingGroups.length === 1\" formArrayName=\"groups\">\r\n <ng-container *ngFor=\"let group of billingGroups.controls; let i = index;\" [formGroupName]=\"i\">\r\n <ng-container>\r\n <div class=\"tab row row-cols-2 g-0 mb-5\">\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'basic-info')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'basic-info' ? 'selected' : ''\" class=\"item\">\r\n Basic\r\n Info</div>\r\n </div>\r\n\r\n <div class=\"col\">\r\n <div (click)=\"onTabChange(i, 'settings')\"\r\n [ngClass]=\"group.get('currentTab')?.value === 'settings' ? 'selected' : ''\" class=\"item\">\r\n Settings\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'basic-info' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"registeredCompanyName\" class=\"form-label\">Registered Company Name*</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"registeredCompanyName\"\r\n formControlName=\"registeredCompanyName\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('registeredCompanyName')?.invalid ) && (group.get('registeredCompanyName')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('registeredCompanyName')?.touched || submitted) && group.get('registeredCompanyName')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"gst\" class=\"form-label\">GST</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"gst\" formControlName=\"gst\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('gst')?.invalid ) && (group.get('gst')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('gst')?.touched || submitted) && group.get('gst')?.hasError('required')\">\r\n Registered company name is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5 sub-header\">\r\n Address Details\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineOne\" class=\"form-label\">Address line 1</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineOne\"\r\n formControlName=\"addressLineOne\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineOne')?.invalid ) && (group.get('addressLineOne')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineOne')?.touched || submitted) && group.get('addressLineOne')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <label for=\"addressLineTwo\" class=\"form-label\">Address line 2</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"addressLineTwo\"\r\n formControlName=\"addressLineTwo\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('addressLineTwo')?.invalid ) && (group.get('addressLineTwo')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('addressLineTwo')?.touched || submitted) && group.get('addressLineTwo')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"city\" class=\"form-label\">City</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('city')?.invalid ) && (group.get('city')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('city')?.touched || submitted) && group.get('city')?.hasError('required')\">\r\n City is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"state\" class=\"form-label\">State/province</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('state')?.invalid ) && (group.get('state')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('state')?.touched || submitted) && group.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"country\" class=\"form-label\">Country</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"country\"\r\n formControlName=\"country\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('country')?.invalid ) && (group.get('country')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('country')?.touched || submitted) && group.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"pinCode\" class=\"form-label\">Pin code</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" (keypress)=\"omit_special_char($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"pinCode\"\r\n formControlName=\"pinCode\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('pinCode')?.invalid ) && (group.get('pinCode')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('pinCode')?.touched || submitted) && group.get('pinCode')?.hasError('required')\">\r\n Pin code is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"placeOfSupply\" class=\"form-label\">Place of Supply</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"placeOfSupply\"\r\n formControlName=\"placeOfSupply\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('placeOfSupply')?.invalid ) && (group.get('placeOfSupply')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('placeOfSupply')?.touched || submitted) && group.get('placeOfSupply')?.hasError('required')\">\r\n Place of supply is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <label for=\"po\" class=\"form-label\">PO</label>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"text\" class=\"form-control\" id=\"po\" formControlName=\"po\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('po')?.invalid ) && (group.get('po')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('po')?.touched || submitted) && group.get('po')?.hasError('required')\">\r\n Purchase order is required.\r\n </small>\r\n </div>\r\n </div>\r\n\r\n <div [ngClass]=\"group.get('currentTab')?.value !== 'settings' ? 'd-none' : ''\" class=\"row\">\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Pricing Methods (Pro Rata)</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"before15\" value=\"before15\">\r\n <label class=\"form-check-label me-2\" for=\"before15\">\r\n Before 15th of Month\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"proRata\" class=\"form-check-input me-2\" type=\"radio\" id=\"after15\"\r\n value=\"after15\">\r\n <label class=\"form-check-label me-2\" for=\"after15\">\r\n After 15th of Month\r\n </label>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Payment Category</label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"pre\" value=\"pre\">\r\n <label class=\"form-check-label me-2\" for=\"pre\">\r\n Pre paid\r\n </label>\r\n </div>\r\n <div class=\"col-12 mb-5\">\r\n <input formControlName=\"paymentCategory\" class=\"form-check-input me-2\" type=\"radio\"\r\n id=\"post\" value=\"post\">\r\n <label class=\"form-check-label me-2\" for=\"post\">\r\n Post paid\r\n </label>\r\n </div>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"currency\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Dollar', value:'dollar'}, {label:'INR', value:'inr'}]\"\r\n [label]=\"'Currency'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('currency')?.touched || submitted) && group.get('currency')?.hasError('required')\">\r\n Currency is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <!-- <div class=\"d-flex align-items-center mb-2\">\r\n <div class=\"form-check form-switch\">\r\n <input class=\"form-check-input\" type=\"checkbox\" id=\"isInstallationOneTime\"\r\n formControlName=\"isInstallationOneTime\"\r\n (change)=\"group.get('isInstallationOneTime')?.value ? group.get('installationFee')?.enable() : group.get('installationFee')?.disable()\">\r\n </div>\r\n <label class=\"form-check-label me-5\" for=\"isInstallationOneTime\">Installation fee (one\r\n time )</label>\r\n </div>\r\n <input (keydown.enter)=\"preventEnter($event)\" autocomplete=\"off\" type=\"number\" class=\"form-control\" id=\"installationFee\"\r\n formControlName=\"installationFee\"\r\n [ngClass]=\"{ 'is-invalid':(group.get('installationFee')?.invalid ) && (group.get('installationFee')?.touched || submitted)}\">\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('installationFee')?.touched || submitted) && group.get('installationFee')?.hasError('required')\">\r\n Installation fee is required.\r\n </small> -->\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentCycle\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Monthly', value:'monthly'}, {label:'Quarterly', value:'quarter'}, {label:'Half yearly', value:'halfYearly'}, {label:'Yearly', value:'yearly'}, ]\"\r\n [label]=\"'Payment Cycle'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentCycle')?.touched || submitted) && group.get('paymentCycle')?.hasError('paymentCycle')\">\r\n Payment cycle is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 mb-5\">\r\n <lib-reactive-select formControlName=\"paymentTerm\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"[{label:'Term 30', value:30}, {label:'Term 45', value:45}, {label:'Term 60', value:60}, {label:'Term 90', value:90}]\"\r\n [label]=\"'Payment Term'\"></lib-reactive-select>\r\n <small class=\"invalid-feedback\"\r\n *ngIf=\"(group.get('paymentTerm')?.touched || submitted) && group.get('paymentTerm')?.hasError('required')\">\r\n Payment term is required.\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 col-xl-12 col-xxl-12 mb-5\">\r\n <label [for]=\"'email' + i\" class=\"form-label\">Generate Invoice To* <span\r\n class=\"alert-required\"></span></label>\r\n <div class=\"outer-container\">\r\n <div class=\"input-container form-control\">\r\n <ng-container *ngFor=\"let email of group.get('generateInvoiceTo')?.value\">\r\n <span class=\"chip\">\r\n <span class=\"me-3\">{{ email }}</span>\r\n <span (click)=\"removeEmailChip(email, i)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\"\r\n viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </ng-container>\r\n <input (keydown.enter)=\"preventEnter($event)\" style=\"min-height: 44px;\" (keydown)=\"onEmailKeyDown($event, i)\" type=\"text\"\r\n id=\"emailValue\">\r\n </div>\r\n </div>\r\n <small class=\"invalid-inp\"\r\n *ngIf=\"(group.get('generateInvoiceTo')?.touched || submitted) && !group.get('generateInvoiceTo')?.value?.length\">\r\n Invoice email is required\r\n </small>\r\n </div>\r\n <div class=\"col-md-12 col-lg-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <label class=\"form-check-label\">Store List Annexure Attached With Invoice</label>\r\n </div>\r\n <div class=\"col-12\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-4\">\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"yes\" [value]=\"true\">\r\n <label class=\"form-check-label me-2\" for=\"yes\">\r\n Yes\r\n </label>\r\n </div>\r\n <div>\r\n <input formControlName=\"attachAnnexure\" class=\"form-check-input me-2\"\r\n type=\"radio\" id=\"no\" [value]=\"false\">\r\n <label class=\"form-check-label me-2\" for=\"no\">\r\n No\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex align-items-end justify-content-end mt-5\">\r\n <span class=\"me-4\">\r\n <button (click)=\"modalRef.close()\" class=\"btn btn-outline w-100\">Cancel</button>\r\n </span>\r\n\r\n <span\r\n *ngIf=\"group.get('currentTab')?.value === 'basic-info' || group.get('currentTab')?.value === 'store-selection'\">\r\n <button (click)=\"navigate(i)\" class=\"btn btn-primary w-100\">Next</button>\r\n </span>\r\n\r\n <span *ngIf=\"group.get('currentTab')?.value === 'settings'\">\r\n <button (click)=\"onSubmit(group.value, i)\" class=\"btn btn-primary w-100\">Save Changes</button>\r\n </span>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n </ng-container>\r\n\r\n</form>", styles: [":host{padding:24px}.header{color:#101828;font-size:18px;font-weight:600;line-height:28px}.tab{border-radius:8px;border:1px solid #F2F4F7;padding:4px}.tab .item{padding:8px 12px;border-radius:6px;color:#667085;font-size:14px;font-weight:500;line-height:20px;text-align:center;cursor:pointer}.tab .selected{border-radius:6px;background:#eaf8ff;padding:8px 12px;color:#009bf3;font-size:14px;font-weight:500;line-height:20px;text-align:center}.primary-badge{padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px}.form-label{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:500!important;line-height:20px}.invalid-feedback,small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.is-invalid{border-radius:8px!important;border:1px solid var(--Error-300, #FDA29B)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;padding-right:calc(1.5em + .75rem)!important;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzIyMDFfMjA5NTApIj4KPHBhdGggZD0iTTcuOTk5NjcgNS4zMzM5OFY4LjAwMDY1TTcuOTk5NjcgMTAuNjY3M0g4LjAwNjM0TTE0LjY2NjMgOC4wMDA2NUMxNC42NjYzIDExLjY4MjYgMTEuNjgxNiAxNC42NjczIDcuOTk5NjcgMTQuNjY3M0M0LjMxNzc4IDE0LjY2NzMgMS4zMzMwMSAxMS42ODI2IDEuMzMzMDEgOC4wMDA2NUMxLjMzMzAxIDQuMzE4NzUgNC4zMTc3OCAxLjMzMzk4IDcuOTk5NjcgMS4zMzM5OEMxMS42ODE2IDEuMzMzOTggMTQuNjY2MyA0LjMxODc1IDE0LjY2NjMgOC4wMDA2NVoiIHN0cm9rZT0iI0YwNDQzOCIgc3Ryb2tlLXdpZHRoPSIxLjMzMzMzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMjAxXzIwOTUwIj4KPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=)!important;background-repeat:no-repeat!important;background-position:right calc(.375em + .1875rem) center!important;background-size:calc(.75em + .375rem) calc(.75em + .375rem)!important}.sub-header{color:var(--Gray-700, #344054);font-size:18px;font-weight:500;line-height:28px}.search-input{position:relative}.search-input .icon{position:absolute;left:18px;top:13px}.search-input input{border-radius:8px;background:#f2f4f7;color:#0000008a;font-size:16px;font-weight:400;border:none}.search-input .form-control:focus{box-shadow:none}.store-table .store-name{color:#009bf3;font-size:14px;font-weight:500;line-height:20px}.store-table .store-id{color:#101828;font-size:14px;font-weight:400;line-height:20px}.store-table .products{display:flex;flex-wrap:wrap}.store-table .products .chip{color:#175cd3;text-align:center;font-size:12px;font-weight:500;line-height:18px;border-radius:16px;background:#eff8ff;padding:2px 8px}.form-check-label{color:#344054;font-size:14px;font-weight:500;line-height:20px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap;border:1px solid #D0D5DD}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.rotate{rotate:180deg;transition:1s}.shimmer-card{overflow:hidden}.btn.btn-primary{padding-bottom:9px!important;padding-top:9px!important}.invalid-inp{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px}\n"] }]
451
451
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.PaymentSubscriptionService }, { type: i3.NgbModal }, { type: i3.NgbActiveModal }, { type: i4.ToastService }], propDecorators: { clientId: [{
452
452
  type: Input
453
453
  }], groupId: [{
@@ -458,4 +458,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImpor
458
458
  type: ViewChild,
459
459
  args: [NgbAccordionDirective]
460
460
  }] } });
461
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1zZXR0aW5ncy9zcmMvbGliL2NvbXBvbmVudHMvcGF5bWVudHMtc3Vic2NyaXB0aW9uL2JpbGxpbmcvYmlsbGluZy1ncm91cC1mb3JtL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL3BheW1lbnRzLXN1YnNjcmlwdGlvbi9iaWxsaW5nL2JpbGxpbmctZ3JvdXAtZm9ybS9iaWxsaW5nLWdyb3VwLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRixPQUFPLEVBQUUscUJBQXFCLEVBQTRCLE1BQU0sNEJBQTRCLENBQUM7QUFDN0YsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0RBQXdELENBQUM7Ozs7Ozs7O0FBU3RHLE1BQU0sT0FBTyx5QkFBeUI7SUE0QmhCO0lBQXlCO0lBQW9EO0lBQStCO0lBQWlDO0lBMUJ4SixRQUFRLENBQU87SUFDZixPQUFPLENBQU87SUFDZCxVQUFVLENBQU87SUFDMUIsV0FBVyxDQUFXO0lBQ3RCLFNBQVMsQ0FBUztJQUNsQixVQUFVLEdBQTBCLEVBQUUsQ0FBQztJQUN2QyxtQkFBbUIsR0FBVSxFQUFF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R0FBRyxFQUFFLEVBQUU7b0JBQ1osSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFO3dCQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUE7d0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLG9DQUFvQyxDQUFDLENBQUE7cUJBQ3hFO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsSUFBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUM7d0JBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7cUJBQ2pEO3lCQUFJO3dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDLENBQUE7cUJBQ2xFO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUE7U0FDSDtJQUVILENBQUM7SUFFRCxRQUFRLENBQUMsR0FBVTtRQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVU7UUFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7dUdBcmVVLHlCQUF5QjsyRkFBekIseUJBQXlCLHlMQWtCekIscUJBQXFCLGdEQ2hDbEMsNjJ5REFzeEJPOzsyRkR4d0JNLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx3QkFBd0I7d01BTXpCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBYzRCLFNBQVM7c0JBQTFDLFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBQYXltZW50U3Vic2NyaXB0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3BheW1lbnQtc3Vic2NyaXB0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOZ2JBY2NvcmRpb25EaXJlY3RpdmUsIE5nYkFjdGl2ZU1vZGFsLCBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgUmVxdWVzdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3JlcXVlc3QtY29uZmlybWF0aW9uL3JlcXVlc3QtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWJpbGxpbmctZ3JvdXAtZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCaWxsaW5nR3JvdXBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBjbGllbnRJZDpzdHJpbmdcclxuICBASW5wdXQoKSBncm91cElkOnN0cmluZ1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRUYWI6c3RyaW5nXHJcbiAgYmlsbGluZ0Zvcm06IEZvcm1Hcm91cFxyXG4gIHN1Ym1pdHRlZDogYm9vbGVhblxyXG4gIGZpbHRlckRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5bXSA9IFtdO1xyXG4gIHN1YnNjcmliZWRTdG9yZUxpc3Q6IGFueVtdID0gW11cclxuICBmaWx0ZXJDb3VudHJpZXM6IGFueVtdID0gW11cclxuICBmaWx0ZXJTdGF0ZXM6IGFueVtdID0gW11cclxuICBmaWx0ZXJDaXRpZXM6IGFueVtdID0gW11cclxuICBzZWFyY2hJbnB1dCA9IG5ldyBGb3JtQ29udHJvbCgnJylcclxuICBzZWFyY2hUZXJtOiBzdHJpbmdcclxuICBzb3J0ZWRDb2x1bW46IHN0cmluZ1xyXG4gIHNvcnREaXJlY3Rpb246IG51bWJlclxyXG4gIHN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8J2luaXRpYWwnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCc+KCdpbml0aWFsJylcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBAVmlld0NoaWxkKE5nYkFjY29yZGlvbkRpcmVjdGl2ZSkgYWNjb3JkaW9uOiBOZ2JBY2NvcmRpb25EaXJlY3RpdmU7XHJcblxyXG5cclxuICAvLyBwYWdpbmF0aW9uIHZhcmlhYmxlc1xyXG4gIGl0ZW1zUGVyUGFnZSA9IDEwXHJcbiAgY3VycmVudFBhZ2UgPSAxXHJcbiAgdG90YWxJdGVtcyA9IDBcclxuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF1cclxuICBwYWdlU2l6ZSA9IDEwXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIHBheW1lbnRTZXJ2aWNlOiBQYXltZW50U3Vic2NyaXB0aW9uU2VydmljZSwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLCBwdWJsaWMgbW9kYWxSZWY6TmdiQWN0aXZlTW9kYWwsIHByaXZhdGUgdG9hc3RTZXJ2aWNlOlRvYXN0U2VydmljZSkge1xyXG4gICAgdGhpcy5jcmVhdGVGb3JtKClcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5nZXRCaWxsaW5nR3JvdXBzKClcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7IGdldEZpbHRlcnM6IHRydWUgfSlcclxuXHJcbiAgICB0aGlzLnNlYXJjaElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkucGlwZShkZWJvdW5jZVRpbWUoMTAwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgodmFsKSA9PiB7XHJcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlYXJjaFRlcm0gPSB2YWxcclxuICAgICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlRm9ybSgpIHtcclxuICAgIHRoaXMuYmlsbGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZ3JvdXBzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRCaWxsaW5nR3JvdXBzKCkge1xyXG4gICAgdGhpcy5wYXltZW50U2VydmljZS5nZXRBbGxCaWxsaW5nR3JvdXBzKHRoaXMuY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKChncm91cDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0Y2hGb3JtSXRlbSh7IC4uLmdyb3VwIH0pXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZih0aGlzLmdyb3VwSWQpe1xyXG4gICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpZHgpPT57XHJcbiAgICAgICAgICAgICAgICBpZihjb250cm9sLmdldCgnX2lkJyk/LnZhbHVlID09PSB0aGlzLmdyb3VwSWQpe1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoaWR4LnRvU3RyaW5nKCkpIFxyXG4gICAgICAgICAgICAgICAgICBpZih0aGlzLmN1cnJlbnRUYWIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRUYWIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gJydcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwSWQgPSAnJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCByZXMuZGF0YS5sZW5ndGggPiAxKXtcclxuICAgICAgICAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShgMGAgKSBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwYXRjaEZvcm1JdGVtKHsgZ3JvdXBOYW1lLCBncm91cFRhZywgcmVnaXN0ZXJlZENvbXBhbnlOYW1lLCBnc3QsIGFkZHJlc3NMaW5lT25lLCBhZGRyZXNzTGluZVR3bywgY2l0eSwgc3RhdGUsIGNvdW50cnksXHJcbiAgICBwaW5Db2RlLCBwbGFjZU9mU3VwcGx5LCBwbywgc3RvcmVzLCBwcm9SYXRhLCBwYXltZW50Q2F0ZWdvcnksIGN1cnJlbmN5LCBpc0luc3RhbGxhdGlvbk9uZVRpbWUsIGluc3RhbGxhdGlvbkZlZSwgcGF5bWVudEN5Y2xlLFxyXG4gICAgcGF5bWVudFRlcm0sIGdlbmVyYXRlSW52b2ljZVRvLCBhdHRhY2hBbm5leHVyZSwgaXNQcmltYXJ5LCBfaWQgfTogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBncm91cE5hbWU6IFtncm91cE5hbWUgPyBncm91cE5hbWUgOiAnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZ3JvdXBUYWc6IFtncm91cFRhZyA/IGdyb3VwVGFnIDogJ3N0b3JlJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgcmVnaXN0ZXJlZENvbXBhbnlOYW1lOiBbcmVnaXN0ZXJlZENvbXBhbnlOYW1lID8gcmVnaXN0ZXJlZENvbXBhbnlOYW1lIDogJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGdzdDogW2dzdCA/IGdzdCA6ICcnXSxcclxuICAgICAgYWRkcmVzc0xpbmVPbmU6IFthZGRyZXNzTGluZU9uZSA/IGFkZHJlc3NMaW5lT25lIDogJyddLFxyXG4gICAgICBhZGRyZXNzTGluZVR3bzogW2FkZHJlc3NMaW5lVHdvID8gYWRkcmVzc0xpbmVUd28gOiAnJ10sXHJcbiAgICAgIGNpdHk6IFtjaXR5ID8gY2l0eSA6ICcnXSxcclxuICAgICAgc3RhdGU6IFtzdGF0ZSA/IHN0YXRlIDogJyddLFxyXG4gICAgICBjb3VudHJ5OiBbY291bnRyeSA/IGNvdW50cnkgOiAnJ10sXHJcbiAgICAgIHBpbkNvZGU6IFtwaW5Db2RlID8gcGluQ29kZSA6ICcnXSxcclxuICAgICAgcGxhY2VPZlN1cHBseTogW3BsYWNlT2ZTdXBwbHkgPyBwbGFjZU9mU3VwcGx5IDogJyddLFxyXG4gICAgICBwbzogW3BvID8gcG8gOiAnJ10sXHJcbiAgICAgIHN0b3JlczogW3N0b3JlcyA/IHN0b3JlcyA6IFtdXSxcclxuICAgICAgcHJvUmF0YTogW3Byb1JhdGEgPyBwcm9SYXRhIDogJ2JlZm9yZTE1J10sXHJcbiAgICAgIHBheW1lbnRDYXRlZ29yeTogW3BheW1lbnRDYXRlZ29yeSA/IHBheW1lbnRDYXRlZ29yeSA6ICdwcmUnXSxcclxuICAgICAgY3VycmVuY3k6IFtjdXJyZW5jeSA/IGN1cnJlbmN5IDogJ2RvbGxhciddLFxyXG4gICAgICBpc0luc3RhbGxhdGlvbk9uZVRpbWU6IFtpc0luc3RhbGxhdGlvbk9uZVRpbWUgPyBpc0luc3RhbGxhdGlvbk9uZVRpbWUgOiBmYWxzZV0sXHJcbiAgICAgIGluc3RhbGxhdGlvbkZlZTogW3sgdmFsdWU6IGluc3RhbGxhdGlvbkZlZSA/IGluc3RhbGxhdGlvbkZlZSA6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgcGF5bWVudEN5Y2xlOiBbcGF5bWVudEN5Y2xlID8gcGF5bWVudEN5Y2xlIDogJ21vbnRobHknXSxcclxuICAgICAgcGF5bWVudFRlcm06IFtwYXltZW50VGVybSA/IHBheW1lbnRUZXJtIDogMzBdLFxyXG4gICAgICBnZW5lcmF0ZUludm9pY2VUbzogW2dlbmVyYXRlSW52b2ljZVRvID8gZ2VuZXJhdGVJbnZvaWNlVG8gOiBbXV0sXHJcbiAgICAgIGF0dGFjaEFubmV4dXJlOiBbYXR0YWNoQW5uZXh1cmUgPyBhdHRhY2hBbm5leHVyZSA6IGZhbHNlXSxcclxuICAgICAgaXNQcmltYXJ5OiBbaXNQcmltYXJ5ID8gaXNQcmltYXJ5IDogZmFsc2VdLFxyXG5cclxuICAgICAgY3VycmVudFRhYjogWydiYXNpYy1pbmZvJ10sXHJcbiAgICAgIGNsaWVudElkOiBbdGhpcy5jbGllbnRJZF0sXHJcbiAgICAgIF9pZDogW19pZF1cclxuXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5wdXNoKGl0ZW0pXHJcblxyXG4gIH1cclxuXHJcbiAgYWRkRm9ybUl0ZW0oeyBpc1ByaW1hcnksIGdyb3VwTmFtZSB9OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgc3RyaW5nPikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBncm91cE5hbWU6IFtncm91cE5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGdyb3VwVGFnOiBbJ3N0b3JlJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgcmVnaXN0ZXJlZENvbXBhbnlOYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGdzdDogWycnXSxcclxuICAgICAgYWRkcmVzc0xpbmVPbmU6IFsnJ10sXHJcbiAgICAgIGFkZHJlc3NMaW5lVHdvOiBbJyddLFxyXG4gICAgICBjaXR5OiBbJyddLFxyXG4gICAgICBzdGF0ZTogWycnXSxcclxuICAgICAgY291bnRyeTogWycnXSxcclxuICAgICAgcGluQ29kZTogWycnXSxcclxuICAgICAgcGxhY2VPZlN1cHBseTogWycnXSxcclxuICAgICAgcG86IFsnJ10sXHJcbiAgICAgIHN0b3JlczogW1tdXSxcclxuICAgICAgcHJvUmF0YTogWydiZWZvcmUxNSddLFxyXG4gICAgICBwYXltZW50Q2F0ZWdvcnk6IFsncHJlJ10sXHJcbiAgICAgIGN1cnJlbmN5OiBbJ2RvbGxhciddLFxyXG4gICAgICBpc0luc3RhbGxhdGlvbk9uZVRpbWU6IFtmYWxzZV0sXHJcbiAgICAgIGluc3RhbGxhdGlvbkZlZTogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgcGF5bWVudEN5Y2xlOiBbJ21vbnRobHknXSxcclxuICAgICAgcGF5bWVudFRlcm06IFszMF0sXHJcbiAgICAgIGdlbmVyYXRlSW52b2ljZVRvOiBbW11dLFxyXG4gICAgICBhdHRhY2hBbm5leHVyZTogW2ZhbHNlXSxcclxuICAgICAgaXNQcmltYXJ5OiBbaXNQcmltYXJ5XSxcclxuXHJcbiAgICAgIGN1cnJlbnRUYWI6IFsnYmFzaWMtaW5mbyddLFxyXG4gICAgICBjbGllbnRJZDogW3RoaXMuY2xpZW50SWRdXHJcblxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMucHVzaChpdGVtKVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoYCR7dGhpcy5iaWxsaW5nR3JvdXBzLmxlbmd0aCAtIDF9YCApXHJcbiAgICB9LCAwKTtcclxuICAgIFxyXG5cclxuICB9XHJcblxyXG5cclxuICBnZXQgYmlsbGluZ0dyb3VwcygpIHtcclxuICAgIHJldHVybiB0aGlzLmJpbGxpbmdGb3JtLmdldCgnZ3JvdXBzJykgYXMgRm9ybUFycmF5XHJcbiAgfVxyXG5cclxuICBvblRhYkNoYW5nZShpZHg6IG51bWJlciwgdmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSh2YWwpXHJcbiAgfVxyXG5cclxuICBvbkRlbGV0ZUdyb3VwKGlkeDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUmVxdWVzdENvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJywgc2Nyb2xsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSAnRGVsZXRlIEJpbGxpbmcgR3JvdXAnXHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZ3JvdXAgPydcclxuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ1llcycpIHtcclxuICAgICAgICAgIGlmKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnX2lkJyk/LnZhbHVlKXtcclxuICAgICAgICAgICAgdGhpcy5wYXltZW50U2VydmljZS5kZWxldGVCaWxsaW5nR3JvdXBzKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnX2lkJyk/LnZhbHVlKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChncm91cCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnc3RvcmVzJyk/LnZhbHVlXSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMucmVtb3ZlQXQoaWR4KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChncm91cCA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnc3RvcmVzJyk/LnZhbHVlXSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMucmVtb3ZlQXQoaWR4KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICBnZXRTdWJzY3JpYmVkU3RvcmVzKHsgZ2V0RmlsdGVycyB9OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPikge1xyXG4gICAgdGhpcy5zdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUubmV4dCgnbG9hZGluZycpXHJcbiAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xyXG4gICAgICBcImxpbWl0XCI6IHRoaXMucGFnZVNpemUsXHJcbiAgICAgIFwib2Zmc2V0XCI6IHRoaXMuY3VycmVudFBhZ2UsXHJcbiAgICAgIFwiY2xpZW50SWRcIjogdGhpcy5jbGllbnRJZCxcclxuICAgICAgXCJzb3J0Q29sdW1uXCI6IHRoaXMuc29ydGVkQ29sdW1uLFxyXG4gICAgICBcInNvcnRCeVwiOiB0aGlzLnNvcnREaXJlY3Rpb24sXHJcbiAgICAgIFwic2VhcmNoVmFsdWVcIjogdGhpcy5zZWFyY2hUZXJtLFxyXG4gICAgICBcImNvdW50cnlcIjogdGhpcy5maWx0ZXJDb3VudHJpZXMsXHJcbiAgICAgIFwic3RhdGVcIjogdGhpcy5maWx0ZXJTdGF0ZXMsXHJcbiAgICAgIFwiY2l0eVwiOiB0aGlzLmZpbHRlckNpdGllcyxcclxuICAgICAgXCJnZXRGaWx0ZXJzXCI6IGdldEZpbHRlcnNcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBpZiAoZGF0YVtrZXldID09PSB1bmRlZmluZWQgfHwgZGF0YVtrZXldID09PSAnJykge1xyXG4gICAgICAgICAgZGVsZXRlIGRhdGFba2V5XVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSkge1xyXG4gICAgICAgICAgaWYgKCFkYXRhW2tleV0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhW2tleV1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMucGF5bWVudFNlcnZpY2UuZ2V0U3Vic2NyaWJlZFN0b3JlcyhkYXRhKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlLm5leHQoJ2xvYWRlZCcpXHJcbiAgICAgICAgaWYgKGdldEZpbHRlcnMpIHtcclxuICAgICAgICAgIGlmIChyZXM/LmRhdGE/LmNvdW50cmllcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdDb3VudHJ5JywgSXNzdWVzOiByZXMuZGF0YS5jb3VudHJpZXMubWFwKCh2YWw6IGFueSkgPT4geyByZXR1cm4geyB0ZXh0OiB2YWwuX2lkLCBpZDogdmFsLl9pZCB9IH0pIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzPy5kYXRhPy5zdGF0ZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckRhdGEucHVzaCh7IERlc2NyaXB0aW9uOiAnU3RhdGUnLCBJc3N1ZXM6IHJlcy5kYXRhLnN0YXRlcy5tYXAoKHZhbDogYW55KSA9PiB7IHJldHVybiB7IHRleHQ6IHZhbC5faWQsIGlkOiB2YWwuX2lkIH0gfSkgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZXM/LmRhdGE/LmNpdGllcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdDaXR5JywgSXNzdWVzOiByZXMuZGF0YS5jaXRpZXMubWFwKCh2YWw6IGFueSkgPT4geyByZXR1cm4geyB0ZXh0OiB2YWwuX2lkLCBpZDogdmFsLl9pZCB9IH0pIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXM/LmRhdGE/LnBhZ2VJbmZvPy5jb3VudCkge1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzLmRhdGEucGFnZUluZm8uY291bnRcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5kYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QgPSByZXMuZGF0YS5kYXRhXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdCA9IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGUpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlKTtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBvblN0b3JlQ2hlY2soZXZlbnQ6IGFueSwgZm9ybUFycmF5SW5kZXg6IG51bWJlciwgc3RvcmVJZDogc3RyaW5nKSB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUuaW5jbHVkZXMoc3RvcmVJZCkpIHtcclxuICAgICAgICAgIGl0ZW0uZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5maWx0ZXIoKHZhbDogc3RyaW5nKSA9PiB2YWwgIT09IHN0b3JlSWQpKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIHN0b3JlSWRdKVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZSh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAhPT0gc3RvcmVJZCkpXHJcblxyXG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpZiAoaXRlbS5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSkge1xyXG4gICAgICAgICAgaXRlbS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4uaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgc3RvcmVJZF0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvblNlbGVjdEFsbFN0b3JlcyhldmVudDogYW55LCBmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQgPT09IHRydWUpIHtcclxuICAgICAgY29uc3Qgc3Vic2NyaWJlZFN0b3JlTGlzdCA9IHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5tYXAoaXRlbSA9PiBpdGVtLnN0b3JlSWQpXHJcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKChncm91cCkgPT4ge1xyXG4gICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZvckVhY2goKHN0b3JlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChzdWJzY3JpYmVkU3RvcmVMaXN0LmluY2x1ZGVzKHN0b3JlKSkge1xyXG4gICAgICAgICAgICBncm91cC5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZS5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gc3RvcmUpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLCAuLi5zdWJzY3JpYmVkU3RvcmVMaXN0XSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgIGNvbnN0IHN1YnNjcmliZWRTdG9yZUxpc3QgPSB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QubWFwKGl0ZW0gPT4gaXRlbS5zdG9yZUlkKVxyXG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKChpdGVtOiBhbnkpID0+ICFzdWJzY3JpYmVkU3RvcmVMaXN0LmluY2x1ZGVzKGl0ZW0pKSlcclxuXHJcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XHJcbiAgICAgICAgICBpdGVtLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5pdGVtLmdldCgnc3RvcmVzJyk/LnZhbHVlLCAuLi5zdWJzY3JpYmVkU3RvcmVMaXN0XSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGlzU3RvcmVTZWxlY3RlZEluR3JvdXAoZm9ybUFycmF5SW5kZXg6IG51bWJlciwgc3RvcmVJZDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5pbmNsdWRlcyhzdG9yZUlkKVxyXG4gIH1cclxuXHJcbiAgaXNBbGxTdG9yZXNTZWxlY3RlZEluR3JvdXAoZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5ldmVyeShpdGVtID0+IHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuaW5jbHVkZXMoaXRlbS5zdG9yZUlkKSkgJiYgdGhpcy5zdWJzY3JpYmVkU3RvcmVMaXN0Lmxlbmd0aFxyXG4gIH1cclxuXHJcblxyXG4gIG9uUGFnZUNoYW5nZShldmVudDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gZXZlbnRcclxuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSlcclxuXHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxXHJcbiAgICB0aGlzLnBhZ2VTaXplID0gZXZlbnRcclxuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gZXZlbnRcclxuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSlcclxuICB9XHJcbiAgb21pdF9zcGVjaWFsX2NoYXIoZXZlbnQ6IGFueSkge1xyXG4gICAgdmFyIGs7XHJcbiAgICBrID0gZXZlbnQuY2hhckNvZGU7ICAvLyAgICAgICAgIGsgPSBldmVudC5rZXlDb2RlOyAgKEJvdGggY2FuIGJlIHVzZWQpXHJcbiAgICByZXR1cm4gKGsgPT0gOCB8fCBrID09IDMyIHx8IChrID49IDQ4ICYmIGsgPD0gNTcpKTtcclxuICB9XHJcbiAgYXBwbHlGaWx0ZXJzKGV2ZW50OiBhbnkpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMVxyXG4gICAgZXZlbnQuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHZhbC5EZXNjcmlwdGlvbiA9PT0gJ0NvdW50cnknKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJDb3VudHJpZXMgPSB2YWwuSXNzdWVzLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmlkKVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWwuRGVzY3JpcHRpb24gPT09ICdTdGF0ZScpIHtcclxuICAgICAgICB0aGlzLmZpbHRlclN0YXRlcyA9IHZhbC5Jc3N1ZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbC5EZXNjcmlwdGlvbiA9PT0gJ0NpdHknKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJDaXRpZXMgPSB2YWwuSXNzdWVzLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmlkKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSlcclxuXHJcbiAgfVxyXG5cclxuICBvbkVtYWlsS2V5RG93bihldmVudDogYW55LCBmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgaWYgKGV2ZW50LmNvZGUgPT0gJ0JhY2tzcGFjZScgJiYgZXZlbnQudGFyZ2V0LnZhbHVlID09ICcnKSB7XHJcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy5zZXRWYWx1ZSh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUuc2xpY2UoMCwgLTEpKVxyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50LmNvZGUgPT0gJ0VudGVyJykge1xyXG4gICAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xyXG4gICAgICBjb25zdCB2YWxpZCA9IGVtYWlsUmVnZXgudGVzdChldmVudC50YXJnZXQudmFsdWUpO1xyXG5cclxuICAgICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnNldFZhbHVlKFsuLi50aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUsIGV2ZW50LnRhcmdldC52YWx1ZV0pXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJydcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHJlbW92ZUVtYWlsQ2hpcChlbWFpbDogc3RyaW5nLCBmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8uc2V0VmFsdWUodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAhPT0gZW1haWwpKVxyXG4gIH1cclxuXHJcbiAgb25Tb3J0KGNvbHVtbjogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5zb3J0ZWRDb2x1bW4gPT09IGNvbHVtbikge1xyXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09IDEgPyAtMSA6IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNvcnRlZENvbHVtbiA9IGNvbHVtbjtcclxuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7fSlcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlKGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XHJcbiAgICAgIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nKSB7XHJcbiAgICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ3NldHRpbmdzJylcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycpIHtcclxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc3RvcmUtc2VsZWN0aW9uJylcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbicpIHtcclxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc2V0dGluZ3MnKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRCaWxsaW5nR3JvdXAoKSB7XHJcbiAgICB0aGlzLmFkZEZvcm1JdGVtKHsgZ3JvdXBOYW1lOiBgR3JvdXAgJHt0aGlzLmJpbGxpbmdHcm91cHMubGVuZ3RoICsgMX1gLCBpc1ByaW1hcnk6IGZhbHNlIH0pXHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdChmb3JtVmFsdWVzOiBhbnksIGlkeDpudW1iZXIpIHtcclxuICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZVxyXG4gICAgXHJcbiAgICBpZih0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy5pbnZhbGlkKXtcclxuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdiYXNpYy1pbmZvJylcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBpZighdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZS5sZW5ndGgpe1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBkZWxldGUgZm9ybVZhbHVlcy5jdXJyZW50VGFiXHJcblxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybVZhbHVlcykge1xyXG4gICAgICBpZiAoZm9ybVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgaWYgKGZvcm1WYWx1ZXNba2V5XSA9PT0gdW5kZWZpbmVkIHx8IGZvcm1WYWx1ZXNba2V5XSA9PT0gJycpIHtcclxuICAgICAgICAgIGRlbGV0ZSBmb3JtVmFsdWVzW2tleV1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZm9ybVZhbHVlcy5faWQpIHtcclxuICAgICAgdGhpcy5wYXltZW50U2VydmljZS51cGRhdGVCaWxsaW5nR3JvdXBzKGZvcm1WYWx1ZXMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGFsUmVmLmNsb3NlKClcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KCdCaWxsaW5nIGdyb3VwIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5JylcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT57ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgIGlmKGVyci5lcnJvci5jb2RlID09PSA0MDApe1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVyci5lcnJvci5lcnJvcilcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gdXBkYXRlIGJpbGxpbmcgZ3JvdXAnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGF5bWVudFNlcnZpY2UuY3JlYXRlQmlsbGluZ0dyb3Vwcyhmb3JtVmFsdWVzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LmRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbFJlZi5jbG9zZSgpXHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdCgnQmlsbGluZyBncm91cCB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT57ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgIGlmKGVyci5lcnJvci5jb2RlID09PSA0MDApe1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KGVyci5lcnJvci5lcnJvcilcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gdXBkYXRlIGJpbGxpbmcgZ3JvdXAnKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbChpZHg6bnVtYmVyKXsgICAgXHJcbiAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoaWR4LnRvU3RyaW5nKCkpXHJcbiAgfVxyXG5cclxuICBwcmV2ZW50RW50ZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuXHJcblxyXG5cclxuIiwiPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItNVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxyXG4gICAgICAgIFVwZGF0ZSBCaWxsaW5nIEluZm9ybWF0aW9uXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkQmlsbGluZ0dyb3VwKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIG5lZWRoZWxwXCI+PHNwYW5cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC4wMDEzIDQuMTY2MDJWMTUuODMyN000LjE2Nzk3IDkuOTk5MzVIMTUuODM0NlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+QWRkIEJpbGxpbmcgR3JvdXA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG48Zm9ybSBbZm9ybUdyb3VwXT1cImJpbGxpbmdGb3JtXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiYmlsbGluZ0dyb3Vwcy5sZW5ndGggPiAxXCIgZm9ybUFycmF5TmFtZT1cImdyb3Vwc1wiIG5nYkFjY29yZGlvbiBhY2NvcmRpb249XCJOZ2JBY2NvcmRpb25cIlxyXG4gICAgICAgIFtjbG9zZU90aGVyc109XCJ0cnVlXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgYmlsbGluZ0dyb3Vwcy5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCJcclxuICAgICAgICAgICAgW25nYkFjY29yZGlvbkl0ZW1dPVwiaS50b1N0cmluZygpXCIgY2xhc3M9XCJtYi01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1haW5oZWFkaW5nIHAtMFwiIG5nYkFjY29yZGlvbkJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj57e2dyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnZhbHVlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiIGNsYXNzPVwicHJpbWFyeS1iYWRnZVwiPlByaW1hcnk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBvbkRlbGV0ZUdyb3VwKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yLjUgNC45OTkzNUg0LjE2NjY3TTQuMTY2NjcgNC45OTkzNUwxNy41IDQuOTk5MzVNNC4xNjY2NyA0Ljk5OTM1TDQuMTY2NjcgMTYuNjY2QzQuMTY2NjcgMTcuMTA4IDQuMzQyMjYgMTcuNTMyIDQuNjU0ODIgMTcuODQ0NUM0Ljk2NzM4IDE4LjE1NzEgNS4zOTEzMSAxOC4zMzI3IDUuODMzMzMgMTguMzMyN0gxNC4xNjY3QzE0LjYwODcgMTguMzMyNyAxNS4wMzI2IDE4LjE1NzEgMTUuMzQ1MiAxNy44NDQ1QzE1LjY1NzcgMTcuNTMyIDE1LjgzMzMgMTcuMTA4IDE1LjgzMzMgMTYuNjY2TDE1LjgzMzMgNC45OTkzNUw0LjE2NjY3IDQuOTk5MzVaTTYuNjY2NjcgNC45OTkzNVYzLjMzMjY4QzYuNjY2NjcgMi44OTA2NSA2Ljg0MjI2IDIuNDY2NzMgNy4xNTQ4MiAyLjE1NDE3QzcuNDY3MzggMS44NDE2MSA3Ljg5MTMxIDEuNjY2MDIgOC4zMzMzMyAxLjY2NjAyTDExLjY2NjcgMS42NjYwMkMxMi4xMDg3IDEuNjY2MDIgMTIuNTMyNiAxLjg0MTYxIDEyLjg0NTIgMi4xNTQxN0MxMy4xNTc3IDIuNDY2NzMgMTMuMzMzMyAyLjg5MDY1IDEzLjMzMzMgMy4zMzI2OFY0Ljk5OTM1TTguMzMzMzMgOS4xNjYwMkw4LjMzMzMzIDE0LjE2Nk0xMS42NjY3IDkuMTY2MDJWMTQuMTY2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5IGNsYXNzPVwicHMtMCBwZS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZSA/ICdyb3ctY29scy0yJyA6ICcnXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYiByb3cgcm93LWNvbHMtMyAgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ2Jhc2ljLWluZm8nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgPyAnc2VsZWN0ZWQnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbVwiPkJhc2ljIEluZm88L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdzdG9yZS1zZWxlY3Rpb24nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJyA/ICdzZWxlY3RlZCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtXCI+U3RvcmUgU2VsZWN0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnc2V0dGluZ3MnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnID8gJ3NlbGVjdGVkJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1cIj5TZXR0aW5nczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ2Jhc2ljLWluZm8nID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdyb3VwTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdyb3VwIE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdyb3VwTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dyb3VwTmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dyb3VwTmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdncm91cE5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBUYWdcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJbe2xhYmVsOidTdG9yZScsIHZhbHVlOidzdG9yZSd9LCB7bGFiZWw6J0dTVCcsIHZhbHVlOidnc3QnfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInR3JvdXAgVGFnKidcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dyb3VwVGFnJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2dyb3VwVGFnJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgdGFnIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJlZ2lzdGVyZWQgQ29tcGFueSBOYW1lKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZCBjb21wYW55IG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ3N0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R1NUPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdzdFwiIGZvcm1Db250cm9sTmFtZT1cImdzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnZ3N0Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3N0Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NUIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNSBzdWItaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIERldGFpbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lT25lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDE8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NMaW5lT25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVUd29cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVUd29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjaXR5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q2l0eTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2l0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnY2l0eScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnY2l0eScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpdHkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdGF0ZS9wcm92aW5jZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3N0YXRlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdzdGF0ZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3N0YXRlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY291bnRyeVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY291bnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY291bnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnY291bnRyeScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2NvdW50cnknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnY291bnRyeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGluQ29kZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpbiBjb2RlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIChrZXlwcmVzcyk9XCJvbWl0X3NwZWNpYWxfY2hhcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGluQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGluQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncGluQ29kZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BpbkNvZGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGluQ29kZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbiBjb2RlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBsYWNlT2ZTdXBwbHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QbGFjZSBvZiBTdXBwbHk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGxhY2VPZlN1cHBseVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGxhY2VPZlN1cHBseVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYWNlIG9mIHN1cHBseSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwb1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBPPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBvXCIgZm9ybUNvbnRyb2xOYW1lPVwicG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BvJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BvJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVyY2hhc2Ugb3JkZXIgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdzdG9yZS1zZWxlY3Rpb24nID8gJ2Qtbm9uZScgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxOCAxOFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS41IDEwTDExLjQzIDEwLjczQzEyLjQxIDkuNTkgMTMgOC4xMSAxMyA2LjVDMTMgMi45MSAxMC4wOSAwIDYuNSAwQzIuOTEgMCAwIDIuOTEgMCA2LjVDMCAxMC4wOSAyLjkxIDEzIDYuNSAxM0M4LjExIDEzIDkuNTkgMTIuNDEgMTAuNzMgMTEuNDNMMTAuMjc2MiAxMS43MUwxNiAxNy40OUwxNy40OSAxNkwxMS41IDEwWk02LjUgMTFDNC4wMSAxMSAyIDguOTkgMiA2LjVDMiA0LjAxIDQuMDEgMiA2LjUgMkM4Ljk5IDIgMTEgNC4wMSAxMSA2LjVDMTEgOC45OSA4Ljk5IDExIDYuNSAxMVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiYmxhY2tcIiBmaWxsLW9wYWNpdHk9XCIwLjU0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIFtmb3JtQ29udHJvbF09XCJzZWFyY2hJbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHMtMTQgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBTdG9yZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWZpbHRlcnMgKm5nSWY9XCJmaWx0ZXJEYXRhLmxlbmd0aFwiIGNsYXNzPVwibWUtMlwiIFtkYXRhT2JqZWN0XT1cImZpbHRlckRhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwbGllZEZpbHRlcnMpPVwiYXBwbHlGaWx0ZXJzKCRldmVudClcIj48L2xpYi1maWx0ZXJzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRlZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJzY3JpYmVkU3RvcmVMaXN0Py5sZW5ndGhcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZSBzdG9yZS10YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGJvdHRvbS1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbY2hlY2tlZF09XCJpc0FsbFN0b3Jlc1NlbGVjdGVkSW5Hcm91cChpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsU3RvcmVzKCRldmVudCwgaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlciBtZS00XCIgdHlwZT1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrRGVmYXVsdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlN0b3JlIE5hbWU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgnc3RvcmVOYW1lJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ3N0b3JlTmFtZScgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U3RvcmUgSWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uU29ydCgnc3RvcmVJZCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNvcnRlZENvbHVtbiA9PT0gJ3N0b3JlSWQnICYmIHNvcnREaXJlY3Rpb24gPT09IDEgPyAncm90YXRlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4wMDAxNiAzLjMzMzM3VjEyLjY2NjdNOC4wMDAxNiAxMi42NjY3TDEyLjY2NjggOC4wMDAwNE04LjAwMDE2IDEyLjY2NjdMMy4zMzM1IDguMDAwMDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Qcm9kdWN0czwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhdGEgb2Ygc3Vic2NyaWJlZFN0b3JlTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbY2hlY2tlZF09XCJpc1N0b3JlU2VsZWN0ZWRJbkdyb3VwKGksIGRhdGE/LnN0b3JlSWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TdG9yZUNoZWNrKCRldmVudCwgaSwgZGF0YT8uc3RvcmVJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlciBtZS00XCIgdHlwZT1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGF0YT8uc3RvcmVOYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlLWlkXCI+SUQgOiB7e2RhdGE/LnN0b3JlSWR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3RzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIGRhdGE/LnByb2R1Y3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1RyYWZmaWMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlRyYWZmaWM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0ID09PSAndGFuZ29ab25lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcCBtZS0yIG1iLTJcIj5ab25lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvVHJheCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoaXAgbWUtMiBtYi0yXCI+VHJheDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3Vic2NyaWJlZFN0b3JlTGlzdC5sZW5ndGhcIiBjbGFzcz1cIm15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJpdGVtc1BlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY3VycmVudFBhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzdWJzY3JpYmVkU3RvcmVMaXN0Py5sZW5ndGhcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyYyB3LTI1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZSB8IGFzeW5jKSA9PT0gJ2xvYWRpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lci1jYXJkIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnc2V0dGluZ3MnID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+UHJpY2luZyBNZXRob2RzIChQcm8gUmF0YSk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYmVmb3JlMTVcIiB2YWx1ZT1cImJlZm9yZTE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImJlZm9yZTE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmUgMTV0aCBvZiBNb250aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYWZ0ZXIxNVwiIHZhbHVlPVwiYWZ0ZXIxNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJhZnRlcjE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZnRlciAxNXRoIG9mIE1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlBheW1lbnQgQ2F0ZWdvcnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudENhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwcmVcIiB2YWx1ZT1cInByZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJwcmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZSBwYWlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50Q2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBvc3RcIiB2YWx1ZT1cInBvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwicG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zdCBwYWlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImN1cnJlbmN5XCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiW3tsYWJlbDonRG9sbGFyJywgdmFsdWU6J2RvbGxhcid9LCB7bGFiZWw6J0lOUicsIHZhbHVlOidpbnInfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ3VycmVuY3knXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjdXJyZW5jeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjdXJyZW5jeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGlkPVwiaXNJbnN0YWxsYXRpb25PbmVUaW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImlzSW5zdGFsbGF0aW9uT25lVGltZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImdyb3VwLmdldCgnaXNJbnN0YWxsYXRpb25PbmVUaW1lJyk/LnZhbHVlID8gZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8uZW5hYmxlKCkgOiBncm91cC5nZXQoJ2luc3RhbGxhdGlvbkZlZScpPy5kaXNhYmxlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTVcIiBmb3I9XCJpc0luc3RhbGxhdGlvbk9uZVRpbWVcIj5JbnN0YWxsYXRpb24gZmVlIChvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSApPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJpbnN0YWxsYXRpb25GZWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImluc3RhbGxhdGlvbkZlZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnaW5zdGFsbGF0aW9uRmVlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnaW5zdGFsbGF0aW9uRmVlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbGF0aW9uIGZlZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50Q3ljbGVcIiBbaWRGaWVsZF09XCIndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIlt7bGFiZWw6J01vbnRobHknLCB2YWx1ZTonbW9udGhseSd9LCB7bGFiZWw6J1F1YXJ0ZXJseScsIHZhbHVlOidxdWFydGVyJ30sIHtsYWJlbDonSGFsZiB5ZWFybHknLCB2YWx1ZTonaGFsZlllYXJseSd9LCB7bGFiZWw6J1llYXJseScsIHZhbHVlOid5ZWFybHknfSwgXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidQYXltZW50IEN5Y2xlJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGF5bWVudEN5Y2xlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BheW1lbnRDeWNsZScpPy5oYXNFcnJvcigncGF5bWVudEN5Y2xlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXltZW50IGN5Y2xlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudFRlcm1cIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJbe2xhYmVsOiczMCcsIHZhbHVlOjMwfSwge2xhYmVsOic0NScsIHZhbHVlOjQ1fSwge2xhYmVsOic2MCcsIHZhbHVlOjYwfSwge2xhYmVsOic5MCcsIHZhbHVlOjkwfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInUGF5bWVudCBUZXJtJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGF5bWVudFRlcm0nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGF5bWVudFRlcm0nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXltZW50IHRlcm0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ2VtYWlsJyArIGlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HZW5lcmF0ZSBJbnZvaWNlIFRvKiA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkXCI+PC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lciBmb3JtLWNvbnRyb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZW1haWwgb2YgZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCI+e3sgZW1haWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cInJlbW92ZUVtYWlsQ2hpcChlbWFpbCwgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDQ0cHg7XCIgKGtleWRvd24pPVwib25FbWFpbEtleURvd24oJGV2ZW50LCBpKVwiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWlucFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvaWNlIGVtYWlsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5TdG9yZSBMaXN0IEFubmV4dXJlIEF0dGFjaGVkIFdpdGggSW52b2ljZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJ5ZXNcIiBbdmFsdWVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInllc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJub1wiIFt2YWx1ZV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cIm5vXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1lbmQganVzdGlmeS1jb250ZW50LWVuZCBtdC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoaSlcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyB8fCBncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzdG9yZS1zZWxlY3Rpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJuYXZpZ2F0ZShpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+TmV4dDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3NldHRpbmdzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25TdWJtaXQoZ3JvdXAudmFsdWUsIGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5TYXZlIENoYW5nZXM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiaWxsaW5nR3JvdXBzLmxlbmd0aCA9PT0gMVwiIGZvcm1BcnJheU5hbWU9XCJncm91cHNcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBiaWxsaW5nR3JvdXBzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWIgcm93IHJvdy1jb2xzLTIgZy0wIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdiYXNpYy1pbmZvJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgPyAnc2VsZWN0ZWQnIDogJydcIiBjbGFzcz1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3NldHRpbmdzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnID8gJ3NlbGVjdGVkJyA6ICcnXCIgY2xhc3M9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdiYXNpYy1pbmZvJyA/ICdkLW5vbmUnIDogJydcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmVnaXN0ZXJlZCBDb21wYW55IE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImdzdFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdTVDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImdzdFwiIGZvcm1Db250cm9sTmFtZT1cImdzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdnc3QnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdnc3QnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3N0Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTUgc3ViLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIERldGFpbHNcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lT25lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDE8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVPbmUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZVR3b1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc0xpbmVUd29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVUd29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2l0eVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNpdHk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2l0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjaXR5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnY2l0eScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2l0eSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RhdGUvcHJvdmluY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3N0YXRlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdzdGF0ZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdzdGF0ZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY291bnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2NvdW50cnknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnY291bnRyeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBpbkNvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaW4gY29kZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIChrZXlwcmVzcyk9XCJvbWl0X3NwZWNpYWxfY2hhcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicGluQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BpbkNvZGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BpbkNvZGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW4gY29kZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBsYWNlT2ZTdXBwbHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QbGFjZSBvZiBTdXBwbHk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwbGFjZU9mU3VwcGx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBsYWNlT2ZTdXBwbHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYWNlIG9mIHN1cHBseSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UE88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwb1wiIGZvcm1Db250cm9sTmFtZT1cInBvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3BvJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwbycpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVyY2hhc2Ugb3JkZXIgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ3NldHRpbmdzJyA/ICdkLW5vbmUnIDogJydcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+UHJpY2luZyBNZXRob2RzIChQcm8gUmF0YSk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicHJvUmF0YVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJiZWZvcmUxNVwiIHZhbHVlPVwiYmVmb3JlMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJiZWZvcmUxNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmUgMTV0aCBvZiBNb250aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIiBpZD1cImFmdGVyMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImFmdGVyMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJhZnRlcjE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIDE1dGggb2YgTW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlBheW1lbnQgQ2F0ZWdvcnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudENhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInByZVwiIHZhbHVlPVwicHJlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwicHJlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZSBwYWlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwb3N0XCIgdmFsdWU9XCJwb3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwicG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3N0IHBhaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIlt7bGFiZWw6J0RvbGxhcicsIHZhbHVlOidkb2xsYXInfSwge2xhYmVsOidJTlInLCB2YWx1ZTonaW5yJ31dXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInQ3VycmVuY3knXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY3VycmVuY3knKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnY3VycmVuY3knKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGlkPVwiaXNJbnN0YWxsYXRpb25PbmVUaW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaXNJbnN0YWxsYXRpb25PbmVUaW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJncm91cC5nZXQoJ2lzSW5zdGFsbGF0aW9uT25lVGltZScpPy52YWx1ZSA/IGdyb3VwLmdldCgnaW5zdGFsbGF0aW9uRmVlJyk/LmVuYWJsZSgpIDogZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8uZGlzYWJsZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtNVwiIGZvcj1cImlzSW5zdGFsbGF0aW9uT25lVGltZVwiPkluc3RhbGxhdGlvbiBmZWUgKG9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgKTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImluc3RhbGxhdGlvbkZlZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpbnN0YWxsYXRpb25GZWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnaW5zdGFsbGF0aW9uRmVlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnaW5zdGFsbGF0aW9uRmVlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2luc3RhbGxhdGlvbkZlZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbGF0aW9uIGZlZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDeWNsZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiW3tsYWJlbDonTW9udGhseScsIHZhbHVlOidtb250aGx5J30sIHtsYWJlbDonUXVhcnRlcmx5JywgdmFsdWU6J3F1YXJ0ZXInfSwge2xhYmVsOidIYWxmIHllYXJseScsIHZhbHVlOidoYWxmWWVhcmx5J30sIHtsYWJlbDonWWVhcmx5JywgdmFsdWU6J3llYXJseSd9LCBdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInUGF5bWVudCBDeWNsZSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwYXltZW50Q3ljbGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGF5bWVudEN5Y2xlJyk/Lmhhc0Vycm9yKCdwYXltZW50Q3ljbGUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bWVudCBjeWNsZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudFRlcm1cIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIlt7bGFiZWw6J1Rlcm0gMzAnLCB2YWx1ZTozMH0sIHtsYWJlbDonVGVybSA0NScsIHZhbHVlOjQ1fSwge2xhYmVsOidUZXJtIDYwJywgdmFsdWU6NjB9LCB7bGFiZWw6J1Rlcm0gOTAnLCB2YWx1ZTo5MH1dXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInUGF5bWVudCBUZXJtJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BheW1lbnRUZXJtJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BheW1lbnRUZXJtJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXltZW50IHRlcm0gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgY29sLXhsLTEyIGNvbC14eGwtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZW1haWwnICsgaVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdlbmVyYXRlIEludm9pY2UgVG8qIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZFwiPjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVtYWlsIG9mIGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj57eyBlbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVFbWFpbENoaXAoZW1haWwsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgc3R5bGU9XCJtaW4taGVpZ2h0OiA0NHB4O1wiIChrZXlkb3duKT1cIm9uRW1haWxLZXlEb3duKCRldmVudCwgaSlcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZW1haWxWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWlucFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiAhZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvaWNlIGVtYWlsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+U3RvcmUgTGlzdCBBbm5leHVyZSBBdHRhY2hlZCBXaXRoIEludm9pY2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiIGlkPVwieWVzXCIgW3ZhbHVlXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInllc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXR0YWNoQW5uZXh1cmVcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJub1wiIFt2YWx1ZV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwibm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibW9kYWxSZWYuY2xvc2UoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nIHx8IGdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGUoaSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMFwiPk5leHQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU3VibWl0KGdyb3VwLnZhbHVlLCBpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG48L2Zvcm0+Il19
461
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlsbGluZy1ncm91cC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1zZXR0aW5ncy9zcmMvbGliL2NvbXBvbmVudHMvcGF5bWVudHMtc3Vic2NyaXB0aW9uL2JpbGxpbmcvYmlsbGluZy1ncm91cC1mb3JtL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL3BheW1lbnRzLXN1YnNjcmlwdGlvbi9iaWxsaW5nL2JpbGxpbmctZ3JvdXAtZm9ybS9iaWxsaW5nLWdyb3VwLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRixPQUFPLEVBQUUscUJBQXFCLEVBQTRCLE1BQU0sNEJBQTRCLENBQUM7QUFDN0YsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0RBQXdELENBQUM7Ozs7Ozs7O0FBU3RHLE1BQU0sT0FBTyx5QkFBeUI7SUE0QmhCO0lBQXlCO0lBQW9EO0lBQStCO0lBQWlDO0lBMUJ4SixRQUFRLENBQU87SUFDZixPQUFPLENBQU87SUFDZCxVQUFVLENBQU87SUFDMUIsV0FBVyxDQUFXO0lBQ3RCLFNBQVMsQ0FBUztJQUNsQixVQUFVLEdBQTBCLEVBQUUsQ0FBQztJQUN2QyxtQkFBbUIsR0FBVSxFQUFF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R0FBRyxFQUFFLEVBQUU7b0JBQ1osSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFO3dCQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUE7d0JBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLG9DQUFvQyxDQUFDLENBQUE7cUJBQ3hFO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsSUFBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUM7d0JBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7cUJBQ2pEO3lCQUFJO3dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDLENBQUE7cUJBQ2xFO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUE7U0FDSDtJQUVILENBQUM7SUFFRCxRQUFRLENBQUMsR0FBVTtRQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVU7UUFDckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7dUdBcmVVLHlCQUF5QjsyRkFBekIseUJBQXlCLHlMQWtCekIscUJBQXFCLGdEQ2hDbEMsKzN5REFzeEJPOzsyRkR4d0JNLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx3QkFBd0I7d01BTXpCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBYzRCLFNBQVM7c0JBQTFDLFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBQYXltZW50U3Vic2NyaXB0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3BheW1lbnQtc3Vic2NyaXB0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIHRha2VVbnRpbCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOZ2JBY2NvcmRpb25EaXJlY3RpdmUsIE5nYkFjdGl2ZU1vZGFsLCBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgUmVxdWVzdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3JlcXVlc3QtY29uZmlybWF0aW9uL3JlcXVlc3QtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWJpbGxpbmctZ3JvdXAtZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2JpbGxpbmctZ3JvdXAtZm9ybS5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCaWxsaW5nR3JvdXBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBjbGllbnRJZDpzdHJpbmdcclxuICBASW5wdXQoKSBncm91cElkOnN0cmluZ1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRUYWI6c3RyaW5nXHJcbiAgYmlsbGluZ0Zvcm06IEZvcm1Hcm91cFxyXG4gIHN1Ym1pdHRlZDogYm9vbGVhblxyXG4gIGZpbHRlckRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5bXSA9IFtdO1xyXG4gIHN1YnNjcmliZWRTdG9yZUxpc3Q6IGFueVtdID0gW11cclxuICBmaWx0ZXJDb3VudHJpZXM6IGFueVtdID0gW11cclxuICBmaWx0ZXJTdGF0ZXM6IGFueVtdID0gW11cclxuICBmaWx0ZXJDaXRpZXM6IGFueVtdID0gW11cclxuICBzZWFyY2hJbnB1dCA9IG5ldyBGb3JtQ29udHJvbCgnJylcclxuICBzZWFyY2hUZXJtOiBzdHJpbmdcclxuICBzb3J0ZWRDb2x1bW46IHN0cmluZ1xyXG4gIHNvcnREaXJlY3Rpb246IG51bWJlclxyXG4gIHN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8J2luaXRpYWwnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCc+KCdpbml0aWFsJylcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuICBAVmlld0NoaWxkKE5nYkFjY29yZGlvbkRpcmVjdGl2ZSkgYWNjb3JkaW9uOiBOZ2JBY2NvcmRpb25EaXJlY3RpdmU7XHJcblxyXG5cclxuICAvLyBwYWdpbmF0aW9uIHZhcmlhYmxlc1xyXG4gIGl0ZW1zUGVyUGFnZSA9IDEwXHJcbiAgY3VycmVudFBhZ2UgPSAxXHJcbiAgdG90YWxJdGVtcyA9IDBcclxuICBwYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCAzMF1cclxuICBwYWdlU2l6ZSA9IDEwXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIHBheW1lbnRTZXJ2aWNlOiBQYXltZW50U3Vic2NyaXB0aW9uU2VydmljZSwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLCBwdWJsaWMgbW9kYWxSZWY6TmdiQWN0aXZlTW9kYWwsIHByaXZhdGUgdG9hc3RTZXJ2aWNlOlRvYXN0U2VydmljZSkge1xyXG4gICAgdGhpcy5jcmVhdGVGb3JtKClcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5nZXRCaWxsaW5nR3JvdXBzKClcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0U3Vic2NyaWJlZFN0b3Jlcyh7IGdldEZpbHRlcnM6IHRydWUgfSlcclxuXHJcbiAgICB0aGlzLnNlYXJjaElucHV0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkucGlwZShkZWJvdW5jZVRpbWUoMTAwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgodmFsKSA9PiB7XHJcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlYXJjaFRlcm0gPSB2YWxcclxuICAgICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlRm9ybSgpIHtcclxuICAgIHRoaXMuYmlsbGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZ3JvdXBzOiB0aGlzLmZiLmFycmF5KFtdKSxcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRCaWxsaW5nR3JvdXBzKCkge1xyXG4gICAgdGhpcy5wYXltZW50U2VydmljZS5nZXRBbGxCaWxsaW5nR3JvdXBzKHRoaXMuY2xpZW50SWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKChncm91cDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0Y2hGb3JtSXRlbSh7IC4uLmdyb3VwIH0pXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZih0aGlzLmdyb3VwSWQpe1xyXG4gICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpZHgpPT57XHJcbiAgICAgICAgICAgICAgICBpZihjb250cm9sLmdldCgnX2lkJyk/LnZhbHVlID09PSB0aGlzLmdyb3VwSWQpe1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUoaWR4LnRvU3RyaW5nKCkpIFxyXG4gICAgICAgICAgICAgICAgICBpZih0aGlzLmN1cnJlbnRUYWIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRUYWIpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gJydcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwSWQgPSAnJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCByZXMuZGF0YS5sZW5ndGggPiAxKXtcclxuICAgICAgICAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShgMGAgKSBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwYXRjaEZvcm1JdGVtKHsgZ3JvdXBOYW1lLCBncm91cFRhZywgcmVnaXN0ZXJlZENvbXBhbnlOYW1lLCBnc3QsIGFkZHJlc3NMaW5lT25lLCBhZGRyZXNzTGluZVR3bywgY2l0eSwgc3RhdGUsIGNvdW50cnksXHJcbiAgICBwaW5Db2RlLCBwbGFjZU9mU3VwcGx5LCBwbywgc3RvcmVzLCBwcm9SYXRhLCBwYXltZW50Q2F0ZWdvcnksIGN1cnJlbmN5LCBpc0luc3RhbGxhdGlvbk9uZVRpbWUsIGluc3RhbGxhdGlvbkZlZSwgcGF5bWVudEN5Y2xlLFxyXG4gICAgcGF5bWVudFRlcm0sIGdlbmVyYXRlSW52b2ljZVRvLCBhdHRhY2hBbm5leHVyZSwgaXNQcmltYXJ5LCBfaWQgfTogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBncm91cE5hbWU6IFtncm91cE5hbWUgPyBncm91cE5hbWUgOiAnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgZ3JvdXBUYWc6IFtncm91cFRhZyA/IGdyb3VwVGFnIDogJ3N0b3JlJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgcmVnaXN0ZXJlZENvbXBhbnlOYW1lOiBbcmVnaXN0ZXJlZENvbXBhbnlOYW1lID8gcmVnaXN0ZXJlZENvbXBhbnlOYW1lIDogJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGdzdDogW2dzdCA/IGdzdCA6ICcnXSxcclxuICAgICAgYWRkcmVzc0xpbmVPbmU6IFthZGRyZXNzTGluZU9uZSA/IGFkZHJlc3NMaW5lT25lIDogJyddLFxyXG4gICAgICBhZGRyZXNzTGluZVR3bzogW2FkZHJlc3NMaW5lVHdvID8gYWRkcmVzc0xpbmVUd28gOiAnJ10sXHJcbiAgICAgIGNpdHk6IFtjaXR5ID8gY2l0eSA6ICcnXSxcclxuICAgICAgc3RhdGU6IFtzdGF0ZSA/IHN0YXRlIDogJyddLFxyXG4gICAgICBjb3VudHJ5OiBbY291bnRyeSA/IGNvdW50cnkgOiAnJ10sXHJcbiAgICAgIHBpbkNvZGU6IFtwaW5Db2RlID8gcGluQ29kZSA6ICcnXSxcclxuICAgICAgcGxhY2VPZlN1cHBseTogW3BsYWNlT2ZTdXBwbHkgPyBwbGFjZU9mU3VwcGx5IDogJyddLFxyXG4gICAgICBwbzogW3BvID8gcG8gOiAnJ10sXHJcbiAgICAgIHN0b3JlczogW3N0b3JlcyA/IHN0b3JlcyA6IFtdXSxcclxuICAgICAgcHJvUmF0YTogW3Byb1JhdGEgPyBwcm9SYXRhIDogJ2JlZm9yZTE1J10sXHJcbiAgICAgIHBheW1lbnRDYXRlZ29yeTogW3BheW1lbnRDYXRlZ29yeSA/IHBheW1lbnRDYXRlZ29yeSA6ICdwb3N0J10sXHJcbiAgICAgIGN1cnJlbmN5OiBbY3VycmVuY3kgPyBjdXJyZW5jeSA6ICdkb2xsYXInXSxcclxuICAgICAgaXNJbnN0YWxsYXRpb25PbmVUaW1lOiBbaXNJbnN0YWxsYXRpb25PbmVUaW1lID8gaXNJbnN0YWxsYXRpb25PbmVUaW1lIDogZmFsc2VdLFxyXG4gICAgICBpbnN0YWxsYXRpb25GZWU6IFt7IHZhbHVlOiBpbnN0YWxsYXRpb25GZWUgPyBpbnN0YWxsYXRpb25GZWUgOiAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgIHBheW1lbnRDeWNsZTogW3BheW1lbnRDeWNsZSA/IHBheW1lbnRDeWNsZSA6ICdtb250aGx5J10sXHJcbiAgICAgIHBheW1lbnRUZXJtOiBbcGF5bWVudFRlcm0gPyBwYXltZW50VGVybSA6IDMwXSxcclxuICAgICAgZ2VuZXJhdGVJbnZvaWNlVG86IFtnZW5lcmF0ZUludm9pY2VUbyA/IGdlbmVyYXRlSW52b2ljZVRvIDogW11dLFxyXG4gICAgICBhdHRhY2hBbm5leHVyZTogW2F0dGFjaEFubmV4dXJlID8gYXR0YWNoQW5uZXh1cmUgOiBmYWxzZV0sXHJcbiAgICAgIGlzUHJpbWFyeTogW2lzUHJpbWFyeSA/IGlzUHJpbWFyeSA6IGZhbHNlXSxcclxuXHJcbiAgICAgIGN1cnJlbnRUYWI6IFsnYmFzaWMtaW5mbyddLFxyXG4gICAgICBjbGllbnRJZDogW3RoaXMuY2xpZW50SWRdLFxyXG4gICAgICBfaWQ6IFtfaWRdXHJcblxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLmJpbGxpbmdHcm91cHMucHVzaChpdGVtKVxyXG5cclxuICB9XHJcblxyXG4gIGFkZEZvcm1JdGVtKHsgaXNQcmltYXJ5LCBncm91cE5hbWUgfTogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZz4pIHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZ3JvdXBOYW1lOiBbZ3JvdXBOYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBncm91cFRhZzogWydzdG9yZScsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHJlZ2lzdGVyZWRDb21wYW55TmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBnc3Q6IFsnJ10sXHJcbiAgICAgIGFkZHJlc3NMaW5lT25lOiBbJyddLFxyXG4gICAgICBhZGRyZXNzTGluZVR3bzogWycnXSxcclxuICAgICAgY2l0eTogWycnXSxcclxuICAgICAgc3RhdGU6IFsnJ10sXHJcbiAgICAgIGNvdW50cnk6IFsnJ10sXHJcbiAgICAgIHBpbkNvZGU6IFsnJ10sXHJcbiAgICAgIHBsYWNlT2ZTdXBwbHk6IFsnJ10sXHJcbiAgICAgIHBvOiBbJyddLFxyXG4gICAgICBzdG9yZXM6IFtbXV0sXHJcbiAgICAgIHByb1JhdGE6IFsnYmVmb3JlMTUnXSxcclxuICAgICAgcGF5bWVudENhdGVnb3J5OiBbJ3Bvc3QnXSxcclxuICAgICAgY3VycmVuY3k6IFsnZG9sbGFyJ10sXHJcbiAgICAgIGlzSW5zdGFsbGF0aW9uT25lVGltZTogW2ZhbHNlXSxcclxuICAgICAgaW5zdGFsbGF0aW9uRmVlOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICBwYXltZW50Q3ljbGU6IFsnbW9udGhseSddLFxyXG4gICAgICBwYXltZW50VGVybTogWzMwXSxcclxuICAgICAgZ2VuZXJhdGVJbnZvaWNlVG86IFtbXV0sXHJcbiAgICAgIGF0dGFjaEFubmV4dXJlOiBbZmFsc2VdLFxyXG4gICAgICBpc1ByaW1hcnk6IFtpc1ByaW1hcnldLFxyXG5cclxuICAgICAgY3VycmVudFRhYjogWydiYXNpYy1pbmZvJ10sXHJcbiAgICAgIGNsaWVudElkOiBbdGhpcy5jbGllbnRJZF1cclxuXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5wdXNoKGl0ZW0pXHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShgJHt0aGlzLmJpbGxpbmdHcm91cHMubGVuZ3RoIC0gMX1gIClcclxuICAgIH0sIDApO1xyXG4gICAgXHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGdldCBiaWxsaW5nR3JvdXBzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYmlsbGluZ0Zvcm0uZ2V0KCdncm91cHMnKSBhcyBGb3JtQXJyYXlcclxuICB9XHJcblxyXG4gIG9uVGFiQ2hhbmdlKGlkeDogbnVtYmVyLCB2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKHZhbClcclxuICB9XHJcblxyXG4gIG9uRGVsZXRlR3JvdXAoaWR4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZXF1ZXN0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdEZWxldGUgQmlsbGluZyBHcm91cCdcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmRlc2NyaXB0aW9uID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBncm91cCA/J1xyXG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICBpZiAocmVzdWx0ID09PSAnWWVzJykge1xyXG4gICAgICAgICAgaWYodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdfaWQnKT8udmFsdWUpe1xyXG4gICAgICAgICAgICB0aGlzLnBheW1lbnRTZXJ2aWNlLmRlbGV0ZUJpbGxpbmdHcm91cHModGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdfaWQnKT8udmFsdWUpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGdyb3VwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5ncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdzdG9yZXMnKT8udmFsdWVdKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5yZW1vdmVBdChpZHgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGdyb3VwID0+IHtcclxuICAgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5ncm91cC5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGlkeCkuZ2V0KCdzdG9yZXMnKT8udmFsdWVdKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5yZW1vdmVBdChpZHgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIGdldFN1YnNjcmliZWRTdG9yZXMoeyBnZXRGaWx0ZXJzIH06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+KSB7XHJcbiAgICB0aGlzLnN1YnNjcmliZWRTdG9yZXNBcGlTdGF0ZS5uZXh0KCdsb2FkaW5nJylcclxuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XHJcbiAgICAgIFwibGltaXRcIjogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgXCJvZmZzZXRcIjogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgXCJjbGllbnRJZFwiOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBcInNvcnRDb2x1bW5cIjogdGhpcy5zb3J0ZWRDb2x1bW4sXHJcbiAgICAgIFwic29ydEJ5XCI6IHRoaXMuc29ydERpcmVjdGlvbixcclxuICAgICAgXCJzZWFyY2hWYWx1ZVwiOiB0aGlzLnNlYXJjaFRlcm0sXHJcbiAgICAgIFwiY291bnRyeVwiOiB0aGlzLmZpbHRlckNvdW50cmllcyxcclxuICAgICAgXCJzdGF0ZVwiOiB0aGlzLmZpbHRlclN0YXRlcyxcclxuICAgICAgXCJjaXR5XCI6IHRoaXMuZmlsdGVyQ2l0aWVzLFxyXG4gICAgICBcImdldEZpbHRlcnNcIjogZ2V0RmlsdGVyc1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcclxuICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGlmIChkYXRhW2tleV0gPT09IHVuZGVmaW5lZCB8fCBkYXRhW2tleV0gPT09ICcnKSB7XHJcbiAgICAgICAgICBkZWxldGUgZGF0YVtrZXldXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2tleV0pKSB7XHJcbiAgICAgICAgICBpZiAoIWRhdGFba2V5XS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdGFba2V5XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5wYXltZW50U2VydmljZS5nZXRTdWJzY3JpYmVkU3RvcmVzKGRhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVkU3RvcmVzQXBpU3RhdGUubmV4dCgnbG9hZGVkJylcclxuICAgICAgICBpZiAoZ2V0RmlsdGVycykge1xyXG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uY291bnRyaWVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhLnB1c2goeyBEZXNjcmlwdGlvbjogJ0NvdW50cnknLCBJc3N1ZXM6IHJlcy5kYXRhLmNvdW50cmllcy5tYXAoKHZhbDogYW55KSA9PiB7IHJldHVybiB7IHRleHQ6IHZhbC5faWQsIGlkOiB2YWwuX2lkIH0gfSkgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZXM/LmRhdGE/LnN0YXRlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YS5wdXNoKHsgRGVzY3JpcHRpb246ICdTdGF0ZScsIElzc3VlczogcmVzLmRhdGEuc3RhdGVzLm1hcCgodmFsOiBhbnkpID0+IHsgcmV0dXJuIHsgdGV4dDogdmFsLl9pZCwgaWQ6IHZhbC5faWQgfSB9KSB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlcz8uZGF0YT8uY2l0aWVzPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhLnB1c2goeyBEZXNjcmlwdGlvbjogJ0NpdHknLCBJc3N1ZXM6IHJlcy5kYXRhLmNpdGllcy5tYXAoKHZhbDogYW55KSA9PiB7IHJldHVybiB7IHRleHQ6IHZhbC5faWQsIGlkOiB2YWwuX2lkIH0gfSkgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8ucGFnZUluZm8/LmNvdW50KSB7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXMuZGF0YS5wYWdlSW5mby5jb3VudFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXM/LmRhdGE/LmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdCA9IHJlcy5kYXRhLmRhdGFcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zdWJzY3JpYmVkU3RvcmVMaXN0ID0gW11cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG5cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG9uU3RvcmVDaGVjayhldmVudDogYW55LCBmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBzdG9yZUlkOiBzdHJpbmcpIHtcclxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuY29udHJvbHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpZiAoaXRlbS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5pbmNsdWRlcyhzdG9yZUlkKSkge1xyXG4gICAgICAgICAgaXRlbS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShpdGVtLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigodmFsOiBzdHJpbmcpID0+IHZhbCAhPT0gc3RvcmVJZCkpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy5zZXRWYWx1ZShbLi4udGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZSwgc3RvcmVJZF0pXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICE9PSBzdG9yZUlkKSlcclxuXHJcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5jb250cm9scy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlKSB7XHJcbiAgICAgICAgICBpdGVtLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKFsuLi5pdGVtLmdldCgnc3RvcmVzJyk/LnZhbHVlLCBzdG9yZUlkXSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsU3RvcmVzKGV2ZW50OiBhbnksIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICBjb25zdCBzdWJzY3JpYmVkU3RvcmVMaXN0ID0gdGhpcy5zdWJzY3JpYmVkU3RvcmVMaXN0Lm1hcChpdGVtID0+IGl0ZW0uc3RvcmVJZClcclxuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goKGdyb3VwKSA9PiB7XHJcbiAgICAgICAgZ3JvdXAuZ2V0KCdzdG9yZXMnKT8udmFsdWUuZm9yRWFjaCgoc3RvcmU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHN1YnNjcmliZWRTdG9yZUxpc3QuaW5jbHVkZXMoc3RvcmUpKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLmdldCgnc3RvcmVzJyk/LnNldFZhbHVlKGdyb3VwLmdldCgnc3RvcmVzJyk/LnZhbHVlLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSBzdG9yZSkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnN1YnNjcmliZWRTdG9yZUxpc3RdKVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgY29uc3Qgc3Vic2NyaWJlZFN0b3JlTGlzdCA9IHRoaXMuc3Vic2NyaWJlZFN0b3JlTGlzdC5tYXAoaXRlbSA9PiBpdGVtLnN0b3JlSWQpXHJcbiAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5maWx0ZXIoKGl0ZW06IGFueSkgPT4gIXN1YnNjcmliZWRTdG9yZUxpc3QuaW5jbHVkZXMoaXRlbSkpKVxyXG5cclxuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmNvbnRyb2xzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcclxuICAgICAgICAgIGl0ZW0uZ2V0KCdzdG9yZXMnKT8uc2V0VmFsdWUoWy4uLml0ZW0uZ2V0KCdzdG9yZXMnKT8udmFsdWUsIC4uLnN1YnNjcmliZWRTdG9yZUxpc3RdKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgaXNTdG9yZVNlbGVjdGVkSW5Hcm91cChmb3JtQXJyYXlJbmRleDogbnVtYmVyLCBzdG9yZUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnc3RvcmVzJyk/LnZhbHVlLmluY2x1ZGVzKHN0b3JlSWQpXHJcbiAgfVxyXG5cclxuICBpc0FsbFN0b3Jlc1NlbGVjdGVkSW5Hcm91cChmb3JtQXJyYXlJbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmVkU3RvcmVMaXN0LmV2ZXJ5KGl0ZW0gPT4gdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ3N0b3JlcycpPy52YWx1ZS5pbmNsdWRlcyhpdGVtLnN0b3JlSWQpKSAmJiB0aGlzLnN1YnNjcmliZWRTdG9yZUxpc3QubGVuZ3RoXHJcbiAgfVxyXG5cclxuXHJcbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBldmVudFxyXG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KVxyXG5cclxuICB9XHJcblxyXG4gIG9uUGFnZVNpemVDaGFuZ2UoZXZlbnQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDFcclxuICAgIHRoaXMucGFnZVNpemUgPSBldmVudFxyXG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBldmVudFxyXG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KVxyXG4gIH1cclxuICBvbWl0X3NwZWNpYWxfY2hhcihldmVudDogYW55KSB7XHJcbiAgICB2YXIgaztcclxuICAgIGsgPSBldmVudC5jaGFyQ29kZTsgIC8vICAgICAgICAgayA9IGV2ZW50LmtleUNvZGU7ICAoQm90aCBjYW4gYmUgdXNlZClcclxuICAgIHJldHVybiAoayA9PSA4IHx8IGsgPT0gMzIgfHwgKGsgPj0gNDggJiYgayA8PSA1NykpO1xyXG4gIH1cclxuICBhcHBseUZpbHRlcnMoZXZlbnQ6IGFueSkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxXHJcbiAgICBldmVudC5mb3JFYWNoKCh2YWw6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodmFsLkRlc2NyaXB0aW9uID09PSAnQ291bnRyeScpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckNvdW50cmllcyA9IHZhbC5Jc3N1ZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQpXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbC5EZXNjcmlwdGlvbiA9PT0gJ1N0YXRlJykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU3RhdGVzID0gdmFsLklzc3Vlcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS5pZClcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsLkRlc2NyaXB0aW9uID09PSAnQ2l0eScpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckNpdGllcyA9IHZhbC5Jc3N1ZXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KVxyXG5cclxuICB9XHJcblxyXG4gIG9uRW1haWxLZXlEb3duKGV2ZW50OiBhbnksIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICBpZiAoZXZlbnQuY29kZSA9PSAnQmFja3NwYWNlJyAmJiBldmVudC50YXJnZXQudmFsdWUgPT0gJycpIHtcclxuICAgICAgdGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnNldFZhbHVlKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZS5zbGljZSgwLCAtMSkpXHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnQuY29kZSA9PSAnRW50ZXInKSB7XHJcbiAgICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Mix9JC87XHJcbiAgICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcblxyXG4gICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8uc2V0VmFsdWUoWy4uLnRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZSwgZXZlbnQudGFyZ2V0LnZhbHVlXSlcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJ1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcmVtb3ZlRW1haWxDaGlwKGVtYWlsOiBzdHJpbmcsIGZvcm1BcnJheUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy5zZXRWYWx1ZSh0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udmFsdWUuZmlsdGVyKCh2YWw6IHN0cmluZykgPT4gdmFsICE9PSBlbWFpbCkpXHJcbiAgfVxyXG5cclxuICBvblNvcnQoY29sdW1uOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtbiA9PT0gY29sdW1uKSB7XHJcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IHRoaXMuc29ydERpcmVjdGlvbiA9PT0gMSA/IC0xIDogMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uID0gY29sdW1uO1xyXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZXRTdWJzY3JpYmVkU3RvcmVzKHt9KVxyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGUoZm9ybUFycmF5SW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWUpIHtcclxuICAgICAgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycpIHtcclxuICAgICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoZm9ybUFycmF5SW5kZXgpLmdldCgnY3VycmVudFRhYicpPy5zZXRWYWx1ZSgnc2V0dGluZ3MnKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5iaWxsaW5nR3JvdXBzLmF0KGZvcm1BcnJheUluZGV4KS5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJykge1xyXG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdzdG9yZS1zZWxlY3Rpb24nKVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJykge1xyXG4gICAgICAgIHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChmb3JtQXJyYXlJbmRleCkuZ2V0KCdjdXJyZW50VGFiJyk/LnNldFZhbHVlKCdzZXR0aW5ncycpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZEJpbGxpbmdHcm91cCgpIHtcclxuICAgIHRoaXMuYWRkRm9ybUl0ZW0oeyBncm91cE5hbWU6IGBHcm91cCAke3RoaXMuYmlsbGluZ0dyb3Vwcy5sZW5ndGggKyAxfWAsIGlzUHJpbWFyeTogZmFsc2UgfSlcclxuICB9XHJcblxyXG4gIG9uU3VibWl0KGZvcm1WYWx1ZXM6IGFueSwgaWR4Om51bWJlcikge1xyXG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlXHJcbiAgICBcclxuICAgIGlmKHRoaXMuYmlsbGluZ0dyb3Vwcy5hdChpZHgpLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LmludmFsaWQpe1xyXG4gICAgICB0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2N1cnJlbnRUYWInKT8uc2V0VmFsdWUoJ2Jhc2ljLWluZm8nKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIFxyXG5cclxuICAgIGlmKCF0aGlzLmJpbGxpbmdHcm91cHMuYXQoaWR4KS5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlLmxlbmd0aCl7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZSBmb3JtVmFsdWVzLmN1cnJlbnRUYWJcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtVmFsdWVzKSB7XHJcbiAgICAgIGlmIChmb3JtVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBpZiAoZm9ybVZhbHVlc1trZXldID09PSB1bmRlZmluZWQgfHwgZm9ybVZhbHVlc1trZXldID09PSAnJykge1xyXG4gICAgICAgICAgZGVsZXRlIGZvcm1WYWx1ZXNba2V5XVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtVmFsdWVzLl9pZCkge1xyXG4gICAgICB0aGlzLnBheW1lbnRTZXJ2aWNlLnVwZGF0ZUJpbGxpbmdHcm91cHMoZm9ybVZhbHVlcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzPy5kYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kYWxSZWYuY2xvc2UoKVxyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QoJ0JpbGxpbmcgZ3JvdXAgdXBkYXRlZCBzdWNjZXNzZnVsbHknKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PnsgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgaWYoZXJyLmVycm9yLmNvZGUgPT09IDQwMCl7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgYmlsbGluZyBncm91cCcpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYXltZW50U2VydmljZS5jcmVhdGVCaWxsaW5nR3JvdXBzKGZvcm1WYWx1ZXMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcz8uZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGFsUmVmLmNsb3NlKClcclxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KCdCaWxsaW5nIGdyb3VwIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5JylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PnsgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgaWYoZXJyLmVycm9yLmNvZGUgPT09IDQwMCl7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byB1cGRhdGUgYmlsbGluZyBncm91cCcpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKGlkeDpudW1iZXIpeyAgICBcclxuICAgIHRoaXMuYWNjb3JkaW9uLnRvZ2dsZShpZHgudG9TdHJpbmcoKSlcclxuICB9XHJcblxyXG4gIHByZXZlbnRFbnRlcihldmVudDogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG5cclxuXHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi01XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgVXBkYXRlIEJpbGxpbmcgSW5mb3JtYXRpb25cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRCaWxsaW5nR3JvdXAoKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgbmVlZGhlbHBcIj48c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwLjAwMTMgNC4xNjYwMlYxNS44MzI3TTQuMTY3OTcgOS45OTkzNUgxNS44MzQ2XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5BZGQgQmlsbGluZyBHcm91cDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxmb3JtIFtmb3JtR3JvdXBdPVwiYmlsbGluZ0Zvcm1cIj5cclxuICAgIDxkaXYgKm5nSWY9XCJiaWxsaW5nR3JvdXBzLmxlbmd0aCA+IDFcIiBmb3JtQXJyYXlOYW1lPVwiZ3JvdXBzXCIgbmdiQWNjb3JkaW9uIGFjY29yZGlvbj1cIk5nYkFjY29yZGlvblwiXHJcbiAgICAgICAgW2Nsb3NlT3RoZXJzXT1cInRydWVcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBiaWxsaW5nR3JvdXBzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4O1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxyXG4gICAgICAgICAgICBbbmdiQWNjb3JkaW9uSXRlbV09XCJpLnRvU3RyaW5nKClcIiBjbGFzcz1cIm1iLTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWFpbmhlYWRpbmcgcC0wXCIgbmdiQWNjb3JkaW9uQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMlwiPnt7Z3JvdXAuZ2V0KCdncm91cE5hbWUnKT8udmFsdWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlXCIgY2xhc3M9XCJwcmltYXJ5LWJhZGdlXCI+UHJpbWFyeTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IG9uRGVsZXRlR3JvdXAoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIuNSA0Ljk5OTM1SDQuMTY2NjdNNC4xNjY2NyA0Ljk5OTM1TDE3LjUgNC45OTkzNU00LjE2NjY3IDQuOTk5MzVMNC4xNjY2NyAxNi42NjZDNC4xNjY2NyAxNy4xMDggNC4zNDIyNiAxNy41MzIgNC42NTQ4MiAxNy44NDQ1QzQuOTY3MzggMTguMTU3MSA1LjM5MTMxIDE4LjMzMjcgNS44MzMzMyAxOC4zMzI3SDE0LjE2NjdDMTQuNjA4NyAxOC4zMzI3IDE1LjAzMjYgMTguMTU3MSAxNS4zNDUyIDE3Ljg0NDVDMTUuNjU3NyAxNy41MzIgMTUuODMzMyAxNy4xMDggMTUuODMzMyAxNi42NjZMMTUuODMzMyA0Ljk5OTM1TDQuMTY2NjcgNC45OTkzNVpNNi42NjY2NyA0Ljk5OTM1VjMuMzMyNjhDNi42NjY2NyAyLjg5MDY1IDYuODQyMjYgMi40NjY3MyA3LjE1NDgyIDIuMTU0MTdDNy40NjczOCAxLjg0MTYxIDcuODkxMzEgMS42NjYwMiA4LjMzMzMzIDEuNjY2MDJMMTEuNjY2NyAxLjY2NjAyQzEyLjEwODcgMS42NjYwMiAxMi41MzI2IDEuODQxNjEgMTIuODQ1MiAyLjE1NDE3QzEzLjE1NzcgMi40NjY3MyAxMy4zMzMzIDIuODkwNjUgMTMuMzMzMyAzLjMzMjY4VjQuOTk5MzVNOC4zMzMzMyA5LjE2NjAyTDguMzMzMzMgMTQuMTY2TTExLjY2NjcgOS4xNjYwMlYxNC4xNjZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHkgY2xhc3M9XCJwcy0wIHBlLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnaXNQcmltYXJ5Jyk/LnZhbHVlID8gJ3Jvdy1jb2xzLTInIDogJydcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiIHJvdyByb3ctY29scy0zICBnLTAgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnYmFzaWMtaW5mbycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyA/ICdzZWxlY3RlZCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtXCI+QmFzaWMgSW5mbzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ3N0b3JlLXNlbGVjdGlvbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzdG9yZS1zZWxlY3Rpb24nID8gJ3NlbGVjdGVkJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1cIj5TdG9yZSBTZWxlY3Rpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uVGFiQ2hhbmdlKGksICdzZXR0aW5ncycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzZXR0aW5ncycgPyAnc2VsZWN0ZWQnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbVwiPlNldHRpbmdzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnYmFzaWMtaW5mbycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ3JvdXBOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R3JvdXAgTmFtZSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3JvdXBOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJncm91cE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2dyb3VwTmFtZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ3JvdXBOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2dyb3VwTmFtZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJncm91cFRhZ1wiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIlt7bGFiZWw6J1N0b3JlJywgdmFsdWU6J3N0b3JlJ30sIHtsYWJlbDonR1NUJywgdmFsdWU6J2dzdCd9XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidHcm91cCBUYWcqJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ3JvdXBUYWcnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnZ3JvdXBUYWcnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCB0YWcgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UmVnaXN0ZXJlZCBDb21wYW55IE5hbWUqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInJlZ2lzdGVyZWRDb21wYW55TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIGNvbXBhbnkgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJnc3RcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5HU1Q8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3N0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3N0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdnc3QnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdnc3QnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1QgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01IHN1Yi1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVPbmVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZU9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc0xpbmVPbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzTGluZVR3b1wiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkFkZHJlc3MgbGluZSAyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2FkZHJlc3NMaW5lVHdvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5DaXR5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjaXR5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjaXR5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2l0eSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN0YXRlL3Byb3ZpbmNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0YXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnc3RhdGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnc3RhdGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q291bnRyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5Db2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGluIGNvZGU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGluIGNvZGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwbGFjZU9mU3VwcGx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwbGFjZU9mU3VwcGx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugb2Ygc3VwcGx5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UE88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwicG9cIiBmb3JtQ29udHJvbE5hbWU9XCJwb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncG8nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncG8nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJjaGFzZSBvcmRlciBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ3N0b3JlLXNlbGVjdGlvbicgPyAnZC1ub25lJyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE4IDE4XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUgMTBMMTEuNDMgMTAuNzNDMTIuNDEgOS41OSAxMyA4LjExIDEzIDYuNUMxMyAyLjkxIDEwLjA5IDAgNi41IDBDMi45MSAwIDAgMi45MSAwIDYuNUMwIDEwLjA5IDIuOTEgMTMgNi41IDEzQzguMTEgMTMgOS41OSAxMi40MSAxMC43MyAxMS40M0wxMC4yNzYyIDExLjcxTDE2IDE3LjQ5TDE3LjQ5IDE2TDExLjUgMTBaTTYuNSAxMUM0LjAxIDExIDIgOC45OSAyIDYuNUMyIDQuMDEgNC4wMSAyIDYuNSAyQzguOTkgMiAxMSA0LjAxIDExIDYuNUMxMSA4Ljk5IDguOTkgMTEgNi41IDExWlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJibGFja1wiIGZpbGwtb3BhY2l0eT1cIjAuNTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgW2Zvcm1Db250cm9sXT1cInNlYXJjaElucHV0XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFN0b3JlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZmlsdGVycyAqbmdJZj1cImZpbHRlckRhdGEubGVuZ3RoXCIgY2xhc3M9XCJtZS0yXCIgW2RhdGFPYmplY3RdPVwiZmlsdGVyRGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBsaWVkRmlsdGVycyk9XCJhcHBseUZpbHRlcnMoJGV2ZW50KVwiPjwvbGliLWZpbHRlcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGVkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIHN0b3JlLXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImlzQWxsU3RvcmVzU2VsZWN0ZWRJbkdyb3VwKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAuZ2V0KCdpc1ByaW1hcnknKT8udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TZWxlY3RBbGxTdG9yZXMoJGV2ZW50LCBpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyIG1lLTRcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U3RvcmUgTmFtZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZU5hbWUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVOYW1lJyAmJiBzb3J0RGlyZWN0aW9uID09PSAxID8gJ3JvdGF0ZScgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TdG9yZSBJZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwib25Tb3J0KCdzdG9yZUlkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic29ydGVkQ29sdW1uID09PSAnc3RvcmVJZCcgJiYgc29ydERpcmVjdGlvbiA9PT0gMSA/ICdyb3RhdGUnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk04LjAwMDE2IDMuMzMzMzdWMTIuNjY2N004LjAwMDE2IDEyLjY2NjdMMTIuNjY2OCA4LjAwMDA0TTguMDAwMTYgMTIuNjY2N0wzLjMzMzUgOC4wMDAwNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuMzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlByb2R1Y3RzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBzdWJzY3JpYmVkU3RvcmVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImlzU3RvcmVTZWxlY3RlZEluR3JvdXAoaSwgZGF0YT8uc3RvcmVJZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5nZXQoJ2lzUHJpbWFyeScpPy52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblN0b3JlQ2hlY2soJGV2ZW50LCBpLCBkYXRhPy5zdG9yZUlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyIG1lLTRcIiB0eXBlPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZS1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhPy5zdG9yZU5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmUtaWRcIj5JRCA6IHt7ZGF0YT8uc3RvcmVJZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgZGF0YT8ucHJvZHVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicHJvZHVjdCA9PT0gJ3RhbmdvVHJhZmZpYydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoaXAgbWUtMiBtYi0yXCI+VHJhZmZpYzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3QgPT09ICd0YW5nb1pvbmUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGlwIG1lLTIgbWItMlwiPlpvbmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9kdWN0ID09PSAndGFuZ29UcmF4J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hpcCBtZS0yIG1iLTJcIj5UcmF4PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJzY3JpYmVkU3RvcmVMaXN0Lmxlbmd0aFwiIGNsYXNzPVwibXktM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN1YnNjcmliZWRTdG9yZUxpc3Q/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoc3Vic2NyaWJlZFN0b3Jlc0FwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGluZydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyLWNhcmQgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgIT09ICdzZXR0aW5ncycgPyAnZC1ub25lJyA6ICcnXCIgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5QcmljaW5nIE1ldGhvZHMgKFBybyBSYXRhKTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJiZWZvcmUxNVwiIHZhbHVlPVwiYmVmb3JlMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwiYmVmb3JlMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZm9yZSAxNXRoIG9mIE1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhZnRlcjE1XCIgdmFsdWU9XCJhZnRlcjE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImFmdGVyMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIDE1dGggb2YgTW9udGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5QYXltZW50IENhdGVnb3J5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicHJlXCIgdmFsdWU9XCJwcmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwicHJlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmUgcGFpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudENhdGVnb3J5XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwb3N0XCIgdmFsdWU9XCJwb3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInBvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3QgcGFpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY3VycmVuY3lcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJbe2xhYmVsOidEb2xsYXInLCB2YWx1ZTonZG9sbGFyJ30sIHtsYWJlbDonSU5SJywgdmFsdWU6J2lucid9XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDdXJyZW5jeSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2N1cnJlbmN5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ2N1cnJlbmN5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3kgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJpc0luc3RhbGxhdGlvbk9uZVRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaXNJbnN0YWxsYXRpb25PbmVUaW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiZ3JvdXAuZ2V0KCdpc0luc3RhbGxhdGlvbk9uZVRpbWUnKT8udmFsdWUgPyBncm91cC5nZXQoJ2luc3RhbGxhdGlvbkZlZScpPy5lbmFibGUoKSA6IGdyb3VwLmdldCgnaW5zdGFsbGF0aW9uRmVlJyk/LmRpc2FibGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtNVwiIGZvcj1cImlzSW5zdGFsbGF0aW9uT25lVGltZVwiPkluc3RhbGxhdGlvbiBmZWUgKG9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lICk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImluc3RhbGxhdGlvbkZlZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW5zdGFsbGF0aW9uRmVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2luc3RhbGxhdGlvbkZlZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2luc3RhbGxhdGlvbkZlZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsYXRpb24gZmVlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDeWNsZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiW3tsYWJlbDonTW9udGhseScsIHZhbHVlOidtb250aGx5J30sIHtsYWJlbDonUXVhcnRlcmx5JywgdmFsdWU6J3F1YXJ0ZXInfSwge2xhYmVsOidIYWxmIHllYXJseScsIHZhbHVlOidoYWxmWWVhcmx5J30sIHtsYWJlbDonWWVhcmx5JywgdmFsdWU6J3llYXJseSd9LCBdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ1BheW1lbnQgQ3ljbGUnXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwYXltZW50Q3ljbGUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGF5bWVudEN5Y2xlJyk/Lmhhc0Vycm9yKCdwYXltZW50Q3ljbGUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheW1lbnQgY3ljbGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50VGVybVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIlt7bGFiZWw6JzMwJywgdmFsdWU6MzB9LCB7bGFiZWw6JzQ1JywgdmFsdWU6NDV9LCB7bGFiZWw6JzYwJywgdmFsdWU6NjB9LCB7bGFiZWw6JzkwJywgdmFsdWU6OTB9XVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidQYXltZW50IFRlcm0nXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwYXltZW50VGVybScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwYXltZW50VGVybScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheW1lbnQgdGVybSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZW1haWwnICsgaVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkdlbmVyYXRlIEludm9pY2UgVG8qIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWRcIj48L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdXRlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj57eyBlbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwicmVtb3ZlRW1haWxDaGlwKGVtYWlsLCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIHN0eWxlPVwibWluLWhlaWdodDogNDRweDtcIiAoa2V5ZG93bik9XCJvbkVtYWlsS2V5RG93bigkZXZlbnQsIGkpXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlbWFpbFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtaW5wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmICFncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9pY2UgZW1haWwgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlN0b3JlIExpc3QgQW5uZXh1cmUgQXR0YWNoZWQgV2l0aCBJbnZvaWNlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cInllc1wiIFt2YWx1ZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwieWVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImF0dGFjaEFubmV4dXJlXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cIm5vXCIgW3ZhbHVlXT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwibm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWVuZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvbkNhbmNlbChpKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ2Jhc2ljLWluZm8nIHx8IGdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSA9PT0gJ3N0b3JlLXNlbGVjdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5hdmlnYXRlKGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5OZXh0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc2V0dGluZ3MnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvblN1Ym1pdChncm91cC52YWx1ZSwgaSlcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMFwiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJpbGxpbmdHcm91cHMubGVuZ3RoID09PSAxXCIgZm9ybUFycmF5TmFtZT1cImdyb3Vwc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGJpbGxpbmdHcm91cHMuY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYiByb3cgcm93LWNvbHMtMiBnLTAgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25UYWJDaGFuZ2UoaSwgJ2Jhc2ljLWluZm8nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdiYXNpYy1pbmZvJyA/ICdzZWxlY3RlZCcgOiAnJ1wiIGNsYXNzPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm88L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvblRhYkNoYW5nZShpLCAnc2V0dGluZ3MnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzZXR0aW5ncycgPyAnc2VsZWN0ZWQnIDogJydcIiBjbGFzcz1cIml0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImdyb3VwLmdldCgnY3VycmVudFRhYicpPy52YWx1ZSAhPT0gJ2Jhc2ljLWluZm8nID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5SZWdpc3RlcmVkIENvbXBhbnkgTmFtZSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJyZWdpc3RlcmVkQ29tcGFueU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVnaXN0ZXJlZENvbXBhbnlOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncmVnaXN0ZXJlZENvbXBhbnlOYW1lJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3JlZ2lzdGVyZWRDb21wYW55TmFtZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdyZWdpc3RlcmVkQ29tcGFueU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWQgY29tcGFueSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZ3N0XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R1NUPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZ3N0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZ3N0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2dzdCcpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnZ3N0Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ2dzdCcpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdnc3QnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWQgY29tcGFueSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNSBzdWItaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgRGV0YWlsc1xyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc0xpbmVPbmVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5BZGRyZXNzIGxpbmUgMTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImFkZHJlc3NMaW5lT25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NMaW5lT25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2FkZHJlc3NMaW5lT25lJyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZU9uZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NMaW5lVHdvXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+QWRkcmVzcyBsaW5lIDI8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZGRyZXNzTGluZVR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdhZGRyZXNzTGluZVR3bycpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnYWRkcmVzc0xpbmVUd28nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjaXR5XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+Q2l0eTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJjaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2NpdHknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2NpdHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY2l0eScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjaXR5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXR5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdGF0ZS9wcm92aW5jZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0YXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgnc3RhdGUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3N0YXRlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50cnlcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Db3VudHJ5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY291bnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihncm91cC5nZXQoJ2NvdW50cnknKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2NvdW50cnknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnY291bnRyeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHJ5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGluQ29kZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpbiBjb2RlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInByZXZlbnRFbnRlcigkZXZlbnQpXCIgKGtleXByZXNzKT1cIm9taXRfc3BlY2lhbF9jaGFyKCRldmVudClcIiBhdXRvY29tcGxldGU9XCJvZmZcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5Db2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInBpbkNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncGluQ29kZScpPy5pbnZhbGlkICkgJiYgKGdyb3VwLmdldCgncGluQ29kZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdwaW5Db2RlJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BpbkNvZGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpbiBjb2RlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGxhY2VPZlN1cHBseVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBsYWNlIG9mIFN1cHBseTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBsYWNlT2ZTdXBwbHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGxhY2VPZlN1cHBseVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LmludmFsaWQgKSAmJiAoZ3JvdXAuZ2V0KCdwbGFjZU9mU3VwcGx5Jyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BsYWNlT2ZTdXBwbHknKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGxhY2VPZlN1cHBseScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Ugb2Ygc3VwcGx5IGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicG9cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QTzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBvXCIgZm9ybUNvbnRyb2xOYW1lPVwicG9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGdyb3VwLmdldCgncG8nKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BvJyk/LnRvdWNoZWQgfHwgc3VibWl0dGVkKSAmJiBncm91cC5nZXQoJ3BvJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJjaGFzZSBvcmRlciBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlICE9PSAnc2V0dGluZ3MnID8gJ2Qtbm9uZScgOiAnJ1wiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5QcmljaW5nIE1ldGhvZHMgKFBybyBSYXRhKTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9SYXRhXCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTJcIiB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImJlZm9yZTE1XCIgdmFsdWU9XCJiZWZvcmUxNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImJlZm9yZTE1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZm9yZSAxNXRoIG9mIE1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInByb1JhdGFcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJyYWRpb1wiIGlkPVwiYWZ0ZXIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiYWZ0ZXIxNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cImFmdGVyMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIgMTV0aCBvZiBNb250aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5QYXltZW50IENhdGVnb3J5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInBheW1lbnRDYXRlZ29yeVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwcmVcIiB2YWx1ZT1cInByZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInByZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmUgcGFpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50Q2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicG9zdFwiIHZhbHVlPVwicG9zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbWUtMlwiIGZvcj1cInBvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zdCBwYWlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW5jeVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiW3tsYWJlbDonRG9sbGFyJywgdmFsdWU6J2RvbGxhcid9LCB7bGFiZWw6J0lOUicsIHZhbHVlOidpbnInfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDdXJyZW5jeSdcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdjdXJyZW5jeScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdjdXJyZW5jeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3kgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBjb2wtbGctNiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJpc0luc3RhbGxhdGlvbk9uZVRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpc0luc3RhbGxhdGlvbk9uZVRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImdyb3VwLmdldCgnaXNJbnN0YWxsYXRpb25PbmVUaW1lJyk/LnZhbHVlID8gZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8uZW5hYmxlKCkgOiBncm91cC5nZXQoJ2luc3RhbGxhdGlvbkZlZScpPy5kaXNhYmxlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS01XCIgZm9yPVwiaXNJbnN0YWxsYXRpb25PbmVUaW1lXCI+SW5zdGFsbGF0aW9uIGZlZSAob25lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSApPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJwcmV2ZW50RW50ZXIoJGV2ZW50KVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiaW5zdGFsbGF0aW9uRmVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImluc3RhbGxhdGlvbkZlZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8uaW52YWxpZCApICYmIChncm91cC5nZXQoJ2luc3RhbGxhdGlvbkZlZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoZ3JvdXAuZ2V0KCdpbnN0YWxsYXRpb25GZWUnKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgnaW5zdGFsbGF0aW9uRmVlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsYXRpb24gZmVlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy02IG1iLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicGF5bWVudEN5Y2xlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJbe2xhYmVsOidNb250aGx5JywgdmFsdWU6J21vbnRobHknfSwge2xhYmVsOidRdWFydGVybHknLCB2YWx1ZToncXVhcnRlcid9LCB7bGFiZWw6J0hhbGYgeWVhcmx5JywgdmFsdWU6J2hhbGZZZWFybHknfSwge2xhYmVsOidZZWFybHknLCB2YWx1ZToneWVhcmx5J30sIF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidQYXltZW50IEN5Y2xlJ1wiPjwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihncm91cC5nZXQoJ3BheW1lbnRDeWNsZScpPy50b3VjaGVkIHx8IHN1Ym1pdHRlZCkgJiYgZ3JvdXAuZ2V0KCdwYXltZW50Q3ljbGUnKT8uaGFzRXJyb3IoJ3BheW1lbnRDeWNsZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXltZW50IGN5Y2xlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJwYXltZW50VGVybVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFdPVwiW3tsYWJlbDonVGVybSAzMCcsIHZhbHVlOjMwfSwge2xhYmVsOidUZXJtIDQ1JywgdmFsdWU6NDV9LCB7bGFiZWw6J1Rlcm0gNjAnLCB2YWx1ZTo2MH0sIHtsYWJlbDonVGVybSA5MCcsIHZhbHVlOjkwfV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidQYXltZW50IFRlcm0nXCI+PC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgncGF5bWVudFRlcm0nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmIGdyb3VwLmdldCgncGF5bWVudFRlcm0nKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheW1lbnQgdGVybSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBjb2wteGwtMTIgY29sLXh4bC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidlbWFpbCcgKyBpXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+R2VuZXJhdGUgSW52b2ljZSBUbyogPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkXCI+PC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdXRlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXIgZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZW1haWwgb2YgZ3JvdXAuZ2V0KCdnZW5lcmF0ZUludm9pY2VUbycpPy52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtM1wiPnt7IGVtYWlsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cInJlbW92ZUVtYWlsQ2hpcChlbWFpbCwgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwicHJldmVudEVudGVyKCRldmVudClcIiBzdHlsZT1cIm1pbi1oZWlnaHQ6IDQ0cHg7XCIgKGtleWRvd24pPVwib25FbWFpbEtleURvd24oJGV2ZW50LCBpKVwiIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlbWFpbFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImludmFsaWQtaW5wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGdyb3VwLmdldCgnZ2VuZXJhdGVJbnZvaWNlVG8nKT8udG91Y2hlZCB8fCBzdWJtaXR0ZWQpICYmICFncm91cC5nZXQoJ2dlbmVyYXRlSW52b2ljZVRvJyk/LnZhbHVlPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludm9pY2UgZW1haWwgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIGNvbC1sZy0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5TdG9yZSBMaXN0IEFubmV4dXJlIEF0dGFjaGVkIFdpdGggSW52b2ljZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYXR0YWNoQW5uZXh1cmVcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCIgaWQ9XCJ5ZXNcIiBbdmFsdWVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBtZS0yXCIgZm9yPVwieWVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhdHRhY2hBbm5leHVyZVwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiBpZD1cIm5vXCIgW3ZhbHVlXT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1lLTJcIiBmb3I9XCJub1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kIGp1c3RpZnktY29udGVudC1lbmQgbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJtb2RhbFJlZi5jbG9zZSgpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDBcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnYmFzaWMtaW5mbycgfHwgZ3JvdXAuZ2V0KCdjdXJyZW50VGFiJyk/LnZhbHVlID09PSAnc3RvcmUtc2VsZWN0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJuYXZpZ2F0ZShpKVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCI+TmV4dDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJncm91cC5nZXQoJ2N1cnJlbnRUYWInKT8udmFsdWUgPT09ICdzZXR0aW5ncydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25TdWJtaXQoZ3JvdXAudmFsdWUsIGkpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDBcIj5TYXZlIENoYW5nZXM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbjwvZm9ybT4iXX0=