@rangertechnologies/ngnxt 2.1.245 → 2.1.246
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/environments/version.mjs +2 -2
- package/esm2022/lib/components/datatable/datatable.component.mjs +10 -3
- package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +9 -18
- package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +5 -12
- package/esm2022/lib/components/search-box/search-box.component.mjs +40 -27
- package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +2 -1
- package/esm2022/lib/pages/builder/properties/properties.component.mjs +28 -34
- package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +13 -8
- package/esm2022/lib/services/form-builder.service.mjs +5 -1
- package/fesm2022/rangertechnologies-ngnxt.mjs +105 -97
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/list-view-filter/list-view-filter.component.d.ts +2 -5
- package/lib/components/nxt-input/nxt-input.component.d.ts +0 -1
- package/lib/pages/builder/properties/properties.component.d.ts +0 -4
- package/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.d.ts +3 -2
- package/package.json +1 -1
- package/rangertechnologies-ngnxt-2.1.246.tgz +0 -0
- package/rangertechnologies-ngnxt-2.1.245.tgz +0 -0
|
@@ -38,6 +38,8 @@ export class ListViewFilterComponent {
|
|
|
38
38
|
tableFilterArrayTrans;
|
|
39
39
|
displayedColumnsTrans;
|
|
40
40
|
availableOperatorsTrans;
|
|
41
|
+
conditions;
|
|
42
|
+
columns;
|
|
41
43
|
constructor(fb, nxtCustomTranslate) {
|
|
42
44
|
this.fb = fb;
|
|
43
45
|
this.nxtCustomTranslate = nxtCustomTranslate;
|
|
@@ -69,6 +71,8 @@ export class ListViewFilterComponent {
|
|
|
69
71
|
this.availableOperatorsTrans.forEach((ele) => {
|
|
70
72
|
ele.label = this.nxtCustomTranslate.transform(ele.labelPath || ele.label, ele.label);
|
|
71
73
|
});
|
|
74
|
+
this.conditions = this.editingView.get('conditions');
|
|
75
|
+
this.columns = this.editingView.get('columns');
|
|
72
76
|
}
|
|
73
77
|
ngOnChanges(changes) {
|
|
74
78
|
if (!this.selectedView && this.listViews?.length > 0) {
|
|
@@ -78,13 +82,8 @@ export class ListViewFilterComponent {
|
|
|
78
82
|
else {
|
|
79
83
|
this.selectedViewPath = this.selectedView === 'All Data' ? this.listViews[0].labelPath : this.selectedView;
|
|
80
84
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return this.editingView.get('conditions');
|
|
84
|
-
}
|
|
85
|
-
// SKS3MAY25 Returns the FormArray of columns from the editing form
|
|
86
|
-
get columns() {
|
|
87
|
-
return this.editingView.get('columns');
|
|
85
|
+
this.conditions = this.editingView.get('conditions');
|
|
86
|
+
this.columns = this.editingView.get('columns');
|
|
88
87
|
}
|
|
89
88
|
// SKS3MAY25 Adds a new filter condition to the form
|
|
90
89
|
addFilter() {
|
|
@@ -232,14 +231,6 @@ export class ListViewFilterComponent {
|
|
|
232
231
|
closeModal() {
|
|
233
232
|
this.isModalOpen = false;
|
|
234
233
|
}
|
|
235
|
-
// SKS3MAY25 Shows action buttons for a list view on hover
|
|
236
|
-
showActions(view) {
|
|
237
|
-
view.showActions = true;
|
|
238
|
-
}
|
|
239
|
-
// SKS3MAY25 Hides action buttons for all list views
|
|
240
|
-
hideActions() {
|
|
241
|
-
this.listViews.forEach(view => view.showActions = false);
|
|
242
|
-
}
|
|
243
234
|
// SKS3MAY25 Opens confirmation modal to delete a list view
|
|
244
235
|
confirmDelete(view, event) {
|
|
245
236
|
if (event)
|
|
@@ -377,11 +368,11 @@ export class ListViewFilterComponent {
|
|
|
377
368
|
}
|
|
378
369
|
}
|
|
379
370
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListViewFilterComponent, deps: [{ token: i1.FormBuilder }, { token: i2.NxtCustomTranslatePipe }], target: i0.ɵɵFactoryTarget.Component });
|
|
380
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ListViewFilterComponent, isStandalone: true, selector: "app-list-view-filter", inputs: { listViews: "listViews", tableFilterArray: "tableFilterArray", selectedView: "selectedView", displayedColumns: "displayedColumns", availableOperators: "availableOperators" }, outputs: { listViewEmit: "listViewEmit" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [NxtCustomTranslatePipe], usesOnChanges: true, ngImport: i0, template: "<div class=\"list-view-filter\">\n <div class=\"custom-dropdown\">\n <div class=\"filter-label\">{{'APP.DATA_RELATED_TO' | nxtCustomTranslate : 'Data Related to'}}</div>\n <div class=\"select-wrapper\">\n <svg class=\"filter-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"24\" height=\"24\" rx=\"5\" fill=\"#F1F1F1\" />\n <path d=\"M5.51288 4.5H12.1879C12.7429 4.5 13.2004 4.9575 13.2004 5.5125V6.62249C13.2004 7.02749 12.9454 7.53 12.6979 7.785L10.5229 9.705C10.2229 9.96 10.0204 10.4625 10.0204 10.8675V13.0425C10.0204 13.3425 9.8179 13.7475 9.5629 13.905L8.85789 14.3625C8.19789 14.7675 7.29037 14.31 7.29037 13.5V10.8225C7.29037 10.47 7.08789 10.0125 6.88539 9.75751L4.96539 7.7325C4.71039 7.4775 4.5079 7.02749 4.5079 6.71999V5.5575C4.5004 4.9575 4.95788 4.5 5.51288 4.5Z\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.5 11.9999V14.2499C4.5 17.9999 6 19.4999 9.75 19.4999H14.25C18 19.4999 19.5 17.9999 19.5 14.2499V9.74994C19.5 7.40994 18.915 5.93993 17.5575 5.17493C17.175 4.95743 16.41 4.79243 15.7125 4.67993\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.75 12.75H16.5\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M11.25 15.75H16.5\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <div class=\"custom-dropdown\">\n <div class=\"selected-option\" (click)=\"toggleDropdown()\">\n <div>\n {{ selectedView ? (selectedViewPath || selectedView | nxtCustomTranslate : selectedView) : ('APP.SELECT_A_VIEW' | nxtCustomTranslate : 'Select a view') }}\n </div>\n <svg class=\"chevron-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\" fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n <!-- SKS3MAY25 list view Drop down-->\n <div *ngIf=\"isDropdownOpen\" class=\"dropdown-options-container\">\n <ul class=\"dropdown-options\">\n <li *ngFor=\"let view of listViews\" [class.selected]=\"selectedView === view.filterName\" (mouseenter)=\"showActions(view)\" (mouseleave)=\"hideActions()\" (click)=\"selectListView(view)\" class=\"list-view-item\">\n <span class=\"view-name\">{{ view.labelPath || view.filterName | nxtCustomTranslate : view.filterName }}</span>\n <div *ngIf=\"view.showActions\">\n <div class=\"actions\">\n <div class=\"edit-icon\" (click)=\"startEdit(view, $event)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.32923 3.98726L12.0126 6.67059M9.32923 3.98726L2.50008 10.8164V13.4997H5.18342L12.0126 6.67059M9.32923 3.98726L12.0126 1.30392L14.6959 3.98726L12.0126 6.67059\" stroke=\"#000000\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"delete-icon\" (click)=\"confirmDelete(view, $event)\" *ngIf=\"listViews.length > 1\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </li>\n </ul>\n <div class=\"add-filter\" (click)=\"startAdd()\">\n <div class=\"add-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span>{{'APP.NEW_LIST_VIEW' | nxtCustomTranslate : 'New List View'}}</span>\n </div>\n </div>\n </div>\n <!-- SKS3MAY25 Add New List View-->\n <div *ngIf=\"isModalOpen\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"modal-header-div\">\n {{ (isAdding ? 'APP.ADD_NEW_LIST_VIEW' : 'APP.EDIT_LIST_VIEW') | nxtCustomTranslate : (isAdding ? 'Add New List View' : 'Edit List View') }} \n <span class=\"close\" (click)=\"closeModal()\">×</span>\n </div>\n <form [formGroup]=\"editingView\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>{{'APP.NAME' | nxtCustomTranslate :'Name'}}:</label>\n <input formControlName=\"filterName\" [placeholder]=\"'APP.ENTER_LIST_VIEW_NAME' | nxtCustomTranslate : 'Enter list view name'\" required>\n <div *ngIf=\"editingView.get('filterName')?.invalid && (editingView.get('filterName')?.dirty || editingView.get('filterName')?.touched)\" class=\"error-message\">\n {{ 'APP.NAME_IS_REQ' | nxtCustomTranslate : 'Name is required'}}.\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{'APP.ORDER' | nxtCustomTranslate : 'Order'}}:</label>\n <input type=\"number\" formControlName=\"order\" [placeholder]=\" 'APP.ENTER_DISPLAY_ORDER' | nxtCustomTranslate : 'Enter display order'\" required>\n <div *ngIf=\"editingView.get('order')?.invalid && (editingView.get('order')?.dirty || editingView.get('order')?.touched)\" class=\"error-message\">\n {{'APP.ORDER_IS_REQ_AND_BE_A_NUM' | nxtCustomTranslate : 'Order is required and must be a number'}}.\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{'APP.DEFAULT_VIEW' | nxtCustomTranslate : 'Default View'}}:</label>\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" formControlName=\"isDefault\" id=\"isDefault\">\n <label for=\"isDefault\" class=\"toggle-button\"></label>\n </div>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>{{'APP.FILTERS' | nxtCustomTranslate : 'Filters'}}</h3>\n <span class=\"section-description\">{{'APP.DEFINE_CONDITIONS_FOR_FILTERED_LIST_VIEW' | nxtCustomTranslate : 'Define conditions for filtered list view'}}</span>\n </div>\n <div formArrayName=\"conditions\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"column-cell\">{{'APP.COLUMN' | nxtCustomTranslate : 'Column'}}</div>\n <div class=\"operator-cell\">{{'APP.OPERATOR' | nxtCustomTranslate : 'Operator'}}</div>\n <div class=\"value-cell\">{{'APP.VALUE' | nxtCustomTranslate : 'Value'}}</div>\n <div class=\"action-cell\">{{'APP.ACTION' | nxtCustomTranslate : 'Action'}}</div>\n </div>\n \n <div *ngFor=\"let filter of conditions.controls; let i = index\" [formGroupName]=\"i\" class=\"filter-row\">\n <div class=\"column-cell\">\n <div class=\"listview-custom-select\">\n <input formControlName=\"field\" [value]=\"getLabelByFieldName(conditions.at(i).get('field').value)\" (focus)=\"onFocus('field', i)\" (blur)=\"onBlur('field', i)\" [placeholder]=\"'APP.ENTER_OR_SELECT_COLUMN' | nxtCustomTranslate : 'Enter or select column'\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnDropdownOpen[i]\">\n <div *ngFor=\"let field of getFilteredColumns(conditions.at(i).get('field').value)\" class=\"dropdown-item\" (click)=\"selectOption('field', i, field.label)\">\n {{ field.label }}\n </div>\n </div>\n </div>\n <div *ngIf=\"filter.get('field')?.invalid && (filter.get('field')?.dirty || filter.get('field')?.touched)\" class=\"error-message\">\n {{'APP.COLUMN_IS_REQ' | nxtCustomTranslate : 'Column is required'}}.\n </div>\n </div>\n \n <div class=\"operator-cell\">\n <div class=\"listview-custom-select\">\n <input\n [value]=\"getOperatorLabel(conditions.at(i).get('operator').value)\"\n (input)=\"onOperatorInput($event.target.value, i)\"\n (focus)=\"onFocus('operator', i)\"\n (blur)=\"onBlur('operator', i)\"\n [placeholder]=\"'APP.ENTER_OR_SELECT_OPERATOR' | nxtCustomTranslate : 'Enter or select operator'\"\n />\n \n <div class=\"dropdown-list\" *ngIf=\"isOperatorDropdownOpen[i]\">\n <div\n *ngFor=\"let operator of getFilteredOperators(operatorInput[i])\"\n class=\"dropdown-item\"\n (click)=\"selectOption('operator', i, operator.value)\"\n >\n {{ operator.label }}\n </div>\n </div>\n </div> \n <div *ngIf=\"filter.get('operator')?.invalid && (filter.get('operator')?.dirty || filter.get('operator')?.touched)\" class=\"error-message\">\n {{'APP.OPERATOR_IS_REQ' | nxtCustomTranslate : 'Operator is required'}}.\n </div>\n </div>\n \n <div class=\"value-cell\">\n <div class=\"listview-custom-select\">\n <input formControlName=\"value\" (focus)=\"onFocus('value', i)\" (blur)=\"onBlur('value', i)\" [placeholder]=\"'APP.ENTER_OR_SELECT_VALUE' | nxtCustomTranslate : 'Enter or select value'\">\n <div class=\"dropdown-list\" *ngIf=\"isValueDropdownOpen[i] && getPossibleValues(conditions.at(i).get('field').value, conditions.at(i).get('value').value)?.length > 0\">\n <div *ngFor=\"let val of getPossibleValues(conditions.at(i).get('field').value, conditions.at(i).get('value').value)\" class=\"dropdown-item\" (click)=\"selectOption('value', i, val)\">\n {{ val }}\n </div>\n </div>\n </div>\n <div *ngIf=\"filter.get('value')?.invalid && (filter.get('value')?.dirty || filter.get('value')?.touched)\" class=\"error-message\">\n {{'APP.VALUE_IS_REQUIRED' | nxtCustomTranslate : 'Value is required'}}.\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" [matTooltip]=\"'APP.REMOVE' | nxtCustomTranslate : 'Remove'\">\n <div class=\"delete-icon\" (click)=\"removeFilter(i)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"add-row\">\n <div class=\"flex addIconBor cursor-pointer\" (click)=\"addFilter()\" [matTooltip]=\"'APP.ADD_FILTER' | nxtCustomTranslate : 'Add Filter'\">\n <div class=\"addIcon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n <span>{{'APP.ADD_FILTER' | nxtCustomTranslate : 'Add Filter'}}</span>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>{{'APP.COLUMNS' | nxtCustomTranslate : 'Columns'}}</h3>\n <span class=\"section-description\">{{'APP.SELECT_FIELD_TO_DISPLAY_IN_TABLE' | nxtCustomTranslate : 'Select field to display in table'}}</span>\n </div>\n <div formArrayName=\"columns\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"name-cell\">{{'APP.COLUMN_NAME' | nxtCustomTranslate : 'Column Name'}}</div>\n <div class=\"bool-cell\">{{'APP.SORTABLE' | nxtCustomTranslate : 'Sortable'}}</div>\n <div class=\"bool-cell\">{{'APP.FILTERABLE' | nxtCustomTranslate :'Filterable'}}</div>\n <div class=\"action-cell\">{{'APP.ACTION' | nxtCustomTranslate : 'Action'}}</div>\n </div>\n \n <div *ngFor=\"let field of columns.controls; let i = index\" [formGroupName]=\"i\" class=\"column-row\">\n <div class=\"name-cell\">\n <div class=\"listview-custom-select\">\n <input \n formControlName=\"name\" \n (focus)=\"onFocus('columnName', i)\" \n (blur)=\"onBlur('columnName', i)\" \n (input)=\"onManualInput($event.target.value, i)\"\n [placeholder]=\"'APP.ENTER_OR_SELECT_COLUMN_NAME' | nxtCustomTranslate : 'Enter or select column name'\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnNameDropdownOpen[i]\">\n <div *ngFor=\"let colName of getColumnColumns(columns.at(i).get('name').value)\" class=\"dropdown-item\" (click)=\"selectOption('columnName', i, colName.label); isColumnNameDropdownOpen[i] = false\">\n {{ colName.label }}\n </div>\n </div>\n </div>\n <div *ngIf=\"field.get('name')?.invalid && (field.get('name')?.dirty || field.get('name')?.touched)\" class=\"error-message\">\n {{'APP.COLUMN_NAME_IS_REQ' | nxtCustomTranslate : 'Column name is required'}}.\n </div>\n </div>\n \n <div class=\"bool-cell\">\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" [id]=\"'sortable-' + i\" formControlName=\"sortable\">\n <label [for]=\"'sortable-' + i\" class=\"toggle-button\"></label>\n </div>\n </div>\n \n <div class=\"bool-cell\">\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" [id]=\"'filterable-' + i\" formControlName=\"filterable\">\n <label [for]=\"'filterable-' + i\" class=\"toggle-button\"></label>\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" [matTooltip]=\"'APP.REMOVE' | nxtCustomTranslate : 'Remove'\">\n <div class=\"delete-icon\" (click)=\"removeColumn(i)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"add-row\">\n <div class=\"flex addIconBor cursor-pointer\" (click)=\"addColumn()\" [matTooltip]=\"'APP.ADD_COLUMN' | nxtCustomTranslate : 'Add Column'\">\n <div class=\"addIcon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n <span>{{'APP.ADD_COLUMN' | nxtCustomTranslate : 'Add Column'}}</span>\n </div>\n </div>\n <div *ngIf=\"conditions.length === 0 && columns.length === 0\" class=\"error-message\">\n {{'APP.AT_LEAST_ONE_FILTER_OR_ONE_COLUMN_IS_REQ' | nxtCustomTranslate : ' At least one filter or one column is required'}}.\n </div> \n <div class=\"form-actions\">\n <button type=\"button\" class=\"save-button\" (click)=\"save()\" [disabled]=\"!editingView.valid || (conditions.length === 0 && columns.length === 0)\">{{'APP.SAVE' | nxtCustomTranslate : 'Save'}}</button>\n <button type=\"button\" (click)=\"closeModal()\">{{'APP.CANCEL' | nxtCustomTranslate : 'Cancel'}}</button>\n </div>\n </form>\n </div>\n </div>\n <!-- SKS3MAY25 Delete List View-->\n <div *ngIf=\"isDeleteModalOpen\" class=\"modal\">\n <div class=\"modal-content\">\n <h2>{{'APP.DELETE_LIST_VIEW' | nxtCustomTranslate : 'Delete List View'}}</h2>\n <p>{{'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE' | nxtCustomTranslate : 'Are you sure you want to delete'}} \"{{ viewToDelete?.filterName }}\"?</p>\n <div class=\"form-delete\">\n <button type=\"button\" (click)=\"deleteConfirmed()\">{{'APP.DELETE' | nxtCustomTranslate : 'Delete'}}</button>\n <button type=\"button\" (click)=\"closeDeleteModal()\">{{'APP.CANCEL' | nxtCustomTranslate : 'Cancel'}}</button>\n </div>\n </div>\n </div>\n</div>", styles: [".list-view-filter{padding-left:10px;padding-right:10px}.filter-label{font-size:11px;color:#747577;margin-right:8px}.select-wrapper{display:flex;align-items:center;cursor:pointer}.custom-dropdown{position:relative;cursor:pointer;display:inline-block}.selected-option{padding:2px 5px;font-size:16px;font-weight:700;display:flex;gap:8px}.chevron-icon{cursor:pointer;background-color:#f5f5f5;border-radius:5px}.dropdown-options-container{position:absolute;top:100%;display:flex;flex-direction:column;border:1px solid #ccc;background:#fff;box-shadow:0 2px 8px #0000001a;z-index:1000;min-width:250px}.dropdown-options{background:#fff;list-style:none;padding:0;margin:0;white-space:nowrap;width:100%;max-height:300px;overflow-y:auto}.dropdown-options li{padding:8px;cursor:pointer}.dropdown-options li:hover{background-color:#f1f1f1}.dropdown-options li.selected{background-color:#f1f1f1;font-weight:600}.list-view-item{display:flex;justify-content:space-between;padding:8px;cursor:pointer;border-bottom:1px solid #f0f0f0}.list-view-item:hover{background-color:#f8f9fa}.actions{display:flex;gap:10px}.edit-icon,.delete-icon{cursor:pointer;color:#666;transition:color .2s}.edit-icon:hover{color:#007bff}.delete-icon:hover{color:#dc3545}.add-filter{background-color:#fff;padding:10px;border-top:1px solid #dddddd;cursor:pointer;display:flex;align-items:center;gap:8px;width:100%}.add-filter:hover{background-color:#f8f9fa}.add-icon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.modal{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1001}.modal-content{background-color:#fff;border-radius:8px;padding:24px;width:700px;max-width:95%;max-height:90vh;overflow-y:auto;box-shadow:0 4px 20px #00000026}.modal-content h2{margin-top:0;margin-bottom:20px;font-size:20px;color:#333}.form-group{margin-bottom:16px}.form-group label{display:block;margin-bottom:8px;font-size:14px;font-weight:500}.form-group input{width:100%;padding:8px 12px;border:1px solid #ddd;border-radius:4px;font-size:14px}.toggle-wrapper{position:relative;display:inline-block}.toggle-wrapper input[type=checkbox]{opacity:0;width:0;height:0}.toggle-button{position:relative;display:inline-block;width:50px;height:24px;background-color:#ccc;border-radius:24px;transition:.3s;cursor:pointer}.toggle-button:before{position:absolute;content:\"\";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;border-radius:50%;transition:.3s}input[type=checkbox]:checked+.toggle-button{background-color:#007bff}input[type=checkbox]:checked+.toggle-button:before{transform:translate(20px)}.toggle-wrapper.small .toggle-button{width:40px;height:20px}.toggle-wrapper.small .toggle-button:before{height:16px;width:16px}input[type=checkbox]:checked+.toggle-button.small:before{transform:translate(20px)}.section-header{padding-bottom:8px}.section-header h3{margin:0 0 4px;font-size:16px;color:#333}.section-description{font-size:12px;color:#777}.table-container{border:1px solid #e0e0e0;border-radius:4px}.table-header{display:grid;background-color:#f8f9fa;font-weight:600;font-size:12px;padding:8px 12px;border-bottom:1px solid #e0e0e0}.filter-row,.column-row{display:grid;padding:8px 12px;border-bottom:1px solid #f0f0f0;align-items:center}.filter-row,.column-row,.table-header{grid-template-columns:1fr 1fr 1fr auto;gap:10px}.table-header.column-header{grid-template-columns:1fr 1fr 1fr auto}.column-cell,.operator-cell,.value-cell,.name-cell,.bool-cell,.action-cell{padding:5px}.action-cell{display:flex;justify-content:center}.listview-custom-select{position:relative;width:100%}.listview-custom-select input{border:none;font-size:12px}.dropdown-list{position:absolute;top:100%;left:0;width:100%;max-height:200px;overflow-y:auto;background:#fff;border:1px solid #ddd;border-top:none;border-radius:0 0 4px 4px;z-index:10;box-shadow:0 4px 8px #0000001a}.dropdown-item{padding:8px 12px;cursor:pointer}.dropdown-item:hover{background-color:#f5f5f5}.add-row{display:flex;align-items:center;gap:8px;padding:10px;cursor:pointer}.add-row:hover{background-color:#f8f9fa}.addIconBor{padding:4px;border-radius:5px;border:1px solid #6c757d;transition:background-color .3s,border-color .3s}.addIconBor:hover .addIcon{background-color:#bbd3ff}.addIcon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.dicon-container{padding:2px;border:1px solid #ffb5b5;border-radius:5px;margin-left:3px;margin-right:3px;display:flex;width:38px}.delete-icon{padding:2px 4px;border-radius:5px;background-color:#feeeed;align-content:center;width:32px;display:flex;justify-content:center;align-items:center}.dicon-container:hover .delete-icon svg path{stroke:#fff!important;fill:transparent!important}.dicon-container:hover .delete-icon{background-color:#ff7575!important;cursor:pointer}.dicon-container:hover{border:1px solid #ff2121!important}.form-actions{display:flex;justify-content:flex-end;gap:12px;margin-top:20px}.form-delete{display:flex;justify-content:flex-end;gap:12px}.form-actions button,.form-delete button{padding:8px 16px;border-radius:4px;font-size:14px;cursor:pointer;transition:background-color .2s}.form-actions button:first-child{background-color:#007bff;color:#fff;border:1px solid #007bff}.form-actions button:nth-child(2){background-color:#f8f9fa;border:1px solid #ddd;color:#333}.form-delete button:first-child{background-color:#dc3545;color:#fff;border:1px solid #dc3545}.form-delete button:nth-child(2){background-color:#f8f9fa;border:1px solid #ddd;color:#333}.form-actions button:hover,.form-delete button:hover{opacity:.9}.cursor-pointer{cursor:pointer}.flex{display:flex}.form-row{display:flex;gap:16px;align-items:flex-start}.form-group{min-width:0;margin-bottom:0!important}.error-message{color:#dc3545;font-size:12px;margin-top:4px}.listview-custom-select input[readonly]{cursor:pointer;background-color:#fff}.error-message{color:#ff2c10;font-size:.875rem;margin-bottom:.5rem}.save-button:disabled{background-color:#ccc!important;color:#666!important;cursor:not-allowed!important}.modal-header-div{display:flex;justify-content:space-between;font-size:18px;padding-bottom:10px}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
371
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ListViewFilterComponent, isStandalone: true, selector: "app-list-view-filter", inputs: { listViews: "listViews", tableFilterArray: "tableFilterArray", selectedView: "selectedView", displayedColumns: "displayedColumns", availableOperators: "availableOperators" }, outputs: { listViewEmit: "listViewEmit" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [NxtCustomTranslatePipe], usesOnChanges: true, ngImport: i0, template: "<div class=\"list-view-filter\">\n <div class=\"custom-dropdown\">\n <div class=\"filter-label\">{{'APP.DATA_RELATED_TO' | nxtCustomTranslate : 'Data Related to'}}</div>\n <div class=\"select-wrapper\">\n <svg class=\"filter-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"24\" height=\"24\" rx=\"5\" fill=\"#F1F1F1\" />\n <path d=\"M5.51288 4.5H12.1879C12.7429 4.5 13.2004 4.9575 13.2004 5.5125V6.62249C13.2004 7.02749 12.9454 7.53 12.6979 7.785L10.5229 9.705C10.2229 9.96 10.0204 10.4625 10.0204 10.8675V13.0425C10.0204 13.3425 9.8179 13.7475 9.5629 13.905L8.85789 14.3625C8.19789 14.7675 7.29037 14.31 7.29037 13.5V10.8225C7.29037 10.47 7.08789 10.0125 6.88539 9.75751L4.96539 7.7325C4.71039 7.4775 4.5079 7.02749 4.5079 6.71999V5.5575C4.5004 4.9575 4.95788 4.5 5.51288 4.5Z\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.5 11.9999V14.2499C4.5 17.9999 6 19.4999 9.75 19.4999H14.25C18 19.4999 19.5 17.9999 19.5 14.2499V9.74994C19.5 7.40994 18.915 5.93993 17.5575 5.17493C17.175 4.95743 16.41 4.79243 15.7125 4.67993\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.75 12.75H16.5\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M11.25 15.75H16.5\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <div class=\"custom-dropdown\">\n <div class=\"selected-option\" (click)=\"toggleDropdown()\">\n <div>\n {{ selectedView ? (selectedViewPath || selectedView | nxtCustomTranslate : selectedView) : ('APP.SELECT_A_VIEW' | nxtCustomTranslate : 'Select a view') }}\n </div>\n <svg class=\"chevron-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\" fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n <!-- SKS3MAY25 list view Drop down-->\n <div *ngIf=\"isDropdownOpen\" class=\"dropdown-options-container\">\n <ul class=\"dropdown-options\">\n <li *ngFor=\"let view of listViews\" [class.selected]=\"selectedView === view.filterName\" (click)=\"selectListView(view)\" class=\"list-view-item\">\n <span class=\"view-name\">{{ view.labelPath || view.filterName | nxtCustomTranslate : view.filterName }}</span>\n <div class=\"actions\">\n <div class=\"edit-icon\" (click)=\"startEdit(view, $event)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.32923 3.98726L12.0126 6.67059M9.32923 3.98726L2.50008 10.8164V13.4997H5.18342L12.0126 6.67059M9.32923 3.98726L12.0126 1.30392L14.6959 3.98726L12.0126 6.67059\" stroke=\"#000000\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"delete-icon\" (click)=\"confirmDelete(view, $event)\" *ngIf=\"listViews.length > 1\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </li>\n </ul>\n <div class=\"add-filter\" (click)=\"startAdd()\">\n <div class=\"add-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span>{{'APP.NEW_LIST_VIEW' | nxtCustomTranslate : 'New List View'}}</span>\n </div>\n </div>\n </div>\n <!-- SKS3MAY25 Add New List View-->\n <div *ngIf=\"isModalOpen\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"modal-header-div\">\n {{ (isAdding ? 'APP.ADD_NEW_LIST_VIEW' : 'APP.EDIT_LIST_VIEW') | nxtCustomTranslate : (isAdding ? 'Add New List View' : 'Edit List View') }} \n <span class=\"close\" (click)=\"closeModal()\">×</span>\n </div>\n <form [formGroup]=\"editingView\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>{{'APP.NAME' | nxtCustomTranslate :'Name'}}:</label>\n <input formControlName=\"filterName\" [placeholder]=\"'APP.ENTER_LIST_VIEW_NAME' | nxtCustomTranslate : 'Enter list view name'\" required>\n <div *ngIf=\"editingView.get('filterName')?.invalid && (editingView.get('filterName')?.dirty || editingView.get('filterName')?.touched)\" class=\"error-message\">\n {{ 'APP.NAME_IS_REQ' | nxtCustomTranslate : 'Name is required'}}.\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{'APP.ORDER' | nxtCustomTranslate : 'Order'}}:</label>\n <input type=\"number\" formControlName=\"order\" [placeholder]=\" 'APP.ENTER_DISPLAY_ORDER' | nxtCustomTranslate : 'Enter display order'\" required>\n <div *ngIf=\"editingView.get('order')?.invalid && (editingView.get('order')?.dirty || editingView.get('order')?.touched)\" class=\"error-message\">\n {{'APP.ORDER_IS_REQ_AND_BE_A_NUM' | nxtCustomTranslate : 'Order is required and must be a number'}}.\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{'APP.DEFAULT_VIEW' | nxtCustomTranslate : 'Default View'}}:</label>\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" formControlName=\"isDefault\" id=\"isDefault\">\n <label for=\"isDefault\" class=\"toggle-button\"></label>\n </div>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>{{'APP.FILTERS' | nxtCustomTranslate : 'Filters'}}</h3>\n <span class=\"section-description\">{{'APP.DEFINE_CONDITIONS_FOR_FILTERED_LIST_VIEW' | nxtCustomTranslate : 'Define conditions for filtered list view'}}</span>\n </div>\n <div formArrayName=\"conditions\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"column-cell\">{{'APP.COLUMN' | nxtCustomTranslate : 'Column'}}</div>\n <div class=\"operator-cell\">{{'APP.OPERATOR' | nxtCustomTranslate : 'Operator'}}</div>\n <div class=\"value-cell\">{{'APP.VALUE' | nxtCustomTranslate : 'Value'}}</div>\n <div class=\"action-cell\">{{'APP.ACTION' | nxtCustomTranslate : 'Action'}}</div>\n </div>\n \n <div *ngFor=\"let filter of conditions.controls; let i = index\" [formGroupName]=\"i\" class=\"filter-row\">\n <div class=\"column-cell\">\n <div class=\"listview-custom-select\">\n <input formControlName=\"field\" [value]=\"getLabelByFieldName(conditions.at(i).get('field').value)\" (focus)=\"onFocus('field', i)\" (blur)=\"onBlur('field', i)\" [placeholder]=\"'APP.ENTER_OR_SELECT_COLUMN' | nxtCustomTranslate : 'Enter or select column'\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnDropdownOpen[i]\">\n <div *ngFor=\"let field of getFilteredColumns(conditions.at(i).get('field').value)\" class=\"dropdown-item\" (click)=\"selectOption('field', i, field.label)\">\n {{ field.label }}\n </div>\n </div>\n </div>\n <div *ngIf=\"filter.get('field')?.invalid && (filter.get('field')?.dirty || filter.get('field')?.touched)\" class=\"error-message\">\n {{'APP.COLUMN_IS_REQ' | nxtCustomTranslate : 'Column is required'}}.\n </div>\n </div>\n \n <div class=\"operator-cell\">\n <div class=\"listview-custom-select\">\n <input\n [value]=\"getOperatorLabel(conditions.at(i).get('operator').value)\"\n (input)=\"onOperatorInput($event.target.value, i)\"\n (focus)=\"onFocus('operator', i)\"\n (blur)=\"onBlur('operator', i)\"\n [placeholder]=\"'APP.ENTER_OR_SELECT_OPERATOR' | nxtCustomTranslate : 'Enter or select operator'\"\n />\n \n <div class=\"dropdown-list\" *ngIf=\"isOperatorDropdownOpen[i]\">\n <div\n *ngFor=\"let operator of getFilteredOperators(operatorInput[i])\"\n class=\"dropdown-item\"\n (click)=\"selectOption('operator', i, operator.value)\"\n >\n {{ operator.label }}\n </div>\n </div>\n </div> \n <div *ngIf=\"filter.get('operator')?.invalid && (filter.get('operator')?.dirty || filter.get('operator')?.touched)\" class=\"error-message\">\n {{'APP.OPERATOR_IS_REQ' | nxtCustomTranslate : 'Operator is required'}}.\n </div>\n </div>\n \n <div class=\"value-cell\">\n <div class=\"listview-custom-select\">\n <input formControlName=\"value\" (focus)=\"onFocus('value', i)\" (blur)=\"onBlur('value', i)\" [placeholder]=\"'APP.ENTER_OR_SELECT_VALUE' | nxtCustomTranslate : 'Enter or select value'\">\n <div class=\"dropdown-list\" *ngIf=\"isValueDropdownOpen[i] && getPossibleValues(conditions.at(i).get('field').value, conditions.at(i).get('value').value)?.length > 0\">\n <div *ngFor=\"let val of getPossibleValues(conditions.at(i).get('field').value, conditions.at(i).get('value').value)\" class=\"dropdown-item\" (click)=\"selectOption('value', i, val)\">\n {{ val }}\n </div>\n </div>\n </div>\n <div *ngIf=\"filter.get('value')?.invalid && (filter.get('value')?.dirty || filter.get('value')?.touched)\" class=\"error-message\">\n {{'APP.VALUE_IS_REQUIRED' | nxtCustomTranslate : 'Value is required'}}.\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" [matTooltip]=\"'APP.REMOVE' | nxtCustomTranslate : 'Remove'\">\n <div class=\"delete-icon\" (click)=\"removeFilter(i)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"add-row\">\n <div class=\"flex addIconBor cursor-pointer\" (click)=\"addFilter()\" [matTooltip]=\"'APP.ADD_FILTER' | nxtCustomTranslate : 'Add Filter'\">\n <div class=\"addIcon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n <span>{{'APP.ADD_FILTER' | nxtCustomTranslate : 'Add Filter'}}</span>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>{{'APP.COLUMNS' | nxtCustomTranslate : 'Columns'}}</h3>\n <span class=\"section-description\">{{'APP.SELECT_FIELD_TO_DISPLAY_IN_TABLE' | nxtCustomTranslate : 'Select field to display in table'}}</span>\n </div>\n <div formArrayName=\"columns\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"name-cell\">{{'APP.COLUMN_NAME' | nxtCustomTranslate : 'Column Name'}}</div>\n <div class=\"bool-cell\">{{'APP.SORTABLE' | nxtCustomTranslate : 'Sortable'}}</div>\n <div class=\"bool-cell\">{{'APP.FILTERABLE' | nxtCustomTranslate :'Filterable'}}</div>\n <div class=\"action-cell\">{{'APP.ACTION' | nxtCustomTranslate : 'Action'}}</div>\n </div>\n \n <div *ngFor=\"let field of columns.controls; let i = index\" [formGroupName]=\"i\" class=\"column-row\">\n <div class=\"name-cell\">\n <div class=\"listview-custom-select\">\n <input \n formControlName=\"name\" \n (focus)=\"onFocus('columnName', i)\" \n (blur)=\"onBlur('columnName', i)\" \n (input)=\"onManualInput($event.target.value, i)\"\n [placeholder]=\"'APP.ENTER_OR_SELECT_COLUMN_NAME' | nxtCustomTranslate : 'Enter or select column name'\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnNameDropdownOpen[i]\">\n <div *ngFor=\"let colName of getColumnColumns(columns.at(i).get('name').value)\" class=\"dropdown-item\" (click)=\"selectOption('columnName', i, colName.label); isColumnNameDropdownOpen[i] = false\">\n {{ colName.label }}\n </div>\n </div>\n </div>\n <div *ngIf=\"field.get('name')?.invalid && (field.get('name')?.dirty || field.get('name')?.touched)\" class=\"error-message\">\n {{'APP.COLUMN_NAME_IS_REQ' | nxtCustomTranslate : 'Column name is required'}}.\n </div>\n </div>\n \n <div class=\"bool-cell\">\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" [id]=\"'sortable-' + i\" formControlName=\"sortable\">\n <label [for]=\"'sortable-' + i\" class=\"toggle-button\"></label>\n </div>\n </div>\n \n <div class=\"bool-cell\">\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" [id]=\"'filterable-' + i\" formControlName=\"filterable\">\n <label [for]=\"'filterable-' + i\" class=\"toggle-button\"></label>\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" [matTooltip]=\"'APP.REMOVE' | nxtCustomTranslate : 'Remove'\">\n <div class=\"delete-icon\" (click)=\"removeColumn(i)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"add-row\">\n <div class=\"flex addIconBor cursor-pointer\" (click)=\"addColumn()\" [matTooltip]=\"'APP.ADD_COLUMN' | nxtCustomTranslate : 'Add Column'\">\n <div class=\"addIcon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n <span>{{'APP.ADD_COLUMN' | nxtCustomTranslate : 'Add Column'}}</span>\n </div>\n </div>\n <div *ngIf=\"conditions.length === 0 && columns.length === 0\" class=\"error-message\">\n {{'APP.AT_LEAST_ONE_FILTER_OR_ONE_COLUMN_IS_REQ' | nxtCustomTranslate : ' At least one filter or one column is required'}}.\n </div> \n <div class=\"form-actions\">\n <button type=\"button\" class=\"save-button\" (click)=\"save()\" [disabled]=\"!editingView.valid || (conditions.length === 0 && columns.length === 0)\">{{'APP.SAVE' | nxtCustomTranslate : 'Save'}}</button>\n <button type=\"button\" (click)=\"closeModal()\">{{'APP.CANCEL' | nxtCustomTranslate : 'Cancel'}}</button>\n </div>\n </form>\n </div>\n </div>\n <!-- SKS3MAY25 Delete List View-->\n <div *ngIf=\"isDeleteModalOpen\" class=\"modal\">\n <div class=\"modal-content\">\n <h2>{{'APP.DELETE_LIST_VIEW' | nxtCustomTranslate : 'Delete List View'}}</h2>\n <p>{{'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE' | nxtCustomTranslate : 'Are you sure you want to delete'}} \"{{ viewToDelete?.filterName }}\"?</p>\n <div class=\"form-delete\">\n <button type=\"button\" (click)=\"deleteConfirmed()\">{{'APP.DELETE' | nxtCustomTranslate : 'Delete'}}</button>\n <button type=\"button\" (click)=\"closeDeleteModal()\">{{'APP.CANCEL' | nxtCustomTranslate : 'Cancel'}}</button>\n </div>\n </div>\n </div>\n</div>", styles: [".list-view-filter{padding-left:10px;padding-right:10px}.filter-label{font-size:11px;color:#747577;margin-right:8px}.select-wrapper{display:flex;align-items:center;cursor:pointer}.custom-dropdown{position:relative;cursor:pointer;display:inline-block}.selected-option{padding:2px 5px;font-size:16px;font-weight:700;display:flex;gap:8px}.chevron-icon{cursor:pointer;background-color:#f5f5f5;border-radius:5px}.dropdown-options-container{position:absolute;top:100%;display:flex;flex-direction:column;border:1px solid #ccc;background:#fff;box-shadow:0 2px 8px #0000001a;z-index:1000;min-width:250px}.dropdown-options{background:#fff;list-style:none;padding:0;margin:0;white-space:nowrap;width:100%;max-height:300px;overflow-y:auto}.dropdown-options li{padding:8px;cursor:pointer}.dropdown-options li:hover{background-color:#f1f1f1}.dropdown-options li.selected{background-color:#f1f1f1;font-weight:600}.list-view-item{display:flex;justify-content:space-between;padding:8px;cursor:pointer;border-bottom:1px solid #f0f0f0}.list-view-item:hover{background-color:#f8f9fa}.edit-icon,.delete-icon{cursor:pointer;color:#666;transition:color .2s}.edit-icon:hover{color:#007bff}.delete-icon:hover{color:#dc3545}.add-filter{background-color:#fff;padding:10px;border-top:1px solid #dddddd;cursor:pointer;display:flex;align-items:center;gap:8px;width:100%}.add-filter:hover{background-color:#f8f9fa}.add-icon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.modal{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1001}.modal-content{background-color:#fff;border-radius:8px;padding:24px;width:700px;max-width:95%;max-height:90vh;overflow-y:auto;box-shadow:0 4px 20px #00000026}.modal-content h2{margin-top:0;margin-bottom:20px;font-size:20px;color:#333}.form-group{margin-bottom:16px}.form-group label{display:block;margin-bottom:8px;font-size:14px;font-weight:500}.form-group input{width:100%;padding:8px 12px;border:1px solid #ddd;border-radius:4px;font-size:14px}.toggle-wrapper{position:relative;display:inline-block}.toggle-wrapper input[type=checkbox]{opacity:0;width:0;height:0}.toggle-button{position:relative;display:inline-block;width:50px;height:24px;background-color:#ccc;border-radius:24px;transition:.3s;cursor:pointer}.toggle-button:before{position:absolute;content:\"\";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;border-radius:50%;transition:.3s}input[type=checkbox]:checked+.toggle-button{background-color:#007bff}input[type=checkbox]:checked+.toggle-button:before{transform:translate(20px)}.toggle-wrapper.small .toggle-button{width:40px;height:20px}.toggle-wrapper.small .toggle-button:before{height:16px;width:16px}input[type=checkbox]:checked+.toggle-button.small:before{transform:translate(20px)}.section-header{padding-bottom:8px}.section-header h3{margin:0 0 4px;font-size:16px;color:#333}.section-description{font-size:12px;color:#777}.table-container{border:1px solid #e0e0e0;border-radius:4px}.table-header{display:grid;background-color:#f8f9fa;font-weight:600;font-size:12px;padding:8px 12px;border-bottom:1px solid #e0e0e0}.filter-row,.column-row{display:grid;padding:8px 12px;border-bottom:1px solid #f0f0f0;align-items:center}.filter-row,.column-row,.table-header{grid-template-columns:1fr 1fr 1fr auto;gap:10px}.table-header.column-header{grid-template-columns:1fr 1fr 1fr auto}.column-cell,.operator-cell,.value-cell,.name-cell,.bool-cell,.action-cell{padding:5px}.action-cell{display:flex;justify-content:center}.listview-custom-select{position:relative;width:100%}.listview-custom-select input{border:none;font-size:12px}.dropdown-list{position:absolute;top:100%;left:0;width:100%;max-height:200px;overflow-y:auto;background:#fff;border:1px solid #ddd;border-top:none;border-radius:0 0 4px 4px;z-index:10;box-shadow:0 4px 8px #0000001a}.dropdown-item{padding:8px 12px;cursor:pointer}.dropdown-item:hover{background-color:#f5f5f5}.add-row{display:flex;align-items:center;gap:8px;padding:10px;cursor:pointer}.add-row:hover{background-color:#f8f9fa}.addIconBor{padding:4px;border-radius:5px;border:1px solid #6c757d;transition:background-color .3s,border-color .3s}.addIconBor:hover .addIcon{background-color:#bbd3ff}.addIcon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.dicon-container{padding:2px;border:1px solid #ffb5b5;border-radius:5px;margin-left:3px;margin-right:3px;display:flex;width:38px}.delete-icon{padding:2px 4px;border-radius:5px;background-color:#feeeed;align-content:center;width:32px;display:flex;justify-content:center;align-items:center}.dicon-container:hover .delete-icon svg path{stroke:#fff!important;fill:transparent!important}.dicon-container:hover .delete-icon{background-color:#ff7575!important;cursor:pointer}.dicon-container:hover{border:1px solid #ff2121!important}.form-actions{display:flex;justify-content:flex-end;gap:12px;margin-top:20px}.form-delete{display:flex;justify-content:flex-end;gap:12px}.form-actions button,.form-delete button{padding:8px 16px;border-radius:4px;font-size:14px;cursor:pointer;transition:background-color .2s}.form-actions button:first-child{background-color:#007bff;color:#fff;border:1px solid #007bff}.form-actions button:nth-child(2){background-color:#f8f9fa;border:1px solid #ddd;color:#333}.form-delete button:first-child{background-color:#dc3545;color:#fff;border:1px solid #dc3545}.form-delete button:nth-child(2){background-color:#f8f9fa;border:1px solid #ddd;color:#333}.form-actions button:hover,.form-delete button:hover{opacity:.9}.cursor-pointer{cursor:pointer}.flex{display:flex}.form-row{display:flex;gap:16px;align-items:flex-start}.form-group{min-width:0;margin-bottom:0!important}.error-message{color:#dc3545;font-size:12px;margin-top:4px}.listview-custom-select input[readonly]{cursor:pointer;background-color:#fff}.error-message{color:#ff2c10;font-size:.875rem;margin-bottom:.5rem}.save-button:disabled{background-color:#ccc!important;color:#666!important;cursor:not-allowed!important}.modal-header-div{display:flex;justify-content:space-between;font-size:18px;padding-bottom:10px}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.list-view-item{position:relative}.actions{display:none;position:absolute;right:8px;top:50%;transform:translateY(-50%)}.list-view-item:hover .actions{display:flex;gap:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
381
372
|
}
|
|
382
373
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListViewFilterComponent, decorators: [{
|
|
383
374
|
type: Component,
|
|
384
|
-
args: [{ selector: 'app-list-view-filter', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule, NxtCustomTranslatePipe, MatTooltipModule], providers: [NxtCustomTranslatePipe], template: "<div class=\"list-view-filter\">\n <div class=\"custom-dropdown\">\n <div class=\"filter-label\">{{'APP.DATA_RELATED_TO' | nxtCustomTranslate : 'Data Related to'}}</div>\n <div class=\"select-wrapper\">\n <svg class=\"filter-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"24\" height=\"24\" rx=\"5\" fill=\"#F1F1F1\" />\n <path d=\"M5.51288 4.5H12.1879C12.7429 4.5 13.2004 4.9575 13.2004 5.5125V6.62249C13.2004 7.02749 12.9454 7.53 12.6979 7.785L10.5229 9.705C10.2229 9.96 10.0204 10.4625 10.0204 10.8675V13.0425C10.0204 13.3425 9.8179 13.7475 9.5629 13.905L8.85789 14.3625C8.19789 14.7675 7.29037 14.31 7.29037 13.5V10.8225C7.29037 10.47 7.08789 10.0125 6.88539 9.75751L4.96539 7.7325C4.71039 7.4775 4.5079 7.02749 4.5079 6.71999V5.5575C4.5004 4.9575 4.95788 4.5 5.51288 4.5Z\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.5 11.9999V14.2499C4.5 17.9999 6 19.4999 9.75 19.4999H14.25C18 19.4999 19.5 17.9999 19.5 14.2499V9.74994C19.5 7.40994 18.915 5.93993 17.5575 5.17493C17.175 4.95743 16.41 4.79243 15.7125 4.67993\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.75 12.75H16.5\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M11.25 15.75H16.5\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <div class=\"custom-dropdown\">\n <div class=\"selected-option\" (click)=\"toggleDropdown()\">\n <div>\n {{ selectedView ? (selectedViewPath || selectedView | nxtCustomTranslate : selectedView) : ('APP.SELECT_A_VIEW' | nxtCustomTranslate : 'Select a view') }}\n </div>\n <svg class=\"chevron-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\" fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n <!-- SKS3MAY25 list view Drop down-->\n <div *ngIf=\"isDropdownOpen\" class=\"dropdown-options-container\">\n <ul class=\"dropdown-options\">\n <li *ngFor=\"let view of listViews\" [class.selected]=\"selectedView === view.filterName\" (mouseenter)=\"showActions(view)\" (mouseleave)=\"hideActions()\" (click)=\"selectListView(view)\" class=\"list-view-item\">\n <span class=\"view-name\">{{ view.labelPath || view.filterName | nxtCustomTranslate : view.filterName }}</span>\n <div *ngIf=\"view.showActions\">\n <div class=\"actions\">\n <div class=\"edit-icon\" (click)=\"startEdit(view, $event)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.32923 3.98726L12.0126 6.67059M9.32923 3.98726L2.50008 10.8164V13.4997H5.18342L12.0126 6.67059M9.32923 3.98726L12.0126 1.30392L14.6959 3.98726L12.0126 6.67059\" stroke=\"#000000\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"delete-icon\" (click)=\"confirmDelete(view, $event)\" *ngIf=\"listViews.length > 1\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </li>\n </ul>\n <div class=\"add-filter\" (click)=\"startAdd()\">\n <div class=\"add-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span>{{'APP.NEW_LIST_VIEW' | nxtCustomTranslate : 'New List View'}}</span>\n </div>\n </div>\n </div>\n <!-- SKS3MAY25 Add New List View-->\n <div *ngIf=\"isModalOpen\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"modal-header-div\">\n {{ (isAdding ? 'APP.ADD_NEW_LIST_VIEW' : 'APP.EDIT_LIST_VIEW') | nxtCustomTranslate : (isAdding ? 'Add New List View' : 'Edit List View') }} \n <span class=\"close\" (click)=\"closeModal()\">×</span>\n </div>\n <form [formGroup]=\"editingView\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>{{'APP.NAME' | nxtCustomTranslate :'Name'}}:</label>\n <input formControlName=\"filterName\" [placeholder]=\"'APP.ENTER_LIST_VIEW_NAME' | nxtCustomTranslate : 'Enter list view name'\" required>\n <div *ngIf=\"editingView.get('filterName')?.invalid && (editingView.get('filterName')?.dirty || editingView.get('filterName')?.touched)\" class=\"error-message\">\n {{ 'APP.NAME_IS_REQ' | nxtCustomTranslate : 'Name is required'}}.\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{'APP.ORDER' | nxtCustomTranslate : 'Order'}}:</label>\n <input type=\"number\" formControlName=\"order\" [placeholder]=\" 'APP.ENTER_DISPLAY_ORDER' | nxtCustomTranslate : 'Enter display order'\" required>\n <div *ngIf=\"editingView.get('order')?.invalid && (editingView.get('order')?.dirty || editingView.get('order')?.touched)\" class=\"error-message\">\n {{'APP.ORDER_IS_REQ_AND_BE_A_NUM' | nxtCustomTranslate : 'Order is required and must be a number'}}.\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{'APP.DEFAULT_VIEW' | nxtCustomTranslate : 'Default View'}}:</label>\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" formControlName=\"isDefault\" id=\"isDefault\">\n <label for=\"isDefault\" class=\"toggle-button\"></label>\n </div>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>{{'APP.FILTERS' | nxtCustomTranslate : 'Filters'}}</h3>\n <span class=\"section-description\">{{'APP.DEFINE_CONDITIONS_FOR_FILTERED_LIST_VIEW' | nxtCustomTranslate : 'Define conditions for filtered list view'}}</span>\n </div>\n <div formArrayName=\"conditions\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"column-cell\">{{'APP.COLUMN' | nxtCustomTranslate : 'Column'}}</div>\n <div class=\"operator-cell\">{{'APP.OPERATOR' | nxtCustomTranslate : 'Operator'}}</div>\n <div class=\"value-cell\">{{'APP.VALUE' | nxtCustomTranslate : 'Value'}}</div>\n <div class=\"action-cell\">{{'APP.ACTION' | nxtCustomTranslate : 'Action'}}</div>\n </div>\n \n <div *ngFor=\"let filter of conditions.controls; let i = index\" [formGroupName]=\"i\" class=\"filter-row\">\n <div class=\"column-cell\">\n <div class=\"listview-custom-select\">\n <input formControlName=\"field\" [value]=\"getLabelByFieldName(conditions.at(i).get('field').value)\" (focus)=\"onFocus('field', i)\" (blur)=\"onBlur('field', i)\" [placeholder]=\"'APP.ENTER_OR_SELECT_COLUMN' | nxtCustomTranslate : 'Enter or select column'\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnDropdownOpen[i]\">\n <div *ngFor=\"let field of getFilteredColumns(conditions.at(i).get('field').value)\" class=\"dropdown-item\" (click)=\"selectOption('field', i, field.label)\">\n {{ field.label }}\n </div>\n </div>\n </div>\n <div *ngIf=\"filter.get('field')?.invalid && (filter.get('field')?.dirty || filter.get('field')?.touched)\" class=\"error-message\">\n {{'APP.COLUMN_IS_REQ' | nxtCustomTranslate : 'Column is required'}}.\n </div>\n </div>\n \n <div class=\"operator-cell\">\n <div class=\"listview-custom-select\">\n <input\n [value]=\"getOperatorLabel(conditions.at(i).get('operator').value)\"\n (input)=\"onOperatorInput($event.target.value, i)\"\n (focus)=\"onFocus('operator', i)\"\n (blur)=\"onBlur('operator', i)\"\n [placeholder]=\"'APP.ENTER_OR_SELECT_OPERATOR' | nxtCustomTranslate : 'Enter or select operator'\"\n />\n \n <div class=\"dropdown-list\" *ngIf=\"isOperatorDropdownOpen[i]\">\n <div\n *ngFor=\"let operator of getFilteredOperators(operatorInput[i])\"\n class=\"dropdown-item\"\n (click)=\"selectOption('operator', i, operator.value)\"\n >\n {{ operator.label }}\n </div>\n </div>\n </div> \n <div *ngIf=\"filter.get('operator')?.invalid && (filter.get('operator')?.dirty || filter.get('operator')?.touched)\" class=\"error-message\">\n {{'APP.OPERATOR_IS_REQ' | nxtCustomTranslate : 'Operator is required'}}.\n </div>\n </div>\n \n <div class=\"value-cell\">\n <div class=\"listview-custom-select\">\n <input formControlName=\"value\" (focus)=\"onFocus('value', i)\" (blur)=\"onBlur('value', i)\" [placeholder]=\"'APP.ENTER_OR_SELECT_VALUE' | nxtCustomTranslate : 'Enter or select value'\">\n <div class=\"dropdown-list\" *ngIf=\"isValueDropdownOpen[i] && getPossibleValues(conditions.at(i).get('field').value, conditions.at(i).get('value').value)?.length > 0\">\n <div *ngFor=\"let val of getPossibleValues(conditions.at(i).get('field').value, conditions.at(i).get('value').value)\" class=\"dropdown-item\" (click)=\"selectOption('value', i, val)\">\n {{ val }}\n </div>\n </div>\n </div>\n <div *ngIf=\"filter.get('value')?.invalid && (filter.get('value')?.dirty || filter.get('value')?.touched)\" class=\"error-message\">\n {{'APP.VALUE_IS_REQUIRED' | nxtCustomTranslate : 'Value is required'}}.\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" [matTooltip]=\"'APP.REMOVE' | nxtCustomTranslate : 'Remove'\">\n <div class=\"delete-icon\" (click)=\"removeFilter(i)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"add-row\">\n <div class=\"flex addIconBor cursor-pointer\" (click)=\"addFilter()\" [matTooltip]=\"'APP.ADD_FILTER' | nxtCustomTranslate : 'Add Filter'\">\n <div class=\"addIcon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n <span>{{'APP.ADD_FILTER' | nxtCustomTranslate : 'Add Filter'}}</span>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>{{'APP.COLUMNS' | nxtCustomTranslate : 'Columns'}}</h3>\n <span class=\"section-description\">{{'APP.SELECT_FIELD_TO_DISPLAY_IN_TABLE' | nxtCustomTranslate : 'Select field to display in table'}}</span>\n </div>\n <div formArrayName=\"columns\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"name-cell\">{{'APP.COLUMN_NAME' | nxtCustomTranslate : 'Column Name'}}</div>\n <div class=\"bool-cell\">{{'APP.SORTABLE' | nxtCustomTranslate : 'Sortable'}}</div>\n <div class=\"bool-cell\">{{'APP.FILTERABLE' | nxtCustomTranslate :'Filterable'}}</div>\n <div class=\"action-cell\">{{'APP.ACTION' | nxtCustomTranslate : 'Action'}}</div>\n </div>\n \n <div *ngFor=\"let field of columns.controls; let i = index\" [formGroupName]=\"i\" class=\"column-row\">\n <div class=\"name-cell\">\n <div class=\"listview-custom-select\">\n <input \n formControlName=\"name\" \n (focus)=\"onFocus('columnName', i)\" \n (blur)=\"onBlur('columnName', i)\" \n (input)=\"onManualInput($event.target.value, i)\"\n [placeholder]=\"'APP.ENTER_OR_SELECT_COLUMN_NAME' | nxtCustomTranslate : 'Enter or select column name'\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnNameDropdownOpen[i]\">\n <div *ngFor=\"let colName of getColumnColumns(columns.at(i).get('name').value)\" class=\"dropdown-item\" (click)=\"selectOption('columnName', i, colName.label); isColumnNameDropdownOpen[i] = false\">\n {{ colName.label }}\n </div>\n </div>\n </div>\n <div *ngIf=\"field.get('name')?.invalid && (field.get('name')?.dirty || field.get('name')?.touched)\" class=\"error-message\">\n {{'APP.COLUMN_NAME_IS_REQ' | nxtCustomTranslate : 'Column name is required'}}.\n </div>\n </div>\n \n <div class=\"bool-cell\">\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" [id]=\"'sortable-' + i\" formControlName=\"sortable\">\n <label [for]=\"'sortable-' + i\" class=\"toggle-button\"></label>\n </div>\n </div>\n \n <div class=\"bool-cell\">\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" [id]=\"'filterable-' + i\" formControlName=\"filterable\">\n <label [for]=\"'filterable-' + i\" class=\"toggle-button\"></label>\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" [matTooltip]=\"'APP.REMOVE' | nxtCustomTranslate : 'Remove'\">\n <div class=\"delete-icon\" (click)=\"removeColumn(i)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"add-row\">\n <div class=\"flex addIconBor cursor-pointer\" (click)=\"addColumn()\" [matTooltip]=\"'APP.ADD_COLUMN' | nxtCustomTranslate : 'Add Column'\">\n <div class=\"addIcon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n <span>{{'APP.ADD_COLUMN' | nxtCustomTranslate : 'Add Column'}}</span>\n </div>\n </div>\n <div *ngIf=\"conditions.length === 0 && columns.length === 0\" class=\"error-message\">\n {{'APP.AT_LEAST_ONE_FILTER_OR_ONE_COLUMN_IS_REQ' | nxtCustomTranslate : ' At least one filter or one column is required'}}.\n </div> \n <div class=\"form-actions\">\n <button type=\"button\" class=\"save-button\" (click)=\"save()\" [disabled]=\"!editingView.valid || (conditions.length === 0 && columns.length === 0)\">{{'APP.SAVE' | nxtCustomTranslate : 'Save'}}</button>\n <button type=\"button\" (click)=\"closeModal()\">{{'APP.CANCEL' | nxtCustomTranslate : 'Cancel'}}</button>\n </div>\n </form>\n </div>\n </div>\n <!-- SKS3MAY25 Delete List View-->\n <div *ngIf=\"isDeleteModalOpen\" class=\"modal\">\n <div class=\"modal-content\">\n <h2>{{'APP.DELETE_LIST_VIEW' | nxtCustomTranslate : 'Delete List View'}}</h2>\n <p>{{'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE' | nxtCustomTranslate : 'Are you sure you want to delete'}} \"{{ viewToDelete?.filterName }}\"?</p>\n <div class=\"form-delete\">\n <button type=\"button\" (click)=\"deleteConfirmed()\">{{'APP.DELETE' | nxtCustomTranslate : 'Delete'}}</button>\n <button type=\"button\" (click)=\"closeDeleteModal()\">{{'APP.CANCEL' | nxtCustomTranslate : 'Cancel'}}</button>\n </div>\n </div>\n </div>\n</div>", styles: [".list-view-filter{padding-left:10px;padding-right:10px}.filter-label{font-size:11px;color:#747577;margin-right:8px}.select-wrapper{display:flex;align-items:center;cursor:pointer}.custom-dropdown{position:relative;cursor:pointer;display:inline-block}.selected-option{padding:2px 5px;font-size:16px;font-weight:700;display:flex;gap:8px}.chevron-icon{cursor:pointer;background-color:#f5f5f5;border-radius:5px}.dropdown-options-container{position:absolute;top:100%;display:flex;flex-direction:column;border:1px solid #ccc;background:#fff;box-shadow:0 2px 8px #0000001a;z-index:1000;min-width:250px}.dropdown-options{background:#fff;list-style:none;padding:0;margin:0;white-space:nowrap;width:100%;max-height:300px;overflow-y:auto}.dropdown-options li{padding:8px;cursor:pointer}.dropdown-options li:hover{background-color:#f1f1f1}.dropdown-options li.selected{background-color:#f1f1f1;font-weight:600}.list-view-item{display:flex;justify-content:space-between;padding:8px;cursor:pointer;border-bottom:1px solid #f0f0f0}.list-view-item:hover{background-color:#f8f9fa}.actions{display:flex;gap:10px}.edit-icon,.delete-icon{cursor:pointer;color:#666;transition:color .2s}.edit-icon:hover{color:#007bff}.delete-icon:hover{color:#dc3545}.add-filter{background-color:#fff;padding:10px;border-top:1px solid #dddddd;cursor:pointer;display:flex;align-items:center;gap:8px;width:100%}.add-filter:hover{background-color:#f8f9fa}.add-icon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.modal{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1001}.modal-content{background-color:#fff;border-radius:8px;padding:24px;width:700px;max-width:95%;max-height:90vh;overflow-y:auto;box-shadow:0 4px 20px #00000026}.modal-content h2{margin-top:0;margin-bottom:20px;font-size:20px;color:#333}.form-group{margin-bottom:16px}.form-group label{display:block;margin-bottom:8px;font-size:14px;font-weight:500}.form-group input{width:100%;padding:8px 12px;border:1px solid #ddd;border-radius:4px;font-size:14px}.toggle-wrapper{position:relative;display:inline-block}.toggle-wrapper input[type=checkbox]{opacity:0;width:0;height:0}.toggle-button{position:relative;display:inline-block;width:50px;height:24px;background-color:#ccc;border-radius:24px;transition:.3s;cursor:pointer}.toggle-button:before{position:absolute;content:\"\";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;border-radius:50%;transition:.3s}input[type=checkbox]:checked+.toggle-button{background-color:#007bff}input[type=checkbox]:checked+.toggle-button:before{transform:translate(20px)}.toggle-wrapper.small .toggle-button{width:40px;height:20px}.toggle-wrapper.small .toggle-button:before{height:16px;width:16px}input[type=checkbox]:checked+.toggle-button.small:before{transform:translate(20px)}.section-header{padding-bottom:8px}.section-header h3{margin:0 0 4px;font-size:16px;color:#333}.section-description{font-size:12px;color:#777}.table-container{border:1px solid #e0e0e0;border-radius:4px}.table-header{display:grid;background-color:#f8f9fa;font-weight:600;font-size:12px;padding:8px 12px;border-bottom:1px solid #e0e0e0}.filter-row,.column-row{display:grid;padding:8px 12px;border-bottom:1px solid #f0f0f0;align-items:center}.filter-row,.column-row,.table-header{grid-template-columns:1fr 1fr 1fr auto;gap:10px}.table-header.column-header{grid-template-columns:1fr 1fr 1fr auto}.column-cell,.operator-cell,.value-cell,.name-cell,.bool-cell,.action-cell{padding:5px}.action-cell{display:flex;justify-content:center}.listview-custom-select{position:relative;width:100%}.listview-custom-select input{border:none;font-size:12px}.dropdown-list{position:absolute;top:100%;left:0;width:100%;max-height:200px;overflow-y:auto;background:#fff;border:1px solid #ddd;border-top:none;border-radius:0 0 4px 4px;z-index:10;box-shadow:0 4px 8px #0000001a}.dropdown-item{padding:8px 12px;cursor:pointer}.dropdown-item:hover{background-color:#f5f5f5}.add-row{display:flex;align-items:center;gap:8px;padding:10px;cursor:pointer}.add-row:hover{background-color:#f8f9fa}.addIconBor{padding:4px;border-radius:5px;border:1px solid #6c757d;transition:background-color .3s,border-color .3s}.addIconBor:hover .addIcon{background-color:#bbd3ff}.addIcon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.dicon-container{padding:2px;border:1px solid #ffb5b5;border-radius:5px;margin-left:3px;margin-right:3px;display:flex;width:38px}.delete-icon{padding:2px 4px;border-radius:5px;background-color:#feeeed;align-content:center;width:32px;display:flex;justify-content:center;align-items:center}.dicon-container:hover .delete-icon svg path{stroke:#fff!important;fill:transparent!important}.dicon-container:hover .delete-icon{background-color:#ff7575!important;cursor:pointer}.dicon-container:hover{border:1px solid #ff2121!important}.form-actions{display:flex;justify-content:flex-end;gap:12px;margin-top:20px}.form-delete{display:flex;justify-content:flex-end;gap:12px}.form-actions button,.form-delete button{padding:8px 16px;border-radius:4px;font-size:14px;cursor:pointer;transition:background-color .2s}.form-actions button:first-child{background-color:#007bff;color:#fff;border:1px solid #007bff}.form-actions button:nth-child(2){background-color:#f8f9fa;border:1px solid #ddd;color:#333}.form-delete button:first-child{background-color:#dc3545;color:#fff;border:1px solid #dc3545}.form-delete button:nth-child(2){background-color:#f8f9fa;border:1px solid #ddd;color:#333}.form-actions button:hover,.form-delete button:hover{opacity:.9}.cursor-pointer{cursor:pointer}.flex{display:flex}.form-row{display:flex;gap:16px;align-items:flex-start}.form-group{min-width:0;margin-bottom:0!important}.error-message{color:#dc3545;font-size:12px;margin-top:4px}.listview-custom-select input[readonly]{cursor:pointer;background-color:#fff}.error-message{color:#ff2c10;font-size:.875rem;margin-bottom:.5rem}.save-button:disabled{background-color:#ccc!important;color:#666!important;cursor:not-allowed!important}.modal-header-div{display:flex;justify-content:space-between;font-size:18px;padding-bottom:10px}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}\n"] }]
|
|
375
|
+
args: [{ selector: 'app-list-view-filter', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule, NxtCustomTranslatePipe, MatTooltipModule], providers: [NxtCustomTranslatePipe], template: "<div class=\"list-view-filter\">\n <div class=\"custom-dropdown\">\n <div class=\"filter-label\">{{'APP.DATA_RELATED_TO' | nxtCustomTranslate : 'Data Related to'}}</div>\n <div class=\"select-wrapper\">\n <svg class=\"filter-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"24\" height=\"24\" rx=\"5\" fill=\"#F1F1F1\" />\n <path d=\"M5.51288 4.5H12.1879C12.7429 4.5 13.2004 4.9575 13.2004 5.5125V6.62249C13.2004 7.02749 12.9454 7.53 12.6979 7.785L10.5229 9.705C10.2229 9.96 10.0204 10.4625 10.0204 10.8675V13.0425C10.0204 13.3425 9.8179 13.7475 9.5629 13.905L8.85789 14.3625C8.19789 14.7675 7.29037 14.31 7.29037 13.5V10.8225C7.29037 10.47 7.08789 10.0125 6.88539 9.75751L4.96539 7.7325C4.71039 7.4775 4.5079 7.02749 4.5079 6.71999V5.5575C4.5004 4.9575 4.95788 4.5 5.51288 4.5Z\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M4.5 11.9999V14.2499C4.5 17.9999 6 19.4999 9.75 19.4999H14.25C18 19.4999 19.5 17.9999 19.5 14.2499V9.74994C19.5 7.40994 18.915 5.93993 17.5575 5.17493C17.175 4.95743 16.41 4.79243 15.7125 4.67993\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.75 12.75H16.5\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M11.25 15.75H16.5\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <div class=\"custom-dropdown\">\n <div class=\"selected-option\" (click)=\"toggleDropdown()\">\n <div>\n {{ selectedView ? (selectedViewPath || selectedView | nxtCustomTranslate : selectedView) : ('APP.SELECT_A_VIEW' | nxtCustomTranslate : 'Select a view') }}\n </div>\n <svg class=\"chevron-icon\" width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\" fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\" stroke-miterlimit=\"10\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n <!-- SKS3MAY25 list view Drop down-->\n <div *ngIf=\"isDropdownOpen\" class=\"dropdown-options-container\">\n <ul class=\"dropdown-options\">\n <li *ngFor=\"let view of listViews\" [class.selected]=\"selectedView === view.filterName\" (click)=\"selectListView(view)\" class=\"list-view-item\">\n <span class=\"view-name\">{{ view.labelPath || view.filterName | nxtCustomTranslate : view.filterName }}</span>\n <div class=\"actions\">\n <div class=\"edit-icon\" (click)=\"startEdit(view, $event)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.32923 3.98726L12.0126 6.67059M9.32923 3.98726L2.50008 10.8164V13.4997H5.18342L12.0126 6.67059M9.32923 3.98726L12.0126 1.30392L14.6959 3.98726L12.0126 6.67059\" stroke=\"#000000\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"delete-icon\" (click)=\"confirmDelete(view, $event)\" *ngIf=\"listViews.length > 1\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#000000\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </li>\n </ul>\n <div class=\"add-filter\" (click)=\"startAdd()\">\n <div class=\"add-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span>{{'APP.NEW_LIST_VIEW' | nxtCustomTranslate : 'New List View'}}</span>\n </div>\n </div>\n </div>\n <!-- SKS3MAY25 Add New List View-->\n <div *ngIf=\"isModalOpen\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"modal-header-div\">\n {{ (isAdding ? 'APP.ADD_NEW_LIST_VIEW' : 'APP.EDIT_LIST_VIEW') | nxtCustomTranslate : (isAdding ? 'Add New List View' : 'Edit List View') }} \n <span class=\"close\" (click)=\"closeModal()\">×</span>\n </div>\n <form [formGroup]=\"editingView\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>{{'APP.NAME' | nxtCustomTranslate :'Name'}}:</label>\n <input formControlName=\"filterName\" [placeholder]=\"'APP.ENTER_LIST_VIEW_NAME' | nxtCustomTranslate : 'Enter list view name'\" required>\n <div *ngIf=\"editingView.get('filterName')?.invalid && (editingView.get('filterName')?.dirty || editingView.get('filterName')?.touched)\" class=\"error-message\">\n {{ 'APP.NAME_IS_REQ' | nxtCustomTranslate : 'Name is required'}}.\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{'APP.ORDER' | nxtCustomTranslate : 'Order'}}:</label>\n <input type=\"number\" formControlName=\"order\" [placeholder]=\" 'APP.ENTER_DISPLAY_ORDER' | nxtCustomTranslate : 'Enter display order'\" required>\n <div *ngIf=\"editingView.get('order')?.invalid && (editingView.get('order')?.dirty || editingView.get('order')?.touched)\" class=\"error-message\">\n {{'APP.ORDER_IS_REQ_AND_BE_A_NUM' | nxtCustomTranslate : 'Order is required and must be a number'}}.\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{'APP.DEFAULT_VIEW' | nxtCustomTranslate : 'Default View'}}:</label>\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" formControlName=\"isDefault\" id=\"isDefault\">\n <label for=\"isDefault\" class=\"toggle-button\"></label>\n </div>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>{{'APP.FILTERS' | nxtCustomTranslate : 'Filters'}}</h3>\n <span class=\"section-description\">{{'APP.DEFINE_CONDITIONS_FOR_FILTERED_LIST_VIEW' | nxtCustomTranslate : 'Define conditions for filtered list view'}}</span>\n </div>\n <div formArrayName=\"conditions\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"column-cell\">{{'APP.COLUMN' | nxtCustomTranslate : 'Column'}}</div>\n <div class=\"operator-cell\">{{'APP.OPERATOR' | nxtCustomTranslate : 'Operator'}}</div>\n <div class=\"value-cell\">{{'APP.VALUE' | nxtCustomTranslate : 'Value'}}</div>\n <div class=\"action-cell\">{{'APP.ACTION' | nxtCustomTranslate : 'Action'}}</div>\n </div>\n \n <div *ngFor=\"let filter of conditions.controls; let i = index\" [formGroupName]=\"i\" class=\"filter-row\">\n <div class=\"column-cell\">\n <div class=\"listview-custom-select\">\n <input formControlName=\"field\" [value]=\"getLabelByFieldName(conditions.at(i).get('field').value)\" (focus)=\"onFocus('field', i)\" (blur)=\"onBlur('field', i)\" [placeholder]=\"'APP.ENTER_OR_SELECT_COLUMN' | nxtCustomTranslate : 'Enter or select column'\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnDropdownOpen[i]\">\n <div *ngFor=\"let field of getFilteredColumns(conditions.at(i).get('field').value)\" class=\"dropdown-item\" (click)=\"selectOption('field', i, field.label)\">\n {{ field.label }}\n </div>\n </div>\n </div>\n <div *ngIf=\"filter.get('field')?.invalid && (filter.get('field')?.dirty || filter.get('field')?.touched)\" class=\"error-message\">\n {{'APP.COLUMN_IS_REQ' | nxtCustomTranslate : 'Column is required'}}.\n </div>\n </div>\n \n <div class=\"operator-cell\">\n <div class=\"listview-custom-select\">\n <input\n [value]=\"getOperatorLabel(conditions.at(i).get('operator').value)\"\n (input)=\"onOperatorInput($event.target.value, i)\"\n (focus)=\"onFocus('operator', i)\"\n (blur)=\"onBlur('operator', i)\"\n [placeholder]=\"'APP.ENTER_OR_SELECT_OPERATOR' | nxtCustomTranslate : 'Enter or select operator'\"\n />\n \n <div class=\"dropdown-list\" *ngIf=\"isOperatorDropdownOpen[i]\">\n <div\n *ngFor=\"let operator of getFilteredOperators(operatorInput[i])\"\n class=\"dropdown-item\"\n (click)=\"selectOption('operator', i, operator.value)\"\n >\n {{ operator.label }}\n </div>\n </div>\n </div> \n <div *ngIf=\"filter.get('operator')?.invalid && (filter.get('operator')?.dirty || filter.get('operator')?.touched)\" class=\"error-message\">\n {{'APP.OPERATOR_IS_REQ' | nxtCustomTranslate : 'Operator is required'}}.\n </div>\n </div>\n \n <div class=\"value-cell\">\n <div class=\"listview-custom-select\">\n <input formControlName=\"value\" (focus)=\"onFocus('value', i)\" (blur)=\"onBlur('value', i)\" [placeholder]=\"'APP.ENTER_OR_SELECT_VALUE' | nxtCustomTranslate : 'Enter or select value'\">\n <div class=\"dropdown-list\" *ngIf=\"isValueDropdownOpen[i] && getPossibleValues(conditions.at(i).get('field').value, conditions.at(i).get('value').value)?.length > 0\">\n <div *ngFor=\"let val of getPossibleValues(conditions.at(i).get('field').value, conditions.at(i).get('value').value)\" class=\"dropdown-item\" (click)=\"selectOption('value', i, val)\">\n {{ val }}\n </div>\n </div>\n </div>\n <div *ngIf=\"filter.get('value')?.invalid && (filter.get('value')?.dirty || filter.get('value')?.touched)\" class=\"error-message\">\n {{'APP.VALUE_IS_REQUIRED' | nxtCustomTranslate : 'Value is required'}}.\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" [matTooltip]=\"'APP.REMOVE' | nxtCustomTranslate : 'Remove'\">\n <div class=\"delete-icon\" (click)=\"removeFilter(i)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"add-row\">\n <div class=\"flex addIconBor cursor-pointer\" (click)=\"addFilter()\" [matTooltip]=\"'APP.ADD_FILTER' | nxtCustomTranslate : 'Add Filter'\">\n <div class=\"addIcon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n <span>{{'APP.ADD_FILTER' | nxtCustomTranslate : 'Add Filter'}}</span>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>{{'APP.COLUMNS' | nxtCustomTranslate : 'Columns'}}</h3>\n <span class=\"section-description\">{{'APP.SELECT_FIELD_TO_DISPLAY_IN_TABLE' | nxtCustomTranslate : 'Select field to display in table'}}</span>\n </div>\n <div formArrayName=\"columns\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"name-cell\">{{'APP.COLUMN_NAME' | nxtCustomTranslate : 'Column Name'}}</div>\n <div class=\"bool-cell\">{{'APP.SORTABLE' | nxtCustomTranslate : 'Sortable'}}</div>\n <div class=\"bool-cell\">{{'APP.FILTERABLE' | nxtCustomTranslate :'Filterable'}}</div>\n <div class=\"action-cell\">{{'APP.ACTION' | nxtCustomTranslate : 'Action'}}</div>\n </div>\n \n <div *ngFor=\"let field of columns.controls; let i = index\" [formGroupName]=\"i\" class=\"column-row\">\n <div class=\"name-cell\">\n <div class=\"listview-custom-select\">\n <input \n formControlName=\"name\" \n (focus)=\"onFocus('columnName', i)\" \n (blur)=\"onBlur('columnName', i)\" \n (input)=\"onManualInput($event.target.value, i)\"\n [placeholder]=\"'APP.ENTER_OR_SELECT_COLUMN_NAME' | nxtCustomTranslate : 'Enter or select column name'\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnNameDropdownOpen[i]\">\n <div *ngFor=\"let colName of getColumnColumns(columns.at(i).get('name').value)\" class=\"dropdown-item\" (click)=\"selectOption('columnName', i, colName.label); isColumnNameDropdownOpen[i] = false\">\n {{ colName.label }}\n </div>\n </div>\n </div>\n <div *ngIf=\"field.get('name')?.invalid && (field.get('name')?.dirty || field.get('name')?.touched)\" class=\"error-message\">\n {{'APP.COLUMN_NAME_IS_REQ' | nxtCustomTranslate : 'Column name is required'}}.\n </div>\n </div>\n \n <div class=\"bool-cell\">\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" [id]=\"'sortable-' + i\" formControlName=\"sortable\">\n <label [for]=\"'sortable-' + i\" class=\"toggle-button\"></label>\n </div>\n </div>\n \n <div class=\"bool-cell\">\n <div class=\"toggle-wrapper small\">\n <input type=\"checkbox\" [id]=\"'filterable-' + i\" formControlName=\"filterable\">\n <label [for]=\"'filterable-' + i\" class=\"toggle-button\"></label>\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" [matTooltip]=\"'APP.REMOVE' | nxtCustomTranslate : 'Remove'\">\n <div class=\"delete-icon\" (click)=\"removeColumn(i)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"add-row\">\n <div class=\"flex addIconBor cursor-pointer\" (click)=\"addColumn()\" [matTooltip]=\"'APP.ADD_COLUMN' | nxtCustomTranslate : 'Add Column'\">\n <div class=\"addIcon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3.33325V12.6666\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M3.33301 8H12.6663\" stroke=\"#007bff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n <span>{{'APP.ADD_COLUMN' | nxtCustomTranslate : 'Add Column'}}</span>\n </div>\n </div>\n <div *ngIf=\"conditions.length === 0 && columns.length === 0\" class=\"error-message\">\n {{'APP.AT_LEAST_ONE_FILTER_OR_ONE_COLUMN_IS_REQ' | nxtCustomTranslate : ' At least one filter or one column is required'}}.\n </div> \n <div class=\"form-actions\">\n <button type=\"button\" class=\"save-button\" (click)=\"save()\" [disabled]=\"!editingView.valid || (conditions.length === 0 && columns.length === 0)\">{{'APP.SAVE' | nxtCustomTranslate : 'Save'}}</button>\n <button type=\"button\" (click)=\"closeModal()\">{{'APP.CANCEL' | nxtCustomTranslate : 'Cancel'}}</button>\n </div>\n </form>\n </div>\n </div>\n <!-- SKS3MAY25 Delete List View-->\n <div *ngIf=\"isDeleteModalOpen\" class=\"modal\">\n <div class=\"modal-content\">\n <h2>{{'APP.DELETE_LIST_VIEW' | nxtCustomTranslate : 'Delete List View'}}</h2>\n <p>{{'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE' | nxtCustomTranslate : 'Are you sure you want to delete'}} \"{{ viewToDelete?.filterName }}\"?</p>\n <div class=\"form-delete\">\n <button type=\"button\" (click)=\"deleteConfirmed()\">{{'APP.DELETE' | nxtCustomTranslate : 'Delete'}}</button>\n <button type=\"button\" (click)=\"closeDeleteModal()\">{{'APP.CANCEL' | nxtCustomTranslate : 'Cancel'}}</button>\n </div>\n </div>\n </div>\n</div>", styles: [".list-view-filter{padding-left:10px;padding-right:10px}.filter-label{font-size:11px;color:#747577;margin-right:8px}.select-wrapper{display:flex;align-items:center;cursor:pointer}.custom-dropdown{position:relative;cursor:pointer;display:inline-block}.selected-option{padding:2px 5px;font-size:16px;font-weight:700;display:flex;gap:8px}.chevron-icon{cursor:pointer;background-color:#f5f5f5;border-radius:5px}.dropdown-options-container{position:absolute;top:100%;display:flex;flex-direction:column;border:1px solid #ccc;background:#fff;box-shadow:0 2px 8px #0000001a;z-index:1000;min-width:250px}.dropdown-options{background:#fff;list-style:none;padding:0;margin:0;white-space:nowrap;width:100%;max-height:300px;overflow-y:auto}.dropdown-options li{padding:8px;cursor:pointer}.dropdown-options li:hover{background-color:#f1f1f1}.dropdown-options li.selected{background-color:#f1f1f1;font-weight:600}.list-view-item{display:flex;justify-content:space-between;padding:8px;cursor:pointer;border-bottom:1px solid #f0f0f0}.list-view-item:hover{background-color:#f8f9fa}.edit-icon,.delete-icon{cursor:pointer;color:#666;transition:color .2s}.edit-icon:hover{color:#007bff}.delete-icon:hover{color:#dc3545}.add-filter{background-color:#fff;padding:10px;border-top:1px solid #dddddd;cursor:pointer;display:flex;align-items:center;gap:8px;width:100%}.add-filter:hover{background-color:#f8f9fa}.add-icon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.modal{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1001}.modal-content{background-color:#fff;border-radius:8px;padding:24px;width:700px;max-width:95%;max-height:90vh;overflow-y:auto;box-shadow:0 4px 20px #00000026}.modal-content h2{margin-top:0;margin-bottom:20px;font-size:20px;color:#333}.form-group{margin-bottom:16px}.form-group label{display:block;margin-bottom:8px;font-size:14px;font-weight:500}.form-group input{width:100%;padding:8px 12px;border:1px solid #ddd;border-radius:4px;font-size:14px}.toggle-wrapper{position:relative;display:inline-block}.toggle-wrapper input[type=checkbox]{opacity:0;width:0;height:0}.toggle-button{position:relative;display:inline-block;width:50px;height:24px;background-color:#ccc;border-radius:24px;transition:.3s;cursor:pointer}.toggle-button:before{position:absolute;content:\"\";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;border-radius:50%;transition:.3s}input[type=checkbox]:checked+.toggle-button{background-color:#007bff}input[type=checkbox]:checked+.toggle-button:before{transform:translate(20px)}.toggle-wrapper.small .toggle-button{width:40px;height:20px}.toggle-wrapper.small .toggle-button:before{height:16px;width:16px}input[type=checkbox]:checked+.toggle-button.small:before{transform:translate(20px)}.section-header{padding-bottom:8px}.section-header h3{margin:0 0 4px;font-size:16px;color:#333}.section-description{font-size:12px;color:#777}.table-container{border:1px solid #e0e0e0;border-radius:4px}.table-header{display:grid;background-color:#f8f9fa;font-weight:600;font-size:12px;padding:8px 12px;border-bottom:1px solid #e0e0e0}.filter-row,.column-row{display:grid;padding:8px 12px;border-bottom:1px solid #f0f0f0;align-items:center}.filter-row,.column-row,.table-header{grid-template-columns:1fr 1fr 1fr auto;gap:10px}.table-header.column-header{grid-template-columns:1fr 1fr 1fr auto}.column-cell,.operator-cell,.value-cell,.name-cell,.bool-cell,.action-cell{padding:5px}.action-cell{display:flex;justify-content:center}.listview-custom-select{position:relative;width:100%}.listview-custom-select input{border:none;font-size:12px}.dropdown-list{position:absolute;top:100%;left:0;width:100%;max-height:200px;overflow-y:auto;background:#fff;border:1px solid #ddd;border-top:none;border-radius:0 0 4px 4px;z-index:10;box-shadow:0 4px 8px #0000001a}.dropdown-item{padding:8px 12px;cursor:pointer}.dropdown-item:hover{background-color:#f5f5f5}.add-row{display:flex;align-items:center;gap:8px;padding:10px;cursor:pointer}.add-row:hover{background-color:#f8f9fa}.addIconBor{padding:4px;border-radius:5px;border:1px solid #6c757d;transition:background-color .3s,border-color .3s}.addIconBor:hover .addIcon{background-color:#bbd3ff}.addIcon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.dicon-container{padding:2px;border:1px solid #ffb5b5;border-radius:5px;margin-left:3px;margin-right:3px;display:flex;width:38px}.delete-icon{padding:2px 4px;border-radius:5px;background-color:#feeeed;align-content:center;width:32px;display:flex;justify-content:center;align-items:center}.dicon-container:hover .delete-icon svg path{stroke:#fff!important;fill:transparent!important}.dicon-container:hover .delete-icon{background-color:#ff7575!important;cursor:pointer}.dicon-container:hover{border:1px solid #ff2121!important}.form-actions{display:flex;justify-content:flex-end;gap:12px;margin-top:20px}.form-delete{display:flex;justify-content:flex-end;gap:12px}.form-actions button,.form-delete button{padding:8px 16px;border-radius:4px;font-size:14px;cursor:pointer;transition:background-color .2s}.form-actions button:first-child{background-color:#007bff;color:#fff;border:1px solid #007bff}.form-actions button:nth-child(2){background-color:#f8f9fa;border:1px solid #ddd;color:#333}.form-delete button:first-child{background-color:#dc3545;color:#fff;border:1px solid #dc3545}.form-delete button:nth-child(2){background-color:#f8f9fa;border:1px solid #ddd;color:#333}.form-actions button:hover,.form-delete button:hover{opacity:.9}.cursor-pointer{cursor:pointer}.flex{display:flex}.form-row{display:flex;gap:16px;align-items:flex-start}.form-group{min-width:0;margin-bottom:0!important}.error-message{color:#dc3545;font-size:12px;margin-top:4px}.listview-custom-select input[readonly]{cursor:pointer;background-color:#fff}.error-message{color:#ff2c10;font-size:.875rem;margin-bottom:.5rem}.save-button:disabled{background-color:#ccc!important;color:#666!important;cursor:not-allowed!important}.modal-header-div{display:flex;justify-content:space-between;font-size:18px;padding-bottom:10px}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.list-view-item{position:relative}.actions{display:none;position:absolute;right:8px;top:50%;transform:translateY(-50%)}.list-view-item:hover .actions{display:flex;gap:10px}\n"] }]
|
|
385
376
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.NxtCustomTranslatePipe }], propDecorators: { listViews: [{
|
|
386
377
|
type: Input
|
|
387
378
|
}], tableFilterArray: [{
|
|
@@ -398,4 +389,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
398
389
|
type: HostListener,
|
|
399
390
|
args: ['document:click', ['$event']]
|
|
400
391
|
}] } });
|
|
401
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9saXN0LXZpZXctZmlsdGVyL2xpc3Qtdmlldy1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC12aWV3LWZpbHRlci9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQWdDN0QsTUFBTSxPQUFPLHVCQUF1QjtJQWlDZDtJQUF3QjtJQWhDbkMsU0FBUyxHQUFlLEVBQUUsQ0FBQztJQUMzQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFDM0IsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFDM0Isa0JBQWtCLEdBQXlEO1FBQ2xGLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBQyxTQUFTLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDMUQsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUMsU0FBUyxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsSUFBSSxF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QyxLQUFVO1FBQ3hCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7d0dBMVlVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDRXQUp2QixDQUFDLHNCQUFzQixDQUFDLCtDQ2hDckMsMjN2QkF1Uk0sdXZNRHhQTSxZQUFZLCtQQUFFLFdBQVcsMnNDQUFFLG1CQUFtQix5aEJBQUUsc0JBQXNCLDBEQUFDLGdCQUFnQjs7NEZBS3RGLHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBQyxnQkFBZ0IsQ0FBQyxhQUN2RixDQUFDLHNCQUFzQixDQUFDO3FIQUsxQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBU0ksWUFBWTtzQkFBckIsTUFBTTtnQkFzWFAsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1BcnJheSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE54dEN1c3RvbVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlL2N1c3RvbS10cmFuc2xhdGUucGlwZSc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmludGVyZmFjZSBMaXN0VmlldyB7XG4gIGZpbHRlck5hbWU6IHN0cmluZztcbiAgbGFiZWxQYXRoOiBhbnk7XG4gIG9yZGVyOiBudW1iZXI7XG4gIGlzRGVmYXVsdDogYm9vbGVhbjtcbiAgY29uZGl0aW9uczogTGlzdFZpZXdGaWx0ZXJbXTtcbiAgY29sdW1uczogTGlzdFZpZXdDb2x1bW5bXTtcbiAgc2hvd0FjdGlvbnM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTGlzdFZpZXdGaWx0ZXIge1xuICBmaWVsZDogc3RyaW5nO1xuICBvcGVyYXRvcjogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTGlzdFZpZXdDb2x1bW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHNvcnRhYmxlOiBib29sZWFuO1xuICBmaWx0ZXJhYmxlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbGlzdC12aWV3LWZpbHRlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBOeHRDdXN0b21UcmFuc2xhdGVQaXBlLE1hdFRvb2x0aXBNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtOeHRDdXN0b21UcmFuc2xhdGVQaXBlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3Qtdmlldy1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Vmlld0ZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGxpc3RWaWV3czogTGlzdFZpZXdbXSA9IFtdO1xuICBASW5wdXQoKSB0YWJsZUZpbHRlckFycmF5OiBhbnkgPSBbXTtcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGlzcGxheWVkQ29sdW1uczogYW55ID0gW107XG4gIEBJbnB1dCgpIGF2YWlsYWJsZU9wZXJhdG9yczogeyBsYWJlbDogc3RyaW5nLGxhYmVsUGF0aDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcbiAgICB7IGxhYmVsOiAnRXF1YWxzICg9KScsbGFiZWxQYXRoOidBUFAuRVFVQUxTJywgdmFsdWU6ICc9JyB9LFxuICAgIHsgbGFiZWw6ICdOb3QgRXF1YWwgKCE9KScsbGFiZWxQYXRoOidBUFAuTk9UX0VRVUFMJywgdmFsdWU6ICchPScgfSxcbiAgICB7IGxhYmVsOiAnR3JlYXRlciBUaGFuICg+KScsbGFiZWxQYXRoOidBUFAuR1JFQVRFUl9USEFOJywgdmFsdWU6ICc+JyB9LFxuICAgIHsgbGFiZWw6ICdMZXNzIFRoYW4gKDwpJyxsYWJlbFBhdGg6J0FQUC5MRVNTX1RIQU4nLCB2YWx1ZTogJzwnIH0sXG4gICAgeyBsYWJlbDogJ0dyZWF0ZXIgVGhhbiBvciBFcXVhbCAoPj0pJyxsYWJlbFBhdGg6J0FQUC5HUkVBVEVSX1RIQU5fT1JfRVFVQUwnLCB2YWx1ZTogJz49JyB9LFxuICAgIHsgbGFiZWw6ICdMZXNzIFRoYW4gb3IgRXF1YWwgKDw9KScsbGFiZWxQYXRoOidBUFAuTEVTU19USEFOX09SX0VRVUFMJywgdmFsdWU6ICc8PScgfVxuICBdOyAgLy8gJ2NvbnRhaW5zJywgJ25vdCBjb250YWlucycsICdzdGFydHMgd2l0aCcsICdlbmRzIHdpdGgnXG5cbiAgQE91dHB1dCgpIGxpc3RWaWV3RW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGlzRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzTW9kYWxPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRGVsZXRlTW9kYWxPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzQWRkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHZpZXdUb0RlbGV0ZTogTGlzdFZpZXcgfCBudWxsID0gbnVsbDtcblxuICBlZGl0aW5nVmlldzogRm9ybUdyb3VwO1xuXG4gIGlzQ29sdW1uRHJvcGRvd25PcGVuOiBib29sZWFuW10gPSBbXTtcbiAgaXNPcGVyYXRvckRyb3Bkb3duT3BlbjogYm9vbGVhbltdID0gW107XG4gIGlzVmFsdWVEcm9wZG93bk9wZW46IGJvb2xlYW5bXSA9IFtdO1xuICBpc0NvbHVtbk5hbWVEcm9wZG93bk9wZW46IGJvb2xlYW5bXSA9IFtdO1xuICBzZWxlY3RlZFZpZXdQYXRoOiBzdHJpbmc7XG4gIHRhYmxlRmlsdGVyQXJyYXlUcmFuczogYW55O1xuICBkaXNwbGF5ZWRDb2x1bW5zVHJhbnM6IGFueTtcbiAgYXZhaWxhYmxlT3BlcmF0b3JzVHJhbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgfVtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLHByaXZhdGUgbnh0Q3VzdG9tVHJhbnNsYXRlOiBOeHRDdXN0b21UcmFuc2xhdGVQaXBlKSB7XG4gICAgdGhpcy5lZGl0aW5nVmlldyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZmlsdGVyTmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG9yZGVyOiBbMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXG4gICAgICBpc0RlZmF1bHQ6IFtmYWxzZV0sXG4gICAgICBjb25kaXRpb25zOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIGNvbHVtbnM6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgaWYgKCF0aGlzLnNlbGVjdGVkVmlldyAmJiB0aGlzLmxpc3RWaWV3cz8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSB0aGlzLmxpc3RWaWV3c1swXS5maWx0ZXJOYW1lO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXdQYXRoID0gdGhpcy5saXN0Vmlld3NbMF0ubGFiZWxQYXRoXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3UGF0aCA9IHRoaXMuc2VsZWN0ZWRWaWV3ID09PSAnQWxsIERhdGEnID8gdGhpcy5saXN0Vmlld3NbMF0ubGFiZWxQYXRoIDogdGhpcy5zZWxlY3RlZFZpZXdcbiAgICB9XG4gICAgdGhpcy50YWJsZUZpbHRlckFycmF5VHJhbnMgPXRoaXMudGFibGVGaWx0ZXJBcnJheVxuICAgIHRoaXMudGFibGVGaWx0ZXJBcnJheVRyYW5zLmZvckVhY2goKGVsZTphbnkpID0+IHtcbiAgICAgIGVsZS5sYWJlbCA9IHRoaXMubnh0Q3VzdG9tVHJhbnNsYXRlLnRyYW5zZm9ybShlbGUubGFiZWxQYXRoIHx8IGVsZS5sYWJlbCxlbGUubGFiZWwgKVxuICAgIH0pO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1uc1RyYW5zID10aGlzLmRpc3BsYXllZENvbHVtbnNcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnNUcmFucy5mb3JFYWNoKChlbGU6YW55KSA9PiB7XG4gICAgICBlbGUubGFiZWwgPSB0aGlzLm54dEN1c3RvbVRyYW5zbGF0ZS50cmFuc2Zvcm0oZWxlLmxhYmVsUGF0aCB8fCBlbGUubGFiZWwsZWxlLmxhYmVsIClcbiAgICB9KTtcbiAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9yc1RyYW5zID0gdGhpcy5hdmFpbGFibGVPcGVyYXRvcnNcbiAgICB0aGlzLmF2YWlsYWJsZU9wZXJhdG9yc1RyYW5zLmZvckVhY2goKGVsZTphbnkpID0+IHtcbiAgICAgIGVsZS5sYWJlbCA9IHRoaXMubnh0Q3VzdG9tVHJhbnNsYXRlLnRyYW5zZm9ybShlbGUubGFiZWxQYXRoIHx8IGVsZS5sYWJlbCxlbGUubGFiZWwgKVxuICAgIH0pO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRWaWV3ICYmIHRoaXMubGlzdFZpZXdzPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHRoaXMubGlzdFZpZXdzWzBdLmZpbHRlck5hbWU7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld1BhdGggPSB0aGlzLmxpc3RWaWV3c1swXS5sYWJlbFBhdGhcbiAgICB9ZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld1BhdGggPSB0aGlzLnNlbGVjdGVkVmlldyA9PT0gJ0FsbCBEYXRhJyA/IHRoaXMubGlzdFZpZXdzWzBdLmxhYmVsUGF0aCA6IHRoaXMuc2VsZWN0ZWRWaWV3XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbmRpdGlvbnMoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nVmlldy5nZXQoJ2NvbmRpdGlvbnMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgUmV0dXJucyB0aGUgRm9ybUFycmF5IG9mIGNvbHVtbnMgZnJvbSB0aGUgZWRpdGluZyBmb3JtXG4gIGdldCBjb2x1bW5zKCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ1ZpZXcuZ2V0KCdjb2x1bW5zJykgYXMgRm9ybUFycmF5O1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IEFkZHMgYSBuZXcgZmlsdGVyIGNvbmRpdGlvbiB0byB0aGUgZm9ybVxuICBhZGRGaWx0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb25zLnB1c2godGhpcy5mYi5ncm91cCh7XG4gICAgICBmaWVsZDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG9wZXJhdG9yOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmFsdWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICB9KSk7XG4gICAgdGhpcy5pc0NvbHVtbkRyb3Bkb3duT3Blbi5wdXNoKGZhbHNlKTtcbiAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW4ucHVzaChmYWxzZSk7XG4gICAgdGhpcy5pc1ZhbHVlRHJvcGRvd25PcGVuLnB1c2goZmFsc2UpO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IFJlbW92ZXMgYSBmaWx0ZXIgY29uZGl0aW9uIGJ5IGluZGV4XG4gIHJlbW92ZUZpbHRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25kaXRpb25zLnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5pc09wZXJhdG9yRHJvcGRvd25PcGVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5pc1ZhbHVlRHJvcGRvd25PcGVuLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICBhZGRDb2x1bW4oKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5zLnB1c2godGhpcy5mYi5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgc29ydGFibGU6IFtmYWxzZV0sXG4gICAgICBmaWx0ZXJhYmxlOiBbZmFsc2VdXG4gICAgfSkpO1xuICAgIHRoaXMuaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuLnB1c2goZmFsc2UpO1xuICB9XG5cbiAgcmVtb3ZlQ29sdW1uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICB0b2dnbGVEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RWaWV3RW1pdC5lbWl0KHtcImFjdGlvblwiOiAnZmlsdGVyR2V0J30pO1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0Ryb3Bkb3duT3BlbjtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBIYW5kbGVzIHNlbGVjdGluZyBhIGxpc3QgdmlldyBmcm9tIHRoZSBkcm9wZG93blxuICBzZWxlY3RMaXN0Vmlldyh2aWV3OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHZpZXcuZmlsdGVyTmFtZTtcbiAgICB0aGlzLnNlbGVjdGVkVmlld1BhdGggPSB2aWV3LmxhYmVsUGF0aCB8fCB2aWV3LmZpbHRlck5hbWU7XG4gICAgdGhpcy5saXN0Vmlld0VtaXQuZW1pdCh7J2FjdGlvbic6J3NlbGVjdCcsICdkYXRhJzp2aWV3fSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IE9wZW5zIG1vZGFsIHRvIGVkaXQgYW4gZXhpc3RpbmcgbGlzdCB2aWV3XG4gIHN0YXJ0RWRpdCh2aWV3OiBMaXN0VmlldywgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmlzQWRkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IHRydWU7XG5cbiAgICB0aGlzLmVkaXRpbmdWaWV3LnJlc2V0KCk7XG4gICAgd2hpbGUgKHRoaXMuY29uZGl0aW9ucy5sZW5ndGgpIHRoaXMuY29uZGl0aW9ucy5yZW1vdmVBdCgwKTtcbiAgICB3aGlsZSAodGhpcy5jb2x1bW5zLmxlbmd0aCkgdGhpcy5jb2x1bW5zLnJlbW92ZUF0KDApO1xuXG4gICAgdGhpcy5lZGl0aW5nVmlldy5wYXRjaFZhbHVlKHtcbiAgICAgIGZpbHRlck5hbWU6IHZpZXcuZmlsdGVyTmFtZSxcbiAgICAgIG9yZGVyOiB2aWV3Lm9yZGVyLFxuICAgICAgaXNEZWZhdWx0OiB2aWV3LmlzRGVmYXVsdFxuICAgIH0pO1xuXG4gICAgdmlldz8uY29uZGl0aW9ucz8uZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgdGhpcy5jb25kaXRpb25zLnB1c2godGhpcy5mYi5ncm91cCh7XG4gICAgICAgIGZpZWxkOiBbZmlsdGVyLmZpZWxkLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgb3BlcmF0b3I6IFtmaWx0ZXIub3BlcmF0b3IsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICB2YWx1ZTogW2ZpbHRlci52YWx1ZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIFxuICAgIHZpZXc/LmNvbHVtbnM/LmZvckVhY2goY29sID0+IHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1uc1RyYW5zLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICBpZihjb2wubmFtZSA9PSBmaWVsZC5maWVsZE5hbWUpIHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIG5hbWU6IFtmaWVsZC5sYWJlbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBzb3J0YWJsZTogW2NvbC5zb3J0YWJsZSB8fCBmYWxzZV0sXG4gICAgICAgICAgICBmaWx0ZXJhYmxlOiBbY29sLmZpbHRlcmFibGUgfHwgZmFsc2VdXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICB9XG5cbiAgLy8gU0tTM01BWTI1IE9wZW5zIG1vZGFsIHRvIGNyZWF0ZSBhIG5ldyBsaXN0IHZpZXdcbiAgc3RhcnRBZGQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0FkZGluZyA9IHRydWU7XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IHRydWU7XG5cbiAgICB0aGlzLmVkaXRpbmdWaWV3LnJlc2V0KCk7XG4gICAgd2hpbGUgKHRoaXMuY29uZGl0aW9ucy5sZW5ndGgpIHRoaXMuY29uZGl0aW9ucy5yZW1vdmVBdCgwKTtcbiAgICB3aGlsZSAodGhpcy5jb2x1bW5zLmxlbmd0aCkgdGhpcy5jb2x1bW5zLnJlbW92ZUF0KDApO1xuXG4gICAgdGhpcy5lZGl0aW5nVmlldy5wYXRjaFZhbHVlKHtcbiAgICAgIG9yZGVyOiB0aGlzLmxpc3RWaWV3cz8ubGVuZ3RoLFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcblxuICAgIC8vIFNLUzI2TUFZMjUgU2Vjb25kIGxvb3A6IGZyb20gZGlzcGxheWVkQ29sdW1uc1RyYW5zLCBza2lwIGR1cGxpY2F0ZXNcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnNUcmFucy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbZmllbGQubGFiZWwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBzb3J0YWJsZTogW2ZpZWxkLmh5cGVyTGluayB8fCBmYWxzZV0sXG4gICAgICAgIGZpbHRlcmFibGU6IFtmaWVsZC5maWx0ZXIgfHwgZmFsc2VdXG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgU2F2ZXMgdGhlIGN1cnJlbnRseSBlZGl0ZWQgb3IgYWRkZWQgbGlzdCB2aWV3XG4gIHNhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdGluZ1ZpZXcudmFsaWQpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZWRpdGluZ1ZpZXcudmFsdWU7XG4gICAgICBmb3JtVmFsdWU/LmNvbHVtbnM/LmZvckVhY2goKGNvbCk9PntcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zVHJhbnMuZm9yRWFjaCgoZENvbCkgPT4ge1xuICAgICAgICAgIGlmIChkQ29sLmxhYmVsID09PSBjb2wubmFtZSkge1xuICAgICAgICAgICAgY29sLm5hbWUgPSBkQ29sLmZpZWxkTmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICBmb3JtVmFsdWU/LmNvbmRpdGlvbnM/LmZvckVhY2goKGNvbCk9PntcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zVHJhbnMuZm9yRWFjaCgoZENvbCkgPT4ge1xuICAgICAgICAgIGlmIChkQ29sLmxhYmVsID09PSBjb2wuZmllbGQpIHtcbiAgICAgICAgICAgIGNvbC5maWVsZCA9IGRDb2wuZmllbGROYW1lXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIGNvbnN0IGxpc3RWaWV3OiBMaXN0VmlldyA9IHtcbiAgICAgICAgZmlsdGVyTmFtZTogZm9ybVZhbHVlLmZpbHRlck5hbWUsXG4gICAgICAgIGxhYmVsUGF0aDogZm9ybVZhbHVlLmxhYmVsUGF0aCB8fCBmb3JtVmFsdWUuZmlsdGVyTmFtZSxcbiAgICAgICAgb3JkZXI6IGZvcm1WYWx1ZS5vcmRlcixcbiAgICAgICAgaXNEZWZhdWx0OiBmb3JtVmFsdWUuaXNEZWZhdWx0LFxuICAgICAgICBjb25kaXRpb25zOiBmb3JtVmFsdWUuY29uZGl0aW9ucyxcbiAgICAgICAgY29sdW1uczogZm9ybVZhbHVlLmNvbHVtbnNcbiAgICAgIH07XG5cbiAgICAgIC8vIGlmIChsaXN0Vmlldy5pc0RlZmF1bHQpIHtcbiAgICAgIC8vICAgdGhpcy5saXN0Vmlld3MuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgIC8vICAgICBpZiAodmlldy5pZCAhPT0gbGlzdFZpZXcuaWQpIHZpZXcuaXNEZWZhdWx0ID0gZmFsc2U7XG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBjb25zdCBleGlzdGluZ0luZGV4ID0gdGhpcy5saXN0Vmlld3MuZmluZEluZGV4KHZpZXcgPT4gdmlldy5pZCA9PT0gbGlzdFZpZXcuaWQpO1xuICAgICAgLy8gaWYgKGV4aXN0aW5nSW5kZXggPj0gMCkge1xuICAgICAgLy8gICB0aGlzLmxpc3RWaWV3c1tleGlzdGluZ0luZGV4XSA9IHsgLi4ubGlzdFZpZXcgfTtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIHRoaXMubGlzdFZpZXdzLnB1c2gobGlzdFZpZXcpO1xuICAgICAgLy8gfVxuXG4gICAgICB0aGlzLmxpc3RWaWV3cy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IGxpc3RWaWV3LmZpbHRlck5hbWU7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld1BhdGggPSBsaXN0Vmlldy5sYWJlbFBhdGggfHwgbGlzdFZpZXcuZmlsdGVyTmFtZTtcbiAgICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoeydhY3Rpb24nOidzYXZlJywgXCJkYXRhXCI6IGxpc3RWaWV3fSk7XG4gICAgICB0aGlzLmNsb3NlTW9kYWwoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBTaG93cyBhY3Rpb24gYnV0dG9ucyBmb3IgYSBsaXN0IHZpZXcgb24gaG92ZXJcbiAgc2hvd0FjdGlvbnModmlldzogTGlzdFZpZXcpOiB2b2lkIHtcbiAgICB2aWV3LnNob3dBY3Rpb25zID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBIaWRlcyBhY3Rpb24gYnV0dG9ucyBmb3IgYWxsIGxpc3Qgdmlld3NcbiAgaGlkZUFjdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5saXN0Vmlld3MuZm9yRWFjaCh2aWV3ID0+IHZpZXcuc2hvd0FjdGlvbnMgPSBmYWxzZSk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgT3BlbnMgY29uZmlybWF0aW9uIG1vZGFsIHRvIGRlbGV0ZSBhIGxpc3Qgdmlld1xuICBjb25maXJtRGVsZXRlKHZpZXc6IExpc3RWaWV3LCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnZpZXdUb0RlbGV0ZSA9IHZpZXc7XG4gICAgdGhpcy5pc0RlbGV0ZU1vZGFsT3BlbiA9IHRydWU7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IENsb3NlcyB0aGUgZGVsZXRlIGNvbmZpcm1hdGlvbiBtb2RhbFxuICBjbG9zZURlbGV0ZU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEZWxldGVNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdUb0RlbGV0ZSA9IG51bGw7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgRGVsZXRlcyB0aGUgc2VsZWN0ZWQgbGlzdCB2aWV3IGFmdGVyIGNvbmZpcm1hdGlvblxuICBkZWxldGVDb25maXJtZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlld1RvRGVsZXRlKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdFZpZXdzLmZpbmRJbmRleCh2aWV3ID0+IHZpZXcuZmlsdGVyTmFtZSA9PT0gdGhpcy52aWV3VG9EZWxldGU/LmZpbHRlck5hbWUpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgLy8gdGhpcy5saXN0Vmlld3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRWaWV3ID09PSB0aGlzLnZpZXdUb0RlbGV0ZS5maWx0ZXJOYW1lKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSB0aGlzLmxpc3RWaWV3cz8ubGVuZ3RoID4gMCA/IHRoaXMubGlzdFZpZXdzWzBdLmZpbHRlck5hbWUgOiAnJztcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmlld1BhdGggPSB0aGlzLmxpc3RWaWV3cz8ubGVuZ3RoID4gMCA/IHRoaXMubGlzdFZpZXdzWzBdLmxhYmVsUGF0aCA6ICcnIFxuICAgICAgICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoeydhY3Rpb24nOidzZWxlY3QnLCAnZGF0YSc6dGhpcy5zZWxlY3RlZFZpZXd9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RWaWV3RW1pdC5lbWl0KHsnYWN0aW9uJzogJ2RlbGV0ZScsIFwiZGF0YVwiOiB0aGlzLnZpZXdUb0RlbGV0ZX0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jbG9zZURlbGV0ZU1vZGFsKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU0tTM01BWTI1IFJldHVybnMgZmlsdGVyZWQgbGlzdCBvZiBjb2x1bW5zIGJhc2VkIG9uIGlucHV0IHNlYXJjaCB0ZXJtXG4gIGdldEZpbHRlcmVkQ29sdW1ucyh0ZXJtOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgaWYgKCF0ZXJtKSByZXR1cm4gdGhpcy50YWJsZUZpbHRlckFycmF5VHJhbnM7XG4gICAgdGVybSA9IHRlcm0udG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy50YWJsZUZpbHRlckFycmF5VHJhbnMuZmlsdGVyKGNvbCA9PlxuICAgICAgY29sLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSlcbiAgICApO1xuICB9XG5cbiAgZ2V0Q29sdW1uQ29sdW1ucyh0ZXJtOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgaWYgKCF0ZXJtKSByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zVHJhbnM7XG4gICAgdGVybSA9IHRlcm0udG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zVHJhbnMuZmlsdGVyKGNvbCA9PlxuICAgICAgY29sLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSlcbiAgICApO1xuICB9ICBcbiAgIC8vIFNLUzNNQVkyNSBSZXR1cm5zIHBvc3NpYmxlIHZhbHVlcyBmb3IgYSBzZWxlY3RlZCBmaWVsZC9jb2x1bW5cbiAgIGdldFBvc3NpYmxlVmFsdWVzKGZpZWxkOiBzdHJpbmcsIHRlcm06IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGFibGVGaWx0ZXJBcnJheVRyYW5zLmZpbmQoY29sID0+IGNvbC5sYWJlbCA9PT0gZmllbGQpO1xuICAgIGlmICghbWF0Y2ggfHwgIUFycmF5LmlzQXJyYXkobWF0Y2gudmFsdWUpKSByZXR1cm4gW107XG4gICAgaWYgKCF0ZXJtKSByZXR1cm4gbWF0Y2gudmFsdWU7XG4gICAgY29uc3QgbG93ZXJUZXJtID0gdGVybS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBtYXRjaC52YWx1ZS5maWx0ZXIodmFsID0+XG4gICAgICB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlclRlcm0pXG4gICAgKTtcbiAgfSAgXG4gIC8vIFNLUzNNQVkyNSBSZXR1cm5zIGZpbHRlcmVkIGxpc3Qgb2Ygb3BlcmF0b3JzIGJhc2VkIG9uIGlucHV0IHNlYXJjaCB0ZXJtXG4gIGdldEZpbHRlcmVkT3BlcmF0b3JzKHRlcm06IHN0cmluZyk6IHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGlmICghdGVybSkgcmV0dXJuIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzVHJhbnM7XG4gICAgdGVybSA9IHRlcm0udG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVPcGVyYXRvcnNUcmFucy5maWx0ZXIob3BlcmF0b3IgPT5cbiAgICAgIG9wZXJhdG9yLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSlcbiAgICApO1xuICB9ICBcbiAgb3BlcmF0b3JJbnB1dDogc3RyaW5nW10gPSBbXTtcblxuICBvbk9wZXJhdG9ySW5wdXQodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMub3BlcmF0b3JJbnB1dFtpbmRleF0gPSB2YWx1ZTtcbiAgfVxuICBcbiAgZ2V0T3BlcmF0b3JMYWJlbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzVHJhbnMuZmluZChvcCA9PiBvcC52YWx1ZSA9PT0gdmFsdWUpO1xuICAgIHJldHVybiBmb3VuZCA/IGZvdW5kLmxhYmVsIDogdmFsdWU7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgT3BlbnMgYSBkcm9wZG93biBvbiBmb2N1cyBmb3IgdGhlIGdpdmVuIGlucHV0IHR5cGUgYW5kIGluZGV4XG4gIG9uRm9jdXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgPT09ICdmaWVsZCcpIHtcbiAgICAgIHRoaXMuaXNDb2x1bW5Ecm9wZG93bk9wZW5baW5kZXhdID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGVyYXRvcicpIHtcbiAgICAgIHRoaXMuaXNPcGVyYXRvckRyb3Bkb3duT3BlbltpbmRleF0gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgdGhpcy5pc1ZhbHVlRHJvcGRvd25PcGVuW2luZGV4XSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY29sdW1uTmFtZScpIHtcbiAgICAgIHRoaXMuaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuW2luZGV4XSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gU0tTM01BWTI1IERlbGF5cyBjbG9zaW5nIGRyb3Bkb3duIHRvIGFsbG93IHNlbGVjdGlvbiBvbiBibHVyXG4gIG9uQmx1cih0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0eXBlID09PSAnZmllbGQnKSB7XG4gICAgICAgIHRoaXMuaXNDb2x1bW5Ecm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGVyYXRvcicpIHtcbiAgICAgICAgdGhpcy5pc09wZXJhdG9yRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndmFsdWUnKSB7XG4gICAgICAgIHRoaXMuaXNWYWx1ZURyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbHVtbk5hbWUnKSB7XG4gICAgICAgIHRoaXMuaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cblxuLy8gU0tTM01BWTI1IFNldHMgc2VsZWN0ZWQgdmFsdWUgaW4gdGhlIGZvcm0gY29udHJvbCBhbmQgY2xvc2VzIHRoZSBkcm9wZG93blxuICBzZWxlY3RPcHRpb24odHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgPT09ICdmaWVsZCcpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9ucy5hdChpbmRleCkuZ2V0KCdmaWVsZCcpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29wZXJhdG9yJykge1xuICAgICAgdGhpcy5jb25kaXRpb25zLmF0KGluZGV4KS5nZXQoJ29wZXJhdG9yJyk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuaXNPcGVyYXRvckRyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd2YWx1ZScpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9ucy5hdChpbmRleCkuZ2V0KCd2YWx1ZScpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnY29sdW1uTmFtZScpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5hdChpbmRleCkuZ2V0KCduYW1lJyk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBnZXRMYWJlbEJ5RmllbGROYW1lKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGlzcGxheWVkQ29sdW1uc1RyYW5zLmZpbmQoY29sID0+IGNvbC5maWVsZE5hbWUgPT09IGZpZWxkTmFtZSk7XG4gICAgcmV0dXJuIG1hdGNoPy5sYWJlbCA/IG1hdGNoLmxhYmVsIDogZmllbGROYW1lO1xuICB9XG5cbiAgb25NYW51YWxJbnB1dChpbnB1dFZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGlzcGxheWVkQ29sdW1uc1RyYW5zLmZpbmQoY29sID0+IGNvbC5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSBpbnB1dFZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgdGhpcy5jb2x1bW5zLmF0KGluZGV4KS5nZXQoJ25hbWUnKS5zZXRWYWx1ZShtYXRjaC5sYWJlbCk7XG4gICAgfVxuICB9ICAgIFxuICAvLyBTS1MzTUFZMjUgTGlzdGVucyB0byBkb2N1bWVudCBjbGljayBhbmQgY2xvc2VzIHRoZSBkcm9wZG93biBpZiBjbGlja2VkIG91dHNpZGVcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IGFueSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIXRhcmdldC5jbG9zZXN0KCcubGlzdC12aWV3LWZpbHRlcicpKSB7XG4gICAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG59IiwiPGRpdiBjbGFzcz1cImxpc3Qtdmlldy1maWx0ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWRyb3Bkb3duXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItbGFiZWxcIj57eydBUFAuREFUQV9SRUxBVEVEX1RPJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdEYXRhIFJlbGF0ZWQgdG8nfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiZmlsdGVyLWljb25cIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgcng9XCI1XCIgZmlsbD1cIiNGMUYxRjFcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS41MTI4OCA0LjVIMTIuMTg3OUMxMi43NDI5IDQuNSAxMy4yMDA0IDQuOTU3NSAxMy4yMDA0IDUuNTEyNVY2LjYyMjQ5QzEzLjIwMDQgNy4wMjc0OSAxMi45NDU0IDcuNTMgMTIuNjk3OSA3Ljc4NUwxMC41MjI5IDkuNzA1QzEwLjIyMjkgOS45NiAxMC4wMjA0IDEwLjQ2MjUgMTAuMDIwNCAxMC44Njc1VjEzLjA0MjVDMTAuMDIwNCAxMy4zNDI1IDkuODE3OSAxMy43NDc1IDkuNTYyOSAxMy45MDVMOC44NTc4OSAxNC4zNjI1QzguMTk3ODkgMTQuNzY3NSA3LjI5MDM3IDE0LjMxIDcuMjkwMzcgMTMuNVYxMC44MjI1QzcuMjkwMzcgMTAuNDcgNy4wODc4OSAxMC4wMTI1IDYuODg1MzkgOS43NTc1MUw0Ljk2NTM5IDcuNzMyNUM0LjcxMDM5IDcuNDc3NSA0LjUwNzkgNy4wMjc0OSA0LjUwNzkgNi43MTk5OVY1LjU1NzVDNC41MDA0IDQuOTU3NSA0Ljk1Nzg4IDQuNSA1LjUxMjg4IDQuNVpcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLW1pdGVybGltaXQ9XCIxMFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk00LjUgMTEuOTk5OVYxNC4yNDk5QzQuNSAxNy45OTk5IDYgMTkuNDk5OSA5Ljc1IDE5LjQ5OTlIMTQuMjVDMTggMTkuNDk5OSAxOS41IDE3Ljk5OTkgMTkuNSAxNC4yNDk5VjkuNzQ5OTRDMTkuNSA3LjQwOTk0IDE4LjkxNSA1LjkzOTkzIDE3LjU1NzUgNS4xNzQ5M0MxNy4xNzUgNC45NTc0MyAxNi40MSA0Ljc5MjQzIDE1LjcxMjUgNC42Nzk5M1wiIHN0cm9rZT1cIiMyOTJEMzJcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuNzUgMTIuNzVIMTYuNVwiIHN0cm9rZT1cIiMyOTJEMzJcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEuMjUgMTUuNzVIMTYuNVwiIHN0cm9rZT1cIiMyOTJEMzJcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLW9wdGlvblwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZFZpZXcgPyAoc2VsZWN0ZWRWaWV3UGF0aCB8fCBzZWxlY3RlZFZpZXcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiBzZWxlY3RlZFZpZXcpICA6ICgnQVBQLlNFTEVDVF9BX1ZJRVcnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NlbGVjdCBhIHZpZXcnKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNoZXZyb24taWNvblwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTkuOTk5OSAyNS42NjY3QzIzLjY4MTggMjUuNjY2NyAyNi42NjY2IDIyLjY4MTkgMjYuNjY2NiAxOUMyNi42NjY2IDE1LjMxODEgMjMuNjgxOCAxMi4zMzM0IDE5Ljk5OTkgMTIuMzMzNEMxNi4zMTggMTIuMzMzNCAxMy4zMzMzIDE1LjMxODEgMTMuMzMzMyAxOUMxMy4zMzMzIDIyLjY4MTkgMTYuMzE4IDI1LjY2NjcgMTkuOTk5OSAyNS42NjY3WlwiIGZpbGw9XCIjMjkyRDMyXCIgc3Ryb2tlPVwiIzI5MkQzMlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMTBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy42NDY3IDE4LjE2TDIwLjAwMDEgMjAuNTA2N0wyMi4zNTM0IDE4LjE2XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTS1MzTUFZMjUgbGlzdCB2aWV3IERyb3AgZG93bi0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNEcm9wZG93bk9wZW5cIiBjbGFzcz1cImRyb3Bkb3duLW9wdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCB2aWV3IG9mIGxpc3RWaWV3c1wiIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcgPT09IHZpZXcuZmlsdGVyTmFtZVwiIChtb3VzZWVudGVyKT1cInNob3dBY3Rpb25zKHZpZXcpXCIgKG1vdXNlbGVhdmUpPVwiaGlkZUFjdGlvbnMoKVwiIChjbGljayk9XCJzZWxlY3RMaXN0Vmlldyh2aWV3KVwiIGNsYXNzPVwibGlzdC12aWV3LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LW5hbWVcIj57eyB2aWV3LmxhYmVsUGF0aCB8fCB2aWV3LmZpbHRlck5hbWUgfCBueHRDdXN0b21UcmFuc2xhdGUgOiB2aWV3LmZpbHRlck5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2aWV3LnNob3dBY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlZGl0LWljb25cIiAoY2xpY2spPVwic3RhcnRFZGl0KHZpZXcsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzI5MjMgMy45ODcyNkwxMi4wMTI2IDYuNjcwNTlNOS4zMjkyMyAzLjk4NzI2TDIuNTAwMDggMTAuODE2NFYxMy40OTk3SDUuMTgzNDJMMTIuMDEyNiA2LjY3MDU5TTkuMzI5MjMgMy45ODcyNkwxMi4wMTI2IDEuMzAzOTJMMTQuNjk1OSAzLjk4NzI2TDEyLjAxMjYgNi42NzA1OVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cImNvbmZpcm1EZWxldGUodmlldywgJGV2ZW50KVwiICpuZ0lmPVwibGlzdFZpZXdzLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDMuOTg3MjZDMTEuNzggMy43NjcyNiA5LjU0NjY3IDMuNjUzOTMgNy4zMiAzLjY1MzkzQzYgMy42NTM5MyA0LjY4IDMuNzIwNiAzLjM2IDMuODUzOTNMMiAzLjk4NzI2XCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuNjY2NSAzLjMxMzYyTDUuODEzMTcgMi40NDAyOEM1LjkxOTg0IDEuODA2OTUgNS45OTk4NCAxLjMzMzYyIDcuMTI2NSAxLjMzMzYySDguODczMTdDOS45OTk4NCAxLjMzMzYyIDEwLjA4NjUgMS44MzM2MiAxMC4xODY1IDIuNDQ2OTVMMTAuMzMzMiAzLjMxMzYyXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi44ODY0NyAxMS4wMDA0SDkuMTA2NDdcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4zMzM1IDguMzMzMjVIOS42NjY4M1wiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtZmlsdGVyXCIgKGNsaWNrKT1cInN0YXJ0QWRkKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggMy4zMzMyNVYxMi42NjY2XCIgc3Ryb2tlPVwiIzAwN2JmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuMzMzMDEgOEgxMi42NjYzXCIgc3Ryb2tlPVwiIzAwN2JmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7J0FQUC5ORVdfTElTVF9WSUVXJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdOZXcgTGlzdCBWaWV3J319PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgICA8IS0tIFNLUzNNQVkyNSBBZGQgTmV3IExpc3QgVmlldy0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc01vZGFsT3BlblwiIGNsYXNzPVwibW9kYWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXItZGl2XCI+XG4gICAgICAgICAgICAgICAge3sgKGlzQWRkaW5nID8gJ0FQUC5BRERfTkVXX0xJU1RfVklFVycgOiAnQVBQLkVESVRfTElTVF9WSUVXJykgIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogKGlzQWRkaW5nID8gJ0FkZCBOZXcgTGlzdCBWaWV3JyA6ICdFZGl0IExpc3QgVmlldycpIH19IFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJlZGl0aW5nVmlld1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J0FQUC5OQU1FJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6J05hbWUnfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJOYW1lXCIgW3BsYWNlaG9sZGVyXT1cIidBUFAuRU5URVJfTElTVF9WSUVXX05BTUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIGxpc3QgdmlldyBuYW1lJ1wiIHJlcXVpcmVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVkaXRpbmdWaWV3LmdldCgnZmlsdGVyTmFtZScpPy5pbnZhbGlkICYmIChlZGl0aW5nVmlldy5nZXQoJ2ZpbHRlck5hbWUnKT8uZGlydHkgfHwgZWRpdGluZ1ZpZXcuZ2V0KCdmaWx0ZXJOYW1lJyk/LnRvdWNoZWQpXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FQUC5OQU1FX0lTX1JFUScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTmFtZSBpcyByZXF1aXJlZCd9fS5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydBUFAuT1JERVInIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ09yZGVyJ319OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cIm9yZGVyXCIgW3BsYWNlaG9sZGVyXT1cIiAnQVBQLkVOVEVSX0RJU1BMQVlfT1JERVInIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIGRpc3BsYXkgb3JkZXInXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGluZ1ZpZXcuZ2V0KCdvcmRlcicpPy5pbnZhbGlkICYmIChlZGl0aW5nVmlldy5nZXQoJ29yZGVyJyk/LmRpcnR5IHx8IGVkaXRpbmdWaWV3LmdldCgnb3JkZXInKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydBUFAuT1JERVJfSVNfUkVRX0FORF9CRV9BX05VTScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnT3JkZXIgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYSBudW1iZXInfX0uXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snQVBQLkRFRkFVTFRfVklFVycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGVmYXVsdCBWaWV3J319OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLXdyYXBwZXIgc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwiaXNEZWZhdWx0XCIgaWQ9XCJpc0RlZmF1bHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaXNEZWZhdWx0XCIgY2xhc3M9XCJ0b2dnbGUtYnV0dG9uXCI+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8aDM+e3snQVBQLkZJTFRFUlMnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0ZpbHRlcnMnfX08L2gzPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlY3Rpb24tZGVzY3JpcHRpb25cIj57eydBUFAuREVGSU5FX0NPTkRJVElPTlNfRk9SX0ZJTFRFUkVEX0xJU1RfVklFVycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGVmaW5lIGNvbmRpdGlvbnMgZm9yIGZpbHRlcmVkIGxpc3Qgdmlldyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJjb25kaXRpb25zXCIgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1jZWxsXCI+e3snQVBQLkNPTFVNTicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQ29sdW1uJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3BlcmF0b3ItY2VsbFwiPnt7J0FQUC5PUEVSQVRPUicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnT3BlcmF0b3InfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZS1jZWxsXCI+e3snQVBQLlZBTFVFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdWYWx1ZSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1jZWxsXCI+e3snQVBQLkFDVElPTicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWN0aW9uJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGNvbmRpdGlvbnMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJmaWx0ZXItcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdHZpZXctY3VzdG9tLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZmllbGRcIiBbdmFsdWVdPVwiZ2V0TGFiZWxCeUZpZWxkTmFtZShjb25kaXRpb25zLmF0KGkpLmdldCgnZmllbGQnKS52YWx1ZSlcIiAoZm9jdXMpPVwib25Gb2N1cygnZmllbGQnLCBpKVwiIChibHVyKT1cIm9uQmx1cignZmllbGQnLCBpKVwiIFtwbGFjZWhvbGRlcl09XCInQVBQLkVOVEVSX09SX1NFTEVDVF9DT0xVTU4nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIG9yIHNlbGVjdCBjb2x1bW4nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1saXN0XCIgKm5nSWY9XCJpc0NvbHVtbkRyb3Bkb3duT3BlbltpXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZ2V0RmlsdGVyZWRDb2x1bW5zKGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCdmaWVsZCcpLnZhbHVlKVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJzZWxlY3RPcHRpb24oJ2ZpZWxkJywgaSwgZmllbGQubGFiZWwpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmdldCgnZmllbGQnKT8uaW52YWxpZCAmJiAoZmlsdGVyLmdldCgnZmllbGQnKT8uZGlydHkgfHwgZmlsdGVyLmdldCgnZmllbGQnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQVBQLkNPTFVNTl9JU19SRVEnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0NvbHVtbiBpcyByZXF1aXJlZCd9fS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3BlcmF0b3ItY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0dmlldy1jdXN0b20tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRPcGVyYXRvckxhYmVsKGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCdvcGVyYXRvcicpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uT3BlcmF0b3JJbnB1dCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJ29wZXJhdG9yJywgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cignb3BlcmF0b3InLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBUFAuRU5URVJfT1JfU0VMRUNUX09QRVJBVE9SJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbnRlciBvciBzZWxlY3Qgb3BlcmF0b3InXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbGlzdFwiICpuZ0lmPVwiaXNPcGVyYXRvckRyb3Bkb3duT3BlbltpXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcGVyYXRvciBvZiBnZXRGaWx0ZXJlZE9wZXJhdG9ycyhvcGVyYXRvcklucHV0W2ldKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE9wdGlvbignb3BlcmF0b3InLCBpLCBvcGVyYXRvci52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wZXJhdG9yLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlci5nZXQoJ29wZXJhdG9yJyk/LmludmFsaWQgJiYgKGZpbHRlci5nZXQoJ29wZXJhdG9yJyk/LmRpcnR5IHx8IGZpbHRlci5nZXQoJ29wZXJhdG9yJyk/LnRvdWNoZWQpXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FQUC5PUEVSQVRPUl9JU19SRVEnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ09wZXJhdG9yIGlzIHJlcXVpcmVkJ319LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3R2aWV3LWN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCIgKGZvY3VzKT1cIm9uRm9jdXMoJ3ZhbHVlJywgaSlcIiAoYmx1cik9XCJvbkJsdXIoJ3ZhbHVlJywgaSlcIiBbcGxhY2Vob2xkZXJdPVwiJ0FQUC5FTlRFUl9PUl9TRUxFQ1RfVkFMVUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIG9yIHNlbGVjdCB2YWx1ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWxpc3RcIiAqbmdJZj1cImlzVmFsdWVEcm9wZG93bk9wZW5baV0gJiYgZ2V0UG9zc2libGVWYWx1ZXMoY29uZGl0aW9ucy5hdChpKS5nZXQoJ2ZpZWxkJykudmFsdWUsIGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCd2YWx1ZScpLnZhbHVlKT8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFsIG9mIGdldFBvc3NpYmxlVmFsdWVzKGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCdmaWVsZCcpLnZhbHVlLCBjb25kaXRpb25zLmF0KGkpLmdldCgndmFsdWUnKS52YWx1ZSlcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0T3B0aW9uKCd2YWx1ZScsIGksIHZhbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmdldCgndmFsdWUnKT8uaW52YWxpZCAmJiAoZmlsdGVyLmdldCgndmFsdWUnKT8uZGlydHkgfHwgZmlsdGVyLmdldCgndmFsdWUnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQVBQLlZBTFVFX0lTX1JFUVVJUkVEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdWYWx1ZSBpcyByZXF1aXJlZCd9fS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGljb24tY29udGFpbmVyXCIgW21hdFRvb2x0aXBdPVwiJ0FQUC5SRU1PVkUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1JlbW92ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjMzMzUgOC4zMzMyNUg5LjY2NjgzXCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWRkSWNvbkJvciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRGaWx0ZXIoKVwiIFttYXRUb29sdGlwXT1cIidBUFAuQUREX0ZJTFRFUicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWRkIEZpbHRlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkSWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCAzLjMzMzI1VjEyLjY2NjZcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy4zMzMwMSA4SDEyLjY2NjNcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7J0FQUC5BRERfRklMVEVSJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgRmlsdGVyJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8aDM+e3snQVBQLkNPTFVNTlMnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0NvbHVtbnMnfX08L2gzPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlY3Rpb24tZGVzY3JpcHRpb25cIj57eydBUFAuU0VMRUNUX0ZJRUxEX1RPX0RJU1BMQVlfSU5fVEFCTEUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NlbGVjdCBmaWVsZCB0byBkaXNwbGF5IGluIHRhYmxlJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImNvbHVtbnNcIiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZS1jZWxsXCI+e3snQVBQLkNPTFVNTl9OQU1FJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdDb2x1bW4gTmFtZSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb2wtY2VsbFwiPnt7J0FQUC5TT1JUQUJMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU29ydGFibGUnfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib29sLWNlbGxcIj57eydBUFAuRklMVEVSQUJMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOidGaWx0ZXJhYmxlJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWNlbGxcIj57eydBUFAuQUNUSU9OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBY3Rpb24nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBjb2x1bW5zLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiY29sdW1uLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hbWUtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0dmlldy1jdXN0b20tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygnY29sdW1uTmFtZScsIGkpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cignY29sdW1uTmFtZScsIGkpXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbk1hbnVhbElucHV0KCRldmVudC50YXJnZXQudmFsdWUsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBUFAuRU5URVJfT1JfU0VMRUNUX0NPTFVNTl9OQU1FJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbnRlciBvciBzZWxlY3QgY29sdW1uIG5hbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbGlzdFwiICpuZ0lmPVwiaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuW2ldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2xOYW1lIG9mIGdldENvbHVtbkNvbHVtbnMoY29sdW1ucy5hdChpKS5nZXQoJ25hbWUnKS52YWx1ZSlcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0T3B0aW9uKCdjb2x1bW5OYW1lJywgaSwgY29sTmFtZS5sYWJlbCk7IGlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbltpXSA9IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sTmFtZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC5nZXQoJ25hbWUnKT8uaW52YWxpZCAmJiAoZmllbGQuZ2V0KCduYW1lJyk/LmRpcnR5IHx8IGZpZWxkLmdldCgnbmFtZScpPy50b3VjaGVkKVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydBUFAuQ09MVU1OX05BTUVfSVNfUkVRJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdDb2x1bW4gbmFtZSBpcyByZXF1aXJlZCd9fS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9vbC1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZS13cmFwcGVyIHNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwiJ3NvcnRhYmxlLScgKyBpXCIgZm9ybUNvbnRyb2xOYW1lPVwic29ydGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ3NvcnRhYmxlLScgKyBpXCIgY2xhc3M9XCJ0b2dnbGUtYnV0dG9uXCI+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9vbC1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZS13cmFwcGVyIHNtYWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwiJ2ZpbHRlcmFibGUtJyArIGlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidmaWx0ZXJhYmxlLScgKyBpXCIgY2xhc3M9XCJ0b2dnbGUtYnV0dG9uXCI+PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGljb24tY29udGFpbmVyXCIgW21hdFRvb2x0aXBdPVwiJ0FQUC5SRU1PVkUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1JlbW92ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cInJlbW92ZUNvbHVtbihpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjMzMzUgOC4zMzMyNUg5LjY2NjgzXCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWRkSWNvbkJvciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb2x1bW4oKVwiIFttYXRUb29sdGlwXT1cIidBUFAuQUREX0NPTFVNTicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWRkIENvbHVtbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkSWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCAzLjMzMzI1VjEyLjY2NjZcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy4zMzMwMSA4SDEyLjY2NjNcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7J0FQUC5BRERfQ09MVU1OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgQ29sdW1uJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29uZGl0aW9ucy5sZW5ndGggPT09IDAgJiYgY29sdW1ucy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICB7eydBUFAuQVRfTEVBU1RfT05FX0ZJTFRFUl9PUl9PTkVfQ09MVU1OX0lTX1JFUScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnIEF0IGxlYXN0IG9uZSBmaWx0ZXIgb3Igb25lIGNvbHVtbiBpcyByZXF1aXJlZCd9fS5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2F2ZS1idXR0b25cIiAoY2xpY2spPVwic2F2ZSgpXCIgW2Rpc2FibGVkXT1cIiFlZGl0aW5nVmlldy52YWxpZCB8fCAoY29uZGl0aW9ucy5sZW5ndGggPT09IDAgJiYgY29sdW1ucy5sZW5ndGggPT09IDApXCI+e3snQVBQLlNBVkUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NhdmUnfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlTW9kYWwoKVwiPnt7J0FQUC5DQU5DRUwnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0NhbmNlbCd9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIFNLUzNNQVkyNSBEZWxldGUgTGlzdCBWaWV3LS0+XG4gICAgPGRpdiAqbmdJZj1cImlzRGVsZXRlTW9kYWxPcGVuXCIgY2xhc3M9XCJtb2RhbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgPGgyPnt7J0FQUC5ERUxFVEVfTElTVF9WSUVXJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdEZWxldGUgTGlzdCBWaWV3J319PC9oMj5cbiAgICAgICAgICAgIDxwPnt7J0FQUC5BUkVfWU9VX1NVUkVfWU9VX1dBTlRfVE9fREVMRVRFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlJ319IFwie3sgdmlld1RvRGVsZXRlPy5maWx0ZXJOYW1lIH19XCI/PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZGVsZXRlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZUNvbmZpcm1lZCgpXCI+e3snQVBQLkRFTEVURScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGVsZXRlJ319PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlRGVsZXRlTW9kYWwoKVwiPnt7J0FQUC5DQU5DRUwnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0NhbmNlbCd9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|
|
392
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9saXN0LXZpZXctZmlsdGVyL2xpc3Qtdmlldy1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC12aWV3LWZpbHRlci9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQStCN0QsTUFBTSxPQUFPLHVCQUF1QjtJQW1DZDtJQUF3QjtJQWxDbkMsU0FBUyxHQUFlLEVBQUUsQ0FBQztJQUMzQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFDM0IsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFDM0Isa0JBQWtCLEdBQXlEO1FBQ2xGLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBQyxTQUFTLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDMUQsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUMsU0FBUyxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQ2xFLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFDLFNBQVMsRUFBQyxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ3RFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBQyxTQUFTLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDaEUsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUMsU0FBUyxFQUFDLDJCQUEyQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7UUFDMUYsRUFBRSxLQUFLLEVBQUUseUJBQXlCLEVBQUMsU0FBUyxFQUFDLHdCQUF3QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7S0FDckYsQ0FBQyxDQUFFLHlEQUF5RDtJQUVuRCxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUVqRCxjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLFdBQVcsR0FBWSxLQUFLLENBQUM7SUFDN0IsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBQ25DLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsWUFBWSxHQUFvQixJQUFJLENBQUM7SUFFckMsV0FBVyxDQUFZO0lBRXZCLG9CQUFvQixHQUFjLEVBQUUsQ0FBQztJQUNyQyxzQkFBc0IsR0FBYyxFQUFFLENBQUM7SUFDdkMsbUJBQW1CLEdBQWMsRUFBRSxDQUFDO0lBQ3BDLHdCQUF3QixHQUFjLEVBQUUsQ0FBQztJQUN6QyxnQkFBZ0IsQ0FBUztJQUN6QixxQkFBcUIsQ0FBTTtJQUMzQixxQkFBcUIsQ0FBTTtJQUMzQix1QkFBdUIsQ0FBc0M7SUFDN0QsVUFBVSxDQUFZO0lBQ3RCLE9BQU8sQ0FBWTtJQUVuQixZQUFvQixFQUFlLEVBQVMsa0JBQTBDO1FBQWxFLE9BQUUsR0FBRixFQUFFLENBQWE7UUFBUyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXdCO1FBQ3BGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDL0IsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDckMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xCLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBQ3JELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQTtRQUM1RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixHQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtRQUNqRCxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBTyxFQUFFLEVBQUU7WUFDN0MsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFFLENBQUE7UUFDdEYsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMscUJBQXFCLEdBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFBO1FBQ2pELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFPLEVBQUUsRUFBRTtZQUM3QyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUUsQ0FBQTtRQUN0RixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUE7UUFDdEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQU8sRUFBRSxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBRSxDQUFBO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQWMsQ0FBQztRQUNsRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBYyxDQUFDO0lBQzlELENBQUM7SUFDRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFDckQsQ0FBQzthQUFLLENBQUM7WUFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFBO1FBQzVHLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBYyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFjLENBQUM7SUFDOUQsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDakMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDaEMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbkMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDakMsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDOUIsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDL0IsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztTQUNwQixDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsNERBQTREO0lBQzVELGNBQWMsQ0FBQyxJQUFTO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELFNBQVMsQ0FBQyxJQUFjLEVBQUUsS0FBYTtRQUNyQyxJQUFJLEtBQUs7WUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDMUIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDMUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO2dCQUNoRCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7YUFDM0MsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUdILElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3pDLElBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO3dCQUM5QixJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7d0JBQ3hDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO3dCQUNqQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztxQkFDdEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ04sQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztZQUMxQixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNO1lBQzdCLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTVCLHNFQUFzRTtRQUN0RSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUM5QixJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO2dCQUNwQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQzthQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxJQUFJO1FBQ0YsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3pDLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFDLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDMUMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDNUIsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO29CQUMzQixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7WUFDRixTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQzFDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQzdCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtvQkFDNUIsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxRQUFRLEdBQWE7Z0JBQ3pCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtnQkFDaEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVU7Z0JBQ3RELEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztnQkFDdEIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO2dCQUM5QixVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVU7Z0JBQ2hDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTzthQUMzQixDQUFDO1lBRUYsNEJBQTRCO1lBQzVCLHFDQUFxQztZQUNyQywyREFBMkQ7WUFDM0QsUUFBUTtZQUNSLElBQUk7WUFFSixtRkFBbUY7WUFDbkYsNEJBQTRCO1lBQzVCLHFEQUFxRDtZQUNyRCxXQUFXO1lBQ1gsbUNBQW1DO1lBQ25DLElBQUk7WUFFSixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxhQUFhLENBQUMsSUFBYyxFQUFFLEtBQWE7UUFDekMsSUFBSSxLQUFLO1lBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ2xHLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNmLG1DQUFtQztnQkFDbkMsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNuRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO29CQUNyRixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFDLFFBQVEsRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDO2dCQUN4RSxDQUFDO2dCQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBQyxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLGtCQUFrQixDQUFDLElBQVk7UUFDN0IsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUM3QyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUM3QyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFZO1FBQzNCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDN0MsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDN0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQ3ZDLENBQUM7SUFDSixDQUFDO0lBQ0EsZ0VBQWdFO0lBQ2hFLGlCQUFpQixDQUFDLEtBQWEsRUFBRSxJQUFZO1FBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUM5QixPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FDakUsQ0FBQztJQUNKLENBQUM7SUFDRCwwRUFBMEU7SUFDMUUsb0JBQW9CLENBQUMsSUFBWTtRQUMvQixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQy9DLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQ3BELFFBQVEsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUNELGFBQWEsR0FBYSxFQUFFLENBQUM7SUFFN0IsZUFBZSxDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhO1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQzFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxPQUFPLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDakMsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QyxDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN6QyxDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxNQUFNLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzNDLENBQUM7aUJBQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUMxQyxDQUFDO2lCQUFNLElBQUksSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUgsNEVBQTRFO0lBQzFFLFlBQVksQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEtBQWE7UUFDckQsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzNDLENBQUM7YUFBTSxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDN0MsQ0FBQzthQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBQ0QsbUJBQW1CLENBQUMsU0FBaUI7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDbEYsT0FBTyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFrQixFQUFFLEtBQWE7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDM0csSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0lBQ0QsaUZBQWlGO0lBRWpGLGVBQWUsQ0FBQyxLQUFVO1FBQ3hCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7d0dBN1hVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDRXQUp2QixDQUFDLHNCQUFzQixDQUFDLCtDQy9CckMsdXF2QkFxUk0sbzRNRHZQTSxZQUFZLCtQQUFFLFdBQVcsMnNDQUFFLG1CQUFtQix5aEJBQUUsc0JBQXNCLDBEQUFDLGdCQUFnQjs7NEZBS3RGLHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBQyxnQkFBZ0IsQ0FBQyxhQUN2RixDQUFDLHNCQUFzQixDQUFDO3FIQUsxQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBU0ksWUFBWTtzQkFBckIsTUFBTTtnQkF5V1AsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1BcnJheSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE54dEN1c3RvbVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlL2N1c3RvbS10cmFuc2xhdGUucGlwZSc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmludGVyZmFjZSBMaXN0VmlldyB7XG4gIGZpbHRlck5hbWU6IHN0cmluZztcbiAgbGFiZWxQYXRoOiBhbnk7XG4gIG9yZGVyOiBudW1iZXI7XG4gIGlzRGVmYXVsdDogYm9vbGVhbjtcbiAgY29uZGl0aW9uczogTGlzdFZpZXdGaWx0ZXJbXTtcbiAgY29sdW1uczogTGlzdFZpZXdDb2x1bW5bXTtcbn1cblxuaW50ZXJmYWNlIExpc3RWaWV3RmlsdGVyIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgb3BlcmF0b3I6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIExpc3RWaWV3Q29sdW1uIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzb3J0YWJsZTogYm9vbGVhbjtcbiAgZmlsdGVyYWJsZTogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxpc3Qtdmlldy1maWx0ZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSxNYXRUb29sdGlwTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC12aWV3LWZpbHRlci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTGlzdFZpZXdGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBsaXN0Vmlld3M6IExpc3RWaWV3W10gPSBbXTtcbiAgQElucHV0KCkgdGFibGVGaWx0ZXJBcnJheTogYW55ID0gW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmlldzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGRpc3BsYXllZENvbHVtbnM6IGFueSA9IFtdO1xuICBASW5wdXQoKSBhdmFpbGFibGVPcGVyYXRvcnM6IHsgbGFiZWw6IHN0cmluZyxsYWJlbFBhdGg6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9W10gPSBbXG4gICAgeyBsYWJlbDogJ0VxdWFscyAoPSknLGxhYmVsUGF0aDonQVBQLkVRVUFMUycsIHZhbHVlOiAnPScgfSxcbiAgICB7IGxhYmVsOiAnTm90IEVxdWFsICghPSknLGxhYmVsUGF0aDonQVBQLk5PVF9FUVVBTCcsIHZhbHVlOiAnIT0nIH0sXG4gICAgeyBsYWJlbDogJ0dyZWF0ZXIgVGhhbiAoPiknLGxhYmVsUGF0aDonQVBQLkdSRUFURVJfVEhBTicsIHZhbHVlOiAnPicgfSxcbiAgICB7IGxhYmVsOiAnTGVzcyBUaGFuICg8KScsbGFiZWxQYXRoOidBUFAuTEVTU19USEFOJywgdmFsdWU6ICc8JyB9LFxuICAgIHsgbGFiZWw6ICdHcmVhdGVyIFRoYW4gb3IgRXF1YWwgKD49KScsbGFiZWxQYXRoOidBUFAuR1JFQVRFUl9USEFOX09SX0VRVUFMJywgdmFsdWU6ICc+PScgfSxcbiAgICB7IGxhYmVsOiAnTGVzcyBUaGFuIG9yIEVxdWFsICg8PSknLGxhYmVsUGF0aDonQVBQLkxFU1NfVEhBTl9PUl9FUVVBTCcsIHZhbHVlOiAnPD0nIH1cbiAgXTsgIC8vICdjb250YWlucycsICdub3QgY29udGFpbnMnLCAnc3RhcnRzIHdpdGgnLCAnZW5kcyB3aXRoJ1xuXG4gIEBPdXRwdXQoKSBsaXN0Vmlld0VtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBpc0Ryb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc01vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0RlbGV0ZU1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0FkZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICB2aWV3VG9EZWxldGU6IExpc3RWaWV3IHwgbnVsbCA9IG51bGw7XG5cbiAgZWRpdGluZ1ZpZXc6IEZvcm1Hcm91cDtcblxuICBpc0NvbHVtbkRyb3Bkb3duT3BlbjogYm9vbGVhbltdID0gW107XG4gIGlzT3BlcmF0b3JEcm9wZG93bk9wZW46IGJvb2xlYW5bXSA9IFtdO1xuICBpc1ZhbHVlRHJvcGRvd25PcGVuOiBib29sZWFuW10gPSBbXTtcbiAgaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuOiBib29sZWFuW10gPSBbXTtcbiAgc2VsZWN0ZWRWaWV3UGF0aDogc3RyaW5nO1xuICB0YWJsZUZpbHRlckFycmF5VHJhbnM6IGFueTtcbiAgZGlzcGxheWVkQ29sdW1uc1RyYW5zOiBhbnk7XG4gIGF2YWlsYWJsZU9wZXJhdG9yc1RyYW5zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IH1bXTtcbiAgY29uZGl0aW9uczogRm9ybUFycmF5O1xuICBjb2x1bW5zOiBGb3JtQXJyYXk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIscHJpdmF0ZSBueHRDdXN0b21UcmFuc2xhdGU6IE54dEN1c3RvbVRyYW5zbGF0ZVBpcGUpIHtcbiAgICB0aGlzLmVkaXRpbmdWaWV3ID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBmaWx0ZXJOYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgb3JkZXI6IFswLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldXSxcbiAgICAgIGlzRGVmYXVsdDogW2ZhbHNlXSxcbiAgICAgIGNvbmRpdGlvbnM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgY29sdW1uczogdGhpcy5mYi5hcnJheShbXSlcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRWaWV3ICYmIHRoaXMubGlzdFZpZXdzPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHRoaXMubGlzdFZpZXdzWzBdLmZpbHRlck5hbWU7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld1BhdGggPSB0aGlzLmxpc3RWaWV3c1swXS5sYWJlbFBhdGhcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXdQYXRoID0gdGhpcy5zZWxlY3RlZFZpZXcgPT09ICdBbGwgRGF0YScgPyB0aGlzLmxpc3RWaWV3c1swXS5sYWJlbFBhdGggOiB0aGlzLnNlbGVjdGVkVmlld1xuICAgIH1cbiAgICB0aGlzLnRhYmxlRmlsdGVyQXJyYXlUcmFucyA9dGhpcy50YWJsZUZpbHRlckFycmF5XG4gICAgdGhpcy50YWJsZUZpbHRlckFycmF5VHJhbnMuZm9yRWFjaCgoZWxlOmFueSkgPT4ge1xuICAgICAgZWxlLmxhYmVsID0gdGhpcy5ueHRDdXN0b21UcmFuc2xhdGUudHJhbnNmb3JtKGVsZS5sYWJlbFBhdGggfHwgZWxlLmxhYmVsLGVsZS5sYWJlbCApXG4gICAgfSk7XG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zVHJhbnMgPXRoaXMuZGlzcGxheWVkQ29sdW1uc1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1uc1RyYW5zLmZvckVhY2goKGVsZTphbnkpID0+IHtcbiAgICAgIGVsZS5sYWJlbCA9IHRoaXMubnh0Q3VzdG9tVHJhbnNsYXRlLnRyYW5zZm9ybShlbGUubGFiZWxQYXRoIHx8IGVsZS5sYWJlbCxlbGUubGFiZWwgKVxuICAgIH0pO1xuICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzVHJhbnMgPSB0aGlzLmF2YWlsYWJsZU9wZXJhdG9yc1xuICAgIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzVHJhbnMuZm9yRWFjaCgoZWxlOmFueSkgPT4ge1xuICAgICAgZWxlLmxhYmVsID0gdGhpcy5ueHRDdXN0b21UcmFuc2xhdGUudHJhbnNmb3JtKGVsZS5sYWJlbFBhdGggfHwgZWxlLmxhYmVsLGVsZS5sYWJlbCApXG4gICAgfSk7XG4gICAgdGhpcy5jb25kaXRpb25zID0gdGhpcy5lZGl0aW5nVmlldy5nZXQoJ2NvbmRpdGlvbnMnKSBhcyBGb3JtQXJyYXk7XG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5lZGl0aW5nVmlldy5nZXQoJ2NvbHVtbnMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFZpZXcgJiYgdGhpcy5saXN0Vmlld3M/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdGhpcy5saXN0Vmlld3NbMF0uZmlsdGVyTmFtZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3UGF0aCA9IHRoaXMubGlzdFZpZXdzWzBdLmxhYmVsUGF0aFxuICAgIH1lbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3UGF0aCA9IHRoaXMuc2VsZWN0ZWRWaWV3ID09PSAnQWxsIERhdGEnID8gdGhpcy5saXN0Vmlld3NbMF0ubGFiZWxQYXRoIDogdGhpcy5zZWxlY3RlZFZpZXdcbiAgICB9XG4gICAgdGhpcy5jb25kaXRpb25zID0gdGhpcy5lZGl0aW5nVmlldy5nZXQoJ2NvbmRpdGlvbnMnKSBhcyBGb3JtQXJyYXk7XG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5lZGl0aW5nVmlldy5nZXQoJ2NvbHVtbnMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgQWRkcyBhIG5ldyBmaWx0ZXIgY29uZGl0aW9uIHRvIHRoZSBmb3JtXG4gIGFkZEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZpZWxkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgb3BlcmF0b3I6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgIH0pKTtcbiAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuLnB1c2goZmFsc2UpO1xuICAgIHRoaXMuaXNPcGVyYXRvckRyb3Bkb3duT3Blbi5wdXNoKGZhbHNlKTtcbiAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW4ucHVzaChmYWxzZSk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgUmVtb3ZlcyBhIGZpbHRlciBjb25kaXRpb24gYnkgaW5kZXhcbiAgcmVtb3ZlRmlsdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbnMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuaXNDb2x1bW5Ecm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBzb3J0YWJsZTogW2ZhbHNlXSxcbiAgICAgIGZpbHRlcmFibGU6IFtmYWxzZV1cbiAgICB9KSk7XG4gICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW4ucHVzaChmYWxzZSk7XG4gIH1cblxuICByZW1vdmVDb2x1bW4oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29sdW1ucy5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoe1wiYWN0aW9uXCI6ICdmaWx0ZXJHZXQnfSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzRHJvcGRvd25PcGVuO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IEhhbmRsZXMgc2VsZWN0aW5nIGEgbGlzdCB2aWV3IGZyb20gdGhlIGRyb3Bkb3duXG4gIHNlbGVjdExpc3RWaWV3KHZpZXc6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdmlldy5maWx0ZXJOYW1lO1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3UGF0aCA9IHZpZXcubGFiZWxQYXRoIHx8IHZpZXcuZmlsdGVyTmFtZTtcbiAgICB0aGlzLmxpc3RWaWV3RW1pdC5lbWl0KHsnYWN0aW9uJzonc2VsZWN0JywgJ2RhdGEnOnZpZXd9KTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgT3BlbnMgbW9kYWwgdG8gZWRpdCBhbiBleGlzdGluZyBsaXN0IHZpZXdcbiAgc3RhcnRFZGl0KHZpZXc6IExpc3RWaWV3LCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuaXNBZGRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzTW9kYWxPcGVuID0gdHJ1ZTtcblxuICAgIHRoaXMuZWRpdGluZ1ZpZXcucmVzZXQoKTtcbiAgICB3aGlsZSAodGhpcy5jb25kaXRpb25zLmxlbmd0aCkgdGhpcy5jb25kaXRpb25zLnJlbW92ZUF0KDApO1xuICAgIHdoaWxlICh0aGlzLmNvbHVtbnMubGVuZ3RoKSB0aGlzLmNvbHVtbnMucmVtb3ZlQXQoMCk7XG5cbiAgICB0aGlzLmVkaXRpbmdWaWV3LnBhdGNoVmFsdWUoe1xuICAgICAgZmlsdGVyTmFtZTogdmlldy5maWx0ZXJOYW1lLFxuICAgICAgb3JkZXI6IHZpZXcub3JkZXIsXG4gICAgICBpc0RlZmF1bHQ6IHZpZXcuaXNEZWZhdWx0XG4gICAgfSk7XG5cbiAgICB2aWV3Py5jb25kaXRpb25zPy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICB0aGlzLmNvbmRpdGlvbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgZmllbGQ6IFtmaWx0ZXIuZmllbGQsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBvcGVyYXRvcjogW2ZpbHRlci5vcGVyYXRvciwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHZhbHVlOiBbZmlsdGVyLnZhbHVlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgXG4gICAgdmlldz8uY29sdW1ucz8uZm9yRWFjaChjb2wgPT4ge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zVHJhbnMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmKGNvbC5uYW1lID09IGZpZWxkLmZpZWxkTmFtZSkge1xuICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgbmFtZTogW2ZpZWxkLmxhYmVsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIHNvcnRhYmxlOiBbY29sLnNvcnRhYmxlIHx8IGZhbHNlXSxcbiAgICAgICAgICAgIGZpbHRlcmFibGU6IFtjb2wuZmlsdGVyYWJsZSB8fCBmYWxzZV1cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxuICAvLyBTS1MzTUFZMjUgT3BlbnMgbW9kYWwgdG8gY3JlYXRlIGEgbmV3IGxpc3Qgdmlld1xuICBzdGFydEFkZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQWRkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmlzTW9kYWxPcGVuID0gdHJ1ZTtcblxuICAgIHRoaXMuZWRpdGluZ1ZpZXcucmVzZXQoKTtcbiAgICB3aGlsZSAodGhpcy5jb25kaXRpb25zLmxlbmd0aCkgdGhpcy5jb25kaXRpb25zLnJlbW92ZUF0KDApO1xuICAgIHdoaWxlICh0aGlzLmNvbHVtbnMubGVuZ3RoKSB0aGlzLmNvbHVtbnMucmVtb3ZlQXQoMCk7XG5cbiAgICB0aGlzLmVkaXRpbmdWaWV3LnBhdGNoVmFsdWUoe1xuICAgICAgb3JkZXI6IHRoaXMubGlzdFZpZXdzPy5sZW5ndGgsXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gICAgLy8gU0tTMjZNQVkyNSBTZWNvbmQgbG9vcDogZnJvbSBkaXNwbGF5ZWRDb2x1bW5zVHJhbnMsIHNraXAgZHVwbGljYXRlc1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1uc1RyYW5zLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zLnB1c2godGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG5hbWU6IFtmaWVsZC5sYWJlbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHNvcnRhYmxlOiBbZmllbGQuaHlwZXJMaW5rIHx8IGZhbHNlXSxcbiAgICAgICAgZmlsdGVyYWJsZTogW2ZpZWxkLmZpbHRlciB8fCBmYWxzZV1cbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBTYXZlcyB0aGUgY3VycmVudGx5IGVkaXRlZCBvciBhZGRlZCBsaXN0IHZpZXdcbiAgc2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nVmlldy52YWxpZCkge1xuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5lZGl0aW5nVmlldy52YWx1ZTtcbiAgICAgIGZvcm1WYWx1ZT8uY29sdW1ucz8uZm9yRWFjaCgoY29sKT0+e1xuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnNUcmFucy5mb3JFYWNoKChkQ29sKSA9PiB7XG4gICAgICAgICAgaWYgKGRDb2wubGFiZWwgPT09IGNvbC5uYW1lKSB7XG4gICAgICAgICAgICBjb2wubmFtZSA9IGRDb2wuZmllbGROYW1lXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIGZvcm1WYWx1ZT8uY29uZGl0aW9ucz8uZm9yRWFjaCgoY29sKT0+e1xuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnNUcmFucy5mb3JFYWNoKChkQ29sKSA9PiB7XG4gICAgICAgICAgaWYgKGRDb2wubGFiZWwgPT09IGNvbC5maWVsZCkge1xuICAgICAgICAgICAgY29sLmZpZWxkID0gZENvbC5maWVsZE5hbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgY29uc3QgbGlzdFZpZXc6IExpc3RWaWV3ID0ge1xuICAgICAgICBmaWx0ZXJOYW1lOiBmb3JtVmFsdWUuZmlsdGVyTmFtZSxcbiAgICAgICAgbGFiZWxQYXRoOiBmb3JtVmFsdWUubGFiZWxQYXRoIHx8IGZvcm1WYWx1ZS5maWx0ZXJOYW1lLFxuICAgICAgICBvcmRlcjogZm9ybVZhbHVlLm9yZGVyLFxuICAgICAgICBpc0RlZmF1bHQ6IGZvcm1WYWx1ZS5pc0RlZmF1bHQsXG4gICAgICAgIGNvbmRpdGlvbnM6IGZvcm1WYWx1ZS5jb25kaXRpb25zLFxuICAgICAgICBjb2x1bW5zOiBmb3JtVmFsdWUuY29sdW1uc1xuICAgICAgfTtcblxuICAgICAgLy8gaWYgKGxpc3RWaWV3LmlzRGVmYXVsdCkge1xuICAgICAgLy8gICB0aGlzLmxpc3RWaWV3cy5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgLy8gICAgIGlmICh2aWV3LmlkICE9PSBsaXN0Vmlldy5pZCkgdmlldy5pc0RlZmF1bHQgPSBmYWxzZTtcbiAgICAgIC8vICAgfSk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIGNvbnN0IGV4aXN0aW5nSW5kZXggPSB0aGlzLmxpc3RWaWV3cy5maW5kSW5kZXgodmlldyA9PiB2aWV3LmlkID09PSBsaXN0Vmlldy5pZCk7XG4gICAgICAvLyBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKSB7XG4gICAgICAvLyAgIHRoaXMubGlzdFZpZXdzW2V4aXN0aW5nSW5kZXhdID0geyAuLi5saXN0VmlldyB9O1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgdGhpcy5saXN0Vmlld3MucHVzaChsaXN0Vmlldyk7XG4gICAgICAvLyB9XG5cbiAgICAgIHRoaXMubGlzdFZpZXdzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gbGlzdFZpZXcuZmlsdGVyTmFtZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3UGF0aCA9IGxpc3RWaWV3LmxhYmVsUGF0aCB8fCBsaXN0Vmlldy5maWx0ZXJOYW1lO1xuICAgICAgdGhpcy5saXN0Vmlld0VtaXQuZW1pdCh7J2FjdGlvbic6J3NhdmUnLCBcImRhdGFcIjogbGlzdFZpZXd9KTtcbiAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IE9wZW5zIGNvbmZpcm1hdGlvbiBtb2RhbCB0byBkZWxldGUgYSBsaXN0IHZpZXdcbiAgY29uZmlybURlbGV0ZSh2aWV3OiBMaXN0VmlldywgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy52aWV3VG9EZWxldGUgPSB2aWV3O1xuICAgIHRoaXMuaXNEZWxldGVNb2RhbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBDbG9zZXMgdGhlIGRlbGV0ZSBjb25maXJtYXRpb24gbW9kYWxcbiAgY2xvc2VEZWxldGVNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGVsZXRlTW9kYWxPcGVuID0gZmFsc2U7XG4gICAgdGhpcy52aWV3VG9EZWxldGUgPSBudWxsO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IERlbGV0ZXMgdGhlIHNlbGVjdGVkIGxpc3QgdmlldyBhZnRlciBjb25maXJtYXRpb25cbiAgZGVsZXRlQ29uZmlybWVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXdUb0RlbGV0ZSkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RWaWV3cy5maW5kSW5kZXgodmlldyA9PiB2aWV3LmZpbHRlck5hbWUgPT09IHRoaXMudmlld1RvRGVsZXRlPy5maWx0ZXJOYW1lKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHRoaXMubGlzdFZpZXdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVmlldyA9PT0gdGhpcy52aWV3VG9EZWxldGUuZmlsdGVyTmFtZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdGhpcy5saXN0Vmlld3M/Lmxlbmd0aCA+IDAgPyB0aGlzLmxpc3RWaWV3c1swXS5maWx0ZXJOYW1lIDogJyc7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXdQYXRoID0gdGhpcy5saXN0Vmlld3M/Lmxlbmd0aCA+IDAgPyB0aGlzLmxpc3RWaWV3c1swXS5sYWJlbFBhdGggOiAnJyBcbiAgICAgICAgICB0aGlzLmxpc3RWaWV3RW1pdC5lbWl0KHsnYWN0aW9uJzonc2VsZWN0JywgJ2RhdGEnOnRoaXMuc2VsZWN0ZWRWaWV3fSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0Vmlld0VtaXQuZW1pdCh7J2FjdGlvbic6ICdkZWxldGUnLCBcImRhdGFcIjogdGhpcy52aWV3VG9EZWxldGV9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xvc2VEZWxldGVNb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBSZXR1cm5zIGZpbHRlcmVkIGxpc3Qgb2YgY29sdW1ucyBiYXNlZCBvbiBpbnB1dCBzZWFyY2ggdGVybVxuICBnZXRGaWx0ZXJlZENvbHVtbnModGVybTogc3RyaW5nKTogYW55W10ge1xuICAgIGlmICghdGVybSkgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJBcnJheVRyYW5zO1xuICAgIHRlcm0gPSB0ZXJtLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJBcnJheVRyYW5zLmZpbHRlcihjb2wgPT5cbiAgICAgIGNvbC5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pXG4gICAgKTtcbiAgfVxuXG4gIGdldENvbHVtbkNvbHVtbnModGVybTogc3RyaW5nKTogYW55W10ge1xuICAgIGlmICghdGVybSkgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1uc1RyYW5zO1xuICAgIHRlcm0gPSB0ZXJtLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1uc1RyYW5zLmZpbHRlcihjb2wgPT5cbiAgICAgIGNvbC5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pXG4gICAgKTtcbiAgfSAgXG4gICAvLyBTS1MzTUFZMjUgUmV0dXJucyBwb3NzaWJsZSB2YWx1ZXMgZm9yIGEgc2VsZWN0ZWQgZmllbGQvY29sdW1uXG4gICBnZXRQb3NzaWJsZVZhbHVlcyhmaWVsZDogc3RyaW5nLCB0ZXJtOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLnRhYmxlRmlsdGVyQXJyYXlUcmFucy5maW5kKGNvbCA9PiBjb2wubGFiZWwgPT09IGZpZWxkKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFBcnJheS5pc0FycmF5KG1hdGNoLnZhbHVlKSkgcmV0dXJuIFtdO1xuICAgIGlmICghdGVybSkgcmV0dXJuIG1hdGNoLnZhbHVlO1xuICAgIGNvbnN0IGxvd2VyVGVybSA9IHRlcm0udG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbWF0Y2gudmFsdWUuZmlsdGVyKHZhbCA9PlxuICAgICAgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJUZXJtKVxuICAgICk7XG4gIH0gIFxuICAvLyBTS1MzTUFZMjUgUmV0dXJucyBmaWx0ZXJlZCBsaXN0IG9mIG9wZXJhdG9ycyBiYXNlZCBvbiBpbnB1dCBzZWFyY2ggdGVybVxuICBnZXRGaWx0ZXJlZE9wZXJhdG9ycyh0ZXJtOiBzdHJpbmcpOiB7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICBpZiAoIXRlcm0pIHJldHVybiB0aGlzLmF2YWlsYWJsZU9wZXJhdG9yc1RyYW5zO1xuICAgIHRlcm0gPSB0ZXJtLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzVHJhbnMuZmlsdGVyKG9wZXJhdG9yID0+XG4gICAgICBvcGVyYXRvci5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pXG4gICAgKTtcbiAgfSAgXG4gIG9wZXJhdG9ySW5wdXQ6IHN0cmluZ1tdID0gW107XG5cbiAgb25PcGVyYXRvcklucHV0KHZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm9wZXJhdG9ySW5wdXRbaW5kZXhdID0gdmFsdWU7XG4gIH1cbiAgXG4gIGdldE9wZXJhdG9yTGFiZWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZm91bmQgPSB0aGlzLmF2YWlsYWJsZU9wZXJhdG9yc1RyYW5zLmZpbmQob3AgPT4gb3AudmFsdWUgPT09IHZhbHVlKTtcbiAgICByZXR1cm4gZm91bmQgPyBmb3VuZC5sYWJlbCA6IHZhbHVlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IE9wZW5zIGEgZHJvcGRvd24gb24gZm9jdXMgZm9yIHRoZSBnaXZlbiBpbnB1dCB0eXBlIGFuZCBpbmRleFxuICBvbkZvY3VzKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnZmllbGQnKSB7XG4gICAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuW2luZGV4XSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BlcmF0b3InKSB7XG4gICAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW5baW5kZXhdID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd2YWx1ZScpIHtcbiAgICAgIHRoaXMuaXNWYWx1ZURyb3Bkb3duT3BlbltpbmRleF0gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbHVtbk5hbWUnKSB7XG4gICAgICB0aGlzLmlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbltpbmRleF0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBEZWxheXMgY2xvc2luZyBkcm9wZG93biB0byBhbGxvdyBzZWxlY3Rpb24gb24gYmx1clxuICBvbkJsdXIodHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodHlwZSA9PT0gJ2ZpZWxkJykge1xuICAgICAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BlcmF0b3InKSB7XG4gICAgICAgIHRoaXMuaXNPcGVyYXRvckRyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjb2x1bW5OYW1lJykge1xuICAgICAgICB0aGlzLmlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCAyMDApO1xuICB9XG5cbi8vIFNLUzNNQVkyNSBTZXRzIHNlbGVjdGVkIHZhbHVlIGluIHRoZSBmb3JtIGNvbnRyb2wgYW5kIGNsb3NlcyB0aGUgZHJvcGRvd25cbiAgc2VsZWN0T3B0aW9uKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnZmllbGQnKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbnMuYXQoaW5kZXgpLmdldCgnZmllbGQnKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5pc0NvbHVtbkRyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGVyYXRvcicpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9ucy5hdChpbmRleCkuZ2V0KCdvcGVyYXRvcicpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAndmFsdWUnKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbnMuYXQoaW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5pc1ZhbHVlRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbHVtbk5hbWUnKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuYXQoaW5kZXgpLmdldCgnbmFtZScpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZ2V0TGFiZWxCeUZpZWxkTmFtZShmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRpc3BsYXllZENvbHVtbnNUcmFucy5maW5kKGNvbCA9PiBjb2wuZmllbGROYW1lID09PSBmaWVsZE5hbWUpO1xuICAgIHJldHVybiBtYXRjaD8ubGFiZWwgPyBtYXRjaC5sYWJlbCA6IGZpZWxkTmFtZTtcbiAgfVxuXG4gIG9uTWFudWFsSW5wdXQoaW5wdXRWYWx1ZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRpc3BsYXllZENvbHVtbnNUcmFucy5maW5kKGNvbCA9PiBjb2wubGFiZWwudG9Mb3dlckNhc2UoKSA9PT0gaW5wdXRWYWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5hdChpbmRleCkuZ2V0KCduYW1lJykuc2V0VmFsdWUobWF0Y2gubGFiZWwpO1xuICAgIH1cbiAgfSAgICBcbiAgLy8gU0tTM01BWTI1IExpc3RlbnMgdG8gZG9jdW1lbnQgY2xpY2sgYW5kIGNsb3NlcyB0aGUgZHJvcGRvd24gaWYgY2xpY2tlZCBvdXRzaWRlXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCF0YXJnZXQuY2xvc2VzdCgnLmxpc3Qtdmlldy1maWx0ZXInKSkge1xuICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJsaXN0LXZpZXctZmlsdGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsXCI+e3snQVBQLkRBVEFfUkVMQVRFRF9UTycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGF0YSBSZWxhdGVkIHRvJ319PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImZpbHRlci1pY29uXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiNVwiIGZpbGw9XCIjRjFGMUYxXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuNTEyODggNC41SDEyLjE4NzlDMTIuNzQyOSA0LjUgMTMuMjAwNCA0Ljk1NzUgMTMuMjAwNCA1LjUxMjVWNi42MjI0OUMxMy4yMDA0IDcuMDI3NDkgMTIuOTQ1NCA3LjUzIDEyLjY5NzkgNy43ODVMMTAuNTIyOSA5LjcwNUMxMC4yMjI5IDkuOTYgMTAuMDIwNCAxMC40NjI1IDEwLjAyMDQgMTAuODY3NVYxMy4wNDI1QzEwLjAyMDQgMTMuMzQyNSA5LjgxNzkgMTMuNzQ3NSA5LjU2MjkgMTMuOTA1TDguODU3ODkgMTQuMzYyNUM4LjE5Nzg5IDE0Ljc2NzUgNy4yOTAzNyAxNC4zMSA3LjI5MDM3IDEzLjVWMTAuODIyNUM3LjI5MDM3IDEwLjQ3IDcuMDg3ODkgMTAuMDEyNSA2Ljg4NTM5IDkuNzU3NTFMNC45NjUzOSA3LjczMjVDNC43MTAzOSA3LjQ3NzUgNC41MDc5IDcuMDI3NDkgNC41MDc5IDYuNzE5OTlWNS41NTc1QzQuNTAwNCA0Ljk1NzUgNC45NTc4OCA0LjUgNS41MTI4OCA0LjVaXCIgc3Ryb2tlPVwiIzI5MkQzMlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMTBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC41IDExLjk5OTlWMTQuMjQ5OUM0LjUgMTcuOTk5OSA2IDE5LjQ5OTkgOS43NSAxOS40OTk5SDE0LjI1QzE4IDE5LjQ5OTkgMTkuNSAxNy45OTk5IDE5LjUgMTQuMjQ5OVY5Ljc0OTk0QzE5LjUgNy40MDk5NCAxOC45MTUgNS45Mzk5MyAxNy41NTc1IDUuMTc0OTNDMTcuMTc1IDQuOTU3NDMgMTYuNDEgNC43OTI0MyAxNS43MTI1IDQuNjc5OTNcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjc1IDEyLjc1SDE2LjVcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTExLjI1IDE1Ljc1SDE2LjVcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1vcHRpb25cIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VsZWN0ZWRWaWV3ID8gKHNlbGVjdGVkVmlld1BhdGggfHwgc2VsZWN0ZWRWaWV3IHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogc2VsZWN0ZWRWaWV3KSAgOiAoJ0FQUC5TRUxFQ1RfQV9WSUVXJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTZWxlY3QgYSB2aWV3JykgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjaGV2cm9uLWljb25cIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5Ljk5OTkgMjUuNjY2N0MyMy42ODE4IDI1LjY2NjcgMjYuNjY2NiAyMi42ODE5IDI2LjY2NjYgMTlDMjYuNjY2NiAxNS4zMTgxIDIzLjY4MTggMTIuMzMzNCAxOS45OTk5IDEyLjMzMzRDMTYuMzE4IDEyLjMzMzQgMTMuMzMzMyAxNS4zMTgxIDEzLjMzMzMgMTlDMTMuMzMzMyAyMi42ODE5IDE2LjMxOCAyNS42NjY3IDE5Ljk5OTkgMjUuNjY2N1pcIiBmaWxsPVwiIzI5MkQzMlwiIHN0cm9rZT1cIiMyOTJEMzJcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNjQ2NyAxOC4xNkwyMC4wMDAxIDIwLjUwNjdMMjIuMzUzNCAxOC4xNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU0tTM01BWTI1IGxpc3QgdmlldyBEcm9wIGRvd24tLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzRHJvcGRvd25PcGVuXCIgY2xhc3M9XCJkcm9wZG93bi1vcHRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tb3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgdmlldyBvZiBsaXN0Vmlld3NcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic2VsZWN0ZWRWaWV3ID09PSB2aWV3LmZpbHRlck5hbWVcIiAoY2xpY2spPVwic2VsZWN0TGlzdFZpZXcodmlldylcIiBjbGFzcz1cImxpc3Qtdmlldy1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1uYW1lXCI+e3sgdmlldy5sYWJlbFBhdGggfHwgdmlldy5maWx0ZXJOYW1lIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogdmlldy5maWx0ZXJOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtaWNvblwiIChjbGljayk9XCJzdGFydEVkaXQodmlldywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzI5MjMgMy45ODcyNkwxMi4wMTI2IDYuNjcwNTlNOS4zMjkyMyAzLjk4NzI2TDIuNTAwMDggMTAuODE2NFYxMy40OTk3SDUuMTgzNDJMMTIuMDEyNiA2LjY3MDU5TTkuMzI5MjMgMy45ODcyNkwxMi4wMTI2IDEuMzAzOTJMMTQuNjk1OSAzLjk4NzI2TDEyLjAxMjYgNi42NzA1OVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cImNvbmZpcm1EZWxldGUodmlldywgJGV2ZW50KVwiICpuZ0lmPVwibGlzdFZpZXdzLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuNjY2NSAzLjMxMzYyTDUuODEzMTcgMi40NDAyOEM1LjkxOTg0IDEuODA2OTUgNS45OTk4NCAxLjMzMzYyIDcuMTI2NSAxLjMzMzYySDguODczMTdDOS45OTk4NCAxLjMzMzYyIDEwLjA4NjUgMS44MzM2MiAxMC4xODY1IDIuNDQ2OTVMMTAuMzMzMiAzLjMxMzYyXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4zMzM1IDguMzMzMjVIOS42NjY4M1wiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZC1maWx0ZXJcIiAoY2xpY2spPVwic3RhcnRBZGQoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCAzLjMzMzI1VjEyLjY2NjZcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy4zMzMwMSA4SDEyLjY2NjNcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3snQVBQLk5FV19MSVNUX1ZJRVcnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ05ldyBMaXN0IFZpZXcnfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgIDwhLS0gU0tTM01BWTI1IEFkZCBOZXcgTGlzdCBWaWV3LS0+XG4gICAgPGRpdiAqbmdJZj1cImlzTW9kYWxPcGVuXCIgY2xhc3M9XCJtb2RhbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICB7eyAoaXNBZGRpbmcgPyAnQVBQLkFERF9ORVdfTElTVF9WSUVXJyA6ICdBUFAuRURJVF9MSVNUX1ZJRVcnKSAgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAoaXNBZGRpbmcgPyAnQWRkIE5ldyBMaXN0IFZpZXcnIDogJ0VkaXQgTGlzdCBWaWV3JykgfX0gXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zZVwiIChjbGljayk9XCJjbG9zZU1vZGFsKClcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImVkaXRpbmdWaWV3XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3snQVBQLk5BTUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDonTmFtZSd9fTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImZpbHRlck5hbWVcIiBbcGxhY2Vob2xkZXJdPVwiJ0FQUC5FTlRFUl9MSVNUX1ZJRVdfTkFNRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgbGlzdCB2aWV3IG5hbWUnXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGluZ1ZpZXcuZ2V0KCdmaWx0ZXJOYW1lJyk/LmludmFsaWQgJiYgKGVkaXRpbmdWaWV3LmdldCgnZmlsdGVyTmFtZScpPy5kaXJ0eSB8fCBlZGl0aW5nVmlldy5nZXQoJ2ZpbHRlck5hbWUnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnQVBQLk5BTUVfSVNfUkVRJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdOYW1lIGlzIHJlcXVpcmVkJ319LlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7J0FQUC5PUkRFUicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnT3JkZXInfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgZm9ybUNvbnRyb2xOYW1lPVwib3JkZXJcIiBbcGxhY2Vob2xkZXJdPVwiICdBUFAuRU5URVJfRElTUExBWV9PUkRFUicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgZGlzcGxheSBvcmRlcidcIiByZXF1aXJlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlZGl0aW5nVmlldy5nZXQoJ29yZGVyJyk/LmludmFsaWQgJiYgKGVkaXRpbmdWaWV3LmdldCgnb3JkZXInKT8uZGlydHkgfHwgZWRpdGluZ1ZpZXcuZ2V0KCdvcmRlcicpPy50b3VjaGVkKVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FQUC5PUkRFUl9JU19SRVFfQU5EX0JFX0FfTlVNJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdPcmRlciBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIG51bWJlcid9fS5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eydBUFAuREVGQVVMVF9WSUVXJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdEZWZhdWx0IFZpZXcnfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtd3JhcHBlciBzbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0RlZmF1bHRcIiBpZD1cImlzRGVmYXVsdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJpc0RlZmF1bHRcIiBjbGFzcz1cInRvZ2dsZS1idXR0b25cIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMz57eydBUFAuRklMVEVSUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRmlsdGVycyd9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi1kZXNjcmlwdGlvblwiPnt7J0FQUC5ERUZJTkVfQ09ORElUSU9OU19GT1JfRklMVEVSRURfTElTVF9WSUVXJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdEZWZpbmUgY29uZGl0aW9ucyBmb3IgZmlsdGVyZWQgbGlzdCB2aWV3J319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImNvbmRpdGlvbnNcIiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLWNlbGxcIj57eydBUFAuQ09MVU1OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdDb2x1bW4nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcGVyYXRvci1jZWxsXCI+e3snQVBQLk9QRVJBVE9SJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdPcGVyYXRvcid9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlLWNlbGxcIj57eydBUFAuVkFMVUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1ZhbHVlJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWNlbGxcIj57eydBUFAuQUNUSU9OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBY3Rpb24nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgY29uZGl0aW9ucy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0dmlldy1jdXN0b20tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmaWVsZFwiIFt2YWx1ZV09XCJnZXRMYWJlbEJ5RmllbGROYW1lKGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCdmaWVsZCcpLnZhbHVlKVwiIChmb2N1cyk9XCJvbkZvY3VzKCdmaWVsZCcsIGkpXCIgKGJsdXIpPVwib25CbHVyKCdmaWVsZCcsIGkpXCIgW3BsYWNlaG9sZGVyXT1cIidBUFAuRU5URVJfT1JfU0VMRUNUX0NPTFVNTicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgb3Igc2VsZWN0IGNvbHVtbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWxpc3RcIiAqbmdJZj1cImlzQ29sdW1uRHJvcGRvd25PcGVuW2ldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBnZXRGaWx0ZXJlZENvbHVtbnMoY29uZGl0aW9ucy5hdChpKS5nZXQoJ2ZpZWxkJykudmFsdWUpXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdE9wdGlvbignZmllbGQnLCBpLCBmaWVsZC5sYWJlbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIuZ2V0KCdmaWVsZCcpPy5pbnZhbGlkICYmIChmaWx0ZXIuZ2V0KCdmaWVsZCcpPy5kaXJ0eSB8fCBmaWx0ZXIuZ2V0KCdmaWVsZCcpPy50b3VjaGVkKVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydBUFAuQ09MVU1OX0lTX1JFUScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQ29sdW1uIGlzIHJlcXVpcmVkJ319LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcGVyYXRvci1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3R2aWV3LWN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE9wZXJhdG9yTGFiZWwoY29uZGl0aW9ucy5hdChpKS5nZXQoJ29wZXJhdG9yJykudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25PcGVyYXRvcklucHV0KCRldmVudC50YXJnZXQudmFsdWUsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygnb3BlcmF0b3InLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCdvcGVyYXRvcicsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0FQUC5FTlRFUl9PUl9TRUxFQ1RfT1BFUkFUT1InIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIG9yIHNlbGVjdCBvcGVyYXRvcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1saXN0XCIgKm5nSWY9XCJpc09wZXJhdG9yRHJvcGRvd25PcGVuW2ldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wZXJhdG9yIG9mIGdldEZpbHRlcmVkT3BlcmF0b3JzKG9wZXJhdG9ySW5wdXRbaV0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKCdvcGVyYXRvcicsIGksIG9wZXJhdG9yLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3BlcmF0b3IubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmdldCgnb3BlcmF0b3InKT8uaW52YWxpZCAmJiAoZmlsdGVyLmdldCgnb3BlcmF0b3InKT8uZGlydHkgfHwgZmlsdGVyLmdldCgnb3BlcmF0b3InKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQVBQLk9QRVJBVE9SX0lTX1JFUScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnT3BlcmF0b3IgaXMgcmVxdWlyZWQnfX0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdHZpZXctY3VzdG9tLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIiAoZm9jdXMpPVwib25Gb2N1cygndmFsdWUnLCBpKVwiIChibHVyKT1cIm9uQmx1cigndmFsdWUnLCBpKVwiIFtwbGFjZWhvbGRlcl09XCInQVBQLkVOVEVSX09SX1NFTEVDVF9WQUxVRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgb3Igc2VsZWN0IHZhbHVlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbGlzdFwiICpuZ0lmPVwiaXNWYWx1ZURyb3Bkb3duT3BlbltpXSAmJiBnZXRQb3NzaWJsZVZhbHVlcyhjb25kaXRpb25zLmF0KGkpLmdldCgnZmllbGQnKS52YWx1ZSwgY29uZGl0aW9ucy5hdChpKS5nZXQoJ3ZhbHVlJykudmFsdWUpPy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2YWwgb2YgZ2V0UG9zc2libGVWYWx1ZXMoY29uZGl0aW9ucy5hdChpKS5nZXQoJ2ZpZWxkJykudmFsdWUsIGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCd2YWx1ZScpLnZhbHVlKVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJzZWxlY3RPcHRpb24oJ3ZhbHVlJywgaSwgdmFsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHZhbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIuZ2V0KCd2YWx1ZScpPy5pbnZhbGlkICYmIChmaWx0ZXIuZ2V0KCd2YWx1ZScpPy5kaXJ0eSB8fCBmaWx0ZXIuZ2V0KCd2YWx1ZScpPy50b3VjaGVkKVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydBUFAuVkFMVUVfSVNfUkVRVUlSRUQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1ZhbHVlIGlzIHJlcXVpcmVkJ319LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWNvbi1jb250YWluZXJcIiBbbWF0VG9vbHRpcF09XCInQVBQLlJFTU9WRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUmVtb3ZlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlLWljb25cIiAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDMuOTg3MjZDMTEuNzggMy43NjcyNiA5LjU0NjY3IDMuNjUzOTMgNy4zMiAzLjY1MzkzQzYgMy42NTM5MyA0LjY4IDMuNzIwNiAzLjM2IDMuODUzOTNMMiAzLjk4NzI2XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01LjY2NjUgMy4zMTM2Mkw1LjgxMzE3IDIuNDQwMjhDNS45MTk4NCAxLjgwNjk1IDUuOTk5ODQgMS4zMzM2MiA3LjEyNjUgMS4zMzM2Mkg4Ljg3MzE3QzkuOTk5ODQgMS4zMzM2MiAxMC4wODY1IDEuODMzNjIgMTAuMTg2NSAyLjQ0Njk1TDEwLjMzMzIgMy4zMTM2MlwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi44ODY0NyAxMS4wMDA0SDkuMTA2NDdcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMzMzNSA4LjMzMzI1SDkuNjY2ODNcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhZGRJY29uQm9yIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZEZpbHRlcigpXCIgW21hdFRvb2x0aXBdPVwiJ0FQUC5BRERfRklMVEVSJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgRmlsdGVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRJY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDMuMzMzMjVWMTIuNjY2NlwiIHN0cm9rZT1cIiMwMDdiZmZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjMzMzAxIDhIMTIuNjY2M1wiIHN0cm9rZT1cIiMwMDdiZmZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snQVBQLkFERF9GSUxURVInIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FkZCBGaWx0ZXInfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMz57eydBUFAuQ09MVU1OUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQ29sdW1ucyd9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi1kZXNjcmlwdGlvblwiPnt7J0FQUC5TRUxFQ1RfRklFTERfVE9fRElTUExBWV9JTl9UQUJMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2VsZWN0IGZpZWxkIHRvIGRpc3BsYXkgaW4gdGFibGUnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiY29sdW1uc1wiIGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuYW1lLWNlbGxcIj57eydBUFAuQ09MVU1OX05BTUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0NvbHVtbiBOYW1lJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9vbC1jZWxsXCI+e3snQVBQLlNPUlRBQkxFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTb3J0YWJsZSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb2wtY2VsbFwiPnt7J0FQUC5GSUxURVJBQkxFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6J0ZpbHRlcmFibGUnfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tY2VsbFwiPnt7J0FQUC5BQ1RJT04nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FjdGlvbid9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGNvbHVtbnMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJjb2x1bW4tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3R2aWV3LWN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCdjb2x1bW5OYW1lJywgaSlcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCdjb2x1bW5OYW1lJywgaSlcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uTWFudWFsSW5wdXQoJGV2ZW50LnRhcmdldC52YWx1ZSwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0FQUC5FTlRFUl9PUl9TRUxFQ1RfQ09MVU1OX05BTUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIG9yIHNlbGVjdCBjb2x1bW4gbmFtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1saXN0XCIgKm5nSWY9XCJpc0NvbHVtbk5hbWVEcm9wZG93bk9wZW5baV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbE5hbWUgb2YgZ2V0Q29sdW1uQ29sdW1ucyhjb2x1bW5zLmF0KGkpLmdldCgnbmFtZScpLnZhbHVlKVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJzZWxlY3RPcHRpb24oJ2NvbHVtbk5hbWUnLCBpLCBjb2xOYW1lLmxhYmVsKTsgaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuW2ldID0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2xOYW1lLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLmdldCgnbmFtZScpPy5pbnZhbGlkICYmIChmaWVsZC5nZXQoJ25hbWUnKT8uZGlydHkgfHwgZmllbGQuZ2V0KCduYW1lJyk/LnRvdWNoZWQpXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0FQUC5DT0xVTU5fTkFNRV9JU19SRVEnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0NvbHVtbiBuYW1lIGlzIHJlcXVpcmVkJ319LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib29sLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLXdyYXBwZXIgc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInc29ydGFibGUtJyArIGlcIiBmb3JtQ29udHJvbE5hbWU9XCJzb3J0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInc29ydGFibGUtJyArIGlcIiBjbGFzcz1cInRvZ2dsZS1idXR0b25cIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib29sLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLXdyYXBwZXIgc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInZmlsdGVyYWJsZS0nICsgaVwiIGZvcm1Db250cm9sTmFtZT1cImZpbHRlcmFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ2ZpbHRlcmFibGUtJyArIGlcIiBjbGFzcz1cInRvZ2dsZS1idXR0b25cIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWNvbi1jb250YWluZXJcIiBbbWF0VG9vbHRpcF09XCInQVBQLlJFTU9WRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUmVtb3ZlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlLWljb25cIiAoY2xpY2spPVwicmVtb3ZlQ29sdW1uKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDMuOTg3MjZDMTEuNzggMy43NjcyNiA5LjU0NjY3IDMuNjUzOTMgNy4zMiAzLjY1MzkzQzYgMy42NTM5MyA0LjY4IDMuNzIwNiAzLjM2IDMuODUzOTNMMiAzLjk4NzI2XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01LjY2NjUgMy4zMTM2Mkw1LjgxMzE3IDIuNDQwMjhDNS45MTk4NCAxLjgwNjk1IDUuOTk5ODQgMS4zMzM2MiA3LjEyNjUgMS4zMzM2Mkg4Ljg3MzE3QzkuOTk5ODQgMS4zMzM2MiAxMC4wODY1IDEuODMzNjIgMTAuMTg2NSAyLjQ0Njk1TDEwLjMzMzIgMy4zMTM2MlwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi44ODY0NyAxMS4wMDA0SDkuMTA2NDdcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMzMzNSA4LjMzMzI1SDkuNjY2ODNcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhZGRJY29uQm9yIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvbHVtbigpXCIgW21hdFRvb2x0aXBdPVwiJ0FQUC5BRERfQ09MVU1OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgQ29sdW1uJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRJY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDMuMzMzMjVWMTIuNjY2NlwiIHN0cm9rZT1cIiMwMDdiZmZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjMzMzAxIDhIMTIuNjY2M1wiIHN0cm9rZT1cIiMwMDdiZmZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3snQVBQLkFERF9DT0xVTU4nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FkZCBDb2x1bW4nfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25kaXRpb25zLmxlbmd0aCA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgIHt7J0FQUC5BVF9MRUFTVF9PTkVfRklMVEVSX09SX09ORV9DT0xVTU5fSVNfUkVRJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICcgQXQgbGVhc3Qgb25lIGZpbHRlciBvciBvbmUgY29sdW1uIGlzIHJlcXVpcmVkJ319LlxuICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYXZlLWJ1dHRvblwiIChjbGljayk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiIWVkaXRpbmdWaWV3LnZhbGlkIHx8IChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA9PT0gMClcIj57eydBUFAuU0FWRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2F2ZSd9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCI+e3snQVBQLkNBTkNFTCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQ2FuY2VsJ319PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gU0tTM01BWTI1IERlbGV0ZSBMaXN0IFZpZXctLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNEZWxldGVNb2RhbE9wZW5cIiBjbGFzcz1cIm1vZGFsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICA8aDI+e3snQVBQLkRFTEVURV9MSVNUX1ZJRVcnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0RlbGV0ZSBMaXN0IFZpZXcnfX08L2gyPlxuICAgICAgICAgICAgPHA+e3snQVBQLkFSRV9ZT1VfU1VSRV9ZT1VfV0FOVF9UT19ERUxFVEUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUnfX0gXCJ7eyB2aWV3VG9EZWxldGU/LmZpbHRlck5hbWUgfX1cIj88L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1kZWxldGVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVsZXRlQ29uZmlybWVkKClcIj57eydBUFAuREVMRVRFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdEZWxldGUnfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xvc2VEZWxldGVNb2RhbCgpXCI+e3snQVBQLkNBTkNFTCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQ2FuY2VsJ319PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
|