@rangertechnologies/ngnxt 2.1.151 → 2.1.152

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.
@@ -10,7 +10,14 @@ export class ListViewFilterComponent {
10
10
  tableFilterArray = [];
11
11
  selectedView = '';
12
12
  displayedColumns = [];
13
- availableOperators = ['=', '!=', '>', '<', '>=', '<=']; // 'contains', 'not contains', 'starts with', 'ends with'
13
+ availableOperators = [
14
+ { label: 'Equals (=)', value: '=' },
15
+ { label: 'Not Equal (!=)', value: '!=' },
16
+ { label: 'Greater Than (>)', value: '>' },
17
+ { label: 'Less Than (<)', value: '<' },
18
+ { label: 'Greater Than or Equal (>=)', value: '>=' },
19
+ { label: 'Less Than or Equal (<=)', value: '<=' }
20
+ ]; // 'contains', 'not contains', 'starts with', 'ends with'
14
21
  listViewEmit = new EventEmitter();
15
22
  isDropdownOpen = false;
16
23
  isModalOpen = false;
@@ -18,8 +25,6 @@ export class ListViewFilterComponent {
18
25
  isAdding = false;
19
26
  viewToDelete = null;
20
27
  editingView;
21
- columnValuesMap = {};
22
- columnNames = [];
23
28
  isColumnDropdownOpen = [];
24
29
  isOperatorDropdownOpen = [];
25
30
  isValueDropdownOpen = [];
@@ -38,30 +43,12 @@ export class ListViewFilterComponent {
38
43
  if (!this.selectedView && this.listViews?.length > 0) {
39
44
  this.selectedView = this.listViews[0].filterName;
40
45
  }
41
- // SKS3MAY25 Compute columnValuesMap and columnNames from tableFilterArray
42
- this.columnValuesMap = Array.isArray(this.tableFilterArray)
43
- ? this.tableFilterArray.reduce((acc, curr) => {
44
- const key = Object.keys(curr)[0];
45
- acc[key] = curr[key];
46
- return acc;
47
- }, {})
48
- : {};
49
- this.columnNames = Object.keys(this.columnValuesMap);
50
46
  }
51
47
  ngOnChanges(changes) {
52
48
  if (!this.selectedView && this.listViews?.length > 0) {
53
49
  this.selectedView = this.listViews[0].filterName;
54
50
  }
55
51
  console.log(this.tableFilterArray);
56
- // SKS3MAY25 Compute columnValuesMap and columnNames from tableFilterArray
57
- this.columnValuesMap = Array.isArray(this.tableFilterArray)
58
- ? this.tableFilterArray.reduce((acc, curr) => {
59
- const key = Object.keys(curr)[0];
60
- acc[key] = curr[key];
61
- return acc;
62
- }, {})
63
- : {};
64
- this.columnNames = Object.keys(this.columnValuesMap);
65
52
  }
66
53
  get conditions() {
67
54
  return this.editingView.get('conditions');
@@ -133,17 +120,17 @@ export class ListViewFilterComponent {
133
120
  value: [filter.value, Validators.required]
134
121
  }));
135
122
  });
136
- view?.columns?.forEach(field => {
137
- this.columns.push(this.fb.group({
138
- name: [field.name, Validators.required],
139
- sortable: [field.sortable],
140
- filterable: [field.filterable]
141
- }));
123
+ view?.columns?.forEach(col => {
124
+ this.displayedColumns.forEach(field => {
125
+ if (col.name == field.fieldName) {
126
+ this.columns.push(this.fb.group({
127
+ name: [field.label, Validators.required],
128
+ sortable: [col.sortable],
129
+ filterable: [col.filterable]
130
+ }));
131
+ }
132
+ });
142
133
  });
143
- if (this.conditions.length === 0)
144
- this.addFilter();
145
- if (this.columns.length === 0)
146
- this.addColumn();
147
134
  }
148
135
  // SKS3MAY25 Opens modal to create a new list view
149
136
  startAdd() {
@@ -159,11 +146,26 @@ export class ListViewFilterComponent {
159
146
  isDefault: false
160
147
  });
161
148
  this.isDropdownOpen = false;
149
+ // SKS26MAY25 Second loop: from displayedColumns, skip duplicates
150
+ this.displayedColumns.forEach(field => {
151
+ this.columns.push(this.fb.group({
152
+ name: [field.label, Validators.required],
153
+ sortable: [field.hyperLink],
154
+ filterable: [field.filter]
155
+ }));
156
+ });
162
157
  }
163
158
  // SKS3MAY25 Saves the currently edited or added list view
164
159
  save() {
165
160
  if (this.editingView.valid) {
166
161
  const formValue = this.editingView.value;
162
+ formValue?.columns?.forEach((col) => {
163
+ this.displayedColumns.forEach((dCol) => {
164
+ if (dCol.label === col.name) {
165
+ col.name = dCol.fieldName;
166
+ }
167
+ });
168
+ });
167
169
  const listView = {
168
170
  filterName: formValue.filterName,
169
171
  order: formValue.order,
@@ -230,20 +232,41 @@ export class ListViewFilterComponent {
230
232
  // SKS3MAY25 Returns filtered list of columns based on input search term
231
233
  getFilteredColumns(term) {
232
234
  if (!term)
233
- return this.columnNames;
235
+ return this.tableFilterArray;
236
+ term = term.toLowerCase();
237
+ return this.tableFilterArray.filter(col => col.label.toLowerCase().includes(term));
238
+ }
239
+ getColumnColumns(term) {
240
+ console.log(term);
241
+ if (!term)
242
+ return this.displayedColumns;
234
243
  term = term.toLowerCase();
235
- return this.columnNames.filter(field => field.toLowerCase().includes(term));
244
+ return this.displayedColumns.filter(col => col.label.toLowerCase().includes(term));
245
+ }
246
+ // SKS3MAY25 Returns possible values for a selected field/column
247
+ getPossibleValues(field, term) {
248
+ const match = this.tableFilterArray.find(col => col.label === field);
249
+ if (!match || !Array.isArray(match.value))
250
+ return [];
251
+ if (!term)
252
+ return match.value;
253
+ const lowerTerm = term.toLowerCase();
254
+ return match.value.filter(val => typeof val === 'string' && val.toLowerCase().includes(lowerTerm));
236
255
  }
237
256
  // SKS3MAY25 Returns filtered list of operators based on input search term
238
257
  getFilteredOperators(term) {
239
258
  if (!term)
240
259
  return this.availableOperators;
241
260
  term = term.toLowerCase();
242
- return this.availableOperators.filter(operator => operator.toLowerCase().includes(term));
261
+ return this.availableOperators.filter(operator => operator.label.toLowerCase().includes(term));
243
262
  }
244
- // SKS3MAY25 Returns possible values for a selected field/column
245
- getPossibleValues(field) {
246
- return this.columnValuesMap[field] || [];
263
+ operatorInput = [];
264
+ onOperatorInput(value, index) {
265
+ this.operatorInput[index] = value;
266
+ }
267
+ getOperatorLabel(value) {
268
+ const found = this.availableOperators.find(op => op.value === value);
269
+ return found ? found.label : value;
247
270
  }
248
271
  // SKS3MAY25 Opens a dropdown on focus for the given input type and index
249
272
  onFocus(type, index) {
@@ -296,6 +319,17 @@ export class ListViewFilterComponent {
296
319
  this.isColumnNameDropdownOpen[index] = false;
297
320
  }
298
321
  }
322
+ getLabelByFieldName(fieldName) {
323
+ console.log(fieldName);
324
+ const match = this.displayedColumns.find(col => col.fieldName === fieldName);
325
+ return match?.label ? match.label : fieldName;
326
+ }
327
+ onManualInput(inputValue, index) {
328
+ const match = this.displayedColumns.find(col => col.label.toLowerCase() === inputValue.toLowerCase());
329
+ if (match) {
330
+ this.columns.at(index).get('name').setValue(match.label);
331
+ }
332
+ }
299
333
  // SKS3MAY25 Listens to document click and closes the dropdown if clicked outside
300
334
  onDocumentClick(event) {
301
335
  event.stopPropagation();
@@ -305,11 +339,11 @@ export class ListViewFilterComponent {
305
339
  }
306
340
  }
307
341
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListViewFilterComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
308
- 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)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"list-view-filter\">\n <div class=\"custom-dropdown\">\n <div class=\"filter-label\">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 {{ selectedView || 'Select a view' }}\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.filterName }}</span>\n <div class=\"actions\" *ngIf=\"view.showActions\">\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>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 <h2>{{ isAdding ? 'Add New List View' : 'Edit List View' }}</h2>\n <form [formGroup]=\"editingView\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Name:</label>\n <input formControlName=\"filterName\" placeholder=\"Enter list view name\" required>\n <div *ngIf=\"editingView.get('filterName')?.invalid && (editingView.get('filterName')?.dirty || editingView.get('filterName')?.touched)\" class=\"error-message\">\n Name is required.\n </div>\n </div>\n <div class=\"form-group\">\n <label>Order:</label>\n <input type=\"number\" formControlName=\"order\" placeholder=\"Enter display order\" required>\n <div *ngIf=\"editingView.get('order')?.invalid && (editingView.get('order')?.dirty || editingView.get('order')?.touched)\" class=\"error-message\">\n Order is required and must be a number.\n </div>\n </div>\n <div class=\"form-group\">\n <label>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>Filters</h3>\n <span class=\"section-description\">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\">Column</div>\n <div class=\"operator-cell\">Operator</div>\n <div class=\"value-cell\">Value</div>\n <div class=\"action-cell\">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=\"custom-select\">\n <input formControlName=\"field\" (focus)=\"onFocus('field', i)\" (blur)=\"onBlur('field', i)\" placeholder=\"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)\">\n {{ field }}\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 Column is required.\n </div>\n </div>\n \n <div class=\"operator-cell\">\n <div class=\"custom-select\">\n <input formControlName=\"operator\" (focus)=\"onFocus('operator', i)\" (blur)=\"onBlur('operator', i)\" placeholder=\"Enter or select operator\">\n <div class=\"dropdown-list\" *ngIf=\"isOperatorDropdownOpen[i]\">\n <div *ngFor=\"let operator of getFilteredOperators(conditions.at(i).get('operator').value)\" class=\"dropdown-item\" (click)=\"selectOption('operator', i, operator)\">\n {{ operator }}\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 Operator is required.\n </div>\n </div>\n \n <div class=\"value-cell\">\n <div class=\"custom-select\">\n <input formControlName=\"value\" (focus)=\"onFocus('value', i)\" (blur)=\"onBlur('value', i)\" placeholder=\"Enter or select value\">\n <div class=\"dropdown-list\" *ngIf=\"isValueDropdownOpen[i] && getPossibleValues(conditions.at(i).get('field').value).length > 0\">\n <div *ngFor=\"let val of getPossibleValues(conditions.at(i).get('field').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 Value is required.\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" matTooltip=\"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=\"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>Add Filter</span>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>Columns</h3>\n <span class=\"section-description\">Configure columns to display in this view</span>\n </div>\n <div formArrayName=\"columns\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"name-cell\">Column Name</div>\n <div class=\"bool-cell\">Sortable</div>\n <div class=\"bool-cell\">Filterable</div>\n <div class=\"action-cell\">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=\"custom-select\">\n <input formControlName=\"name\" (focus)=\"onFocus('columnName', i)\" (blur)=\"onBlur('columnName', i)\" placeholder=\"Enter or select column name\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnNameDropdownOpen[i]\">\n <div *ngFor=\"let colName of displayedColumns\" class=\"dropdown-item\" (click)=\"selectOption('columnName', i, colName)\">\n {{ colName }}\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 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=\"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=\"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>Add Column</span>\n </div>\n </div>\n <div *ngIf=\"conditions.length === 0 && columns.length === 0\" class=\"error-message\">\n 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)\">Save</button>\n <button type=\"button\" (click)=\"closeModal()\">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>Delete List View</h2>\n <p>Are you sure you want to delete \"{{ viewToDelete?.filterName }}\"?</p>\n <div class=\"form-delete\">\n <button type=\"button\" (click)=\"deleteConfirmed()\">Delete</button>\n <button type=\"button\" (click)=\"closeDeleteModal()\">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}.chevron-icon{cursor:pointer;background-color:#f5f5f5;border-radius:5px;margin-left:8px}.dropdown-options-container{position:absolute;top:100%;left:0;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}.view-name{flex:1}.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{margin:24px 0 12px;border-bottom:1px solid #e0e0e0;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;margin-bottom:20px}.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}.custom-select{position:relative;width:100%}.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{flex:1;min-width:0}.error-message{color:#dc3545;font-size:12px;margin-top:4px}.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}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.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"] }] });
342
+ 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)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"list-view-filter\">\n <div class=\"custom-dropdown\">\n <div class=\"filter-label\">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 {{ selectedView || 'Select a view' }}\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.filterName }}</span>\n <div class=\"actions\" *ngIf=\"view.showActions\">\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>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 <h2>{{ isAdding ? 'Add New List View' : 'Edit List View' }}</h2>\n <form [formGroup]=\"editingView\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Name:</label>\n <input formControlName=\"filterName\" placeholder=\"Enter list view name\" required>\n <div *ngIf=\"editingView.get('filterName')?.invalid && (editingView.get('filterName')?.dirty || editingView.get('filterName')?.touched)\" class=\"error-message\">\n Name is required.\n </div>\n </div>\n <div class=\"form-group\">\n <label>Order:</label>\n <input type=\"number\" formControlName=\"order\" placeholder=\"Enter display order\" required>\n <div *ngIf=\"editingView.get('order')?.invalid && (editingView.get('order')?.dirty || editingView.get('order')?.touched)\" class=\"error-message\">\n Order is required and must be a number.\n </div>\n </div>\n <div class=\"form-group\">\n <label>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>Filters</h3>\n <span class=\"section-description\">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\">Column</div>\n <div class=\"operator-cell\">Operator</div>\n <div class=\"value-cell\">Value</div>\n <div class=\"action-cell\">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=\"custom-select\">\n <input formControlName=\"field\" [value]=\"getLabelByFieldName(conditions.at(i).get('field').value)\" (focus)=\"onFocus('field', i)\" (blur)=\"onBlur('field', i)\" placeholder=\"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 Column is required.\n </div>\n </div>\n \n <div class=\"operator-cell\">\n <div class=\"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=\"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 Operator is required.\n </div>\n </div>\n \n <div class=\"value-cell\">\n <div class=\"custom-select\">\n <input formControlName=\"value\" (focus)=\"onFocus('value', i)\" (blur)=\"onBlur('value', i)\" placeholder=\"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 Value is required.\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" matTooltip=\"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=\"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>Add Filter</span>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>Columns</h3>\n <span class=\"section-description\">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\">Column Name</div>\n <div class=\"bool-cell\">Sortable</div>\n <div class=\"bool-cell\">Filterable</div>\n <div class=\"action-cell\">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=\"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=\"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 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=\"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=\"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>Add Column</span>\n </div>\n </div>\n <div *ngIf=\"conditions.length === 0 && columns.length === 0\" class=\"error-message\">\n 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)\">Save</button>\n <button type=\"button\" (click)=\"closeModal()\">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>Delete List View</h2>\n <p>Are you sure you want to delete \"{{ viewToDelete?.filterName }}\"?</p>\n <div class=\"form-delete\">\n <button type=\"button\" (click)=\"deleteConfirmed()\">Delete</button>\n <button type=\"button\" (click)=\"closeDeleteModal()\">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}.chevron-icon{cursor:pointer;background-color:#f5f5f5;border-radius:5px;margin-left:8px}.dropdown-options-container{position:absolute;top:100%;left:0;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}.view-name{flex:1}.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}.custom-select{position:relative;width:100%}.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{flex:1;min-width:0;margin-bottom:0!important}.error-message{color:#dc3545;font-size:12px;margin-top:4px}.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}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.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"] }] });
309
343
  }
310
344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ListViewFilterComponent, decorators: [{
311
345
  type: Component,
312
- args: [{ selector: 'app-list-view-filter', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule], template: "<div class=\"list-view-filter\">\n <div class=\"custom-dropdown\">\n <div class=\"filter-label\">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 {{ selectedView || 'Select a view' }}\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.filterName }}</span>\n <div class=\"actions\" *ngIf=\"view.showActions\">\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>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 <h2>{{ isAdding ? 'Add New List View' : 'Edit List View' }}</h2>\n <form [formGroup]=\"editingView\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Name:</label>\n <input formControlName=\"filterName\" placeholder=\"Enter list view name\" required>\n <div *ngIf=\"editingView.get('filterName')?.invalid && (editingView.get('filterName')?.dirty || editingView.get('filterName')?.touched)\" class=\"error-message\">\n Name is required.\n </div>\n </div>\n <div class=\"form-group\">\n <label>Order:</label>\n <input type=\"number\" formControlName=\"order\" placeholder=\"Enter display order\" required>\n <div *ngIf=\"editingView.get('order')?.invalid && (editingView.get('order')?.dirty || editingView.get('order')?.touched)\" class=\"error-message\">\n Order is required and must be a number.\n </div>\n </div>\n <div class=\"form-group\">\n <label>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>Filters</h3>\n <span class=\"section-description\">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\">Column</div>\n <div class=\"operator-cell\">Operator</div>\n <div class=\"value-cell\">Value</div>\n <div class=\"action-cell\">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=\"custom-select\">\n <input formControlName=\"field\" (focus)=\"onFocus('field', i)\" (blur)=\"onBlur('field', i)\" placeholder=\"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)\">\n {{ field }}\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 Column is required.\n </div>\n </div>\n \n <div class=\"operator-cell\">\n <div class=\"custom-select\">\n <input formControlName=\"operator\" (focus)=\"onFocus('operator', i)\" (blur)=\"onBlur('operator', i)\" placeholder=\"Enter or select operator\">\n <div class=\"dropdown-list\" *ngIf=\"isOperatorDropdownOpen[i]\">\n <div *ngFor=\"let operator of getFilteredOperators(conditions.at(i).get('operator').value)\" class=\"dropdown-item\" (click)=\"selectOption('operator', i, operator)\">\n {{ operator }}\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 Operator is required.\n </div>\n </div>\n \n <div class=\"value-cell\">\n <div class=\"custom-select\">\n <input formControlName=\"value\" (focus)=\"onFocus('value', i)\" (blur)=\"onBlur('value', i)\" placeholder=\"Enter or select value\">\n <div class=\"dropdown-list\" *ngIf=\"isValueDropdownOpen[i] && getPossibleValues(conditions.at(i).get('field').value).length > 0\">\n <div *ngFor=\"let val of getPossibleValues(conditions.at(i).get('field').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 Value is required.\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" matTooltip=\"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=\"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>Add Filter</span>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>Columns</h3>\n <span class=\"section-description\">Configure columns to display in this view</span>\n </div>\n <div formArrayName=\"columns\" class=\"table-container\">\n <div class=\"table-header\">\n <div class=\"name-cell\">Column Name</div>\n <div class=\"bool-cell\">Sortable</div>\n <div class=\"bool-cell\">Filterable</div>\n <div class=\"action-cell\">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=\"custom-select\">\n <input formControlName=\"name\" (focus)=\"onFocus('columnName', i)\" (blur)=\"onBlur('columnName', i)\" placeholder=\"Enter or select column name\">\n <div class=\"dropdown-list\" *ngIf=\"isColumnNameDropdownOpen[i]\">\n <div *ngFor=\"let colName of displayedColumns\" class=\"dropdown-item\" (click)=\"selectOption('columnName', i, colName)\">\n {{ colName }}\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 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=\"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=\"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>Add Column</span>\n </div>\n </div>\n <div *ngIf=\"conditions.length === 0 && columns.length === 0\" class=\"error-message\">\n 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)\">Save</button>\n <button type=\"button\" (click)=\"closeModal()\">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>Delete List View</h2>\n <p>Are you sure you want to delete \"{{ viewToDelete?.filterName }}\"?</p>\n <div class=\"form-delete\">\n <button type=\"button\" (click)=\"deleteConfirmed()\">Delete</button>\n <button type=\"button\" (click)=\"closeDeleteModal()\">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}.chevron-icon{cursor:pointer;background-color:#f5f5f5;border-radius:5px;margin-left:8px}.dropdown-options-container{position:absolute;top:100%;left:0;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}.view-name{flex:1}.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{margin:24px 0 12px;border-bottom:1px solid #e0e0e0;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;margin-bottom:20px}.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}.custom-select{position:relative;width:100%}.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{flex:1;min-width:0}.error-message{color:#dc3545;font-size:12px;margin-top:4px}.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}\n"] }]
346
+ args: [{ selector: 'app-list-view-filter', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule], template: "<div class=\"list-view-filter\">\n <div class=\"custom-dropdown\">\n <div class=\"filter-label\">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 {{ selectedView || 'Select a view' }}\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.filterName }}</span>\n <div class=\"actions\" *ngIf=\"view.showActions\">\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>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 <h2>{{ isAdding ? 'Add New List View' : 'Edit List View' }}</h2>\n <form [formGroup]=\"editingView\">\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label>Name:</label>\n <input formControlName=\"filterName\" placeholder=\"Enter list view name\" required>\n <div *ngIf=\"editingView.get('filterName')?.invalid && (editingView.get('filterName')?.dirty || editingView.get('filterName')?.touched)\" class=\"error-message\">\n Name is required.\n </div>\n </div>\n <div class=\"form-group\">\n <label>Order:</label>\n <input type=\"number\" formControlName=\"order\" placeholder=\"Enter display order\" required>\n <div *ngIf=\"editingView.get('order')?.invalid && (editingView.get('order')?.dirty || editingView.get('order')?.touched)\" class=\"error-message\">\n Order is required and must be a number.\n </div>\n </div>\n <div class=\"form-group\">\n <label>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>Filters</h3>\n <span class=\"section-description\">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\">Column</div>\n <div class=\"operator-cell\">Operator</div>\n <div class=\"value-cell\">Value</div>\n <div class=\"action-cell\">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=\"custom-select\">\n <input formControlName=\"field\" [value]=\"getLabelByFieldName(conditions.at(i).get('field').value)\" (focus)=\"onFocus('field', i)\" (blur)=\"onBlur('field', i)\" placeholder=\"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 Column is required.\n </div>\n </div>\n \n <div class=\"operator-cell\">\n <div class=\"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=\"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 Operator is required.\n </div>\n </div>\n \n <div class=\"value-cell\">\n <div class=\"custom-select\">\n <input formControlName=\"value\" (focus)=\"onFocus('value', i)\" (blur)=\"onBlur('value', i)\" placeholder=\"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 Value is required.\n </div>\n </div>\n \n <div class=\"action-cell\">\n <div class=\"dicon-container\" matTooltip=\"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=\"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>Add Filter</span>\n </div>\n </div>\n\n <div class=\"section-header\">\n <h3>Columns</h3>\n <span class=\"section-description\">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\">Column Name</div>\n <div class=\"bool-cell\">Sortable</div>\n <div class=\"bool-cell\">Filterable</div>\n <div class=\"action-cell\">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=\"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=\"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 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=\"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=\"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>Add Column</span>\n </div>\n </div>\n <div *ngIf=\"conditions.length === 0 && columns.length === 0\" class=\"error-message\">\n 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)\">Save</button>\n <button type=\"button\" (click)=\"closeModal()\">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>Delete List View</h2>\n <p>Are you sure you want to delete \"{{ viewToDelete?.filterName }}\"?</p>\n <div class=\"form-delete\">\n <button type=\"button\" (click)=\"deleteConfirmed()\">Delete</button>\n <button type=\"button\" (click)=\"closeDeleteModal()\">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}.chevron-icon{cursor:pointer;background-color:#f5f5f5;border-radius:5px;margin-left:8px}.dropdown-options-container{position:absolute;top:100%;left:0;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}.view-name{flex:1}.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}.custom-select{position:relative;width:100%}.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{flex:1;min-width:0;margin-bottom:0!important}.error-message{color:#dc3545;font-size:12px;margin-top:4px}.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}\n"] }]
313
347
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { listViews: [{
314
348
  type: Input
315
349
  }], tableFilterArray: [{
@@ -326,4 +360,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
326
360
  type: HostListener,
327
361
  args: ['document:click', ['$event']]
328
362
  }] } });
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9saXN0LXZpZXctZmlsdGVyL2xpc3Qtdmlldy1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC12aWV3LWZpbHRlci9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUE4QmpILE1BQU0sT0FBTyx1QkFBdUI7SUF3QmQ7SUF2QlgsU0FBUyxHQUFlLEVBQUUsQ0FBQztJQUMzQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFDM0IsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFDM0Isa0JBQWtCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMseURBQXlEO0lBRTFILFlBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRWpELGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsV0FBVyxHQUFZLEtBQUssQ0FBQztJQUM3QixpQkFBaUIsR0FBWSxLQUFLLENBQUM7SUFDbkMsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixZQUFZLEdBQW9C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QUFFLENBQUM7UUFDeEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO3dHQWxVVSx1QkFBdUI7NEZBQXZCLHVCQUF1Qiw4WUNoQ3BDLG0wb0JBZ1FNLDZqTURwT00sWUFBWSwrUEFBRSxXQUFXLDJzQ0FBRSxtQkFBbUI7OzRGQUk3Qyx1QkFBdUI7a0JBUG5DLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUM7Z0ZBS2hELFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQXFUUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbnRlcmZhY2UgTGlzdFZpZXcge1xuICBmaWx0ZXJOYW1lOiBzdHJpbmc7XG4gIG9yZGVyOiBudW1iZXI7XG4gIGlzRGVmYXVsdDogYm9vbGVhbjtcbiAgY29uZGl0aW9uczogTGlzdFZpZXdGaWx0ZXJbXTtcbiAgY29sdW1uczogTGlzdFZpZXdDb2x1bW5bXTtcbiAgc2hvd0FjdGlvbnM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTGlzdFZpZXdGaWx0ZXIge1xuICBmaWVsZDogc3RyaW5nO1xuICBvcGVyYXRvcjogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTGlzdFZpZXdDb2x1bW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHNvcnRhYmxlOiBib29sZWFuO1xuICBmaWx0ZXJhYmxlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbGlzdC12aWV3LWZpbHRlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3Qtdmlldy1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Vmlld0ZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGxpc3RWaWV3czogTGlzdFZpZXdbXSA9IFtdO1xuICBASW5wdXQoKSB0YWJsZUZpbHRlckFycmF5OiBhbnkgPSBbXTtcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGlzcGxheWVkQ29sdW1uczogYW55ID0gW107XG4gIEBJbnB1dCgpIGF2YWlsYWJsZU9wZXJhdG9yczogc3RyaW5nW10gPSBbJz0nLCAnIT0nLCAnPicsICc8JywgJz49JywgJzw9J107IC8vICdjb250YWlucycsICdub3QgY29udGFpbnMnLCAnc3RhcnRzIHdpdGgnLCAnZW5kcyB3aXRoJ1xuXG4gIEBPdXRwdXQoKSBsaXN0Vmlld0VtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBpc0Ryb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc01vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0RlbGV0ZU1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0FkZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICB2aWV3VG9EZWxldGU6IExpc3RWaWV3IHwgbnVsbCA9IG51bGw7XG5cbiAgZWRpdGluZ1ZpZXc6IEZvcm1Hcm91cDtcblxuICBjb2x1bW5WYWx1ZXNNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICBjb2x1bW5OYW1lczogc3RyaW5nW10gPSBbXTtcbiAgaXNDb2x1bW5Ecm9wZG93bk9wZW46IGJvb2xlYW5bXSA9IFtdO1xuICBpc09wZXJhdG9yRHJvcGRvd25PcGVuOiBib29sZWFuW10gPSBbXTtcbiAgaXNWYWx1ZURyb3Bkb3duT3BlbjogYm9vbGVhbltdID0gW107XG4gIGlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbjogYm9vbGVhbltdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLmVkaXRpbmdWaWV3ID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBmaWx0ZXJOYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgb3JkZXI6IFswLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMCldXSxcbiAgICAgIGlzRGVmYXVsdDogW2ZhbHNlXSxcbiAgICAgIGNvbmRpdGlvbnM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgY29sdW1uczogdGhpcy5mYi5hcnJheShbXSlcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRWaWV3ICYmIHRoaXMubGlzdFZpZXdzPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHRoaXMubGlzdFZpZXdzWzBdLmZpbHRlck5hbWU7XG4gICAgfVxuXG5cbiAgICAvLyBTS1MzTUFZMjUgQ29tcHV0ZSBjb2x1bW5WYWx1ZXNNYXAgYW5kIGNvbHVtbk5hbWVzIGZyb20gdGFibGVGaWx0ZXJBcnJheVxuICAgIHRoaXMuY29sdW1uVmFsdWVzTWFwID0gQXJyYXkuaXNBcnJheSh0aGlzLnRhYmxlRmlsdGVyQXJyYXkpXG4gICAgPyB0aGlzLnRhYmxlRmlsdGVyQXJyYXkucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoY3VycilbMF07XG4gICAgICAgIGFjY1trZXldID0gY3VycltrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9KVxuICAgIDoge307ICBcbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gT2JqZWN0LmtleXModGhpcy5jb2x1bW5WYWx1ZXNNYXApO1xuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRWaWV3ICYmIHRoaXMubGlzdFZpZXdzPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHRoaXMubGlzdFZpZXdzWzBdLmZpbHRlck5hbWU7XG4gICAgfVxuY29uc29sZS5sb2codGhpcy50YWJsZUZpbHRlckFycmF5KVxuICAgIC8vIFNLUzNNQVkyNSBDb21wdXRlIGNvbHVtblZhbHVlc01hcCBhbmQgY29sdW1uTmFtZXMgZnJvbSB0YWJsZUZpbHRlckFycmF5XG4gICAgdGhpcy5jb2x1bW5WYWx1ZXNNYXAgPSBBcnJheS5pc0FycmF5KHRoaXMudGFibGVGaWx0ZXJBcnJheSlcbiAgICA/IHRoaXMudGFibGVGaWx0ZXJBcnJheS5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhjdXJyKVswXTtcbiAgICAgICAgYWNjW2tleV0gPSBjdXJyW2tleV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0pXG4gICAgOiB7fTsgIFxuICAgIHRoaXMuY29sdW1uTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbHVtblZhbHVlc01hcCk7XG4gIH1cblxuICBnZXQgY29uZGl0aW9ucygpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdWaWV3LmdldCgnY29uZGl0aW9ucycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBSZXR1cm5zIHRoZSBGb3JtQXJyYXkgb2YgY29sdW1ucyBmcm9tIHRoZSBlZGl0aW5nIGZvcm1cbiAgZ2V0IGNvbHVtbnMoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nVmlldy5nZXQoJ2NvbHVtbnMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgQWRkcyBhIG5ldyBmaWx0ZXIgY29uZGl0aW9uIHRvIHRoZSBmb3JtXG4gIGFkZEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZpZWxkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgb3BlcmF0b3I6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgIH0pKTtcbiAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuLnB1c2goZmFsc2UpO1xuICAgIHRoaXMuaXNPcGVyYXRvckRyb3Bkb3duT3Blbi5wdXNoKGZhbHNlKTtcbiAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW4ucHVzaChmYWxzZSk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgUmVtb3ZlcyBhIGZpbHRlciBjb25kaXRpb24gYnkgaW5kZXhcbiAgcmVtb3ZlRmlsdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbnMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuaXNDb2x1bW5Ecm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBzb3J0YWJsZTogW2ZhbHNlXSxcbiAgICAgIGZpbHRlcmFibGU6IFtmYWxzZV1cbiAgICB9KSk7XG4gICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW4ucHVzaChmYWxzZSk7XG4gIH1cblxuICByZW1vdmVDb2x1bW4oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29sdW1ucy5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoe1wiYWN0aW9uXCI6ICdmaWx0ZXJHZXQnfSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzRHJvcGRvd25PcGVuO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IEhhbmRsZXMgc2VsZWN0aW5nIGEgbGlzdCB2aWV3IGZyb20gdGhlIGRyb3Bkb3duXG4gIHNlbGVjdExpc3RWaWV3KHZpZXc6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdmlldy5maWx0ZXJOYW1lO1xuICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoeydhY3Rpb24nOidzZWxlY3QnLCAnZGF0YSc6dmlld30pO1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBPcGVucyBtb2RhbCB0byBlZGl0IGFuIGV4aXN0aW5nIGxpc3Qgdmlld1xuICBzdGFydEVkaXQodmlldzogTGlzdFZpZXcsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5pc0FkZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNNb2RhbE9wZW4gPSB0cnVlO1xuXG4gICAgdGhpcy5lZGl0aW5nVmlldy5yZXNldCgpO1xuICAgIHdoaWxlICh0aGlzLmNvbmRpdGlvbnMubGVuZ3RoKSB0aGlzLmNvbmRpdGlvbnMucmVtb3ZlQXQoMCk7XG4gICAgd2hpbGUgKHRoaXMuY29sdW1ucy5sZW5ndGgpIHRoaXMuY29sdW1ucy5yZW1vdmVBdCgwKTtcblxuICAgIHRoaXMuZWRpdGluZ1ZpZXcucGF0Y2hWYWx1ZSh7XG4gICAgICBmaWx0ZXJOYW1lOiB2aWV3LmZpbHRlck5hbWUsXG4gICAgICBvcmRlcjogdmlldy5vcmRlcixcbiAgICAgIGlzRGVmYXVsdDogdmlldy5pc0RlZmF1bHRcbiAgICB9KTtcblxuICAgIHZpZXc/LmNvbmRpdGlvbnM/LmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIHRoaXMuY29uZGl0aW9ucy5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBmaWVsZDogW2ZpbHRlci5maWVsZCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG9wZXJhdG9yOiBbZmlsdGVyLm9wZXJhdG9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgdmFsdWU6IFtmaWx0ZXIudmFsdWUsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICB2aWV3Py5jb2x1bW5zPy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBuYW1lOiBbZmllbGQubmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHNvcnRhYmxlOiBbZmllbGQuc29ydGFibGVdLFxuICAgICAgICBmaWx0ZXJhYmxlOiBbZmllbGQuZmlsdGVyYWJsZV1cbiAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB0aGlzLmFkZEZpbHRlcigpO1xuICAgIGlmICh0aGlzLmNvbHVtbnMubGVuZ3RoID09PSAwKSB0aGlzLmFkZENvbHVtbigpO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IE9wZW5zIG1vZGFsIHRvIGNyZWF0ZSBhIG5ldyBsaXN0IHZpZXdcbiAgc3RhcnRBZGQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0FkZGluZyA9IHRydWU7XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IHRydWU7XG5cbiAgICB0aGlzLmVkaXRpbmdWaWV3LnJlc2V0KCk7XG4gICAgd2hpbGUgKHRoaXMuY29uZGl0aW9ucy5sZW5ndGgpIHRoaXMuY29uZGl0aW9ucy5yZW1vdmVBdCgwKTtcbiAgICB3aGlsZSAodGhpcy5jb2x1bW5zLmxlbmd0aCkgdGhpcy5jb2x1bW5zLnJlbW92ZUF0KDApO1xuXG4gICAgdGhpcy5lZGl0aW5nVmlldy5wYXRjaFZhbHVlKHtcbiAgICAgIG9yZGVyOiB0aGlzLmxpc3RWaWV3cz8ubGVuZ3RoLFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBTYXZlcyB0aGUgY3VycmVudGx5IGVkaXRlZCBvciBhZGRlZCBsaXN0IHZpZXdcbiAgc2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nVmlldy52YWxpZCkge1xuICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5lZGl0aW5nVmlldy52YWx1ZTtcbiAgICAgIGNvbnN0IGxpc3RWaWV3OiBMaXN0VmlldyA9IHtcbiAgICAgICAgZmlsdGVyTmFtZTogZm9ybVZhbHVlLmZpbHRlck5hbWUsXG4gICAgICAgIG9yZGVyOiBmb3JtVmFsdWUub3JkZXIsXG4gICAgICAgIGlzRGVmYXVsdDogZm9ybVZhbHVlLmlzRGVmYXVsdCxcbiAgICAgICAgY29uZGl0aW9uczogZm9ybVZhbHVlLmNvbmRpdGlvbnMsXG4gICAgICAgIGNvbHVtbnM6IGZvcm1WYWx1ZS5jb2x1bW5zXG4gICAgICB9O1xuXG4gICAgICAvLyBpZiAobGlzdFZpZXcuaXNEZWZhdWx0KSB7XG4gICAgICAvLyAgIHRoaXMubGlzdFZpZXdzLmZvckVhY2godmlldyA9PiB7XG4gICAgICAvLyAgICAgaWYgKHZpZXcuaWQgIT09IGxpc3RWaWV3LmlkKSB2aWV3LmlzRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgLy8gICB9KTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gY29uc3QgZXhpc3RpbmdJbmRleCA9IHRoaXMubGlzdFZpZXdzLmZpbmRJbmRleCh2aWV3ID0+IHZpZXcuaWQgPT09IGxpc3RWaWV3LmlkKTtcbiAgICAgIC8vIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgIC8vICAgdGhpcy5saXN0Vmlld3NbZXhpc3RpbmdJbmRleF0gPSB7IC4uLmxpc3RWaWV3IH07XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aGlzLmxpc3RWaWV3cy5wdXNoKGxpc3RWaWV3KTtcbiAgICAgIC8vIH1cblxuICAgICAgdGhpcy5saXN0Vmlld3Muc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSBsaXN0Vmlldy5maWx0ZXJOYW1lO1xuICAgICAgdGhpcy5saXN0Vmlld0VtaXQuZW1pdCh7J2FjdGlvbic6J3NhdmUnLCBcImRhdGFcIjogbGlzdFZpZXd9KTtcbiAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IFNob3dzIGFjdGlvbiBidXR0b25zIGZvciBhIGxpc3QgdmlldyBvbiBob3ZlclxuICBzaG93QWN0aW9ucyh2aWV3OiBMaXN0Vmlldyk6IHZvaWQge1xuICAgIHZpZXcuc2hvd0FjdGlvbnMgPSB0cnVlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IEhpZGVzIGFjdGlvbiBidXR0b25zIGZvciBhbGwgbGlzdCB2aWV3c1xuICBoaWRlQWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RWaWV3cy5mb3JFYWNoKHZpZXcgPT4gdmlldy5zaG93QWN0aW9ucyA9IGZhbHNlKTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBPcGVucyBjb25maXJtYXRpb24gbW9kYWwgdG8gZGVsZXRlIGEgbGlzdCB2aWV3XG4gIGNvbmZpcm1EZWxldGUodmlldzogTGlzdFZpZXcsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudmlld1RvRGVsZXRlID0gdmlldztcbiAgICB0aGlzLmlzRGVsZXRlTW9kYWxPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgQ2xvc2VzIHRoZSBkZWxldGUgY29uZmlybWF0aW9uIG1vZGFsXG4gIGNsb3NlRGVsZXRlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc0RlbGV0ZU1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMudmlld1RvRGVsZXRlID0gbnVsbDtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBEZWxldGVzIHRoZSBzZWxlY3RlZCBsaXN0IHZpZXcgYWZ0ZXIgY29uZmlybWF0aW9uXG4gIGRlbGV0ZUNvbmZpcm1lZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3VG9EZWxldGUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0Vmlld3MuZmluZEluZGV4KHZpZXcgPT4gdmlldy5maWx0ZXJOYW1lID09PSB0aGlzLnZpZXdUb0RlbGV0ZT8uZmlsdGVyTmFtZSk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAvLyB0aGlzLmxpc3RWaWV3cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZpZXcgPT09IHRoaXMudmlld1RvRGVsZXRlLmZpbHRlck5hbWUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHRoaXMubGlzdFZpZXdzPy5sZW5ndGggPiAwID8gdGhpcy5saXN0Vmlld3NbMF0uZmlsdGVyTmFtZSA6ICcnO1xuICAgICAgICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoeydhY3Rpb24nOidzZWxlY3QnLCAnZGF0YSc6dGhpcy5zZWxlY3RlZFZpZXd9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RWaWV3RW1pdC5lbWl0KHsnYWN0aW9uJzogJ2RlbGV0ZScsIFwiZGF0YVwiOiB0aGlzLnZpZXdUb0RlbGV0ZX0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jbG9zZURlbGV0ZU1vZGFsKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU0tTM01BWTI1IFJldHVybnMgZmlsdGVyZWQgbGlzdCBvZiBjb2x1bW5zIGJhc2VkIG9uIGlucHV0IHNlYXJjaCB0ZXJtXG4gIGdldEZpbHRlcmVkQ29sdW1ucyh0ZXJtOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0ZXJtKSByZXR1cm4gdGhpcy5jb2x1bW5OYW1lcztcbiAgICB0ZXJtID0gdGVybS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmNvbHVtbk5hbWVzLmZpbHRlcihmaWVsZCA9PiBmaWVsZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBSZXR1cm5zIGZpbHRlcmVkIGxpc3Qgb2Ygb3BlcmF0b3JzIGJhc2VkIG9uIGlucHV0IHNlYXJjaCB0ZXJtXG4gIGdldEZpbHRlcmVkT3BlcmF0b3JzKHRlcm06IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRlcm0pIHJldHVybiB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycztcbiAgICB0ZXJtID0gdGVybS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycy5maWx0ZXIob3BlcmF0b3IgPT4gb3BlcmF0b3IudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgUmV0dXJucyBwb3NzaWJsZSB2YWx1ZXMgZm9yIGEgc2VsZWN0ZWQgZmllbGQvY29sdW1uXG4gIGdldFBvc3NpYmxlVmFsdWVzKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uVmFsdWVzTWFwW2ZpZWxkXSB8fCBbXTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBPcGVucyBhIGRyb3Bkb3duIG9uIGZvY3VzIGZvciB0aGUgZ2l2ZW4gaW5wdXQgdHlwZSBhbmQgaW5kZXhcbiAgb25Gb2N1cyh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodHlwZSA9PT0gJ2ZpZWxkJykge1xuICAgICAgdGhpcy5pc0NvbHVtbkRyb3Bkb3duT3BlbltpbmRleF0gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29wZXJhdG9yJykge1xuICAgICAgdGhpcy5pc09wZXJhdG9yRHJvcGRvd25PcGVuW2luZGV4XSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAndmFsdWUnKSB7XG4gICAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW5baW5kZXhdID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjb2x1bW5OYW1lJykge1xuICAgICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW5baW5kZXhdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgRGVsYXlzIGNsb3NpbmcgZHJvcGRvd24gdG8gYWxsb3cgc2VsZWN0aW9uIG9uIGJsdXJcbiAgb25CbHVyKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHR5cGUgPT09ICdmaWVsZCcpIHtcbiAgICAgICAgdGhpcy5pc0NvbHVtbkRyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29wZXJhdG9yJykge1xuICAgICAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgdGhpcy5pc1ZhbHVlRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnY29sdW1uTmFtZScpIHtcbiAgICAgICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4vLyBTS1MzTUFZMjUgU2V0cyBzZWxlY3RlZCB2YWx1ZSBpbiB0aGUgZm9ybSBjb250cm9sIGFuZCBjbG9zZXMgdGhlIGRyb3Bkb3duXG4gIHNlbGVjdE9wdGlvbih0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZSA9PT0gJ2ZpZWxkJykge1xuICAgICAgdGhpcy5jb25kaXRpb25zLmF0KGluZGV4KS5nZXQoJ2ZpZWxkJyk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuaXNDb2x1bW5Ecm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BlcmF0b3InKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbnMuYXQoaW5kZXgpLmdldCgnb3BlcmF0b3InKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5pc09wZXJhdG9yRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgdGhpcy5jb25kaXRpb25zLmF0KGluZGV4KS5nZXQoJ3ZhbHVlJyk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICAgIHRoaXMuaXNWYWx1ZURyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjb2x1bW5OYW1lJykge1xuICAgICAgdGhpcy5jb2x1bW5zLmF0KGluZGV4KS5nZXQoJ25hbWUnKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU0tTM01BWTI1IExpc3RlbnMgdG8gZG9jdW1lbnQgY2xpY2sgYW5kIGNsb3NlcyB0aGUgZHJvcGRvd24gaWYgY2xpY2tlZCBvdXRzaWRlXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCF0YXJnZXQuY2xvc2VzdCgnLmxpc3Qtdmlldy1maWx0ZXInKSkge1xuICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJsaXN0LXZpZXctZmlsdGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsXCI+RGF0YSBSZWxhdGVkIHRvPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImZpbHRlci1pY29uXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiNVwiIGZpbGw9XCIjRjFGMUYxXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuNTEyODggNC41SDEyLjE4NzlDMTIuNzQyOSA0LjUgMTMuMjAwNCA0Ljk1NzUgMTMuMjAwNCA1LjUxMjVWNi42MjI0OUMxMy4yMDA0IDcuMDI3NDkgMTIuOTQ1NCA3LjUzIDEyLjY5NzkgNy43ODVMMTAuNTIyOSA5LjcwNUMxMC4yMjI5IDkuOTYgMTAuMDIwNCAxMC40NjI1IDEwLjAyMDQgMTAuODY3NVYxMy4wNDI1QzEwLjAyMDQgMTMuMzQyNSA5LjgxNzkgMTMuNzQ3NSA5LjU2MjkgMTMuOTA1TDguODU3ODkgMTQuMzYyNUM4LjE5Nzg5IDE0Ljc2NzUgNy4yOTAzNyAxNC4zMSA3LjI5MDM3IDEzLjVWMTAuODIyNUM3LjI5MDM3IDEwLjQ3IDcuMDg3ODkgMTAuMDEyNSA2Ljg4NTM5IDkuNzU3NTFMNC45NjUzOSA3LjczMjVDNC43MTAzOSA3LjQ3NzUgNC41MDc5IDcuMDI3NDkgNC41MDc5IDYuNzE5OTlWNS41NTc1QzQuNTAwNCA0Ljk1NzUgNC45NTc4OCA0LjUgNS41MTI4OCA0LjVaXCIgc3Ryb2tlPVwiIzI5MkQzMlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMTBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC41IDExLjk5OTlWMTQuMjQ5OUM0LjUgMTcuOTk5OSA2IDE5LjQ5OTkgOS43NSAxOS40OTk5SDE0LjI1QzE4IDE5LjQ5OTkgMTkuNSAxNy45OTk5IDE5LjUgMTQuMjQ5OVY5Ljc0OTk0QzE5LjUgNy40MDk5NCAxOC45MTUgNS45Mzk5MyAxNy41NTc1IDUuMTc0OTNDMTcuMTc1IDQuOTU3NDMgMTYuNDEgNC43OTI0MyAxNS43MTI1IDQuNjc5OTNcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjc1IDEyLjc1SDE2LjVcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTExLjI1IDE1Ljc1SDE2LjVcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1vcHRpb25cIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZFZpZXcgfHwgJ1NlbGVjdCBhIHZpZXcnIH19XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjaGV2cm9uLWljb25cIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5Ljk5OTkgMjUuNjY2N0MyMy42ODE4IDI1LjY2NjcgMjYuNjY2NiAyMi42ODE5IDI2LjY2NjYgMTlDMjYuNjY2NiAxNS4zMTgxIDIzLjY4MTggMTIuMzMzNCAxOS45OTk5IDEyLjMzMzRDMTYuMzE4IDEyLjMzMzQgMTMuMzMzMyAxNS4zMTgxIDEzLjMzMzMgMTlDMTMuMzMzMyAyMi42ODE5IDE2LjMxOCAyNS42NjY3IDE5Ljk5OTkgMjUuNjY2N1pcIiBmaWxsPVwiIzI5MkQzMlwiIHN0cm9rZT1cIiMyOTJEMzJcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNjQ2NyAxOC4xNkwyMC4wMDAxIDIwLjUwNjdMMjIuMzUzNCAxOC4xNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU0tTM01BWTI1IGxpc3QgdmlldyBEcm9wIGRvd24tLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzRHJvcGRvd25PcGVuXCIgY2xhc3M9XCJkcm9wZG93bi1vcHRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tb3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgdmlldyBvZiBsaXN0Vmlld3NcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic2VsZWN0ZWRWaWV3ID09PSB2aWV3LmZpbHRlck5hbWVcIiAobW91c2VlbnRlcik9XCJzaG93QWN0aW9ucyh2aWV3KVwiIChtb3VzZWxlYXZlKT1cImhpZGVBY3Rpb25zKClcIiAoY2xpY2spPVwic2VsZWN0TGlzdFZpZXcodmlldylcIiBjbGFzcz1cImxpc3Qtdmlldy1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1uYW1lXCI+e3sgdmlldy5maWx0ZXJOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiICpuZ0lmPVwidmlldy5zaG93QWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtaWNvblwiIChjbGljayk9XCJzdGFydEVkaXQodmlldywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzI5MjMgMy45ODcyNkwxMi4wMTI2IDYuNjcwNTlNOS4zMjkyMyAzLjk4NzI2TDIuNTAwMDggMTAuODE2NFYxMy40OTk3SDUuMTgzNDJMMTIuMDEyNiA2LjY3MDU5TTkuMzI5MjMgMy45ODcyNkwxMi4wMTI2IDEuMzAzOTJMMTQuNjk1OSAzLjk4NzI2TDEyLjAxMjYgNi42NzA1OVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cImNvbmZpcm1EZWxldGUodmlldywgJGV2ZW50KVwiICpuZ0lmPVwibGlzdFZpZXdzLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuNjY2NSAzLjMxMzYyTDUuODEzMTcgMi40NDAyOEM1LjkxOTg0IDEuODA2OTUgNS45OTk4NCAxLjMzMzYyIDcuMTI2NSAxLjMzMzYySDguODczMTdDOS45OTk4NCAxLjMzMzYyIDEwLjA4NjUgMS44MzM2MiAxMC4xODY1IDIuNDQ2OTVMMTAuMzMzMiAzLjMxMzYyXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4zMzM1IDguMzMzMjVIOS42NjY4M1wiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZC1maWx0ZXJcIiAoY2xpY2spPVwic3RhcnRBZGQoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCAzLjMzMzI1VjEyLjY2NjZcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy4zMzMwMSA4SDEyLjY2NjNcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4+TmV3IExpc3QgVmlldzwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAgPCEtLSBTS1MzTUFZMjUgQWRkIE5ldyBMaXN0IFZpZXctLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNNb2RhbE9wZW5cIiBjbGFzcz1cIm1vZGFsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICA8aDI+e3sgaXNBZGRpbmcgPyAnQWRkIE5ldyBMaXN0IFZpZXcnIDogJ0VkaXQgTGlzdCBWaWV3JyB9fTwvaDI+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImVkaXRpbmdWaWV3XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TmFtZTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImZpbHRlck5hbWVcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGxpc3QgdmlldyBuYW1lXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGluZ1ZpZXcuZ2V0KCdmaWx0ZXJOYW1lJyk/LmludmFsaWQgJiYgKGVkaXRpbmdWaWV3LmdldCgnZmlsdGVyTmFtZScpPy5kaXJ0eSB8fCBlZGl0aW5nVmlldy5nZXQoJ2ZpbHRlck5hbWUnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk9yZGVyOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cIm9yZGVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBkaXNwbGF5IG9yZGVyXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGluZ1ZpZXcuZ2V0KCdvcmRlcicpPy5pbnZhbGlkICYmIChlZGl0aW5nVmlldy5nZXQoJ29yZGVyJyk/LmRpcnR5IHx8IGVkaXRpbmdWaWV3LmdldCgnb3JkZXInKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlciBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIG51bWJlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5EZWZhdWx0IFZpZXc6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtd3JhcHBlciBzbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0RlZmF1bHRcIiBpZD1cImlzRGVmYXVsdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJpc0RlZmF1bHRcIiBjbGFzcz1cInRvZ2dsZS1idXR0b25cIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMz5GaWx0ZXJzPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWN0aW9uLWRlc2NyaXB0aW9uXCI+RGVmaW5lIGNvbmRpdGlvbnMgZm9yIGZpbHRlcmVkIGxpc3Qgdmlldzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJjb25kaXRpb25zXCIgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1jZWxsXCI+Q29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3BlcmF0b3ItY2VsbFwiPk9wZXJhdG9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtY2VsbFwiPlZhbHVlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWNlbGxcIj5BY3Rpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgY29uZGl0aW9ucy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmaWVsZFwiIChmb2N1cyk9XCJvbkZvY3VzKCdmaWVsZCcsIGkpXCIgKGJsdXIpPVwib25CbHVyKCdmaWVsZCcsIGkpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBvciBzZWxlY3QgY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1saXN0XCIgKm5nSWY9XCJpc0NvbHVtbkRyb3Bkb3duT3BlbltpXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZ2V0RmlsdGVyZWRDb2x1bW5zKGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCdmaWVsZCcpLnZhbHVlKVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJzZWxlY3RPcHRpb24oJ2ZpZWxkJywgaSwgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmdldCgnZmllbGQnKT8uaW52YWxpZCAmJiAoZmlsdGVyLmdldCgnZmllbGQnKT8uZGlydHkgfHwgZmlsdGVyLmdldCgnZmllbGQnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcGVyYXRvci1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cIm9wZXJhdG9yXCIgKGZvY3VzKT1cIm9uRm9jdXMoJ29wZXJhdG9yJywgaSlcIiAoYmx1cik9XCJvbkJsdXIoJ29wZXJhdG9yJywgaSlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIG9yIHNlbGVjdCBvcGVyYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbGlzdFwiICpuZ0lmPVwiaXNPcGVyYXRvckRyb3Bkb3duT3BlbltpXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3BlcmF0b3Igb2YgZ2V0RmlsdGVyZWRPcGVyYXRvcnMoY29uZGl0aW9ucy5hdChpKS5nZXQoJ29wZXJhdG9yJykudmFsdWUpXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdE9wdGlvbignb3BlcmF0b3InLCBpLCBvcGVyYXRvcilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcGVyYXRvciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIuZ2V0KCdvcGVyYXRvcicpPy5pbnZhbGlkICYmIChmaWx0ZXIuZ2V0KCdvcGVyYXRvcicpPy5kaXJ0eSB8fCBmaWx0ZXIuZ2V0KCdvcGVyYXRvcicpPy50b3VjaGVkKVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiIChmb2N1cyk9XCJvbkZvY3VzKCd2YWx1ZScsIGkpXCIgKGJsdXIpPVwib25CbHVyKCd2YWx1ZScsIGkpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBvciBzZWxlY3QgdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWxpc3RcIiAqbmdJZj1cImlzVmFsdWVEcm9wZG93bk9wZW5baV0gJiYgZ2V0UG9zc2libGVWYWx1ZXMoY29uZGl0aW9ucy5hdChpKS5nZXQoJ2ZpZWxkJykudmFsdWUpLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhbCBvZiBnZXRQb3NzaWJsZVZhbHVlcyhjb25kaXRpb25zLmF0KGkpLmdldCgnZmllbGQnKS52YWx1ZSlcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0T3B0aW9uKCd2YWx1ZScsIGksIHZhbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmdldCgndmFsdWUnKT8uaW52YWxpZCAmJiAoZmlsdGVyLmdldCgndmFsdWUnKT8uZGlydHkgfHwgZmlsdGVyLmdldCgndmFsdWUnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpY29uLWNvbnRhaW5lclwiIG1hdFRvb2x0aXA9XCJSZW1vdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjMzMzUgOC4zMzMyNUg5LjY2NjgzXCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWRkSWNvbkJvciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRGaWx0ZXIoKVwiIG1hdFRvb2x0aXA9XCJBZGQgRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZEljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggMy4zMzMyNVYxMi42NjY2XCIgc3Ryb2tlPVwiIzAwN2JmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuMzMzMDEgOEgxMi42NjYzXCIgc3Ryb2tlPVwiIzAwN2JmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BZGQgRmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8aDM+Q29sdW1uczwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi1kZXNjcmlwdGlvblwiPkNvbmZpZ3VyZSBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhpcyB2aWV3PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImNvbHVtbnNcIiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZS1jZWxsXCI+Q29sdW1uIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib29sLWNlbGxcIj5Tb3J0YWJsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb2wtY2VsbFwiPkZpbHRlcmFibGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tY2VsbFwiPkFjdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGNvbHVtbnMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJjb2x1bW4tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiAoZm9jdXMpPVwib25Gb2N1cygnY29sdW1uTmFtZScsIGkpXCIgKGJsdXIpPVwib25CbHVyKCdjb2x1bW5OYW1lJywgaSlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIG9yIHNlbGVjdCBjb2x1bW4gbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbGlzdFwiICpuZ0lmPVwiaXNDb2x1bW5OYW1lRHJvcGRvd25PcGVuW2ldXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2xOYW1lIG9mIGRpc3BsYXllZENvbHVtbnNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0T3B0aW9uKCdjb2x1bW5OYW1lJywgaSwgY29sTmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2xOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLmdldCgnbmFtZScpPy5pbnZhbGlkICYmIChmaWVsZC5nZXQoJ25hbWUnKT8uZGlydHkgfHwgZmllbGQuZ2V0KCduYW1lJyk/LnRvdWNoZWQpXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiBuYW1lIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib29sLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLXdyYXBwZXIgc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInc29ydGFibGUtJyArIGlcIiBmb3JtQ29udHJvbE5hbWU9XCJzb3J0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInc29ydGFibGUtJyArIGlcIiBjbGFzcz1cInRvZ2dsZS1idXR0b25cIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib29sLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLXdyYXBwZXIgc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInZmlsdGVyYWJsZS0nICsgaVwiIGZvcm1Db250cm9sTmFtZT1cImZpbHRlcmFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ2ZpbHRlcmFibGUtJyArIGlcIiBjbGFzcz1cInRvZ2dsZS1idXR0b25cIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWNvbi1jb250YWluZXJcIiBtYXRUb29sdGlwPVwiUmVtb3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxldGUtaWNvblwiIChjbGljayk9XCJyZW1vdmVDb2x1bW4oaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQgMy45ODcyNkMxMS43OCAzLjc2NzI2IDkuNTQ2NjcgMy42NTM5MyA3LjMyIDMuNjUzOTNDNiAzLjY1MzkzIDQuNjggMy43MjA2IDMuMzYgMy44NTM5M0wyIDMuOTg3MjZcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuNjY2NSAzLjMxMzYyTDUuODEzMTcgMi40NDAyOEM1LjkxOTg0IDEuODA2OTUgNS45OTk4NCAxLjMzMzYyIDcuMTI2NSAxLjMzMzYySDguODczMTdDOS45OTk4NCAxLjMzMzYyIDEwLjA4NjUgMS44MzM2MiAxMC4xODY1IDIuNDQ2OTVMMTAuMzMzMiAzLjMxMzYyXCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi41NjY3IDYuMDkzNzVMMTIuMTMzNCAxMi44MDcxQzEyLjA2IDEzLjg1MzcgMTIgMTQuNjY3MSAxMC4xNCAxNC42NjcxSDUuODYwMDJDNC4wMDAwMiAxNC42NjcxIDMuOTQwMDIgMTMuODUzNyAzLjg2NjY4IDEyLjgwNzFMMy40MzMzNSA2LjA5Mzc1XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02Ljg4NjQ3IDExLjAwMDRIOS4xMDY0N1wiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4zMzM1IDguMzMzMjVIOS42NjY4M1wiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFkZEljb25Cb3IgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ29sdW1uKClcIiBtYXRUb29sdGlwPVwiQWRkIENvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRJY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDMuMzMzMjVWMTIuNjY2NlwiIHN0cm9rZT1cIiMwMDdiZmZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLjMzMzAxIDhIMTIuNjY2M1wiIHN0cm9rZT1cIiMwMDdiZmZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWRkIENvbHVtbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbmRpdGlvbnMubGVuZ3RoID09PSAwICYmIGNvbHVtbnMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBmaWx0ZXIgb3Igb25lIGNvbHVtbiBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2F2ZS1idXR0b25cIiAoY2xpY2spPVwic2F2ZSgpXCIgW2Rpc2FibGVkXT1cIiFlZGl0aW5nVmlldy52YWxpZCB8fCAoY29uZGl0aW9ucy5sZW5ndGggPT09IDAgJiYgY29sdW1ucy5sZW5ndGggPT09IDApXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gU0tTM01BWTI1IERlbGV0ZSBMaXN0IFZpZXctLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNEZWxldGVNb2RhbE9wZW5cIiBjbGFzcz1cIm1vZGFsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICA8aDI+RGVsZXRlIExpc3QgVmlldzwvaDI+XG4gICAgICAgICAgICA8cD5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIFwie3sgdmlld1RvRGVsZXRlPy5maWx0ZXJOYW1lIH19XCI/PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZGVsZXRlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZUNvbmZpcm1lZCgpXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlRGVsZXRlTW9kYWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC12aWV3LWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9saXN0LXZpZXctZmlsdGVyL2xpc3Qtdmlldy1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC12aWV3LWZpbHRlci9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUE4QmpILE1BQU0sT0FBTyx1QkFBdUI7SUE2QmQ7SUE1QlgsU0FBUyxHQUFlLEVBQUUsQ0FBQztJQUMzQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFDM0IsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixnQkFBZ0IsR0FBUSxFQUFFLENBQUM7SUFDM0Isa0JBQWtCLEdBQXVDO1FBQ2hFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7UUFDeEMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUN6QyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUN0QyxFQUFFLEtBQUssRUFBRSw0QkFBNEIsRUFB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bUI7OzRGQUk3Qyx1QkFBdUI7a0JBUG5DLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUM7Z0ZBS2hELFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFTSSxZQUFZO3NCQUFyQixNQUFNO2dCQXdWUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbnRlcmZhY2UgTGlzdFZpZXcge1xuICBmaWx0ZXJOYW1lOiBzdHJpbmc7XG4gIG9yZGVyOiBudW1iZXI7XG4gIGlzRGVmYXVsdDogYm9vbGVhbjtcbiAgY29uZGl0aW9uczogTGlzdFZpZXdGaWx0ZXJbXTtcbiAgY29sdW1uczogTGlzdFZpZXdDb2x1bW5bXTtcbiAgc2hvd0FjdGlvbnM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTGlzdFZpZXdGaWx0ZXIge1xuICBmaWVsZDogc3RyaW5nO1xuICBvcGVyYXRvcjogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTGlzdFZpZXdDb2x1bW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHNvcnRhYmxlOiBib29sZWFuO1xuICBmaWx0ZXJhYmxlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbGlzdC12aWV3LWZpbHRlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3Qtdmlldy1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Vmlld0ZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGxpc3RWaWV3czogTGlzdFZpZXdbXSA9IFtdO1xuICBASW5wdXQoKSB0YWJsZUZpbHRlckFycmF5OiBhbnkgPSBbXTtcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGlzcGxheWVkQ29sdW1uczogYW55ID0gW107XG4gIEBJbnB1dCgpIGF2YWlsYWJsZU9wZXJhdG9yczogeyBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcbiAgICB7IGxhYmVsOiAnRXF1YWxzICg9KScsIHZhbHVlOiAnPScgfSxcbiAgICB7IGxhYmVsOiAnTm90IEVxdWFsICghPSknLCB2YWx1ZTogJyE9JyB9LFxuICAgIHsgbGFiZWw6ICdHcmVhdGVyIFRoYW4gKD4pJywgdmFsdWU6ICc+JyB9LFxuICAgIHsgbGFiZWw6ICdMZXNzIFRoYW4gKDwpJywgdmFsdWU6ICc8JyB9LFxuICAgIHsgbGFiZWw6ICdHcmVhdGVyIFRoYW4gb3IgRXF1YWwgKD49KScsIHZhbHVlOiAnPj0nIH0sXG4gICAgeyBsYWJlbDogJ0xlc3MgVGhhbiBvciBFcXVhbCAoPD0pJywgdmFsdWU6ICc8PScgfVxuICBdOyAgLy8gJ2NvbnRhaW5zJywgJ25vdCBjb250YWlucycsICdzdGFydHMgd2l0aCcsICdlbmRzIHdpdGgnXG5cbiAgQE91dHB1dCgpIGxpc3RWaWV3RW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGlzRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzTW9kYWxPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzRGVsZXRlTW9kYWxPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzQWRkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHZpZXdUb0RlbGV0ZTogTGlzdFZpZXcgfCBudWxsID0gbnVsbDtcblxuICBlZGl0aW5nVmlldzogRm9ybUdyb3VwO1xuXG4gIGlzQ29sdW1uRHJvcGRvd25PcGVuOiBib29sZWFuW10gPSBbXTtcbiAgaXNPcGVyYXRvckRyb3Bkb3duT3BlbjogYm9vbGVhbltdID0gW107XG4gIGlzVmFsdWVEcm9wZG93bk9wZW46IGJvb2xlYW5bXSA9IFtdO1xuICBpc0NvbHVtbk5hbWVEcm9wZG93bk9wZW46IGJvb2xlYW5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5lZGl0aW5nVmlldyA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgZmlsdGVyTmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIG9yZGVyOiBbMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXG4gICAgICBpc0RlZmF1bHQ6IFtmYWxzZV0sXG4gICAgICBjb25kaXRpb25zOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIGNvbHVtbnM6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgaWYgKCF0aGlzLnNlbGVjdGVkVmlldyAmJiB0aGlzLmxpc3RWaWV3cz8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSB0aGlzLmxpc3RWaWV3c1swXS5maWx0ZXJOYW1lO1xuICAgIH1cbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVmlldyAmJiB0aGlzLmxpc3RWaWV3cz8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSB0aGlzLmxpc3RWaWV3c1swXS5maWx0ZXJOYW1lO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyh0aGlzLnRhYmxlRmlsdGVyQXJyYXkpXG4gIH1cblxuICBnZXQgY29uZGl0aW9ucygpOiBGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdWaWV3LmdldCgnY29uZGl0aW9ucycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBSZXR1cm5zIHRoZSBGb3JtQXJyYXkgb2YgY29sdW1ucyBmcm9tIHRoZSBlZGl0aW5nIGZvcm1cbiAgZ2V0IGNvbHVtbnMoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nVmlldy5nZXQoJ2NvbHVtbnMnKSBhcyBGb3JtQXJyYXk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgQWRkcyBhIG5ldyBmaWx0ZXIgY29uZGl0aW9uIHRvIHRoZSBmb3JtXG4gIGFkZEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZpZWxkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgb3BlcmF0b3I6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgIH0pKTtcbiAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuLnB1c2goZmFsc2UpO1xuICAgIHRoaXMuaXNPcGVyYXRvckRyb3Bkb3duT3Blbi5wdXNoKGZhbHNlKTtcbiAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW4ucHVzaChmYWxzZSk7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgUmVtb3ZlcyBhIGZpbHRlciBjb25kaXRpb24gYnkgaW5kZXhcbiAgcmVtb3ZlRmlsdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmRpdGlvbnMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMuaXNDb2x1bW5Ecm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBzb3J0YWJsZTogW2ZhbHNlXSxcbiAgICAgIGZpbHRlcmFibGU6IFtmYWxzZV1cbiAgICB9KSk7XG4gICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW4ucHVzaChmYWxzZSk7XG4gIH1cblxuICByZW1vdmVDb2x1bW4oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29sdW1ucy5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5pc0NvbHVtbk5hbWVEcm9wZG93bk9wZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoe1wiYWN0aW9uXCI6ICdmaWx0ZXJHZXQnfSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzRHJvcGRvd25PcGVuO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IEhhbmRsZXMgc2VsZWN0aW5nIGEgbGlzdCB2aWV3IGZyb20gdGhlIGRyb3Bkb3duXG4gIHNlbGVjdExpc3RWaWV3KHZpZXc6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdmlldy5maWx0ZXJOYW1lO1xuICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoeydhY3Rpb24nOidzZWxlY3QnLCAnZGF0YSc6dmlld30pO1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBPcGVucyBtb2RhbCB0byBlZGl0IGFuIGV4aXN0aW5nIGxpc3Qgdmlld1xuICBzdGFydEVkaXQodmlldzogTGlzdFZpZXcsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5pc0FkZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNNb2RhbE9wZW4gPSB0cnVlO1xuXG4gICAgdGhpcy5lZGl0aW5nVmlldy5yZXNldCgpO1xuICAgIHdoaWxlICh0aGlzLmNvbmRpdGlvbnMubGVuZ3RoKSB0aGlzLmNvbmRpdGlvbnMucmVtb3ZlQXQoMCk7XG4gICAgd2hpbGUgKHRoaXMuY29sdW1ucy5sZW5ndGgpIHRoaXMuY29sdW1ucy5yZW1vdmVBdCgwKTtcblxuICAgIHRoaXMuZWRpdGluZ1ZpZXcucGF0Y2hWYWx1ZSh7XG4gICAgICBmaWx0ZXJOYW1lOiB2aWV3LmZpbHRlck5hbWUsXG4gICAgICBvcmRlcjogdmlldy5vcmRlcixcbiAgICAgIGlzRGVmYXVsdDogdmlldy5pc0RlZmF1bHRcbiAgICB9KTtcblxuICAgIHZpZXc/LmNvbmRpdGlvbnM/LmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIHRoaXMuY29uZGl0aW9ucy5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBmaWVsZDogW2ZpbHRlci5maWVsZCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG9wZXJhdG9yOiBbZmlsdGVyLm9wZXJhdG9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgdmFsdWU6IFtmaWx0ZXIudmFsdWUsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBcbiAgICB2aWV3Py5jb2x1bW5zPy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmKGNvbC5uYW1lID09IGZpZWxkLmZpZWxkTmFtZSkge1xuICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgbmFtZTogW2ZpZWxkLmxhYmVsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIHNvcnRhYmxlOiBbY29sLnNvcnRhYmxlXSxcbiAgICAgICAgICAgIGZpbHRlcmFibGU6IFtjb2wuZmlsdGVyYWJsZV1cbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxuICAvLyBTS1MzTUFZMjUgT3BlbnMgbW9kYWwgdG8gY3JlYXRlIGEgbmV3IGxpc3Qgdmlld1xuICBzdGFydEFkZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQWRkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmlzTW9kYWxPcGVuID0gdHJ1ZTtcblxuICAgIHRoaXMuZWRpdGluZ1ZpZXcucmVzZXQoKTtcbiAgICB3aGlsZSAodGhpcy5jb25kaXRpb25zLmxlbmd0aCkgdGhpcy5jb25kaXRpb25zLnJlbW92ZUF0KDApO1xuICAgIHdoaWxlICh0aGlzLmNvbHVtbnMubGVuZ3RoKSB0aGlzLmNvbHVtbnMucmVtb3ZlQXQoMCk7XG5cbiAgICB0aGlzLmVkaXRpbmdWaWV3LnBhdGNoVmFsdWUoe1xuICAgICAgb3JkZXI6IHRoaXMubGlzdFZpZXdzPy5sZW5ndGgsXG4gICAgICBpc0RlZmF1bHQ6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gICAgLy8gU0tTMjZNQVkyNSBTZWNvbmQgbG9vcDogZnJvbSBkaXNwbGF5ZWRDb2x1bW5zLCBza2lwIGR1cGxpY2F0ZXNcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbmFtZTogW2ZpZWxkLmxhYmVsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc29ydGFibGU6IFtmaWVsZC5oeXBlckxpbmtdLFxuICAgICAgICBmaWx0ZXJhYmxlOiBbZmllbGQuZmlsdGVyXVxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IFNhdmVzIHRoZSBjdXJyZW50bHkgZWRpdGVkIG9yIGFkZGVkIGxpc3Qgdmlld1xuICBzYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRpbmdWaWV3LnZhbGlkKSB7XG4gICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmVkaXRpbmdWaWV3LnZhbHVlO1xuICAgICAgZm9ybVZhbHVlPy5jb2x1bW5zPy5mb3JFYWNoKChjb2wpPT57XG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChkQ29sKSA9PiB7XG4gICAgICAgICAgaWYgKGRDb2wubGFiZWwgPT09IGNvbC5uYW1lKSB7XG4gICAgICAgICAgICBjb2wubmFtZSA9IGRDb2wuZmllbGROYW1lXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIGNvbnN0IGxpc3RWaWV3OiBMaXN0VmlldyA9IHtcbiAgICAgICAgZmlsdGVyTmFtZTogZm9ybVZhbHVlLmZpbHRlck5hbWUsXG4gICAgICAgIG9yZGVyOiBmb3JtVmFsdWUub3JkZXIsXG4gICAgICAgIGlzRGVmYXVsdDogZm9ybVZhbHVlLmlzRGVmYXVsdCxcbiAgICAgICAgY29uZGl0aW9uczogZm9ybVZhbHVlLmNvbmRpdGlvbnMsXG4gICAgICAgIGNvbHVtbnM6IGZvcm1WYWx1ZS5jb2x1bW5zXG4gICAgICB9O1xuXG4gICAgICAvLyBpZiAobGlzdFZpZXcuaXNEZWZhdWx0KSB7XG4gICAgICAvLyAgIHRoaXMubGlzdFZpZXdzLmZvckVhY2godmlldyA9PiB7XG4gICAgICAvLyAgICAgaWYgKHZpZXcuaWQgIT09IGxpc3RWaWV3LmlkKSB2aWV3LmlzRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgLy8gICB9KTtcbiAgICAgIC8vIH1cblxuICAgICAgLy8gY29uc3QgZXhpc3RpbmdJbmRleCA9IHRoaXMubGlzdFZpZXdzLmZpbmRJbmRleCh2aWV3ID0+IHZpZXcuaWQgPT09IGxpc3RWaWV3LmlkKTtcbiAgICAgIC8vIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgIC8vICAgdGhpcy5saXN0Vmlld3NbZXhpc3RpbmdJbmRleF0gPSB7IC4uLmxpc3RWaWV3IH07XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aGlzLmxpc3RWaWV3cy5wdXNoKGxpc3RWaWV3KTtcbiAgICAgIC8vIH1cblxuICAgICAgdGhpcy5saXN0Vmlld3Muc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSBsaXN0Vmlldy5maWx0ZXJOYW1lO1xuICAgICAgdGhpcy5saXN0Vmlld0VtaXQuZW1pdCh7J2FjdGlvbic6J3NhdmUnLCBcImRhdGFcIjogbGlzdFZpZXd9KTtcbiAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc01vZGFsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IFNob3dzIGFjdGlvbiBidXR0b25zIGZvciBhIGxpc3QgdmlldyBvbiBob3ZlclxuICBzaG93QWN0aW9ucyh2aWV3OiBMaXN0Vmlldyk6IHZvaWQge1xuICAgIHZpZXcuc2hvd0FjdGlvbnMgPSB0cnVlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IEhpZGVzIGFjdGlvbiBidXR0b25zIGZvciBhbGwgbGlzdCB2aWV3c1xuICBoaWRlQWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RWaWV3cy5mb3JFYWNoKHZpZXcgPT4gdmlldy5zaG93QWN0aW9ucyA9IGZhbHNlKTtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBPcGVucyBjb25maXJtYXRpb24gbW9kYWwgdG8gZGVsZXRlIGEgbGlzdCB2aWV3XG4gIGNvbmZpcm1EZWxldGUodmlldzogTGlzdFZpZXcsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMudmlld1RvRGVsZXRlID0gdmlldztcbiAgICB0aGlzLmlzRGVsZXRlTW9kYWxPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gIH1cblxuICAvLyBTS1MzTUFZMjUgQ2xvc2VzIHRoZSBkZWxldGUgY29uZmlybWF0aW9uIG1vZGFsXG4gIGNsb3NlRGVsZXRlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc0RlbGV0ZU1vZGFsT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMudmlld1RvRGVsZXRlID0gbnVsbDtcbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBEZWxldGVzIHRoZSBzZWxlY3RlZCBsaXN0IHZpZXcgYWZ0ZXIgY29uZmlybWF0aW9uXG4gIGRlbGV0ZUNvbmZpcm1lZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3VG9EZWxldGUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0Vmlld3MuZmluZEluZGV4KHZpZXcgPT4gdmlldy5maWx0ZXJOYW1lID09PSB0aGlzLnZpZXdUb0RlbGV0ZT8uZmlsdGVyTmFtZSk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAvLyB0aGlzLmxpc3RWaWV3cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFZpZXcgPT09IHRoaXMudmlld1RvRGVsZXRlLmZpbHRlck5hbWUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IHRoaXMubGlzdFZpZXdzPy5sZW5ndGggPiAwID8gdGhpcy5saXN0Vmlld3NbMF0uZmlsdGVyTmFtZSA6ICcnO1xuICAgICAgICAgIHRoaXMubGlzdFZpZXdFbWl0LmVtaXQoeydhY3Rpb24nOidzZWxlY3QnLCAnZGF0YSc6dGhpcy5zZWxlY3RlZFZpZXd9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RWaWV3RW1pdC5lbWl0KHsnYWN0aW9uJzogJ2RlbGV0ZScsIFwiZGF0YVwiOiB0aGlzLnZpZXdUb0RlbGV0ZX0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jbG9zZURlbGV0ZU1vZGFsKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU0tTM01BWTI1IFJldHVybnMgZmlsdGVyZWQgbGlzdCBvZiBjb2x1bW5zIGJhc2VkIG9uIGlucHV0IHNlYXJjaCB0ZXJtXG4gIGdldEZpbHRlcmVkQ29sdW1ucyh0ZXJtOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgaWYgKCF0ZXJtKSByZXR1cm4gdGhpcy50YWJsZUZpbHRlckFycmF5O1xuICAgIHRlcm0gPSB0ZXJtLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMudGFibGVGaWx0ZXJBcnJheS5maWx0ZXIoY29sID0+XG4gICAgICBjb2wubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKVxuICAgICk7XG4gIH1cblxuICBnZXRDb2x1bW5Db2x1bW5zKHRlcm06IHN0cmluZyk6IGFueVtdIHtcbiAgICBjb25zb2xlLmxvZyh0ZXJtKVxuICAgIGlmICghdGVybSkgcmV0dXJuIHRoaXMuZGlzcGxheWVkQ29sdW1ucztcbiAgICB0ZXJtID0gdGVybS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZENvbHVtbnMuZmlsdGVyKGNvbCA9PlxuICAgICAgY29sLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSlcbiAgICApO1xuICB9ICBcbiAgIC8vIFNLUzNNQVkyNSBSZXR1cm5zIHBvc3NpYmxlIHZhbHVlcyBmb3IgYSBzZWxlY3RlZCBmaWVsZC9jb2x1bW5cbiAgIGdldFBvc3NpYmxlVmFsdWVzKGZpZWxkOiBzdHJpbmcsIHRlcm06IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGFibGVGaWx0ZXJBcnJheS5maW5kKGNvbCA9PiBjb2wubGFiZWwgPT09IGZpZWxkKTtcbiAgICBpZiAoIW1hdGNoIHx8ICFBcnJheS5pc0FycmF5KG1hdGNoLnZhbHVlKSkgcmV0dXJuIFtdO1xuICAgIGlmICghdGVybSkgcmV0dXJuIG1hdGNoLnZhbHVlO1xuICAgIGNvbnN0IGxvd2VyVGVybSA9IHRlcm0udG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbWF0Y2gudmFsdWUuZmlsdGVyKHZhbCA9PlxuICAgICAgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJUZXJtKVxuICAgICk7XG4gIH0gIFxuICAvLyBTS1MzTUFZMjUgUmV0dXJucyBmaWx0ZXJlZCBsaXN0IG9mIG9wZXJhdG9ycyBiYXNlZCBvbiBpbnB1dCBzZWFyY2ggdGVybVxuICBnZXRGaWx0ZXJlZE9wZXJhdG9ycyh0ZXJtOiBzdHJpbmcpOiB7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICBpZiAoIXRlcm0pIHJldHVybiB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycztcbiAgICB0ZXJtID0gdGVybS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZU9wZXJhdG9ycy5maWx0ZXIob3BlcmF0b3IgPT5cbiAgICAgIG9wZXJhdG9yLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSlcbiAgICApO1xuICB9ICBcbiAgb3BlcmF0b3JJbnB1dDogc3RyaW5nW10gPSBbXTtcblxuICBvbk9wZXJhdG9ySW5wdXQodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMub3BlcmF0b3JJbnB1dFtpbmRleF0gPSB2YWx1ZTtcbiAgfVxuICBcbiAgZ2V0T3BlcmF0b3JMYWJlbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuYXZhaWxhYmxlT3BlcmF0b3JzLmZpbmQob3AgPT4gb3AudmFsdWUgPT09IHZhbHVlKTtcbiAgICByZXR1cm4gZm91bmQgPyBmb3VuZC5sYWJlbCA6IHZhbHVlO1xuICB9XG5cbiAgLy8gU0tTM01BWTI1IE9wZW5zIGEgZHJvcGRvd24gb24gZm9jdXMgZm9yIHRoZSBnaXZlbiBpbnB1dCB0eXBlIGFuZCBpbmRleFxuICBvbkZvY3VzKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnZmllbGQnKSB7XG4gICAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuW2luZGV4XSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BlcmF0b3InKSB7XG4gICAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW5baW5kZXhdID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd2YWx1ZScpIHtcbiAgICAgIHRoaXMuaXNWYWx1ZURyb3Bkb3duT3BlbltpbmRleF0gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbHVtbk5hbWUnKSB7XG4gICAgICB0aGlzLmlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbltpbmRleF0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzNNQVkyNSBEZWxheXMgY2xvc2luZyBkcm9wZG93biB0byBhbGxvdyBzZWxlY3Rpb24gb24gYmx1clxuICBvbkJsdXIodHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodHlwZSA9PT0gJ2ZpZWxkJykge1xuICAgICAgICB0aGlzLmlzQ29sdW1uRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BlcmF0b3InKSB7XG4gICAgICAgIHRoaXMuaXNPcGVyYXRvckRyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3ZhbHVlJykge1xuICAgICAgICB0aGlzLmlzVmFsdWVEcm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjb2x1bW5OYW1lJykge1xuICAgICAgICB0aGlzLmlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCAyMDApO1xuICB9XG5cbi8vIFNLUzNNQVkyNSBTZXRzIHNlbGVjdGVkIHZhbHVlIGluIHRoZSBmb3JtIGNvbnRyb2wgYW5kIGNsb3NlcyB0aGUgZHJvcGRvd25cbiAgc2VsZWN0T3B0aW9uKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnZmllbGQnKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbnMuYXQoaW5kZXgpLmdldCgnZmllbGQnKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5pc0NvbHVtbkRyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGVyYXRvcicpIHtcbiAgICAgIHRoaXMuY29uZGl0aW9ucy5hdChpbmRleCkuZ2V0KCdvcGVyYXRvcicpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmlzT3BlcmF0b3JEcm9wZG93bk9wZW5baW5kZXhdID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAndmFsdWUnKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbnMuYXQoaW5kZXgpLmdldCgndmFsdWUnKT8uc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5pc1ZhbHVlRHJvcGRvd25PcGVuW2luZGV4XSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NvbHVtbk5hbWUnKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuYXQoaW5kZXgpLmdldCgnbmFtZScpPy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbltpbmRleF0gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZ2V0TGFiZWxCeUZpZWxkTmFtZShmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc29sZS5sb2coZmllbGROYW1lKVxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmZpbmQoY29sID0+IGNvbC5maWVsZE5hbWUgPT09IGZpZWxkTmFtZSk7XG4gICAgcmV0dXJuIG1hdGNoPy5sYWJlbCA/IG1hdGNoLmxhYmVsIDogZmllbGROYW1lO1xuICB9XG5cbiAgb25NYW51YWxJbnB1dChpbnB1dFZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGlzcGxheWVkQ29sdW1ucy5maW5kKGNvbCA9PiBjb2wubGFiZWwudG9Mb3dlckNhc2UoKSA9PT0gaW5wdXRWYWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5hdChpbmRleCkuZ2V0KCduYW1lJykuc2V0VmFsdWUobWF0Y2gubGFiZWwpO1xuICAgIH1cbiAgfSAgICBcbiAgLy8gU0tTM01BWTI1IExpc3RlbnMgdG8gZG9jdW1lbnQgY2xpY2sgYW5kIGNsb3NlcyB0aGUgZHJvcGRvd24gaWYgY2xpY2tlZCBvdXRzaWRlXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCF0YXJnZXQuY2xvc2VzdCgnLmxpc3Qtdmlldy1maWx0ZXInKSkge1xuICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJsaXN0LXZpZXctZmlsdGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsXCI+RGF0YSBSZWxhdGVkIHRvPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImZpbHRlci1pY29uXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHJ4PVwiNVwiIGZpbGw9XCIjRjFGMUYxXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuNTEyODggNC41SDEyLjE4NzlDMTIuNzQyOSA0LjUgMTMuMjAwNCA0Ljk1NzUgMTMuMjAwNCA1LjUxMjVWNi42MjI0OUMxMy4yMDA0IDcuMDI3NDkgMTIuOTQ1NCA3LjUzIDEyLjY5NzkgNy43ODVMMTAuNTIyOSA5LjcwNUMxMC4yMjI5IDkuOTYgMTAuMDIwNCAxMC40NjI1IDEwLjAyMDQgMTAuODY3NVYxMy4wNDI1QzEwLjAyMDQgMTMuMzQyNSA5LjgxNzkgMTMuNzQ3NSA5LjU2MjkgMTMuOTA1TDguODU3ODkgMTQuMzYyNUM4LjE5Nzg5IDE0Ljc2NzUgNy4yOTAzNyAxNC4zMSA3LjI5MDM3IDEzLjVWMTAuODIyNUM3LjI5MDM3IDEwLjQ3IDcuMDg3ODkgMTAuMDEyNSA2Ljg4NTM5IDkuNzU3NTFMNC45NjUzOSA3LjczMjVDNC43MTAzOSA3LjQ3NzUgNC41MDc5IDcuMDI3NDkgNC41MDc5IDYuNzE5OTlWNS41NTc1QzQuNTAwNCA0Ljk1NzUgNC45NTc4OCA0LjUgNS41MTI4OCA0LjVaXCIgc3Ryb2tlPVwiIzI5MkQzMlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1taXRlcmxpbWl0PVwiMTBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC41IDExLjk5OTlWMTQuMjQ5OUM0LjUgMTcuOTk5OSA2IDE5LjQ5OTkgOS43NSAxOS40OTk5SDE0LjI1QzE4IDE5LjQ5OTkgMTkuNSAxNy45OTk5IDE5LjUgMTQuMjQ5OVY5Ljc0OTk0QzE5LjUgNy40MDk5NCAxOC45MTUgNS45Mzk5MyAxNy41NTc1IDUuMTc0OTNDMTcuMTc1IDQuOTU3NDMgMTYuNDEgNC43OTI0MyAxNS43MTI1IDQuNjc5OTNcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjc1IDEyLjc1SDE2LjVcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTExLjI1IDE1Ljc1SDE2LjVcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1vcHRpb25cIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZFZpZXcgfHwgJ1NlbGVjdCBhIHZpZXcnIH19XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjaGV2cm9uLWljb25cIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5Ljk5OTkgMjUuNjY2N0MyMy42ODE4IDI1LjY2NjcgMjYuNjY2NiAyMi42ODE5IDI2LjY2NjYgMTlDMjYuNjY2NiAxNS4zMTgxIDIzLjY4MTggMTIuMzMzNCAxOS45OTk5IDEyLjMzMzRDMTYuMzE4IDEyLjMzMzQgMTMuMzMzMyAxNS4zMTgxIDEzLjMzMzMgMTlDMTMuMzMzMyAyMi42ODE5IDE2LjMxOCAyNS42NjY3IDE5Ljk5OTkgMjUuNjY2N1pcIiBmaWxsPVwiIzI5MkQzMlwiIHN0cm9rZT1cIiMyOTJEMzJcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbWl0ZXJsaW1pdD1cIjEwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNjQ2NyAxOC4xNkwyMC4wMDAxIDIwLjUwNjdMMjIuMzUzNCAxOC4xNlwiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU0tTM01BWTI1IGxpc3QgdmlldyBEcm9wIGRvd24tLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzRHJvcGRvd25PcGVuXCIgY2xhc3M9XCJkcm9wZG93bi1vcHRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tb3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgdmlldyBvZiBsaXN0Vmlld3NcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic2VsZWN0ZWRWaWV3ID09PSB2aWV3LmZpbHRlck5hbWVcIiAobW91c2VlbnRlcik9XCJzaG93QWN0aW9ucyh2aWV3KVwiIChtb3VzZWxlYXZlKT1cImhpZGVBY3Rpb25zKClcIiAoY2xpY2spPVwic2VsZWN0TGlzdFZpZXcodmlldylcIiBjbGFzcz1cImxpc3Qtdmlldy1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlldy1uYW1lXCI+e3sgdmlldy5maWx0ZXJOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiICpuZ0lmPVwidmlldy5zaG93QWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtaWNvblwiIChjbGljayk9XCJzdGFydEVkaXQodmlldywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzI5MjMgMy45ODcyNkwxMi4wMTI2IDYuNjcwNTlNOS4zMjkyMyAzLjk4NzI2TDIuNTAwMDggMTAuODE2NFYxMy40OTk3SDUuMTgzNDJMMTIuMDEyNiA2LjY3MDU5TTkuMzI5MjMgMy45ODcyNkwxMi4wMTI2IDEuMzAzOTJMMTQuNjk1OSAzLjk4NzI2TDEyLjAxMjYgNi42NzA1OVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cImNvbmZpcm1EZWxldGUodmlldywgJGV2ZW50KVwiICpuZ0lmPVwibGlzdFZpZXdzLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUuNjY2NSAzLjMxMzYyTDUuODEzMTcgMi40NDAyOEM1LjkxOTg0IDEuODA2OTUgNS45OTk4NCAxLjMzMzYyIDcuMTI2NSAxLjMzMzYySDguODczMTdDOS45OTk4NCAxLjMzMzYyIDEwLjA4NjUgMS44MzM2MiAxMC4xODY1IDIuNDQ2OTVMMTAuMzMzMiAzLjMxMzYyXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4zMzM1IDguMzMzMjVIOS42NjY4M1wiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZC1maWx0ZXJcIiAoY2xpY2spPVwic3RhcnRBZGQoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCAzLjMzMzI1VjEyLjY2NjZcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMy4zMzMwMSA4SDEyLjY2NjNcIiBzdHJva2U9XCIjMDA3YmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4+TmV3IExpc3QgVmlldzwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAgPCEtLSBTS1MzTUFZMjUgQWRkIE5ldyBMaXN0IFZpZXctLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNNb2RhbE9wZW5cIiBjbGFzcz1cIm1vZGFsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICA8aDI+e3sgaXNBZGRpbmcgPyAnQWRkIE5ldyBMaXN0IFZpZXcnIDogJ0VkaXQgTGlzdCBWaWV3JyB9fTwvaDI+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImVkaXRpbmdWaWV3XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TmFtZTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImZpbHRlck5hbWVcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGxpc3QgdmlldyBuYW1lXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGluZ1ZpZXcuZ2V0KCdmaWx0ZXJOYW1lJyk/LmludmFsaWQgJiYgKGVkaXRpbmdWaWV3LmdldCgnZmlsdGVyTmFtZScpPy5kaXJ0eSB8fCBlZGl0aW5nVmlldy5nZXQoJ2ZpbHRlck5hbWUnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk9yZGVyOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cIm9yZGVyXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBkaXNwbGF5IG9yZGVyXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWRpdGluZ1ZpZXcuZ2V0KCdvcmRlcicpPy5pbnZhbGlkICYmIChlZGl0aW5nVmlldy5nZXQoJ29yZGVyJyk/LmRpcnR5IHx8IGVkaXRpbmdWaWV3LmdldCgnb3JkZXInKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlciBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIG51bWJlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5EZWZhdWx0IFZpZXc6PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtd3JhcHBlciBzbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJpc0RlZmF1bHRcIiBpZD1cImlzRGVmYXVsdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJpc0RlZmF1bHRcIiBjbGFzcz1cInRvZ2dsZS1idXR0b25cIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMz5GaWx0ZXJzPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWN0aW9uLWRlc2NyaXB0aW9uXCI+RGVmaW5lIGNvbmRpdGlvbnMgZm9yIGZpbHRlcmVkIGxpc3Qgdmlldzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJjb25kaXRpb25zXCIgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1jZWxsXCI+Q29sdW1uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3BlcmF0b3ItY2VsbFwiPk9wZXJhdG9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtY2VsbFwiPlZhbHVlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWNlbGxcIj5BY3Rpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgY29uZGl0aW9ucy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBjbGFzcz1cImZpbHRlci1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmaWVsZFwiIFt2YWx1ZV09XCJnZXRMYWJlbEJ5RmllbGROYW1lKGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCdmaWVsZCcpLnZhbHVlKVwiIChmb2N1cyk9XCJvbkZvY3VzKCdmaWVsZCcsIGkpXCIgKGJsdXIpPVwib25CbHVyKCdmaWVsZCcsIGkpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBvciBzZWxlY3QgY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1saXN0XCIgKm5nSWY9XCJpc0NvbHVtbkRyb3Bkb3duT3BlbltpXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZ2V0RmlsdGVyZWRDb2x1bW5zKGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCdmaWVsZCcpLnZhbHVlKVwiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJzZWxlY3RPcHRpb24oJ2ZpZWxkJywgaSwgZmllbGQubGFiZWwpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmdldCgnZmllbGQnKT8uaW52YWxpZCAmJiAoZmlsdGVyLmdldCgnZmllbGQnKT8uZGlydHkgfHwgZmlsdGVyLmdldCgnZmllbGQnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcGVyYXRvci1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE9wZXJhdG9yTGFiZWwoY29uZGl0aW9ucy5hdChpKS5nZXQoJ29wZXJhdG9yJykudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25PcGVyYXRvcklucHV0KCRldmVudC50YXJnZXQudmFsdWUsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygnb3BlcmF0b3InLCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCdvcGVyYXRvcicsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIG9yIHNlbGVjdCBvcGVyYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWxpc3RcIiAqbmdJZj1cImlzT3BlcmF0b3JEcm9wZG93bk9wZW5baV1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3BlcmF0b3Igb2YgZ2V0RmlsdGVyZWRPcGVyYXRvcnMob3BlcmF0b3JJbnB1dFtpXSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RPcHRpb24oJ29wZXJhdG9yJywgaSwgb3BlcmF0b3IudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcGVyYXRvci5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXIuZ2V0KCdvcGVyYXRvcicpPy5pbnZhbGlkICYmIChmaWx0ZXIuZ2V0KCdvcGVyYXRvcicpPy5kaXJ0eSB8fCBmaWx0ZXIuZ2V0KCdvcGVyYXRvcicpPy50b3VjaGVkKVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiIChmb2N1cyk9XCJvbkZvY3VzKCd2YWx1ZScsIGkpXCIgKGJsdXIpPVwib25CbHVyKCd2YWx1ZScsIGkpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBvciBzZWxlY3QgdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWxpc3RcIiAqbmdJZj1cImlzVmFsdWVEcm9wZG93bk9wZW5baV0gJiYgZ2V0UG9zc2libGVWYWx1ZXMoY29uZGl0aW9ucy5hdChpKS5nZXQoJ2ZpZWxkJykudmFsdWUsIGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCd2YWx1ZScpLnZhbHVlKT8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFsIG9mIGdldFBvc3NpYmxlVmFsdWVzKGNvbmRpdGlvbnMuYXQoaSkuZ2V0KCdmaWVsZCcpLnZhbHVlLCBjb25kaXRpb25zLmF0KGkpLmdldCgndmFsdWUnKS52YWx1ZSlcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0T3B0aW9uKCd2YWx1ZScsIGksIHZhbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB2YWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyLmdldCgndmFsdWUnKT8uaW52YWxpZCAmJiAoZmlsdGVyLmdldCgndmFsdWUnKT8uZGlydHkgfHwgZmlsdGVyLmdldCgndmFsdWUnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpY29uLWNvbnRhaW5lclwiIG1hdFRvb2x0aXA9XCJSZW1vdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjMzMzUgOC4zMzMyNUg5LjY2NjgzXCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWRkSWNvbkJvciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRGaWx0ZXIoKVwiIG1hdFRvb2x0aXA9XCJBZGQgRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZEljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggMy4zMzMyNVYxMi42NjY2XCIgc3Ryb2tlPVwiIzAwN2JmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuMzMzMDEgOEgxMi42NjYzXCIgc3Ryb2tlPVwiIzAwN2JmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BZGQgRmlsdGVyPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8aDM+Q29sdW1uczwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi1kZXNjcmlwdGlvblwiPlNlbGVjdCBmaWVsZCB0byBkaXNwbGF5IGluIHRhYmxlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImNvbHVtbnNcIiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZS1jZWxsXCI+Q29sdW1uIE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib29sLWNlbGxcIj5Tb3J0YWJsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb2wtY2VsbFwiPkZpbHRlcmFibGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tY2VsbFwiPkFjdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGNvbHVtbnMuY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJjb2x1bW4tcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFtZS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCdjb2x1bW5OYW1lJywgaSlcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKCdjb2x1bW5OYW1lJywgaSlcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uTWFudWFsSW5wdXQoJGV2ZW50LnRhcmdldC52YWx1ZSwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIG9yIHNlbGVjdCBjb2x1bW4gbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWxpc3RcIiAqbmdJZj1cImlzQ29sdW1uTmFtZURyb3Bkb3duT3BlbltpXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sTmFtZSBvZiBnZXRDb2x1bW5Db2x1bW5zKGNvbHVtbnMuYXQoaSkuZ2V0KCduYW1lJykudmFsdWUpXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdE9wdGlvbignY29sdW1uTmFtZScsIGksIGNvbE5hbWUubGFiZWwpOyBpc0NvbHVtbk5hbWVEcm9wZG93bk9wZW5baV0gPSBmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbE5hbWUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQuZ2V0KCduYW1lJyk/LmludmFsaWQgJiYgKGZpZWxkLmdldCgnbmFtZScpPy5kaXJ0eSB8fCBmaWVsZC5nZXQoJ25hbWUnKT8udG91Y2hlZClcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uIG5hbWUgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb2wtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtd3JhcHBlciBzbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2lkXT1cIidzb3J0YWJsZS0nICsgaVwiIGZvcm1Db250cm9sTmFtZT1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidzb3J0YWJsZS0nICsgaVwiIGNsYXNzPVwidG9nZ2xlLWJ1dHRvblwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb2wtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtd3JhcHBlciBzbWFsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2lkXT1cIidmaWx0ZXJhYmxlLScgKyBpXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdGVyYWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZmlsdGVyYWJsZS0nICsgaVwiIGNsYXNzPVwidG9nZ2xlLWJ1dHRvblwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpY29uLWNvbnRhaW5lclwiIG1hdFRvb2x0aXA9XCJSZW1vdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgKGNsaWNrKT1cInJlbW92ZUNvbHVtbihpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjMzMzUgOC4zMzMyNUg5LjY2NjgzXCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWRkSWNvbkJvciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb2x1bW4oKVwiIG1hdFRvb2x0aXA9XCJBZGQgQ29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZEljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggMy4zMzMyNVYxMi42NjY2XCIgc3Ryb2tlPVwiIzAwN2JmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuMzMzMDEgOEgxMi42NjYzXCIgc3Ryb2tlPVwiIzAwN2JmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BZGQgQ29sdW1uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29uZGl0aW9ucy5sZW5ndGggPT09IDAgJiYgY29sdW1ucy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIGZpbHRlciBvciBvbmUgY29sdW1uIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYXZlLWJ1dHRvblwiIChjbGljayk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiIWVkaXRpbmdWaWV3LnZhbGlkIHx8IChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA9PT0gMClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbG9zZU1vZGFsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPCEtLSBTS1MzTUFZMjUgRGVsZXRlIExpc3QgVmlldy0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc0RlbGV0ZU1vZGFsT3BlblwiIGNsYXNzPVwibW9kYWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoMj5EZWxldGUgTGlzdCBWaWV3PC9oMj5cbiAgICAgICAgICAgIDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgXCJ7eyB2aWV3VG9EZWxldGU/LmZpbHRlck5hbWUgfX1cIj88L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1kZWxldGVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVsZXRlQ29uZmlybWVkKClcIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xvc2VEZWxldGVNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=