ngx-render-material-forms 2.2.5 → 2.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/add-on-products/add-on-products.component.mjs +31 -6
- package/esm2020/lib/components/datagrid/datagrid.component.mjs +86 -17
- package/fesm2015/ngx-render-material-forms.js +117 -22
- package/fesm2015/ngx-render-material-forms.mjs.map +1 -1
- package/fesm2020/ngx-render-material-forms.js +115 -21
- package/fesm2020/ngx-render-material-forms.mjs.map +1 -1
- package/lib/components/add-on-products/add-on-products.component.d.ts +12 -0
- package/lib/components/datagrid/datagrid.component.d.ts +10 -0
- package/package.json +1 -1
|
@@ -36,7 +36,7 @@ export class AddOnProductsComponent {
|
|
|
36
36
|
this.filteredDropdownThree = [];
|
|
37
37
|
this.filteredDropdownFour = [];
|
|
38
38
|
this.addProductsColumns = ['select', 'productName', 'skuNumber', 'inventory'];
|
|
39
|
-
this.showAllproductsColumns = ['delete', 'productName', 'categoryName', 'subCategory', 'Quantity', 'price', 'skuNumber', 'inventory'];
|
|
39
|
+
this.showAllproductsColumns = ['delete', 'productName', 'categoryName', 'subCategory', 'Quantity', 'price', 'skuNumber', 'inventory', 'cost'];
|
|
40
40
|
this.quantityList = [5, 10, 15, 20, 25];
|
|
41
41
|
this.ELEMENT_DATA = [];
|
|
42
42
|
this.dataSource = new MatTableDataSource();
|
|
@@ -85,6 +85,17 @@ export class AddOnProductsComponent {
|
|
|
85
85
|
this.activeFiltersCount = 0;
|
|
86
86
|
this.emptyImage = '/i/table-grid-empty-state.svg';
|
|
87
87
|
this.getTotalRecords = 0;
|
|
88
|
+
this.priceFieldLable = 'Price';
|
|
89
|
+
this.targetCost = 'Your Target Cost';
|
|
90
|
+
this.showCost = false;
|
|
91
|
+
this.skuTweek = 'SKU Number';
|
|
92
|
+
this.costTweek = 'Your Target Cost';
|
|
93
|
+
this.priceTweek = 'Price';
|
|
94
|
+
this.productTweek = 'Product Name';
|
|
95
|
+
this.quantityTweek = 'Quantity';
|
|
96
|
+
this.categoryTweek = 'Category Name';
|
|
97
|
+
this.subCategoryTweek = 'Sub Category';
|
|
98
|
+
this.inventoryTweek = 'Inventory';
|
|
88
99
|
this.showCategory = data.dropdownsFlag.showDialogCategory;
|
|
89
100
|
this.showSubcategory = data.dropdownsFlag.showDialogSubCategory;
|
|
90
101
|
this.showPrice = data.dropdownsFlag.showDialogPrice;
|
|
@@ -104,6 +115,15 @@ export class AddOnProductsComponent {
|
|
|
104
115
|
this.dropDownCount = this.countTrueDropdowns(data.dropdownsFlag);
|
|
105
116
|
this.selection = new SelectionModel(true, data.selectedProducts || []);
|
|
106
117
|
this.isPriceDisable = data.dropdownsFlag.priceDisable;
|
|
118
|
+
this.skuTweek = data.dropdownsFlag?.skuTweek || "SKU Number";
|
|
119
|
+
this.costTweek = data.dropdownsFlag?.costTweek || "Your Target Cost";
|
|
120
|
+
this.priceTweek = data.dropdownsFlag?.priceTweek || "Price";
|
|
121
|
+
this.productTweek = data.dropdownsFlag?.productTweek || "Product Name";
|
|
122
|
+
this.quantityTweek = data.dropdownsFlag?.quantityTweek || "Quantity";
|
|
123
|
+
this.showCost = data.dropdownsFlag.showDialogCost;
|
|
124
|
+
this.categoryTweek = data.dropdownsFlag?.categoryTweek || "Category Name";
|
|
125
|
+
this.subCategoryTweek = data.dropdownsFlag?.subCategoryTweek || "Sub Category";
|
|
126
|
+
this.inventoryTweek = data.dropdownsFlag?.inventoryTweek || "Inventory";
|
|
107
127
|
if (!this.showCategory) {
|
|
108
128
|
this.removeColumn('categoryName');
|
|
109
129
|
}
|
|
@@ -122,6 +142,9 @@ export class AddOnProductsComponent {
|
|
|
122
142
|
if (!this.showInventory) {
|
|
123
143
|
this.removeColumn('inventory');
|
|
124
144
|
}
|
|
145
|
+
if (!this.showCost) {
|
|
146
|
+
this.removeColumn('skuNumber');
|
|
147
|
+
}
|
|
125
148
|
}
|
|
126
149
|
removeColumn(columnName) {
|
|
127
150
|
this.showAllproductsColumns = this.showAllproductsColumns.filter(column => column !== columnName);
|
|
@@ -142,7 +165,8 @@ export class AddOnProductsComponent {
|
|
|
142
165
|
subCategory: [product?.subCategory || ''],
|
|
143
166
|
value: [product?.value || ''],
|
|
144
167
|
otherInformation0: [product?.otherInformation0 || ''],
|
|
145
|
-
otherInformation1: [product?.otherInformation1 || '']
|
|
168
|
+
otherInformation1: [product?.otherInformation1 || ''],
|
|
169
|
+
otherInformation2: [product?.otherInformation2 || '', Validators.required]
|
|
146
170
|
}));
|
|
147
171
|
});
|
|
148
172
|
selectedProductsArray.controls.forEach(control => {
|
|
@@ -357,7 +381,8 @@ export class AddOnProductsComponent {
|
|
|
357
381
|
subCategory: [product?.subCategory || ''],
|
|
358
382
|
value: [product?.value || ''],
|
|
359
383
|
otherInformation0: [product?.otherInformation0 || ''],
|
|
360
|
-
otherInformation1: [product?.otherInformation1 || '']
|
|
384
|
+
otherInformation1: [product?.otherInformation1 || ''],
|
|
385
|
+
otherInformation2: [product?.otherInformation2 ?? '', this.showCost ? Validators.required : []]
|
|
361
386
|
});
|
|
362
387
|
if (productFormGroup) {
|
|
363
388
|
selectedProductsArray.push(productFormGroup);
|
|
@@ -706,7 +731,7 @@ export class AddOnProductsComponent {
|
|
|
706
731
|
}
|
|
707
732
|
}
|
|
708
733
|
AddOnProductsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: AddOnProductsComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormBuilder }, { token: i1.MatDialog }, { token: i3.CommonService }], target: i0.ɵɵFactoryTarget.Component });
|
|
709
|
-
AddOnProductsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: AddOnProductsComponent, selector: "ngx-mat-add-on-products", viewQueries: [{ propertyName: "firstscrollableDiv", first: true, predicate: ["firstscrollableDiv"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"spinnerFlag\" class=\"OverlayDiv\">\r\n <div class=\"OverlayDivContent\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</div>\r\n<div class=\"mat-dialog-heading\">\r\n <h1 mat-dialog-title>Add Products</h1>\r\n</div>\r\n\r\n<mat-dialog-content [ngClass]=\"dataSource?.data?.length > 0 ? 'products-scroll-visible': ''\">\r\n <div class=\"mat-dialog-content\">\r\n <!--Search Start-->\r\n <div class=\"basic-search\" [hidden]=\"currentPage !== 'select-products'\">\r\n <div class=\"basic-search-wrp\">\r\n <div class=\"search-icon\">\r\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 24 25\" xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(0 0 0)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M11.25 2.75C6.14154 2.75 2 6.89029 2 11.998C2 17.1056 6.14154 21.2459 11.25 21.2459C13.5335 21.2459 15.6238 20.4187 17.2373 19.0475L20.7182 22.5287C21.011 22.8216 21.4859 22.8217 21.7788 22.5288C22.0717 22.2359 22.0718 21.761 21.7789 21.4681L18.2983 17.9872C19.6714 16.3736 20.5 14.2826 20.5 11.998C20.5 6.89029 16.3585 2.75 11.25 2.75ZM3.5 11.998C3.5 7.71905 6.96962 4.25 11.25 4.25C15.5304 4.25 19 7.71905 19 11.998C19 16.2769 15.5304 19.7459 11.25 19.7459C6.96962 19.7459 3.5 16.2769 3.5 11.998Z\" />\r\n </svg>\r\n </div>\r\n <form [formGroup]=\"form\">\r\n <div class=\"input-search\">\r\n <input (keydown.enter)=\"handleDropdownFilter(); $event.stopPropagation()\" type=\"text\" matInput\r\n placeholder=\"Search Product\" formControlName=\"searchProductName\"\r\n (input)=\"clearIfEmpty($event)\">\r\n </div>\r\n </form>\r\n <!-- <div class=\"advfilter\">\r\n <button class=\"adv\" (click)=\"toggleSection();$event.stopPropagation();\">\r\n <mat-icon class=\"material-icons-round\" aria-hidden=\"false\"\r\n aria-label=\"tune\">tune\r\n </mat-icon>\r\n <span *ngIf=\"activeFiltersCount > 0\" class=\"custom-badge\">{{ activeFiltersCount }}</span>\r\n </button>\r\n </div> -->\r\n </div>\r\n <div class=\"search-btn\">\r\n <button mat-raised-button color=\"primary\"\r\n (click)=\"handleDropdownFilter();$event.stopPropagation();\">Search</button>\r\n </div>\r\n </div>\r\n <!--Search End-->\r\n <div class=\"product-selector\">\r\n <div [hidden]=\"currentPage !== 'select-products'\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"product-selection-container\" *ngIf=\"isVisible && dropdownL1\">\r\n <div class=\"dropdown-selection\" *ngIf=\"dropdownL1\">\r\n <div [ngClass]=\"dropDownCount === 1 ? 'no-child': 'child'\">\r\n <div class=\"title-adv\">\r\n <h5>Advanced Filters</h5>\r\n <button class=\"clr-all-picker\" type=\"button\" (click)=\"resetTable()\" *ngIf=\"activeFiltersCount > 0\">Clear All</button>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL1\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL1Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel1\"\r\n [matAutocomplete]=\"auto3\"\r\n (input)=\"onInputChange($event, 'category1')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto3=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category1')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownOne\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel1').value\"\r\n (click)=\"clearField('dropdownLevel1', 'category1', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix>arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL2\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL2Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel2\"\r\n [matAutocomplete]=\"auto4\"\r\n (input)=\"onInputChange($event, 'category2')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto4=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category2')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownTwo\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel2').value\"\r\n (click)=\"clearField('dropdownLevel2', 'category2', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disabled-icon': isDisabled2}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL3\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL3Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel3\"\r\n [matAutocomplete]=\"auto5\"\r\n (input)=\"onInputChange($event, 'category3')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto5=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category3')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownThree\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel3').value\"\r\n (click)=\"clearField('dropdownLevel3', 'category3', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disable-icon': isDisabled3}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL4\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL4Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel4\"\r\n [matAutocomplete]=\"auto6\"\r\n (input)=\"onInputChange($event, 'category4')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto6=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category4')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownFour\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel4').value\"\r\n (click)=\"clearField('dropdownLevel4', 'category4', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disable-icon': isDisabled4}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div #firstscrollableDiv id=\"firstscrollableDiv\" class=\"new-class first-div\"\r\n (scroll)=\"onScroll($event)\" [ngClass]=\"dataSource?.data?.length > 0 ? 'tbl-record-found': ''\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-table abc\"\r\n *ngIf=\"dataSource && dataSource?.data?.length > 0; else noData\">\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? toggleSelection(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"></mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"productName\">\r\n <th mat-header-cell *matHeaderCellDef> Product Name </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.text}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"skuNumber\" *ngIf=\"showSkuNumber\">\r\n <th mat-header-cell *matHeaderCellDef> SKU Number </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.otherInformation0}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"inventory\" *ngIf=\"showInventory\">\r\n <th mat-header-cell *matHeaderCellDef> Inventory </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.otherInformation1}} </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"addProductsColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: addProductsColumns;\"\r\n (click)=\"$event.stopPropagation();toggleSelection(row)\"\r\n [class.selected]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n <ng-template #noData>\r\n <div class=\"no-data-message\">\r\n <!--No data found.-->\r\n <div class=\"pp-empty-state\">\r\n <div class=\"img-empty-state\">\r\n <img [src]=\"emptyImage\" alt=\"\">\r\n </div>\r\n <h3>No records to show at the moment</h3>\r\n <p>Please modify your search criteria to find the desired result</p>\r\n </div>\r\n\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"row-summary\" *ngIf=\"dataSource && dataSource?.data?.length > 0\">\r\n <div>Selected: <strong>{{ getSelectedRowsCount() }}</strong> </div>\r\n <div>Total Records: <strong>{{ getTotalRecords }}</strong></div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div [hidden]=\"currentPage !== 'edit-save'\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"new-class\"\r\n [ngClass]=\"selectedDataSource && selectedDataSource.data.length > 0 ? 'added-products': ''\">\r\n <table mat-table [dataSource]=\"selectedDataSource\"\r\n *ngIf=\"selectedDataSource && selectedDataSource.data.length > 0; else showBlank\">\r\n <ng-container matColumnDef=\"delete\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button class=\"delete-btn-picker\" mat-button\r\n (click)=\"$event.stopPropagation();removeRow($event, element)\">\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Remove row\">delete</mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"productName\">\r\n <th mat-header-cell *matHeaderCellDef> Product Name </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.text}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"categoryName\" *ngIf=\"showCategory\">\r\n <th mat-header-cell *matHeaderCellDef> Category Name </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.category}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"subCategory\" *ngIf=\"showSubcategory\">\r\n <th mat-header-cell *matHeaderCellDef>Sub Category </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.subCategory}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"price\" *ngIf=\"showPrice\">\r\n <th mat-header-cell *matHeaderCellDef>Price</th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width select-price\">\r\n <mat-label>Price</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('price')\"\r\n placeholder=\"Please enter price\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('required')\">\r\n Price is required\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"Quantity\" *ngIf=\"showQuantity\">\r\n <th mat-header-cell *matHeaderCellDef> Quantity </th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width\">\r\n <mat-label>Quantity</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('quantity')\"\r\n type=\"number\" min=\"1\" step=\"1\" (input)=\"onQuantityChange($event, i)\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('required')\">\r\n This field is required\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('min')\">\r\n Quantity can not be less than 1\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('pattern')\">\r\n Decimals not allowed\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"skuNumber\" *ngIf=\"showSkuNumber\">\r\n <th mat-header-cell *matHeaderCellDef> SKU Number </th>\r\n <td mat-cell *matCellDef=\"let element\">{{element?.otherInformation0}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"inventory\" *ngIf=\"showInventory\">\r\n <th mat-header-cell *matHeaderCellDef> Inventory </th>\r\n <td mat-cell *matCellDef=\"let element\">{{element?.otherInformation1}} </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"showAllproductsColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: showAllproductsColumns;\"></tr>\r\n </table>\r\n <!-- <ng-template #showBlank>\r\n <div class=\"no-data-message\">\r\n No data found.\r\n </div>\r\n </ng-template> -->\r\n <ng-template #showBlank>\r\n <div class=\"no-data-message\">\r\n <div class=\"pp-empty-state\">\r\n <div class=\"img-empty-state\">\r\n <img [src]=\"emptyImage\" alt=\"\">\r\n </div>\r\n <h3>No Product added</h3>\r\n <p>Please go back and start adding products</p>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n <div class=\"tabs-action-step-one\" *ngIf=\"currentPage === 'select-products'\">\r\n <button mat-button (click)=\"goToNextPage()\" [disabled]=\"selection.selected.length ? false : true\"\r\n color=\"primary\" mat-raised-button>Next</button>\r\n <button mat-button [mat-dialog-close]=\"false\">Cancel</button>\r\n </div>\r\n <div class=\"tabs-action\" *ngIf=\"currentPage === 'edit-save'\">\r\n <div class=\"tab-action-wrp\">\r\n <button mat-button (click)=\"goToPreviousPage()\">Back</button>\r\n <button mat-button type=\"submit\" color=\"primary\" mat-raised-button (click)=\"onSubmit()\">Add</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>", styles: [".mat-dialog-heading{margin:0 0 20px;position:relative;display:flex;align-items:center}:host ::ng-deep .mat-dialog-title{width:100%;padding:0 40px;margin:0;font-family:Inter,sans-serif;font-size:20px;color:#000;letter-spacing:normal;text-align:center}.mat-dialog-close mat-icon{color:#000}.example-full-width{width:100%}.mat-dialog-content p{margin-bottom:15px;font-family:Inter,sans-serif}.mat-dialog-content a{color:#2196f3}.mat-dialog-content a:hover{text-decoration:none}:host ::ng-deep .mat-dialog-actions{justify-content:flex-end}.mat-stroked-button.mat-primary{color:#0078d6}.OverlayDiv{position:fixed;display:block;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:#00000080;z-index:500;cursor:pointer}.OverlayDivContent{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.basic-search{display:flex;align-items:center;width:100%;margin-bottom:20px}.basic-search-wrp{border:1px solid #DADCE0;border-radius:5px;padding-left:15px;height:46px;display:flex;align-items:center;flex:1;margin-right:20px}.basic-search-wrp mat-icon{color:#0006}.basic-search-wrp form{width:100%}.search-icon{margin:0;display:flex}.search-icon mat-icon{color:#0006}.search-icon svg{width:24px;height:24px}.search-icon svg path{fill:#999}.input-search{margin:0;border:0;width:100%;padding:0 18px 0 10px}.input-search input{border:0;width:100%;font-size:15px;line-height:1}.input-search input:focus{border:0;outline:0 none}.advfilter{display:flex;margin-left:auto}.advfilter button{border:0;background-color:transparent;margin:0;padding:0;display:flex;position:relative}.advfilter button mat-icon{color:#0006}.advfilter button span{font-weight:600;font-size:10px;display:flex;align-items:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;justify-content:center;width:20px;height:20px;color:#fff!important;border-radius:50%;background-color:#f44336!important;position:absolute;top:-5px;right:-10px}.search-btn{margin-left:auto;min-width:137px}.search-btn button{box-shadow:none;height:46px;width:100%}.product-selection-container{border:1px solid #DADCE0;padding:20px;margin-bottom:20px;border-radius:5px}.product-selection-container h5{margin:0;color:#202020!important;font-size:16px!important}.pp-empty-state{max-width:420px;margin:0 auto;padding:50px 0;text-align:center}.img-empty-state{width:100%;margin-bottom:20px}.img-empty-state img{width:100%}.pp-empty-state h3{font-size:20px!important;margin:0 0 5px;padding:0;font-weight:400;color:#202020!important}.pp-empty-state p{font-size:15px!important;margin:0 0 20px!important;padding:0;color:#656667!important}.mat-dialog-content{max-height:none!important;overflow:hidden!important}.tbl-record-found{border-left:1px solid #0000001f;border-right:1px solid #0000001f;border-top:1px solid #0000001f;border-radius:5px 5px 0 0;min-height:104px;max-height:296px;overflow-y:auto;height:100%}.tbl-record-found table{border-collapse:separate}.tbl-record-found tr:last-child td{border-bottom:none}.tbl-record-found thead,.tbl-record-found th{position:-webkit-sticky;position:sticky;top:0;z-index:100;background-color:#fff}.tbl-record-found th.mat-header-cell:first-of-type,.tbl-record-found td.mat-cell:first-of-type,.tbl-record-found td.mat-footer-cell:first-of-type{width:70px}.row-summary{padding:15px 25px;border-left:1px solid #0000001f;border-top:1px solid #0000001f;display:flex;justify-content:space-between;border-right:1px solid #0000001f;border-bottom:1px solid #0000001f;border-radius:0 0 5px 5px}.row-summary div{margin-right:30px}button.delete-btn-picker{background:transparent!important;padding:0!important;min-width:auto!important}button.delete-btn-picker:hover{background:transparent!important}button.delete-btn-picker:hover .mat-button-focus-overlay{opacity:0!important}button.delete-btn-picker mat-icon{color:#f44336!important}mat-icon.icondropdown{line-height:1.6!important}mat-icon.iconclose{line-height:2!important;font-size:120%!important}.added-products{border:1px solid #0000001f;border-bottom:none;border-radius:5px;min-height:133px;max-height:444px;overflow-y:auto;height:100%}.added-products table{border-collapse:separate}.added-products thead,.added-products th{position:-webkit-sticky;position:sticky;top:0;z-index:100;background-color:#fff}.added-products th.mat-header-cell:first-of-type,.added-products td.mat-cell:first-of-type,.added-products td.mat-footer-cell:first-of-type{width:70px}.mat-header-cell{font-weight:500!important;color:#0000008a!important}.clr-all-picker{display:inline-block;border:0;outline:0 none;padding:0;background-color:transparent;color:#2196f3;margin-left:20px}.title-adv{display:flex;align-items:center;margin-bottom:15px}@media only screen and (max-width:1545px){.pp-empty-state h3{font-size:18px}.pp-empty-state p{font-size:14px}.pp-empty-state{padding:20px 0;max-width:392px}.product-selection-container h5{font-size:14px;margin-bottom:5px}.product-selection-container{padding:15px 20px}.basic-search{margin-bottom:20px}.mat-dialog-heading{margin-bottom:10px}.mat-dialog-title{font-size:18px}.mat-dialog-content{max-height:60vh!important;overflow:auto!important}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i10.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i14.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i14.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }], animations: [
|
|
734
|
+
AddOnProductsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: AddOnProductsComponent, selector: "ngx-mat-add-on-products", viewQueries: [{ propertyName: "firstscrollableDiv", first: true, predicate: ["firstscrollableDiv"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"spinnerFlag\" class=\"OverlayDiv\">\r\n <div class=\"OverlayDivContent\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</div>\r\n<div class=\"mat-dialog-heading\">\r\n <h1 mat-dialog-title>Add Products</h1>\r\n</div>\r\n\r\n<mat-dialog-content [ngClass]=\"dataSource?.data?.length > 0 ? 'products-scroll-visible': ''\">\r\n <div class=\"mat-dialog-content\">\r\n <!--Search Start-->\r\n <div class=\"basic-search\" [hidden]=\"currentPage !== 'select-products'\">\r\n <div class=\"basic-search-wrp\">\r\n <div class=\"search-icon\">\r\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 24 25\" xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(0 0 0)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M11.25 2.75C6.14154 2.75 2 6.89029 2 11.998C2 17.1056 6.14154 21.2459 11.25 21.2459C13.5335 21.2459 15.6238 20.4187 17.2373 19.0475L20.7182 22.5287C21.011 22.8216 21.4859 22.8217 21.7788 22.5288C22.0717 22.2359 22.0718 21.761 21.7789 21.4681L18.2983 17.9872C19.6714 16.3736 20.5 14.2826 20.5 11.998C20.5 6.89029 16.3585 2.75 11.25 2.75ZM3.5 11.998C3.5 7.71905 6.96962 4.25 11.25 4.25C15.5304 4.25 19 7.71905 19 11.998C19 16.2769 15.5304 19.7459 11.25 19.7459C6.96962 19.7459 3.5 16.2769 3.5 11.998Z\" />\r\n </svg>\r\n </div>\r\n <form [formGroup]=\"form\">\r\n <div class=\"input-search\">\r\n <input (keydown.enter)=\"handleDropdownFilter(); $event.stopPropagation()\" type=\"text\" matInput\r\n placeholder=\"Search Product\" formControlName=\"searchProductName\"\r\n (input)=\"clearIfEmpty($event)\">\r\n </div>\r\n </form>\r\n <!-- <div class=\"advfilter\">\r\n <button class=\"adv\" (click)=\"toggleSection();$event.stopPropagation();\">\r\n <mat-icon class=\"material-icons-round\" aria-hidden=\"false\"\r\n aria-label=\"tune\">tune\r\n </mat-icon>\r\n <span *ngIf=\"activeFiltersCount > 0\" class=\"custom-badge\">{{ activeFiltersCount }}</span>\r\n </button>\r\n </div> -->\r\n </div>\r\n <div class=\"search-btn\">\r\n <button mat-raised-button color=\"primary\"\r\n (click)=\"handleDropdownFilter();$event.stopPropagation();\">Search</button>\r\n </div>\r\n </div>\r\n <!--Search End-->\r\n <div class=\"product-selector\">\r\n <div [hidden]=\"currentPage !== 'select-products'\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"product-selection-container\" *ngIf=\"isVisible && dropdownL1\">\r\n <div class=\"dropdown-selection\" *ngIf=\"dropdownL1\">\r\n <div [ngClass]=\"dropDownCount === 1 ? 'no-child': 'child'\">\r\n <div class=\"title-adv\">\r\n <h5>Advanced Filters</h5>\r\n <button class=\"clr-all-picker\" type=\"button\" (click)=\"resetTable()\"\r\n *ngIf=\"activeFiltersCount > 0\">Clear All</button>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL1\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL1Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel1\"\r\n [matAutocomplete]=\"auto3\"\r\n (input)=\"onInputChange($event, 'category1')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto3=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category1')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownOne\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel1').value\"\r\n (click)=\"clearField('dropdownLevel1', 'category1', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix>arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL2\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL2Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel2\"\r\n [matAutocomplete]=\"auto4\"\r\n (input)=\"onInputChange($event, 'category2')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto4=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category2')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownTwo\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel2').value\"\r\n (click)=\"clearField('dropdownLevel2', 'category2', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disabled-icon': isDisabled2}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL3\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL3Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel3\"\r\n [matAutocomplete]=\"auto5\"\r\n (input)=\"onInputChange($event, 'category3')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto5=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category3')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownThree\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel3').value\"\r\n (click)=\"clearField('dropdownLevel3', 'category3', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disable-icon': isDisabled3}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL4\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL4Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel4\"\r\n [matAutocomplete]=\"auto6\"\r\n (input)=\"onInputChange($event, 'category4')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto6=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category4')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownFour\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel4').value\"\r\n (click)=\"clearField('dropdownLevel4', 'category4', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disable-icon': isDisabled4}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div #firstscrollableDiv id=\"firstscrollableDiv\" class=\"new-class first-div\"\r\n (scroll)=\"onScroll($event)\" [ngClass]=\"dataSource?.data?.length > 0 ? 'tbl-record-found': ''\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-table abc\"\r\n *ngIf=\"dataSource && dataSource?.data?.length > 0; else noData\">\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? toggleSelection(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"></mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"productName\">\r\n <th mat-header-cell *matHeaderCellDef> {{productTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.text}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"skuNumber\" *ngIf=\"showSkuNumber\">\r\n <th mat-header-cell *matHeaderCellDef> {{skuTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.otherInformation0}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"inventory\" *ngIf=\"showInventory\">\r\n <th mat-header-cell *matHeaderCellDef> {{inventoryTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.otherInformation1}} </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"addProductsColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: addProductsColumns;\"\r\n (click)=\"$event.stopPropagation();toggleSelection(row)\"\r\n [class.selected]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n <ng-template #noData>\r\n <div class=\"no-data-message\">\r\n <!--No data found.-->\r\n <div class=\"pp-empty-state\">\r\n <div class=\"img-empty-state\">\r\n <img [src]=\"emptyImage\" alt=\"\">\r\n </div>\r\n <h3>No records to show at the moment</h3>\r\n <p>Please modify your search criteria to find the desired result</p>\r\n </div>\r\n\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"row-summary\" *ngIf=\"dataSource && dataSource?.data?.length > 0\">\r\n <div>Selected: <strong>{{ getSelectedRowsCount() }}</strong> </div>\r\n <div>Total Records: <strong>{{ getTotalRecords }}</strong></div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div [hidden]=\"currentPage !== 'edit-save'\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"new-class\"\r\n [ngClass]=\"selectedDataSource && selectedDataSource.data.length > 0 ? 'added-products': ''\">\r\n <table mat-table [dataSource]=\"selectedDataSource\"\r\n *ngIf=\"selectedDataSource && selectedDataSource.data.length > 0; else showBlank\">\r\n <ng-container matColumnDef=\"delete\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button class=\"delete-btn-picker\" mat-button\r\n (click)=\"$event.stopPropagation();removeRow($event, element)\">\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Remove row\">delete</mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"productName\">\r\n <th mat-header-cell *matHeaderCellDef> {{productTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.text}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"categoryName\" *ngIf=\"showCategory\">\r\n <th mat-header-cell *matHeaderCellDef> {{categoryTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.category}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"subCategory\" *ngIf=\"showSubcategory\">\r\n <th mat-header-cell *matHeaderCellDef> {{subCategoryTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.subCategory}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"price\" *ngIf=\"showPrice\">\r\n <th mat-header-cell *matHeaderCellDef>{{priceTweek}}</th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width select-price\">\r\n <mat-label>{{priceTweek}}</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('price')\"\r\n [placeholder]=\"'Please enter ' + priceTweek\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('required')\">\r\n {{priceTweek}} is required\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"Quantity\" *ngIf=\"showQuantity\">\r\n <th mat-header-cell *matHeaderCellDef> {{quantityTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width\">\r\n <mat-label>{{quantityTweek}}</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('quantity')\"\r\n type=\"number\" min=\"1\" step=\"1\" (input)=\"onQuantityChange($event, i)\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('required')\">\r\n This field is required\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('min')\">\r\n Quantity can not be less than 1\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('pattern')\">\r\n Decimals not allowed\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"skuNumber\" *ngIf=\"showSkuNumber\">\r\n <th mat-header-cell *matHeaderCellDef> {{skuTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\">{{element?.otherInformation0}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"inventory\" *ngIf=\"showInventory\">\r\n <th mat-header-cell *matHeaderCellDef> {{inventoryTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\">{{element?.otherInformation1}} </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"cost\" *ngIf=\"showCost\">\r\n <th mat-header-cell *matHeaderCellDef>{{costTweek}}</th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width select-cost\">\r\n <mat-label>{{costTweek}}</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('otherInformation2')\"\r\n [placeholder]=\"'Please enter ' + costTweek\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('otherInformation2').hasError('required')\">\r\n {{costTweek}} is required\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"showAllproductsColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: showAllproductsColumns;\"></tr>\r\n </table>\r\n <!-- <ng-template #showBlank>\r\n <div class=\"no-data-message\">\r\n No data found.\r\n </div>\r\n </ng-template> -->\r\n <ng-template #showBlank>\r\n <div class=\"no-data-message\">\r\n <div class=\"pp-empty-state\">\r\n <div class=\"img-empty-state\">\r\n <img [src]=\"emptyImage\" alt=\"\">\r\n </div>\r\n <h3>No Product added</h3>\r\n <p>Please go back and start adding products</p>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n <div class=\"tabs-action-step-one\" *ngIf=\"currentPage === 'select-products'\">\r\n <button mat-button (click)=\"goToNextPage()\" [disabled]=\"selection.selected.length ? false : true\"\r\n color=\"primary\" mat-raised-button>Next</button>\r\n <button mat-button [mat-dialog-close]=\"false\">Cancel</button>\r\n </div>\r\n <div class=\"tabs-action\" *ngIf=\"currentPage === 'edit-save'\">\r\n <div class=\"tab-action-wrp\">\r\n <button mat-button (click)=\"goToPreviousPage()\">Back</button>\r\n <button mat-button type=\"submit\" color=\"primary\" mat-raised-button (click)=\"onSubmit()\">Add</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>", styles: [".mat-dialog-heading{margin:0 0 20px;position:relative;display:flex;align-items:center}:host ::ng-deep .mat-dialog-title{width:100%;padding:0 40px;margin:0;font-family:Inter,sans-serif;font-size:20px;color:#000;letter-spacing:normal;text-align:center}.mat-dialog-close mat-icon{color:#000}.example-full-width{width:100%}.mat-dialog-content p{margin-bottom:15px;font-family:Inter,sans-serif}.mat-dialog-content a{color:#2196f3}.mat-dialog-content a:hover{text-decoration:none}:host ::ng-deep .mat-dialog-actions{justify-content:flex-end}.mat-stroked-button.mat-primary{color:#0078d6}.OverlayDiv{position:fixed;display:block;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:#00000080;z-index:500;cursor:pointer}.OverlayDivContent{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.basic-search{display:flex;align-items:center;width:100%;margin-bottom:20px}.basic-search-wrp{border:1px solid #DADCE0;border-radius:5px;padding-left:15px;height:46px;display:flex;align-items:center;flex:1;margin-right:20px}.basic-search-wrp mat-icon{color:#0006}.basic-search-wrp form{width:100%}.search-icon{margin:0;display:flex}.search-icon mat-icon{color:#0006}.search-icon svg{width:24px;height:24px}.search-icon svg path{fill:#999}.input-search{margin:0;border:0;width:100%;padding:0 18px 0 10px}.input-search input{border:0;width:100%;font-size:15px;line-height:1}.input-search input:focus{border:0;outline:0 none}.advfilter{display:flex;margin-left:auto}.advfilter button{border:0;background-color:transparent;margin:0;padding:0;display:flex;position:relative}.advfilter button mat-icon{color:#0006}.advfilter button span{font-weight:600;font-size:10px;display:flex;align-items:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;justify-content:center;width:20px;height:20px;color:#fff!important;border-radius:50%;background-color:#f44336!important;position:absolute;top:-5px;right:-10px}.search-btn{margin-left:auto;min-width:137px}.search-btn button{box-shadow:none;height:46px;width:100%}.product-selection-container{border:1px solid #DADCE0;padding:20px;margin-bottom:20px;border-radius:5px}.product-selection-container h5{margin:0;color:#202020!important;font-size:16px!important}.pp-empty-state{max-width:420px;margin:0 auto;padding:50px 0;text-align:center}.img-empty-state{width:100%;margin-bottom:20px}.img-empty-state img{width:100%}.pp-empty-state h3{font-size:20px!important;margin:0 0 5px;padding:0;font-weight:400;color:#202020!important}.pp-empty-state p{font-size:15px!important;margin:0 0 20px!important;padding:0;color:#656667!important}.mat-dialog-content{max-height:none!important;overflow:hidden!important}.tbl-record-found{border-left:1px solid #0000001f;border-right:1px solid #0000001f;border-top:1px solid #0000001f;border-radius:5px 5px 0 0;min-height:104px;max-height:296px;overflow-y:auto;height:100%}.tbl-record-found table{border-collapse:separate}.tbl-record-found tr:last-child td{border-bottom:none}.tbl-record-found thead,.tbl-record-found th{position:-webkit-sticky;position:sticky;top:0;z-index:100;background-color:#fff}.tbl-record-found th.mat-header-cell:first-of-type,.tbl-record-found td.mat-cell:first-of-type,.tbl-record-found td.mat-footer-cell:first-of-type{width:70px}.row-summary{padding:15px 25px;border-left:1px solid #0000001f;border-top:1px solid #0000001f;display:flex;justify-content:space-between;border-right:1px solid #0000001f;border-bottom:1px solid #0000001f;border-radius:0 0 5px 5px}.row-summary div{margin-right:30px}button.delete-btn-picker{background:transparent!important;padding:0!important;min-width:auto!important}button.delete-btn-picker:hover{background:transparent!important}button.delete-btn-picker:hover .mat-button-focus-overlay{opacity:0!important}button.delete-btn-picker mat-icon{color:#f44336!important}mat-icon.icondropdown{line-height:1.6!important}mat-icon.iconclose{line-height:2!important;font-size:120%!important}.added-products{border:1px solid #0000001f;border-bottom:none;border-radius:5px;min-height:133px;max-height:444px;overflow-y:auto;height:100%}.added-products table{border-collapse:separate}.added-products thead,.added-products th{position:-webkit-sticky;position:sticky;top:0;z-index:100;background-color:#fff}.added-products th.mat-header-cell:first-of-type,.added-products td.mat-cell:first-of-type,.added-products td.mat-footer-cell:first-of-type{width:70px}.mat-header-cell{font-weight:500!important;color:#0000008a!important}.clr-all-picker{display:inline-block;border:0;outline:0 none;padding:0;background-color:transparent;color:#2196f3;margin-left:20px}.title-adv{display:flex;align-items:center;margin-bottom:15px}@media only screen and (max-width:1545px){.pp-empty-state h3{font-size:18px}.pp-empty-state p{font-size:14px}.pp-empty-state{padding:20px 0;max-width:392px}.product-selection-container h5{font-size:14px;margin-bottom:5px}.product-selection-container{padding:15px 20px}.basic-search{margin-bottom:20px}.mat-dialog-heading{margin-bottom:10px}.mat-dialog-title{font-size:18px}.mat-dialog-content{max-height:60vh!important;overflow:auto!important}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i10.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i14.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i14.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }], animations: [
|
|
710
735
|
trigger('slideDown', [
|
|
711
736
|
state('hidden', style({ height: '0px', opacity: 0, overflow: 'hidden' })),
|
|
712
737
|
state('visible', style({ height: '*', opacity: 1 })),
|
|
@@ -731,7 +756,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
731
756
|
animate('300ms ease-in')
|
|
732
757
|
])
|
|
733
758
|
])
|
|
734
|
-
], template: "<div *ngIf=\"spinnerFlag\" class=\"OverlayDiv\">\r\n <div class=\"OverlayDivContent\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</div>\r\n<div class=\"mat-dialog-heading\">\r\n <h1 mat-dialog-title>Add Products</h1>\r\n</div>\r\n\r\n<mat-dialog-content [ngClass]=\"dataSource?.data?.length > 0 ? 'products-scroll-visible': ''\">\r\n <div class=\"mat-dialog-content\">\r\n <!--Search Start-->\r\n <div class=\"basic-search\" [hidden]=\"currentPage !== 'select-products'\">\r\n <div class=\"basic-search-wrp\">\r\n <div class=\"search-icon\">\r\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 24 25\" xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(0 0 0)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M11.25 2.75C6.14154 2.75 2 6.89029 2 11.998C2 17.1056 6.14154 21.2459 11.25 21.2459C13.5335 21.2459 15.6238 20.4187 17.2373 19.0475L20.7182 22.5287C21.011 22.8216 21.4859 22.8217 21.7788 22.5288C22.0717 22.2359 22.0718 21.761 21.7789 21.4681L18.2983 17.9872C19.6714 16.3736 20.5 14.2826 20.5 11.998C20.5 6.89029 16.3585 2.75 11.25 2.75ZM3.5 11.998C3.5 7.71905 6.96962 4.25 11.25 4.25C15.5304 4.25 19 7.71905 19 11.998C19 16.2769 15.5304 19.7459 11.25 19.7459C6.96962 19.7459 3.5 16.2769 3.5 11.998Z\" />\r\n </svg>\r\n </div>\r\n <form [formGroup]=\"form\">\r\n <div class=\"input-search\">\r\n <input (keydown.enter)=\"handleDropdownFilter(); $event.stopPropagation()\" type=\"text\" matInput\r\n placeholder=\"Search Product\" formControlName=\"searchProductName\"\r\n (input)=\"clearIfEmpty($event)\">\r\n </div>\r\n </form>\r\n <!-- <div class=\"advfilter\">\r\n <button class=\"adv\" (click)=\"toggleSection();$event.stopPropagation();\">\r\n <mat-icon class=\"material-icons-round\" aria-hidden=\"false\"\r\n aria-label=\"tune\">tune\r\n </mat-icon>\r\n <span *ngIf=\"activeFiltersCount > 0\" class=\"custom-badge\">{{ activeFiltersCount }}</span>\r\n </button>\r\n </div> -->\r\n </div>\r\n <div class=\"search-btn\">\r\n <button mat-raised-button color=\"primary\"\r\n (click)=\"handleDropdownFilter();$event.stopPropagation();\">Search</button>\r\n </div>\r\n </div>\r\n <!--Search End-->\r\n <div class=\"product-selector\">\r\n <div [hidden]=\"currentPage !== 'select-products'\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"product-selection-container\" *ngIf=\"isVisible && dropdownL1\">\r\n <div class=\"dropdown-selection\" *ngIf=\"dropdownL1\">\r\n <div [ngClass]=\"dropDownCount === 1 ? 'no-child': 'child'\">\r\n <div class=\"title-adv\">\r\n <h5>Advanced Filters</h5>\r\n <button class=\"clr-all-picker\" type=\"button\" (click)=\"resetTable()\" *ngIf=\"activeFiltersCount > 0\">Clear All</button>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL1\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL1Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel1\"\r\n [matAutocomplete]=\"auto3\"\r\n (input)=\"onInputChange($event, 'category1')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto3=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category1')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownOne\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel1').value\"\r\n (click)=\"clearField('dropdownLevel1', 'category1', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix>arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL2\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL2Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel2\"\r\n [matAutocomplete]=\"auto4\"\r\n (input)=\"onInputChange($event, 'category2')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto4=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category2')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownTwo\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel2').value\"\r\n (click)=\"clearField('dropdownLevel2', 'category2', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disabled-icon': isDisabled2}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL3\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL3Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel3\"\r\n [matAutocomplete]=\"auto5\"\r\n (input)=\"onInputChange($event, 'category3')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto5=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category3')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownThree\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel3').value\"\r\n (click)=\"clearField('dropdownLevel3', 'category3', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disable-icon': isDisabled3}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL4\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL4Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel4\"\r\n [matAutocomplete]=\"auto6\"\r\n (input)=\"onInputChange($event, 'category4')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto6=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category4')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownFour\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel4').value\"\r\n (click)=\"clearField('dropdownLevel4', 'category4', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disable-icon': isDisabled4}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div #firstscrollableDiv id=\"firstscrollableDiv\" class=\"new-class first-div\"\r\n (scroll)=\"onScroll($event)\" [ngClass]=\"dataSource?.data?.length > 0 ? 'tbl-record-found': ''\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-table abc\"\r\n *ngIf=\"dataSource && dataSource?.data?.length > 0; else noData\">\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? toggleSelection(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"></mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"productName\">\r\n <th mat-header-cell *matHeaderCellDef> Product Name </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.text}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"skuNumber\" *ngIf=\"showSkuNumber\">\r\n <th mat-header-cell *matHeaderCellDef> SKU Number </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.otherInformation0}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"inventory\" *ngIf=\"showInventory\">\r\n <th mat-header-cell *matHeaderCellDef> Inventory </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.otherInformation1}} </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"addProductsColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: addProductsColumns;\"\r\n (click)=\"$event.stopPropagation();toggleSelection(row)\"\r\n [class.selected]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n <ng-template #noData>\r\n <div class=\"no-data-message\">\r\n <!--No data found.-->\r\n <div class=\"pp-empty-state\">\r\n <div class=\"img-empty-state\">\r\n <img [src]=\"emptyImage\" alt=\"\">\r\n </div>\r\n <h3>No records to show at the moment</h3>\r\n <p>Please modify your search criteria to find the desired result</p>\r\n </div>\r\n\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"row-summary\" *ngIf=\"dataSource && dataSource?.data?.length > 0\">\r\n <div>Selected: <strong>{{ getSelectedRowsCount() }}</strong> </div>\r\n <div>Total Records: <strong>{{ getTotalRecords }}</strong></div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div [hidden]=\"currentPage !== 'edit-save'\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"new-class\"\r\n [ngClass]=\"selectedDataSource && selectedDataSource.data.length > 0 ? 'added-products': ''\">\r\n <table mat-table [dataSource]=\"selectedDataSource\"\r\n *ngIf=\"selectedDataSource && selectedDataSource.data.length > 0; else showBlank\">\r\n <ng-container matColumnDef=\"delete\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button class=\"delete-btn-picker\" mat-button\r\n (click)=\"$event.stopPropagation();removeRow($event, element)\">\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Remove row\">delete</mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"productName\">\r\n <th mat-header-cell *matHeaderCellDef> Product Name </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.text}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"categoryName\" *ngIf=\"showCategory\">\r\n <th mat-header-cell *matHeaderCellDef> Category Name </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.category}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"subCategory\" *ngIf=\"showSubcategory\">\r\n <th mat-header-cell *matHeaderCellDef>Sub Category </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.subCategory}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"price\" *ngIf=\"showPrice\">\r\n <th mat-header-cell *matHeaderCellDef>Price</th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width select-price\">\r\n <mat-label>Price</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('price')\"\r\n placeholder=\"Please enter price\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('required')\">\r\n Price is required\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"Quantity\" *ngIf=\"showQuantity\">\r\n <th mat-header-cell *matHeaderCellDef> Quantity </th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width\">\r\n <mat-label>Quantity</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('quantity')\"\r\n type=\"number\" min=\"1\" step=\"1\" (input)=\"onQuantityChange($event, i)\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('required')\">\r\n This field is required\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('min')\">\r\n Quantity can not be less than 1\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('pattern')\">\r\n Decimals not allowed\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"skuNumber\" *ngIf=\"showSkuNumber\">\r\n <th mat-header-cell *matHeaderCellDef> SKU Number </th>\r\n <td mat-cell *matCellDef=\"let element\">{{element?.otherInformation0}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"inventory\" *ngIf=\"showInventory\">\r\n <th mat-header-cell *matHeaderCellDef> Inventory </th>\r\n <td mat-cell *matCellDef=\"let element\">{{element?.otherInformation1}} </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"showAllproductsColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: showAllproductsColumns;\"></tr>\r\n </table>\r\n <!-- <ng-template #showBlank>\r\n <div class=\"no-data-message\">\r\n No data found.\r\n </div>\r\n </ng-template> -->\r\n <ng-template #showBlank>\r\n <div class=\"no-data-message\">\r\n <div class=\"pp-empty-state\">\r\n <div class=\"img-empty-state\">\r\n <img [src]=\"emptyImage\" alt=\"\">\r\n </div>\r\n <h3>No Product added</h3>\r\n <p>Please go back and start adding products</p>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n <div class=\"tabs-action-step-one\" *ngIf=\"currentPage === 'select-products'\">\r\n <button mat-button (click)=\"goToNextPage()\" [disabled]=\"selection.selected.length ? false : true\"\r\n color=\"primary\" mat-raised-button>Next</button>\r\n <button mat-button [mat-dialog-close]=\"false\">Cancel</button>\r\n </div>\r\n <div class=\"tabs-action\" *ngIf=\"currentPage === 'edit-save'\">\r\n <div class=\"tab-action-wrp\">\r\n <button mat-button (click)=\"goToPreviousPage()\">Back</button>\r\n <button mat-button type=\"submit\" color=\"primary\" mat-raised-button (click)=\"onSubmit()\">Add</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>", styles: [".mat-dialog-heading{margin:0 0 20px;position:relative;display:flex;align-items:center}:host ::ng-deep .mat-dialog-title{width:100%;padding:0 40px;margin:0;font-family:Inter,sans-serif;font-size:20px;color:#000;letter-spacing:normal;text-align:center}.mat-dialog-close mat-icon{color:#000}.example-full-width{width:100%}.mat-dialog-content p{margin-bottom:15px;font-family:Inter,sans-serif}.mat-dialog-content a{color:#2196f3}.mat-dialog-content a:hover{text-decoration:none}:host ::ng-deep .mat-dialog-actions{justify-content:flex-end}.mat-stroked-button.mat-primary{color:#0078d6}.OverlayDiv{position:fixed;display:block;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:#00000080;z-index:500;cursor:pointer}.OverlayDivContent{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.basic-search{display:flex;align-items:center;width:100%;margin-bottom:20px}.basic-search-wrp{border:1px solid #DADCE0;border-radius:5px;padding-left:15px;height:46px;display:flex;align-items:center;flex:1;margin-right:20px}.basic-search-wrp mat-icon{color:#0006}.basic-search-wrp form{width:100%}.search-icon{margin:0;display:flex}.search-icon mat-icon{color:#0006}.search-icon svg{width:24px;height:24px}.search-icon svg path{fill:#999}.input-search{margin:0;border:0;width:100%;padding:0 18px 0 10px}.input-search input{border:0;width:100%;font-size:15px;line-height:1}.input-search input:focus{border:0;outline:0 none}.advfilter{display:flex;margin-left:auto}.advfilter button{border:0;background-color:transparent;margin:0;padding:0;display:flex;position:relative}.advfilter button mat-icon{color:#0006}.advfilter button span{font-weight:600;font-size:10px;display:flex;align-items:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;justify-content:center;width:20px;height:20px;color:#fff!important;border-radius:50%;background-color:#f44336!important;position:absolute;top:-5px;right:-10px}.search-btn{margin-left:auto;min-width:137px}.search-btn button{box-shadow:none;height:46px;width:100%}.product-selection-container{border:1px solid #DADCE0;padding:20px;margin-bottom:20px;border-radius:5px}.product-selection-container h5{margin:0;color:#202020!important;font-size:16px!important}.pp-empty-state{max-width:420px;margin:0 auto;padding:50px 0;text-align:center}.img-empty-state{width:100%;margin-bottom:20px}.img-empty-state img{width:100%}.pp-empty-state h3{font-size:20px!important;margin:0 0 5px;padding:0;font-weight:400;color:#202020!important}.pp-empty-state p{font-size:15px!important;margin:0 0 20px!important;padding:0;color:#656667!important}.mat-dialog-content{max-height:none!important;overflow:hidden!important}.tbl-record-found{border-left:1px solid #0000001f;border-right:1px solid #0000001f;border-top:1px solid #0000001f;border-radius:5px 5px 0 0;min-height:104px;max-height:296px;overflow-y:auto;height:100%}.tbl-record-found table{border-collapse:separate}.tbl-record-found tr:last-child td{border-bottom:none}.tbl-record-found thead,.tbl-record-found th{position:-webkit-sticky;position:sticky;top:0;z-index:100;background-color:#fff}.tbl-record-found th.mat-header-cell:first-of-type,.tbl-record-found td.mat-cell:first-of-type,.tbl-record-found td.mat-footer-cell:first-of-type{width:70px}.row-summary{padding:15px 25px;border-left:1px solid #0000001f;border-top:1px solid #0000001f;display:flex;justify-content:space-between;border-right:1px solid #0000001f;border-bottom:1px solid #0000001f;border-radius:0 0 5px 5px}.row-summary div{margin-right:30px}button.delete-btn-picker{background:transparent!important;padding:0!important;min-width:auto!important}button.delete-btn-picker:hover{background:transparent!important}button.delete-btn-picker:hover .mat-button-focus-overlay{opacity:0!important}button.delete-btn-picker mat-icon{color:#f44336!important}mat-icon.icondropdown{line-height:1.6!important}mat-icon.iconclose{line-height:2!important;font-size:120%!important}.added-products{border:1px solid #0000001f;border-bottom:none;border-radius:5px;min-height:133px;max-height:444px;overflow-y:auto;height:100%}.added-products table{border-collapse:separate}.added-products thead,.added-products th{position:-webkit-sticky;position:sticky;top:0;z-index:100;background-color:#fff}.added-products th.mat-header-cell:first-of-type,.added-products td.mat-cell:first-of-type,.added-products td.mat-footer-cell:first-of-type{width:70px}.mat-header-cell{font-weight:500!important;color:#0000008a!important}.clr-all-picker{display:inline-block;border:0;outline:0 none;padding:0;background-color:transparent;color:#2196f3;margin-left:20px}.title-adv{display:flex;align-items:center;margin-bottom:15px}@media only screen and (max-width:1545px){.pp-empty-state h3{font-size:18px}.pp-empty-state p{font-size:14px}.pp-empty-state{padding:20px 0;max-width:392px}.product-selection-container h5{font-size:14px;margin-bottom:5px}.product-selection-container{padding:15px 20px}.basic-search{margin-bottom:20px}.mat-dialog-heading{margin-bottom:10px}.mat-dialog-title{font-size:18px}.mat-dialog-content{max-height:60vh!important;overflow:auto!important}}\n"] }]
|
|
759
|
+
], template: "<div *ngIf=\"spinnerFlag\" class=\"OverlayDiv\">\r\n <div class=\"OverlayDivContent\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</div>\r\n<div class=\"mat-dialog-heading\">\r\n <h1 mat-dialog-title>Add Products</h1>\r\n</div>\r\n\r\n<mat-dialog-content [ngClass]=\"dataSource?.data?.length > 0 ? 'products-scroll-visible': ''\">\r\n <div class=\"mat-dialog-content\">\r\n <!--Search Start-->\r\n <div class=\"basic-search\" [hidden]=\"currentPage !== 'select-products'\">\r\n <div class=\"basic-search-wrp\">\r\n <div class=\"search-icon\">\r\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 24 25\" xmlns=\"http://www.w3.org/2000/svg\"\r\n transform=\"rotate(0 0 0)\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\r\n d=\"M11.25 2.75C6.14154 2.75 2 6.89029 2 11.998C2 17.1056 6.14154 21.2459 11.25 21.2459C13.5335 21.2459 15.6238 20.4187 17.2373 19.0475L20.7182 22.5287C21.011 22.8216 21.4859 22.8217 21.7788 22.5288C22.0717 22.2359 22.0718 21.761 21.7789 21.4681L18.2983 17.9872C19.6714 16.3736 20.5 14.2826 20.5 11.998C20.5 6.89029 16.3585 2.75 11.25 2.75ZM3.5 11.998C3.5 7.71905 6.96962 4.25 11.25 4.25C15.5304 4.25 19 7.71905 19 11.998C19 16.2769 15.5304 19.7459 11.25 19.7459C6.96962 19.7459 3.5 16.2769 3.5 11.998Z\" />\r\n </svg>\r\n </div>\r\n <form [formGroup]=\"form\">\r\n <div class=\"input-search\">\r\n <input (keydown.enter)=\"handleDropdownFilter(); $event.stopPropagation()\" type=\"text\" matInput\r\n placeholder=\"Search Product\" formControlName=\"searchProductName\"\r\n (input)=\"clearIfEmpty($event)\">\r\n </div>\r\n </form>\r\n <!-- <div class=\"advfilter\">\r\n <button class=\"adv\" (click)=\"toggleSection();$event.stopPropagation();\">\r\n <mat-icon class=\"material-icons-round\" aria-hidden=\"false\"\r\n aria-label=\"tune\">tune\r\n </mat-icon>\r\n <span *ngIf=\"activeFiltersCount > 0\" class=\"custom-badge\">{{ activeFiltersCount }}</span>\r\n </button>\r\n </div> -->\r\n </div>\r\n <div class=\"search-btn\">\r\n <button mat-raised-button color=\"primary\"\r\n (click)=\"handleDropdownFilter();$event.stopPropagation();\">Search</button>\r\n </div>\r\n </div>\r\n <!--Search End-->\r\n <div class=\"product-selector\">\r\n <div [hidden]=\"currentPage !== 'select-products'\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"product-selection-container\" *ngIf=\"isVisible && dropdownL1\">\r\n <div class=\"dropdown-selection\" *ngIf=\"dropdownL1\">\r\n <div [ngClass]=\"dropDownCount === 1 ? 'no-child': 'child'\">\r\n <div class=\"title-adv\">\r\n <h5>Advanced Filters</h5>\r\n <button class=\"clr-all-picker\" type=\"button\" (click)=\"resetTable()\"\r\n *ngIf=\"activeFiltersCount > 0\">Clear All</button>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL1\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL1Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel1\"\r\n [matAutocomplete]=\"auto3\"\r\n (input)=\"onInputChange($event, 'category1')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto3=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category1')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownOne\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel1').value\"\r\n (click)=\"clearField('dropdownLevel1', 'category1', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix>arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL2\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL2Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel2\"\r\n [matAutocomplete]=\"auto4\"\r\n (input)=\"onInputChange($event, 'category2')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto4=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category2')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownTwo\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel2').value\"\r\n (click)=\"clearField('dropdownLevel2', 'category2', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disabled-icon': isDisabled2}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL3\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL3Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel3\"\r\n [matAutocomplete]=\"auto5\"\r\n (input)=\"onInputChange($event, 'category3')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto5=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category3')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownThree\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel3').value\"\r\n (click)=\"clearField('dropdownLevel3', 'category3', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disable-icon': isDisabled3}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6\">\r\n <div class=\"example-full-width\">\r\n <mat-form-field *ngIf=\"dropdownL4\" class=\"example-full-width\">\r\n <mat-label>{{dropdownL4Label}}</mat-label>\r\n <input type=\"text\" matInput formControlName=\"dropdownLevel4\"\r\n [matAutocomplete]=\"auto6\"\r\n (input)=\"onInputChange($event, 'category4')\">\r\n <mat-autocomplete [displayWith]=\"displayFn\" #auto6=\"matAutocomplete\"\r\n (optionSelected)=\"onOptionSelected($event, 'category4')\">\r\n <mat-option *ngFor=\"let option of filteredDropdownFour\"\r\n [value]=\"option\">{{option.name}}</mat-option>\r\n </mat-autocomplete>\r\n <mat-icon matSuffix *ngIf=\"form.get('dropdownLevel4').value\"\r\n (click)=\"clearField('dropdownLevel4', 'category4', $event)\"\r\n class=\"iconclose\">close</mat-icon>\r\n <mat-icon class=\"icondropdown\" matSuffix\r\n [ngClass]=\"{'disable-icon': isDisabled4}\">arrow_drop_down</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div #firstscrollableDiv id=\"firstscrollableDiv\" class=\"new-class first-div\"\r\n (scroll)=\"onScroll($event)\" [ngClass]=\"dataSource?.data?.length > 0 ? 'tbl-record-found': ''\">\r\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-table abc\"\r\n *ngIf=\"dataSource && dataSource?.data?.length > 0; else noData\">\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox color=\"primary\" (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? toggleSelection(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"></mat-checkbox>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"productName\">\r\n <th mat-header-cell *matHeaderCellDef> {{productTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.text}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"skuNumber\" *ngIf=\"showSkuNumber\">\r\n <th mat-header-cell *matHeaderCellDef> {{skuTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.otherInformation0}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"inventory\" *ngIf=\"showInventory\">\r\n <th mat-header-cell *matHeaderCellDef> {{inventoryTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element?.otherInformation1}} </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"addProductsColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: addProductsColumns;\"\r\n (click)=\"$event.stopPropagation();toggleSelection(row)\"\r\n [class.selected]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n <ng-template #noData>\r\n <div class=\"no-data-message\">\r\n <!--No data found.-->\r\n <div class=\"pp-empty-state\">\r\n <div class=\"img-empty-state\">\r\n <img [src]=\"emptyImage\" alt=\"\">\r\n </div>\r\n <h3>No records to show at the moment</h3>\r\n <p>Please modify your search criteria to find the desired result</p>\r\n </div>\r\n\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"row-summary\" *ngIf=\"dataSource && dataSource?.data?.length > 0\">\r\n <div>Selected: <strong>{{ getSelectedRowsCount() }}</strong> </div>\r\n <div>Total Records: <strong>{{ getTotalRecords }}</strong></div>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n <div [hidden]=\"currentPage !== 'edit-save'\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"new-class\"\r\n [ngClass]=\"selectedDataSource && selectedDataSource.data.length > 0 ? 'added-products': ''\">\r\n <table mat-table [dataSource]=\"selectedDataSource\"\r\n *ngIf=\"selectedDataSource && selectedDataSource.data.length > 0; else showBlank\">\r\n <ng-container matColumnDef=\"delete\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <button class=\"delete-btn-picker\" mat-button\r\n (click)=\"$event.stopPropagation();removeRow($event, element)\">\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Remove row\">delete</mat-icon>\r\n </button>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"productName\">\r\n <th mat-header-cell *matHeaderCellDef> {{productTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.text}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"categoryName\" *ngIf=\"showCategory\">\r\n <th mat-header-cell *matHeaderCellDef> {{categoryTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.category}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"subCategory\" *ngIf=\"showSubcategory\">\r\n <th mat-header-cell *matHeaderCellDef> {{subCategoryTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element.subCategory}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"price\" *ngIf=\"showPrice\">\r\n <th mat-header-cell *matHeaderCellDef>{{priceTweek}}</th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width select-price\">\r\n <mat-label>{{priceTweek}}</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('price')\"\r\n [placeholder]=\"'Please enter ' + priceTweek\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('required')\">\r\n {{priceTweek}} is required\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"Quantity\" *ngIf=\"showQuantity\">\r\n <th mat-header-cell *matHeaderCellDef> {{quantityTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width\">\r\n <mat-label>{{quantityTweek}}</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('quantity')\"\r\n type=\"number\" min=\"1\" step=\"1\" (input)=\"onQuantityChange($event, i)\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('required')\">\r\n This field is required\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('min')\">\r\n Quantity can not be less than 1\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('quantity').hasError('pattern')\">\r\n Decimals not allowed\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"skuNumber\" *ngIf=\"showSkuNumber\">\r\n <th mat-header-cell *matHeaderCellDef> {{skuTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\">{{element?.otherInformation0}} </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"inventory\" *ngIf=\"showInventory\">\r\n <th mat-header-cell *matHeaderCellDef> {{inventoryTweek}} </th>\r\n <td mat-cell *matCellDef=\"let element\">{{element?.otherInformation1}} </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"cost\" *ngIf=\"showCost\">\r\n <th mat-header-cell *matHeaderCellDef>{{costTweek}}</th>\r\n <td mat-cell *matCellDef=\"let element; let i = index\">\r\n <mat-form-field class=\"example-full-width select-cost\">\r\n <mat-label>{{costTweek}}</mat-label>\r\n <input matInput [formControl]=\"selectedProducts.at(i).get('otherInformation2')\"\r\n [placeholder]=\"'Please enter ' + costTweek\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('otherInformation2').hasError('required')\">\r\n {{costTweek}} is required\r\n </mat-error>\r\n </mat-form-field>\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"showAllproductsColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: showAllproductsColumns;\"></tr>\r\n </table>\r\n <!-- <ng-template #showBlank>\r\n <div class=\"no-data-message\">\r\n No data found.\r\n </div>\r\n </ng-template> -->\r\n <ng-template #showBlank>\r\n <div class=\"no-data-message\">\r\n <div class=\"pp-empty-state\">\r\n <div class=\"img-empty-state\">\r\n <img [src]=\"emptyImage\" alt=\"\">\r\n </div>\r\n <h3>No Product added</h3>\r\n <p>Please go back and start adding products</p>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n <div class=\"tabs-action-step-one\" *ngIf=\"currentPage === 'select-products'\">\r\n <button mat-button (click)=\"goToNextPage()\" [disabled]=\"selection.selected.length ? false : true\"\r\n color=\"primary\" mat-raised-button>Next</button>\r\n <button mat-button [mat-dialog-close]=\"false\">Cancel</button>\r\n </div>\r\n <div class=\"tabs-action\" *ngIf=\"currentPage === 'edit-save'\">\r\n <div class=\"tab-action-wrp\">\r\n <button mat-button (click)=\"goToPreviousPage()\">Back</button>\r\n <button mat-button type=\"submit\" color=\"primary\" mat-raised-button (click)=\"onSubmit()\">Add</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>", styles: [".mat-dialog-heading{margin:0 0 20px;position:relative;display:flex;align-items:center}:host ::ng-deep .mat-dialog-title{width:100%;padding:0 40px;margin:0;font-family:Inter,sans-serif;font-size:20px;color:#000;letter-spacing:normal;text-align:center}.mat-dialog-close mat-icon{color:#000}.example-full-width{width:100%}.mat-dialog-content p{margin-bottom:15px;font-family:Inter,sans-serif}.mat-dialog-content a{color:#2196f3}.mat-dialog-content a:hover{text-decoration:none}:host ::ng-deep .mat-dialog-actions{justify-content:flex-end}.mat-stroked-button.mat-primary{color:#0078d6}.OverlayDiv{position:fixed;display:block;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:#00000080;z-index:500;cursor:pointer}.OverlayDivContent{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.basic-search{display:flex;align-items:center;width:100%;margin-bottom:20px}.basic-search-wrp{border:1px solid #DADCE0;border-radius:5px;padding-left:15px;height:46px;display:flex;align-items:center;flex:1;margin-right:20px}.basic-search-wrp mat-icon{color:#0006}.basic-search-wrp form{width:100%}.search-icon{margin:0;display:flex}.search-icon mat-icon{color:#0006}.search-icon svg{width:24px;height:24px}.search-icon svg path{fill:#999}.input-search{margin:0;border:0;width:100%;padding:0 18px 0 10px}.input-search input{border:0;width:100%;font-size:15px;line-height:1}.input-search input:focus{border:0;outline:0 none}.advfilter{display:flex;margin-left:auto}.advfilter button{border:0;background-color:transparent;margin:0;padding:0;display:flex;position:relative}.advfilter button mat-icon{color:#0006}.advfilter button span{font-weight:600;font-size:10px;display:flex;align-items:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;justify-content:center;width:20px;height:20px;color:#fff!important;border-radius:50%;background-color:#f44336!important;position:absolute;top:-5px;right:-10px}.search-btn{margin-left:auto;min-width:137px}.search-btn button{box-shadow:none;height:46px;width:100%}.product-selection-container{border:1px solid #DADCE0;padding:20px;margin-bottom:20px;border-radius:5px}.product-selection-container h5{margin:0;color:#202020!important;font-size:16px!important}.pp-empty-state{max-width:420px;margin:0 auto;padding:50px 0;text-align:center}.img-empty-state{width:100%;margin-bottom:20px}.img-empty-state img{width:100%}.pp-empty-state h3{font-size:20px!important;margin:0 0 5px;padding:0;font-weight:400;color:#202020!important}.pp-empty-state p{font-size:15px!important;margin:0 0 20px!important;padding:0;color:#656667!important}.mat-dialog-content{max-height:none!important;overflow:hidden!important}.tbl-record-found{border-left:1px solid #0000001f;border-right:1px solid #0000001f;border-top:1px solid #0000001f;border-radius:5px 5px 0 0;min-height:104px;max-height:296px;overflow-y:auto;height:100%}.tbl-record-found table{border-collapse:separate}.tbl-record-found tr:last-child td{border-bottom:none}.tbl-record-found thead,.tbl-record-found th{position:-webkit-sticky;position:sticky;top:0;z-index:100;background-color:#fff}.tbl-record-found th.mat-header-cell:first-of-type,.tbl-record-found td.mat-cell:first-of-type,.tbl-record-found td.mat-footer-cell:first-of-type{width:70px}.row-summary{padding:15px 25px;border-left:1px solid #0000001f;border-top:1px solid #0000001f;display:flex;justify-content:space-between;border-right:1px solid #0000001f;border-bottom:1px solid #0000001f;border-radius:0 0 5px 5px}.row-summary div{margin-right:30px}button.delete-btn-picker{background:transparent!important;padding:0!important;min-width:auto!important}button.delete-btn-picker:hover{background:transparent!important}button.delete-btn-picker:hover .mat-button-focus-overlay{opacity:0!important}button.delete-btn-picker mat-icon{color:#f44336!important}mat-icon.icondropdown{line-height:1.6!important}mat-icon.iconclose{line-height:2!important;font-size:120%!important}.added-products{border:1px solid #0000001f;border-bottom:none;border-radius:5px;min-height:133px;max-height:444px;overflow-y:auto;height:100%}.added-products table{border-collapse:separate}.added-products thead,.added-products th{position:-webkit-sticky;position:sticky;top:0;z-index:100;background-color:#fff}.added-products th.mat-header-cell:first-of-type,.added-products td.mat-cell:first-of-type,.added-products td.mat-footer-cell:first-of-type{width:70px}.mat-header-cell{font-weight:500!important;color:#0000008a!important}.clr-all-picker{display:inline-block;border:0;outline:0 none;padding:0;background-color:transparent;color:#2196f3;margin-left:20px}.title-adv{display:flex;align-items:center;margin-bottom:15px}@media only screen and (max-width:1545px){.pp-empty-state h3{font-size:18px}.pp-empty-state p{font-size:14px}.pp-empty-state{padding:20px 0;max-width:392px}.product-selection-container h5{font-size:14px;margin-bottom:5px}.product-selection-container{padding:15px 20px}.basic-search{margin-bottom:20px}.mat-dialog-heading{margin-bottom:10px}.mat-dialog-title{font-size:18px}.mat-dialog-content{max-height:60vh!important;overflow:auto!important}}\n"] }]
|
|
735
760
|
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
736
761
|
type: Inject,
|
|
737
762
|
args: [MAT_DIALOG_DATA]
|
|
@@ -739,4 +764,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
739
764
|
type: ViewChild,
|
|
740
765
|
args: ['firstscrollableDiv']
|
|
741
766
|
}] } });
|
|
742
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW9uLXByb2R1Y3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZW5kZXItbWF0ZXJpYWwtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1vbi1wcm9kdWN0cy9hZGQtb24tcHJvZHVjdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlbmRlci1tYXRlcmlhbC1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvYWRkLW9uLXByb2R1Y3RzL2FkZC1vbi1wcm9kdWN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixTQUFTLEVBQWMsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQWUsU0FBUyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxlQUFlLEVBQTJCLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUVuRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBK0JqRixNQUFNLE9BQU8sc0JBQXNCO0lBOERqQyxZQUNTLFlBQWtELEVBQ2hDLElBQVMsRUFDMUIsRUFBZSxFQUNmLE1BQWlCLEVBQ2pCLFlBQTJCO1FBSjVCLGlCQUFZLEdBQVosWUFBWSxDQUFzQztR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QU07MkJBQUMsZUFBZTswSEE1QlEsa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1BcnJheSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdCB7XHJcbiAgcHJvZHVjdE5hbWU6IHN0cmluZztcclxuICBwcm9kdWN0RGVzY3JpcHRpb246IHN0cmluZztcclxuICBxdWFudGl0eTogYW55LFxyXG4gIHByaWNlOiBhbnksXHJcbiAgdGV4dDogYW55LFxyXG4gIGlkOiBhbnksXHJcbiAgdmFsdWU6IGFueSxcclxuICBvdGhlckluZm9ybWF0aW9uMDogYW55LFxyXG4gIG90aGVySW5mb3JtYXRpb24xOiBhbnlcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtbWF0LWFkZC1vbi1wcm9kdWN0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1vbi1wcm9kdWN0cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLW9uLXByb2R1Y3RzLmNvbXBvbmVudC5jc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdzbGlkZURvd24nLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG9wYWNpdHk6IDAsIG92ZXJmbG93OiAnaGlkZGVuJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgb3BhY2l0eTogMSB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgW1xyXG4gICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2Utb3V0JylcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgW1xyXG4gICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4nKVxyXG4gICAgICBdKVxyXG4gICAgXSlcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRPblByb2R1Y3RzQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcclxuICBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgZHJvcGRvd25PbmU6IHN0cmluZ1tdID0gW107XHJcbiAgZHJvcGRvd25Ud286IHN0cmluZ1tdID0gW107XHJcbiAgZHJvcGRvd25UaHJlZTogc3RyaW5nW10gPSBbXTtcclxuICBkcm9wZG93bkZvdXI6IHN0cmluZ1tdID0gW107XHJcbiAgZmlsdGVyZWREcm9wZG93bk9uZTogc3RyaW5nW10gPSBbXTtcclxuICBmaWx0ZXJlZERyb3Bkb3duVHdvOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZpbHRlcmVkRHJvcGRvd25UaHJlZTogc3RyaW5nW10gPSBbXTtcclxuICBmaWx0ZXJlZERyb3Bkb3duRm91cjogc3RyaW5nW10gPSBbXTtcclxuICBhZGRQcm9kdWN0c0NvbHVtbnM6IHN0cmluZ1tdID0gWydzZWxlY3QnLCAncHJvZHVjdE5hbWUnLCAnc2t1TnVtYmVyJywgJ2ludmVudG9yeSddO1xyXG4gIHNob3dBbGxwcm9kdWN0c0NvbHVtbnM6IHN0cmluZ1tdID0gWydkZWxldGUnLCAncHJvZHVjdE5hbWUnLCAnY2F0ZWdvcnlOYW1lJywgJ3N1YkNhdGVnb3J5JywgJ1F1YW50aXR5JywgJ3ByaWNlJywgJ3NrdU51bWJlcicsICdpbnZlbnRvcnknXTtcclxuICBxdWFudGl0eUxpc3Q6IG51bWJlcltdID0gWzUsIDEwLCAxNSwgMjAsIDI1XTtcclxuICBFTEVNRU5UX0RBVEE6IFByb2R1Y3RbXSA9IFtdO1xyXG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPFByb2R1Y3Q+KCk7XHJcbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xyXG4gIHNlbGVjdGVkRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8UHJvZHVjdD4oW10pO1xyXG4gIHNlbGVjdGVkQ2F0ZWdvcnk6IGFueSA9IG51bGw7XHJcbiAgc2VsZWN0ZWRTdWJDYXRlZ29yeTogYW55ID0gbnVsbDtcclxuICBzaG93Q2F0ZWdvcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93U3ViY2F0ZWdvcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93UHJpY2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHNob3dRdWFudGl0eTogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd1NrdU51bWJlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dJbnZlbnRvcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93TmV3UHJvZHVjdFBpY2tlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2V0Q2F0ZWdvcnk6IHN0cmluZyA9ICcnO1xyXG4gIHNldFN1YkNhdGVnb3J5OiBzdHJpbmcgPSAnJztcclxuICBsb2FkaW5nRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBhZ2VOdW1iZXIgPSAxO1xyXG4gIHBhZ2VTaXplID0gMjA7XHJcbiAgdG90YWxQYWdlcyA9IDA7XHJcbiAgc2VhcmNoUXVlcnkgPSAnJztcclxuICBpdGVtTGlzdDogYW55W10gPSBbXTtcclxuICB0cmFja0hlaWdodDogYW55O1xyXG4gIHByZXZTY3JvbGxQb3NpdGlvbiA9IDA7IC8vIFRyYWNrIHRoZSBwcmV2aW91cyBzY3JvbGwgcG9zaXRpb25cclxuICBAVmlld0NoaWxkKCdmaXJzdHNjcm9sbGFibGVEaXYnKSBmaXJzdHNjcm9sbGFibGVEaXY6IEVsZW1lbnRSZWY7XHJcbiAgc3Bpbm5lckZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bkwxOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZHJvcGRvd25MMjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duTDM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bkw0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZHJvcGRvd25MMUxhYmVsOiBzdHJpbmcgPSAnJztcclxuICBkcm9wZG93bkwyTGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIGRyb3Bkb3duTDNMYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgZHJvcGRvd25MNExhYmVsOiBzdHJpbmcgPSAnJztcclxuICBkcm9wRG93bkNvdW50OiBudW1iZXIgPSAwO1xyXG4gIGxldmVsT25lSWQ6IGFueSA9ICcnO1xyXG4gIGxldmVsVHdvSWQ6IGFueSA9ICcnO1xyXG4gIGxldmVsVGhyZWVJZDogYW55ID0gJyc7XHJcbiAgbGV2ZWxGb3VySWQ6IGFueSA9ICcnO1xyXG4gIGRpc2FibGVQcmljZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgY2hlY2tTdWJtaXNzaW9uU3RhdHVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudFBhZ2U6IHN0cmluZyA9ICdzZWxlY3QtcHJvZHVjdHMnO1xyXG4gIGlzVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNEaXNhYmxlZDI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRGlzYWJsZWQzOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0Rpc2FibGVkNDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNQcmljZURpc2FibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGFjdGl2ZUZpbHRlcnNDb3VudDogbnVtYmVyID0gMDtcclxuICBlbXB0eUltYWdlOiBzdHJpbmcgPSAnL2kvdGFibGUtZ3JpZC1lbXB0eS1zdGF0ZS5zdmcnO1xyXG4gIGdldFRvdGFsUmVjb3JkczogbnVtYmVyID0gMDtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBtYXREaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxBZGRPblByb2R1Y3RzQ29tcG9uZW50PixcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBkYXRhOiBhbnksXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGNvbW1vblNldmljZTogQ29tbW9uU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5zaG93Q2F0ZWdvcnkgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd0RpYWxvZ0NhdGVnb3J5O1xyXG4gICAgdGhpcy5zaG93U3ViY2F0ZWdvcnkgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd0RpYWxvZ1N1YkNhdGVnb3J5O1xyXG4gICAgdGhpcy5zaG93UHJpY2UgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd0RpYWxvZ1ByaWNlO1xyXG4gICAgdGhpcy5zaG93UXVhbnRpdHkgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd0RpYWxvZ1F1YW50aXR5O1xyXG4gICAgdGhpcy5zaG93U2t1TnVtYmVyID0gZGF0YS5kcm9wZG93bnNGbGFnLnNob3dEaWFsb2dTa3VOdW1iZXI7XHJcbiAgICB0aGlzLnNob3dJbnZlbnRvcnkgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd0RpYWxvZ0ludmVudG9yeTtcclxuICAgIHRoaXMuc2hvd05ld1Byb2R1Y3RQaWNrZXIgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd05ld1Byb2R1Y3RQaWNrZXI7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDEgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MMTtcclxuICAgIHRoaXMuZHJvcGRvd25MMiA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkwyO1xyXG4gICAgdGhpcy5kcm9wZG93bkwzID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDM7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDQgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MNDtcclxuICAgIHRoaXMuZHJvcGRvd25MMUxhYmVsID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDFMYWJlbDtcclxuICAgIHRoaXMuZHJvcGRvd25MMkxhYmVsID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDJMYWJlbDtcclxuICAgIHRoaXMuZHJvcGRvd25MM0xhYmVsID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDNMYWJlbDtcclxuICAgIHRoaXMuZHJvcGRvd25MNExhYmVsID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDRMYWJlbDtcclxuICAgIHRoaXMuY2hlY2tTdWJtaXNzaW9uU3RhdHVzID0gZGF0YS5kcm9wZG93bnNGbGFnLmNoZWNrU3VibWlzc2lvblN0YXR1cztcclxuICAgIHRoaXMuZHJvcERvd25Db3VudCA9IHRoaXMuY291bnRUcnVlRHJvcGRvd25zKGRhdGEuZHJvcGRvd25zRmxhZyk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxQcm9kdWN0Pih0cnVlLCBkYXRhLnNlbGVjdGVkUHJvZHVjdHMgfHwgW10pO1xyXG4gICAgdGhpcy5pc1ByaWNlRGlzYWJsZSA9IGRhdGEuZHJvcGRvd25zRmxhZy5wcmljZURpc2FibGU7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NhdGVnb3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdjYXRlZ29yeU5hbWUnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93UHJpY2UpIHtcclxuICAgICAgdGhpcy5yZW1vdmVDb2x1bW4oJ3ByaWNlJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc2hvd1N1YmNhdGVnb3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdzdWJDYXRlZ29yeScpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dRdWFudGl0eSkge1xyXG4gICAgICB0aGlzLnJlbW92ZUNvbHVtbignUXVhbnRpdHknKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93U2t1TnVtYmVyKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdza3VOdW1iZXInKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93SW52ZW50b3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdpbnZlbnRvcnknKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2hvd0FsbHByb2R1Y3RzQ29sdW1ucyA9IHRoaXMuc2hvd0FsbHByb2R1Y3RzQ29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbiAhPT0gY29sdW1uTmFtZSk7XHJcbiAgICB0aGlzLmFkZFByb2R1Y3RzQ29sdW1ucyA9IHRoaXMuYWRkUHJvZHVjdHNDb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uICE9PSBjb2x1bW5OYW1lKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVGb3JtQXJyYXkoKSB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdzZWxlY3RlZFByb2R1Y3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgaWYgKCFzZWxlY3RlZFByb2R1Y3RzQXJyYXkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignc2VsZWN0ZWRQcm9kdWN0cyBGb3JtQXJyYXkgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQuZm9yRWFjaChwcm9kdWN0ID0+IHtcclxuICAgICAgc2VsZWN0ZWRQcm9kdWN0c0FycmF5LnB1c2godGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgcHJpY2U6IFtwcm9kdWN0Py5wcmljZSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgdGV4dDogW3Byb2R1Y3Q/LnRleHQgfHwgJyddLFxyXG4gICAgICAgIHF1YW50aXR5OiBbcHJvZHVjdC5xdWFudGl0eSB8fCAnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgY2F0ZWdvcnk6IFtwcm9kdWN0Py5jYXRlZ29yeSB8fCAnJ10sXHJcbiAgICAgICAgc3ViQ2F0ZWdvcnk6IFtwcm9kdWN0Py5zdWJDYXRlZ29yeSB8fCAnJ10sXHJcbiAgICAgICAgdmFsdWU6IFtwcm9kdWN0Py52YWx1ZSB8fCAnJ10sXHJcbiAgICAgICAgb3RoZXJJbmZvcm1hdGlvbjA6IFtwcm9kdWN0Py5vdGhlckluZm9ybWF0aW9uMCB8fCAnJ10sXHJcbiAgICAgICAgb3RoZXJJbmZvcm1hdGlvbjE6IFtwcm9kdWN0Py5vdGhlckluZm9ybWF0aW9uMSB8fCAnJ11cclxuICAgICAgfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgc2VsZWN0ZWRQcm9kdWN0c0FycmF5LmNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICAgIHRoaXMuaXNQcmljZURpc2FibGUgPyBjb250cm9sLmdldCgncHJpY2UnKT8uZGlzYWJsZSgpIDogY29udHJvbC5nZXQoJ3ByaWNlJyk/LmVuYWJsZSgpO1xyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRhU291cmNlLmRhdGEgPSBbLi4udGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRdO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZURhdGFTb3VyY2VzKCkge1xyXG4gICAgLy8gRGVidWdnaW5nIGxvZ3MgdG8gdHJhY2UgaXNzdWVzXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbj8uc2VsZWN0ZWQpICYmIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlPy5kYXRhKSAmJiB0aGlzLnNlbGVjdGlvbj8uc2VsZWN0ZWQ/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbj8uc2VsZWN0ZWQ/LmZvckVhY2goc2VsZWN0ZWRQcm9kdWN0ID0+IHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZpbmRJbmRleChwcm9kdWN0ID0+IHByb2R1Y3QudmFsdWUgPT09IHNlbGVjdGVkUHJvZHVjdC52YWx1ZSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhW2luZGV4XSA9IHNlbGVjdGVkUHJvZHVjdDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTm8gc2VsZWN0ZWQgcHJvZHVjdHMgZm91bmQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZHJvcGRvd25MZXZlbDE6IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IGZhbHNlIH1dLFxyXG4gICAgICBkcm9wZG93bkxldmVsMjogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgZHJvcGRvd25MZXZlbDM6IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgIGRyb3Bkb3duTGV2ZWw0OiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICBzZWFyY2hQcm9kdWN0TmFtZTogWycnXSxcclxuICAgICAgc2VsZWN0ZWRQcm9kdWN0czogdGhpcy5mYi5hcnJheShbXSlcclxuICAgIH0pO1xyXG4gICAgdGhpcy5pbml0aWFsaXplRm9ybUFycmF5KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25MMSkge1xyXG4gICAgICB0aGlzLmxvYWREcm9wZG93bkwxKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDEnKS52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKCcnKSxcclxuICAgICAgICBtYXAodmFsdWUgPT5cclxuICAgICAgICAgIHRoaXMuZmlsdGVyUHJvZHVjdHModmFsdWUsICdjYXRlZ29yeTEnKSlcclxuICAgICAgKS5zdWJzY3JpYmUobDEgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93bk9uZSA9IGwxO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJykudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN0YXJ0V2l0aCgnJyksXHJcbiAgICAgICAgbWFwKHZhbHVlID0+IHRoaXMuZmlsdGVyUHJvZHVjdHModmFsdWUsICdjYXRlZ29yeTInKSlcclxuICAgICAgKS5zdWJzY3JpYmUobDIgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93blR3byA9IGwyO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJykudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN0YXJ0V2l0aCgnJyksXHJcbiAgICAgICAgbWFwKHZhbHVlID0+IHRoaXMuZmlsdGVyUHJvZHVjdHModmFsdWUsICdjYXRlZ29yeTMnKSlcclxuICAgICAgKS5zdWJzY3JpYmUobDMgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93blRocmVlID0gbDM7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKS52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKCcnKSxcclxuICAgICAgICBtYXAodmFsdWUgPT4gdGhpcy5maWx0ZXJQcm9kdWN0cyh2YWx1ZSwgJ2NhdGVnb3J5NCcpKVxyXG4gICAgICApLnN1YnNjcmliZShsNCA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duRm91ciA9IGw0O1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZURyb3Bkb3duRmlsdGVyKCkge1xyXG4gICAgY29uc3Qgc2VhcmNoUXVlcnkgPSB0aGlzLmZvcm0uY29udHJvbHMuc2VhcmNoUHJvZHVjdE5hbWU/LnZhbHVlPy50cmltKCk7IC8vIFRyaW0gdG8gcmVtb3ZlIGJsYW5rIHNwYWNlc1xyXG4gICAgY29uc3QgbGV2ZWxPbmVJZCA9IHRoaXMuZm9ybS5jb250cm9scy5kcm9wZG93bkxldmVsMT8udmFsdWU/LmlkO1xyXG4gICAgdGhpcy5sb2FkaW5nRmxhZyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuZmlyc3RzY3JvbGxhYmxlRGl2KSB7XHJcbiAgICAgIHRoaXMuZmlyc3RzY3JvbGxhYmxlRGl2Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgIH1cclxuICAgIGlmICgoc2VhcmNoUXVlcnkgJiYgc2VhcmNoUXVlcnkgIT09ICcnKSB8fCAobGV2ZWxPbmVJZCAmJiBsZXZlbE9uZUlkICE9PSBudWxsICYmIGxldmVsT25lSWQgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgbGV0IHByb2R1Y3ROYW1lID0gdGhpcy5mb3JtLmNvbnRyb2xzLnNlYXJjaFByb2R1Y3ROYW1lPy52YWx1ZSB8fCAnJztcclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxlbmd0aCBleGNlZWRzIDEwMCBhbmQgdHJ1bmNhdGUgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIGlmIChwcm9kdWN0TmFtZT8ubGVuZ3RoID4gMTAwKSB7XHJcbiAgICAgICAgcHJvZHVjdE5hbWUgPSBwcm9kdWN0TmFtZS5zdWJzdHJpbmcoMCwgMTAwKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gcHJvZHVjdE5hbWU7XHJcbiAgICAgIHRoaXMubGV2ZWxPbmVJZCA9IHRoaXMuZm9ybS5jb250cm9scy5kcm9wZG93bkxldmVsMS52YWx1ZT8uaWQ7XHJcbiAgICAgIHRoaXMubGV2ZWxUd29JZCA9IHRoaXMuZm9ybS5jb250cm9scy5kcm9wZG93bkxldmVsMi52YWx1ZT8uaWQ7XHJcbiAgICAgIHRoaXMubGV2ZWxUaHJlZUlkID0gdGhpcy5mb3JtLmNvbnRyb2xzLmRyb3Bkb3duTGV2ZWwzLnZhbHVlPy5pZDtcclxuICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IHRoaXMuZm9ybS5jb250cm9scy5kcm9wZG93bkxldmVsNC52YWx1ZT8uaWQ7XHJcbiAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgbG9hZERyb3Bkb3duTDEoKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMuY29tbW9uU2V2aWNlLnByb2R1Y3RMZXZlbE9uZSgpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lckZsYWcgPSBmYWxzZVxyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bk9uZSA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duT25lID0gdGhpcy5maWx0ZXJQcm9kdWN0cygnJywgJ2NhdGVnb3J5MScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWREcm9wZG93bkwyKGxldmVsT25lSWQ6IGFueSkge1xyXG4gICAgdGhpcy5zcGlubmVyRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLmNvbW1vblNldmljZS5wcm9kdWN0TGV2ZWxUd28obGV2ZWxPbmVJZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyRmxhZyA9IGZhbHNlXHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duVHdvID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Ud28gPSB0aGlzLmZpbHRlclByb2R1Y3RzKCcnLCAnY2F0ZWdvcnkyJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZERyb3Bkb3duTDMobGV2ZWxPbmVJZDogYW55LCBsZXZlbFR3b0lkOiBhbnkpIHtcclxuICAgIHRoaXMuc3Bpbm5lckZsYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb21tb25TZXZpY2UucHJvZHVjdExldmVsVGhyZWUobGV2ZWxPbmVJZCwgbGV2ZWxUd29JZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyRmxhZyA9IGZhbHNlXHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duVGhyZWUgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93blRocmVlID0gdGhpcy5maWx0ZXJQcm9kdWN0cygnJywgJ2NhdGVnb3J5MycpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWREcm9wZG93bkw0KGxldmVsT25lSWQ6IGFueSwgbGV2ZWxUd29JZDogYW55LCBsZXZlbFRocmVlSWQ6IGFueSkge1xyXG4gICAgdGhpcy5zcGlubmVyRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLmNvbW1vblNldmljZS5wcm9kdWN0TGV2ZWxGb3VyKGxldmVsT25lSWQsIGxldmVsVHdvSWQsIGxldmVsVGhyZWVJZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyRmxhZyA9IGZhbHNlXHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duRm91ciA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duRm91ciA9IHRoaXMuZmlsdGVyUHJvZHVjdHMoJycsICdjYXRlZ29yeTQnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZmlsdGVyUHJvZHVjdHModmFsdWU6IHN0cmluZywgY2F0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZT8udG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xyXG4gICAgbGV0IGRhdGE6IHN0cmluZ1tdO1xyXG5cclxuICAgIC8qRHluYW1pY2FsbHkgYXNzaWduIHRoZSBkYXRhIGFycmF5IGJhc2VkIG9uIHRoZSBjYXRlZ29yeSovXHJcbiAgICBzd2l0Y2ggKGNhdCkge1xyXG4gICAgICBjYXNlICdjYXRlZ29yeTEnOlxyXG4gICAgICAgIGRhdGEgPSB0aGlzLmRyb3Bkb3duT25lO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjYXRlZ29yeTInOlxyXG4gICAgICAgIGRhdGEgPSB0aGlzLmRyb3Bkb3duVHdvO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjYXRlZ29yeTMnOlxyXG4gICAgICAgIGRhdGEgPSB0aGlzLmRyb3Bkb3duVGhyZWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5NCc6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMuZHJvcGRvd25Gb3VyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGRhdGEgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZpbHRlclZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRhdGE/LmZpbHRlcihvcHRpb24gPT4gb3B0aW9uWyduYW1lJ10/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBvblN1Ym1pdCgpIHtcclxuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcclxuICAgICAgdGhpcy5tYXREaWFsb2dSZWYuY2xvc2Uoe1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHN0YXR1czogdHJ1ZSxcclxuICAgICAgICAgIGl0ZW1zOiB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xyXG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcclxuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcclxuICB9XHJcblxyXG4gIGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xyXG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcclxuICAgIHJldHVybiBudW1TZWxlY3RlZCA+IDAgJiYgbnVtU2VsZWN0ZWQgPCBudW1Sb3dzO1xyXG4gIH1cclxuXHJcbiAgbWFzdGVyVG9nZ2xlKCkge1xyXG4gICAgdGhpcy5pc0FsbFNlbGVjdGVkKClcclxuICAgICAgPyB0aGlzLnNlbGVjdGlvbi5jbGVhcigpXHJcbiAgICAgIDogdGhpcy5kYXRhU291cmNlLmRhdGEuZm9yRWFjaChyb3cgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdykpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZFByb2R1Y3RzKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWxlY3Rpb24ocm93OiBQcm9kdWN0KSB7XHJcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvZHVjdCBpcyBhbHJlYWR5IHNlbGVjdGVkXHJcbiAgICBjb25zdCBhbHJlYWR5U2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5zb21lKHNlbGVjdGVkID0+IHNlbGVjdGVkLnZhbHVlID09PSByb3cudmFsdWUpO1xyXG4gICAgaWYgKGFscmVhZHlTZWxlY3RlZCkge1xyXG4gICAgICAvLyBJZiB0aGUgcHJvZHVjdCBpcyBhbHJlYWR5IHNlbGVjdGVkLCBkZXNlbGVjdCBpdFxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdChyb3cpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm90IGFscmVhZHkgc2VsZWN0ZWQsIHNlbGVjdCBpdFxyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KTtcclxuICAgIH1cclxuICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCBwcm9kdWN0cyB0byBlbnN1cmUgbm8gZHVwbGljYXRlc1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZFByb2R1Y3RzKCk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8vIEdldHRlciBmb3IgdGhlIEZvcm1BcnJheVxyXG4gIGdldCBzZWxlY3RlZFByb2R1Y3RzKCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldCgnc2VsZWN0ZWRQcm9kdWN0cycpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdGVkUHJvZHVjdHMoKSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCkpIHtcclxuICAgICAgLy8gRGVkdXBsaWNhdGUgc2VsZWN0ZWQgcHJvZHVjdHNcclxuICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSBBcnJheS5mcm9tKFxyXG4gICAgICAgIG5ldyBNYXAodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubWFwKHByb2R1Y3QgPT4gW3Byb2R1Y3QudmFsdWUsIHByb2R1Y3RdKSkudmFsdWVzKClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgdW5pcXVlUHJvZHVjdHMuZm9yRWFjaChwcm9kdWN0ID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChwcm9kdWN0KSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkXTtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0c0FycmF5ID0gdGhpcy5zZWxlY3RlZFByb2R1Y3RzO1xyXG4gICAgICBzZWxlY3RlZFByb2R1Y3RzQXJyYXkuY2xlYXIoKTtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24/LnNlbGVjdGVkPy5mb3JFYWNoKChwcm9kdWN0LCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGlmICghcHJvZHVjdD8udmFsdWUpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb2R1Y3QgdmFsdWUgKFNLVSkgaXMgbWlzc2luZyBhdCBpbmRleDonLCBpbmRleCwgcHJvZHVjdCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHByb2R1Y3RGb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgIHByaWNlOiBbcHJvZHVjdD8ucHJpY2UgPz8gJycsIHRoaXMuc2hvd1ByaWNlID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFtdXSxcclxuICAgICAgICAgIHRleHQ6IFtwcm9kdWN0Py50ZXh0IHx8ICcnXSxcclxuICAgICAgICAgIHF1YW50aXR5OiBbcHJvZHVjdD8ucXVhbnRpdHkgPz8gJycsIHRoaXMuc2hvd1F1YW50aXR5ID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFtdXSxcclxuICAgICAgICAgIGNhdGVnb3J5OiBbcHJvZHVjdD8uY2F0ZWdvcnkgfHwgJyddLFxyXG4gICAgICAgICAgc3ViQ2F0ZWdvcnk6IFtwcm9kdWN0Py5zdWJDYXRlZ29yeSB8fCAnJ10sXHJcbiAgICAgICAgICB2YWx1ZTogW3Byb2R1Y3Q/LnZhbHVlIHx8ICcnXSxcclxuICAgICAgICAgIG90aGVySW5mb3JtYXRpb24wOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjAgfHwgJyddLFxyXG4gICAgICAgICAgb3RoZXJJbmZvcm1hdGlvbjE6IFtwcm9kdWN0Py5vdGhlckluZm9ybWF0aW9uMSB8fCAnJ11cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocHJvZHVjdEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0c0FycmF5LnB1c2gocHJvZHVjdEZvcm1Hcm91cCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgRm9ybUdyb3VwIGZvciBwcm9kdWN0IGF0IGluZGV4ICR7aW5kZXh9LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICBjb25zdCBwcmljZUNvbnRyb2wgPSBjb250cm9sLmdldCgncHJpY2UnKTtcclxuICAgICAgICAgIGlmIChwcmljZUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1ByaWNlRGlzYWJsZSA/IHByaWNlQ29udHJvbC5kaXNhYmxlKCkgOiBwcmljZUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcmljZSBjb250cm9sIGlzIG1pc3NpbmcgaW4gRm9ybUdyb3VwIGF0IGluZGV4ICR7aW5kZXh9LmApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGNvbnRyb2wgdHlwZSBhdCBpbmRleCAke2luZGV4fTpgLCBjb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignU2VsZWN0aW9uLnNlbGVjdGVkIGlzIG5vdCBhbiBhcnJheTonLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0VG90YWxSb3dzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRSb3dzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBhbnksIGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIGxldCBzZWxlY3RlZFZhbHVlO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50Lm9wdGlvbiAmJiBldmVudC5vcHRpb24udmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBzZWxlY3RlZFZhbHVlID0gZXZlbnQub3B0aW9uLnZhbHVlLmlkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGV2ZW50O1xyXG4gICAgfVxyXG4gICAgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkxJykge1xyXG4gICAgICB0aGlzLmxldmVsT25lSWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Ud28gPSBbXTtcclxuICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duVGhyZWUgPSBbXTtcclxuICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duRm91ciA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5kcm9wZG93bkwyICYmIHRoaXMubGV2ZWxPbmVJZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkMiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9hZERyb3Bkb3duTDIodGhpcy5sZXZlbE9uZUlkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICB0aGlzLmxldmVsT25lSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxUd29JZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxGb3VySWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTInKSB7XHJcbiAgICAgIHRoaXMubGV2ZWxUd29JZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93blRocmVlID0gW107XHJcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duTDMgJiYgdGhpcy5sZXZlbE9uZUlkICYmIHRoaXMubGV2ZWxUd29JZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2FkRHJvcGRvd25MMyh0aGlzLmxldmVsT25lSWQsIHRoaXMubGV2ZWxUd29JZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5sZXZlbFR3b0lkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxldmVsVGhyZWVJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkMyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkNCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IDIwO1xyXG4gICAgICB0aGlzLmdldFByb2R1Y3RzKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5MycpIHtcclxuICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Gb3VyID0gW107XHJcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duTDQgJiYgdGhpcy5sZXZlbE9uZUlkICYmIHRoaXMubGV2ZWxUd29JZCAmJiB0aGlzLmxldmVsVGhyZWVJZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvYWREcm9wZG93bkw0KHRoaXMubGV2ZWxPbmVJZCwgdGhpcy5sZXZlbFR3b0lkLCB0aGlzLmxldmVsVGhyZWVJZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxGb3VySWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTQnKSB7XHJcbiAgICAgIHRoaXMubGV2ZWxGb3VySWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMjA7XHJcbiAgICAgIHRoaXMuZ2V0UHJvZHVjdHMoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXJzQ291bnQoKTtcclxuICB9XHJcblxyXG4gIGdldFByb2R1Y3RzKGZsYWc6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc3Bpbm5lckZsYWcgPSB0cnVlO1xyXG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hRdWVyeTtcclxuICAgIGNvbnN0IGxldmVsT25lSWQgPSB0aGlzLmxldmVsT25lSWQgPyB0aGlzLmxldmVsT25lSWQgOiAwO1xyXG4gICAgY29uc3QgbGV2ZWxUd29JZCA9IHRoaXMubGV2ZWxUd29JZCA/IHRoaXMubGV2ZWxUd29JZCA6IDA7XHJcbiAgICBjb25zdCBsZXZlbFRocmVlSWQgPSB0aGlzLmxldmVsVGhyZWVJZCA/IHRoaXMubGV2ZWxUaHJlZUlkIDogMDtcclxuICAgIGNvbnN0IGxldmVsRm91cklkID0gdGhpcy5sZXZlbEZvdXJJZCA/IHRoaXMubGV2ZWxGb3VySWQgOiAwO1xyXG4gICAgaWYgKHRoaXMuc2hvdWxkUmVzZXRUYWJsZShzZWFyY2gsIGxldmVsT25lSWQsIGxldmVsVHdvSWQsIGxldmVsVGhyZWVJZCwgbGV2ZWxGb3VySWQpKSB7XHJcbiAgICAgIHRoaXMucmVzZXRUYWJsZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbW1vblNldmljZS5sb2FkUHJvZHVjdHModGhpcy5wYWdlTnVtYmVyLCB0aGlzLnBhZ2VTaXplLCBzZWFyY2gsIHRydWUsIGZhbHNlLCBsZXZlbE9uZUlkLCBsZXZlbFR3b0lkLCBsZXZlbFRocmVlSWQsIGxldmVsRm91cklkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJGbGFnID0gZmFsc2U7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLnRvdGFsUGFnZXMgPSByZXNwb25zZT8uZGF0YT8udG90YWxQYWdlcztcclxuICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UuZGF0YS5kYXRhU291cmNlO1xyXG4gICAgICAgIHRoaXMuZ2V0VG90YWxSZWNvcmRzID0gcmVzcG9uc2UuZGF0YS50b3RhbFJlY29yZHNcclxuICAgICAgICAvLyBTeW5jIHNlbGVjdGlvbiBzdGF0ZSB3aXRoIG5ldyBkYXRhXHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKHByb2R1Y3QgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdQcm9kdWN0ID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQuZmluZChwID0+IHAudmFsdWUgPT09IHByb2R1Y3QudmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nUHJvZHVjdCkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb2R1Y3QsIGV4aXN0aW5nUHJvZHVjdCk7IC8vIFJlcGxhY2UgcHJvZHVjdCB3aXRoIGV4aXN0aW5nIHJlZmVyZW5jZVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QocHJvZHVjdCk7IC8vIE1hcmsgYXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFByb2R1Y3RzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEF2b2lkIGR1cGxpY2F0ZXMgaW4gdGhlIGRhdGFTb3VyY2VcclxuICAgICAgICBjb25zdCBleGlzdGluZ1Byb2R1Y3RWYWx1ZXMgPSBuZXcgU2V0KHRoaXMuZGF0YVNvdXJjZS5kYXRhLm1hcChwcm9kdWN0ID0+IHByb2R1Y3QudmFsdWUpKTtcclxuICAgICAgICBjb25zdCB1bmlxdWVOZXdEYXRhID0gZGF0YS5maWx0ZXIocHJvZHVjdCA9PiAhZXhpc3RpbmdQcm9kdWN0VmFsdWVzLmhhcyhwcm9kdWN0LnZhbHVlKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA+IDAgJiYgZmxhZykge1xyXG4gICAgICAgICAgLy8gZGF0YS5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5kYXRhU291cmNlLmRhdGEucHVzaChpdGVtKSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLmRhdGFTb3VyY2UuZGF0YSwgLi4udW5pcXVlTmV3RGF0YV07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGluZ0ZsYWcgPSB0cnVlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbWlkZGxlUG9zaXRpb24gPSB0aGlzLnRyYWNrSGVpZ2h0IC8gMiAtIDUwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmlyc3RzY3JvbGxhYmxlRGl2ICYmIHRoaXMuZmlyc3RzY3JvbGxhYmxlRGl2Lm5hdGl2ZUVsZW1lbnQgJiYgZmxhZykge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0c2Nyb2xsYWJsZURpdi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHsgdG9wOiBtaWRkbGVQb3NpdGlvbiwgYmVoYXZpb3I6ICdhdXRvJyB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAyNTApO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFTb3VyY2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUm93KGV2ZW50OiBFdmVudCwgZWxlbWVudDogUHJvZHVjdCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgbGV0IG1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHByb2R1Y3Q/JztcclxuICAgIGxldCBzaG93QnV0dG9uID0gdHJ1ZTtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuZGF0YS5pbmRleE9mKGVsZW1lbnQpO1xyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhU291cmNlLmRhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmNoZWNrU3VibWlzc2lvblN0YXR1cykge1xyXG4gICAgICAgIG1lc3NhZ2UgPSAnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgcHJvZHVjdC4nO1xyXG4gICAgICAgIHNob3dCdXR0b24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICB3aWR0aDogJzkwJScsXHJcbiAgICAgICAgbWF4V2lkdGg6ICc0MDBweCcsXHJcbiAgICAgICAgZGF0YTogeyBtZXNzYWdlOiBtZXNzYWdlLCBidXR0b25TdGF0dXM6IHNob3dCdXR0b24gfVxyXG4gICAgICB9KTtcclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3QoZWxlbWVudCk7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdzZWxlY3RlZFByb2R1Y3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgY29uc3QgcHJvZHVjdEluZGV4ID0gc2VsZWN0ZWRQcm9kdWN0c0FycmF5LmNvbnRyb2xzLmZpbmRJbmRleChjb250cm9sID0+IGNvbnRyb2wudmFsdWUudmFsdWUgPT09IGVsZW1lbnQudmFsdWUpO1xyXG4gICAgICAgICAgaWYgKHByb2R1Y3RJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5yZW1vdmVBdChwcm9kdWN0SW5kZXgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblNjcm9sbChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnRyYWNrSGVpZ2h0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbEhlaWdodCAtIGV2ZW50LnRhcmdldC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBpZiAodGhpcy5sb2FkaW5nRmxhZyAmJiAoTWF0aC5mbG9vcihldmVudC50YXJnZXQuc2Nyb2xsVG9wIC8gdGhpcy50cmFja0hlaWdodCAqIDEwMCkgPiA1MCkpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nRmxhZyA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5wYWdlTnVtYmVyIDwgdGhpcy50b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgdGhpcy5wYWdlTnVtYmVyID0gdGhpcy5wYWdlTnVtYmVyICsgMTtcclxuICAgICAgICB0aGlzLmdldFByb2R1Y3RzKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ0ZsYWcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnByZXZTY3JvbGxQb3NpdGlvbiA9IGV2ZW50LnRhcmdldC5zY3JvbGxUb3A7XHJcbiAgfVxyXG5cclxuICBjb3VudFRydWVEcm9wZG93bnMob2JqKSB7XHJcbiAgICAvLyBEeW5hbWljYWxseSBmaW5kIGFsbCBrZXlzIHRoYXQgc3RhcnQgd2l0aCAnZHJvcGRvd25MJyBhbmQgYXJlIGJvb2xlYW4gKHRydWUvZmFsc2UpXHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxyXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnZHJvcGRvd25MJykgJiYgdHlwZW9mIG9ialtrZXldID09PSAnYm9vbGVhbicgJiYgb2JqW2tleV0gPT09IHRydWUpXHJcbiAgICAgIC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiBVc2UgdGhlIHByb3BlcnR5IHRoYXQgc2hvdWxkIGRpc3BsYXkgaW4gdGhlIGlucHV0IGZpZWxkICovXHJcbiAgZGlzcGxheUZuKG9wdGlvbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLm5hbWUgOiAnJztcclxuICB9XHJcblxyXG4gIG9uUXVhbnRpdHlDaGFuZ2UoZXZlbnQ6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBxdWFudGl0eUNvbnRyb2wgPSB0aGlzLnNlbGVjdGVkUHJvZHVjdHMuYXQoaW5kZXgpLmdldCgncXVhbnRpdHknKTtcclxuXHJcbiAgICBpZiAoIXF1YW50aXR5Q29udHJvbCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyBlcnJvcnNcclxuICAgIHF1YW50aXR5Q29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcblxyXG4gICAgLy8gSWYgdGhlIHZhbHVlIGlzIGVtcHR5LCBzZXQgJ3JlcXVpcmVkJyBlcnJvclxyXG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICBxdWFudGl0eUNvbnRyb2wuc2V0RXJyb3JzKHsgJ3JlcXVpcmVkJzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gMSwgc2V0ICdtaW4nIGVycm9yXHJcbiAgICBlbHNlIGlmIChOdW1iZXIodmFsdWUpIDwgMSkge1xyXG4gICAgICBxdWFudGl0eUNvbnRyb2wuc2V0RXJyb3JzKHsgJ21pbic6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IGFuIGludGVnZXIsIHNldCAncGF0dGVybicgZXJyb3JcclxuICAgIGVsc2UgaWYgKCEvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICBxdWFudGl0eUNvbnRyb2wuc2V0RXJyb3JzKHsgJ3BhdHRlcm4nOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ29Ub05leHRQYWdlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9ICdlZGl0LXNhdmUnO1xyXG4gIH1cclxuXHJcbiAgZ29Ub1ByZXZpb3VzUGFnZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnc2VsZWN0LXByb2R1Y3RzJztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oKSB7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9ICF0aGlzLmlzVmlzaWJsZTtcclxuICB9XHJcblxyXG4gIGNsZWFyRmllbGQoZmllbGQ6IHN0cmluZywgY2F0ZWdvcnk6IHN0cmluZywgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCBkcm9wZG93biByZW9wZW5cclxuICAgIHRoaXMuZm9ybS5nZXQoZmllbGQpPy5zZXRWYWx1ZShudWxsKTtcclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5MScpIHtcclxuICAgICAgdGhpcy5vbk9wdGlvblNlbGVjdGVkKG51bGwsICdjYXRlZ29yeTEnKTtcclxuICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTInKSB7XHJcbiAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChudWxsLCAnY2F0ZWdvcnkyJyk7XHJcbiAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkzJykge1xyXG4gICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0ZWQobnVsbCwgJ2NhdGVnb3J5MycpO1xyXG4gICAgfSBlbHNlIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5NCcpIHtcclxuICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IG51bGw7XHJcbiAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChudWxsLCAnY2F0ZWdvcnk0Jyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQsIGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGlucHV0VmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgaWYgKCFpbnB1dFZhbHVlKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGlucHV0IGlzIGNsZWFyZWRcclxuICAgICAgdGhpcy5jbGVhckZpZWxkKGBkcm9wZG93bkxldmVsJHt0aGlzLmdldERyb3Bkb3duTGV2ZWwoY2F0ZWdvcnkpfWAsIGNhdGVnb3J5LCBudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERyb3Bkb3duTGV2ZWwoY2F0ZWdvcnk6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBzd2l0Y2ggKGNhdGVnb3J5KSB7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5MSc6IHJldHVybiAxO1xyXG4gICAgICBjYXNlICdjYXRlZ29yeTInOiByZXR1cm4gMjtcclxuICAgICAgY2FzZSAnY2F0ZWdvcnkzJzogcmV0dXJuIDM7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5NCc6IHJldHVybiA0O1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpIHtcclxuICAgIHRoaXMuYWN0aXZlRmlsdGVyc0NvdW50ID0gMDtcclxuICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMScpLnZhbHVlKSB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCsrO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJykudmFsdWUpIHRoaXMuYWN0aXZlRmlsdGVyc0NvdW50Kys7XHJcbiAgICBpZiAodGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS52YWx1ZSkgdGhpcy5hY3RpdmVGaWx0ZXJzQ291bnQrKztcclxuICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnZhbHVlKSB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCsrO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJJZkVtcHR5KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1snc2VhcmNoUHJvZHVjdE5hbWUnXS5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcclxuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hRdWVyeTtcclxuICAgICAgY29uc3QgbGV2ZWxPbmVJZCA9IHRoaXMubGV2ZWxPbmVJZCA/IHRoaXMubGV2ZWxPbmVJZCA6IDA7XHJcbiAgICAgIGNvbnN0IGxldmVsVHdvSWQgPSB0aGlzLmxldmVsVHdvSWQgPyB0aGlzLmxldmVsVHdvSWQgOiAwO1xyXG4gICAgICBjb25zdCBsZXZlbFRocmVlSWQgPSB0aGlzLmxldmVsVGhyZWVJZCA/IHRoaXMubGV2ZWxUaHJlZUlkIDogMDtcclxuICAgICAgY29uc3QgbGV2ZWxGb3VySWQgPSB0aGlzLmxldmVsRm91cklkID8gdGhpcy5sZXZlbEZvdXJJZCA6IDA7XHJcbiAgICAgIGlmICh0aGlzLnNob3VsZFJlc2V0VGFibGUoc2VhcmNoLCBsZXZlbE9uZUlkLCBsZXZlbFR3b0lkLCBsZXZlbFRocmVlSWQsIGxldmVsRm91cklkKSkge1xyXG4gICAgICAgIHRoaXMucmVzZXRUYWJsZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRUYWJsZSgpIHtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwxJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmxldmVsT25lSWQgPSAwO1xyXG4gICAgdGhpcy5sZXZlbFR3b0lkID0gMDtcclxuICAgIHRoaXMubGV2ZWxUaHJlZUlkID0gMDtcclxuICAgIHRoaXMubGV2ZWxGb3VySWQgPSAwO1xyXG4gICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyc0NvdW50KCk7XHJcbiAgICBpZiAodGhpcy5zZWFyY2hRdWVyeSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbXTtcclxuICAgICAgdGhpcy5zcGlubmVyRmxhZyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG91bGRSZXNldFRhYmxlKHNlYXJjaDogc3RyaW5nLCBsZXZlbE9uZUlkOiBudW1iZXIsIGxldmVsVHdvSWQ6IG51bWJlciwgbGV2ZWxUaHJlZUlkOiBudW1iZXIsIGxldmVsRm91cklkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzZWFyY2ggPT09ICcnICYmIGxldmVsT25lSWQgPT09IDAgJiYgbGV2ZWxUd29JZCA9PT0gMCAmJiBsZXZlbFRocmVlSWQgPT09IDAgJiYgbGV2ZWxGb3VySWQgPT09IDA7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwic3Bpbm5lckZsYWdcIiBjbGFzcz1cIk92ZXJsYXlEaXZcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJPdmVybGF5RGl2Q29udGVudFwiPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwibWF0LWRpYWxvZy1oZWFkaW5nXCI+XHJcbiAgICA8aDEgbWF0LWRpYWxvZy10aXRsZT5BZGQgUHJvZHVjdHM8L2gxPlxyXG48L2Rpdj5cclxuXHJcbjxtYXQtZGlhbG9nLWNvbnRlbnQgW25nQ2xhc3NdPVwiZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID4gMCA/ICdwcm9kdWN0cy1zY3JvbGwtdmlzaWJsZSc6ICcnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWF0LWRpYWxvZy1jb250ZW50XCI+XHJcbiAgICAgICAgPCEtLVNlYXJjaCBTdGFydC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYXNpYy1zZWFyY2hcIiBbaGlkZGVuXT1cImN1cnJlbnRQYWdlICE9PSAnc2VsZWN0LXByb2R1Y3RzJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFzaWMtc2VhcmNoLXdycFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiB2aWV3Qm94PVwiMCAwIDI0IDI1XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSgwIDAgMClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS4yNSAyLjc1QzYuMTQxNTQgMi43NSAyIDYuODkwMjkgMiAxMS45OThDMiAxNy4xMDU2IDYuMTQxNTQgMjEuMjQ1OSAxMS4yNSAyMS4yNDU5QzEzLjUzMzUgMjEuMjQ1OSAxNS42MjM4IDIwLjQxODcgMTcuMjM3MyAxOS4wNDc1TDIwLjcxODIgMjIuNTI4N0MyMS4wMTEgMjIuODIxNiAyMS40ODU5IDIyLjgyMTcgMjEuNzc4OCAyMi41Mjg4QzIyLjA3MTcgMjIuMjM1OSAyMi4wNzE4IDIxLjc2MSAyMS43Nzg5IDIxLjQ2ODFMMTguMjk4MyAxNy45ODcyQzE5LjY3MTQgMTYuMzczNiAyMC41IDE0LjI4MjYgMjAuNSAxMS45OThDMjAuNSA2Ljg5MDI5IDE2LjM1ODUgMi43NSAxMS4yNSAyLjc1Wk0zLjUgMTEuOTk4QzMuNSA3LjcxOTA1IDYuOTY5NjIgNC4yNSAxMS4yNSA0LjI1QzE1LjUzMDQgNC4yNSAxOSA3LjcxOTA1IDE5IDExLjk5OEMxOSAxNi4yNzY5IDE1LjUzMDQgMTkuNzQ1OSAxMS4yNSAxOS43NDU5QzYuOTY5NjIgMTkuNzQ1OSAzLjUgMTYuMjc2OSAzLjUgMTEuOTk4WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1zZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cImhhbmRsZURyb3Bkb3duRmlsdGVyKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFByb2R1Y3RcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hQcm9kdWN0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2xlYXJJZkVtcHR5KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImFkdmZpbHRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhZHZcIiAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbigpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJ0dW5lXCI+dHVuZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjdGl2ZUZpbHRlcnNDb3VudCA+IDBcIiBjbGFzcz1cImN1c3RvbS1iYWRnZVwiPnt7IGFjdGl2ZUZpbHRlcnNDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZURyb3Bkb3duRmlsdGVyKCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlNlYXJjaDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tU2VhcmNoIEVuZC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXNlbGVjdG9yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgW2hpZGRlbl09XCJjdXJyZW50UGFnZSAhPT0gJ3NlbGVjdC1wcm9kdWN0cydcIj5cclxuICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXNlbGVjdGlvbi1jb250YWluZXJcIiAqbmdJZj1cImlzVmlzaWJsZSAmJiBkcm9wZG93bkwxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1zZWxlY3Rpb25cIiAqbmdJZj1cImRyb3Bkb3duTDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZHJvcERvd25Db3VudCA9PT0gMSA/ICduby1jaGlsZCc6ICdjaGlsZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtYWR2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkFkdmFuY2VkIEZpbHRlcnM8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjbHItYWxsLXBpY2tlclwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXRUYWJsZSgpXCIgKm5nSWY9XCJhY3RpdmVGaWx0ZXJzQ291bnQgPiAwXCI+Q2xlYXIgQWxsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJkcm9wZG93bkwxXCIgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2Ryb3Bkb3duTDFMYWJlbH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRyb3Bkb3duTGV2ZWwxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0bzNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50LCAnY2F0ZWdvcnkxJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiICNhdXRvMz1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQsICdjYXRlZ29yeTEnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZERyb3Bkb3duT25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKm5nSWY9XCJmb3JtLmdldCgnZHJvcGRvd25MZXZlbDEnKS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZCgnZHJvcGRvd25MZXZlbDEnLCAnY2F0ZWdvcnkxJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25jbG9zZVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbmRyb3Bkb3duXCIgbWF0U3VmZml4PmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZHJvcGRvd25MMlwiIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tkcm9wZG93bkwyTGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkcm9wZG93bkxldmVsMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG80XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudCwgJ2NhdGVnb3J5MicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIiAjYXV0bzQ9XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LCAnY2F0ZWdvcnkyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWREcm9wZG93blR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4ICpuZ0lmPVwiZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJykudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmllbGQoJ2Ryb3Bkb3duTGV2ZWwyJywgJ2NhdGVnb3J5MicsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uY2xvc2VcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb25kcm9wZG93blwiIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZC1pY29uJzogaXNEaXNhYmxlZDJ9XCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZHJvcGRvd25MM1wiIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tkcm9wZG93bkwzTGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkcm9wZG93bkxldmVsM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG81XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudCwgJ2NhdGVnb3J5MycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIiAjYXV0bzU9XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LCAnY2F0ZWdvcnkzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWREcm9wZG93blRocmVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKm5nSWY9XCJmb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZCgnZHJvcGRvd25MZXZlbDMnLCAnY2F0ZWdvcnkzJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25jbG9zZVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbmRyb3Bkb3duXCIgbWF0U3VmZml4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGUtaWNvbic6IGlzRGlzYWJsZWQzfVwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZHJvcGRvd25MNFwiIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tkcm9wZG93bkw0TGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkcm9wZG93bkxldmVsNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG82XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudCwgJ2NhdGVnb3J5NCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIiAjYXV0bzY9XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LCAnY2F0ZWdvcnk0JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWREcm9wZG93bkZvdXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCAqbmdJZj1cImZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpZWxkKCdkcm9wZG93bkxldmVsNCcsICdjYXRlZ29yeTQnLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbmNsb3NlXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uZHJvcGRvd25cIiBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1pY29uJzogaXNEaXNhYmxlZDR9XCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgI2ZpcnN0c2Nyb2xsYWJsZURpdiBpZD1cImZpcnN0c2Nyb2xsYWJsZURpdlwiIGNsYXNzPVwibmV3LWNsYXNzIGZpcnN0LWRpdlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50KVwiIFtuZ0NsYXNzXT1cImRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA+IDAgPyAndGJsLXJlY29yZC1mb3VuZCc6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIGNsYXNzPVwibWF0LXRhYmxlIGFiY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGFTb3VyY2UgJiYgZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID4gMDsgZWxzZSBub0RhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gdG9nZ2xlU2VsZWN0aW9uKHJvdykgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInByb2R1Y3ROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gUHJvZHVjdCBOYW1lIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py50ZXh0fX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJza3VOdW1iZXJcIiAqbmdJZj1cInNob3dTa3VOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBTS1UgTnVtYmVyIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py5vdGhlckluZm9ybWF0aW9uMH19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW52ZW50b3J5XCIgKm5nSWY9XCJzaG93SW52ZW50b3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gSW52ZW50b3J5IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py5vdGhlckluZm9ybWF0aW9uMX19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiYWRkUHJvZHVjdHNDb2x1bW5zXCI+PC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBhZGRQcm9kdWN0c0NvbHVtbnM7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3RvZ2dsZVNlbGVjdGlvbihyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1ObyBkYXRhIGZvdW5kLi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcC1lbXB0eS1zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWVtcHR5LXN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZW1wdHlJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPk5vIHJlY29yZHMgdG8gc2hvdyBhdCB0aGUgbW9tZW50PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIG1vZGlmeSB5b3VyIHNlYXJjaCBjcml0ZXJpYSB0byBmaW5kIHRoZSBkZXNpcmVkIHJlc3VsdDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LXN1bW1hcnlcIiAqbmdJZj1cImRhdGFTb3VyY2UgJiYgZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlNlbGVjdGVkOiA8c3Ryb25nPnt7IGdldFNlbGVjdGVkUm93c0NvdW50KCkgfX08L3N0cm9uZz4gPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+VG90YWwgUmVjb3JkczogPHN0cm9uZz57eyBnZXRUb3RhbFJlY29yZHMgfX08L3N0cm9uZz48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiY3VycmVudFBhZ2UgIT09ICdlZGl0LXNhdmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmV3LWNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWREYXRhU291cmNlICYmIHNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA+IDAgPyAnYWRkZWQtcHJvZHVjdHMnOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInNlbGVjdGVkRGF0YVNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRGF0YVNvdXJjZSAmJiBzZWxlY3RlZERhdGFTb3VyY2UuZGF0YS5sZW5ndGggPiAwOyBlbHNlIHNob3dCbGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZWxldGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlbGV0ZS1idG4tcGlja2VyXCIgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZW1vdmVSb3coJGV2ZW50LCBlbGVtZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiUmVtb3ZlIHJvd1wiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicHJvZHVjdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBQcm9kdWN0IE5hbWUgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQudGV4dH19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY2F0ZWdvcnlOYW1lXCIgKm5nSWY9XCJzaG93Q2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBDYXRlZ29yeSBOYW1lIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LmNhdGVnb3J5fX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdWJDYXRlZ29yeVwiICpuZ0lmPVwic2hvd1N1YmNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5TdWIgQ2F0ZWdvcnkgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQuc3ViQ2F0ZWdvcnl9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInByaWNlXCIgKm5nSWY9XCJzaG93UHJpY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlByaWNlPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGggc2VsZWN0LXByaWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlByaWNlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdwcmljZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlBsZWFzZSBlbnRlciBwcmljZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdwcmljZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpY2UgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiUXVhbnRpdHlcIiAqbmdJZj1cInNob3dRdWFudGl0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFF1YW50aXR5IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlF1YW50aXR5PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdxdWFudGl0eScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIHN0ZXA9XCIxXCIgKGlucHV0KT1cIm9uUXVhbnRpdHlDaGFuZ2UoJGV2ZW50LCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdxdWFudGl0eScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3F1YW50aXR5JykuaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbnRpdHkgY2FuIG5vdCBiZSBsZXNzIHRoYW4gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3F1YW50aXR5JykuaGFzRXJyb3IoJ3BhdHRlcm4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxzIG5vdCBhbGxvd2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNrdU51bWJlclwiICpuZ0lmPVwic2hvd1NrdU51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFNLVSBOdW1iZXIgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8ub3RoZXJJbmZvcm1hdGlvbjB9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImludmVudG9yeVwiICpuZ0lmPVwic2hvd0ludmVudG9yeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEludmVudG9yeSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50Py5vdGhlckluZm9ybWF0aW9uMX19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwic2hvd0FsbHByb2R1Y3RzQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogc2hvd0FsbHByb2R1Y3RzQ29sdW1ucztcIj48L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSAjc2hvd0JsYW5rPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGRhdGEgZm91bmQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0JsYW5rPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcC1lbXB0eS1zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWVtcHR5LXN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZW1wdHlJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPk5vIFByb2R1Y3QgYWRkZWQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGVhc2UgZ28gYmFjayBhbmQgc3RhcnQgYWRkaW5nIHByb2R1Y3RzPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWFjdGlvbi1zdGVwLW9uZVwiICpuZ0lmPVwiY3VycmVudFBhZ2UgPT09ICdzZWxlY3QtcHJvZHVjdHMnXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJnb1RvTmV4dFBhZ2UoKVwiIFtkaXNhYmxlZF09XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24+TmV4dDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJmYWxzZVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFicy1hY3Rpb25cIiAqbmdJZj1cImN1cnJlbnRQYWdlID09PSAnZWRpdC1zYXZlJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYWN0aW9uLXdycFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImdvVG9QcmV2aW91c1BhZ2UoKVwiPkJhY2s8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjb2xvcj1cInByaW1hcnlcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25TdWJtaXQoKVwiPkFkZDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
|
|
767
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW9uLXByb2R1Y3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZW5kZXItbWF0ZXJpYWwtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1vbi1wcm9kdWN0cy9hZGQtb24tcHJvZHVjdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlbmRlci1tYXRlcmlhbC1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvYWRkLW9uLXByb2R1Y3RzL2FkZC1vbi1wcm9kdWN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixTQUFTLEVBQWMsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQWUsU0FBUyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxlQUFlLEVBQTJCLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUVuRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NqRixNQUFNLE9BQU8sc0JBQXNCO0lBMEVqQyxZQUNTLFlBQWtELEVBQ2hDLElBQVMsRUFDMUIsRUFBZSxFQUNmLE1BQWlCLEVBQ2pCLFlBQTJCO1FBSjVCLGlCQUFZLEdBQVosWUFBWSxDQUFzQztR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RUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDOzRCQUN6RSxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQ3BELFVBQVUsQ0FBQyxtQkFBbUIsRUFBRTtnQ0FDOUIsT0FBTyxDQUFDLGdCQUFnQixDQUFDOzZCQUMxQixDQUFDOzRCQUNGLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRTtnQ0FDOUIsT0FBTyxDQUFDLGVBQWUsQ0FBQzs2QkFDekIsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIOzswQkE4RUUsTUFBTTsyQkFBQyxlQUFlOzBIQXhDUSxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybWF0aW9uLWRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24uc2VydmljZSc7XHJcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0IHtcclxuICBwcm9kdWN0TmFtZTogc3RyaW5nO1xyXG4gIHByb2R1Y3REZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIHF1YW50aXR5OiBhbnksXHJcbiAgcHJpY2U6IGFueSxcclxuICB0ZXh0OiBhbnksXHJcbiAgaWQ6IGFueSxcclxuICB2YWx1ZTogYW55LFxyXG4gIG90aGVySW5mb3JtYXRpb24wOiBhbnksXHJcbiAgb3RoZXJJbmZvcm1hdGlvbjE6IGFueSxcclxuICBvdGhlckluZm9ybWF0aW9uMjogYW55XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LW1hdC1hZGQtb24tcHJvZHVjdHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hZGQtb24tcHJvZHVjdHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FkZC1vbi1wcm9kdWN0cy5jb21wb25lbnQuY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignc2xpZGVEb3duJywgW1xyXG4gICAgICBzdGF0ZSgnaGlkZGVuJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnLCBvcGFjaXR5OiAwLCBvdmVyZmxvdzogJ2hpZGRlbicgfSkpLFxyXG4gICAgICBzdGF0ZSgndmlzaWJsZScsIHN0eWxlKHsgaGVpZ2h0OiAnKicsIG9wYWNpdHk6IDEgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIFtcclxuICAgICAgICBhbmltYXRlKCczMDBtcyBlYXNlLW91dCcpXHJcbiAgICAgIF0pLFxyXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIFtcclxuICAgICAgICBhbmltYXRlKCczMDBtcyBlYXNlLWluJylcclxuICAgICAgXSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQWRkT25Qcm9kdWN0c0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCB7XHJcbiAgZm9ybTogRm9ybUdyb3VwO1xyXG4gIGRyb3Bkb3duT25lOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGRyb3Bkb3duVHdvOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGRyb3Bkb3duVGhyZWU6IHN0cmluZ1tdID0gW107XHJcbiAgZHJvcGRvd25Gb3VyOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZpbHRlcmVkRHJvcGRvd25PbmU6IHN0cmluZ1tdID0gW107XHJcbiAgZmlsdGVyZWREcm9wZG93blR3bzogc3RyaW5nW10gPSBbXTtcclxuICBmaWx0ZXJlZERyb3Bkb3duVGhyZWU6IHN0cmluZ1tdID0gW107XHJcbiAgZmlsdGVyZWREcm9wZG93bkZvdXI6IHN0cmluZ1tdID0gW107XHJcbiAgYWRkUHJvZHVjdHNDb2x1bW5zOiBzdHJpbmdbXSA9IFsnc2VsZWN0JywgJ3Byb2R1Y3ROYW1lJywgJ3NrdU51bWJlcicsICdpbnZlbnRvcnknXTtcclxuICBzaG93QWxscHJvZHVjdHNDb2x1bW5zOiBzdHJpbmdbXSA9IFsnZGVsZXRlJywgJ3Byb2R1Y3ROYW1lJywgJ2NhdGVnb3J5TmFtZScsICdzdWJDYXRlZ29yeScsICdRdWFudGl0eScsICdwcmljZScsICdza3VOdW1iZXInLCAnaW52ZW50b3J5JywgJ2Nvc3QnXTtcclxuICBxdWFudGl0eUxpc3Q6IG51bWJlcltdID0gWzUsIDEwLCAxNSwgMjAsIDI1XTtcclxuICBFTEVNRU5UX0RBVEE6IFByb2R1Y3RbXSA9IFtdO1xyXG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPFByb2R1Y3Q+KCk7XHJcbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xyXG4gIHNlbGVjdGVkRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8UHJvZHVjdD4oW10pO1xyXG4gIHNlbGVjdGVkQ2F0ZWdvcnk6IGFueSA9IG51bGw7XHJcbiAgc2VsZWN0ZWRTdWJDYXRlZ29yeTogYW55ID0gbnVsbDtcclxuICBzaG93Q2F0ZWdvcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93U3ViY2F0ZWdvcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93UHJpY2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHNob3dRdWFudGl0eTogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd1NrdU51bWJlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dJbnZlbnRvcnk6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93TmV3UHJvZHVjdFBpY2tlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2V0Q2F0ZWdvcnk6IHN0cmluZyA9ICcnO1xyXG4gIHNldFN1YkNhdGVnb3J5OiBzdHJpbmcgPSAnJztcclxuICBsb2FkaW5nRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBhZ2VOdW1iZXIgPSAxO1xyXG4gIHBhZ2VTaXplID0gMjA7XHJcbiAgdG90YWxQYWdlcyA9IDA7XHJcbiAgc2VhcmNoUXVlcnkgPSAnJztcclxuICBpdGVtTGlzdDogYW55W10gPSBbXTtcclxuICB0cmFja0hlaWdodDogYW55O1xyXG4gIHByZXZTY3JvbGxQb3NpdGlvbiA9IDA7IC8vIFRyYWNrIHRoZSBwcmV2aW91cyBzY3JvbGwgcG9zaXRpb25cclxuICBAVmlld0NoaWxkKCdmaXJzdHNjcm9sbGFibGVEaXYnKSBmaXJzdHNjcm9sbGFibGVEaXY6IEVsZW1lbnRSZWY7XHJcbiAgc3Bpbm5lckZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bkwxOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZHJvcGRvd25MMjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duTDM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bkw0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZHJvcGRvd25MMUxhYmVsOiBzdHJpbmcgPSAnJztcclxuICBkcm9wZG93bkwyTGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIGRyb3Bkb3duTDNMYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgZHJvcGRvd25MNExhYmVsOiBzdHJpbmcgPSAnJztcclxuICBkcm9wRG93bkNvdW50OiBudW1iZXIgPSAwO1xyXG4gIGxldmVsT25lSWQ6IGFueSA9ICcnO1xyXG4gIGxldmVsVHdvSWQ6IGFueSA9ICcnO1xyXG4gIGxldmVsVGhyZWVJZDogYW55ID0gJyc7XHJcbiAgbGV2ZWxGb3VySWQ6IGFueSA9ICcnO1xyXG4gIGRpc2FibGVQcmljZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgY2hlY2tTdWJtaXNzaW9uU3RhdHVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudFBhZ2U6IHN0cmluZyA9ICdzZWxlY3QtcHJvZHVjdHMnO1xyXG4gIGlzVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNEaXNhYmxlZDI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRGlzYWJsZWQzOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0Rpc2FibGVkNDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNQcmljZURpc2FibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGFjdGl2ZUZpbHRlcnNDb3VudDogbnVtYmVyID0gMDtcclxuICBlbXB0eUltYWdlOiBzdHJpbmcgPSAnL2kvdGFibGUtZ3JpZC1lbXB0eS1zdGF0ZS5zdmcnO1xyXG4gIGdldFRvdGFsUmVjb3JkczogbnVtYmVyID0gMDtcclxuICBwcmljZUZpZWxkTGFibGU6IHN0cmluZyA9ICdQcmljZSc7XHJcbiAgdGFyZ2V0Q29zdDogc3RyaW5nID0gJ1lvdXIgVGFyZ2V0IENvc3QnO1xyXG4gIHNob3dDb3N0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2t1VHdlZWs6IHN0cmluZyA9ICdTS1UgTnVtYmVyJztcclxuICBjb3N0VHdlZWs6IHN0cmluZyA9ICdZb3VyIFRhcmdldCBDb3N0JztcclxuICBwcmljZVR3ZWVrOiBzdHJpbmcgPSAnUHJpY2UnO1xyXG4gIHByb2R1Y3RUd2Vlazogc3RyaW5nID0gJ1Byb2R1Y3QgTmFtZSc7XHJcbiAgcXVhbnRpdHlUd2Vlazogc3RyaW5nID0gJ1F1YW50aXR5JztcclxuICBjYXRlZ29yeVR3ZWVrOiBzdHJpbmcgPSAnQ2F0ZWdvcnkgTmFtZSc7XHJcbiAgc3ViQ2F0ZWdvcnlUd2Vlazogc3RyaW5nID0gJ1N1YiBDYXRlZ29yeSc7XHJcbiAgaW52ZW50b3J5VHdlZWs6IHN0cmluZyA9ICdJbnZlbnRvcnknO1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG1hdERpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFkZE9uUHJvZHVjdHNDb21wb25lbnQ+LFxyXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIGRhdGE6IGFueSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgY29tbW9uU2V2aWNlOiBDb21tb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNob3dDYXRlZ29yeSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nQ2F0ZWdvcnk7XHJcbiAgICB0aGlzLnNob3dTdWJjYXRlZ29yeSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nU3ViQ2F0ZWdvcnk7XHJcbiAgICB0aGlzLnNob3dQcmljZSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nUHJpY2U7XHJcbiAgICB0aGlzLnNob3dRdWFudGl0eSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nUXVhbnRpdHk7XHJcbiAgICB0aGlzLnNob3dTa3VOdW1iZXIgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd0RpYWxvZ1NrdU51bWJlcjtcclxuICAgIHRoaXMuc2hvd0ludmVudG9yeSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nSW52ZW50b3J5O1xyXG4gICAgdGhpcy5zaG93TmV3UHJvZHVjdFBpY2tlciA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93TmV3UHJvZHVjdFBpY2tlcjtcclxuICAgIHRoaXMuZHJvcGRvd25MMSA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkwxO1xyXG4gICAgdGhpcy5kcm9wZG93bkwyID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDI7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDMgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MMztcclxuICAgIHRoaXMuZHJvcGRvd25MNCA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkw0O1xyXG4gICAgdGhpcy5kcm9wZG93bkwxTGFiZWwgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MMUxhYmVsO1xyXG4gICAgdGhpcy5kcm9wZG93bkwyTGFiZWwgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MMkxhYmVsO1xyXG4gICAgdGhpcy5kcm9wZG93bkwzTGFiZWwgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MM0xhYmVsO1xyXG4gICAgdGhpcy5kcm9wZG93bkw0TGFiZWwgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MNExhYmVsO1xyXG4gICAgdGhpcy5jaGVja1N1Ym1pc3Npb25TdGF0dXMgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuY2hlY2tTdWJtaXNzaW9uU3RhdHVzO1xyXG4gICAgdGhpcy5kcm9wRG93bkNvdW50ID0gdGhpcy5jb3VudFRydWVEcm9wZG93bnMoZGF0YS5kcm9wZG93bnNGbGFnKTtcclxuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPFByb2R1Y3Q+KHRydWUsIGRhdGEuc2VsZWN0ZWRQcm9kdWN0cyB8fCBbXSk7XHJcbiAgICB0aGlzLmlzUHJpY2VEaXNhYmxlID0gZGF0YS5kcm9wZG93bnNGbGFnLnByaWNlRGlzYWJsZTtcclxuICAgIHRoaXMuc2t1VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LnNrdVR3ZWVrIHx8IFwiU0tVIE51bWJlclwiO1xyXG4gICAgdGhpcy5jb3N0VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LmNvc3RUd2VlayB8fCBcIllvdXIgVGFyZ2V0IENvc3RcIjtcclxuICAgIHRoaXMucHJpY2VUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8ucHJpY2VUd2VlayB8fCBcIlByaWNlXCI7XHJcbiAgICB0aGlzLnByb2R1Y3RUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8ucHJvZHVjdFR3ZWVrIHx8IFwiUHJvZHVjdCBOYW1lXCI7XHJcbiAgICB0aGlzLnF1YW50aXR5VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LnF1YW50aXR5VHdlZWsgfHwgXCJRdWFudGl0eVwiO1xyXG4gICAgdGhpcy5zaG93Q29zdCAgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd0RpYWxvZ0Nvc3Q7XHJcbiAgICB0aGlzLmNhdGVnb3J5VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LmNhdGVnb3J5VHdlZWsgfHwgXCJDYXRlZ29yeSBOYW1lXCI7XHJcbiAgICB0aGlzLnN1YkNhdGVnb3J5VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LnN1YkNhdGVnb3J5VHdlZWsgfHwgXCJTdWIgQ2F0ZWdvcnlcIjtcclxuICAgIHRoaXMuaW52ZW50b3J5VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LmludmVudG9yeVR3ZWVrIHx8IFwiSW52ZW50b3J5XCI7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NhdGVnb3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdjYXRlZ29yeU5hbWUnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93UHJpY2UpIHtcclxuICAgICAgdGhpcy5yZW1vdmVDb2x1bW4oJ3ByaWNlJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc2hvd1N1YmNhdGVnb3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdzdWJDYXRlZ29yeScpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dRdWFudGl0eSkge1xyXG4gICAgICB0aGlzLnJlbW92ZUNvbHVtbignUXVhbnRpdHknKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93U2t1TnVtYmVyKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdza3VOdW1iZXInKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93SW52ZW50b3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdpbnZlbnRvcnknKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93Q29zdCkge1xyXG4gICAgICB0aGlzLnJlbW92ZUNvbHVtbignc2t1TnVtYmVyJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVDb2x1bW4oY29sdW1uTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNob3dBbGxwcm9kdWN0c0NvbHVtbnMgPSB0aGlzLnNob3dBbGxwcm9kdWN0c0NvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4gIT09IGNvbHVtbk5hbWUpO1xyXG4gICAgdGhpcy5hZGRQcm9kdWN0c0NvbHVtbnMgPSB0aGlzLmFkZFByb2R1Y3RzQ29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbiAhPT0gY29sdW1uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybUFycmF5KCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0c0FycmF5ID0gdGhpcy5mb3JtLmdldCgnc2VsZWN0ZWRQcm9kdWN0cycpIGFzIEZvcm1BcnJheTtcclxuICAgIGlmICghc2VsZWN0ZWRQcm9kdWN0c0FycmF5KSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3NlbGVjdGVkUHJvZHVjdHMgRm9ybUFycmF5IG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2gocHJvZHVjdCA9PiB7XHJcbiAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIHByaWNlOiBbcHJvZHVjdD8ucHJpY2UgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIHRleHQ6IFtwcm9kdWN0Py50ZXh0IHx8ICcnXSxcclxuICAgICAgICBxdWFudGl0eTogW3Byb2R1Y3QucXVhbnRpdHkgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIGNhdGVnb3J5OiBbcHJvZHVjdD8uY2F0ZWdvcnkgfHwgJyddLFxyXG4gICAgICAgIHN1YkNhdGVnb3J5OiBbcHJvZHVjdD8uc3ViQ2F0ZWdvcnkgfHwgJyddLFxyXG4gICAgICAgIHZhbHVlOiBbcHJvZHVjdD8udmFsdWUgfHwgJyddLFxyXG4gICAgICAgIG90aGVySW5mb3JtYXRpb24wOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjAgfHwgJyddLFxyXG4gICAgICAgIG90aGVySW5mb3JtYXRpb24xOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjEgfHwgJyddLFxyXG4gICAgICAgIG90aGVySW5mb3JtYXRpb24yOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjIgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICAgIH0pKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5jb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xyXG4gICAgICB0aGlzLmlzUHJpY2VEaXNhYmxlID8gY29udHJvbC5nZXQoJ3ByaWNlJyk/LmRpc2FibGUoKSA6IGNvbnRyb2wuZ2V0KCdwcmljZScpPy5lbmFibGUoKTtcclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkXTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVEYXRhU291cmNlcygpIHtcclxuICAgIC8vIERlYnVnZ2luZyBsb2dzIHRvIHRyYWNlIGlzc3Vlc1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3Rpb24/LnNlbGVjdGVkKSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZT8uZGF0YSkgJiYgdGhpcy5zZWxlY3Rpb24/LnNlbGVjdGVkPy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24/LnNlbGVjdGVkPy5mb3JFYWNoKHNlbGVjdGVkUHJvZHVjdCA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5maW5kSW5kZXgocHJvZHVjdCA9PiBwcm9kdWN0LnZhbHVlID09PSBzZWxlY3RlZFByb2R1Y3QudmFsdWUpO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YVtpbmRleF0gPSBzZWxlY3RlZFByb2R1Y3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLnNlbGVjdGlvbi5zZWxlY3RlZF07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ05vIHNlbGVjdGVkIHByb2R1Y3RzIGZvdW5kLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGRyb3Bkb3duTGV2ZWwxOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiBmYWxzZSB9XSxcclxuICAgICAgZHJvcGRvd25MZXZlbDI6IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgIGRyb3Bkb3duTGV2ZWwzOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICBkcm9wZG93bkxldmVsNDogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgc2VhcmNoUHJvZHVjdE5hbWU6IFsnJ10sXHJcbiAgICAgIHNlbGVjdGVkUHJvZHVjdHM6IHRoaXMuZmIuYXJyYXkoW10pXHJcbiAgICB9KTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1BcnJheSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmRyb3Bkb3duTDEpIHtcclxuICAgICAgdGhpcy5sb2FkRHJvcGRvd25MMSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwxJykudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN0YXJ0V2l0aCgnJyksXHJcbiAgICAgICAgbWFwKHZhbHVlID0+XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclByb2R1Y3RzKHZhbHVlLCAnY2F0ZWdvcnkxJykpXHJcbiAgICAgICkuc3Vic2NyaWJlKGwxID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25PbmUgPSBsMTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICAgIG1hcCh2YWx1ZSA9PiB0aGlzLmZpbHRlclByb2R1Y3RzKHZhbHVlLCAnY2F0ZWdvcnkyJykpXHJcbiAgICAgICkuc3Vic2NyaWJlKGwyID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Ud28gPSBsMjtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICAgIG1hcCh2YWx1ZSA9PiB0aGlzLmZpbHRlclByb2R1Y3RzKHZhbHVlLCAnY2F0ZWdvcnkzJykpXHJcbiAgICAgICkuc3Vic2NyaWJlKGwzID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25UaHJlZSA9IGwzO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0JykudmFsdWVDaGFuZ2VzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN0YXJ0V2l0aCgnJyksXHJcbiAgICAgICAgbWFwKHZhbHVlID0+IHRoaXMuZmlsdGVyUHJvZHVjdHModmFsdWUsICdjYXRlZ29yeTQnKSlcclxuICAgICAgKS5zdWJzY3JpYmUobDQgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93bkZvdXIgPSBsNDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVEcm9wZG93bkZpbHRlcigpIHtcclxuICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gdGhpcy5mb3JtLmNvbnRyb2xzLnNlYXJjaFByb2R1Y3ROYW1lPy52YWx1ZT8udHJpbSgpOyAvLyBUcmltIHRvIHJlbW92ZSBibGFuayBzcGFjZXNcclxuICAgIGNvbnN0IGxldmVsT25lSWQgPSB0aGlzLmZvcm0uY29udHJvbHMuZHJvcGRvd25MZXZlbDE/LnZhbHVlPy5pZDtcclxuICAgIHRoaXMubG9hZGluZ0ZsYWcgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmZpcnN0c2Nyb2xsYWJsZURpdikge1xyXG4gICAgICB0aGlzLmZpcnN0c2Nyb2xsYWJsZURpdi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAoKHNlYXJjaFF1ZXJ5ICYmIHNlYXJjaFF1ZXJ5ICE9PSAnJykgfHwgKGxldmVsT25lSWQgJiYgbGV2ZWxPbmVJZCAhPT0gbnVsbCAmJiBsZXZlbE9uZUlkICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgIGxldCBwcm9kdWN0TmFtZSA9IHRoaXMuZm9ybS5jb250cm9scy5zZWFyY2hQcm9kdWN0TmFtZT8udmFsdWUgfHwgJyc7XHJcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBsZW5ndGggZXhjZWVkcyAxMDAgYW5kIHRydW5jYXRlIGlmIG5lY2Vzc2FyeVxyXG4gICAgICBpZiAocHJvZHVjdE5hbWU/Lmxlbmd0aCA+IDEwMCkge1xyXG4gICAgICAgIHByb2R1Y3ROYW1lID0gcHJvZHVjdE5hbWUuc3Vic3RyaW5nKDAsIDEwMCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9IHByb2R1Y3ROYW1lO1xyXG4gICAgICB0aGlzLmxldmVsT25lSWQgPSB0aGlzLmZvcm0uY29udHJvbHMuZHJvcGRvd25MZXZlbDEudmFsdWU/LmlkO1xyXG4gICAgICB0aGlzLmxldmVsVHdvSWQgPSB0aGlzLmZvcm0uY29udHJvbHMuZHJvcGRvd25MZXZlbDIudmFsdWU/LmlkO1xyXG4gICAgICB0aGlzLmxldmVsVGhyZWVJZCA9IHRoaXMuZm9ybS5jb250cm9scy5kcm9wZG93bkxldmVsMy52YWx1ZT8uaWQ7XHJcbiAgICAgIHRoaXMubGV2ZWxGb3VySWQgPSB0aGlzLmZvcm0uY29udHJvbHMuZHJvcGRvd25MZXZlbDQudmFsdWU/LmlkO1xyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMjA7XHJcbiAgICAgIHRoaXMuZ2V0UHJvZHVjdHMoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXJzQ291bnQoKTtcclxuICB9XHJcblxyXG4gIGxvYWREcm9wZG93bkwxKCkge1xyXG4gICAgdGhpcy5zcGlubmVyRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLmNvbW1vblNldmljZS5wcm9kdWN0TGV2ZWxPbmUoKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJGbGFnID0gZmFsc2VcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25PbmUgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93bk9uZSA9IHRoaXMuZmlsdGVyUHJvZHVjdHMoJycsICdjYXRlZ29yeTEnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkRHJvcGRvd25MMihsZXZlbE9uZUlkOiBhbnkpIHtcclxuICAgIHRoaXMuc3Bpbm5lckZsYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb21tb25TZXZpY2UucHJvZHVjdExldmVsVHdvKGxldmVsT25lSWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lckZsYWcgPSBmYWxzZVxyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93blR3byA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duVHdvID0gdGhpcy5maWx0ZXJQcm9kdWN0cygnJywgJ2NhdGVnb3J5MicpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWREcm9wZG93bkwzKGxldmVsT25lSWQ6IGFueSwgbGV2ZWxUd29JZDogYW55KSB7XHJcbiAgICB0aGlzLnNwaW5uZXJGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMuY29tbW9uU2V2aWNlLnByb2R1Y3RMZXZlbFRocmVlKGxldmVsT25lSWQsIGxldmVsVHdvSWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lckZsYWcgPSBmYWxzZVxyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93blRocmVlID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25UaHJlZSA9IHRoaXMuZmlsdGVyUHJvZHVjdHMoJycsICdjYXRlZ29yeTMnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkRHJvcGRvd25MNChsZXZlbE9uZUlkOiBhbnksIGxldmVsVHdvSWQ6IGFueSwgbGV2ZWxUaHJlZUlkOiBhbnkpIHtcclxuICAgIHRoaXMuc3Bpbm5lckZsYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb21tb25TZXZpY2UucHJvZHVjdExldmVsRm91cihsZXZlbE9uZUlkLCBsZXZlbFR3b0lkLCBsZXZlbFRocmVlSWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lckZsYWcgPSBmYWxzZVxyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkZvdXIgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93bkZvdXIgPSB0aGlzLmZpbHRlclByb2R1Y3RzKCcnLCAnY2F0ZWdvcnk0Jyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGZpbHRlclByb2R1Y3RzKHZhbHVlOiBzdHJpbmcsIGNhdDogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWU/LnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTtcclxuICAgIGxldCBkYXRhOiBzdHJpbmdbXTtcclxuXHJcbiAgICAvKkR5bmFtaWNhbGx5IGFzc2lnbiB0aGUgZGF0YSBhcnJheSBiYXNlZCBvbiB0aGUgY2F0ZWdvcnkqL1xyXG4gICAgc3dpdGNoIChjYXQpIHtcclxuICAgICAgY2FzZSAnY2F0ZWdvcnkxJzpcclxuICAgICAgICBkYXRhID0gdGhpcy5kcm9wZG93bk9uZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY2F0ZWdvcnkyJzpcclxuICAgICAgICBkYXRhID0gdGhpcy5kcm9wZG93blR3bztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY2F0ZWdvcnkzJzpcclxuICAgICAgICBkYXRhID0gdGhpcy5kcm9wZG93blRocmVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjYXRlZ29yeTQnOlxyXG4gICAgICAgIGRhdGEgPSB0aGlzLmRyb3Bkb3duRm91cjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBkYXRhID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkYXRhPy5maWx0ZXIob3B0aW9uID0+IG9wdGlvblsnbmFtZSddPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMubWF0RGlhbG9nUmVmLmNsb3NlKHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBzdGF0dXM6IHRydWUsXHJcbiAgICAgICAgICBpdGVtczogdGhpcy5mb3JtLmdldFJhd1ZhbHVlKClcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVNlbGVjdGVkIDwgbnVtUm93cztcclxuICB9XHJcblxyXG4gIG1hc3RlclRvZ2dsZSgpIHtcclxuICAgIHRoaXMuaXNBbGxTZWxlY3RlZCgpXHJcbiAgICAgID8gdGhpcy5zZWxlY3Rpb24uY2xlYXIoKVxyXG4gICAgICA6IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZvckVhY2gocm93ID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRQcm9kdWN0cygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0aW9uKHJvdzogUHJvZHVjdCkge1xyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHByb2R1Y3QgaXMgYWxyZWFkeSBzZWxlY3RlZFxyXG4gICAgY29uc3QgYWxyZWFkeVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQuc29tZShzZWxlY3RlZCA9PiBzZWxlY3RlZC52YWx1ZSA9PT0gcm93LnZhbHVlKTtcclxuICAgIGlmIChhbHJlYWR5U2VsZWN0ZWQpIHtcclxuICAgICAgLy8gSWYgdGhlIHByb2R1Y3QgaXMgYWxyZWFkeSBzZWxlY3RlZCwgZGVzZWxlY3QgaXRcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3Qocm93KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIElmIG5vdCBhbHJlYWR5IHNlbGVjdGVkLCBzZWxlY3QgaXRcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdyk7XHJcbiAgICB9XHJcbiAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgcHJvZHVjdHMgdG8gZW5zdXJlIG5vIGR1cGxpY2F0ZXNcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRQcm9kdWN0cygpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvLyBHZXR0ZXIgZm9yIHRoZSBGb3JtQXJyYXlcclxuICBnZXQgc2VsZWN0ZWRQcm9kdWN0cygpOiBGb3JtQXJyYXkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGVkUHJvZHVjdHMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZFByb2R1Y3RzKCkge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpKSB7XHJcbiAgICAgIC8vIERlZHVwbGljYXRlIHNlbGVjdGVkIHByb2R1Y3RzXHJcbiAgICAgIGNvbnN0IHVuaXF1ZVByb2R1Y3RzID0gQXJyYXkuZnJvbShcclxuICAgICAgICBuZXcgTWFwKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLm1hcChwcm9kdWN0ID0+IFtwcm9kdWN0LnZhbHVlLCBwcm9kdWN0XSkpLnZhbHVlcygpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XHJcbiAgICAgIHVuaXF1ZVByb2R1Y3RzLmZvckVhY2gocHJvZHVjdCA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3QocHJvZHVjdCkpO1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLnNlbGVjdGlvbi5zZWxlY3RlZF07XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHNBcnJheSA9IHRoaXMuc2VsZWN0ZWRQcm9kdWN0cztcclxuICAgICAgc2VsZWN0ZWRQcm9kdWN0c0FycmF5LmNsZWFyKCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uPy5zZWxlY3RlZD8uZm9yRWFjaCgocHJvZHVjdCwgaW5kZXgpID0+IHtcclxuICAgICAgICBpZiAoIXByb2R1Y3Q/LnZhbHVlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdQcm9kdWN0IHZhbHVlIChTS1UpIGlzIG1pc3NpbmcgYXQgaW5kZXg6JywgaW5kZXgsIHByb2R1Y3QpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwcm9kdWN0Rm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICBwcmljZTogW3Byb2R1Y3Q/LnByaWNlID8/ICcnLCB0aGlzLnNob3dQcmljZSA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBbXV0sXHJcbiAgICAgICAgICB0ZXh0OiBbcHJvZHVjdD8udGV4dCB8fCAnJ10sXHJcbiAgICAgICAgICBxdWFudGl0eTogW3Byb2R1Y3Q/LnF1YW50aXR5ID8/ICcnLCB0aGlzLnNob3dRdWFudGl0eSA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBbXV0sXHJcbiAgICAgICAgICBjYXRlZ29yeTogW3Byb2R1Y3Q/LmNhdGVnb3J5IHx8ICcnXSxcclxuICAgICAgICAgIHN1YkNhdGVnb3J5OiBbcHJvZHVjdD8uc3ViQ2F0ZWdvcnkgfHwgJyddLFxyXG4gICAgICAgICAgdmFsdWU6IFtwcm9kdWN0Py52YWx1ZSB8fCAnJ10sXHJcbiAgICAgICAgICBvdGhlckluZm9ybWF0aW9uMDogW3Byb2R1Y3Q/Lm90aGVySW5mb3JtYXRpb24wIHx8ICcnXSxcclxuICAgICAgICAgIG90aGVySW5mb3JtYXRpb24xOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjEgfHwgJyddLFxyXG4gICAgICAgICAgb3RoZXJJbmZvcm1hdGlvbjI6IFtwcm9kdWN0Py5vdGhlckluZm9ybWF0aW9uMiA/PyAnJywgdGhpcy5zaG93Q29zdCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBbXV1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocHJvZHVjdEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0c0FycmF5LnB1c2gocHJvZHVjdEZvcm1Hcm91cCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgRm9ybUdyb3VwIGZvciBwcm9kdWN0IGF0IGluZGV4ICR7aW5kZXh9LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICBjb25zdCBwcmljZUNvbnRyb2wgPSBjb250cm9sLmdldCgncHJpY2UnKTtcclxuICAgICAgICAgIGlmIChwcmljZUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1ByaWNlRGlzYWJsZSA/IHByaWNlQ29udHJvbC5kaXNhYmxlKCkgOiBwcmljZUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcmljZSBjb250cm9sIGlzIG1pc3NpbmcgaW4gRm9ybUdyb3VwIGF0IGluZGV4ICR7aW5kZXh9LmApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGNvbnRyb2wgdHlwZSBhdCBpbmRleCAke2luZGV4fTpgLCBjb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignU2VsZWN0aW9uLnNlbGVjdGVkIGlzIG5vdCBhbiBhcnJheTonLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0VG90YWxSb3dzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRSb3dzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBhbnksIGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIGxldCBzZWxlY3RlZFZhbHVlO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50Lm9wdGlvbiAmJiBldmVudC5vcHRpb24udmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBzZWxlY3RlZFZhbHVlID0gZXZlbnQub3B0aW9uLnZhbHVlLmlkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGV2ZW50O1xyXG4gICAgfVxyXG4gICAgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkxJykge1xyXG4gICAgICB0aGlzLmxldmVsT25lSWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Ud28gPSBbXTtcclxuICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duVGhyZWUgPSBbXTtcclxuICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duRm91ciA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5kcm9wZG93bkwyICYmIHRoaXMubGV2ZWxPbmVJZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkMiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9hZERyb3Bkb3duTDIodGhpcy5sZXZlbE9uZUlkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICB0aGlzLmxldmVsT25lSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxUd29JZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxGb3VySWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTInKSB7XHJcbiAgICAgIHRoaXMubGV2ZWxUd29JZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93blRocmVlID0gW107XHJcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duTDMgJiYgdGhpcy5sZXZlbE9uZUlkICYmIHRoaXMubGV2ZWxUd29JZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2FkRHJvcGRvd25MMyh0aGlzLmxldmVsT25lSWQsIHRoaXMubGV2ZWxUd29JZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5sZXZlbFR3b0lkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxldmVsVGhyZWVJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkMyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkNCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IDIwO1xyXG4gICAgICB0aGlzLmdldFByb2R1Y3RzKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5MycpIHtcclxuICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Gb3VyID0gW107XHJcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duTDQgJiYgdGhpcy5sZXZlbE9uZUlkICYmIHRoaXMubGV2ZWxUd29JZCAmJiB0aGlzLmxldmVsVGhyZWVJZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvYWREcm9wZG93bkw0KHRoaXMubGV2ZWxPbmVJZCwgdGhpcy5sZXZlbFR3b0lkLCB0aGlzLmxldmVsVGhyZWVJZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxGb3VySWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTQnKSB7XHJcbiAgICAgIHRoaXMubGV2ZWxGb3VySWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMjA7XHJcbiAgICAgIHRoaXMuZ2V0UHJvZHVjdHMoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXJzQ291bnQoKTtcclxuICB9XHJcblxyXG4gIGdldFByb2R1Y3RzKGZsYWc6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuc3Bpbm5lckZsYWcgPSB0cnVlO1xyXG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hRdWVyeTtcclxuICAgIGNvbnN0IGxldmVsT25lSWQgPSB0aGlzLmxldmVsT25lSWQgPyB0aGlzLmxldmVsT25lSWQgOiAwO1xyXG4gICAgY29uc3QgbGV2ZWxUd29JZCA9IHRoaXMubGV2ZWxUd29JZCA/IHRoaXMubGV2ZWxUd29JZCA6IDA7XHJcbiAgICBjb25zdCBsZXZlbFRocmVlSWQgPSB0aGlzLmxldmVsVGhyZWVJZCA/IHRoaXMubGV2ZWxUaHJlZUlkIDogMDtcclxuICAgIGNvbnN0IGxldmVsRm91cklkID0gdGhpcy5sZXZlbEZvdXJJZCA/IHRoaXMubGV2ZWxGb3VySWQgOiAwO1xyXG4gICAgaWYgKHRoaXMuc2hvdWxkUmVzZXRUYWJsZShzZWFyY2gsIGxldmVsT25lSWQsIGxldmVsVHdvSWQsIGxldmVsVGhyZWVJZCwgbGV2ZWxGb3VySWQpKSB7XHJcbiAgICAgIHRoaXMucmVzZXRUYWJsZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbW1vblNldmljZS5sb2FkUHJvZHVjdHModGhpcy5wYWdlTnVtYmVyLCB0aGlzLnBhZ2VTaXplLCBzZWFyY2gsIHRydWUsIGZhbHNlLCBsZXZlbE9uZUlkLCBsZXZlbFR3b0lkLCBsZXZlbFRocmVlSWQsIGxldmVsRm91cklkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJGbGFnID0gZmFsc2U7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLnRvdGFsUGFnZXMgPSByZXNwb25zZT8uZGF0YT8udG90YWxQYWdlcztcclxuICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UuZGF0YS5kYXRhU291cmNlO1xyXG4gICAgICAgIHRoaXMuZ2V0VG90YWxSZWNvcmRzID0gcmVzcG9uc2UuZGF0YS50b3RhbFJlY29yZHNcclxuICAgICAgICAvLyBTeW5jIHNlbGVjdGlvbiBzdGF0ZSB3aXRoIG5ldyBkYXRhXHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKHByb2R1Y3QgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdQcm9kdWN0ID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQuZmluZChwID0+IHAudmFsdWUgPT09IHByb2R1Y3QudmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nUHJvZHVjdCkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb2R1Y3QsIGV4aXN0aW5nUHJvZHVjdCk7IC8vIFJlcGxhY2UgcHJvZHVjdCB3aXRoIGV4aXN0aW5nIHJlZmVyZW5jZVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QocHJvZHVjdCk7IC8vIE1hcmsgYXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFByb2R1Y3RzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEF2b2lkIGR1cGxpY2F0ZXMgaW4gdGhlIGRhdGFTb3VyY2VcclxuICAgICAgICBjb25zdCBleGlzdGluZ1Byb2R1Y3RWYWx1ZXMgPSBuZXcgU2V0KHRoaXMuZGF0YVNvdXJjZS5kYXRhLm1hcChwcm9kdWN0ID0+IHByb2R1Y3QudmFsdWUpKTtcclxuICAgICAgICBjb25zdCB1bmlxdWVOZXdEYXRhID0gZGF0YS5maWx0ZXIocHJvZHVjdCA9PiAhZXhpc3RpbmdQcm9kdWN0VmFsdWVzLmhhcyhwcm9kdWN0LnZhbHVlKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA+IDAgJiYgZmxhZykge1xyXG4gICAgICAgICAgLy8gZGF0YS5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5kYXRhU291cmNlLmRhdGEucHVzaChpdGVtKSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLmRhdGFTb3VyY2UuZGF0YSwgLi4udW5pcXVlTmV3RGF0YV07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGluZ0ZsYWcgPSB0cnVlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbWlkZGxlUG9zaXRpb24gPSB0aGlzLnRyYWNrSGVpZ2h0IC8gMiAtIDUwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZmlyc3RzY3JvbGxhYmxlRGl2ICYmIHRoaXMuZmlyc3RzY3JvbGxhYmxlRGl2Lm5hdGl2ZUVsZW1lbnQgJiYgZmxhZykge1xyXG4gICAgICAgICAgICB0aGlzLmZpcnN0c2Nyb2xsYWJsZURpdi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHsgdG9wOiBtaWRkbGVQb3NpdGlvbiwgYmVoYXZpb3I6ICdhdXRvJyB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAyNTApO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFTb3VyY2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUm93KGV2ZW50OiBFdmVudCwgZWxlbWVudDogUHJvZHVjdCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgbGV0IG1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHByb2R1Y3Q/JztcclxuICAgIGxldCBzaG93QnV0dG9uID0gdHJ1ZTtcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuZGF0YS5pbmRleE9mKGVsZW1lbnQpO1xyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRhU291cmNlLmRhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmNoZWNrU3VibWlzc2lvblN0YXR1cykge1xyXG4gICAgICAgIG1lc3NhZ2UgPSAnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgcHJvZHVjdC4nO1xyXG4gICAgICAgIHNob3dCdXR0b24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgICAgICB3aWR0aDogJzkwJScsXHJcbiAgICAgICAgbWF4V2lkdGg6ICc0MDBweCcsXHJcbiAgICAgICAgZGF0YTogeyBtZXNzYWdlOiBtZXNzYWdlLCBidXR0b25TdGF0dXM6IHNob3dCdXR0b24gfVxyXG4gICAgICB9KTtcclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuZGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzZWxlY3QoZWxlbWVudCk7XHJcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdzZWxlY3RlZFByb2R1Y3RzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgY29uc3QgcHJvZHVjdEluZGV4ID0gc2VsZWN0ZWRQcm9kdWN0c0FycmF5LmNvbnRyb2xzLmZpbmRJbmRleChjb250cm9sID0+IGNvbnRyb2wudmFsdWUudmFsdWUgPT09IGVsZW1lbnQudmFsdWUpO1xyXG4gICAgICAgICAgaWYgKHByb2R1Y3RJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5yZW1vdmVBdChwcm9kdWN0SW5kZXgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblNjcm9sbChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLnRyYWNrSGVpZ2h0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbEhlaWdodCAtIGV2ZW50LnRhcmdldC5vZmZzZXRIZWlnaHQ7XHJcbiAgICBpZiAodGhpcy5sb2FkaW5nRmxhZyAmJiAoTWF0aC5mbG9vcihldmVudC50YXJnZXQuc2Nyb2xsVG9wIC8gdGhpcy50cmFja0hlaWdodCAqIDEwMCkgPiA1MCkpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nRmxhZyA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5wYWdlTnVtYmVyIDwgdGhpcy50b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgdGhpcy5wYWdlTnVtYmVyID0gdGhpcy5wYWdlTnVtYmVyICsgMTtcclxuICAgICAgICB0aGlzLmdldFByb2R1Y3RzKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ0ZsYWcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnByZXZTY3JvbGxQb3NpdGlvbiA9IGV2ZW50LnRhcmdldC5zY3JvbGxUb3A7XHJcbiAgfVxyXG5cclxuICBjb3VudFRydWVEcm9wZG93bnMob2JqKSB7XHJcbiAgICAvLyBEeW5hbWljYWxseSBmaW5kIGFsbCBrZXlzIHRoYXQgc3RhcnQgd2l0aCAnZHJvcGRvd25MJyBhbmQgYXJlIGJvb2xlYW4gKHRydWUvZmFsc2UpXHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxyXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnZHJvcGRvd25MJykgJiYgdHlwZW9mIG9ialtrZXldID09PSAnYm9vbGVhbicgJiYgb2JqW2tleV0gPT09IHRydWUpXHJcbiAgICAgIC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiBVc2UgdGhlIHByb3BlcnR5IHRoYXQgc2hvdWxkIGRpc3BsYXkgaW4gdGhlIGlucHV0IGZpZWxkICovXHJcbiAgZGlzcGxheUZuKG9wdGlvbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLm5hbWUgOiAnJztcclxuICB9XHJcblxyXG4gIG9uUXVhbnRpdHlDaGFuZ2UoZXZlbnQ6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBxdWFudGl0eUNvbnRyb2wgPSB0aGlzLnNlbGVjdGVkUHJvZHVjdHMuYXQoaW5kZXgpLmdldCgncXVhbnRpdHknKTtcclxuXHJcbiAgICBpZiAoIXF1YW50aXR5Q29udHJvbCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyBlcnJvcnNcclxuICAgIHF1YW50aXR5Q29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcblxyXG4gICAgLy8gSWYgdGhlIHZhbHVlIGlzIGVtcHR5LCBzZXQgJ3JlcXVpcmVkJyBlcnJvclxyXG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICBxdWFudGl0eUNvbnRyb2wuc2V0RXJyb3JzKHsgJ3JlcXVpcmVkJzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gMSwgc2V0ICdtaW4nIGVycm9yXHJcbiAgICBlbHNlIGlmIChOdW1iZXIodmFsdWUpIDwgMSkge1xyXG4gICAgICBxdWFudGl0eUNvbnRyb2wuc2V0RXJyb3JzKHsgJ21pbic6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IGFuIGludGVnZXIsIHNldCAncGF0dGVybicgZXJyb3JcclxuICAgIGVsc2UgaWYgKCEvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICBxdWFudGl0eUNvbnRyb2wuc2V0RXJyb3JzKHsgJ3BhdHRlcm4nOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ29Ub05leHRQYWdlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9ICdlZGl0LXNhdmUnO1xyXG4gIH1cclxuXHJcbiAgZ29Ub1ByZXZpb3VzUGFnZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnc2VsZWN0LXByb2R1Y3RzJztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oKSB7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9ICF0aGlzLmlzVmlzaWJsZTtcclxuICB9XHJcblxyXG4gIGNsZWFyRmllbGQoZmllbGQ6IHN0cmluZywgY2F0ZWdvcnk6IHN0cmluZywgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCBkcm9wZG93biByZW9wZW5cclxuICAgIHRoaXMuZm9ybS5nZXQoZmllbGQpPy5zZXRWYWx1ZShudWxsKTtcclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5MScpIHtcclxuICAgICAgdGhpcy5vbk9wdGlvblNlbGVjdGVkKG51bGwsICdjYXRlZ29yeTEnKTtcclxuICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTInKSB7XHJcbiAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChudWxsLCAnY2F0ZWdvcnkyJyk7XHJcbiAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkzJykge1xyXG4gICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0ZWQobnVsbCwgJ2NhdGVnb3J5MycpO1xyXG4gICAgfSBlbHNlIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5NCcpIHtcclxuICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IG51bGw7XHJcbiAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChudWxsLCAnY2F0ZWdvcnk0Jyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQsIGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGlucHV0VmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgaWYgKCFpbnB1dFZhbHVlKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGlucHV0IGlzIGNsZWFyZWRcclxuICAgICAgdGhpcy5jbGVhckZpZWxkKGBkcm9wZG93bkxldmVsJHt0aGlzLmdldERyb3Bkb3duTGV2ZWwoY2F0ZWdvcnkpfWAsIGNhdGVnb3J5LCBudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERyb3Bkb3duTGV2ZWwoY2F0ZWdvcnk6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBzd2l0Y2ggKGNhdGVnb3J5KSB7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5MSc6IHJldHVybiAxO1xyXG4gICAgICBjYXNlICdjYXRlZ29yeTInOiByZXR1cm4gMjtcclxuICAgICAgY2FzZSAnY2F0ZWdvcnkzJzogcmV0dXJuIDM7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5NCc6IHJldHVybiA0O1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpIHtcclxuICAgIHRoaXMuYWN0aXZlRmlsdGVyc0NvdW50ID0gMDtcclxuICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMScpLnZhbHVlKSB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCsrO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJykudmFsdWUpIHRoaXMuYWN0aXZlRmlsdGVyc0NvdW50Kys7XHJcbiAgICBpZiAodGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS52YWx1ZSkgdGhpcy5hY3RpdmVGaWx0ZXJzQ291bnQrKztcclxuICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnZhbHVlKSB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCsrO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJJZkVtcHR5KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1snc2VhcmNoUHJvZHVjdE5hbWUnXS5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcclxuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hRdWVyeTtcclxuICAgICAgY29uc3QgbGV2ZWxPbmVJZCA9IHRoaXMubGV2ZWxPbmVJZCA/IHRoaXMubGV2ZWxPbmVJZCA6IDA7XHJcbiAgICAgIGNvbnN0IGxldmVsVHdvSWQgPSB0aGlzLmxldmVsVHdvSWQgPyB0aGlzLmxldmVsVHdvSWQgOiAwO1xyXG4gICAgICBjb25zdCBsZXZlbFRocmVlSWQgPSB0aGlzLmxldmVsVGhyZWVJZCA/IHRoaXMubGV2ZWxUaHJlZUlkIDogMDtcclxuICAgICAgY29uc3QgbGV2ZWxGb3VySWQgPSB0aGlzLmxldmVsRm91cklkID8gdGhpcy5sZXZlbEZvdXJJZCA6IDA7XHJcbiAgICAgIGlmICh0aGlzLnNob3VsZFJlc2V0VGFibGUoc2VhcmNoLCBsZXZlbE9uZUlkLCBsZXZlbFR3b0lkLCBsZXZlbFRocmVlSWQsIGxldmVsRm91cklkKSkge1xyXG4gICAgICAgIHRoaXMucmVzZXRUYWJsZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRUYWJsZSgpIHtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwxJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmxldmVsT25lSWQgPSAwO1xyXG4gICAgdGhpcy5sZXZlbFR3b0lkID0gMDtcclxuICAgIHRoaXMubGV2ZWxUaHJlZUlkID0gMDtcclxuICAgIHRoaXMubGV2ZWxGb3VySWQgPSAwO1xyXG4gICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyc0NvdW50KCk7XHJcbiAgICBpZiAodGhpcy5zZWFyY2hRdWVyeSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbXTtcclxuICAgICAgdGhpcy5zcGlubmVyRmxhZyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG91bGRSZXNldFRhYmxlKHNlYXJjaDogc3RyaW5nLCBsZXZlbE9uZUlkOiBudW1iZXIsIGxldmVsVHdvSWQ6IG51bWJlciwgbGV2ZWxUaHJlZUlkOiBudW1iZXIsIGxldmVsRm91cklkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzZWFyY2ggPT09ICcnICYmIGxldmVsT25lSWQgPT09IDAgJiYgbGV2ZWxUd29JZCA9PT0gMCAmJiBsZXZlbFRocmVlSWQgPT09IDAgJiYgbGV2ZWxGb3VySWQgPT09IDA7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwic3Bpbm5lckZsYWdcIiBjbGFzcz1cIk92ZXJsYXlEaXZcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJPdmVybGF5RGl2Q29udGVudFwiPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwibWF0LWRpYWxvZy1oZWFkaW5nXCI+XHJcbiAgICA8aDEgbWF0LWRpYWxvZy10aXRsZT5BZGQgUHJvZHVjdHM8L2gxPlxyXG48L2Rpdj5cclxuXHJcbjxtYXQtZGlhbG9nLWNvbnRlbnQgW25nQ2xhc3NdPVwiZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID4gMCA/ICdwcm9kdWN0cy1zY3JvbGwtdmlzaWJsZSc6ICcnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWF0LWRpYWxvZy1jb250ZW50XCI+XHJcbiAgICAgICAgPCEtLVNlYXJjaCBTdGFydC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYXNpYy1zZWFyY2hcIiBbaGlkZGVuXT1cImN1cnJlbnRQYWdlICE9PSAnc2VsZWN0LXByb2R1Y3RzJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFzaWMtc2VhcmNoLXdycFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiB2aWV3Qm94PVwiMCAwIDI0IDI1XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSgwIDAgMClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS4yNSAyLjc1QzYuMTQxNTQgMi43NSAyIDYuODkwMjkgMiAxMS45OThDMiAxNy4xMDU2IDYuMTQxNTQgMjEuMjQ1OSAxMS4yNSAyMS4yNDU5QzEzLjUzMzUgMjEuMjQ1OSAxNS42MjM4IDIwLjQxODcgMTcuMjM3MyAxOS4wNDc1TDIwLjcxODIgMjIuNTI4N0MyMS4wMTEgMjIuODIxNiAyMS40ODU5IDIyLjgyMTcgMjEuNzc4OCAyMi41Mjg4QzIyLjA3MTcgMjIuMjM1OSAyMi4wNzE4IDIxLjc2MSAyMS43Nzg5IDIxLjQ2ODFMMTguMjk4MyAxNy45ODcyQzE5LjY3MTQgMTYuMzczNiAyMC41IDE0LjI4MjYgMjAuNSAxMS45OThDMjAuNSA2Ljg5MDI5IDE2LjM1ODUgMi43NSAxMS4yNSAyLjc1Wk0zLjUgMTEuOTk4QzMuNSA3LjcxOTA1IDYuOTY5NjIgNC4yNSAxMS4yNSA0LjI1QzE1LjUzMDQgNC4yNSAxOSA3LjcxOTA1IDE5IDExLjk5OEMxOSAxNi4yNzY5IDE1LjUzMDQgMTkuNzQ1OSAxMS4yNSAxOS43NDU5QzYuOTY5NjIgMTkuNzQ1OSAzLjUgMTYuMjc2OSAzLjUgMTEuOTk4WlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1zZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cImhhbmRsZURyb3Bkb3duRmlsdGVyKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFByb2R1Y3RcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hQcm9kdWN0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiY2xlYXJJZkVtcHR5KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImFkdmZpbHRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhZHZcIiAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbigpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJ0dW5lXCI+dHVuZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjdGl2ZUZpbHRlcnNDb3VudCA+IDBcIiBjbGFzcz1cImN1c3RvbS1iYWRnZVwiPnt7IGFjdGl2ZUZpbHRlcnNDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZURyb3Bkb3duRmlsdGVyKCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlNlYXJjaDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tU2VhcmNoIEVuZC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXNlbGVjdG9yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgW2hpZGRlbl09XCJjdXJyZW50UGFnZSAhPT0gJ3NlbGVjdC1wcm9kdWN0cydcIj5cclxuICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXNlbGVjdGlvbi1jb250YWluZXJcIiAqbmdJZj1cImlzVmlzaWJsZSAmJiBkcm9wZG93bkwxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1zZWxlY3Rpb25cIiAqbmdJZj1cImRyb3Bkb3duTDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiZHJvcERvd25Db3VudCA9PT0gMSA/ICduby1jaGlsZCc6ICdjaGlsZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtYWR2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT5BZHZhbmNlZCBGaWx0ZXJzPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNsci1hbGwtcGlja2VyXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyZXNldFRhYmxlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3RpdmVGaWx0ZXJzQ291bnQgPiAwXCI+Q2xlYXIgQWxsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJkcm9wZG93bkwxXCIgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2Ryb3Bkb3duTDFMYWJlbH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRyb3Bkb3duTGV2ZWwxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0bzNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50LCAnY2F0ZWdvcnkxJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiICNhdXRvMz1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQsICdjYXRlZ29yeTEnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZERyb3Bkb3duT25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKm5nSWY9XCJmb3JtLmdldCgnZHJvcGRvd25MZXZlbDEnKS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZCgnZHJvcGRvd25MZXZlbDEnLCAnY2F0ZWdvcnkxJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25jbG9zZVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbmRyb3Bkb3duXCIgbWF0U3VmZml4PmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZHJvcGRvd25MMlwiIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tkcm9wZG93bkwyTGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkcm9wZG93bkxldmVsMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG80XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudCwgJ2NhdGVnb3J5MicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIiAjYXV0bzQ9XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LCAnY2F0ZWdvcnkyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWREcm9wZG93blR3b1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4ICpuZ0lmPVwiZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJykudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmllbGQoJ2Ryb3Bkb3duTGV2ZWwyJywgJ2NhdGVnb3J5MicsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uY2xvc2VcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb25kcm9wZG93blwiIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZC1pY29uJzogaXNEaXNhYmxlZDJ9XCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZHJvcGRvd25MM1wiIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tkcm9wZG93bkwzTGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkcm9wZG93bkxldmVsM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG81XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudCwgJ2NhdGVnb3J5MycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIiAjYXV0bzU9XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LCAnY2F0ZWdvcnkzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWREcm9wZG93blRocmVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKm5nSWY9XCJmb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZCgnZHJvcGRvd25MZXZlbDMnLCAnY2F0ZWdvcnkzJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25jbG9zZVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbmRyb3Bkb3duXCIgbWF0U3VmZml4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGUtaWNvbic6IGlzRGlzYWJsZWQzfVwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZHJvcGRvd25MNFwiIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tkcm9wZG93bkw0TGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkcm9wZG93bkxldmVsNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG82XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudCwgJ2NhdGVnb3J5NCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIiAjYXV0bzY9XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LCAnY2F0ZWdvcnk0JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWREcm9wZG93bkZvdXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCAqbmdJZj1cImZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpZWxkKCdkcm9wZG93bkxldmVsNCcsICdjYXRlZ29yeTQnLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbmNsb3NlXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uZHJvcGRvd25cIiBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1pY29uJzogaXNEaXNhYmxlZDR9XCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgI2ZpcnN0c2Nyb2xsYWJsZURpdiBpZD1cImZpcnN0c2Nyb2xsYWJsZURpdlwiIGNsYXNzPVwibmV3LWNsYXNzIGZpcnN0LWRpdlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50KVwiIFtuZ0NsYXNzXT1cImRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA+IDAgPyAndGJsLXJlY29yZC1mb3VuZCc6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIGNsYXNzPVwibWF0LXRhYmxlIGFiY1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGFTb3VyY2UgJiYgZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID4gMDsgZWxzZSBub0RhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gdG9nZ2xlU2VsZWN0aW9uKHJvdykgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInByb2R1Y3ROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3twcm9kdWN0VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudD8udGV4dH19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2t1TnVtYmVyXCIgKm5nSWY9XCJzaG93U2t1TnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3tza3VUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py5vdGhlckluZm9ybWF0aW9uMH19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW52ZW50b3J5XCIgKm5nSWY9XCJzaG93SW52ZW50b3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3tpbnZlbnRvcnlUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py5vdGhlckluZm9ybWF0aW9uMX19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiYWRkUHJvZHVjdHNDb2x1bW5zXCI+PC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBhZGRQcm9kdWN0c0NvbHVtbnM7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3RvZ2dsZVNlbGVjdGlvbihyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1ObyBkYXRhIGZvdW5kLi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcC1lbXB0eS1zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWVtcHR5LXN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZW1wdHlJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPk5vIHJlY29yZHMgdG8gc2hvdyBhdCB0aGUgbW9tZW50PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIG1vZGlmeSB5b3VyIHNlYXJjaCBjcml0ZXJpYSB0byBmaW5kIHRoZSBkZXNpcmVkIHJlc3VsdDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LXN1bW1hcnlcIiAqbmdJZj1cImRhdGFTb3VyY2UgJiYgZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlNlbGVjdGVkOiA8c3Ryb25nPnt7IGdldFNlbGVjdGVkUm93c0NvdW50KCkgfX08L3N0cm9uZz4gPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+VG90YWwgUmVjb3JkczogPHN0cm9uZz57eyBnZXRUb3RhbFJlY29yZHMgfX08L3N0cm9uZz48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiY3VycmVudFBhZ2UgIT09ICdlZGl0LXNhdmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmV3LWNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWREYXRhU291cmNlICYmIHNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA+IDAgPyAnYWRkZWQtcHJvZHVjdHMnOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInNlbGVjdGVkRGF0YVNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRGF0YVNvdXJjZSAmJiBzZWxlY3RlZERhdGFTb3VyY2UuZGF0YS5sZW5ndGggPiAwOyBlbHNlIHNob3dCbGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZWxldGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlbGV0ZS1idG4tcGlja2VyXCIgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtyZW1vdmVSb3coJGV2ZW50LCBlbGVtZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBhcmlhLWxhYmVsPVwiUmVtb3ZlIHJvd1wiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicHJvZHVjdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e3Byb2R1Y3RUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LnRleHR9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNhdGVnb3J5TmFtZVwiICpuZ0lmPVwic2hvd0NhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3tjYXRlZ29yeVR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQuY2F0ZWdvcnl9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInN1YkNhdGVnb3J5XCIgKm5nSWY9XCJzaG93U3ViY2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e3N1YkNhdGVnb3J5VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudC5zdWJDYXRlZ29yeX19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicHJpY2VcIiAqbmdJZj1cInNob3dQcmljZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+e3twcmljZVR3ZWVrfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aCBzZWxlY3QtcHJpY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3twcmljZVR3ZWVrfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3ByaWNlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGxlYXNlIGVudGVyICcgKyBwcmljZVR3ZWVrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3ByaWNlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3ByaWNlVHdlZWt9fSBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJRdWFudGl0eVwiICpuZ0lmPVwic2hvd1F1YW50aXR5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3txdWFudGl0eVR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3txdWFudGl0eVR3ZWVrfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3F1YW50aXR5JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCIgc3RlcD1cIjFcIiAoaW5wdXQpPVwib25RdWFudGl0eUNoYW5nZSgkZXZlbnQsIGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3F1YW50aXR5JykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzZWxlY3RlZFByb2R1Y3RzLmF0KGkpLmdldCgncXVhbnRpdHknKS5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFudGl0eSBjYW4gbm90IGJlIGxlc3MgdGhhbiAxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzZWxlY3RlZFByb2R1Y3RzLmF0KGkpLmdldCgncXVhbnRpdHknKS5oYXNFcnJvcigncGF0dGVybicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbHMgbm90IGFsbG93ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2t1TnVtYmVyXCIgKm5nSWY9XCJzaG93U2t1TnVtYmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3tza3VUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/Lm90aGVySW5mb3JtYXRpb24wfX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbnZlbnRvcnlcIiAqbmdJZj1cInNob3dJbnZlbnRvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e2ludmVudG9yeVR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8ub3RoZXJJbmZvcm1hdGlvbjF9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjb3N0XCIgKm5nSWY9XCJzaG93Q29zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+e3tjb3N0VHdlZWt9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoIHNlbGVjdC1jb3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7Y29zdFR3ZWVrfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ290aGVySW5mb3JtYXRpb24yJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGxlYXNlIGVudGVyICcgKyBjb3N0VHdlZWtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzZWxlY3RlZFByb2R1Y3RzLmF0KGkpLmdldCgnb3RoZXJJbmZvcm1hdGlvbjInKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29zdFR3ZWVrfX0gaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwic2hvd0FsbHByb2R1Y3RzQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogc2hvd0FsbHByb2R1Y3RzQ29sdW1ucztcIj48L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSAjc2hvd0JsYW5rPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGRhdGEgZm91bmQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0JsYW5rPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcC1lbXB0eS1zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWVtcHR5LXN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZW1wdHlJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPk5vIFByb2R1Y3QgYWRkZWQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGVhc2UgZ28gYmFjayBhbmQgc3RhcnQgYWRkaW5nIHByb2R1Y3RzPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWFjdGlvbi1zdGVwLW9uZVwiICpuZ0lmPVwiY3VycmVudFBhZ2UgPT09ICdzZWxlY3QtcHJvZHVjdHMnXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJnb1RvTmV4dFBhZ2UoKVwiIFtkaXNhYmxlZF09XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24+TmV4dDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJmYWxzZVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFicy1hY3Rpb25cIiAqbmdJZj1cImN1cnJlbnRQYWdlID09PSAnZWRpdC1zYXZlJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYWN0aW9uLXdycFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImdvVG9QcmV2aW91c1BhZ2UoKVwiPkJhY2s8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjb2xvcj1cInByaW1hcnlcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25TdWJtaXQoKVwiPkFkZDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
|