ngx-render-material-forms 2.3.5 → 2.3.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 +30 -16
- package/fesm2015/ngx-render-material-forms.js +30 -15
- package/fesm2015/ngx-render-material-forms.mjs.map +1 -1
- package/fesm2020/ngx-render-material-forms.js +29 -15
- package/fesm2020/ngx-render-material-forms.mjs.map +1 -1
- package/lib/components/add-on-products/add-on-products.component.d.ts +3 -1
- package/package.json +1 -1
|
@@ -728,30 +728,44 @@ export class AddOnProductsComponent {
|
|
|
728
728
|
shouldResetTable(search, levelOneId, levelTwoId, levelThreeId, levelFourId) {
|
|
729
729
|
return search === '' && levelOneId === 0 && levelTwoId === 0 && levelThreeId === 0 && levelFourId === 0;
|
|
730
730
|
}
|
|
731
|
-
/* This function will manage price validation */
|
|
732
|
-
|
|
733
|
-
const value = event.target.value;
|
|
734
|
-
const
|
|
735
|
-
if (!
|
|
731
|
+
/* This function will manage price and cost validation */
|
|
732
|
+
applyValidationRule(event, index, controlName) {
|
|
733
|
+
const value = event.target.value.trim();
|
|
734
|
+
const control = this.selectedProducts.at(index).get(controlName);
|
|
735
|
+
if (!control)
|
|
736
736
|
return;
|
|
737
737
|
// Clear any previous errors
|
|
738
|
-
|
|
738
|
+
control.setErrors(null);
|
|
739
739
|
// If the value is empty, set 'required' error
|
|
740
740
|
if (value === '' || value === null) {
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
// If the value is less than 1, set 'min' error
|
|
744
|
-
else if (Number(value) < 0) {
|
|
745
|
-
priceControl.setErrors({ 'min': true });
|
|
741
|
+
control.setErrors({ 'required': true });
|
|
742
|
+
return;
|
|
746
743
|
}
|
|
747
744
|
// Check if value contains only numbers and decimals (but no alphabets or special characters)
|
|
748
|
-
|
|
749
|
-
|
|
745
|
+
if (!/^\d*\.?\d*$/.test(value)) {
|
|
746
|
+
event.target.value = value.replace(/[^0-9.]/g, ''); // Remove invalid characters
|
|
747
|
+
control.setErrors({ 'invalidFormat': true });
|
|
748
|
+
return;
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
restrictInput(event) {
|
|
752
|
+
const key = event.key;
|
|
753
|
+
const inputValue = event.target.value;
|
|
754
|
+
// Allow numbers and one decimal, but prevent everything else
|
|
755
|
+
if (!/[\d.]/.test(key) || (key === '.' && inputValue.includes('.'))) {
|
|
756
|
+
event.preventDefault();
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
handlePaste(event) {
|
|
760
|
+
const pasteData = event.clipboardData?.getData('text') || '';
|
|
761
|
+
// If pasted value is not a valid number, prevent pasting
|
|
762
|
+
if (!/^\d*\.?\d*$/.test(pasteData)) {
|
|
763
|
+
event.preventDefault();
|
|
750
764
|
}
|
|
751
765
|
}
|
|
752
766
|
}
|
|
753
767
|
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 });
|
|
754
|
-
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 (input)=\"ValidatePrice($event, i)\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('required')\">\r\n This field is required\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('min')\">\r\n Negative numbers are not allowed\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"selectedProducts.at(i).get('price').hasError('invalidFormat')\">\r\n Only numbers and decimals are allowed\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('otherInformation0')\">\r\n <mat-error\r\n *ngIf=\"selectedProducts.at(i).get('otherInformation0').hasError('required')\">\r\n This field 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: [
|
|
768
|
+
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 (input)=\"applyValidationRule($event, i, 'price')\" (keypress)=\"restrictInput($event)\" (paste)=\"handlePaste($event)\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('required')\">\r\n This field 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('otherInformation0')\"\r\n (input)=\"applyValidationRule($event, i, 'otherInformation0')\" (keypress)=\"restrictInput($event)\" (paste)=\"handlePaste($event)\">\r\n <mat-error\r\n *ngIf=\"selectedProducts.at(i).get('otherInformation0').hasError('required')\">\r\n This field 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: [
|
|
755
769
|
trigger('slideDown', [
|
|
756
770
|
state('hidden', style({ height: '0px', opacity: 0, overflow: 'hidden' })),
|
|
757
771
|
state('visible', style({ height: '*', opacity: 1 })),
|
|
@@ -776,7 +790,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
776
790
|
animate('300ms ease-in')
|
|
777
791
|
])
|
|
778
792
|
])
|
|
779
|
-
], 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 (input)=\"ValidatePrice($event, i)\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('required')\">\r\n This field is required\r\n </mat-error>\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('min')\">\r\n Negative numbers are not allowed\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"selectedProducts.at(i).get('price').hasError('invalidFormat')\">\r\n Only numbers and decimals are allowed\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('otherInformation0')\">\r\n <mat-error\r\n *ngIf=\"selectedProducts.at(i).get('otherInformation0').hasError('required')\">\r\n This field 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"] }]
|
|
793
|
+
], 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 (input)=\"applyValidationRule($event, i, 'price')\" (keypress)=\"restrictInput($event)\" (paste)=\"handlePaste($event)\">\r\n <mat-error *ngIf=\"selectedProducts.at(i).get('price').hasError('required')\">\r\n This field 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('otherInformation0')\"\r\n (input)=\"applyValidationRule($event, i, 'otherInformation0')\" (keypress)=\"restrictInput($event)\" (paste)=\"handlePaste($event)\">\r\n <mat-error\r\n *ngIf=\"selectedProducts.at(i).get('otherInformation0').hasError('required')\">\r\n This field 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"] }]
|
|
780
794
|
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
781
795
|
type: Inject,
|
|
782
796
|
args: [MAT_DIALOG_DATA]
|
|
@@ -784,4 +798,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImpor
|
|
|
784
798
|
type: ViewChild,
|
|
785
799
|
args: ['firstscrollableDiv']
|
|
786
800
|
}] } });
|
|
787
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW9uLXByb2R1Y3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZW5kZXItbWF0ZXJpYWwtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1vbi1wcm9kdWN0cy9hZGQtb24tcHJvZHVjdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlbmRlci1tYXRlcmlhbC1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvYWRkLW9uLXByb2R1Y3RzL2FkZC1vbi1wcm9kdWN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixTQUFTLEVBQWMsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQWUsU0FBUyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxlQUFlLEVBQTJCLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUVuRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NqRixNQUFNLE9BQU8sc0JBQXNCO0lBMEVqQyxZQUNTLFlBQWtELEVBQ2hDLElBQVMsRUFDMUIsRUFBZSxFQUNmLE1BQWlCLEVBQ2pCLFlBQTJCO1FBSjVCLGlCQUFZLEdBQVosWUFBWSxDQUFzQztR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QUU7Z0NBQzlCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQzs2QkFDMUIsQ0FBQzs0QkFDRixVQUFVLENBQUMsbUJBQW1CLEVBQUU7Z0NBQzlCLE9BQU8sQ0FBQyxlQUFlLENBQUM7NkJBQ3pCLENBQUM7eUJBQ0gsQ0FBQztxQkFDSDs7MEJBOEVFLE1BQU07MkJBQUMsZUFBZTswSEF4Q1Esa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1BcnJheSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm1hdGlvbi1kaWFsb2cvY29uZmlybWF0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdCB7XHJcbiAgcHJvZHVjdE5hbWU6IHN0cmluZztcclxuICBwcm9kdWN0RGVzY3JpcHRpb246IHN0cmluZztcclxuICBxdWFudGl0eTogYW55LFxyXG4gIHByaWNlOiBhbnksXHJcbiAgdGV4dDogYW55LFxyXG4gIGlkOiBhbnksXHJcbiAgdmFsdWU6IGFueSxcclxuICBvdGhlckluZm9ybWF0aW9uMDogYW55LFxyXG4gIG90aGVySW5mb3JtYXRpb24xOiBhbnksXHJcbiAgb3RoZXJJbmZvcm1hdGlvbjI6IGFueVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1tYXQtYWRkLW9uLXByb2R1Y3RzJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLW9uLXByb2R1Y3RzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hZGQtb24tcHJvZHVjdHMuY29tcG9uZW50LmNzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ3NsaWRlRG93bicsIFtcclxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4Jywgb3BhY2l0eTogMCwgb3ZlcmZsb3c6ICdoaWRkZW4nIH0pKSxcclxuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IGhlaWdodDogJyonLCBvcGFjaXR5OiAxIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnMzAwbXMgZWFzZS1vdXQnKVxyXG4gICAgICBdKSxcclxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PiBoaWRkZW4nLCBbXHJcbiAgICAgICAgYW5pbWF0ZSgnMzAwbXMgZWFzZS1pbicpXHJcbiAgICAgIF0pXHJcbiAgICBdKVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZE9uUHJvZHVjdHNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xyXG4gIGZvcm06IEZvcm1Hcm91cDtcclxuICBkcm9wZG93bk9uZTogc3RyaW5nW10gPSBbXTtcclxuICBkcm9wZG93blR3bzogc3RyaW5nW10gPSBbXTtcclxuICBkcm9wZG93blRocmVlOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGRyb3Bkb3duRm91cjogc3RyaW5nW10gPSBbXTtcclxuICBmaWx0ZXJlZERyb3Bkb3duT25lOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZpbHRlcmVkRHJvcGRvd25Ud286IHN0cmluZ1tdID0gW107XHJcbiAgZmlsdGVyZWREcm9wZG93blRocmVlOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZpbHRlcmVkRHJvcGRvd25Gb3VyOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGFkZFByb2R1Y3RzQ29sdW1uczogc3RyaW5nW10gPSBbJ3NlbGVjdCcsICdwcm9kdWN0TmFtZScsICdza3VOdW1iZXInLCAnaW52ZW50b3J5J107XHJcbiAgc2hvd0FsbHByb2R1Y3RzQ29sdW1uczogc3RyaW5nW10gPSBbJ2RlbGV0ZScsICdwcm9kdWN0TmFtZScsICdjYXRlZ29yeU5hbWUnLCAnc3ViQ2F0ZWdvcnknLCAnUXVhbnRpdHknLCAncHJpY2UnLCAnc2t1TnVtYmVyJywgJ2ludmVudG9yeScsICdjb3N0J107XHJcbiAgcXVhbnRpdHlMaXN0OiBudW1iZXJbXSA9IFs1LCAxMCwgMTUsIDIwLCAyNV07XHJcbiAgRUxFTUVOVF9EQVRBOiBQcm9kdWN0W10gPSBbXTtcclxuICBkYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxQcm9kdWN0PigpO1xyXG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcclxuICBzZWxlY3RlZERhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPFByb2R1Y3Q+KFtdKTtcclxuICBzZWxlY3RlZENhdGVnb3J5OiBhbnkgPSBudWxsO1xyXG4gIHNlbGVjdGVkU3ViQ2F0ZWdvcnk6IGFueSA9IG51bGw7XHJcbiAgc2hvd0NhdGVnb3J5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd1N1YmNhdGVnb3J5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd1ByaWNlOiBib29sZWFuID0gdHJ1ZTtcclxuICBzaG93UXVhbnRpdHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHNob3dTa3VOdW1iZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzaG93SW52ZW50b3J5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd05ld1Byb2R1Y3RQaWNrZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHNldENhdGVnb3J5OiBzdHJpbmcgPSAnJztcclxuICBzZXRTdWJDYXRlZ29yeTogc3RyaW5nID0gJyc7XHJcbiAgbG9hZGluZ0ZsYWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwYWdlTnVtYmVyID0gMTtcclxuICBwYWdlU2l6ZSA9IDIwO1xyXG4gIHRvdGFsUGFnZXMgPSAwO1xyXG4gIHNlYXJjaFF1ZXJ5ID0gJyc7XHJcbiAgaXRlbUxpc3Q6IGFueVtdID0gW107XHJcbiAgdHJhY2tIZWlnaHQ6IGFueTtcclxuICBwcmV2U2Nyb2xsUG9zaXRpb24gPSAwOyAvLyBUcmFjayB0aGUgcHJldmlvdXMgc2Nyb2xsIHBvc2l0aW9uXHJcbiAgQFZpZXdDaGlsZCgnZmlyc3RzY3JvbGxhYmxlRGl2JykgZmlyc3RzY3JvbGxhYmxlRGl2OiBFbGVtZW50UmVmO1xyXG4gIHNwaW5uZXJGbGFnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZHJvcGRvd25MMTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duTDI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bkwzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZHJvcGRvd25MNDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duTDFMYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgZHJvcGRvd25MMkxhYmVsOiBzdHJpbmcgPSAnJztcclxuICBkcm9wZG93bkwzTGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIGRyb3Bkb3duTDRMYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgZHJvcERvd25Db3VudDogbnVtYmVyID0gMDtcclxuICBsZXZlbE9uZUlkOiBhbnkgPSAnJztcclxuICBsZXZlbFR3b0lkOiBhbnkgPSAnJztcclxuICBsZXZlbFRocmVlSWQ6IGFueSA9ICcnO1xyXG4gIGxldmVsRm91cklkOiBhbnkgPSAnJztcclxuICBkaXNhYmxlUHJpY2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGNoZWNrU3VibWlzc2lvblN0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGN1cnJlbnRQYWdlOiBzdHJpbmcgPSAnc2VsZWN0LXByb2R1Y3RzJztcclxuICBpc1Zpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRGlzYWJsZWQyOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0Rpc2FibGVkMzogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNEaXNhYmxlZDQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzUHJpY2VEaXNhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBhY3RpdmVGaWx0ZXJzQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgZW1wdHlJbWFnZTogc3RyaW5nID0gJy9pL3RhYmxlLWdyaWQtZW1wdHktc3RhdGUuc3ZnJztcclxuICBnZXRUb3RhbFJlY29yZHM6IG51bWJlciA9IDA7XHJcbiAgcHJpY2VGaWVsZExhYmxlOiBzdHJpbmcgPSAnUHJpY2UnO1xyXG4gIHRhcmdldENvc3Q6IHN0cmluZyA9ICdZb3VyIFRhcmdldCBDb3N0JztcclxuICBzaG93Q29zdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNrdVR3ZWVrOiBzdHJpbmcgPSAnU0tVIE51bWJlcic7XHJcbiAgY29zdFR3ZWVrOiBzdHJpbmcgPSAnWW91ciBUYXJnZXQgQ29zdCc7XHJcbiAgcHJpY2VUd2Vlazogc3RyaW5nID0gJ1ByaWNlJztcclxuICBwcm9kdWN0VHdlZWs6IHN0cmluZyA9ICdQcm9kdWN0IE5hbWUnO1xyXG4gIHF1YW50aXR5VHdlZWs6IHN0cmluZyA9ICdRdWFudGl0eSc7XHJcbiAgY2F0ZWdvcnlUd2Vlazogc3RyaW5nID0gJ0NhdGVnb3J5IE5hbWUnO1xyXG4gIHN1YkNhdGVnb3J5VHdlZWs6IHN0cmluZyA9ICdTdWIgQ2F0ZWdvcnknO1xyXG4gIGludmVudG9yeVR3ZWVrOiBzdHJpbmcgPSAnSW52ZW50b3J5JztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgbWF0RGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWRkT25Qcm9kdWN0c0NvbXBvbmVudD4sXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgZGF0YTogYW55LFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBjb21tb25TZXZpY2U6IENvbW1vblNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuc2hvd0NhdGVnb3J5ID0gZGF0YS5kcm9wZG93bnNGbGFnLnNob3dEaWFsb2dDYXRlZ29yeTtcclxuICAgIHRoaXMuc2hvd1N1YmNhdGVnb3J5ID0gZGF0YS5kcm9wZG93bnNGbGFnLnNob3dEaWFsb2dTdWJDYXRlZ29yeTtcclxuICAgIHRoaXMuc2hvd1ByaWNlID0gZGF0YS5kcm9wZG93bnNGbGFnLnNob3dEaWFsb2dQcmljZTtcclxuICAgIHRoaXMuc2hvd1F1YW50aXR5ID0gZGF0YS5kcm9wZG93bnNGbGFnLnNob3dEaWFsb2dRdWFudGl0eTtcclxuICAgIHRoaXMuc2hvd1NrdU51bWJlciA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nU2t1TnVtYmVyO1xyXG4gICAgdGhpcy5zaG93SW52ZW50b3J5ID0gZGF0YS5kcm9wZG93bnNGbGFnLnNob3dEaWFsb2dJbnZlbnRvcnk7XHJcbiAgICB0aGlzLnNob3dOZXdQcm9kdWN0UGlja2VyID0gZGF0YS5kcm9wZG93bnNGbGFnLnNob3dOZXdQcm9kdWN0UGlja2VyO1xyXG4gICAgdGhpcy5kcm9wZG93bkwxID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDE7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDIgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MMjtcclxuICAgIHRoaXMuZHJvcGRvd25MMyA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkwzO1xyXG4gICAgdGhpcy5kcm9wZG93bkw0ID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDQ7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDFMYWJlbCA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkwxTGFiZWw7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDJMYWJlbCA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkwyTGFiZWw7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDNMYWJlbCA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkwzTGFiZWw7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDRMYWJlbCA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkw0TGFiZWw7XHJcbiAgICB0aGlzLmNoZWNrU3VibWlzc2lvblN0YXR1cyA9IGRhdGEuZHJvcGRvd25zRmxhZy5jaGVja1N1Ym1pc3Npb25TdGF0dXM7XHJcbiAgICB0aGlzLmRyb3BEb3duQ291bnQgPSB0aGlzLmNvdW50VHJ1ZURyb3Bkb3ducyhkYXRhLmRyb3Bkb3duc0ZsYWcpO1xyXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8UHJvZHVjdD4odHJ1ZSwgZGF0YS5zZWxlY3RlZFByb2R1Y3RzIHx8IFtdKTtcclxuICAgIHRoaXMuaXNQcmljZURpc2FibGUgPSBkYXRhLmRyb3Bkb3duc0ZsYWcucHJpY2VEaXNhYmxlO1xyXG4gICAgdGhpcy5za3VUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8uc2t1VHdlZWsgfHwgXCJTS1UgTnVtYmVyXCI7XHJcbiAgICB0aGlzLmNvc3RUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8uY29zdFR3ZWVrIHx8IFwiWW91ciBUYXJnZXQgQ29zdFwiO1xyXG4gICAgdGhpcy5wcmljZVR3ZWVrID0gZGF0YS5kcm9wZG93bnNGbGFnPy5wcmljZVR3ZWVrIHx8IFwiUHJpY2VcIjtcclxuICAgIHRoaXMucHJvZHVjdFR3ZWVrID0gZGF0YS5kcm9wZG93bnNGbGFnPy5wcm9kdWN0VHdlZWsgfHwgXCJQcm9kdWN0IE5hbWVcIjtcclxuICAgIHRoaXMucXVhbnRpdHlUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8ucXVhbnRpdHlUd2VlayB8fCBcIlF1YW50aXR5XCI7XHJcbiAgICB0aGlzLnNob3dDb3N0ID0gZGF0YS5kcm9wZG93bnNGbGFnPy5zaG93RGlhbG9nQ29zdDtcclxuICAgIHRoaXMuY2F0ZWdvcnlUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8uY2F0ZWdvcnlUd2VlayB8fCBcIkNhdGVnb3J5IE5hbWVcIjtcclxuICAgIHRoaXMuc3ViQ2F0ZWdvcnlUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8uc3ViQ2F0ZWdvcnlUd2VlayB8fCBcIlN1YiBDYXRlZ29yeVwiO1xyXG4gICAgdGhpcy5pbnZlbnRvcnlUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8uaW52ZW50b3J5VHdlZWsgfHwgXCJJbnZlbnRvcnlcIjtcclxuICAgIGlmICghdGhpcy5zaG93Q2F0ZWdvcnkpIHtcclxuICAgICAgdGhpcy5yZW1vdmVDb2x1bW4oJ2NhdGVnb3J5TmFtZScpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dQcmljZSkge1xyXG4gICAgICB0aGlzLnJlbW92ZUNvbHVtbigncHJpY2UnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93U3ViY2F0ZWdvcnkpIHtcclxuICAgICAgdGhpcy5yZW1vdmVDb2x1bW4oJ3N1YkNhdGVnb3J5Jyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc2hvd1F1YW50aXR5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdRdWFudGl0eScpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dTa3VOdW1iZXIpIHtcclxuICAgICAgdGhpcy5yZW1vdmVDb2x1bW4oJ3NrdU51bWJlcicpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dJbnZlbnRvcnkpIHtcclxuICAgICAgdGhpcy5yZW1vdmVDb2x1bW4oJ2ludmVudG9yeScpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dDb3N0KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdjb3N0Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVDb2x1bW4oY29sdW1uTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNob3dBbGxwcm9kdWN0c0NvbHVtbnMgPSB0aGlzLnNob3dBbGxwcm9kdWN0c0NvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4gIT09IGNvbHVtbk5hbWUpO1xyXG4gICAgdGhpcy5hZGRQcm9kdWN0c0NvbHVtbnMgPSB0aGlzLmFkZFByb2R1Y3RzQ29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbiAhPT0gY29sdW1uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybUFycmF5KCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0c0FycmF5ID0gdGhpcy5mb3JtLmdldCgnc2VsZWN0ZWRQcm9kdWN0cycpIGFzIEZvcm1BcnJheTtcclxuICAgIGlmICghc2VsZWN0ZWRQcm9kdWN0c0FycmF5KSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3NlbGVjdGVkUHJvZHVjdHMgRm9ybUFycmF5IG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2gocHJvZHVjdCA9PiB7XHJcbiAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgIHByaWNlOiBbcHJvZHVjdD8ucHJpY2UgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIHRleHQ6IFtwcm9kdWN0Py50ZXh0IHx8ICcnXSxcclxuICAgICAgICBxdWFudGl0eTogW3Byb2R1Y3QucXVhbnRpdHkgfHwgJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgIGNhdGVnb3J5OiBbcHJvZHVjdD8uY2F0ZWdvcnkgfHwgJyddLFxyXG4gICAgICAgIHN1YkNhdGVnb3J5OiBbcHJvZHVjdD8uc3ViQ2F0ZWdvcnkgfHwgJyddLFxyXG4gICAgICAgIHZhbHVlOiBbcHJvZHVjdD8udmFsdWUgfHwgJyddLFxyXG4gICAgICAgIG90aGVySW5mb3JtYXRpb24wOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjAgfHwgJycsIHRoaXMuc2hvd0Nvc3QgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogW11dLFxyXG4gICAgICAgIG90aGVySW5mb3JtYXRpb24xOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjEgfHwgJyddLFxyXG4gICAgICAgIG90aGVySW5mb3JtYXRpb24yOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjIgfHwgJyddXHJcbiAgICAgIH0pKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5jb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xyXG4gICAgICB0aGlzLmlzUHJpY2VEaXNhYmxlID8gY29udHJvbC5nZXQoJ3ByaWNlJyk/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/Lm90aGVySW5mb3JtYXRpb24wIHx8ICcnLCB0aGlzLnNob3dDb3N0ID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFtdXSxcclxuICAgICAgICAgIG90aGVySW5mb3JtYXRpb24xOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjEgfHwgJyddLFxyXG4gICAgICAgICAgb3RoZXJJbmZvcm1hdGlvbjI6IFtwcm9kdWN0Py5vdGhlckluZm9ybWF0aW9uMiA/PyAnJ11cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocHJvZHVjdEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0c0FycmF5LnB1c2gocHJvZHVjdEZvcm1Hcm91cCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgRm9ybUdyb3VwIGZvciBwcm9kdWN0IGF0IGluZGV4ICR7aW5kZXh9LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICBjb25zdCBwcmljZUNvbnRyb2wgPSBjb250cm9sLmdldCgncHJpY2UnKTtcclxuICAgICAgICAgIGlmIChwcmljZUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1ByaWNlRGlzYWJsZSA/IHByaWNlQ29udHJvbC5kaXNhYmxlKCkgOiBwcmljZUNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcmljZSBjb250cm9sIGlzIG1pc3NpbmcgaW4gRm9ybUdyb3VwIGF0IGluZGV4ICR7aW5kZXh9LmApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBVbmV4cGVjdGVkIGNvbnRyb2wgdHlwZSBhdCBpbmRleCAke2luZGV4fTpgLCBjb250cm9sKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignU2VsZWN0aW9uLnNlbGVjdGVkIGlzIG5vdCBhbiBhcnJheTonLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0VG90YWxSb3dzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRSb3dzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBhbnksIGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIGxldCBzZWxlY3RlZFZhbHVlO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50Lm9wdGlvbiAmJiBldmVudC5vcHRpb24udmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBzZWxlY3RlZFZhbHVlID0gZXZlbnQub3B0aW9uLnZhbHVlLmlkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGV2ZW50O1xyXG4gICAgfVxyXG4gICAgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkxJykge1xyXG4gICAgICB0aGlzLmxldmVsT25lSWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Ud28gPSBbXTtcclxuICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duVGhyZWUgPSBbXTtcclxuICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duRm91ciA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5kcm9wZG93bkwyICYmIHRoaXMubGV2ZWxPbmVJZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkMiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9hZERyb3Bkb3duTDIodGhpcy5sZXZlbE9uZUlkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICB0aGlzLmxldmVsT25lSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxUd29JZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxGb3VySWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTInKSB7XHJcbiAgICAgIHRoaXMubGV2ZWxUd29JZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93blRocmVlID0gW107XHJcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duTDMgJiYgdGhpcy5sZXZlbE9uZUlkICYmIHRoaXMubGV2ZWxUd29JZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2FkRHJvcGRvd25MMyh0aGlzLmxldmVsT25lSWQsIHRoaXMubGV2ZWxUd29JZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgLy90aGlzLmxldmVsVHdvSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxUaHJlZUlkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxldmVsRm91cklkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQ0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMjA7XHJcbiAgICAgIHRoaXMuZ2V0UHJvZHVjdHMoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkzJykge1xyXG4gICAgICB0aGlzLmxldmVsVGhyZWVJZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93bkZvdXIgPSBbXTtcclxuICAgICAgaWYgKHRoaXMuZHJvcGRvd25MNCAmJiB0aGlzLmxldmVsT25lSWQgJiYgdGhpcy5sZXZlbFR3b0lkICYmIHRoaXMubGV2ZWxUaHJlZUlkKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKT8uZW5hYmxlKCk7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkNCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9hZERyb3Bkb3duTDQodGhpcy5sZXZlbE9uZUlkLCB0aGlzLmxldmVsVHdvSWQsIHRoaXMubGV2ZWxUaHJlZUlkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICAvL3RoaXMubGV2ZWxUaHJlZUlkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxldmVsRm91cklkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQ0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMjA7XHJcbiAgICAgIHRoaXMuZ2V0UHJvZHVjdHMoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnk0Jykge1xyXG4gICAgICB0aGlzLmxldmVsRm91cklkID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IDIwO1xyXG4gICAgICB0aGlzLmdldFByb2R1Y3RzKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyc0NvdW50KCk7XHJcbiAgfVxyXG5cclxuICBnZXRQcm9kdWN0cyhmbGFnOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNwaW5uZXJGbGFnID0gdHJ1ZTtcclxuICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuc2VhcmNoUXVlcnk7XHJcbiAgICBjb25zdCBsZXZlbE9uZUlkID0gdGhpcy5sZXZlbE9uZUlkID8gdGhpcy5sZXZlbE9uZUlkIDogMDtcclxuICAgIGNvbnN0IGxldmVsVHdvSWQgPSB0aGlzLmxldmVsVHdvSWQgPyB0aGlzLmxldmVsVHdvSWQgOiAwO1xyXG4gICAgY29uc3QgbGV2ZWxUaHJlZUlkID0gdGhpcy5sZXZlbFRocmVlSWQgPyB0aGlzLmxldmVsVGhyZWVJZCA6IDA7XHJcbiAgICBjb25zdCBsZXZlbEZvdXJJZCA9IHRoaXMubGV2ZWxGb3VySWQgPyB0aGlzLmxldmVsRm91cklkIDogMDtcclxuICAgIGlmICh0aGlzLnNob3VsZFJlc2V0VGFibGUoc2VhcmNoLCBsZXZlbE9uZUlkLCBsZXZlbFR3b0lkLCBsZXZlbFRocmVlSWQsIGxldmVsRm91cklkKSkge1xyXG4gICAgICB0aGlzLnJlc2V0VGFibGUoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb21tb25TZXZpY2UubG9hZFByb2R1Y3RzKHRoaXMucGFnZU51bWJlciwgdGhpcy5wYWdlU2l6ZSwgc2VhcmNoLCB0cnVlLCBmYWxzZSwgbGV2ZWxPbmVJZCwgbGV2ZWxUd29JZCwgbGV2ZWxUaHJlZUlkLCBsZXZlbEZvdXJJZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyRmxhZyA9IGZhbHNlO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gcmVzcG9uc2U/LmRhdGE/LnRvdGFsUGFnZXM7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGEuZGF0YVNvdXJjZTtcclxuICAgICAgICB0aGlzLmdldFRvdGFsUmVjb3JkcyA9IHJlc3BvbnNlLmRhdGEudG90YWxSZWNvcmRzXHJcbiAgICAgICAgLy8gU3luYyBzZWxlY3Rpb24gc3RhdGUgd2l0aCBuZXcgZGF0YVxyXG4gICAgICAgIGRhdGEuZm9yRWFjaChwcm9kdWN0ID0+IHtcclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUHJvZHVjdCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmZpbmQocCA9PiBwLnZhbHVlID09PSBwcm9kdWN0LnZhbHVlKTtcclxuICAgICAgICAgIGlmIChleGlzdGluZ1Byb2R1Y3QpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9kdWN0LCBleGlzdGluZ1Byb2R1Y3QpOyAvLyBSZXBsYWNlIHByb2R1Y3Qgd2l0aCBleGlzdGluZyByZWZlcmVuY2VcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHByb2R1Y3QpOyAvLyBNYXJrIGFzIHNlbGVjdGVkXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRQcm9kdWN0cygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBBdm9pZCBkdXBsaWNhdGVzIGluIHRoZSBkYXRhU291cmNlXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQcm9kdWN0VmFsdWVzID0gbmV3IFNldCh0aGlzLmRhdGFTb3VyY2UuZGF0YS5tYXAocHJvZHVjdCA9PiBwcm9kdWN0LnZhbHVlKSk7XHJcbiAgICAgICAgY29uc3QgdW5pcXVlTmV3RGF0YSA9IGRhdGEuZmlsdGVyKHByb2R1Y3QgPT4gIWV4aXN0aW5nUHJvZHVjdFZhbHVlcy5oYXMocHJvZHVjdC52YWx1ZSkpO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPiAwICYmIGZsYWcpIHtcclxuICAgICAgICAgIC8vIGRhdGEuZm9yRWFjaChpdGVtID0+IHRoaXMuZGF0YVNvdXJjZS5kYXRhLnB1c2goaXRlbSkpO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbLi4udGhpcy5kYXRhU291cmNlLmRhdGEsIC4uLnVuaXF1ZU5ld0RhdGFdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxvYWRpbmdGbGFnID0gdHJ1ZTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG1pZGRsZVBvc2l0aW9uID0gdGhpcy50cmFja0hlaWdodCAvIDIgLSA1MDtcclxuICAgICAgICAgIGlmICh0aGlzLmZpcnN0c2Nyb2xsYWJsZURpdiAmJiB0aGlzLmZpcnN0c2Nyb2xsYWJsZURpdi5uYXRpdmVFbGVtZW50ICYmIGZsYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5maXJzdHNjcm9sbGFibGVEaXYubmF0aXZlRWxlbWVudC5zY3JvbGxUbyh7IHRvcDogbWlkZGxlUG9zaXRpb24sIGJlaGF2aW9yOiAnYXV0bycgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMjUwKTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVEYXRhU291cmNlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVJvdyhldmVudDogRXZlbnQsIGVsZW1lbnQ6IFByb2R1Y3QpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGxldCBtZXNzYWdlID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBwcm9kdWN0Pyc7XHJcbiAgICBsZXQgc2hvd0J1dHRvbiA9IHRydWU7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWREYXRhU291cmNlLmRhdGEuaW5kZXhPZihlbGVtZW50KTtcclxuICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5jaGVja1N1Ym1pc3Npb25TdGF0dXMpIHtcclxuICAgICAgICBtZXNzYWdlID0gJ1BsZWFzZSBzZWxlY3QgYXQgbGVhc3Qgb25lIHByb2R1Y3QuJztcclxuICAgICAgICBzaG93QnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXHJcbiAgICAgICAgd2lkdGg6ICc5MCUnLFxyXG4gICAgICAgIG1heFdpZHRoOiAnNDAwcHgnLFxyXG4gICAgICAgIGRhdGE6IHsgbWVzc2FnZTogbWVzc2FnZSwgYnV0dG9uU3RhdHVzOiBzaG93QnV0dG9uIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhU291cmNlLmRhdGEuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRhU291cmNlLl91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc2VsZWN0KGVsZW1lbnQpO1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQcm9kdWN0c0FycmF5ID0gdGhpcy5mb3JtLmdldCgnc2VsZWN0ZWRQcm9kdWN0cycpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICAgIGNvbnN0IHByb2R1Y3RJbmRleCA9IHNlbGVjdGVkUHJvZHVjdHNBcnJheS5jb250cm9scy5maW5kSW5kZXgoY29udHJvbCA9PiBjb250cm9sLnZhbHVlLnZhbHVlID09PSBlbGVtZW50LnZhbHVlKTtcclxuICAgICAgICAgIGlmIChwcm9kdWN0SW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZFByb2R1Y3RzQXJyYXkucmVtb3ZlQXQocHJvZHVjdEluZGV4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TY3JvbGwoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy50cmFja0hlaWdodCA9IGV2ZW50LnRhcmdldC5zY3JvbGxIZWlnaHQgLSBldmVudC50YXJnZXQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgaWYgKHRoaXMubG9hZGluZ0ZsYWcgJiYgKE1hdGguZmxvb3IoZXZlbnQudGFyZ2V0LnNjcm9sbFRvcCAvIHRoaXMudHJhY2tIZWlnaHQgKiAxMDApID4gNTApKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZ0ZsYWcgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMucGFnZU51bWJlciA8IHRoaXMudG90YWxQYWdlcykge1xyXG4gICAgICAgIHRoaXMucGFnZU51bWJlciA9IHRoaXMucGFnZU51bWJlciArIDE7XHJcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0cyh0cnVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdGbGFnID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wcmV2U2Nyb2xsUG9zaXRpb24gPSBldmVudC50YXJnZXQuc2Nyb2xsVG9wO1xyXG4gIH1cclxuXHJcbiAgY291bnRUcnVlRHJvcGRvd25zKG9iaikge1xyXG4gICAgLy8gRHluYW1pY2FsbHkgZmluZCBhbGwga2V5cyB0aGF0IHN0YXJ0IHdpdGggJ2Ryb3Bkb3duTCcgYW5kIGFyZSBib29sZWFuICh0cnVlL2ZhbHNlKVxyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcclxuICAgICAgLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2Ryb3Bkb3duTCcpICYmIHR5cGVvZiBvYmpba2V5XSA9PT0gJ2Jvb2xlYW4nICYmIG9ialtrZXldID09PSB0cnVlKVxyXG4gICAgICAubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyogVXNlIHRoZSBwcm9wZXJ0eSB0aGF0IHNob3VsZCBkaXNwbGF5IGluIHRoZSBpbnB1dCBmaWVsZCAqL1xyXG4gIGRpc3BsYXlGbihvcHRpb24pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi5uYW1lIDogJyc7XHJcbiAgfVxyXG5cclxuICBvblF1YW50aXR5Q2hhbmdlKGV2ZW50OiBhbnksIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgY29uc3QgcXVhbnRpdHlDb250cm9sID0gdGhpcy5zZWxlY3RlZFByb2R1Y3RzLmF0KGluZGV4KS5nZXQoJ3F1YW50aXR5Jyk7XHJcblxyXG4gICAgaWYgKCFxdWFudGl0eUNvbnRyb2wpIHJldHVybjtcclxuXHJcbiAgICAvLyBDbGVhciBhbnkgcHJldmlvdXMgZXJyb3JzXHJcbiAgICBxdWFudGl0eUNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG5cclxuICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBlbXB0eSwgc2V0ICdyZXF1aXJlZCcgZXJyb3JcclxuICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgcXVhbnRpdHlDb250cm9sLnNldEVycm9ycyh7ICdyZXF1aXJlZCc6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIDEsIHNldCAnbWluJyBlcnJvclxyXG4gICAgZWxzZSBpZiAoTnVtYmVyKHZhbHVlKSA8IDEpIHtcclxuICAgICAgcXVhbnRpdHlDb250cm9sLnNldEVycm9ycyh7ICdtaW4nOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgdGhlIHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyLCBzZXQgJ3BhdHRlcm4nIGVycm9yXHJcbiAgICBlbHNlIGlmICghL15cXGQrJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgcXVhbnRpdHlDb250cm9sLnNldEVycm9ycyh7ICdwYXR0ZXJuJzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBnb1RvTmV4dFBhZ2UoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gJ2VkaXQtc2F2ZSc7XHJcbiAgfVxyXG5cclxuICBnb1RvUHJldmlvdXNQYWdlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9ICdzZWxlY3QtcHJvZHVjdHMnO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbigpIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gIXRoaXMuaXNWaXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJGaWVsZChmaWVsZDogc3RyaW5nLCBjYXRlZ29yeTogc3RyaW5nLCBldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTsgLy8gU3RvcCBldmVudCBwcm9wYWdhdGlvbiB0byBwcmV2ZW50IGRyb3Bkb3duIHJlb3BlblxyXG4gICAgdGhpcy5mb3JtLmdldChmaWVsZCk/LnNldFZhbHVlKG51bGwpO1xyXG4gICAgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkxJykge1xyXG4gICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0ZWQobnVsbCwgJ2NhdGVnb3J5MScpO1xyXG4gICAgfSBlbHNlIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5MicpIHtcclxuICAgICAgdGhpcy5vbk9wdGlvblNlbGVjdGVkKG51bGwsICdjYXRlZ29yeTInKTtcclxuICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTMnKSB7XHJcbiAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChudWxsLCAnY2F0ZWdvcnkzJyk7XHJcbiAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnk0Jykge1xyXG4gICAgICB0aGlzLmxldmVsRm91cklkID0gbnVsbDtcclxuICAgICAgdGhpcy5vbk9wdGlvblNlbGVjdGVkKG51bGwsICdjYXRlZ29yeTQnKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyc0NvdW50KCk7XHJcbiAgfVxyXG5cclxuICBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCwgY2F0ZWdvcnk6IHN0cmluZykge1xyXG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICBpZiAoIWlucHV0VmFsdWUpIHtcclxuICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgaW5wdXQgaXMgY2xlYXJlZFxyXG4gICAgICB0aGlzLmNsZWFyRmllbGQoYGRyb3Bkb3duTGV2ZWwke3RoaXMuZ2V0RHJvcGRvd25MZXZlbChjYXRlZ29yeSl9YCwgY2F0ZWdvcnksIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RHJvcGRvd25MZXZlbChjYXRlZ29yeTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHN3aXRjaCAoY2F0ZWdvcnkpIHtcclxuICAgICAgY2FzZSAnY2F0ZWdvcnkxJzogcmV0dXJuIDE7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5Mic6IHJldHVybiAyO1xyXG4gICAgICBjYXNlICdjYXRlZ29yeTMnOiByZXR1cm4gMztcclxuICAgICAgY2FzZSAnY2F0ZWdvcnk0JzogcmV0dXJuIDQ7XHJcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQWN0aXZlRmlsdGVyc0NvdW50KCkge1xyXG4gICAgdGhpcy5hY3RpdmVGaWx0ZXJzQ291bnQgPSAwO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkgIT09ICcnKSB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCsrO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwxJykudmFsdWUpIHRoaXMuYWN0aXZlRmlsdGVyc0NvdW50Kys7XHJcbiAgICBpZiAodGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDInKS52YWx1ZSkgdGhpcy5hY3RpdmVGaWx0ZXJzQ291bnQrKztcclxuICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnZhbHVlKSB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCsrO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0JykudmFsdWUpIHRoaXMuYWN0aXZlRmlsdGVyc0NvdW50Kys7XHJcbiAgfVxyXG5cclxuICBjbGVhcklmRW1wdHkoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKCFldmVudC50YXJnZXQudmFsdWUpIHtcclxuICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzWydzZWFyY2hQcm9kdWN0TmFtZSddLnNldFZhbHVlKCcnKTtcclxuICAgICAgdGhpcy5zZWFyY2hRdWVyeSA9ICcnO1xyXG4gICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLnNlYXJjaFF1ZXJ5O1xyXG4gICAgICBjb25zdCBsZXZlbE9uZUlkID0gdGhpcy5sZXZlbE9uZUlkID8gdGhpcy5sZXZlbE9uZUlkIDogMDtcclxuICAgICAgY29uc3QgbGV2ZWxUd29JZCA9IHRoaXMubGV2ZWxUd29JZCA/IHRoaXMubGV2ZWxUd29JZCA6IDA7XHJcbiAgICAgIGNvbnN0IGxldmVsVGhyZWVJZCA9IHRoaXMubGV2ZWxUaHJlZUlkID8gdGhpcy5sZXZlbFRocmVlSWQgOiAwO1xyXG4gICAgICBjb25zdCBsZXZlbEZvdXJJZCA9IHRoaXMubGV2ZWxGb3VySWQgPyB0aGlzLmxldmVsRm91cklkIDogMDtcclxuICAgICAgaWYgKHRoaXMuc2hvdWxkUmVzZXRUYWJsZShzZWFyY2gsIGxldmVsT25lSWQsIGxldmVsVHdvSWQsIGxldmVsVGhyZWVJZCwgbGV2ZWxGb3VySWQpKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldFRhYmxlKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldFRhYmxlKCkge1xyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDEnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJyk/LmRpc2FibGUoKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmRpc2FibGUoKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmRpc2FibGUoKTtcclxuICAgIHRoaXMubGV2ZWxPbmVJZCA9IDA7XHJcbiAgICB0aGlzLmxldmVsVHdvSWQgPSAwO1xyXG4gICAgdGhpcy5sZXZlbFRocmVlSWQgPSAwO1xyXG4gICAgdGhpcy5sZXZlbEZvdXJJZCA9IDA7XHJcbiAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IDIwO1xyXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzWydzZWFyY2hQcm9kdWN0TmFtZSddLnNldFZhbHVlKCcnKTtcclxuICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW107XHJcbiAgICB0aGlzLnNwaW5uZXJGbGFnID0gZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkUmVzZXRUYWJsZShzZWFyY2g6IHN0cmluZywgbGV2ZWxPbmVJZDogbnVtYmVyLCBsZXZlbFR3b0lkOiBudW1iZXIsIGxldmVsVGhyZWVJZDogbnVtYmVyLCBsZXZlbEZvdXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gc2VhcmNoID09PSAnJyAmJiBsZXZlbE9uZUlkID09PSAwICYmIGxldmVsVHdvSWQgPT09IDAgJiYgbGV2ZWxUaHJlZUlkID09PSAwICYmIGxldmVsRm91cklkID09PSAwO1xyXG4gIH1cclxuXHJcbiAgLyogVGhpcyBmdW5jdGlvbiB3aWxsIG1hbmFnZSBwcmljZSB2YWxpZGF0aW9uICovXHJcbiAgVmFsaWRhdGVQcmljZShldmVudDogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgIGNvbnN0IHByaWNlQ29udHJvbCA9IHRoaXMuc2VsZWN0ZWRQcm9kdWN0cy5hdChpbmRleCkuZ2V0KCdwcmljZScpO1xyXG4gICAgaWYgKCFwcmljZUNvbnRyb2wpIHJldHVybjtcclxuICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyBlcnJvcnNcclxuICAgIHByaWNlQ29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICAvLyBJZiB0aGUgdmFsdWUgaXMgZW1wdHksIHNldCAncmVxdWlyZWQnIGVycm9yXHJcbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHByaWNlQ29udHJvbC5zZXRFcnJvcnMoeyAncmVxdWlyZWQnOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiAxLCBzZXQgJ21pbicgZXJyb3JcclxuICAgIGVsc2UgaWYgKE51bWJlcih2YWx1ZSkgPCAwKSB7XHJcbiAgICAgIHByaWNlQ29udHJvbC5zZXRFcnJvcnMoeyAnbWluJzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIC8vIENoZWNrIGlmIHZhbHVlIGNvbnRhaW5zIG9ubHkgbnVtYmVycyBhbmQgZGVjaW1hbHMgKGJ1dCBubyBhbHBoYWJldHMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzKVxyXG4gICAgZWxzZSBpZiAoIS9eXFxkKlxcLj9cXGQqJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgcHJpY2VDb250cm9sLnNldEVycm9ycyh7ICdpbnZhbGlkRm9ybWF0JzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJzcGlubmVyRmxhZ1wiIGNsYXNzPVwiT3ZlcmxheURpdlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIk92ZXJsYXlEaXZDb250ZW50XCI+XHJcbiAgICAgICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLWhlYWRpbmdcIj5cclxuICAgIDxoMSBtYXQtZGlhbG9nLXRpdGxlPkFkZCBQcm9kdWN0czwvaDE+XHJcbjwvZGl2PlxyXG5cclxuPG1hdC1kaWFsb2ctY29udGVudCBbbmdDbGFzc109XCJkYXRhU291cmNlPy5kYXRhPy5sZW5ndGggPiAwID8gJ3Byb2R1Y3RzLXNjcm9sbC12aXNpYmxlJzogJydcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLWNvbnRlbnRcIj5cclxuICAgICAgICA8IS0tU2VhcmNoIFN0YXJ0LS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJhc2ljLXNlYXJjaFwiIFtoaWRkZW5dPVwiY3VycmVudFBhZ2UgIT09ICdzZWxlY3QtcHJvZHVjdHMnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXNpYy1zZWFyY2gtd3JwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIHZpZXdCb3g9XCIwIDAgMjQgMjVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKDAgMCAwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjI1IDIuNzVDNi4xNDE1NCAyLjc1IDIgNi44OTAyOSAyIDExLjk5OEMyIDE3LjEwNTYgNi4xNDE1NCAyMS4yNDU5IDExLjI1IDIxLjI0NTlDMTMuNTMzNSAyMS4yNDU5IDE1LjYyMzggMjAuNDE4NyAxNy4yMzczIDE5LjA0NzVMMjAuNzE4MiAyMi41Mjg3QzIxLjAxMSAyMi44MjE2IDIxLjQ4NTkgMjIuODIxNyAyMS43Nzg4IDIyLjUyODhDMjIuMDcxNyAyMi4yMzU5IDIyLjA3MTggMjEuNzYxIDIxLjc3ODkgMjEuNDY4MUwxOC4yOTgzIDE3Ljk4NzJDMTkuNjcxNCAxNi4zNzM2IDIwLjUgMTQuMjgyNiAyMC41IDExLjk5OEMyMC41IDYuODkwMjkgMTYuMzU4NSAyLjc1IDExLjI1IDIuNzVaTTMuNSAxMS45OThDMy41IDcuNzE5MDUgNi45Njk2MiA0LjI1IDExLjI1IDQuMjVDMTUuNTMwNCA0LjI1IDE5IDcuNzE5MDUgMTkgMTEuOTk4QzE5IDE2LjI3NjkgMTUuNTMwNCAxOS43NDU5IDExLjI1IDE5Ljc0NTlDNi45Njk2MiAxOS43NDU5IDMuNSAxNi4yNzY5IDMuNSAxMS45OThaXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXNlYXJjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlRHJvcGRvd25GaWx0ZXIoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgdHlwZT1cInRleHRcIiBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggUHJvZHVjdFwiIGZvcm1Db250cm9sTmFtZT1cInNlYXJjaFByb2R1Y3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJjbGVhcklmRW1wdHkoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYWR2ZmlsdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFkdlwiIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1yb3VuZFwiIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cInR1bmVcIj50dW5lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYWN0aXZlRmlsdGVyc0NvdW50ID4gMFwiIGNsYXNzPVwiY3VzdG9tLWJhZGdlXCI+e3sgYWN0aXZlRmlsdGVyc0NvdW50IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1idG5cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRHJvcGRvd25GaWx0ZXIoKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+U2VhcmNoPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS1TZWFyY2ggRW5kLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3Qtc2VsZWN0b3JcIj5cclxuICAgICAgICAgICAgPGRpdiBbaGlkZGVuXT1cImN1cnJlbnRQYWdlICE9PSAnc2VsZWN0LXByb2R1Y3RzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3Qtc2VsZWN0aW9uLWNvbnRhaW5lclwiICpuZ0lmPVwiaXNWaXNpYmxlICYmIGRyb3Bkb3duTDFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXNlbGVjdGlvblwiICpuZ0lmPVwiZHJvcGRvd25MMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJkcm9wRG93bkNvdW50ID09PSAxID8gJ25vLWNoaWxkJzogJ2NoaWxkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1hZHZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkFkdmFuY2VkIEZpbHRlcnM8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2xyLWFsbC1waWNrZXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlc2V0VGFibGUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFjdGl2ZUZpbHRlcnNDb3VudCA+IDBcIj5DbGVhciBBbGw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImRyb3Bkb3duTDFcIiBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ZHJvcGRvd25MMUxhYmVsfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZHJvcGRvd25MZXZlbDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQsICdjYXRlZ29yeTEnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBbZGlzcGxheVdpdGhdPVwiZGlzcGxheUZuXCIgI2F1dG8zPVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudCwgJ2NhdGVnb3J5MScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkRHJvcGRvd25PbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCAqbmdJZj1cImZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMScpLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpZWxkKCdkcm9wZG93bkxldmVsMScsICdjYXRlZ29yeTEnLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbmNsb3NlXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uZHJvcGRvd25cIiBtYXRTdWZmaXg+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJkcm9wZG93bkwyXCIgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2Ryb3Bkb3duTDJMYWJlbH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRyb3Bkb3duTGV2ZWwyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0bzRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50LCAnY2F0ZWdvcnkyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiICNhdXRvND1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQsICdjYXRlZ29yeTInKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZERyb3Bkb3duVHdvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKm5nSWY9XCJmb3JtLmdldCgnZHJvcGRvd25MZXZlbDInKS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZCgnZHJvcGRvd25MZXZlbDInLCAnY2F0ZWdvcnkyJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25jbG9zZVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbmRyb3Bkb3duXCIgbWF0U3VmZml4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkLWljb24nOiBpc0Rpc2FibGVkMn1cIj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJkcm9wZG93bkwzXCIgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2Ryb3Bkb3duTDNMYWJlbH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRyb3Bkb3duTGV2ZWwzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0bzVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50LCAnY2F0ZWdvcnkzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiICNhdXRvNT1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQsICdjYXRlZ29yeTMnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZERyb3Bkb3duVGhyZWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCAqbmdJZj1cImZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpZWxkKCdkcm9wZG93bkxldmVsMycsICdjYXRlZ29yeTMnLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbmNsb3NlXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uZHJvcGRvd25cIiBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1pY29uJzogaXNEaXNhYmxlZDN9XCI+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJkcm9wZG93bkw0XCIgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2Ryb3Bkb3duTDRMYWJlbH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImRyb3Bkb3duTGV2ZWw0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0bzZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50LCAnY2F0ZWdvcnk0JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlGblwiICNhdXRvNj1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwib25PcHRpb25TZWxlY3RlZCgkZXZlbnQsICdjYXRlZ29yeTQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZERyb3Bkb3duRm91clwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4ICpuZ0lmPVwiZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0JykudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmllbGQoJ2Ryb3Bkb3duTGV2ZWw0JywgJ2NhdGVnb3J5NCcsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uY2xvc2VcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb25kcm9wZG93blwiIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlLWljb24nOiBpc0Rpc2FibGVkNH1cIj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAjZmlyc3RzY3JvbGxhYmxlRGl2IGlkPVwiZmlyc3RzY3JvbGxhYmxlRGl2XCIgY2xhc3M9XCJuZXctY2xhc3MgZmlyc3QtZGl2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHNjcm9sbCk9XCJvblNjcm9sbCgkZXZlbnQpXCIgW25nQ2xhc3NdPVwiZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID4gMCA/ICd0YmwtcmVjb3JkLWZvdW5kJzogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgY2xhc3M9XCJtYXQtdGFibGUgYWJjXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBkYXRhU291cmNlPy5kYXRhPy5sZW5ndGggPiAwOyBlbHNlIG5vRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyB0b2dnbGVTZWxlY3Rpb24ocm93KSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicHJvZHVjdE5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e3Byb2R1Y3RUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Py50ZXh0fX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJza3VOdW1iZXJcIiAqbmdJZj1cInNob3dTa3VOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e3NrdVR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQ/Lm90aGVySW5mb3JtYXRpb24wfX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbnZlbnRvcnlcIiAqbmdJZj1cInNob3dJbnZlbnRvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e2ludmVudG9yeVR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQ/Lm90aGVySW5mb3JtYXRpb24xfX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJhZGRQcm9kdWN0c0NvbHVtbnNcIj48L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGFkZFByb2R1Y3RzQ29sdW1ucztcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7dG9nZ2xlU2VsZWN0aW9uKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCI+PC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0RhdGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tZGF0YS1tZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLU5vIGRhdGEgZm91bmQuLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBwLWVtcHR5LXN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWctZW1wdHktc3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJlbXB0eUltYWdlXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+Tm8gcmVjb3JkcyB0byBzaG93IGF0IHRoZSBtb21lbnQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGVhc2UgbW9kaWZ5IHlvdXIgc2VhcmNoIGNyaXRlcmlhIHRvIGZpbmQgdGhlIGRlc2lyZWQgcmVzdWx0PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctc3VtbWFyeVwiICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBkYXRhU291cmNlPy5kYXRhPy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+U2VsZWN0ZWQ6IDxzdHJvbmc+e3sgZ2V0U2VsZWN0ZWRSb3dzQ291bnQoKSB9fTwvc3Ryb25nPiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5Ub3RhbCBSZWNvcmRzOiA8c3Ryb25nPnt7IGdldFRvdGFsUmVjb3JkcyB9fTwvc3Ryb25nPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgW2hpZGRlbl09XCJjdXJyZW50UGFnZSAhPT0gJ2VkaXQtc2F2ZSdcIj5cclxuICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXctY2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RlZERhdGFTb3VyY2UgJiYgc2VsZWN0ZWREYXRhU291cmNlLmRhdGEubGVuZ3RoID4gMCA/ICdhZGRlZC1wcm9kdWN0cyc6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwic2VsZWN0ZWREYXRhU291cmNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWREYXRhU291cmNlICYmIHNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA+IDA7IGVsc2Ugc2hvd0JsYW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlbGV0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGVsZXRlLWJ0bi1waWNrZXJcIiBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3JlbW92ZVJvdygkZXZlbnQsIGVsZW1lbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJmYWxzZVwiIGFyaWEtbGFiZWw9XCJSZW1vdmUgcm93XCI+ZGVsZXRlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwcm9kdWN0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7cHJvZHVjdFR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQudGV4dH19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY2F0ZWdvcnlOYW1lXCIgKm5nSWY9XCJzaG93Q2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e2NhdGVnb3J5VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudC5jYXRlZ29yeX19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3ViQ2F0ZWdvcnlcIiAqbmdJZj1cInNob3dTdWJjYXRlZ29yeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7c3ViQ2F0ZWdvcnlUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LnN1YkNhdGVnb3J5fX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwcmljZVwiICpuZ0lmPVwic2hvd1ByaWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj57e3ByaWNlVHdlZWt9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoIHNlbGVjdC1wcmljZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e3ByaWNlVHdlZWt9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJzZWxlY3RlZFByb2R1Y3RzLmF0KGkpLmdldCgncHJpY2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIlZhbGlkYXRlUHJpY2UoJGV2ZW50LCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdwcmljZScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3ByaWNlJykuaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVnYXRpdmUgbnVtYmVycyBhcmUgbm90IGFsbG93ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3ByaWNlJykuaGFzRXJyb3IoJ2ludmFsaWRGb3JtYXQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgbnVtYmVycyBhbmQgZGVjaW1hbHMgYXJlIGFsbG93ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiUXVhbnRpdHlcIiAqbmdJZj1cInNob3dRdWFudGl0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7cXVhbnRpdHlUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7cXVhbnRpdHlUd2Vla319PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdxdWFudGl0eScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIHN0ZXA9XCIxXCIgKGlucHV0KT1cIm9uUXVhbnRpdHlDaGFuZ2UoJGV2ZW50LCBpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdxdWFudGl0eScpLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3F1YW50aXR5JykuaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbnRpdHkgY2FuIG5vdCBiZSBsZXNzIHRoYW4gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3F1YW50aXR5JykuaGFzRXJyb3IoJ3BhdHRlcm4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxzIG5vdCBhbGxvd2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNrdU51bWJlclwiICpuZ0lmPVwic2hvd1NrdU51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7c2t1VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50Py5vdGhlckluZm9ybWF0aW9uMH19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW52ZW50b3J5XCIgKm5nSWY9XCJzaG93SW52ZW50b3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3tpbnZlbnRvcnlUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/Lm90aGVySW5mb3JtYXRpb24xfX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY29zdFwiICpuZ0lmPVwic2hvd0Nvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPnt7Y29zdFR3ZWVrfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aCBzZWxlY3QtY29zdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2Nvc3RUd2Vla319PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdvdGhlckluZm9ybWF0aW9uMCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFByb2R1Y3RzLmF0KGkpLmdldCgnb3RoZXJJbmZvcm1hdGlvbjAnKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwic2hvd0FsbHByb2R1Y3RzQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogc2hvd0FsbHByb2R1Y3RzQ29sdW1ucztcIj48L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSAjc2hvd0JsYW5rPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGRhdGEgZm91bmQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd0JsYW5rPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcC1lbXB0eS1zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWVtcHR5LXN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZW1wdHlJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPk5vIFByb2R1Y3QgYWRkZWQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGVhc2UgZ28gYmFjayBhbmQgc3RhcnQgYWRkaW5nIHByb2R1Y3RzPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJzLWFjdGlvbi1zdGVwLW9uZVwiICpuZ0lmPVwiY3VycmVudFBhZ2UgPT09ICdzZWxlY3QtcHJvZHVjdHMnXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJnb1RvTmV4dFBhZ2UoKVwiIFtkaXNhYmxlZF09XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24+TmV4dDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0LWRpYWxvZy1jbG9zZV09XCJmYWxzZVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFicy1hY3Rpb25cIiAqbmdJZj1cImN1cnJlbnRQYWdlID09PSAnZWRpdC1zYXZlJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYWN0aW9uLXdycFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImdvVG9QcmV2aW91c1BhZ2UoKVwiPkJhY2s8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjb2xvcj1cInByaW1hcnlcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25TdWJtaXQoKVwiPkFkZDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
|
|
801
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW9uLXByb2R1Y3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZW5kZXItbWF0ZXJpYWwtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1vbi1wcm9kdWN0cy9hZGQtb24tcHJvZHVjdHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlbmRlci1tYXRlcmlhbC1mb3Jtcy9zcmMvbGliL2NvbXBvbmVudHMvYWRkLW9uLXByb2R1Y3RzL2FkZC1vbi1wcm9kdWN0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixTQUFTLEVBQWMsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQWUsU0FBUyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxlQUFlLEVBQTJCLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUVuRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NqRixNQUFNLE9BQU8sc0JBQXNCO0lBMEVqQyxZQUNTLFlBQWtELEVBQ2hDLElBQVMsRUFDMUIsRUFBZSxFQUNmLE1BQWlCLEVBQ2pCLFlBQTJCO1FBSjVCLGlCQUFZLEdBQVosWUFBWSxDQUFzQztR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S0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRCxVQUFVLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQzthQUMxQixDQUFDO1lBQ0YsVUFBVSxDQUFDLG1CQUFtQixFQUFFO2dCQUM5QixPQUFPLENBQUMsZUFBZSxDQUFDO2FBQ3pCLENBQUM7U0FDSCxDQUFDO0tBQ0g7MkZBRVUsc0JBQXNCO2tCQWpCbEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FHdkI7d0JBQ1YsT0FBTyxDQUFDLFdBQVcsRUFBRTs0QkFDbkIsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7NEJBQ3pFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDcEQsVUFBVSxDQUFDLG1CQUFtQixFQUFFO2dDQUM5QixPQUFPLENBQUMsZ0JBQWdCLENBQUM7NkJBQzFCLENBQUM7NEJBQ0YsVUFBVSxDQUFDLG1CQUFtQixFQUFFO2dDQUM5QixPQUFPLENBQUMsZUFBZSxDQUFDOzZCQUN6QixDQUFDO3lCQUNILENBQUM7cUJBQ0g7OzBCQThFRSxNQUFNOzJCQUFDLGVBQWU7MEhBeENRLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IG1hcCwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3Qge1xyXG4gIHByb2R1Y3ROYW1lOiBzdHJpbmc7XHJcbiAgcHJvZHVjdERlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgcXVhbnRpdHk6IGFueSxcclxuICBwcmljZTogYW55LFxyXG4gIHRleHQ6IGFueSxcclxuICBpZDogYW55LFxyXG4gIHZhbHVlOiBhbnksXHJcbiAgb3RoZXJJbmZvcm1hdGlvbjA6IGFueSxcclxuICBvdGhlckluZm9ybWF0aW9uMTogYW55LFxyXG4gIG90aGVySW5mb3JtYXRpb24yOiBhbnlcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtbWF0LWFkZC1vbi1wcm9kdWN0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1vbi1wcm9kdWN0cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLW9uLXByb2R1Y3RzLmNvbXBvbmVudC5jc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdzbGlkZURvd24nLCBbXHJcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG9wYWNpdHk6IDAsIG92ZXJmbG93OiAnaGlkZGVuJyB9KSksXHJcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgb3BhY2l0eTogMSB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbiA9PiB2aXNpYmxlJywgW1xyXG4gICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2Utb3V0JylcclxuICAgICAgXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGUgPT4gaGlkZGVuJywgW1xyXG4gICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4nKVxyXG4gICAgICBdKVxyXG4gICAgXSlcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBZGRPblByb2R1Y3RzQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcclxuICBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgZHJvcGRvd25PbmU6IHN0cmluZ1tdID0gW107XHJcbiAgZHJvcGRvd25Ud286IHN0cmluZ1tdID0gW107XHJcbiAgZHJvcGRvd25UaHJlZTogc3RyaW5nW10gPSBbXTtcclxuICBkcm9wZG93bkZvdXI6IHN0cmluZ1tdID0gW107XHJcbiAgZmlsdGVyZWREcm9wZG93bk9uZTogc3RyaW5nW10gPSBbXTtcclxuICBmaWx0ZXJlZERyb3Bkb3duVHdvOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGZpbHRlcmVkRHJvcGRvd25UaHJlZTogc3RyaW5nW10gPSBbXTtcclxuICBmaWx0ZXJlZERyb3Bkb3duRm91cjogc3RyaW5nW10gPSBbXTtcclxuICBhZGRQcm9kdWN0c0NvbHVtbnM6IHN0cmluZ1tdID0gWydzZWxlY3QnLCAncHJvZHVjdE5hbWUnLCAnc2t1TnVtYmVyJywgJ2ludmVudG9yeSddO1xyXG4gIHNob3dBbGxwcm9kdWN0c0NvbHVtbnM6IHN0cmluZ1tdID0gWydkZWxldGUnLCAncHJvZHVjdE5hbWUnLCAnY2F0ZWdvcnlOYW1lJywgJ3N1YkNhdGVnb3J5JywgJ1F1YW50aXR5JywgJ3ByaWNlJywgJ3NrdU51bWJlcicsICdpbnZlbnRvcnknLCAnY29zdCddO1xyXG4gIHF1YW50aXR5TGlzdDogbnVtYmVyW10gPSBbNSwgMTAsIDE1LCAyMCwgMjVdO1xyXG4gIEVMRU1FTlRfREFUQTogUHJvZHVjdFtdID0gW107XHJcbiAgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8UHJvZHVjdD4oKTtcclxuICBzZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSk7XHJcbiAgc2VsZWN0ZWREYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxQcm9kdWN0PihbXSk7XHJcbiAgc2VsZWN0ZWRDYXRlZ29yeTogYW55ID0gbnVsbDtcclxuICBzZWxlY3RlZFN1YkNhdGVnb3J5OiBhbnkgPSBudWxsO1xyXG4gIHNob3dDYXRlZ29yeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dTdWJjYXRlZ29yeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dQcmljZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd1F1YW50aXR5OiBib29sZWFuID0gdHJ1ZTtcclxuICBzaG93U2t1TnVtYmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd0ludmVudG9yeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dOZXdQcm9kdWN0UGlja2VyOiBib29sZWFuID0gdHJ1ZTtcclxuICBzZXRDYXRlZ29yeTogc3RyaW5nID0gJyc7XHJcbiAgc2V0U3ViQ2F0ZWdvcnk6IHN0cmluZyA9ICcnO1xyXG4gIGxvYWRpbmdGbGFnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcGFnZU51bWJlciA9IDE7XHJcbiAgcGFnZVNpemUgPSAyMDtcclxuICB0b3RhbFBhZ2VzID0gMDtcclxuICBzZWFyY2hRdWVyeSA9ICcnO1xyXG4gIGl0ZW1MaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHRyYWNrSGVpZ2h0OiBhbnk7XHJcbiAgcHJldlNjcm9sbFBvc2l0aW9uID0gMDsgLy8gVHJhY2sgdGhlIHByZXZpb3VzIHNjcm9sbCBwb3NpdGlvblxyXG4gIEBWaWV3Q2hpbGQoJ2ZpcnN0c2Nyb2xsYWJsZURpdicpIGZpcnN0c2Nyb2xsYWJsZURpdjogRWxlbWVudFJlZjtcclxuICBzcGlubmVyRmxhZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duTDE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bkwyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZHJvcGRvd25MMzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duTDQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkcm9wZG93bkwxTGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIGRyb3Bkb3duTDJMYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgZHJvcGRvd25MM0xhYmVsOiBzdHJpbmcgPSAnJztcclxuICBkcm9wZG93bkw0TGFiZWw6IHN0cmluZyA9ICcnO1xyXG4gIGRyb3BEb3duQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgbGV2ZWxPbmVJZDogYW55ID0gJyc7XHJcbiAgbGV2ZWxUd29JZDogYW55ID0gJyc7XHJcbiAgbGV2ZWxUaHJlZUlkOiBhbnkgPSAnJztcclxuICBsZXZlbEZvdXJJZDogYW55ID0gJyc7XHJcbiAgZGlzYWJsZVByaWNlOiBib29sZWFuID0gdHJ1ZTtcclxuICBjaGVja1N1Ym1pc3Npb25TdGF0dXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjdXJyZW50UGFnZTogc3RyaW5nID0gJ3NlbGVjdC1wcm9kdWN0cyc7XHJcbiAgaXNWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0Rpc2FibGVkMjogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNEaXNhYmxlZDM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRGlzYWJsZWQ0OiBib29sZWFuID0gdHJ1ZTtcclxuICBpc1ByaWNlRGlzYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgYWN0aXZlRmlsdGVyc0NvdW50OiBudW1iZXIgPSAwO1xyXG4gIGVtcHR5SW1hZ2U6IHN0cmluZyA9ICcvaS90YWJsZS1ncmlkLWVtcHR5LXN0YXRlLnN2Zyc7XHJcbiAgZ2V0VG90YWxSZWNvcmRzOiBudW1iZXIgPSAwO1xyXG4gIHByaWNlRmllbGRMYWJsZTogc3RyaW5nID0gJ1ByaWNlJztcclxuICB0YXJnZXRDb3N0OiBzdHJpbmcgPSAnWW91ciBUYXJnZXQgQ29zdCc7XHJcbiAgc2hvd0Nvc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBza3VUd2Vlazogc3RyaW5nID0gJ1NLVSBOdW1iZXInO1xyXG4gIGNvc3RUd2Vlazogc3RyaW5nID0gJ1lvdXIgVGFyZ2V0IENvc3QnO1xyXG4gIHByaWNlVHdlZWs6IHN0cmluZyA9ICdQcmljZSc7XHJcbiAgcHJvZHVjdFR3ZWVrOiBzdHJpbmcgPSAnUHJvZHVjdCBOYW1lJztcclxuICBxdWFudGl0eVR3ZWVrOiBzdHJpbmcgPSAnUXVhbnRpdHknO1xyXG4gIGNhdGVnb3J5VHdlZWs6IHN0cmluZyA9ICdDYXRlZ29yeSBOYW1lJztcclxuICBzdWJDYXRlZ29yeVR3ZWVrOiBzdHJpbmcgPSAnU3ViIENhdGVnb3J5JztcclxuICBpbnZlbnRvcnlUd2Vlazogc3RyaW5nID0gJ0ludmVudG9yeSc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIG1hdERpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFkZE9uUHJvZHVjdHNDb21wb25lbnQ+LFxyXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIGRhdGE6IGFueSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgY29tbW9uU2V2aWNlOiBDb21tb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNob3dDYXRlZ29yeSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nQ2F0ZWdvcnk7XHJcbiAgICB0aGlzLnNob3dTdWJjYXRlZ29yeSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nU3ViQ2F0ZWdvcnk7XHJcbiAgICB0aGlzLnNob3dQcmljZSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nUHJpY2U7XHJcbiAgICB0aGlzLnNob3dRdWFudGl0eSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nUXVhbnRpdHk7XHJcbiAgICB0aGlzLnNob3dTa3VOdW1iZXIgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuc2hvd0RpYWxvZ1NrdU51bWJlcjtcclxuICAgIHRoaXMuc2hvd0ludmVudG9yeSA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93RGlhbG9nSW52ZW50b3J5O1xyXG4gICAgdGhpcy5zaG93TmV3UHJvZHVjdFBpY2tlciA9IGRhdGEuZHJvcGRvd25zRmxhZy5zaG93TmV3UHJvZHVjdFBpY2tlcjtcclxuICAgIHRoaXMuZHJvcGRvd25MMSA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkwxO1xyXG4gICAgdGhpcy5kcm9wZG93bkwyID0gZGF0YS5kcm9wZG93bnNGbGFnLmRyb3Bkb3duTDI7XHJcbiAgICB0aGlzLmRyb3Bkb3duTDMgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MMztcclxuICAgIHRoaXMuZHJvcGRvd25MNCA9IGRhdGEuZHJvcGRvd25zRmxhZy5kcm9wZG93bkw0O1xyXG4gICAgdGhpcy5kcm9wZG93bkwxTGFiZWwgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MMUxhYmVsO1xyXG4gICAgdGhpcy5kcm9wZG93bkwyTGFiZWwgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MMkxhYmVsO1xyXG4gICAgdGhpcy5kcm9wZG93bkwzTGFiZWwgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MM0xhYmVsO1xyXG4gICAgdGhpcy5kcm9wZG93bkw0TGFiZWwgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuZHJvcGRvd25MNExhYmVsO1xyXG4gICAgdGhpcy5jaGVja1N1Ym1pc3Npb25TdGF0dXMgPSBkYXRhLmRyb3Bkb3duc0ZsYWcuY2hlY2tTdWJtaXNzaW9uU3RhdHVzO1xyXG4gICAgdGhpcy5kcm9wRG93bkNvdW50ID0gdGhpcy5jb3VudFRydWVEcm9wZG93bnMoZGF0YS5kcm9wZG93bnNGbGFnKTtcclxuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPFByb2R1Y3Q+KHRydWUsIGRhdGEuc2VsZWN0ZWRQcm9kdWN0cyB8fCBbXSk7XHJcbiAgICB0aGlzLmlzUHJpY2VEaXNhYmxlID0gZGF0YS5kcm9wZG93bnNGbGFnLnByaWNlRGlzYWJsZTtcclxuICAgIHRoaXMuc2t1VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LnNrdVR3ZWVrIHx8IFwiU0tVIE51bWJlclwiO1xyXG4gICAgdGhpcy5jb3N0VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LmNvc3RUd2VlayB8fCBcIllvdXIgVGFyZ2V0IENvc3RcIjtcclxuICAgIHRoaXMucHJpY2VUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8ucHJpY2VUd2VlayB8fCBcIlByaWNlXCI7XHJcbiAgICB0aGlzLnByb2R1Y3RUd2VlayA9IGRhdGEuZHJvcGRvd25zRmxhZz8ucHJvZHVjdFR3ZWVrIHx8IFwiUHJvZHVjdCBOYW1lXCI7XHJcbiAgICB0aGlzLnF1YW50aXR5VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LnF1YW50aXR5VHdlZWsgfHwgXCJRdWFudGl0eVwiO1xyXG4gICAgdGhpcy5zaG93Q29zdCA9IGRhdGEuZHJvcGRvd25zRmxhZz8uc2hvd0RpYWxvZ0Nvc3Q7XHJcbiAgICB0aGlzLmNhdGVnb3J5VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LmNhdGVnb3J5VHdlZWsgfHwgXCJDYXRlZ29yeSBOYW1lXCI7XHJcbiAgICB0aGlzLnN1YkNhdGVnb3J5VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LnN1YkNhdGVnb3J5VHdlZWsgfHwgXCJTdWIgQ2F0ZWdvcnlcIjtcclxuICAgIHRoaXMuaW52ZW50b3J5VHdlZWsgPSBkYXRhLmRyb3Bkb3duc0ZsYWc/LmludmVudG9yeVR3ZWVrIHx8IFwiSW52ZW50b3J5XCI7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NhdGVnb3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdjYXRlZ29yeU5hbWUnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93UHJpY2UpIHtcclxuICAgICAgdGhpcy5yZW1vdmVDb2x1bW4oJ3ByaWNlJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuc2hvd1N1YmNhdGVnb3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdzdWJDYXRlZ29yeScpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnNob3dRdWFudGl0eSkge1xyXG4gICAgICB0aGlzLnJlbW92ZUNvbHVtbignUXVhbnRpdHknKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93U2t1TnVtYmVyKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdza3VOdW1iZXInKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93SW52ZW50b3J5KSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlQ29sdW1uKCdpbnZlbnRvcnknKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zaG93Q29zdCkge1xyXG4gICAgICB0aGlzLnJlbW92ZUNvbHVtbignY29zdCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5zaG93QWxscHJvZHVjdHNDb2x1bW5zID0gdGhpcy5zaG93QWxscHJvZHVjdHNDb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uICE9PSBjb2x1bW5OYW1lKTtcclxuICAgIHRoaXMuYWRkUHJvZHVjdHNDb2x1bW5zID0gdGhpcy5hZGRQcm9kdWN0c0NvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4gIT09IGNvbHVtbk5hbWUpO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUZvcm1BcnJheSgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHNBcnJheSA9IHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGVkUHJvZHVjdHMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICBpZiAoIXNlbGVjdGVkUHJvZHVjdHNBcnJheSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdzZWxlY3RlZFByb2R1Y3RzIEZvcm1BcnJheSBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKHByb2R1Y3QgPT4ge1xyXG4gICAgICBzZWxlY3RlZFByb2R1Y3RzQXJyYXkucHVzaCh0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBwcmljZTogW3Byb2R1Y3Q/LnByaWNlIHx8ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICB0ZXh0OiBbcHJvZHVjdD8udGV4dCB8fCAnJ10sXHJcbiAgICAgICAgcXVhbnRpdHk6IFtwcm9kdWN0LnF1YW50aXR5IHx8ICcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICBjYXRlZ29yeTogW3Byb2R1Y3Q/LmNhdGVnb3J5IHx8ICcnXSxcclxuICAgICAgICBzdWJDYXRlZ29yeTogW3Byb2R1Y3Q/LnN1YkNhdGVnb3J5IHx8ICcnXSxcclxuICAgICAgICB2YWx1ZTogW3Byb2R1Y3Q/LnZhbHVlIHx8ICcnXSxcclxuICAgICAgICBvdGhlckluZm9ybWF0aW9uMDogW3Byb2R1Y3Q/Lm90aGVySW5mb3JtYXRpb24wIHx8ICcnLCB0aGlzLnNob3dDb3N0ID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFtdXSxcclxuICAgICAgICBvdGhlckluZm9ybWF0aW9uMTogW3Byb2R1Y3Q/Lm90aGVySW5mb3JtYXRpb24xIHx8ICcnXSxcclxuICAgICAgICBvdGhlckluZm9ybWF0aW9uMjogW3Byb2R1Y3Q/Lm90aGVySW5mb3JtYXRpb24yIHx8ICcnXVxyXG4gICAgICB9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBzZWxlY3RlZFByb2R1Y3RzQXJyYXkuY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IHtcclxuICAgICAgdGhpcy5pc1ByaWNlRGlzYWJsZSA/IGNvbnRyb2wuZ2V0KCdwcmljZScpPy5kaXNhYmxlKCkgOiBjb250cm9sLmdldCgncHJpY2UnKT8uZW5hYmxlKCk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLnNlbGVjdGlvbi5zZWxlY3RlZF07XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRGF0YVNvdXJjZXMoKSB7XHJcbiAgICAvLyBEZWJ1Z2dpbmcgbG9ncyB0byB0cmFjZSBpc3N1ZXNcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0aW9uPy5zZWxlY3RlZCkgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2U/LmRhdGEpICYmIHRoaXMuc2VsZWN0aW9uPy5zZWxlY3RlZD8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uPy5zZWxlY3RlZD8uZm9yRWFjaChzZWxlY3RlZFByb2R1Y3QgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhU291cmNlLmRhdGEuZmluZEluZGV4KHByb2R1Y3QgPT4gcHJvZHVjdC52YWx1ZSA9PT0gc2VsZWN0ZWRQcm9kdWN0LnZhbHVlKTtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGFbaW5kZXhdID0gc2VsZWN0ZWRQcm9kdWN0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhU291cmNlLmRhdGEgPSBbLi4udGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdObyBzZWxlY3RlZCBwcm9kdWN0cyBmb3VuZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBkcm9wZG93bkxldmVsMTogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogZmFsc2UgfV0sXHJcbiAgICAgIGRyb3Bkb3duTGV2ZWwyOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlIH1dLFxyXG4gICAgICBkcm9wZG93bkxldmVsMzogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgZHJvcGRvd25MZXZlbDQ6IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgIHNlYXJjaFByb2R1Y3ROYW1lOiBbJyddLFxyXG4gICAgICBzZWxlY3RlZFByb2R1Y3RzOiB0aGlzLmZiLmFycmF5KFtdKVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtQXJyYXkoKTtcclxuXHJcbiAgICBpZiAodGhpcy5kcm9wZG93bkwxKSB7XHJcbiAgICAgIHRoaXMubG9hZERyb3Bkb3duTDEoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMScpLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICAgIG1hcCh2YWx1ZSA9PlxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJQcm9kdWN0cyh2YWx1ZSwgJ2NhdGVnb3J5MScpKVxyXG4gICAgICApLnN1YnNjcmliZShsMSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duT25lID0gbDE7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDInKS52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKCcnKSxcclxuICAgICAgICBtYXAodmFsdWUgPT4gdGhpcy5maWx0ZXJQcm9kdWN0cyh2YWx1ZSwgJ2NhdGVnb3J5MicpKVxyXG4gICAgICApLnN1YnNjcmliZShsMiA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duVHdvID0gbDI7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS52YWx1ZUNoYW5nZXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3RhcnRXaXRoKCcnKSxcclxuICAgICAgICBtYXAodmFsdWUgPT4gdGhpcy5maWx0ZXJQcm9kdWN0cyh2YWx1ZSwgJ2NhdGVnb3J5MycpKVxyXG4gICAgICApLnN1YnNjcmliZShsMyA9PiB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duVGhyZWUgPSBsMztcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICAgIG1hcCh2YWx1ZSA9PiB0aGlzLmZpbHRlclByb2R1Y3RzKHZhbHVlLCAnY2F0ZWdvcnk0JykpXHJcbiAgICAgICkuc3Vic2NyaWJlKGw0ID0+IHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Gb3VyID0gbDQ7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRHJvcGRvd25GaWx0ZXIoKSB7XHJcbiAgICBjb25zdCBzZWFyY2hRdWVyeSA9IHRoaXMuZm9ybS5jb250cm9scy5zZWFyY2hQcm9kdWN0TmFtZT8udmFsdWU/LnRyaW0oKTsgLy8gVHJpbSB0byByZW1vdmUgYmxhbmsgc3BhY2VzXHJcbiAgICBjb25zdCBsZXZlbE9uZUlkID0gdGhpcy5mb3JtLmNvbnRyb2xzLmRyb3Bkb3duTGV2ZWwxPy52YWx1ZT8uaWQ7XHJcbiAgICB0aGlzLmxvYWRpbmdGbGFnID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5maXJzdHNjcm9sbGFibGVEaXYpIHtcclxuICAgICAgdGhpcy5maXJzdHNjcm9sbGFibGVEaXYubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKChzZWFyY2hRdWVyeSAmJiBzZWFyY2hRdWVyeSAhPT0gJycpIHx8IChsZXZlbE9uZUlkICYmIGxldmVsT25lSWQgIT09IG51bGwgJiYgbGV2ZWxPbmVJZCAhPT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICBsZXQgcHJvZHVjdE5hbWUgPSB0aGlzLmZvcm0uY29udHJvbHMuc2VhcmNoUHJvZHVjdE5hbWU/LnZhbHVlIHx8ICcnO1xyXG4gICAgICAvLyBDaGVjayBpZiB0aGUgbGVuZ3RoIGV4Y2VlZHMgMTAwIGFuZCB0cnVuY2F0ZSBpZiBuZWNlc3NhcnlcclxuICAgICAgaWYgKHByb2R1Y3ROYW1lPy5sZW5ndGggPiAxMDApIHtcclxuICAgICAgICBwcm9kdWN0TmFtZSA9IHByb2R1Y3ROYW1lLnN1YnN0cmluZygwLCAxMDApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSBwcm9kdWN0TmFtZTtcclxuICAgICAgdGhpcy5sZXZlbE9uZUlkID0gdGhpcy5mb3JtLmNvbnRyb2xzLmRyb3Bkb3duTGV2ZWwxLnZhbHVlPy5pZDtcclxuICAgICAgdGhpcy5sZXZlbFR3b0lkID0gdGhpcy5mb3JtLmNvbnRyb2xzLmRyb3Bkb3duTGV2ZWwyLnZhbHVlPy5pZDtcclxuICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSB0aGlzLmZvcm0uY29udHJvbHMuZHJvcGRvd25MZXZlbDMudmFsdWU/LmlkO1xyXG4gICAgICB0aGlzLmxldmVsRm91cklkID0gdGhpcy5mb3JtLmNvbnRyb2xzLmRyb3Bkb3duTGV2ZWw0LnZhbHVlPy5pZDtcclxuICAgICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IDIwO1xyXG4gICAgICB0aGlzLmdldFByb2R1Y3RzKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlQWN0aXZlRmlsdGVyc0NvdW50KCk7XHJcbiAgfVxyXG5cclxuICBsb2FkRHJvcGRvd25MMSgpIHtcclxuICAgIHRoaXMuc3Bpbm5lckZsYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb21tb25TZXZpY2UucHJvZHVjdExldmVsT25lKCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyRmxhZyA9IGZhbHNlXHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duT25lID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25PbmUgPSB0aGlzLmZpbHRlclByb2R1Y3RzKCcnLCAnY2F0ZWdvcnkxJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZERyb3Bkb3duTDIobGV2ZWxPbmVJZDogYW55KSB7XHJcbiAgICB0aGlzLnNwaW5uZXJGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMuY29tbW9uU2V2aWNlLnByb2R1Y3RMZXZlbFR3byhsZXZlbE9uZUlkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJGbGFnID0gZmFsc2VcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25Ud28gPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93blR3byA9IHRoaXMuZmlsdGVyUHJvZHVjdHMoJycsICdjYXRlZ29yeTInKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkRHJvcGRvd25MMyhsZXZlbE9uZUlkOiBhbnksIGxldmVsVHdvSWQ6IGFueSkge1xyXG4gICAgdGhpcy5zcGlubmVyRmxhZyA9IHRydWU7XHJcbiAgICB0aGlzLmNvbW1vblNldmljZS5wcm9kdWN0TGV2ZWxUaHJlZShsZXZlbE9uZUlkLCBsZXZlbFR3b0lkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJGbGFnID0gZmFsc2VcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25UaHJlZSA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duVGhyZWUgPSB0aGlzLmZpbHRlclByb2R1Y3RzKCcnLCAnY2F0ZWdvcnkzJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZERyb3Bkb3duTDQobGV2ZWxPbmVJZDogYW55LCBsZXZlbFR3b0lkOiBhbnksIGxldmVsVGhyZWVJZDogYW55KSB7XHJcbiAgICB0aGlzLnNwaW5uZXJGbGFnID0gdHJ1ZTtcclxuICAgIHRoaXMuY29tbW9uU2V2aWNlLnByb2R1Y3RMZXZlbEZvdXIobGV2ZWxPbmVJZCwgbGV2ZWxUd29JZCwgbGV2ZWxUaHJlZUlkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJGbGFnID0gZmFsc2VcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgIHRoaXMuZHJvcGRvd25Gb3VyID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Gb3VyID0gdGhpcy5maWx0ZXJQcm9kdWN0cygnJywgJ2NhdGVnb3J5NCcpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBmaWx0ZXJQcm9kdWN0cyh2YWx1ZTogc3RyaW5nLCBjYXQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlPy50b0xvd2VyQ2FzZSgpIDogdmFsdWU7XHJcbiAgICBsZXQgZGF0YTogc3RyaW5nW107XHJcblxyXG4gICAgLypEeW5hbWljYWxseSBhc3NpZ24gdGhlIGRhdGEgYXJyYXkgYmFzZWQgb24gdGhlIGNhdGVnb3J5Ki9cclxuICAgIHN3aXRjaCAoY2F0KSB7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5MSc6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMuZHJvcGRvd25PbmU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5Mic6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMuZHJvcGRvd25Ud287XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5Myc6XHJcbiAgICAgICAgZGF0YSA9IHRoaXMuZHJvcGRvd25UaHJlZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY2F0ZWdvcnk0JzpcclxuICAgICAgICBkYXRhID0gdGhpcy5kcm9wZG93bkZvdXI7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGF0YSA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmlsdGVyVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZGF0YT8uZmlsdGVyKG9wdGlvbiA9PiBvcHRpb25bJ25hbWUnXT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xyXG4gICAgICB0aGlzLm1hdERpYWxvZ1JlZi5jbG9zZSh7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgc3RhdHVzOiB0cnVlLFxyXG4gICAgICAgICAgaXRlbXM6IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0FsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgICBjb25zdCBudW1Sb3dzID0gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xyXG4gIH1cclxuXHJcbiAgaXNJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgICBjb25zdCBudW1Sb3dzID0gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID4gMCAmJiBudW1TZWxlY3RlZCA8IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICBtYXN0ZXJUb2dnbGUoKSB7XHJcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQoKVxyXG4gICAgICA/IHRoaXMuc2VsZWN0aW9uLmNsZWFyKClcclxuICAgICAgOiB0aGlzLmRhdGFTb3VyY2UuZGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkUHJvZHVjdHMoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlbGVjdGlvbihyb3c6IFByb2R1Y3QpIHtcclxuICAgIC8vIENoZWNrIGlmIHRoZSBwcm9kdWN0IGlzIGFscmVhZHkgc2VsZWN0ZWRcclxuICAgIGNvbnN0IGFscmVhZHlTZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLnNvbWUoc2VsZWN0ZWQgPT4gc2VsZWN0ZWQudmFsdWUgPT09IHJvdy52YWx1ZSk7XHJcbiAgICBpZiAoYWxyZWFkeVNlbGVjdGVkKSB7XHJcbiAgICAgIC8vIElmIHRoZSBwcm9kdWN0IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGRlc2VsZWN0IGl0XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc2VsZWN0KHJvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBJZiBub3QgYWxyZWFkeSBzZWxlY3RlZCwgc2VsZWN0IGl0XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpO1xyXG4gICAgfVxyXG4gICAgLy8gVXBkYXRlIHNlbGVjdGVkIHByb2R1Y3RzIHRvIGVuc3VyZSBubyBkdXBsaWNhdGVzXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkUHJvZHVjdHMoKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gR2V0dGVyIGZvciB0aGUgRm9ybUFycmF5XHJcbiAgZ2V0IHNlbGVjdGVkUHJvZHVjdHMoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdzZWxlY3RlZFByb2R1Y3RzJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0ZWRQcm9kdWN0cygpIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKSkge1xyXG4gICAgICAvLyBEZWR1cGxpY2F0ZSBzZWxlY3RlZCBwcm9kdWN0c1xyXG4gICAgICBjb25zdCB1bmlxdWVQcm9kdWN0cyA9IEFycmF5LmZyb20oXHJcbiAgICAgICAgbmV3IE1hcCh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5tYXAocHJvZHVjdCA9PiBbcHJvZHVjdC52YWx1ZSwgcHJvZHVjdF0pKS52YWx1ZXMoKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICB1bmlxdWVQcm9kdWN0cy5mb3JFYWNoKHByb2R1Y3QgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHByb2R1Y3QpKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhU291cmNlLmRhdGEgPSBbLi4udGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWRdO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZFByb2R1Y3RzQXJyYXkgPSB0aGlzLnNlbGVjdGVkUHJvZHVjdHM7XHJcbiAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5jbGVhcigpO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbj8uc2VsZWN0ZWQ/LmZvckVhY2goKHByb2R1Y3QsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgaWYgKCFwcm9kdWN0Py52YWx1ZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignUHJvZHVjdCB2YWx1ZSAoU0tVKSBpcyBtaXNzaW5nIGF0IGluZGV4OicsIGluZGV4LCBwcm9kdWN0KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcHJvZHVjdEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgcHJpY2U6IFtwcm9kdWN0Py5wcmljZSA/PyAnJywgdGhpcy5zaG93UHJpY2UgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogW11dLFxyXG4gICAgICAgICAgdGV4dDogW3Byb2R1Y3Q/LnRleHQgfHwgJyddLFxyXG4gICAgICAgICAgcXVhbnRpdHk6IFtwcm9kdWN0Py5xdWFudGl0eSA/PyAnJywgdGhpcy5zaG93UXVhbnRpdHkgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogW11dLFxyXG4gICAgICAgICAgY2F0ZWdvcnk6IFtwcm9kdWN0Py5jYXRlZ29yeSB8fCAnJ10sXHJcbiAgICAgICAgICBzdWJDYXRlZ29yeTogW3Byb2R1Y3Q/LnN1YkNhdGVnb3J5IHx8ICcnXSxcclxuICAgICAgICAgIHZhbHVlOiBbcHJvZHVjdD8udmFsdWUgfHwgJyddLFxyXG4gICAgICAgICAgb3RoZXJJbmZvcm1hdGlvbjA6IFtwcm9kdWN0Py5vdGhlckluZm9ybWF0aW9uMCB8fCAnJywgdGhpcy5zaG93Q29zdCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBbXV0sXHJcbiAgICAgICAgICBvdGhlckluZm9ybWF0aW9uMTogW3Byb2R1Y3Q/Lm90aGVySW5mb3JtYXRpb24xIHx8ICcnXSxcclxuICAgICAgICAgIG90aGVySW5mb3JtYXRpb24yOiBbcHJvZHVjdD8ub3RoZXJJbmZvcm1hdGlvbjIgPz8gJyddXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RGb3JtR3JvdXApIHtcclxuICAgICAgICAgIHNlbGVjdGVkUHJvZHVjdHNBcnJheS5wdXNoKHByb2R1Y3RGb3JtR3JvdXApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIEZvcm1Hcm91cCBmb3IgcHJvZHVjdCBhdCBpbmRleCAke2luZGV4fS5gKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBzZWxlY3RlZFByb2R1Y3RzQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCwgaW5kZXgpID0+IHtcclxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgY29uc3QgcHJpY2VDb250cm9sID0gY29udHJvbC5nZXQoJ3ByaWNlJyk7XHJcbiAgICAgICAgICBpZiAocHJpY2VDb250cm9sKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQcmljZURpc2FibGUgPyBwcmljZUNvbnRyb2wuZGlzYWJsZSgpIDogcHJpY2VDb250cm9sLmVuYWJsZSgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUHJpY2UgY29udHJvbCBpcyBtaXNzaW5nIGluIEZvcm1Hcm91cCBhdCBpbmRleCAke2luZGV4fS5gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgVW5leHBlY3RlZCBjb250cm9sIHR5cGUgYXQgaW5kZXggJHtpbmRleH06YCwgY29udHJvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1NlbGVjdGlvbi5zZWxlY3RlZCBpcyBub3QgYW4gYXJyYXk6JywgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGdldFRvdGFsUm93cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkUm93c0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgb25PcHRpb25TZWxlY3RlZChldmVudDogYW55LCBjYXRlZ29yeTogc3RyaW5nKSB7XHJcbiAgICBsZXQgc2VsZWN0ZWRWYWx1ZTtcclxuICAgIGlmIChldmVudCAmJiBldmVudC5vcHRpb24gJiYgZXZlbnQub3B0aW9uLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGV2ZW50Lm9wdGlvbi52YWx1ZS5pZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGVjdGVkVmFsdWUgPSBldmVudDtcclxuICAgIH1cclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5MScpIHtcclxuICAgICAgdGhpcy5sZXZlbE9uZUlkID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDInKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgdGhpcy5maWx0ZXJlZERyb3Bkb3duVHdvID0gW107XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93blRocmVlID0gW107XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREcm9wZG93bkZvdXIgPSBbXTtcclxuICAgICAgaWYgKHRoaXMuZHJvcGRvd25MMiAmJiB0aGlzLmxldmVsT25lSWQpIHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpPy5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvYWREcm9wZG93bkwyKHRoaXMubGV2ZWxPbmVJZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDInKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDInKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgdGhpcy5sZXZlbE9uZUlkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxldmVsVHdvSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGV2ZWxUaHJlZUlkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxldmVsRm91cklkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQ0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMjA7XHJcbiAgICAgIHRoaXMuZ2V0UHJvZHVjdHMoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkyJykge1xyXG4gICAgICB0aGlzLmxldmVsVHdvSWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25UaHJlZSA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5kcm9wZG93bkwzICYmIHRoaXMubGV2ZWxPbmVJZCAmJiB0aGlzLmxldmVsVHdvSWQpIHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpPy5lbmFibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkMyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9hZERyb3Bkb3duTDModGhpcy5sZXZlbE9uZUlkLCB0aGlzLmxldmVsVHdvSWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJyk/LmRpc2FibGUoKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIC8vdGhpcy5sZXZlbFR3b0lkID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxldmVsVGhyZWVJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkMyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkNCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IDIwO1xyXG4gICAgICB0aGlzLmdldFByb2R1Y3RzKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5MycpIHtcclxuICAgICAgdGhpcy5sZXZlbFRocmVlSWQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRHJvcGRvd25Gb3VyID0gW107XHJcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duTDQgJiYgdGhpcy5sZXZlbE9uZUlkICYmIHRoaXMubGV2ZWxUd29JZCAmJiB0aGlzLmxldmVsVGhyZWVJZCkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jyk/LmVuYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZDQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvYWREcm9wZG93bkw0KHRoaXMubGV2ZWxPbmVJZCwgdGhpcy5sZXZlbFR3b0lkLCB0aGlzLmxldmVsVGhyZWVJZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKT8uZGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgLy90aGlzLmxldmVsVGhyZWVJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkNCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IDIwO1xyXG4gICAgICB0aGlzLmdldFByb2R1Y3RzKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5NCcpIHtcclxuICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgICAgdGhpcy5nZXRQcm9kdWN0cyhmYWxzZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJvZHVjdHMoZmxhZzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zcGlubmVyRmxhZyA9IHRydWU7XHJcbiAgICBjb25zdCBzZWFyY2ggPSB0aGlzLnNlYXJjaFF1ZXJ5O1xyXG4gICAgY29uc3QgbGV2ZWxPbmVJZCA9IHRoaXMubGV2ZWxPbmVJZCA/IHRoaXMubGV2ZWxPbmVJZCA6IDA7XHJcbiAgICBjb25zdCBsZXZlbFR3b0lkID0gdGhpcy5sZXZlbFR3b0lkID8gdGhpcy5sZXZlbFR3b0lkIDogMDtcclxuICAgIGNvbnN0IGxldmVsVGhyZWVJZCA9IHRoaXMubGV2ZWxUaHJlZUlkID8gdGhpcy5sZXZlbFRocmVlSWQgOiAwO1xyXG4gICAgY29uc3QgbGV2ZWxGb3VySWQgPSB0aGlzLmxldmVsRm91cklkID8gdGhpcy5sZXZlbEZvdXJJZCA6IDA7XHJcbiAgICBpZiAodGhpcy5zaG91bGRSZXNldFRhYmxlKHNlYXJjaCwgbGV2ZWxPbmVJZCwgbGV2ZWxUd29JZCwgbGV2ZWxUaHJlZUlkLCBsZXZlbEZvdXJJZCkpIHtcclxuICAgICAgdGhpcy5yZXNldFRhYmxlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuY29tbW9uU2V2aWNlLmxvYWRQcm9kdWN0cyh0aGlzLnBhZ2VOdW1iZXIsIHRoaXMucGFnZVNpemUsIHNlYXJjaCwgdHJ1ZSwgZmFsc2UsIGxldmVsT25lSWQsIGxldmVsVHdvSWQsIGxldmVsVGhyZWVJZCwgbGV2ZWxGb3VySWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lckZsYWcgPSBmYWxzZTtcclxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgIHRoaXMudG90YWxQYWdlcyA9IHJlc3BvbnNlPy5kYXRhPy50b3RhbFBhZ2VzO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhLmRhdGFTb3VyY2U7XHJcbiAgICAgICAgdGhpcy5nZXRUb3RhbFJlY29yZHMgPSByZXNwb25zZS5kYXRhLnRvdGFsUmVjb3Jkc1xyXG4gICAgICAgIC8vIFN5bmMgc2VsZWN0aW9uIHN0YXRlIHdpdGggbmV3IGRhdGFcclxuICAgICAgICBkYXRhLmZvckVhY2gocHJvZHVjdCA9PiB7XHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1Byb2R1Y3QgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5maW5kKHAgPT4gcC52YWx1ZSA9PT0gcHJvZHVjdC52YWx1ZSk7XHJcbiAgICAgICAgICBpZiAoZXhpc3RpbmdQcm9kdWN0KSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocHJvZHVjdCwgZXhpc3RpbmdQcm9kdWN0KTsgLy8gUmVwbGFjZSBwcm9kdWN0IHdpdGggZXhpc3RpbmcgcmVmZXJlbmNlXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChwcm9kdWN0KTsgLy8gTWFyayBhcyBzZWxlY3RlZFxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkUHJvZHVjdHMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQXZvaWQgZHVwbGljYXRlcyBpbiB0aGUgZGF0YVNvdXJjZVxyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUHJvZHVjdFZhbHVlcyA9IG5ldyBTZXQodGhpcy5kYXRhU291cmNlLmRhdGEubWFwKHByb2R1Y3QgPT4gcHJvZHVjdC52YWx1ZSkpO1xyXG4gICAgICAgIGNvbnN0IHVuaXF1ZU5ld0RhdGEgPSBkYXRhLmZpbHRlcihwcm9kdWN0ID0+ICFleGlzdGluZ1Byb2R1Y3RWYWx1ZXMuaGFzKHByb2R1Y3QudmFsdWUpKTtcclxuICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoID4gMCAmJiBmbGFnKSB7XHJcbiAgICAgICAgICAvLyBkYXRhLmZvckVhY2goaXRlbSA9PiB0aGlzLmRhdGFTb3VyY2UuZGF0YS5wdXNoKGl0ZW0pKTtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMuZGF0YVNvdXJjZS5kYXRhLCAuLi51bmlxdWVOZXdEYXRhXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nRmxhZyA9IHRydWU7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBtaWRkbGVQb3NpdGlvbiA9IHRoaXMudHJhY2tIZWlnaHQgLyAyIC0gNTA7XHJcbiAgICAgICAgICBpZiAodGhpcy5maXJzdHNjcm9sbGFibGVEaXYgJiYgdGhpcy5maXJzdHNjcm9sbGFibGVEaXYubmF0aXZlRWxlbWVudCAmJiBmbGFnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RzY3JvbGxhYmxlRGl2Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG8oeyB0b3A6IG1pZGRsZVBvc2l0aW9uLCBiZWhhdmlvcjogJ2F1dG8nIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDI1MCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRGF0YVNvdXJjZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVSb3coZXZlbnQ6IEV2ZW50LCBlbGVtZW50OiBQcm9kdWN0KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBsZXQgbWVzc2FnZSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgcHJvZHVjdD8nO1xyXG4gICAgbGV0IHNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhLmluZGV4T2YoZWxlbWVudCk7XHJcbiAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuY2hlY2tTdWJtaXNzaW9uU3RhdHVzKSB7XHJcbiAgICAgICAgbWVzc2FnZSA9ICdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBwcm9kdWN0Lic7XHJcbiAgICAgICAgc2hvd0J1dHRvbiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxyXG4gICAgICAgIHdpZHRoOiAnOTAlJyxcclxuICAgICAgICBtYXhXaWR0aDogJzQwMHB4JyxcclxuICAgICAgICBkYXRhOiB7IG1lc3NhZ2U6IG1lc3NhZ2UsIGJ1dHRvblN0YXR1czogc2hvd0J1dHRvbiB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5kYXRhLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0YVNvdXJjZS5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdChlbGVtZW50KTtcclxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUHJvZHVjdHNBcnJheSA9IHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGVkUHJvZHVjdHMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICBjb25zdCBwcm9kdWN0SW5kZXggPSBzZWxlY3RlZFByb2R1Y3RzQXJyYXkuY29udHJvbHMuZmluZEluZGV4KGNvbnRyb2wgPT4gY29udHJvbC52YWx1ZS52YWx1ZSA9PT0gZWxlbWVudC52YWx1ZSk7XHJcbiAgICAgICAgICBpZiAocHJvZHVjdEluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRQcm9kdWN0c0FycmF5LnJlbW92ZUF0KHByb2R1Y3RJbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU2Nyb2xsKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMudHJhY2tIZWlnaHQgPSBldmVudC50YXJnZXQuc2Nyb2xsSGVpZ2h0IC0gZXZlbnQudGFyZ2V0Lm9mZnNldEhlaWdodDtcclxuICAgIGlmICh0aGlzLmxvYWRpbmdGbGFnICYmIChNYXRoLmZsb29yKGV2ZW50LnRhcmdldC5zY3JvbGxUb3AgLyB0aGlzLnRyYWNrSGVpZ2h0ICogMTAwKSA+IDUwKSkge1xyXG4gICAgICB0aGlzLmxvYWRpbmdGbGFnID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnBhZ2VOdW1iZXIgPCB0aGlzLnRvdGFsUGFnZXMpIHtcclxuICAgICAgICB0aGlzLnBhZ2VOdW1iZXIgPSB0aGlzLnBhZ2VOdW1iZXIgKyAxO1xyXG4gICAgICAgIHRoaXMuZ2V0UHJvZHVjdHModHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nRmxhZyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucHJldlNjcm9sbFBvc2l0aW9uID0gZXZlbnQudGFyZ2V0LnNjcm9sbFRvcDtcclxuICB9XHJcblxyXG4gIGNvdW50VHJ1ZURyb3Bkb3ducyhvYmopIHtcclxuICAgIC8vIER5bmFtaWNhbGx5IGZpbmQgYWxsIGtleXMgdGhhdCBzdGFydCB3aXRoICdkcm9wZG93bkwnIGFuZCBhcmUgYm9vbGVhbiAodHJ1ZS9mYWxzZSlcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKCdkcm9wZG93bkwnKSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdib29sZWFuJyAmJiBvYmpba2V5XSA9PT0gdHJ1ZSlcclxuICAgICAgLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qIFVzZSB0aGUgcHJvcGVydHkgdGhhdCBzaG91bGQgZGlzcGxheSBpbiB0aGUgaW5wdXQgZmllbGQgKi9cclxuICBkaXNwbGF5Rm4ob3B0aW9uKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24ubmFtZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgb25RdWFudGl0eUNoYW5nZShldmVudDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgIGNvbnN0IHF1YW50aXR5Q29udHJvbCA9IHRoaXMuc2VsZWN0ZWRQcm9kdWN0cy5hdChpbmRleCkuZ2V0KCdxdWFudGl0eScpO1xyXG5cclxuICAgIGlmICghcXVhbnRpdHlDb250cm9sKSByZXR1cm47XHJcblxyXG4gICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIGVycm9yc1xyXG4gICAgcXVhbnRpdHlDb250cm9sLnNldEVycm9ycyhudWxsKTtcclxuXHJcbiAgICAvLyBJZiB0aGUgdmFsdWUgaXMgZW1wdHksIHNldCAncmVxdWlyZWQnIGVycm9yXHJcbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHF1YW50aXR5Q29udHJvbC5zZXRFcnJvcnMoeyAncmVxdWlyZWQnOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiAxLCBzZXQgJ21pbicgZXJyb3JcclxuICAgIGVsc2UgaWYgKE51bWJlcih2YWx1ZSkgPCAxKSB7XHJcbiAgICAgIHF1YW50aXR5Q29udHJvbC5zZXRFcnJvcnMoeyAnbWluJzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlciwgc2V0ICdwYXR0ZXJuJyBlcnJvclxyXG4gICAgZWxzZSBpZiAoIS9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgIHF1YW50aXR5Q29udHJvbC5zZXRFcnJvcnMoeyAncGF0dGVybic6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ29Ub05leHRQYWdlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9ICdlZGl0LXNhdmUnO1xyXG4gIH1cclxuXHJcbiAgZ29Ub1ByZXZpb3VzUGFnZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnc2VsZWN0LXByb2R1Y3RzJztcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oKSB7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9ICF0aGlzLmlzVmlzaWJsZTtcclxuICB9XHJcblxyXG4gIGNsZWFyRmllbGQoZmllbGQ6IHN0cmluZywgY2F0ZWdvcnk6IHN0cmluZywgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFN0b3AgZXZlbnQgcHJvcGFnYXRpb24gdG8gcHJldmVudCBkcm9wZG93biByZW9wZW5cclxuICAgIHRoaXMuZm9ybS5nZXQoZmllbGQpPy5zZXRWYWx1ZShudWxsKTtcclxuICAgIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5MScpIHtcclxuICAgICAgdGhpcy5vbk9wdGlvblNlbGVjdGVkKG51bGwsICdjYXRlZ29yeTEnKTtcclxuICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkgPT09ICdjYXRlZ29yeTInKSB7XHJcbiAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChudWxsLCAnY2F0ZWdvcnkyJyk7XHJcbiAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09PSAnY2F0ZWdvcnkzJykge1xyXG4gICAgICB0aGlzLm9uT3B0aW9uU2VsZWN0ZWQobnVsbCwgJ2NhdGVnb3J5MycpO1xyXG4gICAgfSBlbHNlIGlmIChjYXRlZ29yeSA9PT0gJ2NhdGVnb3J5NCcpIHtcclxuICAgICAgdGhpcy5sZXZlbEZvdXJJZCA9IG51bGw7XHJcbiAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChudWxsLCAnY2F0ZWdvcnk0Jyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQsIGNhdGVnb3J5OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGlucHV0VmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgaWYgKCFpbnB1dFZhbHVlKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGlucHV0IGlzIGNsZWFyZWRcclxuICAgICAgdGhpcy5jbGVhckZpZWxkKGBkcm9wZG93bkxldmVsJHt0aGlzLmdldERyb3Bkb3duTGV2ZWwoY2F0ZWdvcnkpfWAsIGNhdGVnb3J5LCBudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERyb3Bkb3duTGV2ZWwoY2F0ZWdvcnk6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBzd2l0Y2ggKGNhdGVnb3J5KSB7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5MSc6IHJldHVybiAxO1xyXG4gICAgICBjYXNlICdjYXRlZ29yeTInOiByZXR1cm4gMjtcclxuICAgICAgY2FzZSAnY2F0ZWdvcnkzJzogcmV0dXJuIDM7XHJcbiAgICAgIGNhc2UgJ2NhdGVnb3J5NCc6IHJldHVybiA0O1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUFjdGl2ZUZpbHRlcnNDb3VudCgpIHtcclxuICAgIHRoaXMuYWN0aXZlRmlsdGVyc0NvdW50ID0gMDtcclxuICAgIGlmICh0aGlzLnNlYXJjaFF1ZXJ5ICE9PSAnJykgdGhpcy5hY3RpdmVGaWx0ZXJzQ291bnQrKztcclxuICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMScpLnZhbHVlKSB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCsrO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwyJykudmFsdWUpIHRoaXMuYWN0aXZlRmlsdGVyc0NvdW50Kys7XHJcbiAgICBpZiAodGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS52YWx1ZSkgdGhpcy5hY3RpdmVGaWx0ZXJzQ291bnQrKztcclxuICAgIGlmICh0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpLnZhbHVlKSB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCsrO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJJZkVtcHR5KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQudGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1snc2VhcmNoUHJvZHVjdE5hbWUnXS5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgIHRoaXMuc2VhcmNoUXVlcnkgPSAnJztcclxuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hRdWVyeTtcclxuICAgICAgY29uc3QgbGV2ZWxPbmVJZCA9IHRoaXMubGV2ZWxPbmVJZCA/IHRoaXMubGV2ZWxPbmVJZCA6IDA7XHJcbiAgICAgIGNvbnN0IGxldmVsVHdvSWQgPSB0aGlzLmxldmVsVHdvSWQgPyB0aGlzLmxldmVsVHdvSWQgOiAwO1xyXG4gICAgICBjb25zdCBsZXZlbFRocmVlSWQgPSB0aGlzLmxldmVsVGhyZWVJZCA/IHRoaXMubGV2ZWxUaHJlZUlkIDogMDtcclxuICAgICAgY29uc3QgbGV2ZWxGb3VySWQgPSB0aGlzLmxldmVsRm91cklkID8gdGhpcy5sZXZlbEZvdXJJZCA6IDA7XHJcbiAgICAgIGlmICh0aGlzLnNob3VsZFJlc2V0VGFibGUoc2VhcmNoLCBsZXZlbE9uZUlkLCBsZXZlbFR3b0lkLCBsZXZlbFRocmVlSWQsIGxldmVsRm91cklkKSkge1xyXG4gICAgICAgIHRoaXMucmVzZXRUYWJsZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRUYWJsZSgpIHtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwxJykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnNldFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnZHJvcGRvd25MZXZlbDMnKS5zZXRWYWx1ZShudWxsKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWw0Jykuc2V0VmFsdWUobnVsbCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMycpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93bkxldmVsNCcpPy5kaXNhYmxlKCk7XHJcbiAgICB0aGlzLmxldmVsT25lSWQgPSAwO1xyXG4gICAgdGhpcy5sZXZlbFR3b0lkID0gMDtcclxuICAgIHRoaXMubGV2ZWxUaHJlZUlkID0gMDtcclxuICAgIHRoaXMubGV2ZWxGb3VySWQgPSAwO1xyXG4gICAgdGhpcy5wYWdlTnVtYmVyID0gMTtcclxuICAgIHRoaXMucGFnZVNpemUgPSAyMDtcclxuICAgIHRoaXMuZm9ybS5jb250cm9sc1snc2VhcmNoUHJvZHVjdE5hbWUnXS5zZXRWYWx1ZSgnJyk7XHJcbiAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFtdO1xyXG4gICAgdGhpcy5zcGlubmVyRmxhZyA9IGZhbHNlO1xyXG4gICAgdGhpcy51cGRhdGVBY3RpdmVGaWx0ZXJzQ291bnQoKTtcclxuICB9XHJcblxyXG4gIHNob3VsZFJlc2V0VGFibGUoc2VhcmNoOiBzdHJpbmcsIGxldmVsT25lSWQ6IG51bWJlciwgbGV2ZWxUd29JZDogbnVtYmVyLCBsZXZlbFRocmVlSWQ6IG51bWJlciwgbGV2ZWxGb3VySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHNlYXJjaCA9PT0gJycgJiYgbGV2ZWxPbmVJZCA9PT0gMCAmJiBsZXZlbFR3b0lkID09PSAwICYmIGxldmVsVGhyZWVJZCA9PT0gMCAmJiBsZXZlbEZvdXJJZCA9PT0gMDtcclxuICB9XHJcblxyXG4gIC8qIFRoaXMgZnVuY3Rpb24gd2lsbCBtYW5hZ2UgcHJpY2UgYW5kIGNvc3QgdmFsaWRhdGlvbiAqL1xyXG4gIGFwcGx5VmFsaWRhdGlvblJ1bGUoZXZlbnQ6IGFueSwgaW5kZXg6IG51bWJlciwgY29udHJvbE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWUudHJpbSgpO1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuc2VsZWN0ZWRQcm9kdWN0cy5hdChpbmRleCkuZ2V0KGNvbnRyb2xOYW1lKTtcclxuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIENsZWFyIGFueSBwcmV2aW91cyBlcnJvcnNcclxuICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG5cclxuICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBlbXB0eSwgc2V0ICdyZXF1aXJlZCcgZXJyb3JcclxuICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgY29udHJvbC5zZXRFcnJvcnMoeyAncmVxdWlyZWQnOiB0cnVlIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdmFsdWUgY29udGFpbnMgb25seSBudW1iZXJzIGFuZCBkZWNpbWFscyAoYnV0IG5vIGFscGhhYmV0cyBvciBzcGVjaWFsIGNoYXJhY3RlcnMpXHJcbiAgICBpZiAoIS9eXFxkKlxcLj9cXGQqJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gdmFsdWUucmVwbGFjZSgvW14wLTkuXS9nLCAnJyk7IC8vIFJlbW92ZSBpbnZhbGlkIGNoYXJhY3RlcnNcclxuICAgICAgY29udHJvbC5zZXRFcnJvcnMoeyAnaW52YWxpZEZvcm1hdCc6IHRydWUgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICByZXN0cmljdElucHV0KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBjb25zdCBrZXkgPSBldmVudC5rZXk7XHJcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcclxuICAgIC8vIEFsbG93IG51bWJlcnMgYW5kIG9uZSBkZWNpbWFsLCBidXQgcHJldmVudCBldmVyeXRoaW5nIGVsc2VcclxuICAgIGlmICghL1tcXGQuXS8udGVzdChrZXkpIHx8IChrZXkgPT09ICcuJyAmJiBpbnB1dFZhbHVlLmluY2x1ZGVzKCcuJykpKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgIGNvbnN0IHBhc3RlRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSB8fCAnJztcclxuICAgIC8vIElmIHBhc3RlZCB2YWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIsIHByZXZlbnQgcGFzdGluZ1xyXG4gICAgaWYgKCEvXlxcZCpcXC4/XFxkKiQvLnRlc3QocGFzdGVEYXRhKSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cInNwaW5uZXJGbGFnXCIgY2xhc3M9XCJPdmVybGF5RGl2XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiT3ZlcmxheURpdkNvbnRlbnRcIj5cclxuICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm1hdC1kaWFsb2ctaGVhZGluZ1wiPlxyXG4gICAgPGgxIG1hdC1kaWFsb2ctdGl0bGU+QWRkIFByb2R1Y3RzPC9oMT5cclxuPC9kaXY+XHJcblxyXG48bWF0LWRpYWxvZy1jb250ZW50IFtuZ0NsYXNzXT1cImRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA+IDAgPyAncHJvZHVjdHMtc2Nyb2xsLXZpc2libGUnOiAnJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1hdC1kaWFsb2ctY29udGVudFwiPlxyXG4gICAgICAgIDwhLS1TZWFyY2ggU3RhcnQtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFzaWMtc2VhcmNoXCIgW2hpZGRlbl09XCJjdXJyZW50UGFnZSAhPT0gJ3NlbGVjdC1wcm9kdWN0cydcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhc2ljLXNlYXJjaC13cnBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCAyNCAyNVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoMCAwIDApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuMjUgMi43NUM2LjE0MTU0IDIuNzUgMiA2Ljg5MDI5IDIgMTEuOTk4QzIgMTcuMTA1NiA2LjE0MTU0IDIxLjI0NTkgMTEuMjUgMjEuMjQ1OUMxMy41MzM1IDIxLjI0NTkgMTUuNjIzOCAyMC40MTg3IDE3LjIzNzMgMTkuMDQ3NUwyMC43MTgyIDIyLjUyODdDMjEuMDExIDIyLjgyMTYgMjEuNDg1OSAyMi44MjE3IDIxLjc3ODggMjIuNTI4OEMyMi4wNzE3IDIyLjIzNTkgMjIuMDcxOCAyMS43NjEgMjEuNzc4OSAyMS40NjgxTDE4LjI5ODMgMTcuOTg3MkMxOS42NzE0IDE2LjM3MzYgMjAuNSAxNC4yODI2IDIwLjUgMTEuOTk4QzIwLjUgNi44OTAyOSAxNi4zNTg1IDIuNzUgMTEuMjUgMi43NVpNMy41IDExLjk5OEMzLjUgNy43MTkwNSA2Ljk2OTYyIDQuMjUgMTEuMjUgNC4yNUMxNS41MzA0IDQuMjUgMTkgNy43MTkwNSAxOSAxMS45OThDMTkgMTYuMjc2OSAxNS41MzA0IDE5Ljc0NTkgMTEuMjUgMTkuNzQ1OUM2Ljk2OTYyIDE5Ljc0NTkgMy41IDE2LjI3NjkgMy41IDExLjk5OFpcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtc2VhcmNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVEcm9wZG93bkZpbHRlcigpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB0eXBlPVwidGV4dFwiIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBQcm9kdWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwic2VhcmNoUHJvZHVjdE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImNsZWFySWZFbXB0eSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJhZHZmaWx0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWR2XCIgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLXJvdW5kXCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwidHVuZVwiPnR1bmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJhY3RpdmVGaWx0ZXJzQ291bnQgPiAwXCIgY2xhc3M9XCJjdXN0b20tYmFkZ2VcIj57eyBhY3RpdmVGaWx0ZXJzQ291bnQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJ0blwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVEcm9wZG93bkZpbHRlcigpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5TZWFyY2g8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLVNlYXJjaCBFbmQtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1zZWxlY3RvclwiPlxyXG4gICAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiY3VycmVudFBhZ2UgIT09ICdzZWxlY3QtcHJvZHVjdHMnXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1zZWxlY3Rpb24tY29udGFpbmVyXCIgKm5nSWY9XCJpc1Zpc2libGUgJiYgZHJvcGRvd25MMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tc2VsZWN0aW9uXCIgKm5nSWY9XCJkcm9wZG93bkwxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImRyb3BEb3duQ291bnQgPT09IDEgPyAnbm8tY2hpbGQnOiAnY2hpbGQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLWFkdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+QWR2YW5jZWQgRmlsdGVyczwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjbHItYWxsLXBpY2tlclwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXRUYWJsZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWN0aXZlRmlsdGVyc0NvdW50ID4gMFwiPkNsZWFyIEFsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiZHJvcGRvd25MMVwiIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tkcm9wZG93bkwxTGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkcm9wZG93bkxldmVsMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG8zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudCwgJ2NhdGVnb3J5MScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5Rm5cIiAjYXV0bzM9XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cIm9uT3B0aW9uU2VsZWN0ZWQoJGV2ZW50LCAnY2F0ZWdvcnkxJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWREcm9wZG93bk9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4ICpuZ0lmPVwiZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwxJykudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmllbGQoJ2Ryb3Bkb3duTGV2ZWwxJywgJ2NhdGVnb3J5MScsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uY2xvc2VcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb25kcm9wZG93blwiIG1hdFN1ZmZpeD5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImRyb3Bkb3duTDJcIiBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ZHJvcGRvd25MMkxhYmVsfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZHJvcGRvd25MZXZlbDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQsICdjYXRlZ29yeTInKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBbZGlzcGxheVdpdGhdPVwiZGlzcGxheUZuXCIgI2F1dG80PVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudCwgJ2NhdGVnb3J5MicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkRHJvcGRvd25Ud29cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeCAqbmdJZj1cImZvcm0uZ2V0KCdkcm9wZG93bkxldmVsMicpLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpZWxkKCdkcm9wZG93bkxldmVsMicsICdjYXRlZ29yeTInLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbmNsb3NlXCI+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uZHJvcGRvd25cIiBtYXRTdWZmaXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQtaWNvbic6IGlzRGlzYWJsZWQyfVwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImRyb3Bkb3duTDNcIiBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ZHJvcGRvd25MM0xhYmVsfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZHJvcGRvd25MZXZlbDNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQsICdjYXRlZ29yeTMnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBbZGlzcGxheVdpdGhdPVwiZGlzcGxheUZuXCIgI2F1dG81PVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudCwgJ2NhdGVnb3J5MycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkRHJvcGRvd25UaHJlZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4ICpuZ0lmPVwiZm9ybS5nZXQoJ2Ryb3Bkb3duTGV2ZWwzJykudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmllbGQoJ2Ryb3Bkb3duTGV2ZWwzJywgJ2NhdGVnb3J5MycsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uY2xvc2VcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb25kcm9wZG93blwiIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlLWljb24nOiBpc0Rpc2FibGVkM31cIj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImRyb3Bkb3duTDRcIiBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7ZHJvcGRvd25MNExhYmVsfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZHJvcGRvd25MZXZlbDRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQsICdjYXRlZ29yeTQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBbZGlzcGxheVdpdGhdPVwiZGlzcGxheUZuXCIgI2F1dG82PVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvbk9wdGlvblNlbGVjdGVkKCRldmVudCwgJ2NhdGVnb3J5NCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkRHJvcGRvd25Gb3VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggKm5nSWY9XCJmb3JtLmdldCgnZHJvcGRvd25MZXZlbDQnKS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZCgnZHJvcGRvd25MZXZlbDQnLCAnY2F0ZWdvcnk0JywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25jbG9zZVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbmRyb3Bkb3duXCIgbWF0U3VmZml4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGUtaWNvbic6IGlzRGlzYWJsZWQ0fVwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICNmaXJzdHNjcm9sbGFibGVEaXYgaWQ9XCJmaXJzdHNjcm9sbGFibGVEaXZcIiBjbGFzcz1cIm5ldy1jbGFzcyBmaXJzdC1kaXZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIiBbbmdDbGFzc109XCJkYXRhU291cmNlPy5kYXRhPy5sZW5ndGggPiAwID8gJ3RibC1yZWNvcmQtZm91bmQnOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBjbGFzcz1cIm1hdC10YWJsZSBhYmNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhU291cmNlICYmIGRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA+IDA7IGVsc2Ugbm9EYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IHRvZ2dsZVNlbGVjdGlvbihyb3cpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCI+PC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwcm9kdWN0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7cHJvZHVjdFR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQ/LnRleHR9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNrdU51bWJlclwiICpuZ0lmPVwic2hvd1NrdU51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7c2t1VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudD8ub3RoZXJJbmZvcm1hdGlvbjB9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImludmVudG9yeVwiICpuZ0lmPVwic2hvd0ludmVudG9yeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7aW52ZW50b3J5VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudD8ub3RoZXJJbmZvcm1hdGlvbjF9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImFkZFByb2R1Y3RzQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogYWRkUHJvZHVjdHNDb2x1bW5zO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTt0b2dnbGVTZWxlY3Rpb24ocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj48L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vRGF0YT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1kYXRhLW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tTm8gZGF0YSBmb3VuZC4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHAtZW1wdHktc3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltZy1lbXB0eS1zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImVtcHR5SW1hZ2VcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5ObyByZWNvcmRzIHRvIHNob3cgYXQgdGhlIG1vbWVudDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlBsZWFzZSBtb2RpZnkgeW91ciBzZWFyY2ggY3JpdGVyaWEgdG8gZmluZCB0aGUgZGVzaXJlZCByZXN1bHQ8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1zdW1tYXJ5XCIgKm5nSWY9XCJkYXRhU291cmNlICYmIGRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5TZWxlY3RlZDogPHN0cm9uZz57eyBnZXRTZWxlY3RlZFJvd3NDb3VudCgpIH19PC9zdHJvbmc+IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlRvdGFsIFJlY29yZHM6IDxzdHJvbmc+e3sgZ2V0VG90YWxSZWNvcmRzIH19PC9zdHJvbmc+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBbaGlkZGVuXT1cImN1cnJlbnRQYWdlICE9PSAnZWRpdC1zYXZlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy1jbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlbGVjdGVkRGF0YVNvdXJjZSAmJiBzZWxlY3RlZERhdGFTb3VyY2UuZGF0YS5sZW5ndGggPiAwID8gJ2FkZGVkLXByb2R1Y3RzJzogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJzZWxlY3RlZERhdGFTb3VyY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZERhdGFTb3VyY2UgJiYgc2VsZWN0ZWREYXRhU291cmNlLmRhdGEubGVuZ3RoID4gMDsgZWxzZSBzaG93QmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGVsZXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUtYnRuLXBpY2tlclwiIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7cmVtb3ZlUm93KCRldmVudCwgZWxlbWVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgYXJpYS1sYWJlbD1cIlJlbW92ZSByb3dcIj5kZWxldGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInByb2R1Y3ROYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3twcm9kdWN0VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudC50ZXh0fX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjYXRlZ29yeU5hbWVcIiAqbmdJZj1cInNob3dDYXRlZ29yeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7Y2F0ZWdvcnlUd2Vla319IDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LmNhdGVnb3J5fX0gPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdWJDYXRlZ29yeVwiICpuZ0lmPVwic2hvd1N1YmNhdGVnb3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4ge3tzdWJDYXRlZ29yeVR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQuc3ViQ2F0ZWdvcnl9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInByaWNlXCIgKm5nSWY9XCJzaG93UHJpY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPnt7cHJpY2VUd2Vla319PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGggc2VsZWN0LXByaWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7cHJpY2VUd2Vla319PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdwcmljZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiYXBwbHlWYWxpZGF0aW9uUnVsZSgkZXZlbnQsIGksICdwcmljZScpXCIgKGtleXByZXNzKT1cInJlc3RyaWN0SW5wdXQoJGV2ZW50KVwiIChwYXN0ZSk9XCJoYW5kbGVQYXN0ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ3ByaWNlJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIlF1YW50aXR5XCIgKm5nSWY9XCJzaG93UXVhbnRpdHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e3F1YW50aXR5VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e3F1YW50aXR5VHdlZWt9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJzZWxlY3RlZFByb2R1Y3RzLmF0KGkpLmdldCgncXVhbnRpdHknKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBzdGVwPVwiMVwiIChpbnB1dCk9XCJvblF1YW50aXR5Q2hhbmdlKCRldmVudCwgaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzZWxlY3RlZFByb2R1Y3RzLmF0KGkpLmdldCgncXVhbnRpdHknKS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdxdWFudGl0eScpLmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YW50aXR5IGNhbiBub3QgYmUgbGVzcyB0aGFuIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlbGVjdGVkUHJvZHVjdHMuYXQoaSkuZ2V0KCdxdWFudGl0eScpLmhhc0Vycm9yKCdwYXR0ZXJuJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFscyBub3QgYWxsb3dlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJza3VOdW1iZXJcIiAqbmdJZj1cInNob3dTa3VOdW1iZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7e3NrdVR3ZWVrfX0gPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8ub3RoZXJJbmZvcm1hdGlvbjB9fSA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImludmVudG9yeVwiICpuZ0lmPVwic2hvd0ludmVudG9yeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7aW52ZW50b3J5VHdlZWt9fSA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50Py5vdGhlckluZm9ybWF0aW9uMX19IDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNvc3RcIiAqbmdJZj1cInNob3dDb3N0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj57e2Nvc3RUd2Vla319PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGggc2VsZWN0LWNvc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tjb3N0VHdlZWt9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJzZWxlY3RlZFByb2R1Y3RzLmF0KGkpLmdldCgnb3RoZXJJbmZvcm1hdGlvbjAnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImFwcGx5VmFsaWRhdGlvblJ1bGUoJGV2ZW50LCBpLCAnb3RoZXJJbmZvcm1hdGlvbjAnKVwiIChrZXlwcmVzcyk9XCJyZXN0cmljdElucHV0KCRldmVudClcIiAocGFzdGUpPVwiaGFuZGxlUGFzdGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRQcm9kdWN0cy5hdChpKS5nZXQoJ290aGVySW5mb3JtYXRpb24wJykuaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cInNob3dBbGxwcm9kdWN0c0NvbHVtbnNcIj48L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IHNob3dBbGxwcm9kdWN0c0NvbHVtbnM7XCI+PC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctdGVtcGxhdGUgI3Nob3dCbGFuaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1kYXRhLW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBkYXRhIGZvdW5kLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dCbGFuaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1kYXRhLW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHAtZW1wdHktc3RhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltZy1lbXB0eS1zdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImVtcHR5SW1hZ2VcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5ObyBQcm9kdWN0IGFkZGVkPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+UGxlYXNlIGdvIGJhY2sgYW5kIHN0YXJ0IGFkZGluZyBwcm9kdWN0czwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcbjxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFicy1hY3Rpb24tc3RlcC1vbmVcIiAqbmdJZj1cImN1cnJlbnRQYWdlID09PSAnc2VsZWN0LXByb2R1Y3RzJ1wiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiZ29Ub05leHRQYWdlKClcIiBbZGlzYWJsZWRdPVwic2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA/IGZhbHNlIDogdHJ1ZVwiXHJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1yYWlzZWQtYnV0dG9uPk5leHQ8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwiZmFsc2VcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRhYnMtYWN0aW9uXCIgKm5nSWY9XCJjdXJyZW50UGFnZSA9PT0gJ2VkaXQtc2F2ZSdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWFjdGlvbi13cnBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJnb1RvUHJldmlvdXNQYWdlKClcIj5CYWNrPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY29sb3I9XCJwcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uU3VibWl0KClcIj5BZGQ8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L21hdC1kaWFsb2ctYWN0aW9ucz4iXX0=
|