@seniorsistemas/data-seniorx-core 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/config/dynamic-view-builder.config.d.ts +3 -0
- package/core/constants/dynamic-view-builder.const.d.ts +15 -0
- package/core/constants/picklist.const.d.ts +4 -0
- package/core/constants/timeline.const.d.ts +6 -0
- package/core/types/confirm.type.d.ts +1 -0
- package/core/types/dynamic-view-builder.type.d.ts +130 -0
- package/core/types/row-card.type.d.ts +10 -0
- package/core/types/timeline.type.d.ts +22 -0
- package/esm2022/core/config/dynamic-view-builder.config.mjs +396 -0
- package/esm2022/core/config/row-card.type.config.mjs +2 -1
- package/esm2022/core/constants/dynamic-view-builder.const.mjs +24 -0
- package/esm2022/core/constants/picklist.const.mjs +5 -1
- package/esm2022/core/constants/timeline.const.mjs +6 -0
- package/esm2022/core/handlers/sqlFormatter.mjs +3 -2
- package/esm2022/core/types/confirm.type.mjs +1 -1
- package/esm2022/core/types/dynamic-view-builder.type.mjs +2 -0
- package/esm2022/core/types/row-card.type.mjs +1 -1
- package/esm2022/core/types/timeline.type.mjs +2 -0
- package/esm2022/core/utils/layout.util.mjs +4 -4
- package/esm2022/core/utils/number-input.util.mjs +2 -2
- package/esm2022/features/breadcrumb/breadcrumb.component.mjs +21 -3
- package/esm2022/features/button/button.component.mjs +5 -5
- package/esm2022/features/card-list/card/card.component.mjs +4 -6
- package/esm2022/features/card-list/card-list.component.mjs +4 -7
- package/esm2022/features/code-editor/code-editor.component.mjs +5 -5
- package/esm2022/features/color-picker/color-picker.component.mjs +4 -4
- package/esm2022/features/combobox/combobox.component.mjs +8 -8
- package/esm2022/features/confirm/confirm.component.mjs +8 -4
- package/esm2022/features/country-phone-picker/country-phone-picker.component.mjs +6 -8
- package/esm2022/features/empty-state/empty-state.component.mjs +3 -3
- package/esm2022/features/hyperlink/hyperlink.component.mjs +10 -12
- package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
- package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
- package/esm2022/features/list/list.component.mjs +1 -1
- package/esm2022/features/loading-state/loading-state.component.mjs +20 -25
- package/esm2022/features/localized-number-input/localized-number-input.component.mjs +4 -4
- package/esm2022/features/mask/mask.component.mjs +4 -4
- package/esm2022/features/modal/modal.component.mjs +5 -5
- package/esm2022/features/modalc/modalc.component.mjs +1 -1
- package/esm2022/features/number-input/number-input.component.mjs +4 -4
- package/esm2022/features/numeric/numeric.component.mjs +4 -6
- package/esm2022/features/paginator/paginator.component.mjs +2 -2
- package/esm2022/features/password-strength/password-strength.component.mjs +3 -3
- package/esm2022/features/picklist/picklist.component.mjs +50 -9
- package/esm2022/features/radio/radio.component.mjs +12 -12
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +32 -9
- package/esm2022/features/row-card-list/row-card-list.component.mjs +3 -3
- package/esm2022/features/searchbox/searchbox.component.mjs +1 -1
- package/esm2022/features/sidebar/sidebar.component.mjs +7 -3
- package/esm2022/features/switch/switch.component.mjs +3 -3
- package/esm2022/features/table/table.component.mjs +3 -3
- package/esm2022/features/textarea/textarea.component.mjs +4 -4
- package/esm2022/features/textbox/textbox.component.mjs +4 -4
- package/esm2022/features/timeline/timeline.component.mjs +90 -0
- package/esm2022/features/toast/toast.component.mjs +4 -6
- package/esm2022/features/tooltip/tooltip.component.mjs +3 -3
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2810 -0
- package/esm2022/locales/en.json +202 -1
- package/esm2022/locales/es-CO.json +202 -1
- package/esm2022/locales/pt.json +202 -1
- package/esm2022/public-api.mjs +6 -1
- package/features/breadcrumb/breadcrumb.component.d.ts +2 -0
- package/features/button/button.component.d.ts +2 -2
- package/features/code-editor/code-editor.component.d.ts +2 -2
- package/features/hyperlink/hyperlink.component.d.ts +3 -3
- package/features/loading-state/loading-state.component.d.ts +3 -4
- package/features/modal/modal.component.d.ts +2 -2
- package/features/picklist/picklist.component.d.ts +10 -1
- package/features/radio/radio.component.d.ts +4 -4
- package/features/row-card-list/row-card/row-card.component.d.ts +8 -1
- package/features/sidebar/sidebar.component.d.ts +2 -1
- package/features/timeline/timeline.component.d.ts +27 -0
- package/features/visual-sql-editor/visual-sql-editor.component.d.ts +560 -0
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +4161 -176
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +7 -0
- package/src/locales/en.json +211 -1
- package/src/locales/es-CO.json +211 -1
- package/src/locales/pt.json +211 -1
- package/styles.css +1 -1
|
@@ -0,0 +1,2810 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewChildren, } from "@angular/core";
|
|
2
|
+
import { FormsModule } from "@angular/forms";
|
|
3
|
+
import { TranslateModule } from "@ngx-translate/core";
|
|
4
|
+
import { DYNAMIC_VIEW_BUILDER_DEFAULT_TABLE_ROWS } from "../../core/constants/dynamic-view-builder.const";
|
|
5
|
+
import { DEFAULT_MODAL_Z_INDEX } from "../../core/constants/modal.const";
|
|
6
|
+
import { createDynamicViewBuilderConfig } from "../../core/config/dynamic-view-builder.config";
|
|
7
|
+
import { ButtonComponent } from "../button/button.component";
|
|
8
|
+
import { CheckboxComponent } from "../checkbox/checkbox.component";
|
|
9
|
+
import { CodeEditorComponent } from "../code-editor/code-editor.component";
|
|
10
|
+
import { ComboboxComponent } from "../combobox/combobox.component";
|
|
11
|
+
import { InfoSignComponent } from "../info-sign/info-sign.component";
|
|
12
|
+
import { ModalComponent } from "../modal/modal.component";
|
|
13
|
+
import { PicklistComponent } from "../picklist/picklist.component";
|
|
14
|
+
import { SelectButtonComponent } from "../select-button/select-button.component";
|
|
15
|
+
import { TableComponent } from "../table/table.component";
|
|
16
|
+
import { TextareaComponent } from "../textarea/textarea.component";
|
|
17
|
+
import { TextboxComponent } from "../textbox/textbox.component";
|
|
18
|
+
import { TimelineComponent } from "../timeline/timeline.component";
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "@ngx-translate/core";
|
|
21
|
+
import * as i2 from "@angular/forms";
|
|
22
|
+
const EMPTY_VALUE = "";
|
|
23
|
+
const DEFAULT_JOIN_OPERATOR = "EQUALS";
|
|
24
|
+
const DEFAULT_FUNCTION_NAME = "count";
|
|
25
|
+
const DEFAULT_SORT_DIRECTION = "ASC";
|
|
26
|
+
const EMPTY_SORT_FUNCTION = "__base__";
|
|
27
|
+
const FLOW_ARROW_INSET = 3;
|
|
28
|
+
const FLOW_ARROW_MIN_GAP = 12;
|
|
29
|
+
const FLOW_ARROWS_REFRESH_DELAY_MS = 120;
|
|
30
|
+
const DEFAULT_FILTER_OPERATOR = "EQUAL";
|
|
31
|
+
const DEFAULT_FILTER_CONNECTOR = "AND";
|
|
32
|
+
const DEFAULT_FILTER_VALUE_TYPE = "value";
|
|
33
|
+
const FILTER_MODE_DOMAIN = "domain";
|
|
34
|
+
const OVERLAY_APPEND_TARGET = "body";
|
|
35
|
+
const MODAL_Z_INDEX_OFFSET = 20;
|
|
36
|
+
const MODAL_OVERLAY_Z_INDEX = DEFAULT_MODAL_Z_INDEX + MODAL_Z_INDEX_OFFSET;
|
|
37
|
+
const FIELD_PICKLIST_ROWS = 8;
|
|
38
|
+
const FILTER_PICKLIST_ROWS = 9;
|
|
39
|
+
const VISUAL_SQL_TABLE_COLOR = "#425466";
|
|
40
|
+
const VISUAL_SQL_FIELD_COLOR = "#1f8a52";
|
|
41
|
+
const PICKLIST_DATA_TYPE_BADGE_COLOR = "gray";
|
|
42
|
+
const PICKLIST_FUNCTION_BADGE_COLOR = "blue";
|
|
43
|
+
const FALLBACK_SELECT_TABLES = "Selecionar tabelas";
|
|
44
|
+
const FALLBACK_EMPTY_SELECTION = "Nenhum selecionado";
|
|
45
|
+
const PREVIEW_ROWS_PER_PAGE_OPTIONS = [5, 10, 20];
|
|
46
|
+
const ALIAS_MAX_LENGTH = 12;
|
|
47
|
+
const MIN_PARTS_FOR_DB = 3;
|
|
48
|
+
const DB_PARTS_OFFSET = -2;
|
|
49
|
+
const MIN_PARTS_FOR_TABLE = 2;
|
|
50
|
+
const JOIN_OPERATOR_LABELS = {
|
|
51
|
+
EQUALS: {
|
|
52
|
+
key: "joinOperators.equals",
|
|
53
|
+
fallback: "Igual a (=)",
|
|
54
|
+
},
|
|
55
|
+
NOT_EQUALS: {
|
|
56
|
+
key: "joinOperators.notEquals",
|
|
57
|
+
fallback: "Diferente de (<>)",
|
|
58
|
+
},
|
|
59
|
+
GREATER_THAN: {
|
|
60
|
+
key: "joinOperators.greaterThan",
|
|
61
|
+
fallback: "Maior que (>)",
|
|
62
|
+
},
|
|
63
|
+
GREATER_THAN_OR_EQUAL: {
|
|
64
|
+
key: "joinOperators.greaterThanOrEqual",
|
|
65
|
+
fallback: "Maior ou igual a (>=)",
|
|
66
|
+
},
|
|
67
|
+
LESS_THAN: {
|
|
68
|
+
key: "joinOperators.lessThan",
|
|
69
|
+
fallback: "Menor que (<)",
|
|
70
|
+
},
|
|
71
|
+
LESS_THAN_OR_EQUAL: {
|
|
72
|
+
key: "joinOperators.lessThanOrEqual",
|
|
73
|
+
fallback: "Menor ou igual a (<=)",
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
const DYNAMIC_MODAL_DIMENSIONS = {
|
|
77
|
+
source: {
|
|
78
|
+
width: "64rem",
|
|
79
|
+
height: "40rem",
|
|
80
|
+
},
|
|
81
|
+
selection: {
|
|
82
|
+
width: "64rem",
|
|
83
|
+
height: "40rem",
|
|
84
|
+
},
|
|
85
|
+
join: {
|
|
86
|
+
width: "70rem",
|
|
87
|
+
height: "40rem",
|
|
88
|
+
},
|
|
89
|
+
sort: {
|
|
90
|
+
width: "56rem",
|
|
91
|
+
height: "34rem",
|
|
92
|
+
},
|
|
93
|
+
filter: {
|
|
94
|
+
width: "68rem",
|
|
95
|
+
height: "55rem",
|
|
96
|
+
},
|
|
97
|
+
field: {
|
|
98
|
+
width: "68rem",
|
|
99
|
+
height: "42rem",
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
export class VisualSqlEditorComponent {
|
|
103
|
+
translate;
|
|
104
|
+
changeDetectorRef;
|
|
105
|
+
internalConfig = createDynamicViewBuilderConfig();
|
|
106
|
+
sectionOrder = [
|
|
107
|
+
"tables",
|
|
108
|
+
"joins",
|
|
109
|
+
"groupBy",
|
|
110
|
+
"fields",
|
|
111
|
+
"sorting",
|
|
112
|
+
"filters",
|
|
113
|
+
];
|
|
114
|
+
refreshFlowArrowsFrame = null;
|
|
115
|
+
refreshFlowArrowsTimeout = null;
|
|
116
|
+
layoutModeItems = [
|
|
117
|
+
{
|
|
118
|
+
label: "Blocos",
|
|
119
|
+
value: "stacked",
|
|
120
|
+
iconClass: "fas fa-th-large",
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
label: "Lista",
|
|
124
|
+
value: "split",
|
|
125
|
+
iconClass: "fas fa-list",
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
filterModeItems = [
|
|
129
|
+
{
|
|
130
|
+
label: "Filtro",
|
|
131
|
+
value: "condition",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
label: "Expressao de dominio",
|
|
135
|
+
value: FILTER_MODE_DOMAIN,
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
selectedFilterModeItems = [];
|
|
139
|
+
sortDirectionItems = [];
|
|
140
|
+
selectedLayoutModeItems = [];
|
|
141
|
+
selectedSortDirectionItems = [];
|
|
142
|
+
loading = false;
|
|
143
|
+
set config(value) {
|
|
144
|
+
this.internalConfig = value
|
|
145
|
+
? createDynamicViewBuilderConfig(value)
|
|
146
|
+
: createDynamicViewBuilderConfig();
|
|
147
|
+
this.syncLayoutModeItems();
|
|
148
|
+
this.syncFilterModeItems();
|
|
149
|
+
this.syncSortDirectionItems();
|
|
150
|
+
this.sanitizeBuilder();
|
|
151
|
+
}
|
|
152
|
+
get config() {
|
|
153
|
+
return this.internalConfig;
|
|
154
|
+
}
|
|
155
|
+
configChange = new EventEmitter();
|
|
156
|
+
save = new EventEmitter();
|
|
157
|
+
cancel = new EventEmitter();
|
|
158
|
+
sectionsContainer;
|
|
159
|
+
builderSections;
|
|
160
|
+
layoutMode = "stacked";
|
|
161
|
+
previewVisible = false;
|
|
162
|
+
flowArrows = [];
|
|
163
|
+
measuredSplitPreviewHeight = "24rem";
|
|
164
|
+
draggingFieldIndex = null;
|
|
165
|
+
dragPreviewIndex = null;
|
|
166
|
+
overlayAppendTarget = OVERLAY_APPEND_TARGET;
|
|
167
|
+
overlayZIndex = MODAL_OVERLAY_Z_INDEX;
|
|
168
|
+
modalDimensions = DYNAMIC_MODAL_DIMENSIONS;
|
|
169
|
+
fieldPicklistRows = FIELD_PICKLIST_ROWS;
|
|
170
|
+
filterPicklistRows = FILTER_PICKLIST_ROWS;
|
|
171
|
+
sourceModalVisible = false;
|
|
172
|
+
sourceModalStep = "select";
|
|
173
|
+
sourceModalDrafts = [];
|
|
174
|
+
selectionModalVisible = false;
|
|
175
|
+
selectionModalMode = "tables";
|
|
176
|
+
selectionModalIds = [];
|
|
177
|
+
selectionModalSearch = EMPTY_VALUE;
|
|
178
|
+
joinModalVisible = false;
|
|
179
|
+
joinEditIndex = null;
|
|
180
|
+
joinSourceSearch = EMPTY_VALUE;
|
|
181
|
+
joinTargetSearch = EMPTY_VALUE;
|
|
182
|
+
joinDraft = {
|
|
183
|
+
sourceColumn: EMPTY_VALUE,
|
|
184
|
+
targetColumn: EMPTY_VALUE,
|
|
185
|
+
operator: DEFAULT_JOIN_OPERATOR,
|
|
186
|
+
};
|
|
187
|
+
sortModalVisible = false;
|
|
188
|
+
sortEditIndex = null;
|
|
189
|
+
sortSearch = EMPTY_VALUE;
|
|
190
|
+
sortDraft = {
|
|
191
|
+
column: EMPTY_VALUE,
|
|
192
|
+
functionName: EMPTY_VALUE,
|
|
193
|
+
direction: DEFAULT_SORT_DIRECTION,
|
|
194
|
+
};
|
|
195
|
+
fieldModalVisible = false;
|
|
196
|
+
fieldModalStep = "select";
|
|
197
|
+
fieldModalSearch = EMPTY_VALUE;
|
|
198
|
+
fieldModalDrafts = [];
|
|
199
|
+
fieldFunctionEditColumn = null;
|
|
200
|
+
fieldFunctionDraft = {
|
|
201
|
+
column: EMPTY_VALUE,
|
|
202
|
+
functionName: EMPTY_VALUE,
|
|
203
|
+
functionAlias: EMPTY_VALUE,
|
|
204
|
+
};
|
|
205
|
+
filterModalVisible = false;
|
|
206
|
+
filterEditIndex = null;
|
|
207
|
+
filterModalStep = "select";
|
|
208
|
+
filterModalMode = "condition";
|
|
209
|
+
filterSearch = EMPTY_VALUE;
|
|
210
|
+
filterDraft = {
|
|
211
|
+
mode: "condition",
|
|
212
|
+
column: EMPTY_VALUE,
|
|
213
|
+
operator: DEFAULT_FILTER_OPERATOR,
|
|
214
|
+
connector: DEFAULT_FILTER_CONNECTOR,
|
|
215
|
+
optional: false,
|
|
216
|
+
valueType: DEFAULT_FILTER_VALUE_TYPE,
|
|
217
|
+
value: EMPTY_VALUE,
|
|
218
|
+
valuesText: EMPTY_VALUE,
|
|
219
|
+
betweenStart: EMPTY_VALUE,
|
|
220
|
+
betweenEnd: EMPTY_VALUE,
|
|
221
|
+
parameterName: EMPTY_VALUE,
|
|
222
|
+
domainExpression: EMPTY_VALUE,
|
|
223
|
+
};
|
|
224
|
+
constructor(translate, changeDetectorRef) {
|
|
225
|
+
this.translate = translate;
|
|
226
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
227
|
+
this.syncLayoutModeItems();
|
|
228
|
+
this.syncFilterModeItems();
|
|
229
|
+
this.syncSortDirectionItems();
|
|
230
|
+
this.sanitizeBuilder();
|
|
231
|
+
}
|
|
232
|
+
ngAfterViewInit() {
|
|
233
|
+
this.builderSections?.changes.subscribe(() => {
|
|
234
|
+
this.scheduleFlowArrowRefresh();
|
|
235
|
+
});
|
|
236
|
+
this.scheduleFlowArrowRefresh();
|
|
237
|
+
}
|
|
238
|
+
ngOnDestroy() {
|
|
239
|
+
if (this.refreshFlowArrowsFrame !== null) {
|
|
240
|
+
cancelAnimationFrame(this.refreshFlowArrowsFrame);
|
|
241
|
+
}
|
|
242
|
+
if (this.refreshFlowArrowsTimeout !== null) {
|
|
243
|
+
clearTimeout(this.refreshFlowArrowsTimeout);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
onWindowResize() {
|
|
247
|
+
this.scheduleFlowArrowRefresh();
|
|
248
|
+
}
|
|
249
|
+
get selectedLayoutModeItem() {
|
|
250
|
+
return (this.layoutModeItems.find((item) => item.value === this.layoutMode) ??
|
|
251
|
+
null);
|
|
252
|
+
}
|
|
253
|
+
get isReadonly() {
|
|
254
|
+
return this.config.metadata.viewMode === "readonly";
|
|
255
|
+
}
|
|
256
|
+
get joinOperatorOptions() {
|
|
257
|
+
return (this.config.availableData.joinOperators ?? []).map((item) => ({
|
|
258
|
+
...item,
|
|
259
|
+
text: this.resolveJoinOperatorOptionText(item),
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
get functionOptions() {
|
|
263
|
+
return this.config.availableData.functions ?? [];
|
|
264
|
+
}
|
|
265
|
+
get sortDirectionOptions() {
|
|
266
|
+
return this.config.availableData.sortDirections ?? [];
|
|
267
|
+
}
|
|
268
|
+
get filterConnectorOptions() {
|
|
269
|
+
return this.config.availableData.filterConnectors ?? [];
|
|
270
|
+
}
|
|
271
|
+
get valueTypeOptions() {
|
|
272
|
+
return [
|
|
273
|
+
{
|
|
274
|
+
text: this.instantWithFallback(`${this.config.translationPrefix}.filters.valueTypes.value`, "Valor"),
|
|
275
|
+
value: "value",
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
text: this.instantWithFallback(`${this.config.translationPrefix}.filters.valueTypes.parameter`, "Parametro"),
|
|
279
|
+
value: "parameter",
|
|
280
|
+
},
|
|
281
|
+
];
|
|
282
|
+
}
|
|
283
|
+
get booleanValueOptions() {
|
|
284
|
+
return [
|
|
285
|
+
{
|
|
286
|
+
text: this.instantWithFallback(`${this.config.translationPrefix}.filters.boolean.true`, "True"),
|
|
287
|
+
value: "true",
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
text: this.instantWithFallback(`${this.config.translationPrefix}.filters.boolean.false`, "False"),
|
|
291
|
+
value: "false",
|
|
292
|
+
},
|
|
293
|
+
];
|
|
294
|
+
}
|
|
295
|
+
get selectedTables() {
|
|
296
|
+
const ids = new Set(this.config.generated.sources.map((item) => item.table));
|
|
297
|
+
return (this.config.availableData.tables ?? []).filter((item) => ids.has(item.value));
|
|
298
|
+
}
|
|
299
|
+
get availableColumns() {
|
|
300
|
+
const selectedTableIds = new Set(this.config.generated.sources.map((item) => item.table));
|
|
301
|
+
return (this.config.availableData.columns ?? []).filter((item) => selectedTableIds.has(item.table));
|
|
302
|
+
}
|
|
303
|
+
get fieldSelectableColumns() {
|
|
304
|
+
if (!this.availableColumns.length) {
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
if (!this.config.generated.groupBy.length) {
|
|
308
|
+
return this.availableColumns;
|
|
309
|
+
}
|
|
310
|
+
const groupBy = new Set(this.config.generated.groupBy);
|
|
311
|
+
return this.availableColumns.filter((item) => groupBy.has(item.value) || item.isAggregatable !== false);
|
|
312
|
+
}
|
|
313
|
+
get groupBySelectableColumns() {
|
|
314
|
+
return this.availableColumns.filter((item) => item.isAggregatable !== false);
|
|
315
|
+
}
|
|
316
|
+
get sortSelectableItems() {
|
|
317
|
+
const normalizedFields = this.normalizedFields;
|
|
318
|
+
if (!normalizedFields.length) {
|
|
319
|
+
return [];
|
|
320
|
+
}
|
|
321
|
+
const groupBySet = new Set(this.config.generated.groupBy);
|
|
322
|
+
return this.deduplicateByKey(normalizedFields
|
|
323
|
+
.filter((item) => {
|
|
324
|
+
const column = this.resolveColumnOption(item.column);
|
|
325
|
+
if (!column) {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
if (!this.config.generated.groupBy.length) {
|
|
329
|
+
return column.isSortable !== false;
|
|
330
|
+
}
|
|
331
|
+
return groupBySet.has(item.column) || !!item.function?.functionName?.trim();
|
|
332
|
+
})
|
|
333
|
+
.map((item) => {
|
|
334
|
+
const parts = this.resolveColumnParts(item.column);
|
|
335
|
+
const functionName = item.function?.functionName?.trim() ?? EMPTY_VALUE;
|
|
336
|
+
return {
|
|
337
|
+
functionName,
|
|
338
|
+
id: this.buildSortSelectionId(item.column, functionName),
|
|
339
|
+
column: item.column,
|
|
340
|
+
tableLabel: parts.tableLabel,
|
|
341
|
+
fieldLabel: parts.fieldLabel,
|
|
342
|
+
meta: functionName
|
|
343
|
+
? this.resolveFunctionLabel(functionName)
|
|
344
|
+
: this.resolveColumnOption(item.column)?.dataType ?? EMPTY_VALUE,
|
|
345
|
+
};
|
|
346
|
+
}), (item) => item.id);
|
|
347
|
+
}
|
|
348
|
+
get canConfigureJoins() {
|
|
349
|
+
return this.config.generated.sources.length > 1;
|
|
350
|
+
}
|
|
351
|
+
get canSave() {
|
|
352
|
+
if (!this.config.generated.sources.length) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
return !!(this.config.generated.fields.length || this.config.generated.groupBy.length);
|
|
356
|
+
}
|
|
357
|
+
get canSaveJoin() {
|
|
358
|
+
if (!this.joinDraft.sourceColumn ||
|
|
359
|
+
!this.joinDraft.targetColumn ||
|
|
360
|
+
!this.joinDraft.operator) {
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
const source = this.resolveColumnOption(this.joinDraft.sourceColumn);
|
|
364
|
+
const target = this.resolveColumnOption(this.joinDraft.targetColumn);
|
|
365
|
+
return !!source && !!target && source.table !== target.table;
|
|
366
|
+
}
|
|
367
|
+
get canSaveSort() {
|
|
368
|
+
return !!this.sortDraft.column && !!this.sortDraft.direction;
|
|
369
|
+
}
|
|
370
|
+
get canSaveFieldModal() {
|
|
371
|
+
return !!this.fieldModalDrafts.length && !this.fieldFunctionEditColumn;
|
|
372
|
+
}
|
|
373
|
+
get canSaveFilter() {
|
|
374
|
+
return !!this.buildFilterFromDraft();
|
|
375
|
+
}
|
|
376
|
+
get fieldModalCanProceed() {
|
|
377
|
+
return this.fieldModalDrafts.length > 0;
|
|
378
|
+
}
|
|
379
|
+
get canOpenFieldConfiguration() {
|
|
380
|
+
return this.fieldItems.length > 0;
|
|
381
|
+
}
|
|
382
|
+
get filterModalSelectionStepActive() {
|
|
383
|
+
return this.filterModalStep === "select";
|
|
384
|
+
}
|
|
385
|
+
get filterModalConfigurationStepActive() {
|
|
386
|
+
return this.filterModalStep === "configure";
|
|
387
|
+
}
|
|
388
|
+
get filterModalReviewStepActive() {
|
|
389
|
+
return this.filterModalStep === "review";
|
|
390
|
+
}
|
|
391
|
+
get filterModalCanProceed() {
|
|
392
|
+
return this.filterModalMode === FILTER_MODE_DOMAIN || !!this.filterDraft.column;
|
|
393
|
+
}
|
|
394
|
+
get filterModalCanReview() {
|
|
395
|
+
return this.canSaveFilter;
|
|
396
|
+
}
|
|
397
|
+
get filterNeedsValue() {
|
|
398
|
+
return !["EMPTY", "NOT_EMPTY"].includes(this.filterDraft.operator);
|
|
399
|
+
}
|
|
400
|
+
get filterConnectorDisabled() {
|
|
401
|
+
return this.filterSequenceIndex === 0;
|
|
402
|
+
}
|
|
403
|
+
get filterConnectorDisabledReason() {
|
|
404
|
+
if (!this.filterConnectorDisabled) {
|
|
405
|
+
return EMPTY_VALUE;
|
|
406
|
+
}
|
|
407
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.disabledReasons.connector`, "O primeiro filtro sempre inicia o WHERE, por isso o conector fica travado.");
|
|
408
|
+
}
|
|
409
|
+
get filterOperatorDisabledReason() {
|
|
410
|
+
if (this.filterDraft.column) {
|
|
411
|
+
return EMPTY_VALUE;
|
|
412
|
+
}
|
|
413
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.disabledReasons.operator`, "Selecione um campo na etapa anterior para liberar somente os operadores compativeis.");
|
|
414
|
+
}
|
|
415
|
+
get filterValueTypeDisabled() {
|
|
416
|
+
return !this.filterDraft.column || !this.filterNeedsValue;
|
|
417
|
+
}
|
|
418
|
+
get filterValueTypeDisabledReason() {
|
|
419
|
+
if (!this.filterDraft.column) {
|
|
420
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.disabledReasons.valueTypeWithoutColumn`, "Escolha um campo e um operador antes de definir como o valor sera informado.");
|
|
421
|
+
}
|
|
422
|
+
if (!this.filterNeedsValue) {
|
|
423
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.disabledReasons.valueTypeWithoutValue`, "O operador atual nao usa valor, entao tipo de valor e entrada ficam ocultos.");
|
|
424
|
+
}
|
|
425
|
+
return EMPTY_VALUE;
|
|
426
|
+
}
|
|
427
|
+
get filterOperatorTooltip() {
|
|
428
|
+
if (!this.filterDraft.column) {
|
|
429
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.operatorDefault`, "Os operadores mudam conforme o tipo do campo selecionado.");
|
|
430
|
+
}
|
|
431
|
+
const column = this.resolveColumnOption(this.filterDraft.column);
|
|
432
|
+
let operatorKey;
|
|
433
|
+
if (this.isNumericType(column?.dataType)) {
|
|
434
|
+
operatorKey = "operatorNumeric";
|
|
435
|
+
}
|
|
436
|
+
else if (this.isDateType(column?.dataType)) {
|
|
437
|
+
operatorKey = "operatorDate";
|
|
438
|
+
}
|
|
439
|
+
else if ((column?.dataType ?? EMPTY_VALUE).toLowerCase() === "boolean") {
|
|
440
|
+
operatorKey = "operatorBoolean";
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
operatorKey = "operatorText";
|
|
444
|
+
}
|
|
445
|
+
const fallbackByKey = {
|
|
446
|
+
operatorNumeric: "Campos numericos permitem comparacoes, faixas e listas.",
|
|
447
|
+
operatorDate: "Campos de data e hora permitem comparacoes cronologicas e intervalo.",
|
|
448
|
+
operatorBoolean: "Campos booleanos aceitam comparacao direta ou verificacao de vazio.",
|
|
449
|
+
operatorText: "Campos textuais aceitam busca por trecho, prefixo, sufixo e listas."
|
|
450
|
+
};
|
|
451
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.${operatorKey}`, fallbackByKey[operatorKey]);
|
|
452
|
+
}
|
|
453
|
+
get filterValueTypeTooltip() {
|
|
454
|
+
if (!this.filterDraft.column) {
|
|
455
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.valueTypeDefault`, "Use valor digitado para comparar agora ou parametro para pedir o valor em tempo de execucao.");
|
|
456
|
+
}
|
|
457
|
+
if (!this.filterNeedsValue) {
|
|
458
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.valueTypeNotRequired`, "Com este operador o filtro nao precisa receber valor.");
|
|
459
|
+
}
|
|
460
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.valueType`, "Valor digitado salva uma comparacao fixa. Parametro deixa o valor aberto para preenchimento futuro.");
|
|
461
|
+
}
|
|
462
|
+
get filterConnectorTooltip() {
|
|
463
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.connector`, "Conector define como esta regra se liga ao filtro anterior: AND restringe, OR amplia.");
|
|
464
|
+
}
|
|
465
|
+
get filterOptionalTooltip() {
|
|
466
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.optional`, "Marque como opcional quando a regra puder ser ignorada sem invalidar a execucao.");
|
|
467
|
+
}
|
|
468
|
+
get filterDomainExpressionTooltip() {
|
|
469
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.domainExpression`, "Expressao de dominio entra como condicao manual no WHERE. Use quando a regra nao couber nos operadores padrao.");
|
|
470
|
+
}
|
|
471
|
+
get filterValueInputTooltip() {
|
|
472
|
+
if (this.filterDraft.valueType === "parameter") {
|
|
473
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.parameterName`, "Informe o nome tecnico que sera usado para pedir o valor em tempo de execucao.");
|
|
474
|
+
}
|
|
475
|
+
if (this.filterDraft.operator === "IN") {
|
|
476
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.valuesList`, "Separe os valores por virgula para montar a lista final do IN.");
|
|
477
|
+
}
|
|
478
|
+
if (this.filterDraft.operator === "BETWEEN") {
|
|
479
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.between`, "Preencha inicio e fim para montar o intervalo completo.");
|
|
480
|
+
}
|
|
481
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.tooltips.value`, "O valor final respeita o tipo do campo e o operador escolhido.");
|
|
482
|
+
}
|
|
483
|
+
get showFilterValueTextbox() {
|
|
484
|
+
const isValueMode = this.filterDraft.valueType === "value" && this.filterNeedsValue;
|
|
485
|
+
return (isValueMode &&
|
|
486
|
+
!this.showFilterValuesTextbox &&
|
|
487
|
+
!this.showFilterBetweenInputs &&
|
|
488
|
+
!this.showFilterBooleanCombobox);
|
|
489
|
+
}
|
|
490
|
+
get showFilterValuesTextbox() {
|
|
491
|
+
return (this.filterDraft.valueType === "value" &&
|
|
492
|
+
this.filterDraft.operator === "IN");
|
|
493
|
+
}
|
|
494
|
+
get showFilterBetweenInputs() {
|
|
495
|
+
return (this.filterDraft.valueType === "value" &&
|
|
496
|
+
this.filterDraft.operator === "BETWEEN");
|
|
497
|
+
}
|
|
498
|
+
get showFilterParameterTextbox() {
|
|
499
|
+
return this.filterDraft.valueType === "parameter";
|
|
500
|
+
}
|
|
501
|
+
get showFilterBooleanCombobox() {
|
|
502
|
+
const column = this.resolveColumnOption(this.filterDraft.column);
|
|
503
|
+
return (!!column && column.dataType === "boolean" && this.showFilterValueTextbox);
|
|
504
|
+
}
|
|
505
|
+
get filterReviewItems() {
|
|
506
|
+
const valueTypeLabel = this.filterModalMode === FILTER_MODE_DOMAIN
|
|
507
|
+
? this.instantWithFallback(`${this.config.translationPrefix}.filters.domainLabel`, "Expressao de dominio")
|
|
508
|
+
: this.resolveOptionLabel(this.filterDraft.valueType, this.valueTypeOptions);
|
|
509
|
+
const items = [
|
|
510
|
+
{
|
|
511
|
+
id: "mode",
|
|
512
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.fields.type`, "Tipo"),
|
|
513
|
+
value: this.filterModalMode === FILTER_MODE_DOMAIN
|
|
514
|
+
? this.instantWithFallback(`${this.config.translationPrefix}.filters.domainLabel`, "Expressao de dominio")
|
|
515
|
+
: this.instantWithFallback(`${this.config.translationPrefix}.filters.modes.condition`, "Filtro"),
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
id: "connector",
|
|
519
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.fields.connector`, "Conector"),
|
|
520
|
+
value: this.filterConnectorDisabled
|
|
521
|
+
? "WHERE"
|
|
522
|
+
: this.resolveOptionLabel(this.filterDraft.connector, this.filterConnectorOptions),
|
|
523
|
+
},
|
|
524
|
+
];
|
|
525
|
+
if (this.filterModalMode === FILTER_MODE_DOMAIN) {
|
|
526
|
+
items.push({
|
|
527
|
+
id: "expression",
|
|
528
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.fields.domainExpression`, "Expressao de dominio"),
|
|
529
|
+
value: this.filterDraft.domainExpression.trim() || "-",
|
|
530
|
+
emphasize: "code",
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
else {
|
|
534
|
+
items.push({
|
|
535
|
+
id: "field",
|
|
536
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.fields.field`, "Campo"),
|
|
537
|
+
value: this.filterDraft.column ? this.resolveColumnPath(this.filterDraft.column) : "-",
|
|
538
|
+
emphasize: "path",
|
|
539
|
+
}, {
|
|
540
|
+
id: "operator",
|
|
541
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.fields.operator`, "Operador"),
|
|
542
|
+
value: this.resolveFilterOperatorLabel(this.filterDraft.operator),
|
|
543
|
+
}, {
|
|
544
|
+
id: "valueType",
|
|
545
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.fields.valueType`, "Tipo de valor"),
|
|
546
|
+
value: this.filterNeedsValue ? valueTypeLabel : this.instantWithFallback(`${this.config.translationPrefix}.states.none`, "Sem valor"),
|
|
547
|
+
}, {
|
|
548
|
+
id: "value",
|
|
549
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.fields.value`, "Valor"),
|
|
550
|
+
value: this.resolveFilterDraftDisplayValue() || "-",
|
|
551
|
+
emphasize: this.filterDraft.valueType === "parameter" ? "code" : "default",
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
items.push({
|
|
555
|
+
id: "optional",
|
|
556
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.states.optional`, "Opcional"),
|
|
557
|
+
value: this.filterDraft.optional
|
|
558
|
+
? this.instantWithFallback(`${this.config.translationPrefix}.states.yes`, "Sim")
|
|
559
|
+
: this.instantWithFallback(`${this.config.translationPrefix}.states.no`, "Nao"),
|
|
560
|
+
});
|
|
561
|
+
return items;
|
|
562
|
+
}
|
|
563
|
+
get filterReviewPreviewLabel() {
|
|
564
|
+
const preview = this.resolveFilterDraftSqlPreview();
|
|
565
|
+
return preview || "-";
|
|
566
|
+
}
|
|
567
|
+
get sourceModalSelectionStepActive() {
|
|
568
|
+
return this.sourceModalStep === "select";
|
|
569
|
+
}
|
|
570
|
+
get sourceModalConfigurationStepActive() {
|
|
571
|
+
return this.sourceModalStep === "configure";
|
|
572
|
+
}
|
|
573
|
+
get sourceModalCanProceed() {
|
|
574
|
+
return this.sourceModalDrafts.length > 0;
|
|
575
|
+
}
|
|
576
|
+
get canOpenSourceConfiguration() {
|
|
577
|
+
return this.sourceItems.length > 0;
|
|
578
|
+
}
|
|
579
|
+
get sourceItems() {
|
|
580
|
+
return this.config.generated.sources.map((item) => {
|
|
581
|
+
const parts = this.resolveTableDisplayParts(item.table);
|
|
582
|
+
return {
|
|
583
|
+
id: item.table,
|
|
584
|
+
dbLabel: parts.dbLabel,
|
|
585
|
+
tableLabel: parts.tableLabel,
|
|
586
|
+
alias: item.alias,
|
|
587
|
+
hasCustomAlias: this.hasCustomAlias(item.table, item.alias),
|
|
588
|
+
};
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
get sourceModalTimelineItems() {
|
|
592
|
+
return [
|
|
593
|
+
{
|
|
594
|
+
id: "select",
|
|
595
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.actions.selectTables`, FALLBACK_SELECT_TABLES),
|
|
596
|
+
description: this.instantWithFallback(`${this.config.translationPrefix}.modals.sources.steps.select.subtitle`, "Escolha as tabelas que devem alimentar a visao antes de configurar os aliases."),
|
|
597
|
+
indicatorLabel: "1",
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
id: "configure",
|
|
601
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.actions.configureAliases`, "Configurar aliases"),
|
|
602
|
+
description: this.instantWithFallback(`${this.config.translationPrefix}.modals.sources.steps.configure.subtitle`, "Revise os aliases sugeridos e ajuste os nomes finais das tabelas selecionadas."),
|
|
603
|
+
indicatorLabel: "2",
|
|
604
|
+
disabled: !this.sourceModalCanProceed,
|
|
605
|
+
},
|
|
606
|
+
];
|
|
607
|
+
}
|
|
608
|
+
get sourceModalTitle() {
|
|
609
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.modals.sources.title`, FALLBACK_SELECT_TABLES);
|
|
610
|
+
}
|
|
611
|
+
get sourceModalTimelineAriaLabel() {
|
|
612
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.accessibility.sourceModalTimeline`, "Etapas da configuracao das tabelas");
|
|
613
|
+
}
|
|
614
|
+
get sourceModalPicklistItems() {
|
|
615
|
+
return this.buildTablePicklistItems(this.config.availableData.tables ?? []);
|
|
616
|
+
}
|
|
617
|
+
get sourceModalSelectedPicklistIds() {
|
|
618
|
+
return this.sourceModalDrafts
|
|
619
|
+
.map((item) => this.resolveTablePicklistId(item.table))
|
|
620
|
+
.filter((item) => typeof item === "number" && item > 0);
|
|
621
|
+
}
|
|
622
|
+
get sourceModalConfiguredItems() {
|
|
623
|
+
return this.sourceModalDrafts.map((item) => {
|
|
624
|
+
const parts = this.resolveTableDisplayParts(item.table);
|
|
625
|
+
return {
|
|
626
|
+
id: item.table,
|
|
627
|
+
table: item.table,
|
|
628
|
+
dbLabel: parts.dbLabel,
|
|
629
|
+
tableLabel: parts.tableLabel,
|
|
630
|
+
alias: item.alias,
|
|
631
|
+
};
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
get joinItems() {
|
|
635
|
+
return this.config.generated.joins.map((item, index) => {
|
|
636
|
+
const source = this.resolveColumnParts(item.sourceColumn);
|
|
637
|
+
const target = this.resolveColumnParts(item.targetColumn);
|
|
638
|
+
return {
|
|
639
|
+
id: `${item.sourceColumn}-${item.targetColumn}-${index}`,
|
|
640
|
+
sourceTable: source.tableLabel,
|
|
641
|
+
sourceField: source.fieldLabel,
|
|
642
|
+
operator: this.resolveJoinOperatorLabel(item.operator),
|
|
643
|
+
targetTable: target.tableLabel,
|
|
644
|
+
targetField: target.fieldLabel,
|
|
645
|
+
};
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
get groupByItems() {
|
|
649
|
+
return this.config.generated.groupBy.map((item) => ({
|
|
650
|
+
id: item,
|
|
651
|
+
...this.resolveColumnParts(item),
|
|
652
|
+
}));
|
|
653
|
+
}
|
|
654
|
+
get fieldItemsLegacy() {
|
|
655
|
+
return this.getOrderedFieldEntries().map((entry, index) => ({
|
|
656
|
+
id: entry.column,
|
|
657
|
+
label: `${index + 1}° ${this.resolveColumnPath(entry.column)}`,
|
|
658
|
+
order: index,
|
|
659
|
+
}));
|
|
660
|
+
}
|
|
661
|
+
get fieldItems() {
|
|
662
|
+
return this.getOrderedFieldEntries().map((entry, index) => {
|
|
663
|
+
const functionName = entry.function?.functionName?.trim() ?? EMPTY_VALUE;
|
|
664
|
+
const functionAlias = entry.function?.alias?.trim() ?? EMPTY_VALUE;
|
|
665
|
+
return {
|
|
666
|
+
id: `${entry.column}-${index}`,
|
|
667
|
+
sourceIndex: entry.sourceIndex,
|
|
668
|
+
column: entry.column,
|
|
669
|
+
orderLabel: `${index + 1}°`,
|
|
670
|
+
...this.resolveColumnParts(entry.column),
|
|
671
|
+
alias: entry.alias?.trim() ?? EMPTY_VALUE,
|
|
672
|
+
width: entry.width?.trim() ?? EMPTY_VALUE,
|
|
673
|
+
functionName,
|
|
674
|
+
functionLabel: functionName ? this.resolveFunctionLabel(functionName) : EMPTY_VALUE,
|
|
675
|
+
functionAlias,
|
|
676
|
+
hasCustomConfig: !!entry.alias?.trim() || !!entry.width?.trim() || !!functionName || !!functionAlias,
|
|
677
|
+
order: index,
|
|
678
|
+
};
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
get fieldModalSelectionRows() {
|
|
682
|
+
return this.buildColumnSelectionRows(this.fieldSelectableColumns, this.fieldModalDrafts.map((item) => item.column), this.fieldModalSearch, true);
|
|
683
|
+
}
|
|
684
|
+
get fieldModalConfiguredItems() {
|
|
685
|
+
return this.fieldModalDrafts.map((item, index) => {
|
|
686
|
+
const parts = this.resolveColumnParts(item.column);
|
|
687
|
+
const functionName = item.function?.functionName?.trim() ?? EMPTY_VALUE;
|
|
688
|
+
return {
|
|
689
|
+
functionName,
|
|
690
|
+
id: `${item.column}-${index}`,
|
|
691
|
+
column: item.column,
|
|
692
|
+
tableLabel: parts.tableLabel,
|
|
693
|
+
fieldLabel: parts.fieldLabel,
|
|
694
|
+
alias: item.alias?.trim() ?? EMPTY_VALUE,
|
|
695
|
+
width: item.width?.trim() ?? EMPTY_VALUE,
|
|
696
|
+
functionLabel: functionName
|
|
697
|
+
? this.resolveFunctionLabel(functionName)
|
|
698
|
+
: EMPTY_VALUE,
|
|
699
|
+
functionAlias: item.function?.alias?.trim() ?? EMPTY_VALUE,
|
|
700
|
+
};
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
get fieldModalHasSelectableColumns() {
|
|
704
|
+
return this.fieldSelectableColumns.some((item) => !this.fieldModalDrafts.some((draft) => draft.column === item.value));
|
|
705
|
+
}
|
|
706
|
+
get fieldModalCanSelectAll() {
|
|
707
|
+
return this.fieldModalSelectionRows.some((item) => !item.selected);
|
|
708
|
+
}
|
|
709
|
+
get fieldModalPicklistItems() {
|
|
710
|
+
return this.buildColumnPicklistItems(this.fieldSelectableColumns);
|
|
711
|
+
}
|
|
712
|
+
get fieldModalSelectedPicklistIds() {
|
|
713
|
+
return this.fieldModalDrafts
|
|
714
|
+
.map((item) => this.resolveColumnPicklistId(item.column))
|
|
715
|
+
.filter((item) => typeof item === "number" && item > 0);
|
|
716
|
+
}
|
|
717
|
+
get fieldModalSelectionStepActive() {
|
|
718
|
+
return this.fieldModalStep === "select";
|
|
719
|
+
}
|
|
720
|
+
get fieldModalConfigurationStepActive() {
|
|
721
|
+
return this.fieldModalStep === "configure";
|
|
722
|
+
}
|
|
723
|
+
get fieldModalTimelineAriaLabel() {
|
|
724
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.accessibility.fieldModalTimeline`, "Etapas da configuracao do campo");
|
|
725
|
+
}
|
|
726
|
+
get fieldModalTimelineItems() {
|
|
727
|
+
return [
|
|
728
|
+
{
|
|
729
|
+
id: "select",
|
|
730
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.actions.selectColumns`, "Selecionar colunas"),
|
|
731
|
+
description: this.instantWithFallback(`${this.config.translationPrefix}.modals.fields.subtitle`, "Escolha uma ou mais colunas para expor no resultado."),
|
|
732
|
+
indicatorLabel: "1",
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
id: "configure",
|
|
736
|
+
label: this.fieldModalTitle,
|
|
737
|
+
description: this.instantWithFallback(`${this.config.translationPrefix}.modals.field.subtitle`, "Ajuste alias, largura e funcao antes de salvar o campo."),
|
|
738
|
+
indicatorLabel: "2",
|
|
739
|
+
disabled: !this.fieldModalDrafts.length,
|
|
740
|
+
},
|
|
741
|
+
];
|
|
742
|
+
}
|
|
743
|
+
get filterModalTimelineAriaLabel() {
|
|
744
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.accessibility.filterModalTimeline`, "Etapas da configuracao do filtro");
|
|
745
|
+
}
|
|
746
|
+
get filterModalTimelineItems() {
|
|
747
|
+
return [
|
|
748
|
+
{
|
|
749
|
+
id: "select",
|
|
750
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.modals.filter.steps.select.title`, "Selecionar base"),
|
|
751
|
+
description: this.instantWithFallback(`${this.config.translationPrefix}.modals.filter.steps.select.subtitle`, "Escolha o tipo de filtro e defina o campo inicial antes de configurar."),
|
|
752
|
+
indicatorLabel: "1",
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
id: "configure",
|
|
756
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.modals.filter.steps.configure.title`, "Configurar filtro"),
|
|
757
|
+
description: this.instantWithFallback(`${this.config.translationPrefix}.modals.filter.steps.configure.subtitle`, "Defina operador, valor e comportamento final do filtro."),
|
|
758
|
+
indicatorLabel: "2",
|
|
759
|
+
disabled: !this.filterModalCanProceed,
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
id: "review",
|
|
763
|
+
label: this.instantWithFallback(`${this.config.translationPrefix}.modals.filter.steps.review.title`, "Revisar regra"),
|
|
764
|
+
description: this.instantWithFallback(`${this.config.translationPrefix}.modals.filter.steps.review.subtitle`, "Confirme o resumo final da regra antes de salvar."),
|
|
765
|
+
indicatorLabel: "3",
|
|
766
|
+
disabled: !this.filterModalCanReview,
|
|
767
|
+
},
|
|
768
|
+
];
|
|
769
|
+
}
|
|
770
|
+
get filterModalConfigureActionLabel() {
|
|
771
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.actions.nextStep`, "Proxima etapa");
|
|
772
|
+
}
|
|
773
|
+
get filterModalReviewActionLabel() {
|
|
774
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.actions.reviewRule`, "Revisar regra");
|
|
775
|
+
}
|
|
776
|
+
get filterModalSelectionHelperText() {
|
|
777
|
+
if (this.filterModalMode === FILTER_MODE_DOMAIN) {
|
|
778
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.modals.filter.domainSelectionHint`, "A expressao de dominio sera configurada na proxima etapa.");
|
|
779
|
+
}
|
|
780
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.modals.filter.conditionSelectionHint`, "Selecione um campo para liberar a configuracao detalhada do filtro.");
|
|
781
|
+
}
|
|
782
|
+
get fieldModalFunctionOptions() {
|
|
783
|
+
return [
|
|
784
|
+
{
|
|
785
|
+
text: this.instantWithFallback(`${this.config.translationPrefix}.states.none`, "Sem funcao"),
|
|
786
|
+
value: EMPTY_VALUE,
|
|
787
|
+
},
|
|
788
|
+
...this.functionOptions,
|
|
789
|
+
];
|
|
790
|
+
}
|
|
791
|
+
get sortItems() {
|
|
792
|
+
return this.config.generated.sorting.map((item, index) => ({
|
|
793
|
+
id: `${item.column}-${item.functionName ?? EMPTY_VALUE}-${item.direction}-${index}`,
|
|
794
|
+
...this.resolveColumnParts(item.column),
|
|
795
|
+
functionName: item.functionName?.trim() ?? EMPTY_VALUE,
|
|
796
|
+
functionLabel: item.functionName
|
|
797
|
+
? this.resolveFunctionLabel(item.functionName)
|
|
798
|
+
: EMPTY_VALUE,
|
|
799
|
+
direction: this.resolveOptionLabel(item.direction, this.sortDirectionOptions),
|
|
800
|
+
}));
|
|
801
|
+
}
|
|
802
|
+
get filterItemsLegacy() {
|
|
803
|
+
return this.config.generated.filters.map((item, index) => ({
|
|
804
|
+
id: `${item.valueType}-${item.column}-${index}`,
|
|
805
|
+
title: item.valueType === FILTER_MODE_DOMAIN
|
|
806
|
+
? this.instantWithFallback(`${this.config.translationPrefix}.filters.domainLabel`, "Expressao de dominio")
|
|
807
|
+
: `${this.resolveColumnLabel(item.column)} · ${this.resolveFilterOperatorLabel(item.operator)}`,
|
|
808
|
+
subtitle: this.resolveFilterDisplayValue(item),
|
|
809
|
+
optional: item.optional,
|
|
810
|
+
}));
|
|
811
|
+
}
|
|
812
|
+
get filterItems() {
|
|
813
|
+
return this.config.generated.filters.map((item, index) => {
|
|
814
|
+
const parts = item.valueType === FILTER_MODE_DOMAIN
|
|
815
|
+
? {
|
|
816
|
+
dbLabel: EMPTY_VALUE,
|
|
817
|
+
tableLabel: this.instantWithFallback(`${this.config.translationPrefix}.filters.domainLabel`, "Expressao de dominio"),
|
|
818
|
+
fieldLabel: EMPTY_VALUE,
|
|
819
|
+
}
|
|
820
|
+
: this.resolveColumnParts(item.column);
|
|
821
|
+
return {
|
|
822
|
+
id: `${item.valueType}-${item.column}-${index}`,
|
|
823
|
+
...parts,
|
|
824
|
+
operatorLabel: item.valueType === FILTER_MODE_DOMAIN
|
|
825
|
+
? EMPTY_VALUE
|
|
826
|
+
: this.resolveFilterOperatorLabel(item.operator),
|
|
827
|
+
subtitle: this.resolveFilterDisplayValue(item),
|
|
828
|
+
optional: item.optional,
|
|
829
|
+
isDomain: item.valueType === FILTER_MODE_DOMAIN,
|
|
830
|
+
};
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
get selectionModalTitle() {
|
|
834
|
+
if (this.selectionModalMode === "tables") {
|
|
835
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.modals.sources.title`, FALLBACK_SELECT_TABLES);
|
|
836
|
+
}
|
|
837
|
+
if (this.selectionModalMode === "fields") {
|
|
838
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.modals.fields.title`, "Selecionar campos");
|
|
839
|
+
}
|
|
840
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.modals.groupBy.title`, "Selecionar Group By");
|
|
841
|
+
}
|
|
842
|
+
get modalSearchLabel() {
|
|
843
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.fields.search`, "Buscar");
|
|
844
|
+
}
|
|
845
|
+
get modalSearchPlaceholder() {
|
|
846
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.modals.searchPlaceholder`, "Buscar");
|
|
847
|
+
}
|
|
848
|
+
get modalNameLabel() {
|
|
849
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.fields.name`, "Nome");
|
|
850
|
+
}
|
|
851
|
+
get modalTypeLabel() {
|
|
852
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.fields.type`, "Tipo");
|
|
853
|
+
}
|
|
854
|
+
get modalSelectLabel() {
|
|
855
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.actions.select`, "Selecionar");
|
|
856
|
+
}
|
|
857
|
+
get filterModalTitle() {
|
|
858
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.cards.filters.title`, "Filtros");
|
|
859
|
+
}
|
|
860
|
+
get sortModalTitle() {
|
|
861
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.cards.sorting.title`, "Ordenacao");
|
|
862
|
+
}
|
|
863
|
+
get fieldModalTitle() {
|
|
864
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.modals.field.title`, "Configurar campo");
|
|
865
|
+
}
|
|
866
|
+
get selectionModalRows() {
|
|
867
|
+
if (this.selectionModalMode === "tables") {
|
|
868
|
+
return this.buildTableSelectionRows(this.selectionModalIds, this.selectionModalSearch);
|
|
869
|
+
}
|
|
870
|
+
if (this.selectionModalMode === "fields") {
|
|
871
|
+
return this.buildColumnSelectionRows(this.fieldSelectableColumns, this.selectionModalIds, this.selectionModalSearch);
|
|
872
|
+
}
|
|
873
|
+
return this.buildColumnSelectionRows(this.groupBySelectableColumns, this.selectionModalIds, this.selectionModalSearch);
|
|
874
|
+
}
|
|
875
|
+
get selectionModalPicklistItems() {
|
|
876
|
+
if (this.selectionModalMode === "fields") {
|
|
877
|
+
return this.buildColumnPicklistItems(this.fieldSelectableColumns);
|
|
878
|
+
}
|
|
879
|
+
return this.buildColumnPicklistItems(this.groupBySelectableColumns);
|
|
880
|
+
}
|
|
881
|
+
get selectionModalSelectedPicklistIds() {
|
|
882
|
+
return this.selectionModalIds
|
|
883
|
+
.map((item) => this.resolveColumnPicklistId(item))
|
|
884
|
+
.filter((item) => typeof item === "number" && item > 0);
|
|
885
|
+
}
|
|
886
|
+
get joinSourceRows() {
|
|
887
|
+
return this.buildColumnSelectionRows(this.availableColumns, this.joinDraft.sourceColumn ? [this.joinDraft.sourceColumn] : [], this.joinSourceSearch, false);
|
|
888
|
+
}
|
|
889
|
+
get joinSourcePicklistItems() {
|
|
890
|
+
return this.buildColumnPicklistItems(this.availableColumns);
|
|
891
|
+
}
|
|
892
|
+
get joinSourceSelectedPicklistIds() {
|
|
893
|
+
const selectedId = this.resolveColumnPicklistId(this.joinDraft.sourceColumn);
|
|
894
|
+
return typeof selectedId === "number" && selectedId > 0
|
|
895
|
+
? [selectedId]
|
|
896
|
+
: [];
|
|
897
|
+
}
|
|
898
|
+
get joinTargetRows() {
|
|
899
|
+
const source = this.resolveColumnOption(this.joinDraft.sourceColumn);
|
|
900
|
+
const items = source
|
|
901
|
+
? this.availableColumns.filter((item) => item.table !== source.table)
|
|
902
|
+
: this.availableColumns;
|
|
903
|
+
return this.buildColumnSelectionRows(items, this.joinDraft.targetColumn ? [this.joinDraft.targetColumn] : [], this.joinTargetSearch, false);
|
|
904
|
+
}
|
|
905
|
+
get joinTargetSelectableColumns() {
|
|
906
|
+
const source = this.resolveColumnOption(this.joinDraft.sourceColumn);
|
|
907
|
+
return source
|
|
908
|
+
? this.availableColumns.filter((item) => item.table !== source.table)
|
|
909
|
+
: this.availableColumns;
|
|
910
|
+
}
|
|
911
|
+
get joinTargetPicklistItems() {
|
|
912
|
+
return this.buildColumnPicklistItems(this.joinTargetSelectableColumns);
|
|
913
|
+
}
|
|
914
|
+
get joinTargetSelectedPicklistIds() {
|
|
915
|
+
const selectedId = this.resolveColumnPicklistId(this.joinDraft.targetColumn);
|
|
916
|
+
return typeof selectedId === "number" && selectedId > 0
|
|
917
|
+
? [selectedId]
|
|
918
|
+
: [];
|
|
919
|
+
}
|
|
920
|
+
get sortColumnRows() {
|
|
921
|
+
return this.sortSelectableItems
|
|
922
|
+
.filter((item) => this.matchesSearch([item.tableLabel, item.fieldLabel, item.meta], this.sortSearch))
|
|
923
|
+
.map((item) => ({
|
|
924
|
+
id: item.id,
|
|
925
|
+
name: item.fieldLabel,
|
|
926
|
+
meta: item.meta,
|
|
927
|
+
selected: this.sortDraft.column === item.column &&
|
|
928
|
+
(this.sortDraft.functionName || EMPTY_VALUE) === item.functionName,
|
|
929
|
+
disabled: false,
|
|
930
|
+
tableLabel: item.tableLabel,
|
|
931
|
+
pathType: "column",
|
|
932
|
+
}));
|
|
933
|
+
}
|
|
934
|
+
get sortPicklistItems() {
|
|
935
|
+
return this.sortSelectableItems.map((item, index) => ({
|
|
936
|
+
id: index + 1,
|
|
937
|
+
title: `${item.tableLabel}.${item.fieldLabel}`,
|
|
938
|
+
titlePrefix: item.tableLabel,
|
|
939
|
+
titleSuffix: item.fieldLabel,
|
|
940
|
+
titlePrefixColor: VISUAL_SQL_TABLE_COLOR,
|
|
941
|
+
titleSuffixColor: VISUAL_SQL_FIELD_COLOR,
|
|
942
|
+
badge: item.meta,
|
|
943
|
+
badgeColor: item.functionName
|
|
944
|
+
? PICKLIST_FUNCTION_BADGE_COLOR
|
|
945
|
+
: PICKLIST_DATA_TYPE_BADGE_COLOR,
|
|
946
|
+
selectionId: item.id,
|
|
947
|
+
column: item.column,
|
|
948
|
+
}));
|
|
949
|
+
}
|
|
950
|
+
get sortSelectedPicklistIds() {
|
|
951
|
+
const selected = this.sortPicklistItems.find((item) => item.column === this.sortDraft.column &&
|
|
952
|
+
item.selectionId ===
|
|
953
|
+
this.buildSortSelectionId(this.sortDraft.column, this.sortDraft.functionName || EMPTY_SORT_FUNCTION));
|
|
954
|
+
return selected ? [selected.id] : [];
|
|
955
|
+
}
|
|
956
|
+
get filterColumnRows() {
|
|
957
|
+
return this.buildColumnSelectionRows(this.availableColumns, this.filterDraft.column ? [this.filterDraft.column] : [], this.filterSearch, false);
|
|
958
|
+
}
|
|
959
|
+
get filterModalPicklistItems() {
|
|
960
|
+
return this.buildColumnPicklistItems(this.availableColumns);
|
|
961
|
+
}
|
|
962
|
+
get filterModalSelectedPicklistIds() {
|
|
963
|
+
const selectedId = this.resolveColumnPicklistId(this.filterDraft.column);
|
|
964
|
+
return typeof selectedId === "number" && selectedId > 0
|
|
965
|
+
? [selectedId]
|
|
966
|
+
: [];
|
|
967
|
+
}
|
|
968
|
+
get sortColumnSummary() {
|
|
969
|
+
return this.sortDraft.column
|
|
970
|
+
? this.resolveSortDraftLabel()
|
|
971
|
+
: this.instantWithFallback(`${this.config.translationPrefix}.states.emptySelection`, FALLBACK_EMPTY_SELECTION);
|
|
972
|
+
}
|
|
973
|
+
get filterColumnSummary() {
|
|
974
|
+
if (this.filterModalMode === FILTER_MODE_DOMAIN) {
|
|
975
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.domainLabel`, "Expressao de dominio");
|
|
976
|
+
}
|
|
977
|
+
return this.filterDraft.column
|
|
978
|
+
? this.resolveColumnPath(this.filterDraft.column)
|
|
979
|
+
: this.instantWithFallback(`${this.config.translationPrefix}.states.emptySelection`, FALLBACK_EMPTY_SELECTION);
|
|
980
|
+
}
|
|
981
|
+
get joinSourceSummary() {
|
|
982
|
+
return this.joinDraft.sourceColumn
|
|
983
|
+
? this.resolveColumnPath(this.joinDraft.sourceColumn)
|
|
984
|
+
: this.instantWithFallback(`${this.config.translationPrefix}.states.emptySelection`, FALLBACK_EMPTY_SELECTION);
|
|
985
|
+
}
|
|
986
|
+
get joinTargetSummary() {
|
|
987
|
+
return this.joinDraft.targetColumn
|
|
988
|
+
? this.resolveColumnPath(this.joinDraft.targetColumn)
|
|
989
|
+
: this.instantWithFallback(`${this.config.translationPrefix}.states.emptySelection`, FALLBACK_EMPTY_SELECTION);
|
|
990
|
+
}
|
|
991
|
+
get filterOperatorOptions() {
|
|
992
|
+
const column = this.resolveColumnOption(this.filterDraft.column);
|
|
993
|
+
if (!column) {
|
|
994
|
+
return [];
|
|
995
|
+
}
|
|
996
|
+
return this.filterOperatorsForColumn(column).map((value) => ({
|
|
997
|
+
value,
|
|
998
|
+
text: this.instantWithFallback(`${this.config.translationPrefix}.filters.operators.${value.toLowerCase()}`, this.humanizeKey(value)),
|
|
999
|
+
}));
|
|
1000
|
+
}
|
|
1001
|
+
get normalizedFields() {
|
|
1002
|
+
return this.config.generated.fields.map((item) => this.normalizeGeneratedField(item));
|
|
1003
|
+
}
|
|
1004
|
+
get selectedSortDirectionItem() {
|
|
1005
|
+
return (this.sortDirectionItems.find((item) => item.value === this.sortDraft.direction) ?? null);
|
|
1006
|
+
}
|
|
1007
|
+
get filterExpressionSummary() {
|
|
1008
|
+
if (this.filterModalMode === FILTER_MODE_DOMAIN) {
|
|
1009
|
+
return this.filterDraft.domainExpression.trim();
|
|
1010
|
+
}
|
|
1011
|
+
const column = this.filterDraft.column
|
|
1012
|
+
? this.resolveColumnPath(this.filterDraft.column)
|
|
1013
|
+
: this.instantWithFallback(`${this.config.translationPrefix}.states.emptySelection`, FALLBACK_EMPTY_SELECTION);
|
|
1014
|
+
const operator = this.filterDraft.operator
|
|
1015
|
+
? this.resolveFilterOperatorLabel(this.filterDraft.operator)
|
|
1016
|
+
: this.instantWithFallback(`${this.config.translationPrefix}.states.emptySelection`, FALLBACK_EMPTY_SELECTION);
|
|
1017
|
+
const value = this.resolveFilterDraftDisplayValue();
|
|
1018
|
+
return [column, operator, value].filter(Boolean).join(" | ");
|
|
1019
|
+
}
|
|
1020
|
+
get filterConfigurationSummaryLabel() {
|
|
1021
|
+
return this.filterModalMode === FILTER_MODE_DOMAIN
|
|
1022
|
+
? this.instantWithFallback(`${this.config.translationPrefix}.filters.domainLabel`, "Expressao de dominio")
|
|
1023
|
+
: this.filterColumnSummary;
|
|
1024
|
+
}
|
|
1025
|
+
get filterBackToSelectionLabel() {
|
|
1026
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.actions.backToSelection`, "Voltar para selecao");
|
|
1027
|
+
}
|
|
1028
|
+
get filterBackToConfigurationLabel() {
|
|
1029
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.actions.backToConfiguration`, "Voltar para configuracao");
|
|
1030
|
+
}
|
|
1031
|
+
get previewColumns() {
|
|
1032
|
+
const configColumns = this.resolvePreviewColumns();
|
|
1033
|
+
return configColumns.map((item) => ({
|
|
1034
|
+
field: item.field,
|
|
1035
|
+
header: item.header ?? item.field,
|
|
1036
|
+
type: item.type ?? "text",
|
|
1037
|
+
}));
|
|
1038
|
+
}
|
|
1039
|
+
get previewRows() {
|
|
1040
|
+
const fields = this.previewColumns
|
|
1041
|
+
.map((item) => item.field)
|
|
1042
|
+
.filter((field) => typeof field === "string");
|
|
1043
|
+
const rows = (this.config.preview?.rows ?? []).map((row) => {
|
|
1044
|
+
const next = {};
|
|
1045
|
+
fields.forEach((field) => {
|
|
1046
|
+
next[field] = row[field] ?? EMPTY_VALUE;
|
|
1047
|
+
});
|
|
1048
|
+
return next;
|
|
1049
|
+
});
|
|
1050
|
+
if (rows.length) {
|
|
1051
|
+
return rows;
|
|
1052
|
+
}
|
|
1053
|
+
if (!fields.length) {
|
|
1054
|
+
return [];
|
|
1055
|
+
}
|
|
1056
|
+
return Array.from({ length: 5 }).map((_, rowIndex) => {
|
|
1057
|
+
const next = {};
|
|
1058
|
+
fields.forEach((field) => {
|
|
1059
|
+
next[field] = `${field}_${rowIndex + 1}`;
|
|
1060
|
+
});
|
|
1061
|
+
return next;
|
|
1062
|
+
});
|
|
1063
|
+
}
|
|
1064
|
+
get previewTableConfig() {
|
|
1065
|
+
return {
|
|
1066
|
+
rows: DYNAMIC_VIEW_BUILDER_DEFAULT_TABLE_ROWS,
|
|
1067
|
+
showRowsPerPageOptions: true,
|
|
1068
|
+
rowsPerPageOptions: PREVIEW_ROWS_PER_PAGE_OPTIONS,
|
|
1069
|
+
emptyTitle: `${this.config.translationPrefix}.empty.previewTitle`,
|
|
1070
|
+
emptySubtitle: `${this.config.translationPrefix}.empty.previewText`,
|
|
1071
|
+
};
|
|
1072
|
+
}
|
|
1073
|
+
get sqlPreview() {
|
|
1074
|
+
const generatedSql = this.buildGeneratedSql();
|
|
1075
|
+
if (generatedSql) {
|
|
1076
|
+
return generatedSql;
|
|
1077
|
+
}
|
|
1078
|
+
return this.config.manual?.sql ?? EMPTY_VALUE;
|
|
1079
|
+
}
|
|
1080
|
+
get sqlPreviewHeight() {
|
|
1081
|
+
return this.layoutMode === "split" ? "100%" : "24rem";
|
|
1082
|
+
}
|
|
1083
|
+
get sqlPreviewPanelHeight() {
|
|
1084
|
+
return this.layoutMode === "split"
|
|
1085
|
+
? this.measuredSplitPreviewHeight
|
|
1086
|
+
: null;
|
|
1087
|
+
}
|
|
1088
|
+
get previewToggleLabel() {
|
|
1089
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.actions.${this.previewVisible ? "hidePreview" : "showPreview"}`, this.previewVisible ? "Ocultar preview" : "Visualizar preview");
|
|
1090
|
+
}
|
|
1091
|
+
get selectedFilterModeItem() {
|
|
1092
|
+
return (this.filterModeItems.find((item) => item.value === this.filterModalMode) ??
|
|
1093
|
+
null);
|
|
1094
|
+
}
|
|
1095
|
+
trackById(_, item) {
|
|
1096
|
+
return item.id;
|
|
1097
|
+
}
|
|
1098
|
+
trackByArrow(_, item) {
|
|
1099
|
+
return item.id;
|
|
1100
|
+
}
|
|
1101
|
+
onLayoutModeChange(items) {
|
|
1102
|
+
const next = items[0]?.value;
|
|
1103
|
+
if (next === "stacked" || next === "split") {
|
|
1104
|
+
this.layoutMode = next;
|
|
1105
|
+
this.syncSelectedLayoutModeItems();
|
|
1106
|
+
this.scheduleFlowArrowRefresh();
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
togglePreview() {
|
|
1110
|
+
this.previewVisible = !this.previewVisible;
|
|
1111
|
+
this.scheduleFlowArrowRefresh();
|
|
1112
|
+
}
|
|
1113
|
+
onSortDirectionChange(items) {
|
|
1114
|
+
const next = items[0]?.value;
|
|
1115
|
+
if (next) {
|
|
1116
|
+
this.sortDraft.direction = next;
|
|
1117
|
+
this.syncSelectedSortDirectionItems();
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
isFieldDropIndicatorVisible(index) {
|
|
1121
|
+
return this.draggingFieldIndex !== null && this.dragPreviewIndex === index;
|
|
1122
|
+
}
|
|
1123
|
+
isFieldDropIndicatorAtEndVisible() {
|
|
1124
|
+
return (this.draggingFieldIndex !== null &&
|
|
1125
|
+
this.dragPreviewIndex === this.fieldItems.length);
|
|
1126
|
+
}
|
|
1127
|
+
onFieldDragStart(index) {
|
|
1128
|
+
this.draggingFieldIndex = index;
|
|
1129
|
+
this.dragPreviewIndex = this.getFieldPreviewSourceIndexes().indexOf(index);
|
|
1130
|
+
}
|
|
1131
|
+
onFieldDragOver(event, index) {
|
|
1132
|
+
event.preventDefault();
|
|
1133
|
+
const target = event.currentTarget;
|
|
1134
|
+
if (!target || this.draggingFieldIndex === null) {
|
|
1135
|
+
return;
|
|
1136
|
+
}
|
|
1137
|
+
const rect = target.getBoundingClientRect();
|
|
1138
|
+
const shouldInsertAfter = event.clientX > rect.left + rect.width / 2;
|
|
1139
|
+
this.dragPreviewIndex = Math.min(index + (shouldInsertAfter ? 1 : 0), this.fieldItems.length);
|
|
1140
|
+
}
|
|
1141
|
+
onFieldDrop() {
|
|
1142
|
+
if (this.draggingFieldIndex === null || this.dragPreviewIndex === null) {
|
|
1143
|
+
this.draggingFieldIndex = null;
|
|
1144
|
+
this.dragPreviewIndex = null;
|
|
1145
|
+
return;
|
|
1146
|
+
}
|
|
1147
|
+
const previewIndexes = this.getFieldPreviewSourceIndexes();
|
|
1148
|
+
this.config.generated.fields = previewIndexes.map((itemIndex) => this.config.generated.fields[itemIndex]);
|
|
1149
|
+
this.draggingFieldIndex = null;
|
|
1150
|
+
this.dragPreviewIndex = null;
|
|
1151
|
+
this.afterBuilderMutation();
|
|
1152
|
+
}
|
|
1153
|
+
onFieldDragEnd() {
|
|
1154
|
+
this.draggingFieldIndex = null;
|
|
1155
|
+
this.dragPreviewIndex = null;
|
|
1156
|
+
}
|
|
1157
|
+
openFieldModal(index) {
|
|
1158
|
+
const current = typeof index === "number" ? this.normalizedFields[index] : undefined;
|
|
1159
|
+
this.fieldModalDrafts = this.getOrderedFieldEntries().map((item) => ({
|
|
1160
|
+
column: item.column,
|
|
1161
|
+
alias: item.alias?.trim() ?? EMPTY_VALUE,
|
|
1162
|
+
width: item.width?.trim() ?? EMPTY_VALUE,
|
|
1163
|
+
function: item.function
|
|
1164
|
+
? {
|
|
1165
|
+
functionName: item.function.functionName?.trim() ?? EMPTY_VALUE,
|
|
1166
|
+
alias: item.function.alias?.trim() ?? EMPTY_VALUE,
|
|
1167
|
+
}
|
|
1168
|
+
: null,
|
|
1169
|
+
}));
|
|
1170
|
+
this.fieldModalSearch = EMPTY_VALUE;
|
|
1171
|
+
this.fieldFunctionEditColumn = null;
|
|
1172
|
+
this.fieldFunctionDraft = {
|
|
1173
|
+
column: EMPTY_VALUE,
|
|
1174
|
+
functionName: EMPTY_VALUE,
|
|
1175
|
+
functionAlias: EMPTY_VALUE,
|
|
1176
|
+
};
|
|
1177
|
+
this.fieldModalStep =
|
|
1178
|
+
typeof index === "number" && current ? "configure" : "select";
|
|
1179
|
+
this.fieldModalVisible = true;
|
|
1180
|
+
}
|
|
1181
|
+
openFieldConfigurationModal() {
|
|
1182
|
+
if (!this.canOpenFieldConfiguration) {
|
|
1183
|
+
return;
|
|
1184
|
+
}
|
|
1185
|
+
this.openFieldModal(0);
|
|
1186
|
+
}
|
|
1187
|
+
closeFieldModal() {
|
|
1188
|
+
this.fieldModalVisible = false;
|
|
1189
|
+
this.fieldModalStep = "select";
|
|
1190
|
+
this.fieldModalSearch = EMPTY_VALUE;
|
|
1191
|
+
this.fieldModalDrafts = [];
|
|
1192
|
+
this.fieldFunctionEditColumn = null;
|
|
1193
|
+
this.fieldFunctionDraft = {
|
|
1194
|
+
column: EMPTY_VALUE,
|
|
1195
|
+
functionName: EMPTY_VALUE,
|
|
1196
|
+
functionAlias: EMPTY_VALUE,
|
|
1197
|
+
};
|
|
1198
|
+
}
|
|
1199
|
+
goToFieldModalStep(step) {
|
|
1200
|
+
if (step === "configure" && !this.fieldModalDrafts.length) {
|
|
1201
|
+
return;
|
|
1202
|
+
}
|
|
1203
|
+
this.fieldModalStep = step;
|
|
1204
|
+
if (step === "select") {
|
|
1205
|
+
this.fieldModalSearch = EMPTY_VALUE;
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
advanceFieldModalStep() {
|
|
1209
|
+
this.goToFieldModalStep("configure");
|
|
1210
|
+
}
|
|
1211
|
+
onFieldModalTimelineStepSelect(event) {
|
|
1212
|
+
this.goToFieldModalStep(event.item.id === "configure" ? "configure" : "select");
|
|
1213
|
+
}
|
|
1214
|
+
selectFieldModalColumn(column) {
|
|
1215
|
+
const current = this.fieldModalDrafts.find((item) => item.column === column);
|
|
1216
|
+
if (current) {
|
|
1217
|
+
this.removeFieldModalDraft(column);
|
|
1218
|
+
return;
|
|
1219
|
+
}
|
|
1220
|
+
this.fieldModalDrafts = [
|
|
1221
|
+
...this.fieldModalDrafts,
|
|
1222
|
+
{
|
|
1223
|
+
column,
|
|
1224
|
+
alias: EMPTY_VALUE,
|
|
1225
|
+
width: EMPTY_VALUE,
|
|
1226
|
+
function: null,
|
|
1227
|
+
},
|
|
1228
|
+
];
|
|
1229
|
+
this.fieldFunctionEditColumn = null;
|
|
1230
|
+
}
|
|
1231
|
+
selectAllFieldModalColumns() {
|
|
1232
|
+
const selectedColumns = new Set(this.fieldModalDrafts.map((item) => item.column));
|
|
1233
|
+
const rowsToSelect = this.fieldSelectableColumns.filter((item) => !selectedColumns.has(item.value));
|
|
1234
|
+
if (!rowsToSelect.length) {
|
|
1235
|
+
return;
|
|
1236
|
+
}
|
|
1237
|
+
this.fieldModalDrafts = [
|
|
1238
|
+
...this.fieldModalDrafts,
|
|
1239
|
+
...rowsToSelect.map((item) => ({
|
|
1240
|
+
column: item.value,
|
|
1241
|
+
alias: EMPTY_VALUE,
|
|
1242
|
+
width: EMPTY_VALUE,
|
|
1243
|
+
function: null,
|
|
1244
|
+
})),
|
|
1245
|
+
];
|
|
1246
|
+
this.fieldFunctionEditColumn = null;
|
|
1247
|
+
}
|
|
1248
|
+
addAnotherFieldFromModal() {
|
|
1249
|
+
this.fieldModalStep = "select";
|
|
1250
|
+
this.fieldModalSearch = EMPTY_VALUE;
|
|
1251
|
+
}
|
|
1252
|
+
onFieldModalSelectedIdsChange(ids) {
|
|
1253
|
+
const selectedColumns = new Set(ids
|
|
1254
|
+
.map((item) => this.resolveColumnPicklistColumn(item))
|
|
1255
|
+
.filter((item) => !!item));
|
|
1256
|
+
const preservedDrafts = this.fieldModalDrafts.filter((item) => selectedColumns.has(item.column));
|
|
1257
|
+
const preservedColumns = new Set(preservedDrafts.map((item) => item.column));
|
|
1258
|
+
const appendedDrafts = this.fieldSelectableColumns
|
|
1259
|
+
.filter((item) => selectedColumns.has(item.value) && !preservedColumns.has(item.value))
|
|
1260
|
+
.map((item) => ({
|
|
1261
|
+
column: item.value,
|
|
1262
|
+
alias: EMPTY_VALUE,
|
|
1263
|
+
width: EMPTY_VALUE,
|
|
1264
|
+
function: null,
|
|
1265
|
+
}));
|
|
1266
|
+
this.fieldModalDrafts = [...preservedDrafts, ...appendedDrafts];
|
|
1267
|
+
if (this.fieldFunctionEditColumn &&
|
|
1268
|
+
!selectedColumns.has(this.fieldFunctionEditColumn)) {
|
|
1269
|
+
this.cancelFieldFunctionEdit();
|
|
1270
|
+
}
|
|
1271
|
+
if (!this.fieldModalDrafts.length) {
|
|
1272
|
+
this.fieldModalStep = "select";
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
onFieldModalAliasChange(column, value) {
|
|
1276
|
+
this.patchFieldModalDraft(column, { alias: value });
|
|
1277
|
+
}
|
|
1278
|
+
onFieldModalWidthChange(column, value) {
|
|
1279
|
+
this.patchFieldModalDraft(column, { width: value });
|
|
1280
|
+
}
|
|
1281
|
+
removeFieldModalDraft(column) {
|
|
1282
|
+
this.fieldModalDrafts = this.fieldModalDrafts.filter((item) => item.column !== column);
|
|
1283
|
+
if (this.fieldFunctionEditColumn === column) {
|
|
1284
|
+
this.cancelFieldFunctionEdit();
|
|
1285
|
+
}
|
|
1286
|
+
if (!this.fieldModalDrafts.length) {
|
|
1287
|
+
this.fieldModalStep = "select";
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
startFieldFunctionEdit(column) {
|
|
1291
|
+
const current = this.fieldModalDrafts.find((item) => item.column === column);
|
|
1292
|
+
if (!current) {
|
|
1293
|
+
return;
|
|
1294
|
+
}
|
|
1295
|
+
this.fieldFunctionEditColumn = column;
|
|
1296
|
+
this.fieldFunctionDraft = {
|
|
1297
|
+
column,
|
|
1298
|
+
functionName: current.function?.functionName?.trim() ?? EMPTY_VALUE,
|
|
1299
|
+
functionAlias: current.function?.alias?.trim() ?? EMPTY_VALUE,
|
|
1300
|
+
};
|
|
1301
|
+
}
|
|
1302
|
+
cancelFieldFunctionEdit() {
|
|
1303
|
+
this.fieldFunctionEditColumn = null;
|
|
1304
|
+
this.fieldFunctionDraft = {
|
|
1305
|
+
column: EMPTY_VALUE,
|
|
1306
|
+
functionName: EMPTY_VALUE,
|
|
1307
|
+
functionAlias: EMPTY_VALUE,
|
|
1308
|
+
};
|
|
1309
|
+
}
|
|
1310
|
+
onFieldFunctionDraftNameChange(value) {
|
|
1311
|
+
this.fieldFunctionDraft.functionName = value;
|
|
1312
|
+
this.onFieldFunctionNameChange();
|
|
1313
|
+
}
|
|
1314
|
+
saveFieldFunctionEdit() {
|
|
1315
|
+
if (!this.fieldFunctionEditColumn) {
|
|
1316
|
+
return;
|
|
1317
|
+
}
|
|
1318
|
+
this.patchFieldModalDraft(this.fieldFunctionEditColumn, {
|
|
1319
|
+
function: this.buildFieldFunctionDraft(),
|
|
1320
|
+
});
|
|
1321
|
+
this.cancelFieldFunctionEdit();
|
|
1322
|
+
}
|
|
1323
|
+
isFieldFunctionEditing(column) {
|
|
1324
|
+
return this.fieldFunctionEditColumn === column;
|
|
1325
|
+
}
|
|
1326
|
+
saveField() {
|
|
1327
|
+
if (!this.canSaveFieldModal) {
|
|
1328
|
+
return;
|
|
1329
|
+
}
|
|
1330
|
+
this.config.generated.fields = this.fieldModalDrafts.map((item) => ({
|
|
1331
|
+
column: item.column,
|
|
1332
|
+
alias: item.alias?.trim() ?? EMPTY_VALUE,
|
|
1333
|
+
width: item.width?.trim() ?? EMPTY_VALUE,
|
|
1334
|
+
function: item.function?.functionName?.trim()
|
|
1335
|
+
? {
|
|
1336
|
+
functionName: item.function.functionName.trim(),
|
|
1337
|
+
alias: item.function.alias?.trim() ?? EMPTY_VALUE,
|
|
1338
|
+
}
|
|
1339
|
+
: null,
|
|
1340
|
+
}));
|
|
1341
|
+
this.closeFieldModal();
|
|
1342
|
+
this.afterBuilderMutation();
|
|
1343
|
+
}
|
|
1344
|
+
openSourceModal(step = "select") {
|
|
1345
|
+
this.sourceModalDrafts = this.config.generated.sources.map((item) => ({
|
|
1346
|
+
table: item.table,
|
|
1347
|
+
alias: item.alias?.trim() || this.resolveDefaultSourceAlias(item.table),
|
|
1348
|
+
}));
|
|
1349
|
+
this.sourceModalStep =
|
|
1350
|
+
step === "configure" && this.sourceModalDrafts.length
|
|
1351
|
+
? "configure"
|
|
1352
|
+
: "select";
|
|
1353
|
+
this.sourceModalVisible = true;
|
|
1354
|
+
}
|
|
1355
|
+
openSourceConfigurationModal() {
|
|
1356
|
+
if (!this.canOpenSourceConfiguration) {
|
|
1357
|
+
return;
|
|
1358
|
+
}
|
|
1359
|
+
this.openSourceModal("configure");
|
|
1360
|
+
}
|
|
1361
|
+
closeSourceModal() {
|
|
1362
|
+
this.sourceModalVisible = false;
|
|
1363
|
+
this.sourceModalStep = "select";
|
|
1364
|
+
this.sourceModalDrafts = [];
|
|
1365
|
+
}
|
|
1366
|
+
goToSourceModalStep(step) {
|
|
1367
|
+
if (step === "configure" && !this.sourceModalDrafts.length) {
|
|
1368
|
+
return;
|
|
1369
|
+
}
|
|
1370
|
+
this.sourceModalStep = step;
|
|
1371
|
+
}
|
|
1372
|
+
advanceSourceModalStep() {
|
|
1373
|
+
this.goToSourceModalStep("configure");
|
|
1374
|
+
}
|
|
1375
|
+
onSourceModalTimelineStepSelect(event) {
|
|
1376
|
+
this.goToSourceModalStep(event.item.id === "configure" ? "configure" : "select");
|
|
1377
|
+
}
|
|
1378
|
+
onSourceModalSelectedIdsChange(ids) {
|
|
1379
|
+
const selectedTables = this.resolveTablesFromPicklistIds(ids);
|
|
1380
|
+
const draftByTable = new Map(this.sourceModalDrafts.map((item) => [item.table, item]));
|
|
1381
|
+
this.sourceModalDrafts = selectedTables.map((table) => {
|
|
1382
|
+
const current = draftByTable.get(table);
|
|
1383
|
+
return (current ?? {
|
|
1384
|
+
table,
|
|
1385
|
+
alias: this.resolveDefaultSourceAlias(table),
|
|
1386
|
+
});
|
|
1387
|
+
});
|
|
1388
|
+
if (!this.sourceModalDrafts.length) {
|
|
1389
|
+
this.sourceModalStep = "select";
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
onSourceModalAliasChange(table, value) {
|
|
1393
|
+
this.sourceModalDrafts = this.sourceModalDrafts.map((item) => item.table === table
|
|
1394
|
+
? {
|
|
1395
|
+
...item,
|
|
1396
|
+
alias: value,
|
|
1397
|
+
}
|
|
1398
|
+
: item);
|
|
1399
|
+
}
|
|
1400
|
+
saveSourceModal() {
|
|
1401
|
+
if (!this.sourceModalDrafts.length) {
|
|
1402
|
+
return;
|
|
1403
|
+
}
|
|
1404
|
+
this.config.generated.sources = this.sourceModalDrafts.map((item) => {
|
|
1405
|
+
const table = this.resolveTableOption(item.table);
|
|
1406
|
+
return {
|
|
1407
|
+
table: item.table,
|
|
1408
|
+
alias: item.alias?.trim() || this.resolveDefaultSourceAlias(item.table), // NOSONAR
|
|
1409
|
+
schema: table?.schema,
|
|
1410
|
+
label: table?.displayName || table?.text, // NOSONAR
|
|
1411
|
+
};
|
|
1412
|
+
});
|
|
1413
|
+
this.closeSourceModal();
|
|
1414
|
+
this.afterBuilderMutation();
|
|
1415
|
+
}
|
|
1416
|
+
openSelectionModal(mode) {
|
|
1417
|
+
this.selectionModalMode = mode;
|
|
1418
|
+
this.selectionModalSearch = EMPTY_VALUE;
|
|
1419
|
+
if (mode === "tables") {
|
|
1420
|
+
this.selectionModalIds = this.config.generated.sources.map((item) => item.table);
|
|
1421
|
+
}
|
|
1422
|
+
else if (mode === "fields") {
|
|
1423
|
+
this.selectionModalIds = this.normalizedFields.map((item) => item.column);
|
|
1424
|
+
}
|
|
1425
|
+
else {
|
|
1426
|
+
this.selectionModalIds = [...this.config.generated.groupBy];
|
|
1427
|
+
}
|
|
1428
|
+
this.selectionModalVisible = true;
|
|
1429
|
+
}
|
|
1430
|
+
closeSelectionModal() {
|
|
1431
|
+
this.selectionModalVisible = false;
|
|
1432
|
+
this.selectionModalIds = [];
|
|
1433
|
+
this.selectionModalSearch = EMPTY_VALUE;
|
|
1434
|
+
}
|
|
1435
|
+
toggleSelectionModalRow(id) {
|
|
1436
|
+
this.selectionModalIds = this.toggleMultipleValue(this.selectionModalIds, id);
|
|
1437
|
+
}
|
|
1438
|
+
onSelectionModalSelectedIdsChange(ids) {
|
|
1439
|
+
this.selectionModalIds = this.resolveColumnsFromPicklistIds(ids);
|
|
1440
|
+
}
|
|
1441
|
+
onSelectableRowKeydown(event) {
|
|
1442
|
+
if (event.key === " " || event.key === "Enter") {
|
|
1443
|
+
event.preventDefault();
|
|
1444
|
+
event.currentTarget?.click();
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
confirmSelectionModal() {
|
|
1448
|
+
if (this.selectionModalMode === "tables") {
|
|
1449
|
+
const aliases = new Map(this.config.generated.sources.map((item) => [
|
|
1450
|
+
item.table,
|
|
1451
|
+
{
|
|
1452
|
+
alias: item.alias,
|
|
1453
|
+
schema: item.schema,
|
|
1454
|
+
label: item.label,
|
|
1455
|
+
},
|
|
1456
|
+
]));
|
|
1457
|
+
this.config.generated.sources = (this.config.availableData.tables ?? [])
|
|
1458
|
+
.filter((item) => this.selectionModalIds.includes(item.value))
|
|
1459
|
+
.map((item) => ({
|
|
1460
|
+
table: item.value,
|
|
1461
|
+
alias: aliases.get(item.value)?.alias?.trim() || this.buildAliasForTable(item), // NOSONAR
|
|
1462
|
+
schema: aliases.get(item.value)?.schema ?? item.schema,
|
|
1463
|
+
label: aliases.get(item.value)?.label ??
|
|
1464
|
+
item.displayName ??
|
|
1465
|
+
item.text,
|
|
1466
|
+
}));
|
|
1467
|
+
}
|
|
1468
|
+
else if (this.selectionModalMode === "fields") {
|
|
1469
|
+
const fieldConfigByColumn = new Map(this.normalizedFields.map((item) => [item.column, item]));
|
|
1470
|
+
this.config.generated.fields = this.selectionModalIds.map((column) => fieldConfigByColumn.get(column) ?? { column });
|
|
1471
|
+
}
|
|
1472
|
+
else {
|
|
1473
|
+
this.config.generated.groupBy = [...this.selectionModalIds];
|
|
1474
|
+
}
|
|
1475
|
+
this.closeSelectionModal();
|
|
1476
|
+
this.afterBuilderMutation();
|
|
1477
|
+
}
|
|
1478
|
+
openJoinModal(index) {
|
|
1479
|
+
const current = typeof index === "number" ? this.config.generated.joins[index] : null;
|
|
1480
|
+
this.joinEditIndex = typeof index === "number" ? index : null;
|
|
1481
|
+
this.joinSourceSearch = EMPTY_VALUE;
|
|
1482
|
+
this.joinTargetSearch = EMPTY_VALUE;
|
|
1483
|
+
this.joinDraft = {
|
|
1484
|
+
sourceColumn: current?.sourceColumn ?? EMPTY_VALUE,
|
|
1485
|
+
targetColumn: current?.targetColumn ?? EMPTY_VALUE,
|
|
1486
|
+
operator: current?.operator ?? DEFAULT_JOIN_OPERATOR,
|
|
1487
|
+
};
|
|
1488
|
+
this.joinModalVisible = true;
|
|
1489
|
+
}
|
|
1490
|
+
closeJoinModal() {
|
|
1491
|
+
this.joinModalVisible = false;
|
|
1492
|
+
this.joinEditIndex = null;
|
|
1493
|
+
this.joinSourceSearch = EMPTY_VALUE;
|
|
1494
|
+
this.joinTargetSearch = EMPTY_VALUE;
|
|
1495
|
+
this.joinDraft = {
|
|
1496
|
+
sourceColumn: EMPTY_VALUE,
|
|
1497
|
+
targetColumn: EMPTY_VALUE,
|
|
1498
|
+
operator: DEFAULT_JOIN_OPERATOR,
|
|
1499
|
+
};
|
|
1500
|
+
}
|
|
1501
|
+
selectJoinSource(column) {
|
|
1502
|
+
this.joinDraft.sourceColumn =
|
|
1503
|
+
this.joinDraft.sourceColumn === column ? EMPTY_VALUE : column;
|
|
1504
|
+
const source = this.resolveColumnOption(this.joinDraft.sourceColumn);
|
|
1505
|
+
const target = this.resolveColumnOption(this.joinDraft.targetColumn);
|
|
1506
|
+
if (source && target && source.table === target.table) {
|
|
1507
|
+
this.joinDraft.targetColumn = EMPTY_VALUE;
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
onJoinSourceSelectedIdsChange(ids) {
|
|
1511
|
+
const column = this.resolveLastColumnFromPicklistIds(ids);
|
|
1512
|
+
this.joinDraft.sourceColumn =
|
|
1513
|
+
column && column === this.joinDraft.sourceColumn ? EMPTY_VALUE : column ?? EMPTY_VALUE;
|
|
1514
|
+
const source = this.resolveColumnOption(this.joinDraft.sourceColumn);
|
|
1515
|
+
const target = this.resolveColumnOption(this.joinDraft.targetColumn);
|
|
1516
|
+
if (source && target && source.table === target.table) {
|
|
1517
|
+
this.joinDraft.targetColumn = EMPTY_VALUE;
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
selectJoinTarget(column) {
|
|
1521
|
+
this.joinDraft.targetColumn =
|
|
1522
|
+
this.joinDraft.targetColumn === column ? EMPTY_VALUE : column;
|
|
1523
|
+
}
|
|
1524
|
+
onJoinTargetSelectedIdsChange(ids) {
|
|
1525
|
+
const column = this.resolveLastColumnFromPicklistIds(ids);
|
|
1526
|
+
this.joinDraft.targetColumn =
|
|
1527
|
+
column && column === this.joinDraft.targetColumn ? EMPTY_VALUE : column ?? EMPTY_VALUE;
|
|
1528
|
+
}
|
|
1529
|
+
saveJoin() {
|
|
1530
|
+
if (!this.canSaveJoin) {
|
|
1531
|
+
return;
|
|
1532
|
+
}
|
|
1533
|
+
const next = {
|
|
1534
|
+
sourceColumn: this.joinDraft.sourceColumn,
|
|
1535
|
+
targetColumn: this.joinDraft.targetColumn,
|
|
1536
|
+
operator: this.joinDraft.operator,
|
|
1537
|
+
};
|
|
1538
|
+
const items = [...this.config.generated.joins];
|
|
1539
|
+
if (this.joinEditIndex === null) {
|
|
1540
|
+
items.push(next);
|
|
1541
|
+
}
|
|
1542
|
+
else {
|
|
1543
|
+
items[this.joinEditIndex] = next;
|
|
1544
|
+
}
|
|
1545
|
+
this.config.generated.joins = this.deduplicateByKey(items, (item) => [item.sourceColumn, item.targetColumn, item.operator].join("|"));
|
|
1546
|
+
this.closeJoinModal();
|
|
1547
|
+
this.afterBuilderMutation();
|
|
1548
|
+
}
|
|
1549
|
+
openSortModal(index) {
|
|
1550
|
+
const current = typeof index === "number" ? this.config.generated.sorting[index] : null;
|
|
1551
|
+
this.sortEditIndex = typeof index === "number" ? index : null;
|
|
1552
|
+
this.sortSearch = EMPTY_VALUE;
|
|
1553
|
+
this.sortDraft = {
|
|
1554
|
+
column: current?.column ?? EMPTY_VALUE,
|
|
1555
|
+
functionName: current?.functionName?.trim() ?? EMPTY_VALUE,
|
|
1556
|
+
direction: current?.direction ?? DEFAULT_SORT_DIRECTION,
|
|
1557
|
+
};
|
|
1558
|
+
this.sortModalVisible = true;
|
|
1559
|
+
}
|
|
1560
|
+
closeSortModal() {
|
|
1561
|
+
this.sortModalVisible = false;
|
|
1562
|
+
this.sortEditIndex = null;
|
|
1563
|
+
this.sortSearch = EMPTY_VALUE;
|
|
1564
|
+
this.sortDraft = {
|
|
1565
|
+
column: EMPTY_VALUE,
|
|
1566
|
+
functionName: EMPTY_VALUE,
|
|
1567
|
+
direction: DEFAULT_SORT_DIRECTION,
|
|
1568
|
+
};
|
|
1569
|
+
}
|
|
1570
|
+
selectSortColumn(sortSelectionId) {
|
|
1571
|
+
const next = this.parseSortSelectionId(sortSelectionId);
|
|
1572
|
+
const isSameSelection = this.sortDraft.column === next.column &&
|
|
1573
|
+
(this.sortDraft.functionName || EMPTY_VALUE) === next.functionName;
|
|
1574
|
+
this.sortDraft.column = isSameSelection ? EMPTY_VALUE : next.column;
|
|
1575
|
+
this.sortDraft.functionName = isSameSelection
|
|
1576
|
+
? EMPTY_VALUE
|
|
1577
|
+
: next.functionName;
|
|
1578
|
+
}
|
|
1579
|
+
onSortSelectedIdsChange(ids) {
|
|
1580
|
+
const selectedId = ids.at(-1);
|
|
1581
|
+
const selectedItem = this.sortPicklistItems.find((item) => item.id === selectedId);
|
|
1582
|
+
if (!selectedItem) {
|
|
1583
|
+
this.sortDraft.column = EMPTY_VALUE;
|
|
1584
|
+
this.sortDraft.functionName = EMPTY_VALUE;
|
|
1585
|
+
return;
|
|
1586
|
+
}
|
|
1587
|
+
this.selectSortColumn(selectedItem.selectionId);
|
|
1588
|
+
}
|
|
1589
|
+
saveSort() {
|
|
1590
|
+
if (!this.canSaveSort) {
|
|
1591
|
+
return;
|
|
1592
|
+
}
|
|
1593
|
+
const next = {
|
|
1594
|
+
column: this.sortDraft.column,
|
|
1595
|
+
functionName: this.sortDraft.functionName || undefined,
|
|
1596
|
+
direction: this.sortDraft.direction,
|
|
1597
|
+
};
|
|
1598
|
+
const items = [...this.config.generated.sorting];
|
|
1599
|
+
if (this.sortEditIndex === null) {
|
|
1600
|
+
items.push(next);
|
|
1601
|
+
}
|
|
1602
|
+
else {
|
|
1603
|
+
items[this.sortEditIndex] = next;
|
|
1604
|
+
}
|
|
1605
|
+
this.config.generated.sorting = this.deduplicateByKey(items, (item) => [item.column, item.functionName ?? EMPTY_VALUE, item.direction].join("|"));
|
|
1606
|
+
this.closeSortModal();
|
|
1607
|
+
this.afterBuilderMutation();
|
|
1608
|
+
}
|
|
1609
|
+
openFilterModal(index) {
|
|
1610
|
+
const current = typeof index === "number" ? this.config.generated.filters[index] : null;
|
|
1611
|
+
this.filterEditIndex = typeof index === "number" ? index : null;
|
|
1612
|
+
this.filterModalMode =
|
|
1613
|
+
current?.valueType === FILTER_MODE_DOMAIN ? FILTER_MODE_DOMAIN : "condition";
|
|
1614
|
+
this.filterModalStep = typeof index === "number" && current ? "configure" : "select";
|
|
1615
|
+
this.filterSearch = EMPTY_VALUE;
|
|
1616
|
+
this.filterDraft = {
|
|
1617
|
+
mode: this.filterModalMode,
|
|
1618
|
+
column: current?.column ?? EMPTY_VALUE,
|
|
1619
|
+
operator: current?.operator ?? DEFAULT_FILTER_OPERATOR,
|
|
1620
|
+
connector: current?.connector ?? DEFAULT_FILTER_CONNECTOR,
|
|
1621
|
+
optional: current?.optional ?? false,
|
|
1622
|
+
valueType: current?.valueType ?? DEFAULT_FILTER_VALUE_TYPE,
|
|
1623
|
+
value: current?.value ?? EMPTY_VALUE,
|
|
1624
|
+
valuesText: current?.values?.join(", ") ?? EMPTY_VALUE,
|
|
1625
|
+
betweenStart: current?.values?.[0] ?? EMPTY_VALUE,
|
|
1626
|
+
betweenEnd: current?.values?.[1] ?? EMPTY_VALUE,
|
|
1627
|
+
parameterName: current?.parameterName ?? EMPTY_VALUE,
|
|
1628
|
+
domainExpression: current?.domainExpression ?? EMPTY_VALUE,
|
|
1629
|
+
};
|
|
1630
|
+
this.syncSelectedFilterModeItems();
|
|
1631
|
+
this.filterModalVisible = true;
|
|
1632
|
+
}
|
|
1633
|
+
closeFilterModal() {
|
|
1634
|
+
this.filterModalVisible = false;
|
|
1635
|
+
this.filterEditIndex = null;
|
|
1636
|
+
this.filterModalStep = "select";
|
|
1637
|
+
this.filterModalMode = "condition";
|
|
1638
|
+
this.filterSearch = EMPTY_VALUE;
|
|
1639
|
+
this.filterDraft = {
|
|
1640
|
+
mode: "condition",
|
|
1641
|
+
column: EMPTY_VALUE,
|
|
1642
|
+
operator: DEFAULT_FILTER_OPERATOR,
|
|
1643
|
+
connector: DEFAULT_FILTER_CONNECTOR,
|
|
1644
|
+
optional: false,
|
|
1645
|
+
valueType: DEFAULT_FILTER_VALUE_TYPE,
|
|
1646
|
+
value: EMPTY_VALUE,
|
|
1647
|
+
valuesText: EMPTY_VALUE,
|
|
1648
|
+
betweenStart: EMPTY_VALUE,
|
|
1649
|
+
betweenEnd: EMPTY_VALUE,
|
|
1650
|
+
parameterName: EMPTY_VALUE,
|
|
1651
|
+
domainExpression: EMPTY_VALUE,
|
|
1652
|
+
};
|
|
1653
|
+
this.syncSelectedFilterModeItems();
|
|
1654
|
+
}
|
|
1655
|
+
selectFilterColumn(column) {
|
|
1656
|
+
this.filterDraft.column =
|
|
1657
|
+
this.filterDraft.column === column ? EMPTY_VALUE : column;
|
|
1658
|
+
this.resetFilterDraftValueState();
|
|
1659
|
+
}
|
|
1660
|
+
onFilterModalSelectedIdsChange(ids) {
|
|
1661
|
+
const nextSelectedId = ids.at(-1);
|
|
1662
|
+
const nextColumn = typeof nextSelectedId === "number"
|
|
1663
|
+
? this.resolveColumnPicklistColumn(nextSelectedId) ?? EMPTY_VALUE
|
|
1664
|
+
: EMPTY_VALUE;
|
|
1665
|
+
this.filterDraft.column = nextColumn;
|
|
1666
|
+
this.resetFilterDraftValueState();
|
|
1667
|
+
}
|
|
1668
|
+
resetFilterDraftValueState() {
|
|
1669
|
+
const firstOperator = this.filterOperatorOptions[0]?.value ?? DEFAULT_FILTER_OPERATOR;
|
|
1670
|
+
this.filterDraft.operator = firstOperator;
|
|
1671
|
+
this.filterDraft.value = EMPTY_VALUE;
|
|
1672
|
+
this.filterDraft.valuesText = EMPTY_VALUE;
|
|
1673
|
+
this.filterDraft.betweenStart = EMPTY_VALUE;
|
|
1674
|
+
this.filterDraft.betweenEnd = EMPTY_VALUE;
|
|
1675
|
+
this.filterDraft.parameterName = EMPTY_VALUE;
|
|
1676
|
+
}
|
|
1677
|
+
goToFilterModalStep(step) {
|
|
1678
|
+
if (step === "configure" && !this.filterModalCanProceed) {
|
|
1679
|
+
return;
|
|
1680
|
+
}
|
|
1681
|
+
if (step === "review" && !this.filterModalCanReview) {
|
|
1682
|
+
return;
|
|
1683
|
+
}
|
|
1684
|
+
this.filterModalStep = step;
|
|
1685
|
+
if (step === "select") {
|
|
1686
|
+
this.filterSearch = EMPTY_VALUE;
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
advanceFilterModalStep() {
|
|
1690
|
+
if (this.filterModalSelectionStepActive) {
|
|
1691
|
+
this.goToFilterModalStep("configure");
|
|
1692
|
+
return;
|
|
1693
|
+
}
|
|
1694
|
+
if (this.filterModalConfigurationStepActive) {
|
|
1695
|
+
this.goToFilterModalStep("review");
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
onFilterValueTypeChange() {
|
|
1699
|
+
this.filterDraft.value = EMPTY_VALUE;
|
|
1700
|
+
this.filterDraft.valuesText = EMPTY_VALUE;
|
|
1701
|
+
this.filterDraft.betweenStart = EMPTY_VALUE;
|
|
1702
|
+
this.filterDraft.betweenEnd = EMPTY_VALUE;
|
|
1703
|
+
this.filterDraft.parameterName = EMPTY_VALUE;
|
|
1704
|
+
}
|
|
1705
|
+
onFilterOperatorChange() {
|
|
1706
|
+
this.filterDraft.value = EMPTY_VALUE;
|
|
1707
|
+
this.filterDraft.valuesText = EMPTY_VALUE;
|
|
1708
|
+
this.filterDraft.betweenStart = EMPTY_VALUE;
|
|
1709
|
+
this.filterDraft.betweenEnd = EMPTY_VALUE;
|
|
1710
|
+
this.filterDraft.parameterName = EMPTY_VALUE;
|
|
1711
|
+
if (!this.filterNeedsValue) {
|
|
1712
|
+
this.filterDraft.valueType = DEFAULT_FILTER_VALUE_TYPE;
|
|
1713
|
+
}
|
|
1714
|
+
}
|
|
1715
|
+
onFilterModeChange(mode) {
|
|
1716
|
+
this.filterModalMode = mode;
|
|
1717
|
+
this.filterDraft.mode = mode;
|
|
1718
|
+
this.filterDraft.column = EMPTY_VALUE;
|
|
1719
|
+
this.filterDraft.operator = DEFAULT_FILTER_OPERATOR;
|
|
1720
|
+
this.filterDraft.valueType = DEFAULT_FILTER_VALUE_TYPE;
|
|
1721
|
+
this.filterDraft.value = EMPTY_VALUE;
|
|
1722
|
+
this.filterDraft.valuesText = EMPTY_VALUE;
|
|
1723
|
+
this.filterDraft.betweenStart = EMPTY_VALUE;
|
|
1724
|
+
this.filterDraft.betweenEnd = EMPTY_VALUE;
|
|
1725
|
+
this.filterDraft.parameterName = EMPTY_VALUE;
|
|
1726
|
+
this.filterDraft.domainExpression = EMPTY_VALUE;
|
|
1727
|
+
this.filterModalStep = "select";
|
|
1728
|
+
this.syncSelectedFilterModeItems();
|
|
1729
|
+
}
|
|
1730
|
+
onFilterModalTimelineStepSelect(event) {
|
|
1731
|
+
if (event.item.id === "review") {
|
|
1732
|
+
this.goToFilterModalStep("review");
|
|
1733
|
+
return;
|
|
1734
|
+
}
|
|
1735
|
+
this.goToFilterModalStep(event.item.id === "configure" ? "configure" : "select");
|
|
1736
|
+
}
|
|
1737
|
+
saveFilter() {
|
|
1738
|
+
const next = this.buildFilterFromDraft();
|
|
1739
|
+
if (!next) {
|
|
1740
|
+
return;
|
|
1741
|
+
}
|
|
1742
|
+
const items = [...this.config.generated.filters];
|
|
1743
|
+
if (this.filterEditIndex === null) {
|
|
1744
|
+
items.push(next);
|
|
1745
|
+
}
|
|
1746
|
+
else {
|
|
1747
|
+
items[this.filterEditIndex] = next;
|
|
1748
|
+
}
|
|
1749
|
+
this.config.generated.filters = items;
|
|
1750
|
+
this.closeFilterModal();
|
|
1751
|
+
this.afterBuilderMutation();
|
|
1752
|
+
}
|
|
1753
|
+
onSourceAliasChange(index, value) {
|
|
1754
|
+
const current = this.config.generated.sources[index];
|
|
1755
|
+
if (!current) {
|
|
1756
|
+
return;
|
|
1757
|
+
}
|
|
1758
|
+
const table = this.resolveTableOption(current.table);
|
|
1759
|
+
current.alias =
|
|
1760
|
+
value.trim() || (table ? this.buildAliasForTable(table) : current.alias);
|
|
1761
|
+
this.emitConfigChange();
|
|
1762
|
+
this.scheduleFlowArrowRefresh();
|
|
1763
|
+
}
|
|
1764
|
+
removeSource(index) {
|
|
1765
|
+
this.config.generated.sources.splice(index, 1);
|
|
1766
|
+
this.afterBuilderMutation();
|
|
1767
|
+
}
|
|
1768
|
+
removeJoin(index) {
|
|
1769
|
+
this.config.generated.joins.splice(index, 1);
|
|
1770
|
+
this.afterBuilderMutation();
|
|
1771
|
+
}
|
|
1772
|
+
removeGroupBy(index) {
|
|
1773
|
+
this.config.generated.groupBy.splice(index, 1);
|
|
1774
|
+
this.afterBuilderMutation();
|
|
1775
|
+
}
|
|
1776
|
+
removeField(index) {
|
|
1777
|
+
this.config.generated.fields.splice(index, 1);
|
|
1778
|
+
this.afterBuilderMutation();
|
|
1779
|
+
}
|
|
1780
|
+
removeSort(index) {
|
|
1781
|
+
this.config.generated.sorting.splice(index, 1);
|
|
1782
|
+
this.afterBuilderMutation();
|
|
1783
|
+
}
|
|
1784
|
+
removeFilter(index) {
|
|
1785
|
+
this.config.generated.filters.splice(index, 1);
|
|
1786
|
+
this.afterBuilderMutation();
|
|
1787
|
+
}
|
|
1788
|
+
clearSources() {
|
|
1789
|
+
this.config.generated.sources = [];
|
|
1790
|
+
this.afterBuilderMutation();
|
|
1791
|
+
}
|
|
1792
|
+
clearJoins() {
|
|
1793
|
+
this.config.generated.joins = [];
|
|
1794
|
+
this.afterBuilderMutation();
|
|
1795
|
+
}
|
|
1796
|
+
clearGroupBy() {
|
|
1797
|
+
this.config.generated.groupBy = [];
|
|
1798
|
+
this.afterBuilderMutation();
|
|
1799
|
+
}
|
|
1800
|
+
clearFields() {
|
|
1801
|
+
this.config.generated.fields = [];
|
|
1802
|
+
this.afterBuilderMutation();
|
|
1803
|
+
}
|
|
1804
|
+
clearSorting() {
|
|
1805
|
+
this.config.generated.sorting = [];
|
|
1806
|
+
this.afterBuilderMutation();
|
|
1807
|
+
}
|
|
1808
|
+
clearFilters() {
|
|
1809
|
+
this.config.generated.filters = [];
|
|
1810
|
+
this.afterBuilderMutation();
|
|
1811
|
+
}
|
|
1812
|
+
handleSave() {
|
|
1813
|
+
this.sanitizeBuilder();
|
|
1814
|
+
this.save.emit(createDynamicViewBuilderConfig(this.config));
|
|
1815
|
+
}
|
|
1816
|
+
afterBuilderMutation() {
|
|
1817
|
+
this.sanitizeBuilder();
|
|
1818
|
+
this.emitConfigChange();
|
|
1819
|
+
this.scheduleFlowArrowRefresh();
|
|
1820
|
+
}
|
|
1821
|
+
emitConfigChange() {
|
|
1822
|
+
this.configChange.emit(createDynamicViewBuilderConfig(this.config));
|
|
1823
|
+
}
|
|
1824
|
+
sanitizeBuilder() {
|
|
1825
|
+
const tablesById = new Map((this.config.availableData.tables ?? []).map((item) => [item.value, item]));
|
|
1826
|
+
const selectedSources = this.deduplicateByKey(this.config.generated.sources.filter((item) => tablesById.has(item.table)), (item) => item.table).map((item) => ({
|
|
1827
|
+
table: item.table,
|
|
1828
|
+
alias: item.alias?.trim() ||
|
|
1829
|
+
this.buildAliasForTable(tablesById.get(item.table)),
|
|
1830
|
+
schema: item.schema ?? tablesById.get(item.table)?.schema,
|
|
1831
|
+
label: item.label ??
|
|
1832
|
+
tablesById.get(item.table)?.displayName ??
|
|
1833
|
+
tablesById.get(item.table)?.text,
|
|
1834
|
+
}));
|
|
1835
|
+
this.config.generated.sources = selectedSources;
|
|
1836
|
+
const selectedTableIds = new Set(selectedSources.map((item) => item.table));
|
|
1837
|
+
const availableColumns = (this.config.availableData.columns ?? []).filter((item) => selectedTableIds.has(item.table));
|
|
1838
|
+
const availableColumnMap = new Map(availableColumns.map((item) => [item.value, item]));
|
|
1839
|
+
this.config.generated.groupBy = this.deduplicateByKey(this.config.generated.groupBy.filter((item) => {
|
|
1840
|
+
const column = availableColumnMap.get(item);
|
|
1841
|
+
return !!column && column.isAggregatable !== false;
|
|
1842
|
+
}), (item) => item);
|
|
1843
|
+
const groupBySet = new Set(this.config.generated.groupBy);
|
|
1844
|
+
const normalizedFields = this.mergeLegacyFunctionsIntoFields(this.normalizedFields, this.config.generated.functions);
|
|
1845
|
+
this.config.generated.fields = this.deduplicateByKey(normalizedFields.filter((item) => {
|
|
1846
|
+
const column = availableColumnMap.get(item.column);
|
|
1847
|
+
if (!column) {
|
|
1848
|
+
return false;
|
|
1849
|
+
}
|
|
1850
|
+
if (!this.config.generated.groupBy.length) {
|
|
1851
|
+
return true;
|
|
1852
|
+
}
|
|
1853
|
+
return groupBySet.has(item.column) || (!!item.function?.functionName && column.isAggregatable !== false);
|
|
1854
|
+
}), (item) => `${item.column}|${item.function?.functionName ?? EMPTY_VALUE}`);
|
|
1855
|
+
this.config.generated.functions = this.extractFunctionsFromFields(this.config.generated.fields.map((item) => this.normalizeGeneratedField(item)));
|
|
1856
|
+
const sortAllowed = new Set(this.sortSelectableItems.map((item) => item.id));
|
|
1857
|
+
this.config.generated.sorting = this.deduplicateByKey(this.config.generated.sorting.filter((item) => sortAllowed.has(this.buildSortSelectionId(item.column, item.functionName ?? EMPTY_VALUE))), (item) => `${item.column}|${item.functionName ?? EMPTY_VALUE}|${item.direction}`);
|
|
1858
|
+
if (selectedSources.length < 2) {
|
|
1859
|
+
this.config.generated.joins = [];
|
|
1860
|
+
}
|
|
1861
|
+
else {
|
|
1862
|
+
this.config.generated.joins = this.deduplicateByKey(this.config.generated.joins.filter((item) => {
|
|
1863
|
+
const source = availableColumnMap.get(item.sourceColumn);
|
|
1864
|
+
const target = availableColumnMap.get(item.targetColumn);
|
|
1865
|
+
return !!source && !!target && source.table !== target.table;
|
|
1866
|
+
}), (item) => `${item.sourceColumn}|${item.targetColumn}|${item.operator}`);
|
|
1867
|
+
}
|
|
1868
|
+
this.config.generated.filters = this.config.generated.filters.filter((item) => {
|
|
1869
|
+
if (item.valueType === FILTER_MODE_DOMAIN) {
|
|
1870
|
+
return !!item.domainExpression?.trim();
|
|
1871
|
+
}
|
|
1872
|
+
return availableColumnMap.has(item.column);
|
|
1873
|
+
});
|
|
1874
|
+
}
|
|
1875
|
+
resolvePreviewColumns() {
|
|
1876
|
+
const previewColumns = (this.config.preview?.columns ?? [])
|
|
1877
|
+
.filter((item) => !!item?.field)
|
|
1878
|
+
.map((item) => ({
|
|
1879
|
+
field: item.field,
|
|
1880
|
+
header: item.header ?? item.field,
|
|
1881
|
+
type: item.type,
|
|
1882
|
+
}));
|
|
1883
|
+
if (previewColumns.length) {
|
|
1884
|
+
return previewColumns;
|
|
1885
|
+
}
|
|
1886
|
+
const generatedColumns = [
|
|
1887
|
+
...this.normalizedFields.map((item) => ({
|
|
1888
|
+
field: item.function?.alias?.trim() || // NOSONAR
|
|
1889
|
+
item.alias?.trim() || // NOSONAR
|
|
1890
|
+
item.column,
|
|
1891
|
+
header: item.function?.alias?.trim() || // NOSONAR
|
|
1892
|
+
item.alias?.trim() || // NOSONAR
|
|
1893
|
+
(item.function
|
|
1894
|
+
? `${this.resolveFunctionLabel(item.function.functionName)} ${this.resolveColumnLabel(item.column)}`
|
|
1895
|
+
: this.resolveColumnLabel(item.column)),
|
|
1896
|
+
type: "text",
|
|
1897
|
+
})),
|
|
1898
|
+
];
|
|
1899
|
+
return this.deduplicateByKey(generatedColumns, (item) => item.field);
|
|
1900
|
+
}
|
|
1901
|
+
buildTableSelectionRows(selectedIds, search) {
|
|
1902
|
+
return (this.config.availableData.tables ?? [])
|
|
1903
|
+
.map((item) => {
|
|
1904
|
+
const parts = this.resolveTableDisplayParts(item.value);
|
|
1905
|
+
return {
|
|
1906
|
+
id: item.value,
|
|
1907
|
+
name: parts.tableLabel,
|
|
1908
|
+
dbLabel: parts.dbLabel,
|
|
1909
|
+
tableLabel: parts.tableLabel,
|
|
1910
|
+
pathType: "table",
|
|
1911
|
+
prefix: parts.dbLabel,
|
|
1912
|
+
meta: item.description || item.displayName || EMPTY_VALUE, // NOSONAR
|
|
1913
|
+
note: item.value,
|
|
1914
|
+
selected: selectedIds.includes(item.value),
|
|
1915
|
+
disabled: false,
|
|
1916
|
+
};
|
|
1917
|
+
})
|
|
1918
|
+
.filter((item) => this.matchesSearch([item.prefix ?? EMPTY_VALUE, item.name, item.meta, item.note ?? EMPTY_VALUE], search));
|
|
1919
|
+
}
|
|
1920
|
+
buildColumnSelectionRows(items, selectedIds, search, multiple = true) {
|
|
1921
|
+
return items
|
|
1922
|
+
.map((item) => {
|
|
1923
|
+
const parts = this.resolveColumnParts(item.value);
|
|
1924
|
+
return {
|
|
1925
|
+
id: item.value,
|
|
1926
|
+
name: parts.fieldLabel,
|
|
1927
|
+
dbLabel: parts.dbLabel,
|
|
1928
|
+
tableLabel: parts.tableLabel,
|
|
1929
|
+
pathType: "column",
|
|
1930
|
+
prefix: parts.tableLabel,
|
|
1931
|
+
meta: item.dataType,
|
|
1932
|
+
note: item.fullName,
|
|
1933
|
+
selected: multiple
|
|
1934
|
+
? selectedIds.includes(item.value)
|
|
1935
|
+
: selectedIds[0] === item.value,
|
|
1936
|
+
disabled: false,
|
|
1937
|
+
};
|
|
1938
|
+
})
|
|
1939
|
+
.filter((item) => this.matchesSearch([item.prefix ?? EMPTY_VALUE, item.name, item.meta, item.note ?? EMPTY_VALUE], search));
|
|
1940
|
+
}
|
|
1941
|
+
buildColumnPicklistItems(items) {
|
|
1942
|
+
return items.map((item) => {
|
|
1943
|
+
const picklistId = this.resolveColumnPicklistId(item.value);
|
|
1944
|
+
const parts = this.resolveColumnParts(item.value);
|
|
1945
|
+
return {
|
|
1946
|
+
id: picklistId ?? 0,
|
|
1947
|
+
title: `${parts.tableLabel}.${parts.fieldLabel}`,
|
|
1948
|
+
titlePrefix: parts.tableLabel,
|
|
1949
|
+
titleSuffix: parts.fieldLabel,
|
|
1950
|
+
titlePrefixColor: VISUAL_SQL_TABLE_COLOR,
|
|
1951
|
+
titleSuffixColor: VISUAL_SQL_FIELD_COLOR,
|
|
1952
|
+
badge: item.dataType ?? EMPTY_VALUE,
|
|
1953
|
+
badgeColor: PICKLIST_DATA_TYPE_BADGE_COLOR,
|
|
1954
|
+
column: item.value,
|
|
1955
|
+
};
|
|
1956
|
+
});
|
|
1957
|
+
}
|
|
1958
|
+
buildTablePicklistItems(items) {
|
|
1959
|
+
return items.map((item, index) => {
|
|
1960
|
+
const parts = this.resolveTableDisplayParts(item.value);
|
|
1961
|
+
return {
|
|
1962
|
+
id: index + 1,
|
|
1963
|
+
title: `${parts.dbLabel}.${parts.tableLabel}`,
|
|
1964
|
+
titlePrefix: parts.dbLabel,
|
|
1965
|
+
titleSuffix: parts.tableLabel,
|
|
1966
|
+
titlePrefixColor: VISUAL_SQL_TABLE_COLOR,
|
|
1967
|
+
titleSuffixColor: VISUAL_SQL_FIELD_COLOR,
|
|
1968
|
+
badge: item.displayName && item.displayName !== parts.tableLabel
|
|
1969
|
+
? item.displayName
|
|
1970
|
+
: EMPTY_VALUE,
|
|
1971
|
+
badgeColor: PICKLIST_DATA_TYPE_BADGE_COLOR,
|
|
1972
|
+
table: item.value,
|
|
1973
|
+
};
|
|
1974
|
+
});
|
|
1975
|
+
}
|
|
1976
|
+
resolveColumnsFromPicklistIds(ids) {
|
|
1977
|
+
return ids
|
|
1978
|
+
.map((id) => this.resolveColumnPicklistColumn(id))
|
|
1979
|
+
.filter((item) => !!item);
|
|
1980
|
+
}
|
|
1981
|
+
resolveLastColumnFromPicklistIds(ids) {
|
|
1982
|
+
const columns = this.resolveColumnsFromPicklistIds(ids);
|
|
1983
|
+
return columns.at(-1) ?? null;
|
|
1984
|
+
}
|
|
1985
|
+
resolveTablePicklistId(tableValue) {
|
|
1986
|
+
const itemIndex = (this.config.availableData.tables ?? []).findIndex((item) => item.value === tableValue);
|
|
1987
|
+
return itemIndex >= 0 ? itemIndex + 1 : null;
|
|
1988
|
+
}
|
|
1989
|
+
resolveTablePicklistTable(id) {
|
|
1990
|
+
const item = (this.config.availableData.tables ?? []).find((_entry, index) => index + 1 === id);
|
|
1991
|
+
return item?.value ?? null;
|
|
1992
|
+
}
|
|
1993
|
+
resolveTablesFromPicklistIds(ids) {
|
|
1994
|
+
return ids
|
|
1995
|
+
.map((id) => this.resolveTablePicklistTable(id))
|
|
1996
|
+
.filter((item) => !!item);
|
|
1997
|
+
}
|
|
1998
|
+
resolveColumnPicklistId(column) {
|
|
1999
|
+
const itemIndex = this.availableColumns.findIndex((item) => item.value === column);
|
|
2000
|
+
return itemIndex >= 0 ? itemIndex + 1 : null;
|
|
2001
|
+
}
|
|
2002
|
+
resolveColumnPicklistColumn(id) {
|
|
2003
|
+
const item = this.availableColumns[id - 1];
|
|
2004
|
+
return item?.value ?? null;
|
|
2005
|
+
}
|
|
2006
|
+
matchesSearch(values, search) {
|
|
2007
|
+
const normalizedSearch = this.normalize(search);
|
|
2008
|
+
if (!normalizedSearch) {
|
|
2009
|
+
return true;
|
|
2010
|
+
}
|
|
2011
|
+
return values.some((value) => this.normalize(value).includes(normalizedSearch));
|
|
2012
|
+
}
|
|
2013
|
+
normalize(value) {
|
|
2014
|
+
return (value ?? "")
|
|
2015
|
+
.normalize("NFD")
|
|
2016
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
2017
|
+
.toLowerCase()
|
|
2018
|
+
.trim();
|
|
2019
|
+
}
|
|
2020
|
+
toggleMultipleValue(values, value) {
|
|
2021
|
+
return values.includes(value)
|
|
2022
|
+
? values.filter((item) => item !== value)
|
|
2023
|
+
: [...values, value];
|
|
2024
|
+
}
|
|
2025
|
+
filterFunctionSelectableColumns(functionName) {
|
|
2026
|
+
const selectedGroupBy = new Set(this.config.generated.groupBy);
|
|
2027
|
+
const all = this.availableColumns.filter((item) => !selectedGroupBy.has(item.value));
|
|
2028
|
+
if (functionName === "count") {
|
|
2029
|
+
return all;
|
|
2030
|
+
}
|
|
2031
|
+
if (["sum", "avg", "min", "max"].includes(functionName.toLowerCase())) {
|
|
2032
|
+
return all.filter((item) => this.isNumericType(item.dataType));
|
|
2033
|
+
}
|
|
2034
|
+
return all;
|
|
2035
|
+
}
|
|
2036
|
+
filterOperatorsForColumn(column) {
|
|
2037
|
+
const normalizedDataType = (column.dataType ?? EMPTY_VALUE).toLowerCase();
|
|
2038
|
+
if (normalizedDataType === "boolean") {
|
|
2039
|
+
return ["EQUAL", "NOT_EQUAL", "EMPTY", "NOT_EMPTY"];
|
|
2040
|
+
}
|
|
2041
|
+
if (normalizedDataType === "datetime" || normalizedDataType === "time" || normalizedDataType === "timestamp") {
|
|
2042
|
+
return [
|
|
2043
|
+
"EQUAL",
|
|
2044
|
+
"NOT_EQUAL",
|
|
2045
|
+
"GREATER_THAN",
|
|
2046
|
+
"GREATER_THAN_OR_EQUAL",
|
|
2047
|
+
"LESS_THAN",
|
|
2048
|
+
"LESS_THAN_OR_EQUAL",
|
|
2049
|
+
"BETWEEN",
|
|
2050
|
+
"EMPTY",
|
|
2051
|
+
"NOT_EMPTY",
|
|
2052
|
+
];
|
|
2053
|
+
}
|
|
2054
|
+
if (this.isNumericType(column.dataType) ||
|
|
2055
|
+
normalizedDataType === "date") {
|
|
2056
|
+
return [
|
|
2057
|
+
"EQUAL",
|
|
2058
|
+
"NOT_EQUAL",
|
|
2059
|
+
"GREATER_THAN",
|
|
2060
|
+
"GREATER_THAN_OR_EQUAL",
|
|
2061
|
+
"LESS_THAN",
|
|
2062
|
+
"LESS_THAN_OR_EQUAL",
|
|
2063
|
+
"BETWEEN",
|
|
2064
|
+
"IN",
|
|
2065
|
+
"EMPTY",
|
|
2066
|
+
"NOT_EMPTY",
|
|
2067
|
+
];
|
|
2068
|
+
}
|
|
2069
|
+
return [
|
|
2070
|
+
"EQUAL",
|
|
2071
|
+
"NOT_EQUAL",
|
|
2072
|
+
"CONTAINS",
|
|
2073
|
+
"DOES_NOT_CONTAIN",
|
|
2074
|
+
"STARTS_WITH",
|
|
2075
|
+
"ENDS_WITH",
|
|
2076
|
+
"IN",
|
|
2077
|
+
"EMPTY",
|
|
2078
|
+
"NOT_EMPTY",
|
|
2079
|
+
];
|
|
2080
|
+
}
|
|
2081
|
+
isNumericType(value) {
|
|
2082
|
+
return [
|
|
2083
|
+
"number",
|
|
2084
|
+
"integer",
|
|
2085
|
+
"decimal",
|
|
2086
|
+
"float",
|
|
2087
|
+
"double",
|
|
2088
|
+
"long",
|
|
2089
|
+
"short",
|
|
2090
|
+
].includes((value ?? "").toLowerCase());
|
|
2091
|
+
}
|
|
2092
|
+
isDateType(value) {
|
|
2093
|
+
return ["date", "datetime", "timestamp", "time"].includes((value ?? "").toLowerCase());
|
|
2094
|
+
}
|
|
2095
|
+
resolveTableOption(value) {
|
|
2096
|
+
return (this.config.availableData.tables ?? []).find((item) => item.value === value);
|
|
2097
|
+
}
|
|
2098
|
+
resolveColumnOption(value) {
|
|
2099
|
+
return (this.config.availableData.columns ?? []).find((item) => item.value === value);
|
|
2100
|
+
}
|
|
2101
|
+
resolveTableLabel(value) {
|
|
2102
|
+
return this.resolveTableOption(value)?.text ?? value;
|
|
2103
|
+
}
|
|
2104
|
+
resolveTableDisplayParts(value) {
|
|
2105
|
+
const table = this.resolveTableOption(value);
|
|
2106
|
+
if (!table) {
|
|
2107
|
+
const rawParts = value.split(".").filter(Boolean);
|
|
2108
|
+
return {
|
|
2109
|
+
dbLabel: rawParts.length > 1 ? rawParts.slice(0, -1).join(".") : "db",
|
|
2110
|
+
tableLabel: rawParts.at(-1) ?? value,
|
|
2111
|
+
};
|
|
2112
|
+
}
|
|
2113
|
+
return {
|
|
2114
|
+
dbLabel: table.schema || "db", // NOSONAR
|
|
2115
|
+
tableLabel: table.value,
|
|
2116
|
+
};
|
|
2117
|
+
}
|
|
2118
|
+
resolveTablePath(value) {
|
|
2119
|
+
const parts = this.resolveTableDisplayParts(value);
|
|
2120
|
+
return parts.dbLabel ? `${parts.dbLabel}.${parts.tableLabel}` : parts.tableLabel;
|
|
2121
|
+
}
|
|
2122
|
+
resolveColumnParts(// NOSONAR - complexity: extraction would risk behavior change
|
|
2123
|
+
value) {
|
|
2124
|
+
const columnValue = typeof value === "string" ? value : value.column ?? EMPTY_VALUE;
|
|
2125
|
+
const column = this.resolveColumnOption(columnValue);
|
|
2126
|
+
if (!column) {
|
|
2127
|
+
const fallback = `${columnValue}`.split(".").filter(Boolean);
|
|
2128
|
+
return {
|
|
2129
|
+
dbLabel: fallback.length >= MIN_PARTS_FOR_DB ? fallback.slice(0, DB_PARTS_OFFSET).join(".") : EMPTY_VALUE,
|
|
2130
|
+
tableLabel: fallback.length >= MIN_PARTS_FOR_TABLE ? fallback[fallback.length - MIN_PARTS_FOR_TABLE] : columnValue,
|
|
2131
|
+
fieldLabel: fallback.at(-1) ?? columnValue,
|
|
2132
|
+
};
|
|
2133
|
+
}
|
|
2134
|
+
const parts = (column.fullName ?? columnValue).split(".").filter(Boolean);
|
|
2135
|
+
return {
|
|
2136
|
+
dbLabel: parts.length >= MIN_PARTS_FOR_DB ? parts.slice(0, DB_PARTS_OFFSET).join(".") : EMPTY_VALUE,
|
|
2137
|
+
tableLabel: parts.length >= MIN_PARTS_FOR_TABLE ? parts[parts.length - MIN_PARTS_FOR_TABLE] : this.resolveTablePath(column.table),
|
|
2138
|
+
fieldLabel: parts.at(-1) ?? column.value,
|
|
2139
|
+
};
|
|
2140
|
+
}
|
|
2141
|
+
resolveColumnLabel(value) {
|
|
2142
|
+
return this.resolveColumnPath(value);
|
|
2143
|
+
}
|
|
2144
|
+
resolveSortDraftLabel() {
|
|
2145
|
+
const base = this.resolveColumnPath(this.sortDraft.column);
|
|
2146
|
+
if (!this.sortDraft.functionName) {
|
|
2147
|
+
return base;
|
|
2148
|
+
}
|
|
2149
|
+
return `${this.resolveFunctionLabel(this.sortDraft.functionName)}(${base})`;
|
|
2150
|
+
}
|
|
2151
|
+
buildSortSelectionId(column, functionName = EMPTY_VALUE) {
|
|
2152
|
+
return `${column}::${functionName || EMPTY_SORT_FUNCTION}`;
|
|
2153
|
+
}
|
|
2154
|
+
parseSortSelectionId(selectionId) {
|
|
2155
|
+
const [column, functionName = EMPTY_SORT_FUNCTION] = selectionId.split("::");
|
|
2156
|
+
return {
|
|
2157
|
+
column,
|
|
2158
|
+
functionName: functionName === EMPTY_SORT_FUNCTION ? EMPTY_VALUE : functionName,
|
|
2159
|
+
};
|
|
2160
|
+
}
|
|
2161
|
+
resolveColumnPath(value) {
|
|
2162
|
+
const columnValue = typeof value === "string" ? value : value.column ?? EMPTY_VALUE;
|
|
2163
|
+
const column = this.resolveColumnOption(columnValue);
|
|
2164
|
+
if (!column) {
|
|
2165
|
+
return columnValue;
|
|
2166
|
+
}
|
|
2167
|
+
const parts = (column.fullName ?? columnValue).split(".").filter(Boolean);
|
|
2168
|
+
return parts.length >= MIN_PARTS_FOR_TABLE ? parts.slice(DB_PARTS_OFFSET).join(".") : column.fullName;
|
|
2169
|
+
}
|
|
2170
|
+
normalizeGeneratedField(value) {
|
|
2171
|
+
if (typeof value === "string") {
|
|
2172
|
+
return { column: value };
|
|
2173
|
+
}
|
|
2174
|
+
return {
|
|
2175
|
+
column: value.column,
|
|
2176
|
+
alias: value.alias?.trim() ?? EMPTY_VALUE,
|
|
2177
|
+
width: value.width?.trim() ?? EMPTY_VALUE,
|
|
2178
|
+
function: value.function
|
|
2179
|
+
? {
|
|
2180
|
+
functionName: value.function.functionName?.trim() ?? EMPTY_VALUE,
|
|
2181
|
+
alias: value.function.alias?.trim() ?? EMPTY_VALUE,
|
|
2182
|
+
}
|
|
2183
|
+
: null,
|
|
2184
|
+
};
|
|
2185
|
+
}
|
|
2186
|
+
getOrderedFieldEntries() {
|
|
2187
|
+
const entries = this.normalizedFields.map((item, sourceIndex) => ({
|
|
2188
|
+
...item,
|
|
2189
|
+
sourceIndex,
|
|
2190
|
+
}));
|
|
2191
|
+
const previewIndexes = this.getFieldPreviewSourceIndexes();
|
|
2192
|
+
return previewIndexes.map((index) => entries[index]).filter(Boolean);
|
|
2193
|
+
}
|
|
2194
|
+
getFieldPreviewSourceIndexes() {
|
|
2195
|
+
const baseIndexes = this.normalizedFields.map((_, index) => index);
|
|
2196
|
+
if (this.draggingFieldIndex === null) {
|
|
2197
|
+
return baseIndexes;
|
|
2198
|
+
}
|
|
2199
|
+
const remainingIndexes = baseIndexes.filter((index) => index !== this.draggingFieldIndex);
|
|
2200
|
+
const insertionIndex = this.dragPreviewIndex === null
|
|
2201
|
+
? baseIndexes.indexOf(this.draggingFieldIndex)
|
|
2202
|
+
: Math.min(this.dragPreviewIndex, remainingIndexes.length);
|
|
2203
|
+
remainingIndexes.splice(insertionIndex, 0, this.draggingFieldIndex);
|
|
2204
|
+
return remainingIndexes;
|
|
2205
|
+
}
|
|
2206
|
+
resolveFunctionLabel(value) {
|
|
2207
|
+
return this.resolveOptionLabel(value, this.functionOptions);
|
|
2208
|
+
}
|
|
2209
|
+
resolveJoinOperatorLabel(value) {
|
|
2210
|
+
return this.resolveOptionLabel(value, this.joinOperatorOptions);
|
|
2211
|
+
}
|
|
2212
|
+
resolveJoinOperatorOptionText(option) {
|
|
2213
|
+
const fallback = JOIN_OPERATOR_LABELS[option.value];
|
|
2214
|
+
const hasReadableText = /[A-Za-zÀ-ÿ]/.test(option.text);
|
|
2215
|
+
if (!fallback || hasReadableText) {
|
|
2216
|
+
return option.text;
|
|
2217
|
+
}
|
|
2218
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.${fallback.key}`, fallback.fallback);
|
|
2219
|
+
}
|
|
2220
|
+
resolveFilterOperatorLabel(value) {
|
|
2221
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.filters.operators.${value.toLowerCase()}`, this.humanizeKey(value));
|
|
2222
|
+
}
|
|
2223
|
+
resolveOptionLabel(value, options) {
|
|
2224
|
+
return options.find((item) => item.value === value)?.text ?? value;
|
|
2225
|
+
}
|
|
2226
|
+
resolveFilterDisplayValue(filter) {
|
|
2227
|
+
if (filter.valueType === FILTER_MODE_DOMAIN) {
|
|
2228
|
+
return filter.domainExpression ?? EMPTY_VALUE;
|
|
2229
|
+
}
|
|
2230
|
+
if (filter.valueType === "parameter") {
|
|
2231
|
+
return `:${filter.parameterName ?? EMPTY_VALUE}`;
|
|
2232
|
+
}
|
|
2233
|
+
if (filter.operator === "IN") {
|
|
2234
|
+
return (filter.values ?? []).join(", ");
|
|
2235
|
+
}
|
|
2236
|
+
if (filter.operator === "BETWEEN") {
|
|
2237
|
+
return `${filter.values?.[0] ?? EMPTY_VALUE} - ${filter.values?.[1] ?? EMPTY_VALUE}`;
|
|
2238
|
+
}
|
|
2239
|
+
if (["EMPTY", "NOT_EMPTY"].includes(filter.operator)) {
|
|
2240
|
+
return "-";
|
|
2241
|
+
}
|
|
2242
|
+
return filter.value ?? EMPTY_VALUE;
|
|
2243
|
+
}
|
|
2244
|
+
buildGeneratedSql() {
|
|
2245
|
+
const sources = this.config.generated.sources;
|
|
2246
|
+
if (!sources.length) {
|
|
2247
|
+
return EMPTY_VALUE;
|
|
2248
|
+
}
|
|
2249
|
+
const selectParts = this.normalizedFields
|
|
2250
|
+
.map((field) => this.resolveFieldSql(field))
|
|
2251
|
+
.filter(Boolean);
|
|
2252
|
+
const sql = [
|
|
2253
|
+
"SELECT",
|
|
2254
|
+
` ${(selectParts.length ? selectParts : ["*"]).join(",\n ")}`,
|
|
2255
|
+
`FROM ${this.resolveSourceSql(sources[0])}`,
|
|
2256
|
+
...this.config.generated.joins.map((item) => this.resolveJoinSql(item)),
|
|
2257
|
+
...this.buildWhereSql(),
|
|
2258
|
+
...this.buildGroupBySql(),
|
|
2259
|
+
...this.buildOrderBySql(),
|
|
2260
|
+
];
|
|
2261
|
+
return sql.join("\n");
|
|
2262
|
+
}
|
|
2263
|
+
buildWhereSql() {
|
|
2264
|
+
const expressions = this.config.generated.filters
|
|
2265
|
+
.map((filter, index) => {
|
|
2266
|
+
const connector = index === 0 ? "WHERE" : filter.connector;
|
|
2267
|
+
return ` ${connector} ${this.resolveFilterSql(filter)}`;
|
|
2268
|
+
})
|
|
2269
|
+
.filter((item) => !item.endsWith(EMPTY_VALUE));
|
|
2270
|
+
return expressions.length ? expressions : [];
|
|
2271
|
+
}
|
|
2272
|
+
buildGroupBySql() {
|
|
2273
|
+
if (!this.config.generated.groupBy.length) {
|
|
2274
|
+
return [];
|
|
2275
|
+
}
|
|
2276
|
+
return [
|
|
2277
|
+
"GROUP BY",
|
|
2278
|
+
` ${this.config.generated.groupBy
|
|
2279
|
+
.map((item) => this.resolveColumnSql(item))
|
|
2280
|
+
.join(",\n ")}`,
|
|
2281
|
+
];
|
|
2282
|
+
}
|
|
2283
|
+
buildOrderBySql() {
|
|
2284
|
+
if (!this.config.generated.sorting.length) {
|
|
2285
|
+
return [];
|
|
2286
|
+
}
|
|
2287
|
+
return [
|
|
2288
|
+
"ORDER BY",
|
|
2289
|
+
` ${this.config.generated.sorting
|
|
2290
|
+
.map((item) => `${this.resolveSortSql(item)} ${item.direction}`)
|
|
2291
|
+
.join(",\n ")}`,
|
|
2292
|
+
];
|
|
2293
|
+
}
|
|
2294
|
+
resolveSourceSql(source) {
|
|
2295
|
+
const table = "table" in source ? this.resolveTableOption(source.table) : source;
|
|
2296
|
+
if (!table) {
|
|
2297
|
+
return EMPTY_VALUE;
|
|
2298
|
+
}
|
|
2299
|
+
const sourceAlias = "table" in source ? source.alias : EMPTY_VALUE;
|
|
2300
|
+
const fullName = table.schema ? `${table.schema}.${table.value}` : table.value;
|
|
2301
|
+
return sourceAlias ? `${fullName} ${sourceAlias}` : fullName;
|
|
2302
|
+
}
|
|
2303
|
+
resolveJoinSql(item) {
|
|
2304
|
+
return `JOIN ${this.resolveJoinedTableSql(item)} ON ${this.resolveColumnSql(item.sourceColumn)} ${this.resolveJoinOperatorSql(item.operator)} ${this.resolveColumnSql(item.targetColumn)}`;
|
|
2305
|
+
}
|
|
2306
|
+
resolveJoinedTableSql(item) {
|
|
2307
|
+
const targetColumn = this.resolveColumnOption(item.targetColumn);
|
|
2308
|
+
if (!targetColumn) {
|
|
2309
|
+
return EMPTY_VALUE;
|
|
2310
|
+
}
|
|
2311
|
+
const source = this.config.generated.sources.find((entry) => entry.table === targetColumn.table);
|
|
2312
|
+
if (!source) {
|
|
2313
|
+
return EMPTY_VALUE;
|
|
2314
|
+
}
|
|
2315
|
+
return this.resolveSourceSql(source);
|
|
2316
|
+
}
|
|
2317
|
+
resolveColumnSql(value) {
|
|
2318
|
+
const column = this.resolveColumnOption(value);
|
|
2319
|
+
if (!column) {
|
|
2320
|
+
return value;
|
|
2321
|
+
}
|
|
2322
|
+
const alias = this.config.generated.sources.find((item) => item.table === column.table)?.alias;
|
|
2323
|
+
const fieldName = column.fullName.split(".").pop() ?? column.value;
|
|
2324
|
+
return alias ? `${alias}.${fieldName}` : column.fullName;
|
|
2325
|
+
}
|
|
2326
|
+
resolveFieldSql(field) {
|
|
2327
|
+
const normalizedField = this.normalizeGeneratedField(field);
|
|
2328
|
+
const fieldSql = this.resolveColumnSql(normalizedField.column);
|
|
2329
|
+
if (normalizedField.function?.functionName) {
|
|
2330
|
+
return this.resolveFunctionSql({
|
|
2331
|
+
functionName: normalizedField.function.functionName,
|
|
2332
|
+
column: normalizedField.column,
|
|
2333
|
+
alias: normalizedField.function.alias?.trim() || // NOSONAR
|
|
2334
|
+
normalizedField.alias?.trim() || // NOSONAR
|
|
2335
|
+
EMPTY_VALUE,
|
|
2336
|
+
});
|
|
2337
|
+
}
|
|
2338
|
+
const alias = normalizedField.alias?.trim();
|
|
2339
|
+
return alias ? `${fieldSql} AS ${alias}` : fieldSql;
|
|
2340
|
+
}
|
|
2341
|
+
resolveFunctionSql(item) {
|
|
2342
|
+
const normalizedFunction = item.functionName.toUpperCase();
|
|
2343
|
+
const argument = this.resolveColumnSql(item.column);
|
|
2344
|
+
const alias = item.alias?.trim();
|
|
2345
|
+
return alias
|
|
2346
|
+
? `${normalizedFunction}(${argument}) AS ${alias}`
|
|
2347
|
+
: `${normalizedFunction}(${argument})`;
|
|
2348
|
+
}
|
|
2349
|
+
resolveSortSql(item) {
|
|
2350
|
+
if (!item.functionName?.trim()) {
|
|
2351
|
+
return this.resolveColumnSql(item.column);
|
|
2352
|
+
}
|
|
2353
|
+
return `${item.functionName.trim().toUpperCase()}(${this.resolveColumnSql(item.column)})`;
|
|
2354
|
+
}
|
|
2355
|
+
resolveJoinOperatorSql(value) {
|
|
2356
|
+
return ({
|
|
2357
|
+
EQUALS: "=",
|
|
2358
|
+
NOT_EQUALS: "<>",
|
|
2359
|
+
}[value] ?? value);
|
|
2360
|
+
}
|
|
2361
|
+
resolveFilterSql(filter) {
|
|
2362
|
+
if (filter.valueType === FILTER_MODE_DOMAIN) {
|
|
2363
|
+
return `(${filter.domainExpression ?? EMPTY_VALUE})`;
|
|
2364
|
+
}
|
|
2365
|
+
const field = this.resolveColumnSql(filter.column);
|
|
2366
|
+
if (!field) {
|
|
2367
|
+
return EMPTY_VALUE;
|
|
2368
|
+
}
|
|
2369
|
+
if (filter.operator === "EMPTY") {
|
|
2370
|
+
return `${field} IS NULL`;
|
|
2371
|
+
}
|
|
2372
|
+
if (filter.operator === "NOT_EMPTY") {
|
|
2373
|
+
return `${field} IS NOT NULL`;
|
|
2374
|
+
}
|
|
2375
|
+
if (filter.operator === "IN") {
|
|
2376
|
+
const values = (filter.values ?? []).map((item) => this.resolveFilterValueSql(filter.column, filter.operator, item));
|
|
2377
|
+
return `${field} IN (${values.join(", ")})`;
|
|
2378
|
+
}
|
|
2379
|
+
if (filter.operator === "BETWEEN") {
|
|
2380
|
+
return `${field} BETWEEN ${this.resolveFilterValueSql(filter.column, filter.operator, filter.values?.[0])} AND ${this.resolveFilterValueSql(filter.column, filter.operator, filter.values?.[1])}`;
|
|
2381
|
+
}
|
|
2382
|
+
if (filter.valueType === "parameter") {
|
|
2383
|
+
return `${field} ${this.resolveFilterOperatorSql(filter.operator)} :${filter.parameterName ?? EMPTY_VALUE}`;
|
|
2384
|
+
}
|
|
2385
|
+
return `${field} ${this.resolveFilterOperatorSql(filter.operator)} ${this.resolveFilterValueSql(filter.column, filter.operator, filter.value)}`;
|
|
2386
|
+
}
|
|
2387
|
+
resolveFilterOperatorSql(value) {
|
|
2388
|
+
return ({
|
|
2389
|
+
EQUAL: "=",
|
|
2390
|
+
NOT_EQUAL: "<>",
|
|
2391
|
+
GREATER: ">",
|
|
2392
|
+
GREATER_THAN: ">",
|
|
2393
|
+
GREATER_OR_EQUAL: ">=",
|
|
2394
|
+
GREATER_THAN_OR_EQUAL: ">=",
|
|
2395
|
+
LESS: "<",
|
|
2396
|
+
LESS_THAN: "<",
|
|
2397
|
+
LESS_OR_EQUAL: "<=",
|
|
2398
|
+
LESS_THAN_OR_EQUAL: "<=",
|
|
2399
|
+
CONTAINS: "LIKE",
|
|
2400
|
+
DOES_NOT_CONTAIN: "NOT LIKE",
|
|
2401
|
+
STARTS_WITH: "LIKE",
|
|
2402
|
+
ENDS_WITH: "LIKE",
|
|
2403
|
+
}[value] ?? value);
|
|
2404
|
+
}
|
|
2405
|
+
resolveFilterValueSql(columnValue, operator, value) {
|
|
2406
|
+
const stringValue = String(value ?? EMPTY_VALUE);
|
|
2407
|
+
const column = this.resolveColumnOption(columnValue);
|
|
2408
|
+
if (column?.dataType === "boolean") {
|
|
2409
|
+
return stringValue.toLowerCase() === "true" ? "TRUE" : "FALSE";
|
|
2410
|
+
}
|
|
2411
|
+
if (this.isNumericType(column?.dataType) && stringValue) {
|
|
2412
|
+
return stringValue;
|
|
2413
|
+
}
|
|
2414
|
+
if (["CONTAINS", "DOES_NOT_CONTAIN", "STARTS_WITH", "ENDS_WITH"].includes(operator)) {
|
|
2415
|
+
return this.quoteSqlValue(this.decorateLikeValue(operator, stringValue));
|
|
2416
|
+
}
|
|
2417
|
+
return this.quoteSqlValue(stringValue);
|
|
2418
|
+
}
|
|
2419
|
+
decorateLikeValue(operator, value) {
|
|
2420
|
+
if (operator === "STARTS_WITH") {
|
|
2421
|
+
return `${value}%`;
|
|
2422
|
+
}
|
|
2423
|
+
if (operator === "ENDS_WITH") {
|
|
2424
|
+
return `%${value}`;
|
|
2425
|
+
}
|
|
2426
|
+
if (operator === "CONTAINS" || operator === "DOES_NOT_CONTAIN") {
|
|
2427
|
+
return `%${value}%`;
|
|
2428
|
+
}
|
|
2429
|
+
return value;
|
|
2430
|
+
}
|
|
2431
|
+
quoteSqlValue(value) {
|
|
2432
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
2433
|
+
}
|
|
2434
|
+
syncLayoutModeItems() {
|
|
2435
|
+
this.layoutModeItems[0].label = this.instantWithFallback(`${this.config.translationPrefix}.layoutModes.stacked`, "Blocos");
|
|
2436
|
+
this.layoutModeItems[1].label = this.instantWithFallback(`${this.config.translationPrefix}.layoutModes.split`, "Lista");
|
|
2437
|
+
this.syncSelectedLayoutModeItems();
|
|
2438
|
+
}
|
|
2439
|
+
syncFilterModeItems() {
|
|
2440
|
+
this.filterModeItems[0].label = this.instantWithFallback(`${this.config.translationPrefix}.filters.modes.condition`, "Filtro");
|
|
2441
|
+
this.filterModeItems[1].label = this.instantWithFallback(`${this.config.translationPrefix}.filters.domainLabel`, "Expressao de dominio");
|
|
2442
|
+
this.syncSelectedFilterModeItems();
|
|
2443
|
+
}
|
|
2444
|
+
syncSortDirectionItems() {
|
|
2445
|
+
this.sortDirectionItems.splice(0, this.sortDirectionItems.length, ...this.sortDirectionOptions.map((item) => ({
|
|
2446
|
+
label: item.text,
|
|
2447
|
+
value: item.value,
|
|
2448
|
+
})));
|
|
2449
|
+
this.syncSelectedSortDirectionItems();
|
|
2450
|
+
}
|
|
2451
|
+
syncSelectedLayoutModeItems() {
|
|
2452
|
+
const selected = this.layoutModeItems.find((item) => item.value === this.layoutMode);
|
|
2453
|
+
this.selectedLayoutModeItems.splice(0, this.selectedLayoutModeItems.length, ...(selected ? [selected] : []));
|
|
2454
|
+
}
|
|
2455
|
+
syncSelectedFilterModeItems() {
|
|
2456
|
+
const selected = this.filterModeItems.find((item) => item.value === this.filterModalMode);
|
|
2457
|
+
this.selectedFilterModeItems.splice(0, this.selectedFilterModeItems.length, ...(selected ? [selected] : []));
|
|
2458
|
+
}
|
|
2459
|
+
syncSelectedSortDirectionItems() {
|
|
2460
|
+
const selected = this.sortDirectionItems.find((item) => item.value === this.sortDraft.direction);
|
|
2461
|
+
this.selectedSortDirectionItems.splice(0, this.selectedSortDirectionItems.length, ...(selected ? [selected] : []));
|
|
2462
|
+
}
|
|
2463
|
+
get filterSequenceIndex() {
|
|
2464
|
+
return this.filterEditIndex ?? this.config.generated.filters.length;
|
|
2465
|
+
}
|
|
2466
|
+
parseMultiValueText(value) {
|
|
2467
|
+
return value
|
|
2468
|
+
.split(",")
|
|
2469
|
+
.map((item) => item.trim())
|
|
2470
|
+
.filter(Boolean);
|
|
2471
|
+
}
|
|
2472
|
+
buildAliasForTable(table) {
|
|
2473
|
+
const words = table.text
|
|
2474
|
+
.split(/[\s_.-]+/)
|
|
2475
|
+
.map((item) => item.trim())
|
|
2476
|
+
.filter(Boolean);
|
|
2477
|
+
if (words.length > 1) {
|
|
2478
|
+
return words
|
|
2479
|
+
.map((item) => item[0]?.toLowerCase() ?? EMPTY_VALUE)
|
|
2480
|
+
.join("");
|
|
2481
|
+
}
|
|
2482
|
+
return (table.value.split(".").pop() ?? table.value)
|
|
2483
|
+
.slice(0, ALIAS_MAX_LENGTH)
|
|
2484
|
+
.toLowerCase();
|
|
2485
|
+
}
|
|
2486
|
+
resolveDefaultSourceAlias(tableValue) {
|
|
2487
|
+
const table = this.resolveTableOption(tableValue);
|
|
2488
|
+
return table ? this.buildAliasForTable(table) : EMPTY_VALUE;
|
|
2489
|
+
}
|
|
2490
|
+
hasCustomAlias(tableValue, alias) {
|
|
2491
|
+
const table = this.resolveTableOption(tableValue);
|
|
2492
|
+
if (!table) {
|
|
2493
|
+
return false;
|
|
2494
|
+
}
|
|
2495
|
+
return !!alias.trim() && alias.trim() !== this.buildAliasForTable(table);
|
|
2496
|
+
}
|
|
2497
|
+
onFieldFunctionNameChange() {
|
|
2498
|
+
if (!this.fieldFunctionDraft.functionName) {
|
|
2499
|
+
this.fieldFunctionDraft.functionAlias = EMPTY_VALUE;
|
|
2500
|
+
return;
|
|
2501
|
+
}
|
|
2502
|
+
const selectedColumn = this.resolveColumnOption(this.fieldFunctionDraft.column);
|
|
2503
|
+
if (selectedColumn &&
|
|
2504
|
+
!this.filterFunctionSelectableColumns(this.fieldFunctionDraft.functionName)
|
|
2505
|
+
.map((item) => item.value)
|
|
2506
|
+
.includes(selectedColumn.value)) {
|
|
2507
|
+
this.fieldFunctionDraft.functionName = EMPTY_VALUE;
|
|
2508
|
+
this.fieldFunctionDraft.functionAlias = EMPTY_VALUE;
|
|
2509
|
+
return;
|
|
2510
|
+
}
|
|
2511
|
+
if (!this.fieldFunctionDraft.functionAlias.trim()) {
|
|
2512
|
+
this.fieldFunctionDraft.functionAlias = this.buildFieldFunctionAlias();
|
|
2513
|
+
}
|
|
2514
|
+
}
|
|
2515
|
+
buildFunctionAlias() {
|
|
2516
|
+
const column = this.resolveColumnOption(this.fieldFunctionDraft.column);
|
|
2517
|
+
const base = column?.text ?? this.fieldFunctionDraft.column ?? EMPTY_VALUE;
|
|
2518
|
+
const suffix = this.slugify(base);
|
|
2519
|
+
return suffix
|
|
2520
|
+
? `${this.fieldFunctionDraft.functionName}_${suffix}`
|
|
2521
|
+
: this.fieldFunctionDraft.functionName;
|
|
2522
|
+
}
|
|
2523
|
+
buildFieldFunctionAlias() {
|
|
2524
|
+
return this.buildFunctionAlias();
|
|
2525
|
+
}
|
|
2526
|
+
buildFieldFunctionDraft() {
|
|
2527
|
+
const functionName = this.fieldFunctionDraft.functionName.trim();
|
|
2528
|
+
if (!functionName) {
|
|
2529
|
+
return null;
|
|
2530
|
+
}
|
|
2531
|
+
return {
|
|
2532
|
+
functionName,
|
|
2533
|
+
alias: (this.fieldFunctionDraft.functionAlias || this.buildFieldFunctionAlias()).trim(),
|
|
2534
|
+
};
|
|
2535
|
+
}
|
|
2536
|
+
patchFieldModalDraft(column, patch) {
|
|
2537
|
+
this.fieldModalDrafts = this.fieldModalDrafts.map((item) => item.column === column
|
|
2538
|
+
? {
|
|
2539
|
+
...item,
|
|
2540
|
+
...patch,
|
|
2541
|
+
}
|
|
2542
|
+
: item);
|
|
2543
|
+
}
|
|
2544
|
+
mergeLegacyFunctionsIntoFields(fields, functions) {
|
|
2545
|
+
const fieldByColumn = new Map(fields.map((item) => [item.column, { ...item }]));
|
|
2546
|
+
functions.forEach((item) => {
|
|
2547
|
+
const current = fieldByColumn.get(item.column) ?? { column: item.column };
|
|
2548
|
+
if (!current.function) {
|
|
2549
|
+
current.function = {
|
|
2550
|
+
functionName: item.functionName,
|
|
2551
|
+
alias: item.alias,
|
|
2552
|
+
};
|
|
2553
|
+
}
|
|
2554
|
+
fieldByColumn.set(item.column, current);
|
|
2555
|
+
});
|
|
2556
|
+
return Array.from(fieldByColumn.values());
|
|
2557
|
+
}
|
|
2558
|
+
extractFunctionsFromFields(fields) {
|
|
2559
|
+
return fields
|
|
2560
|
+
.filter((item) => !!item.function?.functionName?.trim())
|
|
2561
|
+
.map((item) => ({
|
|
2562
|
+
functionName: item.function?.functionName?.trim() ?? EMPTY_VALUE,
|
|
2563
|
+
column: item.column,
|
|
2564
|
+
alias: item.function?.alias?.trim() || // NOSONAR - empty string fallback is intentional
|
|
2565
|
+
item.alias?.trim() || // NOSONAR - empty string fallback is intentional
|
|
2566
|
+
this.slugify(`${item.function?.functionName ?? EMPTY_VALUE}_${item.column}`),
|
|
2567
|
+
}));
|
|
2568
|
+
}
|
|
2569
|
+
slugify(value) {
|
|
2570
|
+
const normalized = this.normalize(value).replace(/[^a-z0-9]+/g, "_");
|
|
2571
|
+
let start = 0;
|
|
2572
|
+
let end = normalized.length;
|
|
2573
|
+
while (start < end && normalized.charAt(start) === "_") {
|
|
2574
|
+
start += 1;
|
|
2575
|
+
}
|
|
2576
|
+
while (end > start && normalized.charAt(end - 1) === "_") {
|
|
2577
|
+
end -= 1;
|
|
2578
|
+
}
|
|
2579
|
+
return normalized.slice(start, end);
|
|
2580
|
+
}
|
|
2581
|
+
deduplicateByKey(items, keyResolver) {
|
|
2582
|
+
const map = new Map();
|
|
2583
|
+
items.forEach((item) => map.set(keyResolver(item), item));
|
|
2584
|
+
return Array.from(map.values());
|
|
2585
|
+
}
|
|
2586
|
+
humanizeKey(value) {
|
|
2587
|
+
return value
|
|
2588
|
+
.toLowerCase()
|
|
2589
|
+
.split("_")
|
|
2590
|
+
.map((item) => item.charAt(0).toUpperCase() + item.slice(1))
|
|
2591
|
+
.join(" ");
|
|
2592
|
+
}
|
|
2593
|
+
instantWithFallback(key, fallback) {
|
|
2594
|
+
const translated = this.translate.instant(key);
|
|
2595
|
+
return translated && translated !== key ? translated : fallback;
|
|
2596
|
+
}
|
|
2597
|
+
buildFilterFromDraft() {
|
|
2598
|
+
if (this.filterModalMode === FILTER_MODE_DOMAIN) {
|
|
2599
|
+
const domainExpression = this.filterDraft.domainExpression.trim();
|
|
2600
|
+
if (!domainExpression) {
|
|
2601
|
+
return null;
|
|
2602
|
+
}
|
|
2603
|
+
return {
|
|
2604
|
+
column: EMPTY_VALUE,
|
|
2605
|
+
operator: EMPTY_VALUE,
|
|
2606
|
+
connector: this.filterDraft.connector,
|
|
2607
|
+
optional: this.filterDraft.optional,
|
|
2608
|
+
valueType: FILTER_MODE_DOMAIN,
|
|
2609
|
+
domainExpression,
|
|
2610
|
+
};
|
|
2611
|
+
}
|
|
2612
|
+
if (!this.filterDraft.column || !this.filterDraft.operator) {
|
|
2613
|
+
return null;
|
|
2614
|
+
}
|
|
2615
|
+
const next = {
|
|
2616
|
+
column: this.filterDraft.column,
|
|
2617
|
+
operator: this.filterDraft.operator,
|
|
2618
|
+
connector: this.filterDraft.connector,
|
|
2619
|
+
optional: this.filterDraft.optional,
|
|
2620
|
+
valueType: this.filterNeedsValue ? this.filterDraft.valueType : DEFAULT_FILTER_VALUE_TYPE,
|
|
2621
|
+
};
|
|
2622
|
+
if (!this.filterNeedsValue) {
|
|
2623
|
+
return next;
|
|
2624
|
+
}
|
|
2625
|
+
if (this.filterDraft.valueType === "parameter") {
|
|
2626
|
+
const parameterName = this.filterDraft.parameterName.trim();
|
|
2627
|
+
if (!parameterName) {
|
|
2628
|
+
return null;
|
|
2629
|
+
}
|
|
2630
|
+
next.parameterName = parameterName;
|
|
2631
|
+
return next;
|
|
2632
|
+
}
|
|
2633
|
+
if (this.filterDraft.operator === "IN") {
|
|
2634
|
+
const values = this.parseMultiValueText(this.filterDraft.valuesText);
|
|
2635
|
+
if (!values.length) {
|
|
2636
|
+
return null;
|
|
2637
|
+
}
|
|
2638
|
+
next.values = values;
|
|
2639
|
+
return next;
|
|
2640
|
+
}
|
|
2641
|
+
if (this.filterDraft.operator === "BETWEEN") {
|
|
2642
|
+
const start = this.filterDraft.betweenStart.trim();
|
|
2643
|
+
const end = this.filterDraft.betweenEnd.trim();
|
|
2644
|
+
if (!start || !end) {
|
|
2645
|
+
return null;
|
|
2646
|
+
}
|
|
2647
|
+
next.values = [start, end];
|
|
2648
|
+
return next;
|
|
2649
|
+
}
|
|
2650
|
+
const value = this.filterDraft.value.trim();
|
|
2651
|
+
if (!value) {
|
|
2652
|
+
return null;
|
|
2653
|
+
}
|
|
2654
|
+
next.value = value;
|
|
2655
|
+
return next;
|
|
2656
|
+
}
|
|
2657
|
+
resolveFilterDraftSqlPreview() {
|
|
2658
|
+
const next = this.buildFilterFromDraft();
|
|
2659
|
+
if (!next) {
|
|
2660
|
+
return EMPTY_VALUE;
|
|
2661
|
+
}
|
|
2662
|
+
return this.resolveFilterSql(next);
|
|
2663
|
+
}
|
|
2664
|
+
resolveFilterDraftDisplayValue() {
|
|
2665
|
+
if (this.filterModalMode === FILTER_MODE_DOMAIN) {
|
|
2666
|
+
return this.filterDraft.domainExpression.trim();
|
|
2667
|
+
}
|
|
2668
|
+
if (this.filterDraft.valueType === "parameter") {
|
|
2669
|
+
return this.filterDraft.parameterName
|
|
2670
|
+
? `:${this.filterDraft.parameterName}`
|
|
2671
|
+
: EMPTY_VALUE;
|
|
2672
|
+
}
|
|
2673
|
+
if (this.filterDraft.operator === "IN") {
|
|
2674
|
+
return this.filterDraft.valuesText;
|
|
2675
|
+
}
|
|
2676
|
+
if (this.filterDraft.operator === "BETWEEN") {
|
|
2677
|
+
return [this.filterDraft.betweenStart, this.filterDraft.betweenEnd]
|
|
2678
|
+
.filter(Boolean)
|
|
2679
|
+
.join(" - ");
|
|
2680
|
+
}
|
|
2681
|
+
if (!this.filterNeedsValue) {
|
|
2682
|
+
return this.instantWithFallback(`${this.config.translationPrefix}.states.optional`, "Sem valor");
|
|
2683
|
+
}
|
|
2684
|
+
return this.filterDraft.value;
|
|
2685
|
+
}
|
|
2686
|
+
scheduleFlowArrowRefresh() {
|
|
2687
|
+
if (this.refreshFlowArrowsFrame !== null) {
|
|
2688
|
+
cancelAnimationFrame(this.refreshFlowArrowsFrame);
|
|
2689
|
+
}
|
|
2690
|
+
if (this.refreshFlowArrowsTimeout !== null) {
|
|
2691
|
+
clearTimeout(this.refreshFlowArrowsTimeout);
|
|
2692
|
+
this.refreshFlowArrowsTimeout = null;
|
|
2693
|
+
}
|
|
2694
|
+
this.refreshFlowArrowsFrame = requestAnimationFrame(() => {
|
|
2695
|
+
this.refreshFlowArrowsFrame = null;
|
|
2696
|
+
this.refreshFlowArrows();
|
|
2697
|
+
this.refreshFlowArrowsTimeout = setTimeout(() => {
|
|
2698
|
+
this.refreshFlowArrowsTimeout = null;
|
|
2699
|
+
this.refreshFlowArrows();
|
|
2700
|
+
}, FLOW_ARROWS_REFRESH_DELAY_MS);
|
|
2701
|
+
});
|
|
2702
|
+
}
|
|
2703
|
+
refreshFlowArrows() {
|
|
2704
|
+
this.refreshMeasuredPreviewHeight();
|
|
2705
|
+
const nextArrows = this.buildFlowArrows();
|
|
2706
|
+
this.flowArrows = nextArrows;
|
|
2707
|
+
this.changeDetectorRef.markForCheck();
|
|
2708
|
+
}
|
|
2709
|
+
refreshMeasuredPreviewHeight() {
|
|
2710
|
+
const sectionsHeight = this.sectionsContainer?.nativeElement.offsetHeight ?? 0;
|
|
2711
|
+
this.measuredSplitPreviewHeight =
|
|
2712
|
+
sectionsHeight > 0 ? `${sectionsHeight}px` : "24rem";
|
|
2713
|
+
}
|
|
2714
|
+
buildFlowArrows() {
|
|
2715
|
+
const container = this.sectionsContainer?.nativeElement;
|
|
2716
|
+
const sections = this.builderSections?.toArray() ?? [];
|
|
2717
|
+
if (!container || sections.length < 2) {
|
|
2718
|
+
return [];
|
|
2719
|
+
}
|
|
2720
|
+
const sectionMap = new Map();
|
|
2721
|
+
sections.forEach((sectionRef) => {
|
|
2722
|
+
const sectionId = sectionRef.nativeElement.dataset["sectionId"];
|
|
2723
|
+
if (sectionId) {
|
|
2724
|
+
sectionMap.set(sectionId, sectionRef.nativeElement);
|
|
2725
|
+
}
|
|
2726
|
+
});
|
|
2727
|
+
const containerRect = container.getBoundingClientRect();
|
|
2728
|
+
return this.sectionOrder
|
|
2729
|
+
.slice(0, -1)
|
|
2730
|
+
.map((sectionId, index) => {
|
|
2731
|
+
const current = sectionMap.get(sectionId);
|
|
2732
|
+
const next = sectionMap.get(this.sectionOrder[index + 1]);
|
|
2733
|
+
if (!current || !next) {
|
|
2734
|
+
return null;
|
|
2735
|
+
}
|
|
2736
|
+
const currentRect = current.getBoundingClientRect();
|
|
2737
|
+
const nextRect = next.getBoundingClientRect();
|
|
2738
|
+
const isSameRow = Math.abs(currentRect.top - nextRect.top) < 16;
|
|
2739
|
+
const horizontalGap = Math.max(FLOW_ARROW_MIN_GAP, nextRect.left - currentRect.right);
|
|
2740
|
+
const verticalGap = Math.max(FLOW_ARROW_MIN_GAP, nextRect.top - currentRect.bottom);
|
|
2741
|
+
const overlapLeft = Math.max(currentRect.left, nextRect.left);
|
|
2742
|
+
const overlapRight = Math.min(currentRect.right, nextRect.right);
|
|
2743
|
+
const overlapTop = Math.max(currentRect.top, nextRect.top);
|
|
2744
|
+
const overlapBottom = Math.min(currentRect.bottom, nextRect.bottom);
|
|
2745
|
+
const nextCenterX = nextRect.left + nextRect.width / 2;
|
|
2746
|
+
const sameRowTop = overlapTop < overlapBottom
|
|
2747
|
+
? overlapTop + (overlapBottom - overlapTop) / 2
|
|
2748
|
+
: (currentRect.top +
|
|
2749
|
+
currentRect.height / 2 +
|
|
2750
|
+
(nextRect.top + nextRect.height / 2)) /
|
|
2751
|
+
2;
|
|
2752
|
+
const downLeft = overlapLeft < overlapRight
|
|
2753
|
+
? overlapLeft + (overlapRight - overlapLeft) / 2
|
|
2754
|
+
: (currentRect.left + currentRect.width / 2 + nextCenterX) / 2;
|
|
2755
|
+
return {
|
|
2756
|
+
id: `${sectionId}-${this.sectionOrder[index + 1]}`,
|
|
2757
|
+
direction: isSameRow ? "right" : "down",
|
|
2758
|
+
left: isSameRow
|
|
2759
|
+
? currentRect.right - containerRect.left - FLOW_ARROW_INSET + horizontalGap / 2
|
|
2760
|
+
: downLeft - containerRect.left,
|
|
2761
|
+
top: isSameRow
|
|
2762
|
+
? sameRowTop - containerRect.top
|
|
2763
|
+
: currentRect.bottom - containerRect.top - FLOW_ARROW_INSET + verticalGap / 2,
|
|
2764
|
+
};
|
|
2765
|
+
})
|
|
2766
|
+
.filter((item) => !!item);
|
|
2767
|
+
}
|
|
2768
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorComponent, deps: [{ token: i1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2769
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: VisualSqlEditorComponent, isStandalone: true, selector: "sdc-visual-sql-editor", inputs: { loading: "loading", config: "config" }, outputs: { configChange: "configChange", save: "save", cancel: "cancel" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "sectionsContainer", first: true, predicate: ["sectionsContainer"], descendants: true }, { propertyName: "builderSections", predicate: ["builderSection"], descendants: true }], ngImport: i0, template: "<div class=\"dynamic-view-builder\" [attr.aria-busy]=\"loading\">\n <div class=\"dynamic-view-builder__toolbar\">\n <div class=\"dynamic-view-builder__toolbar-copy\">\n <div class=\"dynamic-view-builder__title\">\n {{ config.metadata.title }}\n </div>\n <div class=\"dynamic-view-builder__subtitle\">\n {{ config.metadata.description }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__toolbar-actions\">\n <span class=\"dynamic-view-builder__toolbar-label\">\n {{ (config.translationPrefix + '.fields.layoutMode') | translate }}\n </span>\n <sdc-select-button\n [items]=\"layoutModeItems\"\n [ngModel]=\"selectedLayoutModeItems\"\n (ngModelChange)=\"onLayoutModeChange($event)\"\n ></sdc-select-button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__preview-toggle\"\n (click)=\"togglePreview()\"\n [attr.aria-pressed]=\"previewVisible\"\n [title]=\"previewToggleLabel\"\n [attr.aria-label]=\"previewToggleLabel\"\n >\n <i\n [class]=\"previewVisible ? 'fas fa-eye-slash' : 'fas fa-eye'\"\n aria-hidden=\"true\"\n ></i>\n {{ previewToggleLabel }}\n </button>\n </div>\n </div>\n\n @if (selectionModalVisible) {\n <sdc-modal\n [visible]=\"selectionModalVisible\"\n (visibleChange)=\"$event ? (selectionModalVisible = true) : closeSelectionModal()\"\n [header]=\"selectionModalTitle\"\n [width]=\"modalDimensions.selection.width\"\n [height]=\"modalDimensions.selection.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n @if (selectionModalMode === 'tables') {\n <div class=\"dynamic-view-builder__modal-inline-surface\">\n <sdc-textbox\n [label]=\"modalSearchLabel\"\n [placeholder]=\"modalSearchPlaceholder\"\n [ngModel]=\"selectionModalSearch\"\n (ngModelChange)=\"selectionModalSearch = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__selection-table\n dynamic-view-builder__selection-table--chooser\n dynamic-view-builder__selection-table--fluid\"\n >\n <div class=\"dynamic-view-builder__selection-head\">\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalNameLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalTypeLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col dynamic-view-builder__selection-col--select\">\n {{ modalSelectLabel }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__selection-body\">\n @for (row of selectionModalRows; track trackById($index, row)) {\n <div\n class=\"dynamic-view-builder__selection-row\"\n [class.dynamic-view-builder__selection-row--selected]=\"row.selected\"\n [attr.role]=\"'button'\"\n [attr.tabindex]=\"row.disabled ? -1 : 0\"\n [attr.aria-pressed]=\"row.selected\"\n [attr.aria-disabled]=\"row.disabled\"\n (click)=\"toggleSelectionModalRow(row.id)\"\n (keydown)=\"onSelectableRowKeydown($event)\"\n >\n <div class=\"dynamic-view-builder__selection-cell\">\n @if (row.tableLabel) {\n <span class=\"dynamic-view-builder__selection-path\">\n @if (row.pathType === 'table') {\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-db\">{{ row.dbLabel }}</span>\n }\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n }\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n } @else {\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ row.name }}</span>\n }\n </span>\n } @else {\n {{ row.name }}\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--meta\">\n <span>{{ row.meta }}</span>\n @if (row.note) {\n <span class=\"dynamic-view-builder__selection-note\">\n {{ row.note }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--select\">\n <span\n class=\"dynamic-view-builder__selection-marker\"\n [class.dynamic-view-builder__selection-marker--selected]=\"row.selected\"\n aria-hidden=\"true\"\n >\n <i class=\"fas fa-check\"></i>\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"selectionModalPicklistItems\"\n [selectedIds]=\"selectionModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSelectionModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSelectionModal()\"\n (keydown.enter)=\"closeSelectionModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.confirmSelection') | translate\"\n (click)=\"confirmSelectionModal()\"\n (keydown.enter)=\"confirmSelectionModal()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sourceModalVisible) {\n <sdc-modal\n [visible]=\"sourceModalVisible\"\n (visibleChange)=\"$event ? (sourceModalVisible = true) : closeSourceModal()\"\n [header]=\"sourceModalTitle\"\n [width]=\"modalDimensions.source.width\"\n [height]=\"modalDimensions.source.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"sourceModalTimelineItems\"\n [activeIndex]=\"sourceModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"sourceModalTimelineAriaLabel\"\n (stepSelect)=\"onSourceModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (sourceModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sourceModalPicklistItems\"\n [selectedIds]=\"sourceModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSourceModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__source-config-list\">\n @for (item of sourceModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__source-config-row\">\n <div class=\"dynamic-view-builder__source-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.dbLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.tableLabel }}</span>\n </div>\n </div>\n <div class=\"dynamic-view-builder__source-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onSourceModalAliasChange(item.table, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSourceModal()\"\n (keydown.enter)=\"closeSourceModal()\"\n ></sdc-button>\n @if (sourceModalSelectionStepActive && sourceModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceSourceModalStep()\"\n (keydown.enter)=\"advanceSourceModalStep()\"\n ></sdc-button>\n }\n @if (sourceModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!sourceModalCanProceed\"\n (click)=\"saveSourceModal()\"\n (keydown.enter)=\"saveSourceModal()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (joinModalVisible) {\n <sdc-modal\n [visible]=\"joinModalVisible\"\n (visibleChange)=\"$event ? (joinModalVisible = true) : closeJoinModal()\"\n [header]=\"(config.translationPrefix + '.cards.joins.title') | translate\"\n [width]=\"modalDimensions.join.width\"\n [height]=\"modalDimensions.join.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__join-modal\">\n <div class=\"dynamic-view-builder__join-modal-top\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinSourceSummary }}</div>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--compact\n dynamic-view-builder__modal-card\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"joinDraft.operator\"\n (ngModelChange)=\"joinDraft.operator = $event\"\n [options]=\"joinOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n </div>\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinTargetSummary }}</div>\n </div>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--fit\">\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinSourcePicklistItems\"\n [selectedIds]=\"joinSourceSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinSourceSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinTargetPicklistItems\"\n [selectedIds]=\"joinTargetSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinTargetSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeJoinModal()\"\n (keydown.enter)=\"closeJoinModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveJoin\"\n (click)=\"saveJoin()\"\n (keydown.enter)=\"saveJoin()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sortModalVisible) {\n <sdc-modal\n [visible]=\"sortModalVisible\"\n (visibleChange)=\"$event ? (sortModalVisible = true) : closeSortModal()\"\n [header]=\"sortModalTitle\"\n [width]=\"modalDimensions.sort.width\"\n [height]=\"modalDimensions.sort.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__sort-modal\">\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--full\n dynamic-view-builder__sort-direction-field\"\n >\n <div class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.direction') | translate }}\n </div>\n <sdc-select-button\n class=\"dynamic-view-builder__sort-direction\"\n [items]=\"sortDirectionItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedSortDirectionItems\"\n (ngModelChange)=\"onSortDirectionChange($event)\"\n ></sdc-select-button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow dynamic-view-builder__picklist-shell\n dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sortPicklistItems\"\n [selectedIds]=\"sortSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSortSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSortModal()\"\n (keydown.enter)=\"closeSortModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveSort\"\n (click)=\"saveSort()\"\n (keydown.enter)=\"saveSort()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (filterModalVisible) {\n <sdc-modal\n [visible]=\"filterModalVisible\"\n (visibleChange)=\"$event ? (filterModalVisible = true) : closeFilterModal()\"\n [header]=\"filterModalTitle\"\n [width]=\"modalDimensions.filter.width\"\n [height]=\"modalDimensions.filter.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__filter-modal\">\n <sdc-timeline\n [items]=\"filterModalTimelineItems\"\n [activeIndex]=\"filterModalReviewStepActive ? 2 : (filterModalConfigurationStepActive ? 1 : 0)\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"filterModalTimelineAriaLabel\"\n (stepSelect)=\"onFilterModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (filterModalSelectionStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-base-selector\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.select.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.mode'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-row\">\n <div class=\"dynamic-view-builder__filter-mode-copy\">\n {{ (config.translationPrefix + '.modals.filter.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-selector\">\n <sdc-select-button\n [items]=\"filterModeItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedFilterModeItems\"\n (ngModelChange)=\"onFilterModeChange($event[0]?.value || 'condition')\"\n ></sdc-select-button>\n </div>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-picker\n dynamic-view-builder__modal-picker--filter\n dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell\"\n >\n <sdc-picklist\n [items]=\"filterModalPicklistItems\"\n [selectedIds]=\"filterModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFilterModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-domain-intro\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.filters.domainLabel') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-grid\">\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterDomainExpressionTooltip }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.connector') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterConnectorTooltip }}\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n @if (filterModalConfigurationStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('select')\"\n >\n {{ filterBackToSelectionLabel }}\n </button>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.configure'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"filterDraft.operator\"\n (ngModelChange)=\"filterDraft.operator = $event; onFilterOperatorChange()\"\n [options]=\"filterOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n [disabled]=\"!filterDraft.column\"\n [infoTooltip]=\"filterOperatorTooltip\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.valueType'\"\n [ngModel]=\"filterDraft.valueType\"\n (ngModelChange)=\"filterDraft.valueType = $event; onFilterValueTypeChange()\"\n [options]=\"valueTypeOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterValueTypeDisabled\"\n [infoTooltip]=\"filterValueTypeTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--value\"\n >\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--single\">\n @if (showFilterBooleanCombobox) {\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n [options]=\"booleanValueOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n }\n @if (showFilterValueTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterValuesTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.values'\"\n [ngModel]=\"filterDraft.valuesText\"\n (ngModelChange)=\"filterDraft.valuesText = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterBetweenInputs) {\n <div class=\"dynamic-view-builder__between dynamic-view-builder__modal-grid-column-full\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueStart'\"\n [ngModel]=\"filterDraft.betweenStart\"\n (ngModelChange)=\"filterDraft.betweenStart = $event\"\n width=\"100%\"\n ></sdc-textbox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueEnd'\"\n [ngModel]=\"filterDraft.betweenEnd\"\n (ngModelChange)=\"filterDraft.betweenEnd = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n }\n @if (showFilterParameterTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.parameterName'\"\n [ngModel]=\"filterDraft.parameterName\"\n (ngModelChange)=\"filterDraft.parameterName = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--domain\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-hint\">\n {{ filterDomainExpressionTooltip }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterDraft.domainExpression\"\n (ngModelChange)=\"filterDraft.domainExpression = $event\"\n width=\"100%\"\n [rows]=\"10\"\n ></sdc-textarea>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.review.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('configure')\"\n >\n {{ filterBackToConfigurationLabel }}\n </button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-review-grid\">\n @for (item of filterReviewItems; track trackById($index, item)) {\n <div\n class=\"dynamic-view-builder__filter-review-item\"\n >\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ item.label }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\"\n [class.dynamic-view-builder__modal-summary-value--path]=\"item.emphasize === 'path'\"\n [class.dynamic-view-builder__filter-review-code]=\"item.emphasize === 'code'\"\n >\n {{ item.value }}\n </div>\n </div>\n }\n </div>\n <div class=\"dynamic-view-builder__filter-review-preview\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.sqlPreview') | translate }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterReviewPreviewLabel\"\n width=\"100%\"\n [rows]=\"6\"\n [disabled]=\"true\"\n ></sdc-textarea>\n </div>\n </div>\n </div>\n }\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFilterModal()\"\n (keydown.enter)=\"closeFilterModal()\"\n ></sdc-button>\n @if (filterModalSelectionStepActive) {\n <sdc-button\n [label]=\"filterModalConfigureActionLabel\"\n [disabled]=\"!filterModalCanProceed\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalConfigurationStepActive) {\n <sdc-button\n [label]=\"filterModalReviewActionLabel\"\n [disabled]=\"!filterModalCanReview\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalReviewStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFilter\"\n (click)=\"saveFilter()\"\n (keydown.enter)=\"saveFilter()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (fieldModalVisible) {\n <sdc-modal\n [visible]=\"fieldModalVisible\"\n (visibleChange)=\"$event ? (fieldModalVisible = true) : closeFieldModal()\"\n [header]=\"fieldModalTitle\"\n [width]=\"modalDimensions.field.width\"\n [height]=\"modalDimensions.field.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"fieldModalTimelineItems\"\n [activeIndex]=\"fieldModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"fieldModalTimelineAriaLabel\"\n (stepSelect)=\"onFieldModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (fieldModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"fieldModalPicklistItems\"\n [selectedIds]=\"fieldModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFieldModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-toolbar\">\n <div class=\"dynamic-view-builder__field-config-summary\">\n {{ fieldModalConfiguredItems.length }}\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n @if (fieldModalHasSelectableColumns) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"addAnotherFieldFromModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-list\">\n @for (item of fieldModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__field-config-row\">\n <div class=\"dynamic-view-builder__field-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.fieldLabel }}</span>\n </div>\n @if (item.functionName && !isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-function\">\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n }\n </div>\n @if (!isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onFieldModalAliasChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n <div class=\"dynamic-view-builder__field-width\">\n <div class=\"dynamic-view-builder__modal-label-row\">\n <span class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.width') | translate }}\n </span>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.messages.fieldWidthInfo'\"\n ></sdc-info-sign>\n </div>\n <sdc-textbox\n [label]=\"''\"\n [ngModel]=\"item.width\"\n (ngModelChange)=\"onFieldModalWidthChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"12\"\n placeholder=\"160\"\n ></sdc-textbox>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"startFieldFunctionEdit(item.column)\"\n >\n {{ item.functionName\n ? ((config.translationPrefix + '.actions.configureField') | translate)\n : ((config.translationPrefix + '.fields.functionName') | translate) }}\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFieldModalDraft(item.column)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__field-config-controls\n dynamic-view-builder__field-config-controls--function\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.functionName'\"\n [ngModel]=\"fieldFunctionDraft.functionName\"\n (ngModelChange)=\"onFieldFunctionDraftNameChange($event)\"\n [options]=\"fieldModalFunctionOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"fieldFunctionDraft.functionAlias\"\n (ngModelChange)=\"fieldFunctionDraft.functionAlias = $event\"\n width=\"100%\"\n [maxlength]=\"24\"\n [disabled]=\"!fieldFunctionDraft.functionName\"\n ></sdc-textbox>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n (click)=\"cancelFieldFunctionEdit()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--active\"\n [title]=\"(config.translationPrefix + '.actions.save') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.save') | translate\"\n (click)=\"saveFieldFunctionEdit()\"\n >\n <i class=\"fas fa-check\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer dynamic-view-builder__modal-footer--between\">\n <div class=\"dynamic-view-builder__modal-footer-group dynamic-view-builder__modal-footer-group--start\">\n @if (fieldModalSelectionStepActive && fieldModalCanSelectAll) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"selectAllFieldModalColumns()\"\n >\n {{ (config.translationPrefix + '.actions.selectAllColumns') | translate }}\n </button>\n }\n </div>\n <div class=\"dynamic-view-builder__modal-footer-group\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFieldModal()\"\n (keydown.enter)=\"closeFieldModal()\"\n ></sdc-button>\n @if (fieldModalSelectionStepActive && fieldModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceFieldModalStep()\"\n (keydown.enter)=\"advanceFieldModalStep()\"\n ></sdc-button>\n }\n @if (fieldModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFieldModal\"\n (click)=\"saveField()\"\n (keydown.enter)=\"saveField()\"\n ></sdc-button>\n }\n </div>\n </div>\n </sdc-modal>\n }\n\n <div\n class=\"dynamic-view-builder__workspace\"\n [class.dynamic-view-builder__workspace--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__workspace--split]=\"layoutMode === 'split'\"\n [class.dynamic-view-builder__workspace--preview-hidden]=\"!previewVisible\"\n >\n <div class=\"dynamic-view-builder__builder-area\">\n <div\n #sectionsContainer\n class=\"dynamic-view-builder__sections\"\n [class.dynamic-view-builder__sections--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__sections--split]=\"layoutMode === 'split'\"\n >\n <section\n #builderSection\n data-section-id=\"tables\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sources.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenSourceConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n (click)=\"openSourceConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sourceItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSources()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sourceItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectTables') | translate }}\n </button>\n }\n @if (sourceItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (source of sourceItems; track trackById(i, source); let i = $index) {\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--source\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-table-group\">\n <span class=\"dynamic-view-builder__row-db\">{{ source.dbLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-table\">\n {{ source.tableLabel }}\n </span>\n </span>\n @if (source.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ source.alias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSource(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"joins\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.joins.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canConfigureJoins\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !joinItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearJoins()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!canConfigureJoins) {\n <div class=\"dynamic-view-builder__info-row\">\n {{ (config.translationPrefix + '.messages.joinRequiresTwoTables') | translate }}\n </div>\n }\n @if (canConfigureJoins && !joinItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n {{ (config.translationPrefix + '.actions.addJoin') | translate }}\n </button>\n }\n @if (joinItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of joinItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.sourceTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.sourceField }}</span>\n </span>\n <span class=\"dynamic-view-builder__join-operator\">{{ item.operator }}</span>\n <span class=\"dynamic-view-builder__join-arrow\" aria-hidden=\"true\">\n <i class=\"fas fa-long-arrow-alt-right\"></i>\n </span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.targetTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.targetField }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openJoinModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeJoin(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n <section\n #builderSection\n data-section-id=\"groupBy\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.groupBy.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupBySelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupByItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearGroupBy()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!groupByItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (groupByItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of groupByItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeGroupBy(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n </div>\n\n <section\n #builderSection\n data-section-id=\"fields\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n <sdc-info-sign\n class=\"dynamic-view-builder__hint\"\n [tooltip]=\"'Voc\u00EA pode ordenar a sequ\u00EAncia dos campos arrastando e soltando.'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldSelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openFieldModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenFieldConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n (click)=\"openFieldConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFields()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!fieldItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openFieldModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (fieldItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of fieldItems; track trackById(i, item); let i = $index) {\n @if (isFieldDropIndicatorVisible(i)) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--draggable\"\n [class.dynamic-view-builder__row--drag-origin]=\"draggingFieldIndex === item.sourceIndex\"\n [draggable]=\"!isReadonly\"\n (dragstart)=\"onFieldDragStart(item.sourceIndex)\"\n (dragover)=\"onFieldDragOver($event, i)\"\n (drop)=\"onFieldDrop()\"\n (dragend)=\"onFieldDragEnd()\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-order\">{{ item.orderLabel }}</span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n @if (item.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ item.alias }}\n </span>\n }\n @if (item.width) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.width }}\n </span>\n }\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeField(item.sourceIndex)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n @if (isFieldDropIndicatorAtEndVisible()) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"sorting\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sorting.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortSelectableItems.length\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSorting()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sortItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n {{ (config.translationPrefix + '.actions.addSort') | translate }}\n </button>\n }\n @if (sortItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of sortItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.direction }}\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openSortModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSort(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <section\n #builderSection\n data-section-id=\"filters\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.filters.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !availableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !filterItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFilters()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!filterItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n {{ (config.translationPrefix + '.actions.addFilter') | translate }}\n </button>\n }\n @if (filterItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of filterItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (!item.isDomain) {\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--operator\"\n >{{ item.operatorLabel }}</span>\n } @else {\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--domain\"\n >{{ item.tableLabel }}</span>\n }\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--value\">\n {{ item.subtitle }}\n </span>\n @if (item.optional) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--optional\">\n {{ (config.translationPrefix + '.states.optional') | translate }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openFilterModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFilter(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n </div>\n\n @for (arrow of flowArrows; track trackByArrow($index, arrow)) {\n <div\n class=\"dynamic-view-builder__flow-arrow\"\n [class.dynamic-view-builder__flow-arrow--right]=\"arrow.direction === 'right'\"\n [class.dynamic-view-builder__flow-arrow--down]=\"arrow.direction === 'down'\"\n [style.left.px]=\"arrow.left\"\n [style.top.px]=\"arrow.top\"\n aria-hidden=\"true\"\n >\n <i\n [class]=\"arrow.direction === 'right'\n ? 'fas fa-angle-double-right'\n : 'fas fa-angle-double-down'\"\n ></i>\n </div>\n }\n </div>\n </div>\n\n @if (previewVisible) {\n <aside class=\"dynamic-view-builder__preview-area\">\n <div\n class=\"dynamic-view-builder__preview\"\n [style.height]=\"sqlPreviewPanelHeight\"\n >\n <div class=\"dynamic-view-builder__preview-header\">\n <div class=\"dynamic-view-builder__preview-title\">SQL Preview</div>\n <div class=\"dynamic-view-builder__preview-subtitle\">\n Consulta gerada automaticamente a partir da configuracao atual.\n </div>\n </div>\n <div class=\"dynamic-view-builder__preview-body\">\n <sdc-code-editor\n [sql]=\"sqlPreview\"\n language=\"sql\"\n [readOnly]=\"true\"\n [showCopy]=\"true\"\n [height]=\"sqlPreviewHeight\"\n ></sdc-code-editor>\n </div>\n </div>\n </aside>\n }\n </div>\n</div>\n", styles: [":host{display:block}::ng-deep .sdc-loading-state{overflow:auto!important}.dynamic-view-builder{display:flex;flex-direction:column;gap:.75rem;color:#243342}.dynamic-view-builder__toolbar{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:.25rem 0}.dynamic-view-builder__toolbar-copy{min-width:0}.dynamic-view-builder__title{font-size:1rem;font-weight:700;line-height:1.2;color:#243342}.dynamic-view-builder__subtitle{margin-top:.2rem;color:#70839a;font-size:.875rem;line-height:1.35}.dynamic-view-builder__toolbar-actions{display:flex;align-items:center;gap:.625rem;flex-shrink:0;flex-wrap:wrap}.dynamic-view-builder__toolbar-label{color:#70839a;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__workspace{display:grid;gap:.875rem;min-width:0}.dynamic-view-builder__workspace--preview-hidden,.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{grid-template-columns:1fr;grid-template-areas:\"builder\"}.dynamic-view-builder__workspace--stacked{grid-template-columns:1fr;grid-template-areas:\"preview\" \"builder\"}.dynamic-view-builder__workspace--split{grid-template-columns:minmax(0,62fr) minmax(20rem,38fr);grid-template-areas:\"builder preview\";align-items:start}.dynamic-view-builder__builder-area{grid-area:builder;display:flex;flex-direction:column;gap:.75rem;min-width:0}.dynamic-view-builder__sections{display:flex;flex-direction:column;gap:.5rem;min-width:0;position:relative}.dynamic-view-builder__section{display:flex;flex-direction:column;gap:.4rem;min-width:0;padding:.55rem .65rem;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;min-inline-size:0;max-inline-size:100%;position:relative;width:100%}.dynamic-view-builder__section-row{display:flex;flex-wrap:wrap;align-items:stretch;gap:.5rem;min-width:0}.dynamic-view-builder__section-row>.dynamic-view-builder__section{align-self:stretch}.dynamic-view-builder__section--half{flex:1 1 18rem;width:auto}.dynamic-view-builder__section--compact{flex:0 0 clamp(18rem,30%,22rem);width:auto}.dynamic-view-builder__section--fluid{flex:1 1 26rem;min-inline-size:min(100%,26rem);width:auto}.dynamic-view-builder__flow-arrow{position:absolute;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;border:1px solid #d9e3ed;border-radius:999px;background:#fff;color:#68809a;pointer-events:none;z-index:2;transform:translate(-50%,-50%)}.dynamic-view-builder__flow-arrow i{font-size:.74rem;line-height:1}.dynamic-view-builder__section-head{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem}.dynamic-view-builder__section-heading{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dynamic-view-builder__section-label{min-width:0;color:#516173;font-size:.78rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase}.dynamic-view-builder__section-actions{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;flex-wrap:wrap;flex-shrink:0}.dynamic-view-builder__hint{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;padding:0;border:0;background:transparent;color:#8ca0b6;cursor:help}.dynamic-view-builder__hint--legacy{display:none}.dynamic-view-builder__stack{display:flex;gap:.35rem;min-width:0}.dynamic-view-builder__stack--wrap{flex-direction:row;flex-wrap:wrap;align-items:flex-start}.dynamic-view-builder__row,.dynamic-view-builder__empty-row,.dynamic-view-builder__info-row{min-width:0;border:1px solid #e7edf4;border-radius:.4rem;background:#fbfcfe}.dynamic-view-builder__row{display:inline-flex;align-items:stretch;justify-content:space-between;gap:.45rem;padding:.5rem .6rem;inline-size:auto;min-inline-size:min(100%,12rem);max-inline-size:100%;flex:0 1 auto}.dynamic-view-builder__row-main{min-width:0;display:flex;align-items:center;gap:.3rem;flex-wrap:wrap;flex:1 1 auto}.dynamic-view-builder__row-label{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-value{color:#627588;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-separator{color:#b0bcc9;flex-shrink:0}.dynamic-view-builder__row-actions{display:flex;align-items:center;justify-content:flex-end;gap:.2rem;flex-wrap:wrap;flex:0 0 auto}.dynamic-view-builder__row--source{align-items:center;min-inline-size:min(100%,16.5rem);padding-block:.45rem}.dynamic-view-builder__row--source .dynamic-view-builder__row-main{align-items:center;flex-wrap:nowrap;gap:.18rem}.dynamic-view-builder__row-table-group{display:inline-flex;align-items:center;gap:0;min-width:0;flex:0 1 auto}.dynamic-view-builder__row-db{color:#243342;font-weight:700;line-height:1.25;white-space:nowrap}.dynamic-view-builder__row-order{display:inline-flex;align-items:center;justify-content:center;min-width:2rem;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#516173;font-size:.75rem;font-weight:700}.dynamic-view-builder__row-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__row-table{color:#425466;font-weight:500;line-height:1.35}.dynamic-view-builder__row-table--accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__row-dot{color:#8fa1b3;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__row-field{color:#1f8a52;font-weight:700;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-meta{display:inline-flex;align-items:center;padding:.12rem .4rem;border-radius:999px;background:#f0f4f8;color:#627588;font-size:.74rem;line-height:1.2}.dynamic-view-builder__join-operator{display:inline-flex;align-items:center;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#627588;font-size:.73rem;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.dynamic-view-builder__join-arrow{color:#9ab0c6;font-size:.85rem}.dynamic-view-builder__row--draggable{cursor:grab}.dynamic-view-builder__row--drag-origin{opacity:.6;border-color:#b8cae0;background:#f4f8fc}.dynamic-view-builder__row--draggable:active{cursor:grabbing}.dynamic-view-builder__alias-field{flex:0 1 5.4rem;min-inline-size:4.4rem;max-inline-size:5.8rem}.dynamic-view-builder__alias-field :where(.sdc-textbox__label-row){display:none}.dynamic-view-builder__action-link{padding:0;border:0;background:transparent;color:#6d7786;font:inherit;font-size:.82rem;font-weight:600;line-height:1.25;cursor:pointer;transition:color .18s ease;pointer-events:auto;position:relative;z-index:2;text-decoration:none}.dynamic-view-builder__action-link:disabled{opacity:.45;cursor:default}.dynamic-view-builder__action-link:hover:not(:disabled),.dynamic-view-builder__action-link:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__action-link--primary{color:#1b5cff}.dynamic-view-builder__action-link--icon{display:inline-flex;align-items:center;justify-content:center;min-width:1.5rem;min-height:1.5rem}.dynamic-view-builder__action-link--icon i{font-size:.9rem;line-height:1}.dynamic-view-builder__preview-toggle{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;padding:0 .75rem;border:1px solid #dbe3ec;border-radius:999px;background:#f8fafc;color:#425466;font:inherit;font-size:.82rem;font-weight:600;cursor:pointer;transition:border-color .18s ease,background-color .18s ease,color .18s ease}.dynamic-view-builder__preview-toggle:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px}.dynamic-view-builder__preview-toggle:hover:not(:disabled),.dynamic-view-builder__preview-toggle:focus-visible:not(:disabled){border-color:#b9c7d6;background:#eef4fb;color:#1b5cff}.dynamic-view-builder__icon-action{display:inline-flex;align-items:center;justify-content:center;width:1.35rem;height:1.35rem;padding:0;border:0;background:transparent;color:#7b8ea2;cursor:pointer;transition:color .18s ease}.dynamic-view-builder__icon-action:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px;border-radius:999px}.dynamic-view-builder__icon-action:disabled{opacity:.45;cursor:default}.dynamic-view-builder__icon-action:hover:not(:disabled),.dynamic-view-builder__icon-action:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__icon-action--active{color:#1c9b5f}.dynamic-view-builder__icon-action--danger{color:#8d9caf}.dynamic-view-builder__icon-action--danger:hover:not(:disabled),.dynamic-view-builder__icon-action--danger:focus-visible:not(:disabled){color:#d14343}.dynamic-view-builder__empty-row{width:auto;max-width:100%;padding:.45rem .55rem;text-align:left;color:#70839a;cursor:pointer;inline-size:fit-content;pointer-events:auto;position:relative;z-index:1}.dynamic-view-builder__info-row{padding:.45rem .55rem;color:#3d6ae8;line-height:1.35;inline-size:fit-content;max-inline-size:100%}.dynamic-view-builder__preview-area{grid-area:preview;min-width:0;display:flex;align-self:start}.dynamic-view-builder__preview{display:flex;flex:1 1 auto;flex-direction:column;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;overflow:hidden;min-height:0}.dynamic-view-builder__preview-header{padding:.75rem .9rem;border-bottom:1px solid #e7edf4;background:#f8fafc}.dynamic-view-builder__preview-title{color:#243342;font-weight:700;line-height:1.25}.dynamic-view-builder__preview-subtitle{margin-top:.2rem;color:#70839a;line-height:1.35}.dynamic-view-builder__preview-body{display:flex;flex:1 1 auto;min-height:0;padding:.55rem}.dynamic-view-builder__preview-body :where(sdc-code-editor){display:block;flex:1 1 auto;min-height:0;width:100%}.dynamic-view-builder__footer{display:flex;justify-content:flex-start;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-shell{display:flex;flex-direction:column;gap:.875rem;min-height:0;height:100%}.dynamic-view-builder__modal-shell--full{height:100%}.dynamic-view-builder__modal-stage{display:flex;flex-direction:column;gap:.75rem;min-height:0}.dynamic-view-builder__modal-stage-body{flex:1 1 auto;min-height:0}.dynamic-view-builder__modal-card{padding:.85rem .95rem;border:1px solid #dbe3ec;border-radius:.65rem;background:#fff;box-shadow:0 1px 2px #0f172a0a}.dynamic-view-builder__modal-card--compact{padding:.75rem .85rem}.dynamic-view-builder__modal-card--section{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__modal-card--soft{background:linear-gradient(180deg,#fbfdff,#f6f9fc)}.dynamic-view-builder__modal-inline-surface{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__modal-list-shell{flex:1 1 auto;min-height:0;overflow:hidden;padding:.8rem}.dynamic-view-builder__modal-card-title{color:#243342;font-size:.92rem;font-weight:700;line-height:1.25}.dynamic-view-builder__modal-card-text{margin-top:.2rem;color:#70839a;font-size:.8rem;line-height:1.35}.dynamic-view-builder__modal-panel-title{color:#425466;font-size:.78rem;font-weight:700;letter-spacing:.04em;line-height:1.25;text-transform:uppercase}.dynamic-view-builder__modal-panel-title--section{margin-bottom:-.1rem}.dynamic-view-builder__modal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;align-items:start;min-height:0}.dynamic-view-builder__modal-grid>*{min-width:0}.dynamic-view-builder__modal-grid--single{grid-template-columns:1fr}.dynamic-view-builder__modal-grid--filter{grid-template-columns:repeat(2,minmax(0,1fr))}.dynamic-view-builder__modal-grid--filter-controls{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem .75rem}.dynamic-view-builder__modal-grid-column-full{grid-column:1/-1}.dynamic-view-builder__modal-field,.dynamic-view-builder__modal-picker{display:flex;flex-direction:column;gap:.625rem;min-width:0;min-height:0}.dynamic-view-builder__modal-field--stretch,.dynamic-view-builder__modal-picker--stretch{height:100%}.dynamic-view-builder__modal-field--compact{gap:.5rem}.dynamic-view-builder__modal-field--full{width:100%}.dynamic-view-builder__modal-label-row{display:inline-flex;align-items:center;gap:.35rem;min-width:0}.dynamic-view-builder__modal-label{color:#425466;font-size:.875rem;font-weight:600;line-height:1.25}.dynamic-view-builder__join-modal{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__selection-flow{display:flex;flex-direction:column;gap:.75rem;height:100%;min-height:0}.dynamic-view-builder__filter-modal{display:flex;flex-direction:column;gap:.875rem;min-height:min(30rem,100vh - 14rem);height:100%;overflow:hidden}.dynamic-view-builder__filter-step{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;flex:1 1 auto}.dynamic-view-builder__filter-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:.875rem;flex-wrap:wrap}.dynamic-view-builder__filter-toolbar>*{min-width:0}.dynamic-view-builder__filter-heading{display:flex;align-items:center;justify-content:space-between;gap:.5rem;min-width:0}.dynamic-view-builder__filter-base-selector,.dynamic-view-builder__filter-domain-intro{min-width:0}.dynamic-view-builder__filter-base-selector{gap:.625rem;padding:.85rem 1rem}.dynamic-view-builder__filter-mode-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.dynamic-view-builder__filter-mode-copy{color:#70839a;font-size:.84rem;line-height:1.4}.dynamic-view-builder__filter-mode-selector{display:flex;min-width:0}.dynamic-view-builder__filter-mode-selector :where(.select-button){max-width:100%}.dynamic-view-builder__picklist-shell{flex:1 1 auto;min-height:0;overflow:hidden;display:flex;flex-direction:column}.dynamic-view-builder__picklist-shell :where(sdc-picklist){display:flex;flex:1 1 auto;height:100%;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist){display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__loading-state){display:flex;flex-direction:column;min-height:0;flex:1 1 auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__content){min-height:0;flex:1 1 auto;overflow:auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__list){margin:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__search),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__selected),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__footer){flex:0 0 auto}.dynamic-view-builder__filter-config-card{flex:1 1 auto;min-height:0;gap:.75rem;overflow:auto;padding:.85rem 1rem}.dynamic-view-builder__filter-panel{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0}.dynamic-view-builder__filter-context{display:flex;flex-direction:column;gap:.2rem;padding:0 .1rem;min-width:0}.dynamic-view-builder__filter-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem;min-width:0}.dynamic-view-builder__filter-summary-item{display:flex;flex-direction:column;gap:.22rem;padding:.7rem .8rem;border:1px solid #dbe3ec;border-radius:.55rem;background:#f8fafc;min-width:0}.dynamic-view-builder__sort-modal{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;height:100%;overflow:hidden}.dynamic-view-builder__sort-direction{display:block;width:100%;max-width:18rem;min-width:0;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button){width:100%;max-width:100%;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button-item){min-width:0}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-field{flex:0 0 auto}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-picker{flex:1 1 auto;min-height:0}.dynamic-view-builder__sort-modal :where(.select-button--soft){padding:.25rem}.dynamic-view-builder__sort-modal :where(.select-button--soft .select-button-item){min-height:2rem;padding:.4rem .65rem}.dynamic-view-builder__modal-summary{display:flex;flex-direction:column;gap:.25rem;align-self:start}.dynamic-view-builder__modal-summary--filter{gap:.35rem}.dynamic-view-builder__modal-summary--compact{width:fit-content;max-width:100%}.dynamic-view-builder__modal-summary--field{min-width:min(100%,15rem)}.dynamic-view-builder__join-modal-top{display:grid;grid-template-columns:minmax(0,1fr) minmax(12rem,14rem) minmax(0,1fr);gap:.875rem;align-items:stretch}.dynamic-view-builder__join-modal-top>*{height:100%}.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-summary,.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-field{align-self:stretch}.dynamic-view-builder__modal-summary-label{color:#70839a;font-size:.73rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__modal-summary-value{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__modal-summary-value--path{color:#1f8a52;font-family:Consolas,Courier New,monospace;font-size:.86rem;font-weight:600}.dynamic-view-builder__picker-title{color:#425466;font-weight:700;line-height:1.35}.dynamic-view-builder__picker-title--path{font-family:Consolas,Courier New,monospace;font-size:.85rem;font-weight:600}.dynamic-view-builder__modal-footer{display:flex;justify-content:flex-end;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer--between{justify-content:space-between;align-items:center}.dynamic-view-builder__modal-footer-group{display:inline-flex;align-items:center;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer-group--start{margin-right:auto}.dynamic-view-builder__filter-config-section{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__filter-config-section--value,.dynamic-view-builder__filter-config-section--domain{padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-optional{display:flex;align-items:flex-end;gap:.35rem;min-height:100%;padding-bottom:.15rem}.dynamic-view-builder__filter-config-section :where(.sdc-checkbox){min-height:34px}.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem}.dynamic-view-builder__filter-domain-item,.dynamic-view-builder__filter-review-item{display:flex;flex-direction:column;gap:.25rem;min-width:0;padding:.8rem .9rem;border:1px solid #e5ebf2;border-radius:.6rem;background:#f8fafc}.dynamic-view-builder__filter-domain-hint{color:#70839a;font-size:.82rem;line-height:1.45}.dynamic-view-builder__filter-review-preview{display:flex;flex-direction:column;gap:.35rem;min-width:0;padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-review-code{color:#243342;font-family:Consolas,Courier New,monospace;font-size:.84rem;line-height:1.45;white-space:pre-wrap;word-break:break-word}.dynamic-view-builder__sort-direction-field{gap:.4rem}.dynamic-view-builder__selection-table{display:flex;flex-direction:column;border:1px solid #d7dde5;background:#fff;overflow:hidden;border-radius:.5rem;min-height:0;flex:1 1 auto}.dynamic-view-builder__modal-stage-body>.dynamic-view-builder__selection-table,.dynamic-view-builder__modal-stage-body.dynamic-view-builder__picklist-shell{height:100%}.dynamic-view-builder__selection-table--chooser{min-height:0}.dynamic-view-builder__selection-head{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border-bottom:1px solid #e4e8ef;background:#f6f8fb}.dynamic-view-builder__selection-body{flex:1 1 auto;min-height:0;max-height:22rem;overflow:auto}.dynamic-view-builder__selection-table--fluid,.dynamic-view-builder__selection-table--fluid .dynamic-view-builder__selection-body{min-height:0;max-height:none;height:100%}.dynamic-view-builder__selection-row{width:100%;display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border:0;border-bottom:1px solid #eef2f7;background:transparent;text-align:left;cursor:pointer;transition:background-color .18s ease,box-shadow .18s ease}.dynamic-view-builder__selection-row:last-child{border-bottom:0}.dynamic-view-builder__selection-row:hover{background:#f9fbff}.dynamic-view-builder__selection-row--selected{background:#eef5ff}.dynamic-view-builder__selection-row:focus-visible{outline:2px solid rgba(27,92,255,.22);outline-offset:-2px}.dynamic-view-builder__selection-col,.dynamic-view-builder__selection-cell{min-width:0;color:#425466;line-height:1.4;word-break:break-word}.dynamic-view-builder__selection-col{font-weight:700}.dynamic-view-builder__selection-cell--meta{color:#70839a}.dynamic-view-builder__selection-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:nowrap}.dynamic-view-builder__selection-db{color:#243342;font-weight:700}.dynamic-view-builder__selection-table-label{color:#425466;font-weight:500}.dynamic-view-builder__selection-separator{color:#9aaaba;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__selection-accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__selection-note{display:block;margin-top:.1rem;color:#8da0b4;font-size:.74rem}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{display:flex;align-items:center;justify-content:center}.dynamic-view-builder__selection-marker{display:inline-flex;align-items:center;justify-content:center;width:1.2rem;height:1.2rem;border:1px solid #c8d4e0;border-radius:.3rem;background:#fff;color:transparent}.dynamic-view-builder__selection-marker i{font-size:.72rem;line-height:1}.dynamic-view-builder__selection-marker--selected{border-color:#1b5cff;background:#1b5cff;color:#fff}.dynamic-view-builder__selection-empty{padding:1rem;color:#70839a;text-align:center;line-height:1.4}.dynamic-view-builder__modal-picker--filter,.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-table{min-height:100%}.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-body{max-height:none}.dynamic-view-builder__field-modal{display:flex;flex-direction:column;gap:1rem;min-height:0;width:100%;height:100%}.dynamic-view-builder__field-config-shell{gap:.85rem;min-height:0;height:100%}.dynamic-view-builder__field-config-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-summary{color:#516173;font-size:.8rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__field-selection-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-list,.dynamic-view-builder__source-config-list{display:flex;flex-direction:column;flex:1 1 auto;gap:.75rem;width:100%;min-height:0;overflow:auto}.dynamic-view-builder__field-config-row{display:grid;grid-template-columns:minmax(13rem,1.1fr) minmax(0,1.9fr);gap:.9rem;align-items:start;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__source-config-row{display:grid;grid-template-columns:minmax(13rem,1fr) minmax(0,1.35fr);gap:.9rem;align-items:center;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__field-config-main,.dynamic-view-builder__source-config-main{display:flex;flex-direction:column;gap:.45rem;min-width:0}.dynamic-view-builder__field-config-title{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__field-config-function{display:inline-flex;align-items:center;gap:.45rem;flex-wrap:wrap}.dynamic-view-builder__field-config-controls{display:grid;grid-template-columns:minmax(0,1fr) minmax(7rem,8rem) auto auto;gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__source-config-controls{display:grid;grid-template-columns:minmax(0,1fr);gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__field-config-controls--function{grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto}.dynamic-view-builder__field-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(10rem,11rem);gap:.75rem 1rem;align-items:start}.dynamic-view-builder__field-form--balanced{grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr)}.dynamic-view-builder__field-width{display:flex;flex-direction:column;gap:.35rem;min-width:0}.dynamic-view-builder__between{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem}.dynamic-view-builder__row-chip{display:inline-flex;align-items:center;padding:.14rem .45rem;border-radius:999px;font-size:.74rem;font-weight:600;line-height:1.2}.dynamic-view-builder__row-chip--operator{background:#eef4fb;color:#1b5cff}.dynamic-view-builder__row-chip--value{background:#f4f7fa;color:#5d7084}.dynamic-view-builder__row-chip--optional{background:#f2f7f3;color:#1f8a52}.dynamic-view-builder__row-chip--domain{background:#eef4fb;color:#425466}.dynamic-view-builder__field-drop-indicator{display:inline-flex;align-self:stretch;width:.2rem;min-height:2.2rem;border-radius:999px;background:#1b5cff;box-shadow:0 0 0 3px #1b5cff24;flex:0 0 auto}@media (max-width: 1120px){.dynamic-view-builder__workspace--split{grid-template-columns:1fr;grid-template-areas:\"builder\" \"preview\"}.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{justify-items:stretch}.dynamic-view-builder__sections--split{padding-right:0}}@media (max-width: 900px){.dynamic-view-builder__field-form,.dynamic-view-builder__field-form--balanced,.dynamic-view-builder__field-config-toolbar,.dynamic-view-builder__field-config-row,.dynamic-view-builder__source-config-row,.dynamic-view-builder__field-config-controls,.dynamic-view-builder__source-config-controls,.dynamic-view-builder__field-config-controls--function{grid-template-columns:1fr}.dynamic-view-builder__section-row{flex-direction:column}.dynamic-view-builder__section--half,.dynamic-view-builder__section--compact,.dynamic-view-builder__section--fluid{width:100%}.dynamic-view-builder__toolbar,.dynamic-view-builder__section-head,.dynamic-view-builder__row,.dynamic-view-builder__footer,.dynamic-view-builder__modal-footer,.dynamic-view-builder__filter-toolbar,.dynamic-view-builder__field-selection-toolbar{flex-direction:column;align-items:stretch}.dynamic-view-builder__toolbar-actions,.dynamic-view-builder__section-actions,.dynamic-view-builder__row-actions{justify-content:flex-start}.dynamic-view-builder__alias-field{min-inline-size:6rem;max-inline-size:100%}.dynamic-view-builder__modal-grid,.dynamic-view-builder__modal-grid--filter,.dynamic-view-builder__modal-grid--filter-controls,.dynamic-view-builder__filter-modal,.dynamic-view-builder__filter-summary,.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid,.dynamic-view-builder__between,.dynamic-view-builder__join-modal-top{grid-template-columns:1fr}.dynamic-view-builder__row{min-inline-size:100%}}:host ::ng-deep .sdc-modal__content{display:flex;flex-direction:column;min-height:0;overflow:hidden}:host ::ng-deep .sdc-modal__content>.dynamic-view-builder__modal-shell{flex:1 1 auto;min-height:0}@media (max-width: 768px){.dynamic-view-builder__selection-head,.dynamic-view-builder__selection-row{grid-template-columns:1fr}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{justify-content:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: ButtonComponent, selector: "sdc-button", inputs: ["id", "label", "ariaLabel", "disabled", "width", "priority", "size", "type", "icon", "rightIcon", "auxiliary", "caret", "tooltip", "animation", "slide", "styleClass", "badge", "menuOptions", "menuContext", "model"], outputs: ["clicked"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: CodeEditorComponent, selector: "sdc-code-editor", inputs: ["sql", "height", "width", "showCopy", "customHeaderItems", "activeHeaderKey", "readOnly", "language", "schema"], outputs: ["headerSelect", "onCopy", "languageChange", "domainFilterClick"] }, { kind: "component", type: ComboboxComponent, selector: "sdc-combobox", inputs: ["multiple", "appendTo", "zIndex", "options", "overrideChipMessage", "maxSelectedLabels", "showClear", "iconSelector", "showIconClass", "infoTooltip", "infoTooltipPosition", "infoTooltipEvent"], outputs: ["onSelectedItem"] }, { kind: "component", type: InfoSignComponent, selector: "sdc-info-sign", inputs: ["label", "labelParams", "tooltip", "tooltipParams", "iconClass", "iconAriaLabel", "tooltipPosition", "tooltipEvent", "inline"] }, { kind: "component", type: ModalComponent, selector: "sdc-modal", inputs: ["footerButtons", "header", "height", "maximizable", "maximize", "resizable", "responsive", "width", "zIndex", "closable", "styleClass", "appendToBody", "visible"], outputs: ["hidden", "visibleChange"] }, { kind: "component", type: PicklistComponent, selector: "sdc-picklist", inputs: ["items", "selectedIds", "idKey", "titleKey", "subtitleKey", "iconClass", "selectionIconClass", "placeholder", "emptyTitle", "emptyText", "resultsCounterSingularLabel", "resultsCounterPluralLabel", "filterFields", "first", "rows", "rowsPerPageOptions", "maxVisibleSelectedItems", "showPaginator", "showRowsPerPageOptions", "showSelectionCounter", "showResultsCounter", "showItemIcon", "autoResize", "autoResizeMinRows", "autoResizeMaxRows", "autoResizeItemHeight", "autoResizeViewportOffset", "loading"], outputs: ["pageChange", "selectedIdsChange"] }, { kind: "component", type: SelectButtonComponent, selector: "sdc-select-button", inputs: ["items", "multiple", "compareWith"], outputs: ["itemSelected", "itemClicked"] }, { kind: "component", type: TextareaComponent, selector: "sdc-textarea", inputs: ["infoTooltip", "infoTooltipPosition", "infoTooltipEvent", "rows", "autoResize"] }, { kind: "component", type: TextboxComponent, selector: "sdc-textbox", inputs: ["infoTooltip", "infoTooltipPosition", "infoTooltipEvent"] }, { kind: "component", type: TimelineComponent, selector: "sdc-timeline", inputs: ["items", "activeIndex", "orientation", "interactive", "responsive", "showDescriptions", "ariaLabel", "ariaLabelParams"], outputs: ["stepSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
2770
|
+
}
|
|
2771
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VisualSqlEditorComponent, decorators: [{
|
|
2772
|
+
type: Component,
|
|
2773
|
+
args: [{ selector: "sdc-visual-sql-editor", standalone: true, imports: [
|
|
2774
|
+
FormsModule,
|
|
2775
|
+
TranslateModule,
|
|
2776
|
+
ButtonComponent,
|
|
2777
|
+
CheckboxComponent,
|
|
2778
|
+
CodeEditorComponent,
|
|
2779
|
+
ComboboxComponent,
|
|
2780
|
+
InfoSignComponent,
|
|
2781
|
+
ModalComponent,
|
|
2782
|
+
PicklistComponent,
|
|
2783
|
+
SelectButtonComponent,
|
|
2784
|
+
TableComponent,
|
|
2785
|
+
TextareaComponent,
|
|
2786
|
+
TextboxComponent,
|
|
2787
|
+
TimelineComponent
|
|
2788
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dynamic-view-builder\" [attr.aria-busy]=\"loading\">\n <div class=\"dynamic-view-builder__toolbar\">\n <div class=\"dynamic-view-builder__toolbar-copy\">\n <div class=\"dynamic-view-builder__title\">\n {{ config.metadata.title }}\n </div>\n <div class=\"dynamic-view-builder__subtitle\">\n {{ config.metadata.description }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__toolbar-actions\">\n <span class=\"dynamic-view-builder__toolbar-label\">\n {{ (config.translationPrefix + '.fields.layoutMode') | translate }}\n </span>\n <sdc-select-button\n [items]=\"layoutModeItems\"\n [ngModel]=\"selectedLayoutModeItems\"\n (ngModelChange)=\"onLayoutModeChange($event)\"\n ></sdc-select-button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__preview-toggle\"\n (click)=\"togglePreview()\"\n [attr.aria-pressed]=\"previewVisible\"\n [title]=\"previewToggleLabel\"\n [attr.aria-label]=\"previewToggleLabel\"\n >\n <i\n [class]=\"previewVisible ? 'fas fa-eye-slash' : 'fas fa-eye'\"\n aria-hidden=\"true\"\n ></i>\n {{ previewToggleLabel }}\n </button>\n </div>\n </div>\n\n @if (selectionModalVisible) {\n <sdc-modal\n [visible]=\"selectionModalVisible\"\n (visibleChange)=\"$event ? (selectionModalVisible = true) : closeSelectionModal()\"\n [header]=\"selectionModalTitle\"\n [width]=\"modalDimensions.selection.width\"\n [height]=\"modalDimensions.selection.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n @if (selectionModalMode === 'tables') {\n <div class=\"dynamic-view-builder__modal-inline-surface\">\n <sdc-textbox\n [label]=\"modalSearchLabel\"\n [placeholder]=\"modalSearchPlaceholder\"\n [ngModel]=\"selectionModalSearch\"\n (ngModelChange)=\"selectionModalSearch = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__selection-table\n dynamic-view-builder__selection-table--chooser\n dynamic-view-builder__selection-table--fluid\"\n >\n <div class=\"dynamic-view-builder__selection-head\">\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalNameLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col\">\n {{ modalTypeLabel }}\n </div>\n <div class=\"dynamic-view-builder__selection-col dynamic-view-builder__selection-col--select\">\n {{ modalSelectLabel }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__selection-body\">\n @for (row of selectionModalRows; track trackById($index, row)) {\n <div\n class=\"dynamic-view-builder__selection-row\"\n [class.dynamic-view-builder__selection-row--selected]=\"row.selected\"\n [attr.role]=\"'button'\"\n [attr.tabindex]=\"row.disabled ? -1 : 0\"\n [attr.aria-pressed]=\"row.selected\"\n [attr.aria-disabled]=\"row.disabled\"\n (click)=\"toggleSelectionModalRow(row.id)\"\n (keydown)=\"onSelectableRowKeydown($event)\"\n >\n <div class=\"dynamic-view-builder__selection-cell\">\n @if (row.tableLabel) {\n <span class=\"dynamic-view-builder__selection-path\">\n @if (row.pathType === 'table') {\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-db\">{{ row.dbLabel }}</span>\n }\n @if (row.dbLabel) {\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n }\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n } @else {\n <span class=\"dynamic-view-builder__selection-table-label\">{{ row.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ row.name }}</span>\n }\n </span>\n } @else {\n {{ row.name }}\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--meta\">\n <span>{{ row.meta }}</span>\n @if (row.note) {\n <span class=\"dynamic-view-builder__selection-note\">\n {{ row.note }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__selection-cell dynamic-view-builder__selection-cell--select\">\n <span\n class=\"dynamic-view-builder__selection-marker\"\n [class.dynamic-view-builder__selection-marker--selected]=\"row.selected\"\n aria-hidden=\"true\"\n >\n <i class=\"fas fa-check\"></i>\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"selectionModalPicklistItems\"\n [selectedIds]=\"selectionModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSelectionModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSelectionModal()\"\n (keydown.enter)=\"closeSelectionModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.confirmSelection') | translate\"\n (click)=\"confirmSelectionModal()\"\n (keydown.enter)=\"confirmSelectionModal()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sourceModalVisible) {\n <sdc-modal\n [visible]=\"sourceModalVisible\"\n (visibleChange)=\"$event ? (sourceModalVisible = true) : closeSourceModal()\"\n [header]=\"sourceModalTitle\"\n [width]=\"modalDimensions.source.width\"\n [height]=\"modalDimensions.source.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"sourceModalTimelineItems\"\n [activeIndex]=\"sourceModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"sourceModalTimelineAriaLabel\"\n (stepSelect)=\"onSourceModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (sourceModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sourceModalPicklistItems\"\n [selectedIds]=\"sourceModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSourceModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__source-config-list\">\n @for (item of sourceModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__source-config-row\">\n <div class=\"dynamic-view-builder__source-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.dbLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.tableLabel }}</span>\n </div>\n </div>\n <div class=\"dynamic-view-builder__source-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onSourceModalAliasChange(item.table, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSourceModal()\"\n (keydown.enter)=\"closeSourceModal()\"\n ></sdc-button>\n @if (sourceModalSelectionStepActive && sourceModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceSourceModalStep()\"\n (keydown.enter)=\"advanceSourceModalStep()\"\n ></sdc-button>\n }\n @if (sourceModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!sourceModalCanProceed\"\n (click)=\"saveSourceModal()\"\n (keydown.enter)=\"saveSourceModal()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (joinModalVisible) {\n <sdc-modal\n [visible]=\"joinModalVisible\"\n (visibleChange)=\"$event ? (joinModalVisible = true) : closeJoinModal()\"\n [header]=\"(config.translationPrefix + '.cards.joins.title') | translate\"\n [width]=\"modalDimensions.join.width\"\n [height]=\"modalDimensions.join.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__join-modal\">\n <div class=\"dynamic-view-builder__join-modal-top\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinSourceSummary }}</div>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--compact\n dynamic-view-builder__modal-card\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"joinDraft.operator\"\n (ngModelChange)=\"joinDraft.operator = $event\"\n [options]=\"joinOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n </div>\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-card\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >{{ joinTargetSummary }}</div>\n </div>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--fit\">\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.left') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinSourcePicklistItems\"\n [selectedIds]=\"joinSourceSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinSourceSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n <div\n class=\"dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__modal-card dynamic-view-builder__picklist-shell\"\n >\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.right') | translate }}\n </div>\n <sdc-picklist\n [items]=\"joinTargetPicklistItems\"\n [selectedIds]=\"joinTargetSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onJoinTargetSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeJoinModal()\"\n (keydown.enter)=\"closeJoinModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveJoin\"\n (click)=\"saveJoin()\"\n (keydown.enter)=\"saveJoin()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (sortModalVisible) {\n <sdc-modal\n [visible]=\"sortModalVisible\"\n (visibleChange)=\"$event ? (sortModalVisible = true) : closeSortModal()\"\n [header]=\"sortModalTitle\"\n [width]=\"modalDimensions.sort.width\"\n [height]=\"modalDimensions.sort.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__sort-modal\">\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--full\n dynamic-view-builder__sort-direction-field\"\n >\n <div class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.direction') | translate }}\n </div>\n <sdc-select-button\n class=\"dynamic-view-builder__sort-direction\"\n [items]=\"sortDirectionItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedSortDirectionItems\"\n (ngModelChange)=\"onSortDirectionChange($event)\"\n ></sdc-select-button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-picker dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow dynamic-view-builder__picklist-shell\n dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"sortPicklistItems\"\n [selectedIds]=\"sortSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [autoResize]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onSortSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeSortModal()\"\n (keydown.enter)=\"closeSortModal()\"\n ></sdc-button>\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveSort\"\n (click)=\"saveSort()\"\n (keydown.enter)=\"saveSort()\"\n ></sdc-button>\n </div>\n </sdc-modal>\n }\n\n @if (filterModalVisible) {\n <sdc-modal\n [visible]=\"filterModalVisible\"\n (visibleChange)=\"$event ? (filterModalVisible = true) : closeFilterModal()\"\n [header]=\"filterModalTitle\"\n [width]=\"modalDimensions.filter.width\"\n [height]=\"modalDimensions.filter.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__filter-modal\">\n <sdc-timeline\n [items]=\"filterModalTimelineItems\"\n [activeIndex]=\"filterModalReviewStepActive ? 2 : (filterModalConfigurationStepActive ? 1 : 0)\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"filterModalTimelineAriaLabel\"\n (stepSelect)=\"onFilterModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (filterModalSelectionStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-base-selector\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.select.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.mode'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-row\">\n <div class=\"dynamic-view-builder__filter-mode-copy\">\n {{ (config.translationPrefix + '.modals.filter.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-mode-selector\">\n <sdc-select-button\n [items]=\"filterModeItems\"\n appearance=\"soft\"\n [ngModel]=\"selectedFilterModeItems\"\n (ngModelChange)=\"onFilterModeChange($event[0]?.value || 'condition')\"\n ></sdc-select-button>\n </div>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-picker\n dynamic-view-builder__modal-picker--filter\n dynamic-view-builder__modal-picker--stretch\n dynamic-view-builder__selection-flow\n dynamic-view-builder__modal-stage-body\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell\"\n >\n <sdc-picklist\n [items]=\"filterModalPicklistItems\"\n [selectedIds]=\"filterModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [maxVisibleSelectedItems]=\"1\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFilterModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-domain-intro\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.filters.domainLabel') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-grid\">\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterDomainExpressionTooltip }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-item\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.connector') | translate }}\n </div>\n <div class=\"dynamic-view-builder__modal-summary-value\">\n {{ filterConnectorTooltip }}\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n @if (filterModalConfigurationStepActive) {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('select')\"\n >\n {{ filterBackToSelectionLabel }}\n </button>\n </div>\n @if (filterModalMode === 'condition') {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.modals.filter.steps.configure.title') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.filters.tooltips.configure'\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.operator'\"\n [ngModel]=\"filterDraft.operator\"\n (ngModelChange)=\"filterDraft.operator = $event; onFilterOperatorChange()\"\n [options]=\"filterOperatorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n [disabled]=\"!filterDraft.column\"\n [infoTooltip]=\"filterOperatorTooltip\"\n ></sdc-combobox>\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.valueType'\"\n [ngModel]=\"filterDraft.valueType\"\n (ngModelChange)=\"filterDraft.valueType = $event; onFilterValueTypeChange()\"\n [options]=\"valueTypeOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterValueTypeDisabled\"\n [infoTooltip]=\"filterValueTypeTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--value\"\n >\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--single\">\n @if (showFilterBooleanCombobox) {\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n [options]=\"booleanValueOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n }\n @if (showFilterValueTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.value'\"\n [ngModel]=\"filterDraft.value\"\n (ngModelChange)=\"filterDraft.value = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterValuesTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.values'\"\n [ngModel]=\"filterDraft.valuesText\"\n (ngModelChange)=\"filterDraft.valuesText = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n @if (showFilterBetweenInputs) {\n <div class=\"dynamic-view-builder__between dynamic-view-builder__modal-grid-column-full\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueStart'\"\n [ngModel]=\"filterDraft.betweenStart\"\n (ngModelChange)=\"filterDraft.betweenStart = $event\"\n width=\"100%\"\n ></sdc-textbox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.valueEnd'\"\n [ngModel]=\"filterDraft.betweenEnd\"\n (ngModelChange)=\"filterDraft.betweenEnd = $event\"\n width=\"100%\"\n ></sdc-textbox>\n </div>\n }\n @if (showFilterParameterTextbox) {\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.parameterName'\"\n [ngModel]=\"filterDraft.parameterName\"\n (ngModelChange)=\"filterDraft.parameterName = $event\"\n width=\"100%\"\n ></sdc-textbox>\n }\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-config-section\">\n <div class=\"dynamic-view-builder__modal-grid dynamic-view-builder__modal-grid--filter-controls\">\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.connector'\"\n [ngModel]=\"filterDraft.connector\"\n (ngModelChange)=\"filterDraft.connector = $event\"\n [options]=\"filterConnectorOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n [disabled]=\"filterConnectorDisabled\"\n [infoTooltip]=\"filterConnectorTooltip\"\n width=\"100%\"\n ></sdc-combobox>\n <div class=\"dynamic-view-builder__filter-optional\">\n <sdc-checkbox\n [label]=\"config.translationPrefix + '.states.optional'\"\n [ngModel]=\"filterDraft.optional\"\n (ngModelChange)=\"filterDraft.optional = $event\"\n ></sdc-checkbox>\n <sdc-info-sign\n [tooltip]=\"filterOptionalTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n </div>\n </div>\n <div\n class=\"dynamic-view-builder__filter-config-section\n dynamic-view-builder__filter-config-section--domain\"\n >\n <div class=\"dynamic-view-builder__filter-heading\">\n <div class=\"dynamic-view-builder__modal-panel-title\">\n {{ (config.translationPrefix + '.fields.domainExpression') | translate }}\n </div>\n <sdc-info-sign\n [tooltip]=\"filterDomainExpressionTooltip\"\n [tooltipPosition]=\"'left'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__filter-domain-hint\">\n {{ filterDomainExpressionTooltip }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterDraft.domainExpression\"\n (ngModelChange)=\"filterDraft.domainExpression = $event\"\n width=\"100%\"\n [rows]=\"10\"\n ></sdc-textarea>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"dynamic-view-builder__filter-step\">\n <div class=\"dynamic-view-builder__filter-toolbar\">\n <div class=\"dynamic-view-builder__modal-summary dynamic-view-builder__modal-summary--filter\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.modals.filter.steps.review.title') | translate }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\n dynamic-view-builder__modal-summary-value--path\"\n >\n {{ filterConfigurationSummaryLabel }}\n </div>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"goToFilterModalStep('configure')\"\n >\n {{ filterBackToConfigurationLabel }}\n </button>\n </div>\n <div\n class=\"dynamic-view-builder__modal-field\n dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__modal-card\n dynamic-view-builder__modal-card--section\n dynamic-view-builder__filter-config-card\"\n >\n <div class=\"dynamic-view-builder__filter-review-grid\">\n @for (item of filterReviewItems; track trackById($index, item)) {\n <div\n class=\"dynamic-view-builder__filter-review-item\"\n >\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ item.label }}\n </div>\n <div\n class=\"dynamic-view-builder__modal-summary-value\"\n [class.dynamic-view-builder__modal-summary-value--path]=\"item.emphasize === 'path'\"\n [class.dynamic-view-builder__filter-review-code]=\"item.emphasize === 'code'\"\n >\n {{ item.value }}\n </div>\n </div>\n }\n </div>\n <div class=\"dynamic-view-builder__filter-review-preview\">\n <div class=\"dynamic-view-builder__modal-summary-label\">\n {{ (config.translationPrefix + '.fields.sqlPreview') | translate }}\n </div>\n <sdc-textarea\n [label]=\"''\"\n [ngModel]=\"filterReviewPreviewLabel\"\n width=\"100%\"\n [rows]=\"6\"\n [disabled]=\"true\"\n ></sdc-textarea>\n </div>\n </div>\n </div>\n }\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFilterModal()\"\n (keydown.enter)=\"closeFilterModal()\"\n ></sdc-button>\n @if (filterModalSelectionStepActive) {\n <sdc-button\n [label]=\"filterModalConfigureActionLabel\"\n [disabled]=\"!filterModalCanProceed\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalConfigurationStepActive) {\n <sdc-button\n [label]=\"filterModalReviewActionLabel\"\n [disabled]=\"!filterModalCanReview\"\n (click)=\"advanceFilterModalStep()\"\n (keydown.enter)=\"advanceFilterModalStep()\"\n ></sdc-button>\n }\n @if (filterModalReviewStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFilter\"\n (click)=\"saveFilter()\"\n (keydown.enter)=\"saveFilter()\"\n ></sdc-button>\n }\n </div>\n </sdc-modal>\n }\n\n @if (fieldModalVisible) {\n <sdc-modal\n [visible]=\"fieldModalVisible\"\n (visibleChange)=\"$event ? (fieldModalVisible = true) : closeFieldModal()\"\n [header]=\"fieldModalTitle\"\n [width]=\"modalDimensions.field.width\"\n [height]=\"modalDimensions.field.height\"\n [maximizable]=\"false\"\n [footerButtons]=\"[]\"\n >\n <div class=\"dynamic-view-builder__modal-shell dynamic-view-builder__field-modal\">\n <sdc-timeline\n [items]=\"fieldModalTimelineItems\"\n [activeIndex]=\"fieldModalConfigurationStepActive ? 1 : 0\"\n [interactive]=\"true\"\n [showDescriptions]=\"false\"\n [ariaLabel]=\"fieldModalTimelineAriaLabel\"\n (stepSelect)=\"onFieldModalTimelineStepSelect($event)\"\n ></sdc-timeline>\n @if (fieldModalSelectionStepActive) {\n <div\n class=\"dynamic-view-builder__modal-shell dynamic-view-builder__modal-shell--full\n dynamic-view-builder__selection-flow dynamic-view-builder__modal-stage\"\n >\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__picklist-shell dynamic-view-builder__modal-stage-body\"\n >\n <sdc-picklist\n [items]=\"fieldModalPicklistItems\"\n [selectedIds]=\"fieldModalSelectedPicklistIds\"\n idKey=\"id\"\n titleKey=\"title\"\n titlePrefixKey=\"titlePrefix\"\n titleSuffixKey=\"titleSuffix\"\n titlePrefixColorKey=\"titlePrefixColor\"\n titleSuffixColorKey=\"titleSuffixColor\"\n badgeKey=\"badge\"\n badgeColorKey=\"badgeColor\"\n [autoResize]=\"false\"\n [showPaginator]=\"false\"\n [showItemIcon]=\"false\"\n [showSelectionCounter]=\"false\"\n [placeholder]=\"config.translationPrefix + '.modals.searchPlaceholder'\"\n (selectedIdsChange)=\"onFieldModalSelectedIdsChange($event)\"\n ></sdc-picklist>\n </div>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__modal-field dynamic-view-builder__modal-field--stretch\n dynamic-view-builder__field-config-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-toolbar\">\n <div class=\"dynamic-view-builder__field-config-summary\">\n {{ fieldModalConfiguredItems.length }}\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n @if (fieldModalHasSelectableColumns) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"addAnotherFieldFromModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n </div>\n <div\n class=\"dynamic-view-builder__modal-card dynamic-view-builder__modal-card--section\n dynamic-view-builder__modal-list-shell\"\n >\n <div class=\"dynamic-view-builder__field-config-list\">\n @for (item of fieldModalConfiguredItems; track trackById($index, item)) {\n <div class=\"dynamic-view-builder__field-config-row\">\n <div class=\"dynamic-view-builder__field-config-main\">\n <div class=\"dynamic-view-builder__field-config-title\">\n <span class=\"dynamic-view-builder__selection-table-label\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__selection-separator\">.</span>\n <span class=\"dynamic-view-builder__selection-accent\">{{ item.fieldLabel }}</span>\n </div>\n @if (item.functionName && !isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-function\">\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n }\n </div>\n @if (!isFieldFunctionEditing(item.column)) {\n <div class=\"dynamic-view-builder__field-config-controls\">\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"item.alias\"\n (ngModelChange)=\"onFieldModalAliasChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"24\"\n ></sdc-textbox>\n <div class=\"dynamic-view-builder__field-width\">\n <div class=\"dynamic-view-builder__modal-label-row\">\n <span class=\"dynamic-view-builder__modal-label\">\n {{ (config.translationPrefix + '.fields.width') | translate }}\n </span>\n <sdc-info-sign\n [tooltip]=\"config.translationPrefix + '.messages.fieldWidthInfo'\"\n ></sdc-info-sign>\n </div>\n <sdc-textbox\n [label]=\"''\"\n [ngModel]=\"item.width\"\n (ngModelChange)=\"onFieldModalWidthChange(item.column, $event)\"\n width=\"100%\"\n [maxlength]=\"12\"\n placeholder=\"160\"\n ></sdc-textbox>\n </div>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\"\n (click)=\"startFieldFunctionEdit(item.column)\"\n >\n {{ item.functionName\n ? ((config.translationPrefix + '.actions.configureField') | translate)\n : ((config.translationPrefix + '.fields.functionName') | translate) }}\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFieldModalDraft(item.column)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n } @else {\n <div\n class=\"dynamic-view-builder__field-config-controls\n dynamic-view-builder__field-config-controls--function\"\n >\n <sdc-combobox\n [label]=\"config.translationPrefix + '.fields.functionName'\"\n [ngModel]=\"fieldFunctionDraft.functionName\"\n (ngModelChange)=\"onFieldFunctionDraftNameChange($event)\"\n [options]=\"fieldModalFunctionOptions\"\n [appendTo]=\"overlayAppendTarget\"\n [zIndex]=\"overlayZIndex\"\n width=\"100%\"\n ></sdc-combobox>\n <sdc-textbox\n [label]=\"config.translationPrefix + '.fields.alias'\"\n [ngModel]=\"fieldFunctionDraft.functionAlias\"\n (ngModelChange)=\"fieldFunctionDraft.functionAlias = $event\"\n width=\"100%\"\n [maxlength]=\"24\"\n [disabled]=\"!fieldFunctionDraft.functionName\"\n ></sdc-textbox>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--danger\"\n [title]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n (click)=\"cancelFieldFunctionEdit()\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\n dynamic-view-builder__icon-action--active\"\n [title]=\"(config.translationPrefix + '.actions.save') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.save') | translate\"\n (click)=\"saveFieldFunctionEdit()\"\n >\n <i class=\"fas fa-check\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <div footer class=\"dynamic-view-builder__modal-footer dynamic-view-builder__modal-footer--between\">\n <div class=\"dynamic-view-builder__modal-footer-group dynamic-view-builder__modal-footer-group--start\">\n @if (fieldModalSelectionStepActive && fieldModalCanSelectAll) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--primary\"\n (click)=\"selectAllFieldModalColumns()\"\n >\n {{ (config.translationPrefix + '.actions.selectAllColumns') | translate }}\n </button>\n }\n </div>\n <div class=\"dynamic-view-builder__modal-footer-group\">\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.cancel') | translate\"\n priority=\"secondary\"\n (click)=\"closeFieldModal()\"\n (keydown.enter)=\"closeFieldModal()\"\n ></sdc-button>\n @if (fieldModalSelectionStepActive && fieldModalCanProceed) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.nextStep') | translate\"\n (click)=\"advanceFieldModalStep()\"\n (keydown.enter)=\"advanceFieldModalStep()\"\n ></sdc-button>\n }\n @if (fieldModalConfigurationStepActive) {\n <sdc-button\n [label]=\"(config.translationPrefix + '.actions.save') | translate\"\n [disabled]=\"!canSaveFieldModal\"\n (click)=\"saveField()\"\n (keydown.enter)=\"saveField()\"\n ></sdc-button>\n }\n </div>\n </div>\n </sdc-modal>\n }\n\n <div\n class=\"dynamic-view-builder__workspace\"\n [class.dynamic-view-builder__workspace--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__workspace--split]=\"layoutMode === 'split'\"\n [class.dynamic-view-builder__workspace--preview-hidden]=\"!previewVisible\"\n >\n <div class=\"dynamic-view-builder__builder-area\">\n <div\n #sectionsContainer\n class=\"dynamic-view-builder__sections\"\n [class.dynamic-view-builder__sections--stacked]=\"layoutMode === 'stacked'\"\n [class.dynamic-view-builder__sections--split]=\"layoutMode === 'split'\"\n >\n <section\n #builderSection\n data-section-id=\"tables\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sources.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenSourceConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureAliases') | translate\"\n (click)=\"openSourceConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sourceItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSources()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sourceItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectTables') | translate\"\n (click)=\"openSourceModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectTables') | translate }}\n </button>\n }\n @if (sourceItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (source of sourceItems; track trackById(i, source); let i = $index) {\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--source\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-table-group\">\n <span class=\"dynamic-view-builder__row-db\">{{ source.dbLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-table\">\n {{ source.tableLabel }}\n </span>\n </span>\n @if (source.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ source.alias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSource(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"joins\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.joins.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canConfigureJoins\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !joinItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearJoins()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!canConfigureJoins) {\n <div class=\"dynamic-view-builder__info-row\">\n {{ (config.translationPrefix + '.messages.joinRequiresTwoTables') | translate }}\n </div>\n }\n @if (canConfigureJoins && !joinItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addJoin') | translate\"\n (click)=\"openJoinModal()\"\n >\n {{ (config.translationPrefix + '.actions.addJoin') | translate }}\n </button>\n }\n @if (joinItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of joinItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.sourceTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.sourceField }}</span>\n </span>\n <span class=\"dynamic-view-builder__join-operator\">{{ item.operator }}</span>\n <span class=\"dynamic-view-builder__join-arrow\" aria-hidden=\"true\">\n <i class=\"fas fa-long-arrow-alt-right\"></i>\n </span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.targetTable }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.targetField }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openJoinModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeJoin(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n <section\n #builderSection\n data-section-id=\"groupBy\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.groupBy.title') | translate }}\n </div>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupBySelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !groupByItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearGroupBy()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!groupByItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openSelectionModal('groupBy')\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (groupByItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of groupByItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeGroupBy(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n </div>\n\n <section\n #builderSection\n data-section-id=\"fields\"\n class=\"dynamic-view-builder__section\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-heading\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.fields.title') | translate }}\n </div>\n <sdc-info-sign\n class=\"dynamic-view-builder__hint\"\n [tooltip]=\"'Voc\u00EA pode ordenar a sequ\u00EAncia dos campos arrastando e soltando.'\"\n ></sdc-info-sign>\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldSelectableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.selectColumns') | translate\"\n (click)=\"openFieldModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !canOpenFieldConfiguration\"\n [title]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.configureField') | translate\"\n (click)=\"openFieldConfigurationModal()\"\n >\n <i class=\"fas fa-cog\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !fieldItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFields()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!fieldItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n (click)=\"openFieldModal()\"\n >\n {{ (config.translationPrefix + '.actions.selectColumns') | translate }}\n </button>\n }\n @if (fieldItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of fieldItems; track trackById(i, item); let i = $index) {\n @if (isFieldDropIndicatorVisible(i)) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n <div\n class=\"dynamic-view-builder__row dynamic-view-builder__row--draggable\"\n [class.dynamic-view-builder__row--drag-origin]=\"draggingFieldIndex === item.sourceIndex\"\n [draggable]=\"!isReadonly\"\n (dragstart)=\"onFieldDragStart(item.sourceIndex)\"\n (dragover)=\"onFieldDragOver($event, i)\"\n (drop)=\"onFieldDrop()\"\n (dragend)=\"onFieldDragEnd()\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n <span class=\"dynamic-view-builder__row-order\">{{ item.orderLabel }}</span>\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n @if (item.alias) {\n <span class=\"dynamic-view-builder__row-meta\">\n Alias {{ item.alias }}\n </span>\n }\n @if (item.width) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.width }}\n </span>\n }\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n @if (item.functionAlias) {\n <span class=\"dynamic-view-builder__row-meta\">\n {{ item.functionAlias }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeField(item.sourceIndex)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n @if (isFieldDropIndicatorAtEndVisible()) {\n <div\n class=\"dynamic-view-builder__field-drop-indicator\"\n aria-hidden=\"true\"\n ></div>\n }\n </div>\n }\n </section>\n\n <div class=\"dynamic-view-builder__section-row\">\n <section\n #builderSection\n data-section-id=\"sorting\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--compact\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.sorting.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortSelectableItems.length\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !sortItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearSorting()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!sortItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addSort') | translate\"\n (click)=\"openSortModal()\"\n >\n {{ (config.translationPrefix + '.actions.addSort') | translate }}\n </button>\n }\n @if (sortItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of sortItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (item.functionName) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.functionLabel }}\n </span>\n }\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--operator\">\n {{ item.direction }}\n </span>\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openSortModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeSort(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n\n <section\n #builderSection\n data-section-id=\"filters\"\n class=\"dynamic-view-builder__section dynamic-view-builder__section--fluid\"\n >\n <div class=\"dynamic-view-builder__section-head\">\n <div class=\"dynamic-view-builder__section-label\">\n {{ (config.translationPrefix + '.cards.filters.title') | translate }}\n </div>\n <div class=\"dynamic-view-builder__section-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link\n dynamic-view-builder__action-link--primary\n dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !availableColumns.length\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n <i class=\"fas fa-plus\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__action-link dynamic-view-builder__action-link--icon\"\n [disabled]=\"isReadonly || !filterItems.length\"\n [title]=\"(config.translationPrefix + '.actions.clear') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.clear') | translate\"\n (click)=\"clearFilters()\"\n >\n <i class=\"fas fa-trash-alt\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n @if (!filterItems.length) {\n <button\n type=\"button\"\n class=\"dynamic-view-builder__empty-row\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.addFilter') | translate\"\n (click)=\"openFilterModal()\"\n >\n {{ (config.translationPrefix + '.actions.addFilter') | translate }}\n </button>\n }\n @if (filterItems.length) {\n <div class=\"dynamic-view-builder__stack dynamic-view-builder__stack--wrap\">\n @for (item of filterItems; track trackById(i, item); let i = $index) {\n <div\n class=\"dynamic-view-builder__row\"\n >\n <div class=\"dynamic-view-builder__row-main\">\n @if (!item.isDomain) {\n <span class=\"dynamic-view-builder__row-path\">\n <span class=\"dynamic-view-builder__row-table\">{{ item.tableLabel }}</span>\n <span class=\"dynamic-view-builder__row-dot\">.</span>\n <span class=\"dynamic-view-builder__row-field\">{{ item.fieldLabel }}</span>\n </span>\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--operator\"\n >{{ item.operatorLabel }}</span>\n } @else {\n <span\n class=\"dynamic-view-builder__row-chip\n dynamic-view-builder__row-chip--domain\"\n >{{ item.tableLabel }}</span>\n }\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--value\">\n {{ item.subtitle }}\n </span>\n @if (item.optional) {\n <span class=\"dynamic-view-builder__row-chip dynamic-view-builder__row-chip--optional\">\n {{ (config.translationPrefix + '.states.optional') | translate }}\n </span>\n }\n </div>\n <div class=\"dynamic-view-builder__row-actions\">\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.edit') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.edit') | translate\"\n (click)=\"openFilterModal(i)\"\n >\n <i class=\"fas fa-pen\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"dynamic-view-builder__icon-action dynamic-view-builder__icon-action--danger\"\n [disabled]=\"isReadonly\"\n [title]=\"(config.translationPrefix + '.actions.remove') | translate\"\n [attr.aria-label]=\"(config.translationPrefix + '.actions.remove') | translate\"\n (click)=\"removeFilter(i)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n }\n </section>\n </div>\n\n @for (arrow of flowArrows; track trackByArrow($index, arrow)) {\n <div\n class=\"dynamic-view-builder__flow-arrow\"\n [class.dynamic-view-builder__flow-arrow--right]=\"arrow.direction === 'right'\"\n [class.dynamic-view-builder__flow-arrow--down]=\"arrow.direction === 'down'\"\n [style.left.px]=\"arrow.left\"\n [style.top.px]=\"arrow.top\"\n aria-hidden=\"true\"\n >\n <i\n [class]=\"arrow.direction === 'right'\n ? 'fas fa-angle-double-right'\n : 'fas fa-angle-double-down'\"\n ></i>\n </div>\n }\n </div>\n </div>\n\n @if (previewVisible) {\n <aside class=\"dynamic-view-builder__preview-area\">\n <div\n class=\"dynamic-view-builder__preview\"\n [style.height]=\"sqlPreviewPanelHeight\"\n >\n <div class=\"dynamic-view-builder__preview-header\">\n <div class=\"dynamic-view-builder__preview-title\">SQL Preview</div>\n <div class=\"dynamic-view-builder__preview-subtitle\">\n Consulta gerada automaticamente a partir da configuracao atual.\n </div>\n </div>\n <div class=\"dynamic-view-builder__preview-body\">\n <sdc-code-editor\n [sql]=\"sqlPreview\"\n language=\"sql\"\n [readOnly]=\"true\"\n [showCopy]=\"true\"\n [height]=\"sqlPreviewHeight\"\n ></sdc-code-editor>\n </div>\n </div>\n </aside>\n }\n </div>\n</div>\n", styles: [":host{display:block}::ng-deep .sdc-loading-state{overflow:auto!important}.dynamic-view-builder{display:flex;flex-direction:column;gap:.75rem;color:#243342}.dynamic-view-builder__toolbar{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:.25rem 0}.dynamic-view-builder__toolbar-copy{min-width:0}.dynamic-view-builder__title{font-size:1rem;font-weight:700;line-height:1.2;color:#243342}.dynamic-view-builder__subtitle{margin-top:.2rem;color:#70839a;font-size:.875rem;line-height:1.35}.dynamic-view-builder__toolbar-actions{display:flex;align-items:center;gap:.625rem;flex-shrink:0;flex-wrap:wrap}.dynamic-view-builder__toolbar-label{color:#70839a;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__workspace{display:grid;gap:.875rem;min-width:0}.dynamic-view-builder__workspace--preview-hidden,.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{grid-template-columns:1fr;grid-template-areas:\"builder\"}.dynamic-view-builder__workspace--stacked{grid-template-columns:1fr;grid-template-areas:\"preview\" \"builder\"}.dynamic-view-builder__workspace--split{grid-template-columns:minmax(0,62fr) minmax(20rem,38fr);grid-template-areas:\"builder preview\";align-items:start}.dynamic-view-builder__builder-area{grid-area:builder;display:flex;flex-direction:column;gap:.75rem;min-width:0}.dynamic-view-builder__sections{display:flex;flex-direction:column;gap:.5rem;min-width:0;position:relative}.dynamic-view-builder__section{display:flex;flex-direction:column;gap:.4rem;min-width:0;padding:.55rem .65rem;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;min-inline-size:0;max-inline-size:100%;position:relative;width:100%}.dynamic-view-builder__section-row{display:flex;flex-wrap:wrap;align-items:stretch;gap:.5rem;min-width:0}.dynamic-view-builder__section-row>.dynamic-view-builder__section{align-self:stretch}.dynamic-view-builder__section--half{flex:1 1 18rem;width:auto}.dynamic-view-builder__section--compact{flex:0 0 clamp(18rem,30%,22rem);width:auto}.dynamic-view-builder__section--fluid{flex:1 1 26rem;min-inline-size:min(100%,26rem);width:auto}.dynamic-view-builder__flow-arrow{position:absolute;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;border:1px solid #d9e3ed;border-radius:999px;background:#fff;color:#68809a;pointer-events:none;z-index:2;transform:translate(-50%,-50%)}.dynamic-view-builder__flow-arrow i{font-size:.74rem;line-height:1}.dynamic-view-builder__section-head{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem}.dynamic-view-builder__section-heading{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.dynamic-view-builder__section-label{min-width:0;color:#516173;font-size:.78rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase}.dynamic-view-builder__section-actions{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;flex-wrap:wrap;flex-shrink:0}.dynamic-view-builder__hint{display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;padding:0;border:0;background:transparent;color:#8ca0b6;cursor:help}.dynamic-view-builder__hint--legacy{display:none}.dynamic-view-builder__stack{display:flex;gap:.35rem;min-width:0}.dynamic-view-builder__stack--wrap{flex-direction:row;flex-wrap:wrap;align-items:flex-start}.dynamic-view-builder__row,.dynamic-view-builder__empty-row,.dynamic-view-builder__info-row{min-width:0;border:1px solid #e7edf4;border-radius:.4rem;background:#fbfcfe}.dynamic-view-builder__row{display:inline-flex;align-items:stretch;justify-content:space-between;gap:.45rem;padding:.5rem .6rem;inline-size:auto;min-inline-size:min(100%,12rem);max-inline-size:100%;flex:0 1 auto}.dynamic-view-builder__row-main{min-width:0;display:flex;align-items:center;gap:.3rem;flex-wrap:wrap;flex:1 1 auto}.dynamic-view-builder__row-label{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-value{color:#627588;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-separator{color:#b0bcc9;flex-shrink:0}.dynamic-view-builder__row-actions{display:flex;align-items:center;justify-content:flex-end;gap:.2rem;flex-wrap:wrap;flex:0 0 auto}.dynamic-view-builder__row--source{align-items:center;min-inline-size:min(100%,16.5rem);padding-block:.45rem}.dynamic-view-builder__row--source .dynamic-view-builder__row-main{align-items:center;flex-wrap:nowrap;gap:.18rem}.dynamic-view-builder__row-table-group{display:inline-flex;align-items:center;gap:0;min-width:0;flex:0 1 auto}.dynamic-view-builder__row-db{color:#243342;font-weight:700;line-height:1.25;white-space:nowrap}.dynamic-view-builder__row-order{display:inline-flex;align-items:center;justify-content:center;min-width:2rem;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#516173;font-size:.75rem;font-weight:700}.dynamic-view-builder__row-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__row-table{color:#425466;font-weight:500;line-height:1.35}.dynamic-view-builder__row-table--accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__row-dot{color:#8fa1b3;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__row-field{color:#1f8a52;font-weight:700;line-height:1.35;word-break:break-word}.dynamic-view-builder__row-meta{display:inline-flex;align-items:center;padding:.12rem .4rem;border-radius:999px;background:#f0f4f8;color:#627588;font-size:.74rem;line-height:1.2}.dynamic-view-builder__join-operator{display:inline-flex;align-items:center;padding:.1rem .35rem;border-radius:999px;background:#eef3f8;color:#627588;font-size:.73rem;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.dynamic-view-builder__join-arrow{color:#9ab0c6;font-size:.85rem}.dynamic-view-builder__row--draggable{cursor:grab}.dynamic-view-builder__row--drag-origin{opacity:.6;border-color:#b8cae0;background:#f4f8fc}.dynamic-view-builder__row--draggable:active{cursor:grabbing}.dynamic-view-builder__alias-field{flex:0 1 5.4rem;min-inline-size:4.4rem;max-inline-size:5.8rem}.dynamic-view-builder__alias-field :where(.sdc-textbox__label-row){display:none}.dynamic-view-builder__action-link{padding:0;border:0;background:transparent;color:#6d7786;font:inherit;font-size:.82rem;font-weight:600;line-height:1.25;cursor:pointer;transition:color .18s ease;pointer-events:auto;position:relative;z-index:2;text-decoration:none}.dynamic-view-builder__action-link:disabled{opacity:.45;cursor:default}.dynamic-view-builder__action-link:hover:not(:disabled),.dynamic-view-builder__action-link:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__action-link--primary{color:#1b5cff}.dynamic-view-builder__action-link--icon{display:inline-flex;align-items:center;justify-content:center;min-width:1.5rem;min-height:1.5rem}.dynamic-view-builder__action-link--icon i{font-size:.9rem;line-height:1}.dynamic-view-builder__preview-toggle{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;padding:0 .75rem;border:1px solid #dbe3ec;border-radius:999px;background:#f8fafc;color:#425466;font:inherit;font-size:.82rem;font-weight:600;cursor:pointer;transition:border-color .18s ease,background-color .18s ease,color .18s ease}.dynamic-view-builder__preview-toggle:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px}.dynamic-view-builder__preview-toggle:hover:not(:disabled),.dynamic-view-builder__preview-toggle:focus-visible:not(:disabled){border-color:#b9c7d6;background:#eef4fb;color:#1b5cff}.dynamic-view-builder__icon-action{display:inline-flex;align-items:center;justify-content:center;width:1.35rem;height:1.35rem;padding:0;border:0;background:transparent;color:#7b8ea2;cursor:pointer;transition:color .18s ease}.dynamic-view-builder__icon-action:focus-visible{outline:2px solid rgba(27,92,255,.18);outline-offset:2px;border-radius:999px}.dynamic-view-builder__icon-action:disabled{opacity:.45;cursor:default}.dynamic-view-builder__icon-action:hover:not(:disabled),.dynamic-view-builder__icon-action:focus-visible:not(:disabled){color:#1b5cff}.dynamic-view-builder__icon-action--active{color:#1c9b5f}.dynamic-view-builder__icon-action--danger{color:#8d9caf}.dynamic-view-builder__icon-action--danger:hover:not(:disabled),.dynamic-view-builder__icon-action--danger:focus-visible:not(:disabled){color:#d14343}.dynamic-view-builder__empty-row{width:auto;max-width:100%;padding:.45rem .55rem;text-align:left;color:#70839a;cursor:pointer;inline-size:fit-content;pointer-events:auto;position:relative;z-index:1}.dynamic-view-builder__info-row{padding:.45rem .55rem;color:#3d6ae8;line-height:1.35;inline-size:fit-content;max-inline-size:100%}.dynamic-view-builder__preview-area{grid-area:preview;min-width:0;display:flex;align-self:start}.dynamic-view-builder__preview{display:flex;flex:1 1 auto;flex-direction:column;border:1px solid #dbe3ec;border-radius:.5rem;background:#fff;overflow:hidden;min-height:0}.dynamic-view-builder__preview-header{padding:.75rem .9rem;border-bottom:1px solid #e7edf4;background:#f8fafc}.dynamic-view-builder__preview-title{color:#243342;font-weight:700;line-height:1.25}.dynamic-view-builder__preview-subtitle{margin-top:.2rem;color:#70839a;line-height:1.35}.dynamic-view-builder__preview-body{display:flex;flex:1 1 auto;min-height:0;padding:.55rem}.dynamic-view-builder__preview-body :where(sdc-code-editor){display:block;flex:1 1 auto;min-height:0;width:100%}.dynamic-view-builder__footer{display:flex;justify-content:flex-start;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-shell{display:flex;flex-direction:column;gap:.875rem;min-height:0;height:100%}.dynamic-view-builder__modal-shell--full{height:100%}.dynamic-view-builder__modal-stage{display:flex;flex-direction:column;gap:.75rem;min-height:0}.dynamic-view-builder__modal-stage-body{flex:1 1 auto;min-height:0}.dynamic-view-builder__modal-card{padding:.85rem .95rem;border:1px solid #dbe3ec;border-radius:.65rem;background:#fff;box-shadow:0 1px 2px #0f172a0a}.dynamic-view-builder__modal-card--compact{padding:.75rem .85rem}.dynamic-view-builder__modal-card--section{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__modal-card--soft{background:linear-gradient(180deg,#fbfdff,#f6f9fc)}.dynamic-view-builder__modal-inline-surface{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__modal-list-shell{flex:1 1 auto;min-height:0;overflow:hidden;padding:.8rem}.dynamic-view-builder__modal-card-title{color:#243342;font-size:.92rem;font-weight:700;line-height:1.25}.dynamic-view-builder__modal-card-text{margin-top:.2rem;color:#70839a;font-size:.8rem;line-height:1.35}.dynamic-view-builder__modal-panel-title{color:#425466;font-size:.78rem;font-weight:700;letter-spacing:.04em;line-height:1.25;text-transform:uppercase}.dynamic-view-builder__modal-panel-title--section{margin-bottom:-.1rem}.dynamic-view-builder__modal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;align-items:start;min-height:0}.dynamic-view-builder__modal-grid>*{min-width:0}.dynamic-view-builder__modal-grid--single{grid-template-columns:1fr}.dynamic-view-builder__modal-grid--filter{grid-template-columns:repeat(2,minmax(0,1fr))}.dynamic-view-builder__modal-grid--filter-controls{grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem .75rem}.dynamic-view-builder__modal-grid-column-full{grid-column:1/-1}.dynamic-view-builder__modal-field,.dynamic-view-builder__modal-picker{display:flex;flex-direction:column;gap:.625rem;min-width:0;min-height:0}.dynamic-view-builder__modal-field--stretch,.dynamic-view-builder__modal-picker--stretch{height:100%}.dynamic-view-builder__modal-field--compact{gap:.5rem}.dynamic-view-builder__modal-field--full{width:100%}.dynamic-view-builder__modal-label-row{display:inline-flex;align-items:center;gap:.35rem;min-width:0}.dynamic-view-builder__modal-label{color:#425466;font-size:.875rem;font-weight:600;line-height:1.25}.dynamic-view-builder__join-modal{display:flex;flex-direction:column;gap:.875rem}.dynamic-view-builder__selection-flow{display:flex;flex-direction:column;gap:.75rem;height:100%;min-height:0}.dynamic-view-builder__filter-modal{display:flex;flex-direction:column;gap:.875rem;min-height:min(30rem,100vh - 14rem);height:100%;overflow:hidden}.dynamic-view-builder__filter-step{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;flex:1 1 auto}.dynamic-view-builder__filter-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:.875rem;flex-wrap:wrap}.dynamic-view-builder__filter-toolbar>*{min-width:0}.dynamic-view-builder__filter-heading{display:flex;align-items:center;justify-content:space-between;gap:.5rem;min-width:0}.dynamic-view-builder__filter-base-selector,.dynamic-view-builder__filter-domain-intro{min-width:0}.dynamic-view-builder__filter-base-selector{gap:.625rem;padding:.85rem 1rem}.dynamic-view-builder__filter-mode-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.dynamic-view-builder__filter-mode-copy{color:#70839a;font-size:.84rem;line-height:1.4}.dynamic-view-builder__filter-mode-selector{display:flex;min-width:0}.dynamic-view-builder__filter-mode-selector :where(.select-button){max-width:100%}.dynamic-view-builder__picklist-shell{flex:1 1 auto;min-height:0;overflow:hidden;display:flex;flex-direction:column}.dynamic-view-builder__picklist-shell :where(sdc-picklist){display:flex;flex:1 1 auto;height:100%;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist){display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__loading-state){display:flex;flex-direction:column;min-height:0;flex:1 1 auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__content){min-height:0;flex:1 1 auto;overflow:auto}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__list){margin:0}.dynamic-view-builder__picklist-shell :where(.sdc-picklist__search),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__selected),.dynamic-view-builder__picklist-shell :where(.sdc-picklist__footer){flex:0 0 auto}.dynamic-view-builder__filter-config-card{flex:1 1 auto;min-height:0;gap:.75rem;overflow:auto;padding:.85rem 1rem}.dynamic-view-builder__filter-panel{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0}.dynamic-view-builder__filter-context{display:flex;flex-direction:column;gap:.2rem;padding:0 .1rem;min-width:0}.dynamic-view-builder__filter-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem;min-width:0}.dynamic-view-builder__filter-summary-item{display:flex;flex-direction:column;gap:.22rem;padding:.7rem .8rem;border:1px solid #dbe3ec;border-radius:.55rem;background:#f8fafc;min-width:0}.dynamic-view-builder__sort-modal{display:flex;flex-direction:column;gap:.75rem;min-width:0;min-height:0;height:100%;overflow:hidden}.dynamic-view-builder__sort-direction{display:block;width:100%;max-width:18rem;min-width:0;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button){width:100%;max-width:100%;overflow:hidden}.dynamic-view-builder__sort-direction :where(.select-button-item){min-width:0}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-field{flex:0 0 auto}.dynamic-view-builder__sort-modal>.dynamic-view-builder__modal-picker{flex:1 1 auto;min-height:0}.dynamic-view-builder__sort-modal :where(.select-button--soft){padding:.25rem}.dynamic-view-builder__sort-modal :where(.select-button--soft .select-button-item){min-height:2rem;padding:.4rem .65rem}.dynamic-view-builder__modal-summary{display:flex;flex-direction:column;gap:.25rem;align-self:start}.dynamic-view-builder__modal-summary--filter{gap:.35rem}.dynamic-view-builder__modal-summary--compact{width:fit-content;max-width:100%}.dynamic-view-builder__modal-summary--field{min-width:min(100%,15rem)}.dynamic-view-builder__join-modal-top{display:grid;grid-template-columns:minmax(0,1fr) minmax(12rem,14rem) minmax(0,1fr);gap:.875rem;align-items:stretch}.dynamic-view-builder__join-modal-top>*{height:100%}.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-summary,.dynamic-view-builder__join-modal-top .dynamic-view-builder__modal-field{align-self:stretch}.dynamic-view-builder__modal-summary-label{color:#70839a;font-size:.73rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__modal-summary-value{color:#243342;font-weight:600;line-height:1.35;word-break:break-word}.dynamic-view-builder__modal-summary-value--path{color:#1f8a52;font-family:Consolas,Courier New,monospace;font-size:.86rem;font-weight:600}.dynamic-view-builder__picker-title{color:#425466;font-weight:700;line-height:1.35}.dynamic-view-builder__picker-title--path{font-family:Consolas,Courier New,monospace;font-size:.85rem;font-weight:600}.dynamic-view-builder__modal-footer{display:flex;justify-content:flex-end;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer--between{justify-content:space-between;align-items:center}.dynamic-view-builder__modal-footer-group{display:inline-flex;align-items:center;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__modal-footer-group--start{margin-right:auto}.dynamic-view-builder__filter-config-section{display:flex;flex-direction:column;gap:.625rem;min-width:0}.dynamic-view-builder__filter-config-section--value,.dynamic-view-builder__filter-config-section--domain{padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-optional{display:flex;align-items:flex-end;gap:.35rem;min-height:100%;padding-bottom:.15rem}.dynamic-view-builder__filter-config-section :where(.sdc-checkbox){min-height:34px}.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem}.dynamic-view-builder__filter-domain-item,.dynamic-view-builder__filter-review-item{display:flex;flex-direction:column;gap:.25rem;min-width:0;padding:.8rem .9rem;border:1px solid #e5ebf2;border-radius:.6rem;background:#f8fafc}.dynamic-view-builder__filter-domain-hint{color:#70839a;font-size:.82rem;line-height:1.45}.dynamic-view-builder__filter-review-preview{display:flex;flex-direction:column;gap:.35rem;min-width:0;padding-top:.25rem;border-top:1px solid #e8edf3}.dynamic-view-builder__filter-review-code{color:#243342;font-family:Consolas,Courier New,monospace;font-size:.84rem;line-height:1.45;white-space:pre-wrap;word-break:break-word}.dynamic-view-builder__sort-direction-field{gap:.4rem}.dynamic-view-builder__selection-table{display:flex;flex-direction:column;border:1px solid #d7dde5;background:#fff;overflow:hidden;border-radius:.5rem;min-height:0;flex:1 1 auto}.dynamic-view-builder__modal-stage-body>.dynamic-view-builder__selection-table,.dynamic-view-builder__modal-stage-body.dynamic-view-builder__picklist-shell{height:100%}.dynamic-view-builder__selection-table--chooser{min-height:0}.dynamic-view-builder__selection-head{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border-bottom:1px solid #e4e8ef;background:#f6f8fb}.dynamic-view-builder__selection-body{flex:1 1 auto;min-height:0;max-height:22rem;overflow:auto}.dynamic-view-builder__selection-table--fluid,.dynamic-view-builder__selection-table--fluid .dynamic-view-builder__selection-body{min-height:0;max-height:none;height:100%}.dynamic-view-builder__selection-row{width:100%;display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr) 5rem;gap:.75rem;padding:.875rem 1rem;border:0;border-bottom:1px solid #eef2f7;background:transparent;text-align:left;cursor:pointer;transition:background-color .18s ease,box-shadow .18s ease}.dynamic-view-builder__selection-row:last-child{border-bottom:0}.dynamic-view-builder__selection-row:hover{background:#f9fbff}.dynamic-view-builder__selection-row--selected{background:#eef5ff}.dynamic-view-builder__selection-row:focus-visible{outline:2px solid rgba(27,92,255,.22);outline-offset:-2px}.dynamic-view-builder__selection-col,.dynamic-view-builder__selection-cell{min-width:0;color:#425466;line-height:1.4;word-break:break-word}.dynamic-view-builder__selection-col{font-weight:700}.dynamic-view-builder__selection-cell--meta{color:#70839a}.dynamic-view-builder__selection-path{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:nowrap}.dynamic-view-builder__selection-db{color:#243342;font-weight:700}.dynamic-view-builder__selection-table-label{color:#425466;font-weight:500}.dynamic-view-builder__selection-separator{color:#9aaaba;flex:0 0 auto;margin-inline:.02rem}.dynamic-view-builder__selection-accent{color:#1f8a52;font-weight:700}.dynamic-view-builder__selection-note{display:block;margin-top:.1rem;color:#8da0b4;font-size:.74rem}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{display:flex;align-items:center;justify-content:center}.dynamic-view-builder__selection-marker{display:inline-flex;align-items:center;justify-content:center;width:1.2rem;height:1.2rem;border:1px solid #c8d4e0;border-radius:.3rem;background:#fff;color:transparent}.dynamic-view-builder__selection-marker i{font-size:.72rem;line-height:1}.dynamic-view-builder__selection-marker--selected{border-color:#1b5cff;background:#1b5cff;color:#fff}.dynamic-view-builder__selection-empty{padding:1rem;color:#70839a;text-align:center;line-height:1.4}.dynamic-view-builder__modal-picker--filter,.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-table{min-height:100%}.dynamic-view-builder__modal-picker--filter .dynamic-view-builder__selection-body{max-height:none}.dynamic-view-builder__field-modal{display:flex;flex-direction:column;gap:1rem;min-height:0;width:100%;height:100%}.dynamic-view-builder__field-config-shell{gap:.85rem;min-height:0;height:100%}.dynamic-view-builder__field-config-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-summary{color:#516173;font-size:.8rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.dynamic-view-builder__field-selection-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.dynamic-view-builder__field-config-list,.dynamic-view-builder__source-config-list{display:flex;flex-direction:column;flex:1 1 auto;gap:.75rem;width:100%;min-height:0;overflow:auto}.dynamic-view-builder__field-config-row{display:grid;grid-template-columns:minmax(13rem,1.1fr) minmax(0,1.9fr);gap:.9rem;align-items:start;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__source-config-row{display:grid;grid-template-columns:minmax(13rem,1fr) minmax(0,1.35fr);gap:.9rem;align-items:center;width:100%;padding:.85rem .9rem;border:1px solid #dbe3ec;border-radius:.7rem;background:#fff}.dynamic-view-builder__field-config-main,.dynamic-view-builder__source-config-main{display:flex;flex-direction:column;gap:.45rem;min-width:0}.dynamic-view-builder__field-config-title{display:inline-flex;align-items:baseline;gap:0;min-width:0;flex-wrap:wrap}.dynamic-view-builder__field-config-function{display:inline-flex;align-items:center;gap:.45rem;flex-wrap:wrap}.dynamic-view-builder__field-config-controls{display:grid;grid-template-columns:minmax(0,1fr) minmax(7rem,8rem) auto auto;gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__source-config-controls{display:grid;grid-template-columns:minmax(0,1fr);gap:.75rem;align-items:end;min-width:0}.dynamic-view-builder__field-config-controls--function{grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto auto}.dynamic-view-builder__field-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(10rem,11rem);gap:.75rem 1rem;align-items:start}.dynamic-view-builder__field-form--balanced{grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr)}.dynamic-view-builder__field-width{display:flex;flex-direction:column;gap:.35rem;min-width:0}.dynamic-view-builder__between{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.625rem}.dynamic-view-builder__row-chip{display:inline-flex;align-items:center;padding:.14rem .45rem;border-radius:999px;font-size:.74rem;font-weight:600;line-height:1.2}.dynamic-view-builder__row-chip--operator{background:#eef4fb;color:#1b5cff}.dynamic-view-builder__row-chip--value{background:#f4f7fa;color:#5d7084}.dynamic-view-builder__row-chip--optional{background:#f2f7f3;color:#1f8a52}.dynamic-view-builder__row-chip--domain{background:#eef4fb;color:#425466}.dynamic-view-builder__field-drop-indicator{display:inline-flex;align-self:stretch;width:.2rem;min-height:2.2rem;border-radius:999px;background:#1b5cff;box-shadow:0 0 0 3px #1b5cff24;flex:0 0 auto}@media (max-width: 1120px){.dynamic-view-builder__workspace--split{grid-template-columns:1fr;grid-template-areas:\"builder\" \"preview\"}.dynamic-view-builder__workspace--split.dynamic-view-builder__workspace--preview-hidden{justify-items:stretch}.dynamic-view-builder__sections--split{padding-right:0}}@media (max-width: 900px){.dynamic-view-builder__field-form,.dynamic-view-builder__field-form--balanced,.dynamic-view-builder__field-config-toolbar,.dynamic-view-builder__field-config-row,.dynamic-view-builder__source-config-row,.dynamic-view-builder__field-config-controls,.dynamic-view-builder__source-config-controls,.dynamic-view-builder__field-config-controls--function{grid-template-columns:1fr}.dynamic-view-builder__section-row{flex-direction:column}.dynamic-view-builder__section--half,.dynamic-view-builder__section--compact,.dynamic-view-builder__section--fluid{width:100%}.dynamic-view-builder__toolbar,.dynamic-view-builder__section-head,.dynamic-view-builder__row,.dynamic-view-builder__footer,.dynamic-view-builder__modal-footer,.dynamic-view-builder__filter-toolbar,.dynamic-view-builder__field-selection-toolbar{flex-direction:column;align-items:stretch}.dynamic-view-builder__toolbar-actions,.dynamic-view-builder__section-actions,.dynamic-view-builder__row-actions{justify-content:flex-start}.dynamic-view-builder__alias-field{min-inline-size:6rem;max-inline-size:100%}.dynamic-view-builder__modal-grid,.dynamic-view-builder__modal-grid--filter,.dynamic-view-builder__modal-grid--filter-controls,.dynamic-view-builder__filter-modal,.dynamic-view-builder__filter-summary,.dynamic-view-builder__filter-domain-grid,.dynamic-view-builder__filter-review-grid,.dynamic-view-builder__between,.dynamic-view-builder__join-modal-top{grid-template-columns:1fr}.dynamic-view-builder__row{min-inline-size:100%}}:host ::ng-deep .sdc-modal__content{display:flex;flex-direction:column;min-height:0;overflow:hidden}:host ::ng-deep .sdc-modal__content>.dynamic-view-builder__modal-shell{flex:1 1 auto;min-height:0}@media (max-width: 768px){.dynamic-view-builder__selection-head,.dynamic-view-builder__selection-row{grid-template-columns:1fr}.dynamic-view-builder__selection-col--select,.dynamic-view-builder__selection-cell--select{justify-content:flex-start}}\n"] }]
|
|
2789
|
+
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { loading: [{
|
|
2790
|
+
type: Input
|
|
2791
|
+
}], config: [{
|
|
2792
|
+
type: Input
|
|
2793
|
+
}], configChange: [{
|
|
2794
|
+
type: Output
|
|
2795
|
+
}], save: [{
|
|
2796
|
+
type: Output
|
|
2797
|
+
}], cancel: [{
|
|
2798
|
+
type: Output
|
|
2799
|
+
}], sectionsContainer: [{
|
|
2800
|
+
type: ViewChild,
|
|
2801
|
+
args: ["sectionsContainer"]
|
|
2802
|
+
}], builderSections: [{
|
|
2803
|
+
type: ViewChildren,
|
|
2804
|
+
args: ["builderSection"]
|
|
2805
|
+
}], onWindowResize: [{
|
|
2806
|
+
type: HostListener,
|
|
2807
|
+
args: ["window:resize"]
|
|
2808
|
+
}] } });
|
|
2809
|
+
export { VisualSqlEditorComponent as DynamicViewBuilderComponent };
|
|
2810
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci92aXN1YWwtc3FsLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Zpc3VhbC1zcWwtZWRpdG9yL3Zpc3VhbC1zcWwtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzFHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBd0IvRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFB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QUFNO3FIQXdDdEMsT0FBTztzQkFBZixLQUFLO2dCQUNPLE1BQU07c0JBQWxCLEtBQUs7Z0JBWWEsWUFBWTtzQkFBOUIsTUFBTTtnQkFFWSxJQUFJO3NCQUF0QixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBRVUsaUJBQWlCO3NCQURqQyxTQUFTO3VCQUFDLG1CQUFtQjtnQkFHYixlQUFlO3NCQUQvQixZQUFZO3VCQUFDLGdCQUFnQjtnQkEwRjlCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlOztBQThvRy9CLE9BQU8sRUFBRSx3QkFBd0IsSUFBSSwyQkFBMkIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgRFlOQU1JQ19WSUVXX0JVSUxERVJfREVGQVVMVF9UQUJMRV9ST1dTIH0gZnJvbSBcIi4uLy4uL2NvcmUvY29uc3RhbnRzL2R5bmFtaWMtdmlldy1idWlsZGVyLmNvbnN0XCI7XG5pbXBvcnQgeyBERUZBVUxUX01PREFMX1pfSU5ERVggfSBmcm9tIFwiLi4vLi4vY29yZS9jb25zdGFudHMvbW9kYWwuY29uc3RcIjtcbmltcG9ydCB7IGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi8uLi9jb3JlL2NvbmZpZy9keW5hbWljLXZpZXctYnVpbGRlci5jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQmFkZ2VDb2xvciB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL2JhZGdlLnR5cGVcIjtcbmltcG9ydCB0eXBlIHsgU2VsZWN0QnV0dG9uSXRlbSB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3NlbGVjdC1idXR0b24udHlwZVwiO1xuaW1wb3J0IHR5cGUgeyBQaWNrbGlzdFJlY29yZCB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3BpY2tsaXN0LnR5cGVcIjtcbmltcG9ydCB0eXBlIHsgVGltZWxpbmVJdGVtLCBUaW1lbGluZVN0ZXBTZWxlY3RFdmVudCB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3RpbWVsaW5lLnR5cGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJDb25maWcsXG4gIER5bmFtaWNWaWV3QnVpbGRlckZpZWxkLFxuICBEeW5hbWljVmlld0J1aWxkZXJGaWVsZEZ1bmN0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIsXG4gIER5bmFtaWNWaWV3QnVpbGRlckZpbHRlckNvbm5lY3RvcixcbiAgRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyVmFsdWVUeXBlLFxuICBEeW5hbWljVmlld0J1aWxkZXJGdW5jdGlvbixcbiAgRHluYW1pY1ZpZXdCdWlsZGVySm9pbixcbiAgRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJTb3J0LFxuICBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbixcbn0gZnJvbSBcIi4uLy4uL2NvcmUvdHlwZXMvZHluYW1pYy12aWV3LWJ1aWxkZXIudHlwZVwiO1xuaW1wb3J0IHR5cGUge1xuICBSb3dCYXNlLFxuICBUYWJsZUNvbHVtbixcbiAgVGFibGVPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vY29yZS90eXBlcy90YWJsZS50eXBlXCI7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29kZUVkaXRvckNvbXBvbmVudCB9IGZyb20gXCIuLi9jb2RlLWVkaXRvci9jb2RlLWVkaXRvci5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvbWJvYm94Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSW5mb1NpZ25Db21wb25lbnQgfSBmcm9tIFwiLi4vaW5mby1zaWduL2luZm8tc2lnbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IE1vZGFsQ29tcG9uZW50IH0gZnJvbSBcIi4uL21vZGFsL21vZGFsLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUGlja2xpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vcGlja2xpc3QvcGlja2xpc3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTZWxlY3RCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vc2VsZWN0LWJ1dHRvbi9zZWxlY3QtYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vdGFibGUvdGFibGUuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUZXh0YXJlYUNvbXBvbmVudCB9IGZyb20gXCIuLi90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tIFwiLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGltZWxpbmVDb21wb25lbnQgfSBmcm9tIFwiLi4vdGltZWxpbmUvdGltZWxpbmUuY29tcG9uZW50XCI7XG50eXBlIFNlbGVjdGlvbk1vZGFsTW9kZSA9IFwidGFibGVzXCIgfCBcImZpZWxkc1wiIHwgXCJncm91cEJ5XCI7XG50eXBlIEJ1aWxkZXJMYXlvdXRNb2RlID0gXCJzdGFja2VkXCIgfCBcInNwbGl0XCI7XG50eXBlIFNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCIgfCBcImNvbmZpZ3VyZVwiO1xudHlwZSBGaWVsZE1vZGFsU3RlcCA9IFwic2VsZWN0XCIgfCBcImNvbmZpZ3VyZVwiO1xudHlwZSBGaWx0ZXJNb2RhbFN0ZXAgPSBcInNlbGVjdFwiIHwgXCJjb25maWd1cmVcIiB8IFwicmV2aWV3XCI7XG50eXBlIEJ1aWxkZXJTZWN0aW9uSWQgPVxuICB8IFwidGFibGVzXCJcbiAgfCBcImpvaW5zXCJcbiAgfCBcImdyb3VwQnlcIlxuICB8IFwiZmllbGRzXCJcbiAgfCBcInNvcnRpbmdcIlxuICB8IFwiZmlsdGVyc1wiO1xudHlwZSBGaWx0ZXJNb2RhbE1vZGUgPSBcImNvbmRpdGlvblwiIHwgXCJkb21haW5cIjtcbmludGVyZmFjZSBTZWxlY3Rpb25Sb3cge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIG1ldGE6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBkYkxhYmVsPzogc3RyaW5nO1xuICB0YWJsZUxhYmVsPzogc3RyaW5nO1xuICBwYXRoVHlwZT86IFwidGFibGVcIiB8IFwiY29sdW1uXCI7XG4gIHByZWZpeD86IHN0cmluZztcbiAgbm90ZT86IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3VyY2VWaWV3SXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xuICBoYXNDdXN0b21BbGlhczogYm9vbGVhbjtcbn1cbmludGVyZmFjZSBTb3VyY2VNb2RhbERyYWZ0IHtcbiAgdGFibGU6IHN0cmluZztcbiAgYWxpYXM6IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3VyY2VDb25maWd1cmVkSXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xufVxuaW50ZXJmYWNlIEpvaW5WaWV3SXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIHNvdXJjZVRhYmxlOiBzdHJpbmc7XG4gIHNvdXJjZUZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yOiBzdHJpbmc7XG4gIHRhcmdldFRhYmxlOiBzdHJpbmc7XG4gIHRhcmdldEZpZWxkOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgU2ltcGxlVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xufVxuaW50ZXJmYWNlIEZpZWxkVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBzb3VyY2VJbmRleDogbnVtYmVyO1xuICBjb2x1bW46IHN0cmluZztcbiAgb3JkZXJMYWJlbDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xuICB3aWR0aDogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgZnVuY3Rpb25MYWJlbDogc3RyaW5nO1xuICBmdW5jdGlvbkFsaWFzOiBzdHJpbmc7XG4gIGhhc0N1c3RvbUNvbmZpZzogYm9vbGVhbjtcbiAgb3JkZXI6IG51bWJlcjtcbn1cbmludGVyZmFjZSBTb3J0Vmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgZnVuY3Rpb25MYWJlbDogc3RyaW5nO1xuICBkaXJlY3Rpb246IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3J0U2VsZWN0YWJsZUl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBjb2x1bW46IHN0cmluZztcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBtZXRhOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgRmlsdGVyVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBvcGVyYXRvckxhYmVsOiBzdHJpbmc7XG4gIHN1YnRpdGxlOiBzdHJpbmc7XG4gIG9wdGlvbmFsOiBib29sZWFuO1xuICBpc0RvbWFpbjogYm9vbGVhbjtcbn1cbmludGVyZmFjZSBGaWx0ZXJSZXZpZXdJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgZW1waGFzaXplPzogXCJwYXRoXCIgfCBcImNvZGVcIiB8IFwiZGVmYXVsdFwiO1xufVxuaW50ZXJmYWNlIENvbHVtbkRpc3BsYXlQYXJ0cyB7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBmaWVsZExhYmVsOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgVGFibGVEaXNwbGF5UGFydHMge1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbn1cbmludGVyZmFjZSBGaWVsZE1vZGFsQ29uZmlndXJlZEl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBjb2x1bW46IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBmaWVsZExhYmVsOiBzdHJpbmc7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbkxhYmVsOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQWxpYXM6IHN0cmluZztcbn1cbmludGVyZmFjZSBCdWlsZGVyRmxvd0Fycm93IHtcbiAgaWQ6IHN0cmluZztcbiAgZGlyZWN0aW9uOiBcInJpZ2h0XCIgfCBcImRvd25cIjtcbiAgbGVmdDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbn1cbmludGVyZmFjZSBDb2x1bW5QaWNrbGlzdEl0ZW0gZXh0ZW5kcyBQaWNrbGlzdFJlY29yZCB7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4OiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4OiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4Q29sb3I6IHN0cmluZztcbiAgdGl0bGVTdWZmaXhDb2xvcjogc3RyaW5nO1xuICBiYWRnZTogc3RyaW5nO1xuICBiYWRnZUNvbG9yOiBCYWRnZUNvbG9yO1xuICBjb2x1bW46IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3J0UGlja2xpc3RJdGVtIGV4dGVuZHMgUGlja2xpc3RSZWNvcmQge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB0aXRsZVByZWZpeDogc3RyaW5nO1xuICB0aXRsZVN1ZmZpeDogc3RyaW5nO1xuICB0aXRsZVByZWZpeENvbG9yOiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4Q29sb3I6IHN0cmluZztcbiAgYmFkZ2U6IHN0cmluZztcbiAgYmFkZ2VDb2xvcjogQmFkZ2VDb2xvcjtcbiAgc2VsZWN0aW9uSWQ6IHN0cmluZztcbiAgY29sdW1uOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgVGFibGVQaWNrbGlzdEl0ZW0gZXh0ZW5kcyBQaWNrbGlzdFJlY29yZCB7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4OiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4OiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4Q29sb3I6IHN0cmluZztcbiAgdGl0bGVTdWZmaXhDb2xvcjogc3RyaW5nO1xuICBiYWRnZTogc3RyaW5nO1xuICBiYWRnZUNvbG9yOiBCYWRnZUNvbG9yO1xuICB0YWJsZTogc3RyaW5nO1xufVxuaW50ZXJmYWNlIFByZXZpZXdDb2x1bW5MaWtlIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGVhZGVyPzogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xufVxudHlwZSBEeW5hbWljTW9kYWxEaW1lbnNpb24gPSB7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIGhlaWdodDogc3RyaW5nO1xufTtcblxudHlwZSBEeW5hbWljTW9kYWxEaW1lbnNpb25zTWFwID0ge1xuICBzb3VyY2U6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgc2VsZWN0aW9uOiBEeW5hbWljTW9kYWxEaW1lbnNpb247XG4gIGpvaW46IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgc29ydDogRHluYW1pY01vZGFsRGltZW5zaW9uO1xuICBmaWx0ZXI6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgZmllbGQ6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbn07XG5jb25zdCBFTVBUWV9WQUxVRSA9IFwiXCI7XG5jb25zdCBERUZBVUxUX0pPSU5fT1BFUkFUT1IgPSBcIkVRVUFMU1wiO1xuY29uc3QgREVGQVVMVF9GVU5DVElPTl9OQU1FID0gXCJjb3VudFwiO1xuY29uc3QgREVGQVVMVF9TT1JUX0RJUkVDVElPTiA9IFwiQVNDXCI7XG5jb25zdCBFTVBUWV9TT1JUX0ZVTkNUSU9OID0gXCJfX2Jhc2VfX1wiO1xuY29uc3QgRkxPV19BUlJPV19JTlNFVCA9IDM7XG5jb25zdCBGTE9XX0FSUk9XX01JTl9HQVAgPSAxMjtcbmNvbnN0IEZMT1dfQVJST1dTX1JFRlJFU0hfREVMQVlfTVMgPSAxMjA7XG5jb25zdCBERUZBVUxUX0ZJTFRFUl9PUEVSQVRPUiA9IFwiRVFVQUxcIjtcbmNvbnN0IERFRkFVTFRfRklMVEVSX0NPTk5FQ1RPUjogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyQ29ubmVjdG9yID0gXCJBTkRcIjtcbmNvbnN0IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEU6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlclZhbHVlVHlwZSA9IFwidmFsdWVcIjtcbmNvbnN0IEZJTFRFUl9NT0RFX0RPTUFJTiA9IFwiZG9tYWluXCIgYXMgY29uc3Q7XG5jb25zdCBPVkVSTEFZX0FQUEVORF9UQVJHRVQgPSBcImJvZHlcIjtcbmNvbnN0IE1PREFMX1pfSU5ERVhfT0ZGU0VUID0gMjA7XG5jb25zdCBNT0RBTF9PVkVSTEFZX1pfSU5ERVggPSBERUZBVUxUX01PREFMX1pfSU5ERVggKyBNT0RBTF9aX0lOREVYX09GRlNFVDtcbmNvbnN0IEZJRUxEX1BJQ0tMSVNUX1JPV1MgPSA4O1xuY29uc3QgRklMVEVSX1BJQ0tMSVNUX1JPV1MgPSA5O1xuY29uc3QgVklTVUFMX1NRTF9UQUJMRV9DT0xPUiA9IFwiIzQyNTQ2NlwiO1xuY29uc3QgVklTVUFMX1NRTF9GSUVMRF9DT0xPUiA9IFwiIzFmOGE1MlwiO1xuY29uc3QgUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SOiBCYWRnZUNvbG9yID0gXCJncmF5XCI7XG5jb25zdCBQSUNLTElTVF9GVU5DVElPTl9CQURHRV9DT0xPUjogQmFkZ2VDb2xvciA9IFwiYmx1ZVwiO1xuY29uc3QgRkFMTEJBQ0tfU0VMRUNUX1RBQkxFUyA9IFwiU2VsZWNpb25hciB0YWJlbGFzXCI7XG5jb25zdCBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT04gPSBcIk5lbmh1bSBzZWxlY2lvbmFkb1wiO1xuY29uc3QgUFJFVklFV19ST1dTX1BFUl9QQUdFX09QVElPTlMgPSBbNSwgMTAsIDIwXTtcbmNvbnN0IEFMSUFTX01BWF9MRU5HVEggPSAxMjtcbmNvbnN0IE1JTl9QQVJUU19GT1JfREIgPSAzO1xuY29uc3QgREJfUEFSVFNfT0ZGU0VUID0gLTI7XG5jb25zdCBNSU5fUEFSVFNfRk9SX1RBQkxFID0gMjtcbmNvbnN0IEpPSU5fT1BFUkFUT1JfTEFCRUxTOiBSZWNvcmQ8c3RyaW5nLCB7IGtleTogc3RyaW5nOyBmYWxsYmFjazogc3RyaW5nIH0+ID0ge1xuICBFUVVBTFM6IHtcbiAgICBrZXk6IFwiam9pbk9wZXJhdG9ycy5lcXVhbHNcIixcbiAgICBmYWxsYmFjazogXCJJZ3VhbCBhICg9KVwiLFxuICB9LFxuICBOT1RfRVFVQUxTOiB7XG4gICAga2V5OiBcImpvaW5PcGVyYXRvcnMubm90RXF1YWxzXCIsXG4gICAgZmFsbGJhY2s6IFwiRGlmZXJlbnRlIGRlICg8PilcIixcbiAgfSxcbiAgR1JFQVRFUl9USEFOOiB7XG4gICAga2V5OiBcImpvaW5PcGVyYXRvcnMuZ3JlYXRlclRoYW5cIixcbiAgICBmYWxsYmFjazogXCJNYWlvciBxdWUgKD4pXCIsXG4gIH0sXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDoge1xuICAgIGtleTogXCJqb2luT3BlcmF0b3JzLmdyZWF0ZXJUaGFuT3JFcXVhbFwiLFxuICAgIGZhbGxiYWNrOiBcIk1haW9yIG91IGlndWFsIGEgKD49KVwiLFxuICB9LFxuICBMRVNTX1RIQU46IHtcbiAgICBrZXk6IFwiam9pbk9wZXJhdG9ycy5sZXNzVGhhblwiLFxuICAgIGZhbGxiYWNrOiBcIk1lbm9yIHF1ZSAoPClcIixcbiAgfSxcbiAgTEVTU19USEFOX09SX0VRVUFMOiB7XG4gICAga2V5OiBcImpvaW5PcGVyYXRvcnMubGVzc1RoYW5PckVxdWFsXCIsXG4gICAgZmFsbGJhY2s6IFwiTWVub3Igb3UgaWd1YWwgYSAoPD0pXCIsXG4gIH0sXG59O1xuY29uc3QgRFlOQU1JQ19NT0RBTF9ESU1FTlNJT05TOiBEeW5hbWljTW9kYWxEaW1lbnNpb25zTWFwID0ge1xuICBzb3VyY2U6IHtcbiAgICB3aWR0aDogXCI2NHJlbVwiLFxuICAgIGhlaWdodDogXCI0MHJlbVwiLFxuICB9LFxuICBzZWxlY3Rpb246IHtcbiAgICB3aWR0aDogXCI2NHJlbVwiLFxuICAgIGhlaWdodDogXCI0MHJlbVwiLFxuICB9LFxuICBqb2luOiB7XG4gICAgd2lkdGg6IFwiNzByZW1cIixcbiAgICBoZWlnaHQ6IFwiNDByZW1cIixcbiAgfSxcbiAgc29ydDoge1xuICAgIHdpZHRoOiBcIjU2cmVtXCIsXG4gICAgaGVpZ2h0OiBcIjM0cmVtXCIsXG4gIH0sXG4gIGZpbHRlcjoge1xuICAgIHdpZHRoOiBcIjY4cmVtXCIsXG4gICAgaGVpZ2h0OiBcIjU1cmVtXCIsXG4gIH0sXG4gIGZpZWxkOiB7XG4gICAgd2lkdGg6IFwiNjhyZW1cIixcbiAgICBoZWlnaHQ6IFwiNDJyZW1cIixcbiAgfSxcbn07XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwic2RjLXZpc3VhbC1zcWwtZWRpdG9yXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgIENvZGVFZGl0b3JDb21wb25lbnQsXG4gICAgQ29tYm9ib3hDb21wb25lbnQsXG4gICAgSW5mb1NpZ25Db21wb25lbnQsXG4gICAgTW9kYWxDb21wb25lbnQsXG4gICAgUGlja2xpc3RDb21wb25lbnQsXG4gICAgU2VsZWN0QnV0dG9uQ29tcG9uZW50LFxuICAgIFRhYmxlQ29tcG9uZW50LFxuICAgIFRleHRhcmVhQ29tcG9uZW50LFxuICAgIFRleHRib3hDb21wb25lbnQsXG4gICAgVGltZWxpbmVDb21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGVVcmw6IFwiLi92aXN1YWwtc3FsLWVkaXRvci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdmlzdWFsLXNxbC1lZGl0b3IuY29tcG9uZW50LnNjc3NcIl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBWaXN1YWxTcWxFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGludGVybmFsQ29uZmlnID0gY3JlYXRlRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvbk9yZGVyOiBCdWlsZGVyU2VjdGlvbklkW10gPSBbXG4gICAgXCJ0YWJsZXNcIixcbiAgICBcImpvaW5zXCIsXG4gICAgXCJncm91cEJ5XCIsXG4gICAgXCJmaWVsZHNcIixcbiAgICBcInNvcnRpbmdcIixcbiAgICBcImZpbHRlcnNcIixcbiAgXTtcbiAgcHJpdmF0ZSByZWZyZXNoRmxvd0Fycm93c0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWZyZXNoRmxvd0Fycm93c1RpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHJlYWRvbmx5IGxheW91dE1vZGVJdGVtczogU2VsZWN0QnV0dG9uSXRlbTxCdWlsZGVyTGF5b3V0TW9kZT5bXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCJCbG9jb3NcIixcbiAgICAgIHZhbHVlOiBcInN0YWNrZWRcIixcbiAgICAgIGljb25DbGFzczogXCJmYXMgZmEtdGgtbGFyZ2VcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIkxpc3RhXCIsXG4gICAgICB2YWx1ZTogXCJzcGxpdFwiLFxuICAgICAgaWNvbkNsYXNzOiBcImZhcyBmYS1saXN0XCIsXG4gICAgfSxcbiAgXTtcbiAgcmVhZG9ubHkgZmlsdGVyTW9kZUl0ZW1zOiBTZWxlY3RCdXR0b25JdGVtPEZpbHRlck1vZGFsTW9kZT5bXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCJGaWx0cm9cIixcbiAgICAgIHZhbHVlOiBcImNvbmRpdGlvblwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIixcbiAgICAgIHZhbHVlOiBGSUxURVJfTU9ERV9ET01BSU4sXG4gICAgfSxcbiAgXTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXM6IFNlbGVjdEJ1dHRvbkl0ZW08RmlsdGVyTW9kYWxNb2RlPltdID0gW107XG4gIHJlYWRvbmx5IHNvcnREaXJlY3Rpb25JdGVtczogU2VsZWN0QnV0dG9uSXRlbTxzdHJpbmc+W10gPSBbXTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRMYXlvdXRNb2RlSXRlbXM6IFNlbGVjdEJ1dHRvbkl0ZW08QnVpbGRlckxheW91dE1vZGU+W10gPSBbXTtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRTb3J0RGlyZWN0aW9uSXRlbXM6IFNlbGVjdEJ1dHRvbkl0ZW08c3RyaW5nPltdID0gW107XG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0IGNvbmZpZyh2YWx1ZTogRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnKSB7XG4gICAgdGhpcy5pbnRlcm5hbENvbmZpZyA9IHZhbHVlXG4gICAgICA/IGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyh2YWx1ZSlcbiAgICAgIDogY3JlYXRlRHluYW1pY1ZpZXdCdWlsZGVyQ29uZmlnKCk7XG4gICAgdGhpcy5zeW5jTGF5b3V0TW9kZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jRmlsdGVyTW9kZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jU29ydERpcmVjdGlvbkl0ZW1zKCk7XG4gICAgdGhpcy5zYW5pdGl6ZUJ1aWxkZXIoKTtcbiAgfVxuICBnZXQgY29uZmlnKCk6IER5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxDb25maWc7XG4gIH1cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbmZpZ0NoYW5nZSA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljVmlld0J1aWxkZXJDb25maWc+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljVmlld0J1aWxkZXJDb25maWc+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoXCJzZWN0aW9uc0NvbnRhaW5lclwiKVxuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGRyZW4oXCJidWlsZGVyU2VjdGlvblwiKVxuICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkZXJTZWN0aW9ucz86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XG4gIGxheW91dE1vZGU6IEJ1aWxkZXJMYXlvdXRNb2RlID0gXCJzdGFja2VkXCI7XG4gIHByZXZpZXdWaXNpYmxlID0gZmFsc2U7XG4gIGZsb3dBcnJvd3M6IEJ1aWxkZXJGbG93QXJyb3dbXSA9IFtdO1xuICBtZWFzdXJlZFNwbGl0UHJldmlld0hlaWdodCA9IFwiMjRyZW1cIjtcbiAgZHJhZ2dpbmdGaWVsZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgZHJhZ1ByZXZpZXdJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHJlYWRvbmx5IG92ZXJsYXlBcHBlbmRUYXJnZXQgPSBPVkVSTEFZX0FQUEVORF9UQVJHRVQ7XG4gIHJlYWRvbmx5IG92ZXJsYXlaSW5kZXggPSBNT0RBTF9PVkVSTEFZX1pfSU5ERVg7XG4gIHJlYWRvbmx5IG1vZGFsRGltZW5zaW9ucyA9IERZTkFNSUNfTU9EQUxfRElNRU5TSU9OUztcbiAgcmVhZG9ubHkgZmllbGRQaWNrbGlzdFJvd3MgPSBGSUVMRF9QSUNLTElTVF9ST1dTO1xuICByZWFkb25seSBmaWx0ZXJQaWNrbGlzdFJvd3MgPSBGSUxURVJfUElDS0xJU1RfUk9XUztcbiAgc291cmNlTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gIHNvdXJjZU1vZGFsU3RlcDogU291cmNlTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgc291cmNlTW9kYWxEcmFmdHM6IFNvdXJjZU1vZGFsRHJhZnRbXSA9IFtdO1xuICBzZWxlY3Rpb25Nb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgc2VsZWN0aW9uTW9kYWxNb2RlOiBTZWxlY3Rpb25Nb2RhbE1vZGUgPSBcInRhYmxlc1wiO1xuICBzZWxlY3Rpb25Nb2RhbElkczogc3RyaW5nW10gPSBbXTtcbiAgc2VsZWN0aW9uTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgam9pbk1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICBqb2luRWRpdEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgam9pblNvdXJjZVNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICBqb2luVGFyZ2V0U2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gIGpvaW5EcmFmdCA9IHtcbiAgICBzb3VyY2VDb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgIHRhcmdldENvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgb3BlcmF0b3I6IERFRkFVTFRfSk9JTl9PUEVSQVRPUixcbiAgfTtcbiAgc29ydE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICBzb3J0RWRpdEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgc29ydFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICBzb3J0RHJhZnQgPSB7XG4gICAgY29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICBmdW5jdGlvbk5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgIGRpcmVjdGlvbjogREVGQVVMVF9TT1JUX0RJUkVDVElPTixcbiAgfTtcbiAgZmllbGRNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgZmllbGRNb2RhbFN0ZXA6IEZpZWxkTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgZmllbGRNb2RhbFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICBmaWVsZE1vZGFsRHJhZnRzOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFtdID0gW107XG4gIGZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZmllbGRGdW5jdGlvbkRyYWZ0ID0ge1xuICAgIGNvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgZnVuY3Rpb25OYW1lOiBFTVBUWV9WQUxVRSxcbiAgICBmdW5jdGlvbkFsaWFzOiBFTVBUWV9WQUxVRSxcbiAgfTtcbiAgZmlsdGVyTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gIGZpbHRlckVkaXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGZpbHRlck1vZGFsU3RlcDogRmlsdGVyTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgZmlsdGVyTW9kYWxNb2RlOiBGaWx0ZXJNb2RhbE1vZGUgPSBcImNvbmRpdGlvblwiO1xuICBmaWx0ZXJTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgZmlsdGVyRHJhZnQgPSB7XG4gICAgbW9kZTogXCJjb25kaXRpb25cIiBhcyBGaWx0ZXJNb2RhbE1vZGUsXG4gICAgY29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICBvcGVyYXRvcjogREVGQVVMVF9GSUxURVJfT1BFUkFUT1IsXG4gICAgY29ubmVjdG9yOiBERUZBVUxUX0ZJTFRFUl9DT05ORUNUT1IsXG4gICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgIHZhbHVlVHlwZTogREVGQVVMVF9GSUxURVJfVkFMVUVfVFlQRSxcbiAgICB2YWx1ZTogRU1QVFlfVkFMVUUsXG4gICAgdmFsdWVzVGV4dDogRU1QVFlfVkFMVUUsXG4gICAgYmV0d2VlblN0YXJ0OiBFTVBUWV9WQUxVRSxcbiAgICBiZXR3ZWVuRW5kOiBFTVBUWV9WQUxVRSxcbiAgICBwYXJhbWV0ZXJOYW1lOiBFTVBUWV9WQUxVRSxcbiAgICBkb21haW5FeHByZXNzaW9uOiBFTVBUWV9WQUxVRSxcbiAgfTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5zeW5jTGF5b3V0TW9kZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jRmlsdGVyTW9kZUl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jU29ydERpcmVjdGlvbkl0ZW1zKCk7XG4gICAgdGhpcy5zYW5pdGl6ZUJ1aWxkZXIoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZGVyU2VjdGlvbnM/LmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2NoZWR1bGVGbG93QXJyb3dSZWZyZXNoKCk7XG4gICAgfSk7XG4gICAgdGhpcy5zY2hlZHVsZUZsb3dBcnJvd1JlZnJlc2goKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoRmxvd0Fycm93c0ZyYW1lICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJlZnJlc2hGbG93QXJyb3dzRnJhbWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWZyZXNoRmxvd0Fycm93c1RpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hGbG93QXJyb3dzVGltZW91dCk7XG4gICAgfVxuICB9XG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZWR1bGVGbG93QXJyb3dSZWZyZXNoKCk7XG4gIH1cbiAgZ2V0IHNlbGVjdGVkTGF5b3V0TW9kZUl0ZW0oKTogU2VsZWN0QnV0dG9uSXRlbTxCdWlsZGVyTGF5b3V0TW9kZT4gfCBudWxsIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sYXlvdXRNb2RlSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5sYXlvdXRNb2RlKSA/P1xuICAgICAgbnVsbFxuICAgICk7XG4gIH1cbiAgZ2V0IGlzUmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm1ldGFkYXRhLnZpZXdNb2RlID09PSBcInJlYWRvbmx5XCI7XG4gIH1cbiAgZ2V0IGpvaW5PcGVyYXRvck9wdGlvbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW10ge1xuICAgIHJldHVybiAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS5qb2luT3BlcmF0b3JzID8/IFtdKS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAuLi5pdGVtLFxuICAgICAgdGV4dDogdGhpcy5yZXNvbHZlSm9pbk9wZXJhdG9yT3B0aW9uVGV4dChpdGVtKSxcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IGZ1bmN0aW9uT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuZnVuY3Rpb25zID8/IFtdO1xuICB9XG4gIGdldCBzb3J0RGlyZWN0aW9uT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuc29ydERpcmVjdGlvbnMgPz8gW107XG4gIH1cbiAgZ2V0IGZpbHRlckNvbm5lY3Rvck9wdGlvbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLmZpbHRlckNvbm5lY3RvcnMgPz8gW107XG4gIH1cbiAgZ2V0IHZhbHVlVHlwZU9wdGlvbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy52YWx1ZVR5cGVzLnZhbHVlYCxcbiAgICAgICAgICBcIlZhbG9yXCJcbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6IFwidmFsdWVcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy52YWx1ZVR5cGVzLnBhcmFtZXRlcmAsXG4gICAgICAgICAgXCJQYXJhbWV0cm9cIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogXCJwYXJhbWV0ZXJcIixcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuICBnZXQgYm9vbGVhblZhbHVlT3B0aW9ucygpOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmJvb2xlYW4udHJ1ZWAsXG4gICAgICAgICAgXCJUcnVlXCJcbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGV4dDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmJvb2xlYW4uZmFsc2VgLFxuICAgICAgICAgIFwiRmFsc2VcIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogXCJmYWxzZVwiLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIGdldCBzZWxlY3RlZFRhYmxlcygpOiBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbltdIHtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMubWFwKChpdGVtKSA9PiBpdGVtLnRhYmxlKVxuICAgICk7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSkuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgaWRzLmhhcyhpdGVtLnZhbHVlKVxuICAgICk7XG4gIH1cbiAgZ2V0IGF2YWlsYWJsZUNvbHVtbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkVGFibGVJZHMgPSBuZXcgU2V0KFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMubWFwKChpdGVtKSA9PiBpdGVtLnRhYmxlKVxuICAgICk7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLmNvbHVtbnMgPz8gW10pLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgIHNlbGVjdGVkVGFibGVJZHMuaGFzKGl0ZW0udGFibGUpXG4gICAgKTtcbiAgfVxuICBnZXQgZmllbGRTZWxlY3RhYmxlQ29sdW1ucygpOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSB7XG4gICAgaWYgKCF0aGlzLmF2YWlsYWJsZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVDb2x1bW5zO1xuICAgIH1cbiAgICBjb25zdCBncm91cEJ5ID0gbmV3IFNldCh0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeSk7XG4gICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gZ3JvdXBCeS5oYXMoaXRlbS52YWx1ZSkgfHwgaXRlbS5pc0FnZ3JlZ2F0YWJsZSAhPT0gZmFsc2VcbiAgICApO1xuICB9XG4gIGdldCBncm91cEJ5U2VsZWN0YWJsZUNvbHVtbnMoKTogRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzQWdncmVnYXRhYmxlICE9PSBmYWxzZSk7XG4gIH1cbiAgZ2V0IHNvcnRTZWxlY3RhYmxlSXRlbXMoKTogU29ydFNlbGVjdGFibGVJdGVtW10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZHMgPSB0aGlzLm5vcm1hbGl6ZWRGaWVsZHM7XG4gICAgaWYgKCFub3JtYWxpemVkRmllbGRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwQnlTZXQgPSBuZXcgU2V0KHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5KTtcblxuICAgIHJldHVybiB0aGlzLmRlZHVwbGljYXRlQnlLZXkoXG4gICAgICBub3JtYWxpemVkRmllbGRzXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24oaXRlbS5jb2x1bW4pO1xuICAgICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW4uaXNTb3J0YWJsZSAhPT0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGdyb3VwQnlTZXQuaGFzKGl0ZW0uY29sdW1uKSB8fCAhIWl0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZT8udHJpbSgpO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhpdGVtLmNvbHVtbik7XG4gICAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gaXRlbS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUU7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgaWQ6IHRoaXMuYnVpbGRTb3J0U2VsZWN0aW9uSWQoaXRlbS5jb2x1bW4sIGZ1bmN0aW9uTmFtZSksXG4gICAgICAgICAgICBjb2x1bW46IGl0ZW0uY29sdW1uLFxuICAgICAgICAgICAgdGFibGVMYWJlbDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgICAgIGZpZWxkTGFiZWw6IHBhcnRzLmZpZWxkTGFiZWwsXG4gICAgICAgICAgICBtZXRhOiBmdW5jdGlvbk5hbWVcbiAgICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVGdW5jdGlvbkxhYmVsKGZ1bmN0aW9uTmFtZSlcbiAgICAgICAgICAgICAgOiB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24oaXRlbS5jb2x1bW4pPy5kYXRhVHlwZSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgIChpdGVtKSA9PiBpdGVtLmlkXG4gICAgKTtcbiAgfVxuICBnZXQgY2FuQ29uZmlndXJlSm9pbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmxlbmd0aCA+IDE7XG4gIH1cbiAgZ2V0IGNhblNhdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhKHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHMubGVuZ3RoIHx8IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5Lmxlbmd0aCk7XG4gIH1cbiAgZ2V0IGNhblNhdmVKb2luKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4gfHxcbiAgICAgICF0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4gfHxcbiAgICAgICF0aGlzLmpvaW5EcmFmdC5vcGVyYXRvclxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uKTtcbiAgICByZXR1cm4gISFzb3VyY2UgJiYgISF0YXJnZXQgJiYgc291cmNlLnRhYmxlICE9PSB0YXJnZXQudGFibGU7XG4gIH1cbiAgZ2V0IGNhblNhdmVTb3J0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc29ydERyYWZ0LmNvbHVtbiAmJiAhIXRoaXMuc29ydERyYWZ0LmRpcmVjdGlvbjtcbiAgfVxuICBnZXQgY2FuU2F2ZUZpZWxkTW9kYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5maWVsZE1vZGFsRHJhZnRzLmxlbmd0aCAmJiAhdGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbjtcbiAgfVxuICBnZXQgY2FuU2F2ZUZpbHRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmJ1aWxkRmlsdGVyRnJvbURyYWZ0KCk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxDYW5Qcm9jZWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkTW9kYWxEcmFmdHMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgY2FuT3BlbkZpZWxkQ29uZmlndXJhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZEl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNb2RhbFN0ZXAgPT09IFwic2VsZWN0XCI7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyTW9kYWxTdGVwID09PSBcImNvbmZpZ3VyZVwiO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFJldmlld1N0ZXBBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyTW9kYWxTdGVwID09PSBcInJldmlld1wiO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbENhblByb2NlZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyTW9kYWxNb2RlID09PSBGSUxURVJfTU9ERV9ET01BSU4gfHwgISF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbjtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxDYW5SZXZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuU2F2ZUZpbHRlcjtcbiAgfVxuICBnZXQgZmlsdGVyTmVlZHNWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIVtcIkVNUFRZXCIsIFwiTk9UX0VNUFRZXCJdLmluY2x1ZGVzKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IpO1xuICB9XG4gIGdldCBmaWx0ZXJDb25uZWN0b3JEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJTZXF1ZW5jZUluZGV4ID09PSAwO1xuICB9XG4gIGdldCBmaWx0ZXJDb25uZWN0b3JEaXNhYmxlZFJlYXNvbigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5maWx0ZXJDb25uZWN0b3JEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIEVNUFRZX1ZBTFVFO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy5kaXNhYmxlZFJlYXNvbnMuY29ubmVjdG9yYCxcbiAgICAgIFwiTyBwcmltZWlybyBmaWx0cm8gc2VtcHJlIGluaWNpYSBvIFdIRVJFLCBwb3IgaXNzbyBvIGNvbmVjdG9yIGZpY2EgdHJhdmFkby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck9wZXJhdG9yRGlzYWJsZWRSZWFzb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pIHtcbiAgICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZGlzYWJsZWRSZWFzb25zLm9wZXJhdG9yYCxcbiAgICAgIFwiU2VsZWNpb25lIHVtIGNhbXBvIG5hIGV0YXBhIGFudGVyaW9yIHBhcmEgbGliZXJhciBzb21lbnRlIG9zIG9wZXJhZG9yZXMgY29tcGF0aXZlaXMuXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJWYWx1ZVR5cGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZmlsdGVyRHJhZnQuY29sdW1uIHx8ICF0aGlzLmZpbHRlck5lZWRzVmFsdWU7XG4gIH1cbiAgZ2V0IGZpbHRlclZhbHVlVHlwZURpc2FibGVkUmVhc29uKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZGlzYWJsZWRSZWFzb25zLnZhbHVlVHlwZVdpdGhvdXRDb2x1bW5gLFxuICAgICAgICBcIkVzY29saGEgdW0gY2FtcG8gZSB1bSBvcGVyYWRvciBhbnRlcyBkZSBkZWZpbmlyIGNvbW8gbyB2YWxvciBzZXJhIGluZm9ybWFkby5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZmlsdGVyTmVlZHNWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZGlzYWJsZWRSZWFzb25zLnZhbHVlVHlwZVdpdGhvdXRWYWx1ZWAsXG4gICAgICAgIFwiTyBvcGVyYWRvciBhdHVhbCBuYW8gdXNhIHZhbG9yLCBlbnRhbyB0aXBvIGRlIHZhbG9yIGUgZW50cmFkYSBmaWNhbSBvY3VsdG9zLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgfVxuICBnZXQgZmlsdGVyT3BlcmF0b3JUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMub3BlcmF0b3JEZWZhdWx0YCxcbiAgICAgICAgXCJPcyBvcGVyYWRvcmVzIG11ZGFtIGNvbmZvcm1lIG8gdGlwbyBkbyBjYW1wbyBzZWxlY2lvbmFkby5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pO1xuICAgIGxldCBvcGVyYXRvcktleTogc3RyaW5nO1xuICAgIGlmICh0aGlzLmlzTnVtZXJpY1R5cGUoY29sdW1uPy5kYXRhVHlwZSkpIHtcbiAgICAgIG9wZXJhdG9yS2V5ID0gXCJvcGVyYXRvck51bWVyaWNcIjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEYXRlVHlwZShjb2x1bW4/LmRhdGFUeXBlKSkge1xuICAgICAgb3BlcmF0b3JLZXkgPSBcIm9wZXJhdG9yRGF0ZVwiO1xuICAgIH0gZWxzZSBpZiAoKGNvbHVtbj8uZGF0YVR5cGUgPz8gRU1QVFlfVkFMVUUpLnRvTG93ZXJDYXNlKCkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBvcGVyYXRvcktleSA9IFwib3BlcmF0b3JCb29sZWFuXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wZXJhdG9yS2V5ID0gXCJvcGVyYXRvclRleHRcIjtcbiAgICB9XG5cbiAgICBjb25zdCBmYWxsYmFja0J5S2V5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgb3BlcmF0b3JOdW1lcmljOiBcIkNhbXBvcyBudW1lcmljb3MgcGVybWl0ZW0gY29tcGFyYWNvZXMsIGZhaXhhcyBlIGxpc3Rhcy5cIixcbiAgICAgIG9wZXJhdG9yRGF0ZTogXCJDYW1wb3MgZGUgZGF0YSBlIGhvcmEgcGVybWl0ZW0gY29tcGFyYWNvZXMgY3Jvbm9sb2dpY2FzIGUgaW50ZXJ2YWxvLlwiLFxuICAgICAgb3BlcmF0b3JCb29sZWFuOiBcIkNhbXBvcyBib29sZWFub3MgYWNlaXRhbSBjb21wYXJhY2FvIGRpcmV0YSBvdSB2ZXJpZmljYWNhbyBkZSB2YXppby5cIixcbiAgICAgIG9wZXJhdG9yVGV4dDogXCJDYW1wb3MgdGV4dHVhaXMgYWNlaXRhbSBidXNjYSBwb3IgdHJlY2hvLCBwcmVmaXhvLCBzdWZpeG8gZSBsaXN0YXMuXCJcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLiR7b3BlcmF0b3JLZXl9YCxcbiAgICAgIGZhbGxiYWNrQnlLZXlbb3BlcmF0b3JLZXldXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyVmFsdWVUeXBlVG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlVHlwZURlZmF1bHRgLFxuICAgICAgICBcIlVzZSB2YWxvciBkaWdpdGFkbyBwYXJhIGNvbXBhcmFyIGFnb3JhIG91IHBhcmFtZXRybyBwYXJhIHBlZGlyIG8gdmFsb3IgZW0gdGVtcG8gZGUgZXhlY3VjYW8uXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpbHRlck5lZWRzVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlVHlwZU5vdFJlcXVpcmVkYCxcbiAgICAgICAgXCJDb20gZXN0ZSBvcGVyYWRvciBvIGZpbHRybyBuYW8gcHJlY2lzYSByZWNlYmVyIHZhbG9yLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy50b29sdGlwcy52YWx1ZVR5cGVgLFxuICAgICAgXCJWYWxvciBkaWdpdGFkbyBzYWx2YSB1bWEgY29tcGFyYWNhbyBmaXhhLiBQYXJhbWV0cm8gZGVpeGEgbyB2YWxvciBhYmVydG8gcGFyYSBwcmVlbmNoaW1lbnRvIGZ1dHVyby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlckNvbm5lY3RvclRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMudG9vbHRpcHMuY29ubmVjdG9yYCxcbiAgICAgIFwiQ29uZWN0b3IgZGVmaW5lIGNvbW8gZXN0YSByZWdyYSBzZSBsaWdhIGFvIGZpbHRybyBhbnRlcmlvcjogQU5EIHJlc3RyaW5nZSwgT1IgYW1wbGlhLlwiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyT3B0aW9uYWxUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLm9wdGlvbmFsYCxcbiAgICAgIFwiTWFycXVlIGNvbW8gb3BjaW9uYWwgcXVhbmRvIGEgcmVncmEgcHVkZXIgc2VyIGlnbm9yYWRhIHNlbSBpbnZhbGlkYXIgYSBleGVjdWNhby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlckRvbWFpbkV4cHJlc3Npb25Ub29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLmRvbWFpbkV4cHJlc3Npb25gLFxuICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pbyBlbnRyYSBjb21vIGNvbmRpY2FvIG1hbnVhbCBubyBXSEVSRS4gVXNlIHF1YW5kbyBhIHJlZ3JhIG5hbyBjb3ViZXIgbm9zIG9wZXJhZG9yZXMgcGFkcmFvLlwiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyVmFsdWVJbnB1dFRvb2x0aXAoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnBhcmFtZXRlck5hbWVgLFxuICAgICAgICBcIkluZm9ybWUgbyBub21lIHRlY25pY28gcXVlIHNlcmEgdXNhZG8gcGFyYSBwZWRpciBvIHZhbG9yIGVtIHRlbXBvIGRlIGV4ZWN1Y2FvLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIklOXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlc0xpc3RgLFxuICAgICAgICBcIlNlcGFyZSBvcyB2YWxvcmVzIHBvciB2aXJndWxhIHBhcmEgbW9udGFyIGEgbGlzdGEgZmluYWwgZG8gSU4uXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiQkVUV0VFTlwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmlsdGVycy50b29sdGlwcy5iZXR3ZWVuYCxcbiAgICAgICAgXCJQcmVlbmNoYSBpbmljaW8gZSBmaW0gcGFyYSBtb250YXIgbyBpbnRlcnZhbG8gY29tcGxldG8uXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLnRvb2x0aXBzLnZhbHVlYCxcbiAgICAgIFwiTyB2YWxvciBmaW5hbCByZXNwZWl0YSBvIHRpcG8gZG8gY2FtcG8gZSBvIG9wZXJhZG9yIGVzY29saGlkby5cIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNob3dGaWx0ZXJWYWx1ZVRleHRib3goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXNWYWx1ZU1vZGUgPSB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJ2YWx1ZVwiICYmIHRoaXMuZmlsdGVyTmVlZHNWYWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgaXNWYWx1ZU1vZGUgJiZcbiAgICAgICF0aGlzLnNob3dGaWx0ZXJWYWx1ZXNUZXh0Ym94ICYmXG4gICAgICAhdGhpcy5zaG93RmlsdGVyQmV0d2VlbklucHV0cyAmJlxuICAgICAgIXRoaXMuc2hvd0ZpbHRlckJvb2xlYW5Db21ib2JveFxuICAgICk7XG4gIH1cbiAgZ2V0IHNob3dGaWx0ZXJWYWx1ZXNUZXh0Ym94KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJ2YWx1ZVwiICYmXG4gICAgICB0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIklOXCJcbiAgICApO1xuICB9XG4gIGdldCBzaG93RmlsdGVyQmV0d2VlbklucHV0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwidmFsdWVcIiAmJlxuICAgICAgdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciA9PT0gXCJCRVRXRUVOXCJcbiAgICApO1xuICB9XG4gIGdldCBzaG93RmlsdGVyUGFyYW1ldGVyVGV4dGJveCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCI7XG4gIH1cbiAgZ2V0IHNob3dGaWx0ZXJCb29sZWFuQ29tYm9ib3goKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKTtcbiAgICByZXR1cm4gKFxuICAgICAgISFjb2x1bW4gJiYgY29sdW1uLmRhdGFUeXBlID09PSBcImJvb2xlYW5cIiAmJiB0aGlzLnNob3dGaWx0ZXJWYWx1ZVRleHRib3hcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJSZXZpZXdJdGVtcygpOiBGaWx0ZXJSZXZpZXdJdGVtW10geyAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIGNvbnN0IHZhbHVlVHlwZUxhYmVsID0gdGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgPyB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICApXG4gICAgICA6IHRoaXMucmVzb2x2ZU9wdGlvbkxhYmVsKHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlLCB0aGlzLnZhbHVlVHlwZU9wdGlvbnMpO1xuXG4gICAgY29uc3QgaXRlbXM6IEZpbHRlclJldmlld0l0ZW1bXSA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwibW9kZVwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMudHlwZWAsXG4gICAgICAgICAgXCJUaXBvXCJcbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyTW9kYWxNb2RlID09PSBGSUxURVJfTU9ERV9ET01BSU5cbiAgICAgICAgICA/IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgICAgICAgIFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIlxuICAgICAgICAgIClcbiAgICAgICAgICA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLm1vZGVzLmNvbmRpdGlvbmAsXG4gICAgICAgICAgICBcIkZpbHRyb1wiXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBcImNvbm5lY3RvclwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMuY29ubmVjdG9yYCxcbiAgICAgICAgICBcIkNvbmVjdG9yXCJcbiAgICAgICAgKSxcbiAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyQ29ubmVjdG9yRGlzYWJsZWRcbiAgICAgICAgICA/IFwiV0hFUkVcIlxuICAgICAgICAgIDogdGhpcy5yZXNvbHZlT3B0aW9uTGFiZWwodGhpcy5maWx0ZXJEcmFmdC5jb25uZWN0b3IsIHRoaXMuZmlsdGVyQ29ubmVjdG9yT3B0aW9ucyksXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgaXRlbXMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcImV4cHJlc3Npb25cIixcbiAgICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpZWxkcy5kb21haW5FeHByZXNzaW9uYCxcbiAgICAgICAgICAgIFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyRHJhZnQuZG9tYWluRXhwcmVzc2lvbi50cmltKCkgfHwgXCItXCIsXG4gICAgICAgICAgZW1waGFzaXplOiBcImNvZGVcIixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zLnB1c2goXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJmaWVsZFwiLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLmZpZWxkYCxcbiAgICAgICAgICAgIFwiQ2FtcG9cIlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID8gdGhpcy5yZXNvbHZlQ29sdW1uUGF0aCh0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbikgOiBcIi1cIixcbiAgICAgICAgICBlbXBoYXNpemU6IFwicGF0aFwiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwib3BlcmF0b3JcIixcbiAgICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpZWxkcy5vcGVyYXRvcmAsXG4gICAgICAgICAgICBcIk9wZXJhZG9yXCJcbiAgICAgICAgICApLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvckxhYmVsKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwidmFsdWVUeXBlXCIsXG4gICAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWVsZHMudmFsdWVUeXBlYCxcbiAgICAgICAgICAgIFwiVGlwbyBkZSB2YWxvclwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5maWx0ZXJOZWVkc1ZhbHVlID8gdmFsdWVUeXBlTGFiZWwgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLm5vbmVgLFxuICAgICAgICAgICAgXCJTZW0gdmFsb3JcIlxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJ2YWx1ZVwiLFxuICAgICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLnZhbHVlYCxcbiAgICAgICAgICAgIFwiVmFsb3JcIlxuICAgICAgICAgICksXG4gICAgICAgICAgdmFsdWU6IHRoaXMucmVzb2x2ZUZpbHRlckRyYWZ0RGlzcGxheVZhbHVlKCkgfHwgXCItXCIsXG4gICAgICAgICAgZW1waGFzaXplOiB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA9PT0gXCJwYXJhbWV0ZXJcIiA/IFwiY29kZVwiIDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGl0ZW1zLnB1c2goe1xuICAgICAgaWQ6IFwib3B0aW9uYWxcIixcbiAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMub3B0aW9uYWxgLFxuICAgICAgICBcIk9wY2lvbmFsXCJcbiAgICAgICksXG4gICAgICB2YWx1ZTogdGhpcy5maWx0ZXJEcmFmdC5vcHRpb25hbFxuICAgICAgICA/IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLnllc2AsXG4gICAgICAgICAgXCJTaW1cIlxuICAgICAgICApXG4gICAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMubm9gLFxuICAgICAgICAgIFwiTmFvXCJcbiAgICAgICAgKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuICBnZXQgZmlsdGVyUmV2aWV3UHJldmlld0xhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJldmlldyA9IHRoaXMucmVzb2x2ZUZpbHRlckRyYWZ0U3FsUHJldmlldygpO1xuICAgIHJldHVybiBwcmV2aWV3IHx8IFwiLVwiO1xuICB9XG4gIGdldCBzb3VyY2VNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlTW9kYWxTdGVwID09PSBcInNlbGVjdFwiO1xuICB9XG4gIGdldCBzb3VyY2VNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZU1vZGFsU3RlcCA9PT0gXCJjb25maWd1cmVcIjtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxDYW5Qcm9jZWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IGNhbk9wZW5Tb3VyY2VDb25maWd1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cbiAgZ2V0IHNvdXJjZUl0ZW1zKCk6IFNvdXJjZVZpZXdJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlVGFibGVEaXNwbGF5UGFydHMoaXRlbS50YWJsZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogaXRlbS50YWJsZSxcbiAgICAgICAgZGJMYWJlbDogcGFydHMuZGJMYWJlbCxcbiAgICAgICAgdGFibGVMYWJlbDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgYWxpYXM6IGl0ZW0uYWxpYXMsXG4gICAgICAgIGhhc0N1c3RvbUFsaWFzOiB0aGlzLmhhc0N1c3RvbUFsaWFzKGl0ZW0udGFibGUsIGl0ZW0uYWxpYXMpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxUaW1lbGluZUl0ZW1zKCk6IFRpbWVsaW5lSXRlbVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBpZDogXCJzZWxlY3RcIixcbiAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWN0aW9ucy5zZWxlY3RUYWJsZXNgLFxuICAgICAgICAgIEZBTExCQUNLX1NFTEVDVF9UQUJMRVNcbiAgICAgICAgKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNvdXJjZXMuc3RlcHMuc2VsZWN0LnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkVzY29saGEgYXMgdGFiZWxhcyBxdWUgZGV2ZW0gYWxpbWVudGFyIGEgdmlzYW8gYW50ZXMgZGUgY29uZmlndXJhciBvcyBhbGlhc2VzLlwiXG4gICAgICAgICksXG4gICAgICAgIGluZGljYXRvckxhYmVsOiBcIjFcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBcImNvbmZpZ3VyZVwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLmNvbmZpZ3VyZUFsaWFzZXNgLFxuICAgICAgICAgIFwiQ29uZmlndXJhciBhbGlhc2VzXCJcbiAgICAgICAgKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNvdXJjZXMuc3RlcHMuY29uZmlndXJlLnN1YnRpdGxlYCxcbiAgICAgICAgICBcIlJldmlzZSBvcyBhbGlhc2VzIHN1Z2VyaWRvcyBlIGFqdXN0ZSBvcyBub21lcyBmaW5haXMgZGFzIHRhYmVsYXMgc2VsZWNpb25hZGFzLlwiXG4gICAgICAgICksXG4gICAgICAgIGluZGljYXRvckxhYmVsOiBcIjJcIixcbiAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLnNvdXJjZU1vZGFsQ2FuUHJvY2VlZCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuICBnZXQgc291cmNlTW9kYWxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNvdXJjZXMudGl0bGVgLFxuICAgICAgRkFMTEJBQ0tfU0VMRUNUX1RBQkxFU1xuICAgICk7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsVGltZWxpbmVBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjY2Vzc2liaWxpdHkuc291cmNlTW9kYWxUaW1lbGluZWAsXG4gICAgICBcIkV0YXBhcyBkYSBjb25maWd1cmFjYW8gZGFzIHRhYmVsYXNcIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsUGlja2xpc3RJdGVtcygpOiBUYWJsZVBpY2tsaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRhYmxlUGlja2xpc3RJdGVtcyh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSk7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsU2VsZWN0ZWRQaWNrbGlzdElkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlTW9kYWxEcmFmdHNcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHRoaXMucmVzb2x2ZVRhYmxlUGlja2xpc3RJZChpdGVtLnRhYmxlKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpdGVtKTogaXRlbSBpcyBudW1iZXIgPT4gdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIgJiYgaXRlbSA+IDBcbiAgICAgICk7XG4gIH1cbiAgZ2V0IHNvdXJjZU1vZGFsQ29uZmlndXJlZEl0ZW1zKCk6IFNvdXJjZUNvbmZpZ3VyZWRJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVUYWJsZURpc3BsYXlQYXJ0cyhpdGVtLnRhYmxlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpdGVtLnRhYmxlLFxuICAgICAgICB0YWJsZTogaXRlbS50YWJsZSxcbiAgICAgICAgZGJMYWJlbDogcGFydHMuZGJMYWJlbCxcbiAgICAgICAgdGFibGVMYWJlbDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgYWxpYXM6IGl0ZW0uYWxpYXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGdldCBqb2luSXRlbXMoKTogSm9pblZpZXdJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS5zb3VyY2VDb2x1bW4pO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS50YXJnZXRDb2x1bW4pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGAke2l0ZW0uc291cmNlQ29sdW1ufS0ke2l0ZW0udGFyZ2V0Q29sdW1ufS0ke2luZGV4fWAsXG4gICAgICAgIHNvdXJjZVRhYmxlOiBzb3VyY2UudGFibGVMYWJlbCxcbiAgICAgICAgc291cmNlRmllbGQ6IHNvdXJjZS5maWVsZExhYmVsLFxuICAgICAgICBvcGVyYXRvcjogdGhpcy5yZXNvbHZlSm9pbk9wZXJhdG9yTGFiZWwoaXRlbS5vcGVyYXRvciksXG4gICAgICAgIHRhcmdldFRhYmxlOiB0YXJnZXQudGFibGVMYWJlbCxcbiAgICAgICAgdGFyZ2V0RmllbGQ6IHRhcmdldC5maWVsZExhYmVsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuICBnZXQgZ3JvdXBCeUl0ZW1zKCk6IFNpbXBsZVZpZXdJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeS5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICBpZDogaXRlbSxcbiAgICAgIC4uLnRoaXMucmVzb2x2ZUNvbHVtblBhcnRzKGl0ZW0pLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgZmllbGRJdGVtc0xlZ2FjeSgpOiB1bmtub3duW10ge1xuICAgIHJldHVybiB0aGlzLmdldE9yZGVyZWRGaWVsZEVudHJpZXMoKS5tYXAoKGVudHJ5LCBpbmRleCkgPT4gKHtcbiAgICAgIGlkOiBlbnRyeS5jb2x1bW4sXG4gICAgICBsYWJlbDogYCR7aW5kZXggKyAxfcKwICR7dGhpcy5yZXNvbHZlQ29sdW1uUGF0aChlbnRyeS5jb2x1bW4pfWAsXG4gICAgICBvcmRlcjogaW5kZXgsXG4gICAgfSkpO1xuICB9XG4gIGdldCBmaWVsZEl0ZW1zKCk6IEZpZWxkVmlld0l0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JkZXJlZEZpZWxkRW50cmllcygpLm1hcCgoZW50cnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBlbnRyeS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUU7XG4gICAgICBjb25zdCBmdW5jdGlvbkFsaWFzID0gZW50cnkuZnVuY3Rpb24/LmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBgJHtlbnRyeS5jb2x1bW59LSR7aW5kZXh9YCxcbiAgICAgICAgc291cmNlSW5kZXg6IGVudHJ5LnNvdXJjZUluZGV4LFxuICAgICAgICBjb2x1bW46IGVudHJ5LmNvbHVtbixcbiAgICAgICAgb3JkZXJMYWJlbDogYCR7aW5kZXggKyAxfcKwYCxcbiAgICAgICAgLi4udGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoZW50cnkuY29sdW1uKSxcbiAgICAgICAgYWxpYXM6IGVudHJ5LmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIHdpZHRoOiBlbnRyeS53aWR0aD8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICAgIGZ1bmN0aW9uTGFiZWw6IGZ1bmN0aW9uTmFtZSA/IHRoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwoZnVuY3Rpb25OYW1lKSA6IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbkFsaWFzLFxuICAgICAgICBoYXNDdXN0b21Db25maWc6XG4gICAgICAgICAgISFlbnRyeS5hbGlhcz8udHJpbSgpIHx8ICEhZW50cnkud2lkdGg/LnRyaW0oKSB8fCAhIWZ1bmN0aW9uTmFtZSB8fCAhIWZ1bmN0aW9uQWxpYXMsXG4gICAgICAgIG9yZGVyOiBpbmRleCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgZ2V0IGZpZWxkTW9kYWxTZWxlY3Rpb25Sb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICB0aGlzLmZpZWxkU2VsZWN0YWJsZUNvbHVtbnMsXG4gICAgICB0aGlzLmZpZWxkTW9kYWxEcmFmdHMubWFwKChpdGVtKSA9PiBpdGVtLmNvbHVtbiksXG4gICAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2gsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbENvbmZpZ3VyZWRJdGVtcygpOiBGaWVsZE1vZGFsQ29uZmlndXJlZEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRNb2RhbERyYWZ0cy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucmVzb2x2ZUNvbHVtblBhcnRzKGl0ZW0uY29sdW1uKTtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGl0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICAgIGlkOiBgJHtpdGVtLmNvbHVtbn0tJHtpbmRleH1gLFxuICAgICAgICBjb2x1bW46IGl0ZW0uY29sdW1uLFxuICAgICAgICB0YWJsZUxhYmVsOiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICBmaWVsZExhYmVsOiBwYXJ0cy5maWVsZExhYmVsLFxuICAgICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB3aWR0aDogaXRlbS53aWR0aD8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbkxhYmVsOiBmdW5jdGlvbk5hbWVcbiAgICAgICAgICA/IHRoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwoZnVuY3Rpb25OYW1lKVxuICAgICAgICAgIDogRU1QVFlfVkFMVUUsXG4gICAgICAgIGZ1bmN0aW9uQWxpYXM6IGl0ZW0uZnVuY3Rpb24/LmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsSGFzU2VsZWN0YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZWxlY3RhYmxlQ29sdW1ucy5zb21lKFxuICAgICAgKGl0ZW0pID0+ICF0aGlzLmZpZWxkTW9kYWxEcmFmdHMuc29tZSgoZHJhZnQpID0+IGRyYWZ0LmNvbHVtbiA9PT0gaXRlbS52YWx1ZSlcbiAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsQ2FuU2VsZWN0QWxsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkTW9kYWxTZWxlY3Rpb25Sb3dzLnNvbWUoKGl0ZW0pID0+ICFpdGVtLnNlbGVjdGVkKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbFBpY2tsaXN0SXRlbXMoKTogQ29sdW1uUGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uUGlja2xpc3RJdGVtcyh0aGlzLmZpZWxkU2VsZWN0YWJsZUNvbHVtbnMpO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsU2VsZWN0ZWRQaWNrbGlzdElkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRNb2RhbERyYWZ0c1xuICAgICAgLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZChpdGVtLmNvbHVtbikpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoaXRlbSk6IGl0ZW0gaXMgbnVtYmVyID0+IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiICYmIGl0ZW0gPiAwXG4gICAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZE1vZGFsU3RlcCA9PT0gXCJzZWxlY3RcIjtcbiAgfVxuICBnZXQgZmllbGRNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkTW9kYWxTdGVwID09PSBcImNvbmZpZ3VyZVwiO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsVGltZWxpbmVBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjY2Vzc2liaWxpdHkuZmllbGRNb2RhbFRpbWVsaW5lYCxcbiAgICAgIFwiRXRhcGFzIGRhIGNvbmZpZ3VyYWNhbyBkbyBjYW1wb1wiXG4gICAgKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbFRpbWVsaW5lSXRlbXMoKTogVGltZWxpbmVJdGVtW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGlkOiBcInNlbGVjdFwiLFxuICAgICAgICBsYWJlbDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLnNlbGVjdENvbHVtbnNgLFxuICAgICAgICAgIFwiU2VsZWNpb25hciBjb2x1bmFzXCJcbiAgICAgICAgKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpZWxkcy5zdWJ0aXRsZWAsXG4gICAgICAgICAgXCJFc2NvbGhhIHVtYSBvdSBtYWlzIGNvbHVuYXMgcGFyYSBleHBvciBubyByZXN1bHRhZG8uXCJcbiAgICAgICAgKSxcbiAgICAgICAgaW5kaWNhdG9yTGFiZWw6IFwiMVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwiY29uZmlndXJlXCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmZpZWxkTW9kYWxUaXRsZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpZWxkLnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkFqdXN0ZSBhbGlhcywgbGFyZ3VyYSBlIGZ1bmNhbyBhbnRlcyBkZSBzYWx2YXIgbyBjYW1wby5cIlxuICAgICAgICApLFxuICAgICAgICBpbmRpY2F0b3JMYWJlbDogXCIyXCIsXG4gICAgICAgIGRpc2FibGVkOiAhdGhpcy5maWVsZE1vZGFsRHJhZnRzLmxlbmd0aCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuICBnZXQgZmlsdGVyTW9kYWxUaW1lbGluZUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uYWNjZXNzaWJpbGl0eS5maWx0ZXJNb2RhbFRpbWVsaW5lYCxcbiAgICAgIFwiRXRhcGFzIGRhIGNvbmZpZ3VyYWNhbyBkbyBmaWx0cm9cIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsVGltZWxpbmVJdGVtcygpOiBUaW1lbGluZUl0ZW1bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwic2VsZWN0XCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuc3RlcHMuc2VsZWN0LnRpdGxlYCxcbiAgICAgICAgICBcIlNlbGVjaW9uYXIgYmFzZVwiXG4gICAgICAgICksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuc3RlcHMuc2VsZWN0LnN1YnRpdGxlYCxcbiAgICAgICAgICBcIkVzY29saGEgbyB0aXBvIGRlIGZpbHRybyBlIGRlZmluYSBvIGNhbXBvIGluaWNpYWwgYW50ZXMgZGUgY29uZmlndXJhci5cIlxuICAgICAgICApLFxuICAgICAgICBpbmRpY2F0b3JMYWJlbDogXCIxXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogXCJjb25maWd1cmVcIixcbiAgICAgICAgbGFiZWw6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLmZpbHRlci5zdGVwcy5jb25maWd1cmUudGl0bGVgLFxuICAgICAgICAgIFwiQ29uZmlndXJhciBmaWx0cm9cIlxuICAgICAgICApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmlsdGVyLnN0ZXBzLmNvbmZpZ3VyZS5zdWJ0aXRsZWAsXG4gICAgICAgICAgXCJEZWZpbmEgb3BlcmFkb3IsIHZhbG9yIGUgY29tcG9ydGFtZW50byBmaW5hbCBkbyBmaWx0cm8uXCJcbiAgICAgICAgKSxcbiAgICAgICAgaW5kaWNhdG9yTGFiZWw6IFwiMlwiLFxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZmlsdGVyTW9kYWxDYW5Qcm9jZWVkLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IFwicmV2aWV3XCIsXG4gICAgICAgIGxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuc3RlcHMucmV2aWV3LnRpdGxlYCxcbiAgICAgICAgICBcIlJldmlzYXIgcmVncmFcIlxuICAgICAgICApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmlsdGVyLnN0ZXBzLnJldmlldy5zdWJ0aXRsZWAsXG4gICAgICAgICAgXCJDb25maXJtZSBvIHJlc3VtbyBmaW5hbCBkYSByZWdyYSBhbnRlcyBkZSBzYWx2YXIuXCJcbiAgICAgICAgKSxcbiAgICAgICAgaW5kaWNhdG9yTGFiZWw6IFwiM1wiLFxuICAgICAgICBkaXNhYmxlZDogIXRoaXMuZmlsdGVyTW9kYWxDYW5SZXZpZXcsXG4gICAgICB9LFxuICAgIF07XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsQ29uZmlndXJlQWN0aW9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMubmV4dFN0ZXBgLFxuICAgICAgXCJQcm94aW1hIGV0YXBhXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFJldmlld0FjdGlvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLnJldmlld1J1bGVgLFxuICAgICAgXCJSZXZpc2FyIHJlZ3JhXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFNlbGVjdGlvbkhlbHBlclRleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5maWx0ZXIuZG9tYWluU2VsZWN0aW9uSGludGAsXG4gICAgICAgIFwiQSBleHByZXNzYW8gZGUgZG9taW5pbyBzZXJhIGNvbmZpZ3VyYWRhIG5hIHByb3hpbWEgZXRhcGEuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmlsdGVyLmNvbmRpdGlvblNlbGVjdGlvbkhpbnRgLFxuICAgICAgXCJTZWxlY2lvbmUgdW0gY2FtcG8gcGFyYSBsaWJlcmFyIGEgY29uZmlndXJhY2FvIGRldGFsaGFkYSBkbyBmaWx0cm8uXCJcbiAgICApO1xuICB9XG4gIGdldCBmaWVsZE1vZGFsRnVuY3Rpb25PcHRpb25zKCk6IER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0ZXh0OiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5ub25lYCxcbiAgICAgICAgICBcIlNlbSBmdW5jYW9cIlxuICAgICAgICApLFxuICAgICAgICB2YWx1ZTogRU1QVFlfVkFMVUUsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5mdW5jdGlvbk9wdGlvbnMsXG4gICAgXTtcbiAgfVxuICBnZXQgc29ydEl0ZW1zKCk6IFNvcnRWaWV3SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvcnRpbmcubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgIGlkOiBgJHtpdGVtLmNvbHVtbn0tJHtpdGVtLmZ1bmN0aW9uTmFtZSA/PyBFTVBUWV9WQUxVRX0tJHtpdGVtLmRpcmVjdGlvbn0tJHtpbmRleH1gLFxuICAgICAgLi4udGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS5jb2x1bW4pLFxuICAgICAgZnVuY3Rpb25OYW1lOiBpdGVtLmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb25MYWJlbDogaXRlbS5mdW5jdGlvbk5hbWVcbiAgICAgICAgPyB0aGlzLnJlc29sdmVGdW5jdGlvbkxhYmVsKGl0ZW0uZnVuY3Rpb25OYW1lKVxuICAgICAgICA6IEVNUFRZX1ZBTFVFLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLnJlc29sdmVPcHRpb25MYWJlbChcbiAgICAgICAgaXRlbS5kaXJlY3Rpb24sXG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbk9wdGlvbnNcbiAgICAgICksXG4gICAgfSkpO1xuICB9XG4gIGdldCBmaWx0ZXJJdGVtc0xlZ2FjeSgpOiB1bmtub3duW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVycy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgaWQ6IGAke2l0ZW0udmFsdWVUeXBlfS0ke2l0ZW0uY29sdW1ufS0ke2luZGV4fWAsXG4gICAgICB0aXRsZTpcbiAgICAgICAgaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgICAgID8gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZG9tYWluTGFiZWxgLFxuICAgICAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICAgICAgKVxuICAgICAgICAgIDogYCR7dGhpcy5yZXNvbHZlQ29sdW1uTGFiZWwoXG4gICAgICAgICAgICBpdGVtLmNvbHVtblxuICAgICAgICAgICl9IMK3ICR7dGhpcy5yZXNvbHZlRmlsdGVyT3BlcmF0b3JMYWJlbChpdGVtLm9wZXJhdG9yKX1gLFxuICAgICAgc3VidGl0bGU6IHRoaXMucmVzb2x2ZUZpbHRlckRpc3BsYXlWYWx1ZShpdGVtKSxcbiAgICAgIG9wdGlvbmFsOiBpdGVtLm9wdGlvbmFsLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgZmlsdGVySXRlbXMoKTogRmlsdGVyVmlld0l0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWx0ZXJzLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID1cbiAgICAgICAgaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgZGJMYWJlbDogRU1QVFlfVkFMVUUsXG4gICAgICAgICAgICB0YWJsZUxhYmVsOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgICAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZmllbGRMYWJlbDogRU1QVFlfVkFMVUUsXG4gICAgICAgICAgfVxuICAgICAgICAgIDogdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS5jb2x1bW4pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogYCR7aXRlbS52YWx1ZVR5cGV9LSR7aXRlbS5jb2x1bW59LSR7aW5kZXh9YCxcbiAgICAgICAgLi4ucGFydHMsXG4gICAgICAgIG9wZXJhdG9yTGFiZWw6XG4gICAgICAgICAgaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgICAgICAgPyBFTVBUWV9WQUxVRVxuICAgICAgICAgICAgOiB0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvckxhYmVsKGl0ZW0ub3BlcmF0b3IpLFxuICAgICAgICBzdWJ0aXRsZTogdGhpcy5yZXNvbHZlRmlsdGVyRGlzcGxheVZhbHVlKGl0ZW0pLFxuICAgICAgICBvcHRpb25hbDogaXRlbS5vcHRpb25hbCxcbiAgICAgICAgaXNEb21haW46IGl0ZW0udmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIGdldCBzZWxlY3Rpb25Nb2RhbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kYWxNb2RlID09PSBcInRhYmxlc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNvdXJjZXMudGl0bGVgLFxuICAgICAgICBGQUxMQkFDS19TRUxFQ1RfVEFCTEVTXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RhbE1vZGUgPT09IFwiZmllbGRzXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmllbGRzLnRpdGxlYCxcbiAgICAgICAgXCJTZWxlY2lvbmFyIGNhbXBvc1wiXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9Lm1vZGFscy5ncm91cEJ5LnRpdGxlYCxcbiAgICAgIFwiU2VsZWNpb25hciBHcm91cCBCeVwiXG4gICAgKTtcbiAgfVxuICBnZXQgbW9kYWxTZWFyY2hMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLnNlYXJjaGAsXG4gICAgICBcIkJ1c2NhclwiXG4gICAgKTtcbiAgfVxuICBnZXQgbW9kYWxTZWFyY2hQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyYCxcbiAgICAgIFwiQnVzY2FyXCJcbiAgICApO1xuICB9XG4gIGdldCBtb2RhbE5hbWVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLm5hbWVgLFxuICAgICAgXCJOb21lXCJcbiAgICApO1xuICB9XG4gIGdldCBtb2RhbFR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZmllbGRzLnR5cGVgLFxuICAgICAgXCJUaXBvXCJcbiAgICApO1xuICB9XG4gIGdldCBtb2RhbFNlbGVjdExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLnNlbGVjdGAsXG4gICAgICBcIlNlbGVjaW9uYXJcIlxuICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlck1vZGFsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmNhcmRzLmZpbHRlcnMudGl0bGVgLFxuICAgICAgXCJGaWx0cm9zXCJcbiAgICApO1xuICB9XG4gIGdldCBzb3J0TW9kYWxUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uY2FyZHMuc29ydGluZy50aXRsZWAsXG4gICAgICBcIk9yZGVuYWNhb1wiXG4gICAgKTtcbiAgfVxuICBnZXQgZmllbGRNb2RhbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5tb2RhbHMuZmllbGQudGl0bGVgLFxuICAgICAgXCJDb25maWd1cmFyIGNhbXBvXCJcbiAgICApO1xuICB9XG4gIGdldCBzZWxlY3Rpb25Nb2RhbFJvd3MoKTogU2VsZWN0aW9uUm93W10ge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJ0YWJsZXNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUYWJsZVNlbGVjdGlvblJvd3MoXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2hcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5TZWxlY3Rpb25Sb3dzKFxuICAgICAgICB0aGlzLmZpZWxkU2VsZWN0YWJsZUNvbHVtbnMsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMsXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2hcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uU2VsZWN0aW9uUm93cyhcbiAgICAgIHRoaXMuZ3JvdXBCeVNlbGVjdGFibGVDb2x1bW5zLFxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyxcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2hcbiAgICApO1xuICB9XG4gIGdldCBzZWxlY3Rpb25Nb2RhbFBpY2tsaXN0SXRlbXMoKTogQ29sdW1uUGlja2xpc3RJdGVtW10ge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuZmllbGRTZWxlY3RhYmxlQ29sdW1ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuZ3JvdXBCeVNlbGVjdGFibGVDb2x1bW5zKTtcbiAgfVxuICBnZXQgc2VsZWN0aW9uTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RhbElkc1xuICAgICAgLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZChpdGVtKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChpdGVtKTogaXRlbSBpcyBudW1iZXIgPT4gdHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIgJiYgaXRlbSA+IDBcbiAgICAgICk7XG4gIH1cbiAgZ2V0IGpvaW5Tb3VyY2VSb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICB0aGlzLmF2YWlsYWJsZUNvbHVtbnMsXG4gICAgICB0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4gPyBbdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uXSA6IFtdLFxuICAgICAgdGhpcy5qb2luU291cmNlU2VhcmNoLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9XG4gIGdldCBqb2luU291cmNlUGlja2xpc3RJdGVtcygpOiBDb2x1bW5QaWNrbGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRDb2x1bW5QaWNrbGlzdEl0ZW1zKHRoaXMuYXZhaWxhYmxlQ29sdW1ucyk7XG4gIH1cbiAgZ2V0IGpvaW5Tb3VyY2VTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzZWxlY3RlZElkID0gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZCh0aGlzLmpvaW5EcmFmdC5zb3VyY2VDb2x1bW4pO1xuICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0ZWRJZCA9PT0gXCJudW1iZXJcIiAmJiBzZWxlY3RlZElkID4gMFxuICAgICAgPyBbc2VsZWN0ZWRJZF1cbiAgICAgIDogW107XG4gIH1cbiAgZ2V0IGpvaW5UYXJnZXRSb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uKTtcbiAgICBjb25zdCBpdGVtcyA9IHNvdXJjZVxuICAgICAgPyB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnRhYmxlICE9PSBzb3VyY2UudGFibGUpXG4gICAgICA6IHRoaXMuYXZhaWxhYmxlQ29sdW1ucztcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICBpdGVtcyxcbiAgICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA/IFt0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW5dIDogW10sXG4gICAgICB0aGlzLmpvaW5UYXJnZXRTZWFyY2gsXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH1cbiAgZ2V0IGpvaW5UYXJnZXRTZWxlY3RhYmxlQ29sdW1ucygpOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbik7XG4gICAgcmV0dXJuIHNvdXJjZVxuICAgICAgPyB0aGlzLmF2YWlsYWJsZUNvbHVtbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnRhYmxlICE9PSBzb3VyY2UudGFibGUpXG4gICAgICA6IHRoaXMuYXZhaWxhYmxlQ29sdW1ucztcbiAgfVxuICBnZXQgam9pblRhcmdldFBpY2tsaXN0SXRlbXMoKTogQ29sdW1uUGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uUGlja2xpc3RJdGVtcyh0aGlzLmpvaW5UYXJnZXRTZWxlY3RhYmxlQ29sdW1ucyk7XG4gIH1cbiAgZ2V0IGpvaW5UYXJnZXRTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzZWxlY3RlZElkID0gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZCh0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4pO1xuICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0ZWRJZCA9PT0gXCJudW1iZXJcIiAmJiBzZWxlY3RlZElkID4gMFxuICAgICAgPyBbc2VsZWN0ZWRJZF1cbiAgICAgIDogW107XG4gIH1cbiAgZ2V0IHNvcnRDb2x1bW5Sb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0U2VsZWN0YWJsZUl0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICB0aGlzLm1hdGNoZXNTZWFyY2goXG4gICAgICAgICAgW2l0ZW0udGFibGVMYWJlbCwgaXRlbS5maWVsZExhYmVsLCBpdGVtLm1ldGFdLFxuICAgICAgICAgIHRoaXMuc29ydFNlYXJjaFxuICAgICAgICApXG4gICAgICApXG4gICAgICAubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgbmFtZTogaXRlbS5maWVsZExhYmVsLFxuICAgICAgICBtZXRhOiBpdGVtLm1ldGEsXG4gICAgICAgIHNlbGVjdGVkOlxuICAgICAgICAgIHRoaXMuc29ydERyYWZ0LmNvbHVtbiA9PT0gaXRlbS5jb2x1bW4gJiZcbiAgICAgICAgICAodGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lIHx8IEVNUFRZX1ZBTFVFKSA9PT0gaXRlbS5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgdGFibGVMYWJlbDogaXRlbS50YWJsZUxhYmVsLFxuICAgICAgICBwYXRoVHlwZTogXCJjb2x1bW5cIiBhcyBjb25zdCxcbiAgICAgIH0pKTtcbiAgfVxuICBnZXQgc29ydFBpY2tsaXN0SXRlbXMoKTogU29ydFBpY2tsaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5zb3J0U2VsZWN0YWJsZUl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICBpZDogaW5kZXggKyAxLFxuICAgICAgdGl0bGU6IGAke2l0ZW0udGFibGVMYWJlbH0uJHtpdGVtLmZpZWxkTGFiZWx9YCxcbiAgICAgIHRpdGxlUHJlZml4OiBpdGVtLnRhYmxlTGFiZWwsXG4gICAgICB0aXRsZVN1ZmZpeDogaXRlbS5maWVsZExhYmVsLFxuICAgICAgdGl0bGVQcmVmaXhDb2xvcjogVklTVUFMX1NRTF9UQUJMRV9DT0xPUixcbiAgICAgIHRpdGxlU3VmZml4Q29sb3I6IFZJU1VBTF9TUUxfRklFTERfQ09MT1IsXG4gICAgICBiYWRnZTogaXRlbS5tZXRhLFxuICAgICAgYmFkZ2VDb2xvcjogaXRlbS5mdW5jdGlvbk5hbWVcbiAgICAgICAgPyBQSUNLTElTVF9GVU5DVElPTl9CQURHRV9DT0xPUlxuICAgICAgICA6IFBJQ0tMSVNUX0RBVEFfVFlQRV9CQURHRV9DT0xPUixcbiAgICAgIHNlbGVjdGlvbklkOiBpdGVtLmlkLFxuICAgICAgY29sdW1uOiBpdGVtLmNvbHVtbixcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IHNvcnRTZWxlY3RlZFBpY2tsaXN0SWRzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc29ydFBpY2tsaXN0SXRlbXMuZmluZChcbiAgICAgIChpdGVtKSA9PlxuICAgICAgICBpdGVtLmNvbHVtbiA9PT0gdGhpcy5zb3J0RHJhZnQuY29sdW1uICYmXG4gICAgICAgIGl0ZW0uc2VsZWN0aW9uSWQgPT09XG4gICAgICAgIHRoaXMuYnVpbGRTb3J0U2VsZWN0aW9uSWQoXG4gICAgICAgICAgdGhpcy5zb3J0RHJhZnQuY29sdW1uLFxuICAgICAgICAgIHRoaXMuc29ydERyYWZ0LmZ1bmN0aW9uTmFtZSB8fCBFTVBUWV9TT1JUX0ZVTkNUSU9OXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkID8gW3NlbGVjdGVkLmlkXSA6IFtdO1xuICB9XG4gIGdldCBmaWx0ZXJDb2x1bW5Sb3dzKCk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZENvbHVtblNlbGVjdGlvblJvd3MoXG4gICAgICB0aGlzLmF2YWlsYWJsZUNvbHVtbnMsXG4gICAgICB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbiA/IFt0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbl0gOiBbXSxcbiAgICAgIHRoaXMuZmlsdGVyU2VhcmNoLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFBpY2tsaXN0SXRlbXMoKTogQ29sdW1uUGlja2xpc3RJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ29sdW1uUGlja2xpc3RJdGVtcyh0aGlzLmF2YWlsYWJsZUNvbHVtbnMpO1xuICB9XG4gIGdldCBmaWx0ZXJNb2RhbFNlbGVjdGVkUGlja2xpc3RJZHMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdElkKHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKTtcbiAgICByZXR1cm4gdHlwZW9mIHNlbGVjdGVkSWQgPT09IFwibnVtYmVyXCIgJiYgc2VsZWN0ZWRJZCA+IDBcbiAgICAgID8gW3NlbGVjdGVkSWRdXG4gICAgICA6IFtdO1xuICB9XG4gIGdldCBzb3J0Q29sdW1uU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNvcnREcmFmdC5jb2x1bW5cbiAgICAgID8gdGhpcy5yZXNvbHZlU29ydERyYWZ0TGFiZWwoKVxuICAgICAgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMuZW1wdHlTZWxlY3Rpb25gLFxuICAgICAgICBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT05cbiAgICAgICk7XG4gIH1cbiAgZ2V0IGZpbHRlckNvbHVtblN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmZpbHRlcnMuZG9tYWluTGFiZWxgLFxuICAgICAgICBcIkV4cHJlc3NhbyBkZSBkb21pbmlvXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtblxuICAgICAgPyB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uKVxuICAgICAgOiB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5zdGF0ZXMuZW1wdHlTZWxlY3Rpb25gLFxuICAgICAgICBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT05cbiAgICAgICk7XG4gIH1cbiAgZ2V0IGpvaW5Tb3VyY2VTdW1tYXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtblxuICAgICAgPyB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbilcbiAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLmVtcHR5U2VsZWN0aW9uYCxcbiAgICAgICAgRkFMTEJBQ0tfRU1QVFlfU0VMRUNUSU9OXG4gICAgICApO1xuICB9XG4gIGdldCBqb2luVGFyZ2V0U3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW5cbiAgICAgID8gdGhpcy5yZXNvbHZlQ29sdW1uUGF0aCh0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4pXG4gICAgICA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5lbXB0eVNlbGVjdGlvbmAsXG4gICAgICAgIEZBTExCQUNLX0VNUFRZX1NFTEVDVElPTlxuICAgICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyT3BlcmF0b3JPcHRpb25zKCk6IER5bmFtaWNWaWV3QnVpbGRlck9wdGlvbltdIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5maWx0ZXJEcmFmdC5jb2x1bW4pO1xuICAgIGlmICghY29sdW1uKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbHRlck9wZXJhdG9yc0ZvckNvbHVtbihjb2x1bW4pLm1hcCgodmFsdWUpID0+ICh7XG4gICAgICB2YWx1ZSxcbiAgICAgIHRleHQ6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXhcbiAgICAgICAgfS5maWx0ZXJzLm9wZXJhdG9ycy4ke3ZhbHVlLnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgdGhpcy5odW1hbml6ZUtleSh2YWx1ZSlcbiAgICAgICksXG4gICAgfSkpO1xuICB9XG4gIGdldCBub3JtYWxpemVkRmllbGRzKCk6IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkW10ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzLm1hcCgoaXRlbSkgPT5cbiAgICAgIHRoaXMubm9ybWFsaXplR2VuZXJhdGVkRmllbGQoaXRlbSlcbiAgICApO1xuICB9XG4gIGdldCBzZWxlY3RlZFNvcnREaXJlY3Rpb25JdGVtKCk6IFNlbGVjdEJ1dHRvbkl0ZW08c3RyaW5nPiB8IG51bGwge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtcy5maW5kKFxuICAgICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uXG4gICAgICApID8/IG51bGxcbiAgICApO1xuICB9XG4gIGdldCBmaWx0ZXJFeHByZXNzaW9uU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uLnRyaW0oKTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5maWx0ZXJEcmFmdC5jb2x1bW5cbiAgICAgID8gdGhpcy5yZXNvbHZlQ29sdW1uUGF0aCh0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbilcbiAgICAgIDogdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLmVtcHR5U2VsZWN0aW9uYCxcbiAgICAgICAgRkFMTEJBQ0tfRU1QVFlfU0VMRUNUSU9OXG4gICAgICApO1xuICAgIGNvbnN0IG9wZXJhdG9yID0gdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvclxuICAgICAgPyB0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvckxhYmVsKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IpXG4gICAgICA6IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LnN0YXRlcy5lbXB0eVNlbGVjdGlvbmAsXG4gICAgICAgIEZBTExCQUNLX0VNUFRZX1NFTEVDVElPTlxuICAgICAgKTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVzb2x2ZUZpbHRlckRyYWZ0RGlzcGxheVZhbHVlKCk7XG4gICAgcmV0dXJuIFtjb2x1bW4sIG9wZXJhdG9yLCB2YWx1ZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgZ2V0IGZpbHRlckNvbmZpZ3VyYXRpb25TdW1tYXJ5TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNb2RhbE1vZGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTlxuICAgICAgPyB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgICAgXCJFeHByZXNzYW8gZGUgZG9taW5pb1wiXG4gICAgICApXG4gICAgICA6IHRoaXMuZmlsdGVyQ29sdW1uU3VtbWFyeTtcbiAgfVxuICBnZXQgZmlsdGVyQmFja1RvU2VsZWN0aW9uTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMuYmFja1RvU2VsZWN0aW9uYCxcbiAgICAgIFwiVm9sdGFyIHBhcmEgc2VsZWNhb1wiXG4gICAgKTtcbiAgfVxuICBnZXQgZmlsdGVyQmFja1RvQ29uZmlndXJhdGlvbkxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5hY3Rpb25zLmJhY2tUb0NvbmZpZ3VyYXRpb25gLFxuICAgICAgXCJWb2x0YXIgcGFyYSBjb25maWd1cmFjYW9cIlxuICAgICk7XG4gIH1cbiAgZ2V0IHByZXZpZXdDb2x1bW5zKCk6IFRhYmxlQ29sdW1uW10ge1xuICAgIGNvbnN0IGNvbmZpZ0NvbHVtbnMgPSB0aGlzLnJlc29sdmVQcmV2aWV3Q29sdW1ucygpO1xuICAgIHJldHVybiBjb25maWdDb2x1bW5zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGZpZWxkOiBpdGVtLmZpZWxkLFxuICAgICAgaGVhZGVyOiBpdGVtLmhlYWRlciA/PyBpdGVtLmZpZWxkLFxuICAgICAgdHlwZTogKGl0ZW0udHlwZSBhcyBUYWJsZUNvbHVtbltcInR5cGVcIl0pID8/IFwidGV4dFwiLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgcHJldmlld1Jvd3MoKTogUm93QmFzZVtdIHtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnByZXZpZXdDb2x1bW5zXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmZpZWxkKVxuICAgICAgLmZpbHRlcigoZmllbGQpOiBmaWVsZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGZpZWxkID09PSBcInN0cmluZ1wiKTtcbiAgICBjb25zdCByb3dzID0gKCh0aGlzLmNvbmZpZy5wcmV2aWV3Py5yb3dzID8/IFtdKSBhcyBSb3dCYXNlW10pLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCBuZXh0OiBSb3dCYXNlID0ge307XG4gICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgICAgbmV4dFtmaWVsZF0gPSByb3dbZmllbGRdID8/IEVNUFRZX1ZBTFVFO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcbiAgICBpZiAocm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgICBpZiAoIWZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDUgfSkubWFwKChfLCByb3dJbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmV4dDogUm93QmFzZSA9IHt9O1xuICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgIG5leHRbZmllbGRdID0gYCR7ZmllbGR9XyR7cm93SW5kZXggKyAxfWA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICB9XG4gIGdldCBwcmV2aWV3VGFibGVDb25maWcoKTogVGFibGVPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm93czogRFlOQU1JQ19WSUVXX0JVSUxERVJfREVGQVVMVF9UQUJMRV9ST1dTLFxuICAgICAgc2hvd1Jvd3NQZXJQYWdlT3B0aW9uczogdHJ1ZSxcbiAgICAgIHJvd3NQZXJQYWdlT3B0aW9uczogUFJFVklFV19ST1dTX1BFUl9QQUdFX09QVElPTlMsXG4gICAgICBlbXB0eVRpdGxlOiBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uZW1wdHkucHJldmlld1RpdGxlYCxcbiAgICAgIGVtcHR5U3VidGl0bGU6IGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5lbXB0eS5wcmV2aWV3VGV4dGAsXG4gICAgfSBhcyBUYWJsZU9wdGlvbnM7XG4gIH1cbiAgZ2V0IHNxbFByZXZpZXcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBnZW5lcmF0ZWRTcWwgPSB0aGlzLmJ1aWxkR2VuZXJhdGVkU3FsKCk7XG4gICAgaWYgKGdlbmVyYXRlZFNxbCkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlZFNxbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm1hbnVhbD8uc3FsID8/IEVNUFRZX1ZBTFVFO1xuICB9XG4gIGdldCBzcWxQcmV2aWV3SGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0TW9kZSA9PT0gXCJzcGxpdFwiID8gXCIxMDAlXCIgOiBcIjI0cmVtXCI7XG4gIH1cbiAgZ2V0IHNxbFByZXZpZXdQYW5lbEhlaWdodCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXRNb2RlID09PSBcInNwbGl0XCJcbiAgICAgID8gdGhpcy5tZWFzdXJlZFNwbGl0UHJldmlld0hlaWdodFxuICAgICAgOiBudWxsO1xuICB9XG4gIGdldCBwcmV2aWV3VG9nZ2xlTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmFjdGlvbnMuJHt0aGlzLnByZXZpZXdWaXNpYmxlID8gXCJoaWRlUHJldmlld1wiIDogXCJzaG93UHJldmlld1wiXG4gICAgICB9YCxcbiAgICAgIHRoaXMucHJldmlld1Zpc2libGUgPyBcIk9jdWx0YXIgcHJldmlld1wiIDogXCJWaXN1YWxpemFyIHByZXZpZXdcIlxuICAgICk7XG4gIH1cbiAgZ2V0IHNlbGVjdGVkRmlsdGVyTW9kZUl0ZW0oKTogU2VsZWN0QnV0dG9uSXRlbTxGaWx0ZXJNb2RhbE1vZGU+IHwgbnVsbCB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZmlsdGVyTW9kZUl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHRoaXMuZmlsdGVyTW9kYWxNb2RlKSA/P1xuICAgICAgbnVsbFxuICAgICk7XG4gIH1cbiAgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogeyBpZDogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG4gIHRyYWNrQnlBcnJvdyhfOiBudW1iZXIsIGl0ZW06IEJ1aWxkZXJGbG93QXJyb3cpOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG4gIG9uTGF5b3V0TW9kZUNoYW5nZShpdGVtczogU2VsZWN0QnV0dG9uSXRlbTxCdWlsZGVyTGF5b3V0TW9kZT5bXSk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBpdGVtc1swXT8udmFsdWU7XG4gICAgaWYgKG5leHQgPT09IFwic3RhY2tlZFwiIHx8IG5leHQgPT09IFwic3BsaXRcIikge1xuICAgICAgdGhpcy5sYXlvdXRNb2RlID0gbmV4dDtcbiAgICAgIHRoaXMuc3luY1NlbGVjdGVkTGF5b3V0TW9kZUl0ZW1zKCk7XG4gICAgICB0aGlzLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuICB0b2dnbGVQcmV2aWV3KCk6IHZvaWQge1xuICAgIHRoaXMucHJldmlld1Zpc2libGUgPSAhdGhpcy5wcmV2aWV3VmlzaWJsZTtcbiAgICB0aGlzLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCgpO1xuICB9XG4gIG9uU29ydERpcmVjdGlvbkNoYW5nZShpdGVtczogU2VsZWN0QnV0dG9uSXRlbTxzdHJpbmc+W10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gaXRlbXNbMF0/LnZhbHVlO1xuICAgIGlmIChuZXh0KSB7XG4gICAgICB0aGlzLnNvcnREcmFmdC5kaXJlY3Rpb24gPSBuZXh0O1xuICAgICAgdGhpcy5zeW5jU2VsZWN0ZWRTb3J0RGlyZWN0aW9uSXRlbXMoKTtcbiAgICB9XG4gIH1cbiAgaXNGaWVsZERyb3BJbmRpY2F0b3JWaXNpYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggIT09IG51bGwgJiYgdGhpcy5kcmFnUHJldmlld0luZGV4ID09PSBpbmRleDtcbiAgfVxuICBpc0ZpZWxkRHJvcEluZGljYXRvckF0RW5kVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggIT09IG51bGwgJiZcbiAgICAgIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9PT0gdGhpcy5maWVsZEl0ZW1zLmxlbmd0aFxuICAgICk7XG4gIH1cbiAgb25GaWVsZERyYWdTdGFydChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmRyYWdQcmV2aWV3SW5kZXggPSB0aGlzLmdldEZpZWxkUHJldmlld1NvdXJjZUluZGV4ZXMoKS5pbmRleE9mKGluZGV4KTtcbiAgfVxuICBvbkZpZWxkRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCF0YXJnZXQgfHwgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzaG91bGRJbnNlcnRBZnRlciA9IGV2ZW50LmNsaWVudFggPiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMjtcbiAgICB0aGlzLmRyYWdQcmV2aWV3SW5kZXggPSBNYXRoLm1pbihcbiAgICAgIGluZGV4ICsgKHNob3VsZEluc2VydEFmdGVyID8gMSA6IDApLFxuICAgICAgdGhpcy5maWVsZEl0ZW1zLmxlbmd0aFxuICAgICk7XG4gIH1cbiAgb25GaWVsZERyb3AoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4ID09PSBudWxsIHx8IHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnUHJldmlld0luZGV4ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJldmlld0luZGV4ZXMgPSB0aGlzLmdldEZpZWxkUHJldmlld1NvdXJjZUluZGV4ZXMoKTtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gcHJldmlld0luZGV4ZXMubWFwKFxuICAgICAgKGl0ZW1JbmRleCkgPT4gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpZWxkc1tpdGVtSW5kZXhdXG4gICAgKTtcbiAgICB0aGlzLmRyYWdnaW5nRmllbGRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5kcmFnUHJldmlld0luZGV4ID0gbnVsbDtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb25GaWVsZERyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXggPSBudWxsO1xuICAgIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9IG51bGw7XG4gIH1cbiAgb3BlbkZpZWxkTW9kYWwoaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID1cbiAgICAgIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiA/IHRoaXMubm9ybWFsaXplZEZpZWxkc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5maWVsZE1vZGFsRHJhZnRzID0gdGhpcy5nZXRPcmRlcmVkRmllbGRFbnRyaWVzKCkubWFwKChpdGVtKSA9PiAoe1xuICAgICAgY29sdW1uOiBpdGVtLmNvbHVtbixcbiAgICAgIGFsaWFzOiBpdGVtLmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICB3aWR0aDogaXRlbS53aWR0aD8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb246IGl0ZW0uZnVuY3Rpb25cbiAgICAgICAgPyB7XG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiBpdGVtLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICAgIGFsaWFzOiBpdGVtLmZ1bmN0aW9uLmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsLFxuICAgIH0pKTtcbiAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uID0gbnVsbDtcbiAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdCA9IHtcbiAgICAgIGNvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbk5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb25BbGlhczogRU1QVFlfVkFMVUUsXG4gICAgfTtcbiAgICB0aGlzLmZpZWxkTW9kYWxTdGVwID1cbiAgICAgIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiAmJiBjdXJyZW50ID8gXCJjb25maWd1cmVcIiA6IFwic2VsZWN0XCI7XG4gICAgdGhpcy5maWVsZE1vZGFsVmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgb3BlbkZpZWxkQ29uZmlndXJhdGlvbk1vZGFsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5PcGVuRmllbGRDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuRmllbGRNb2RhbCgwKTtcbiAgfVxuICBjbG9zZUZpZWxkTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZmllbGRNb2RhbFN0ZXAgPSBcInNlbGVjdFwiO1xuICAgIHRoaXMuZmllbGRNb2RhbFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cyA9IFtdO1xuICAgIHRoaXMuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPSBudWxsO1xuICAgIHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0ID0ge1xuICAgICAgY29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uTmFtZTogRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbkFsaWFzOiBFTVBUWV9WQUxVRSxcbiAgICB9O1xuICB9XG4gIGdvVG9GaWVsZE1vZGFsU3RlcChzdGVwOiBGaWVsZE1vZGFsU3RlcCk6IHZvaWQge1xuICAgIGlmIChzdGVwID09PSBcImNvbmZpZ3VyZVwiICYmICF0aGlzLmZpZWxkTW9kYWxEcmFmdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmllbGRNb2RhbFN0ZXAgPSBzdGVwO1xuICAgIGlmIChzdGVwID09PSBcInNlbGVjdFwiKSB7XG4gICAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB9XG4gIH1cbiAgYWR2YW5jZUZpZWxkTW9kYWxTdGVwKCk6IHZvaWQge1xuICAgIHRoaXMuZ29Ub0ZpZWxkTW9kYWxTdGVwKFwiY29uZmlndXJlXCIpO1xuICB9XG4gIG9uRmllbGRNb2RhbFRpbWVsaW5lU3RlcFNlbGVjdChldmVudDogVGltZWxpbmVTdGVwU2VsZWN0RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmdvVG9GaWVsZE1vZGFsU3RlcChldmVudC5pdGVtLmlkID09PSBcImNvbmZpZ3VyZVwiID8gXCJjb25maWd1cmVcIiA6IFwic2VsZWN0XCIpO1xuICB9XG4gIHNlbGVjdEZpZWxkTW9kYWxDb2x1bW4oY29sdW1uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5maWVsZE1vZGFsRHJhZnRzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29sdW1uID09PSBjb2x1bW4pO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICB0aGlzLnJlbW92ZUZpZWxkTW9kYWxEcmFmdChjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cyA9IFtcbiAgICAgIC4uLnRoaXMuZmllbGRNb2RhbERyYWZ0cyxcbiAgICAgIHtcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBhbGlhczogRU1QVFlfVkFMVUUsXG4gICAgICAgIHdpZHRoOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgZnVuY3Rpb246IG51bGwsXG4gICAgICB9LFxuICAgIF07XG4gICAgdGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiA9IG51bGw7XG4gIH1cbiAgc2VsZWN0QWxsRmllbGRNb2RhbENvbHVtbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gbmV3IFNldChcbiAgICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cy5tYXAoKGl0ZW0pID0+IGl0ZW0uY29sdW1uKVxuICAgICk7XG4gICAgY29uc3Qgcm93c1RvU2VsZWN0ID0gdGhpcy5maWVsZFNlbGVjdGFibGVDb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhc2VsZWN0ZWRDb2x1bW5zLmhhcyhpdGVtLnZhbHVlKVxuICAgICk7XG5cbiAgICBpZiAoIXJvd3NUb1NlbGVjdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpZWxkTW9kYWxEcmFmdHMgPSBbXG4gICAgICAuLi50aGlzLmZpZWxkTW9kYWxEcmFmdHMsXG4gICAgICAuLi5yb3dzVG9TZWxlY3QubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBjb2x1bW46IGl0ZW0udmFsdWUsXG4gICAgICAgIGFsaWFzOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgd2lkdGg6IEVNUFRZX1ZBTFVFLFxuICAgICAgICBmdW5jdGlvbjogbnVsbCxcbiAgICAgIH0pKSxcbiAgICBdO1xuICAgIHRoaXMuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPSBudWxsO1xuICB9XG4gIGFkZEFub3RoZXJGaWVsZEZyb21Nb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgICB0aGlzLmZpZWxkTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgfVxuICBvbkZpZWxkTW9kYWxTZWxlY3RlZElkc0NoYW5nZShpZHM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gbmV3IFNldChcbiAgICAgIGlkc1xuICAgICAgICAubWFwKChpdGVtKSA9PiB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdENvbHVtbihpdGVtKSlcbiAgICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+ICEhaXRlbSlcbiAgICApO1xuICAgIGNvbnN0IHByZXNlcnZlZERyYWZ0cyA9IHRoaXMuZmllbGRNb2RhbERyYWZ0cy5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICBzZWxlY3RlZENvbHVtbnMuaGFzKGl0ZW0uY29sdW1uKVxuICAgICk7XG4gICAgY29uc3QgcHJlc2VydmVkQ29sdW1ucyA9IG5ldyBTZXQoXG4gICAgICBwcmVzZXJ2ZWREcmFmdHMubWFwKChpdGVtKSA9PiBpdGVtLmNvbHVtbilcbiAgICApO1xuICAgIGNvbnN0IGFwcGVuZGVkRHJhZnRzID0gdGhpcy5maWVsZFNlbGVjdGFibGVDb2x1bW5zXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICBzZWxlY3RlZENvbHVtbnMuaGFzKGl0ZW0udmFsdWUpICYmICFwcmVzZXJ2ZWRDb2x1bW5zLmhhcyhpdGVtLnZhbHVlKVxuICAgICAgKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgY29sdW1uOiBpdGVtLnZhbHVlLFxuICAgICAgICBhbGlhczogRU1QVFlfVkFMVUUsXG4gICAgICAgIHdpZHRoOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgZnVuY3Rpb246IG51bGwsXG4gICAgICB9KSk7XG5cbiAgICB0aGlzLmZpZWxkTW9kYWxEcmFmdHMgPSBbLi4ucHJlc2VydmVkRHJhZnRzLCAuLi5hcHBlbmRlZERyYWZ0c107XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uICYmXG4gICAgICAhc2VsZWN0ZWRDb2x1bW5zLmhhcyh0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uKVxuICAgICkge1xuICAgICAgdGhpcy5jYW5jZWxGaWVsZEZ1bmN0aW9uRWRpdCgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5maWVsZE1vZGFsRHJhZnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWVsZE1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgfVxuICB9XG4gIG9uRmllbGRNb2RhbEFsaWFzQ2hhbmdlKGNvbHVtbjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXRjaEZpZWxkTW9kYWxEcmFmdChjb2x1bW4sIHsgYWxpYXM6IHZhbHVlIH0pO1xuICB9XG4gIG9uRmllbGRNb2RhbFdpZHRoQ2hhbmdlKGNvbHVtbjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wYXRjaEZpZWxkTW9kYWxEcmFmdChjb2x1bW4sIHsgd2lkdGg6IHZhbHVlIH0pO1xuICB9XG4gIHJlbW92ZUZpZWxkTW9kYWxEcmFmdChjb2x1bW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRNb2RhbERyYWZ0cyA9IHRoaXMuZmllbGRNb2RhbERyYWZ0cy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4gaXRlbS5jb2x1bW4gIT09IGNvbHVtblxuICAgICk7XG4gICAgaWYgKHRoaXMuZmllbGRGdW5jdGlvbkVkaXRDb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgdGhpcy5jYW5jZWxGaWVsZEZ1bmN0aW9uRWRpdCgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmllbGRNb2RhbERyYWZ0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmllbGRNb2RhbFN0ZXAgPSBcInNlbGVjdFwiO1xuICAgIH1cbiAgfVxuICBzdGFydEZpZWxkRnVuY3Rpb25FZGl0KGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZmllbGRNb2RhbERyYWZ0cy5maW5kKChpdGVtKSA9PiBpdGVtLmNvbHVtbiA9PT0gY29sdW1uKTtcbiAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiA9IGNvbHVtbjtcbiAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdCA9IHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGZ1bmN0aW9uTmFtZTogY3VycmVudC5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbkFsaWFzOiBjdXJyZW50LmZ1bmN0aW9uPy5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgIH07XG4gIH1cbiAgY2FuY2VsRmllbGRGdW5jdGlvbkVkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiA9IG51bGw7XG4gICAgdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQgPSB7XG4gICAgICBjb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb25OYW1lOiBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uQWxpYXM6IEVNUFRZX1ZBTFVFLFxuICAgIH07XG4gIH1cbiAgb25GaWVsZEZ1bmN0aW9uRHJhZnROYW1lQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9uRmllbGRGdW5jdGlvbk5hbWVDaGFuZ2UoKTtcbiAgfVxuICBzYXZlRmllbGRGdW5jdGlvbkVkaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGF0Y2hGaWVsZE1vZGFsRHJhZnQodGhpcy5maWVsZEZ1bmN0aW9uRWRpdENvbHVtbiwge1xuICAgICAgZnVuY3Rpb246IHRoaXMuYnVpbGRGaWVsZEZ1bmN0aW9uRHJhZnQoKSxcbiAgICB9KTtcbiAgICB0aGlzLmNhbmNlbEZpZWxkRnVuY3Rpb25FZGl0KCk7XG4gIH1cbiAgaXNGaWVsZEZ1bmN0aW9uRWRpdGluZyhjb2x1bW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkRnVuY3Rpb25FZGl0Q29sdW1uID09PSBjb2x1bW47XG4gIH1cbiAgc2F2ZUZpZWxkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TYXZlRmllbGRNb2RhbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gdGhpcy5maWVsZE1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgIGNvbHVtbjogaXRlbS5jb2x1bW4sXG4gICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgd2lkdGg6IGl0ZW0ud2lkdGg/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIGZ1bmN0aW9uOiBpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWU/LnRyaW0oKVxuICAgICAgICA/IHtcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IGl0ZW0uZnVuY3Rpb24uZnVuY3Rpb25OYW1lLnRyaW0oKSxcbiAgICAgICAgICBhbGlhczogaXRlbS5mdW5jdGlvbi5hbGlhcz8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICB9XG4gICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5jbG9zZUZpZWxkTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlblNvdXJjZU1vZGFsKHN0ZXA6IFNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCIpOiB2b2lkIHtcbiAgICB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzID0gdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgdGFibGU6IGl0ZW0udGFibGUsXG4gICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpIHx8IHRoaXMucmVzb2x2ZURlZmF1bHRTb3VyY2VBbGlhcyhpdGVtLnRhYmxlKSxcbiAgICB9KSk7XG4gICAgdGhpcy5zb3VyY2VNb2RhbFN0ZXAgPVxuICAgICAgc3RlcCA9PT0gXCJjb25maWd1cmVcIiAmJiB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzLmxlbmd0aFxuICAgICAgICA/IFwiY29uZmlndXJlXCJcbiAgICAgICAgOiBcInNlbGVjdFwiO1xuICAgIHRoaXMuc291cmNlTW9kYWxWaXNpYmxlID0gdHJ1ZTtcbiAgfVxuICBvcGVuU291cmNlQ29uZmlndXJhdGlvbk1vZGFsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5PcGVuU291cmNlQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3BlblNvdXJjZU1vZGFsKFwiY29uZmlndXJlXCIpO1xuICB9XG4gIGNsb3NlU291cmNlTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zb3VyY2VNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgdGhpcy5zb3VyY2VNb2RhbERyYWZ0cyA9IFtdO1xuICB9XG4gIGdvVG9Tb3VyY2VNb2RhbFN0ZXAoc3RlcDogU291cmNlTW9kYWxTdGVwKTogdm9pZCB7XG4gICAgaWYgKHN0ZXAgPT09IFwiY29uZmlndXJlXCIgJiYgIXRoaXMuc291cmNlTW9kYWxEcmFmdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zb3VyY2VNb2RhbFN0ZXAgPSBzdGVwO1xuICB9XG4gIGFkdmFuY2VTb3VyY2VNb2RhbFN0ZXAoKTogdm9pZCB7XG4gICAgdGhpcy5nb1RvU291cmNlTW9kYWxTdGVwKFwiY29uZmlndXJlXCIpO1xuICB9XG4gIG9uU291cmNlTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoZXZlbnQ6IFRpbWVsaW5lU3RlcFNlbGVjdEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5nb1RvU291cmNlTW9kYWxTdGVwKFxuICAgICAgZXZlbnQuaXRlbS5pZCA9PT0gXCJjb25maWd1cmVcIiA/IFwiY29uZmlndXJlXCIgOiBcInNlbGVjdFwiXG4gICAgKTtcbiAgfVxuICBvblNvdXJjZU1vZGFsU2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkVGFibGVzID0gdGhpcy5yZXNvbHZlVGFibGVzRnJvbVBpY2tsaXN0SWRzKGlkcyk7XG4gICAgY29uc3QgZHJhZnRCeVRhYmxlID0gbmV3IE1hcChcbiAgICAgIHRoaXMuc291cmNlTW9kYWxEcmFmdHMubWFwKChpdGVtKSA9PiBbaXRlbS50YWJsZSwgaXRlbV0pXG4gICAgKTtcblxuICAgIHRoaXMuc291cmNlTW9kYWxEcmFmdHMgPSBzZWxlY3RlZFRhYmxlcy5tYXAoKHRhYmxlKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHJhZnRCeVRhYmxlLmdldCh0YWJsZSk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjdXJyZW50ID8/IHtcbiAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICBhbGlhczogdGhpcy5yZXNvbHZlRGVmYXVsdFNvdXJjZUFsaWFzKHRhYmxlKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5zb3VyY2VNb2RhbERyYWZ0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc291cmNlTW9kYWxTdGVwID0gXCJzZWxlY3RcIjtcbiAgICB9XG4gIH1cbiAgb25Tb3VyY2VNb2RhbEFsaWFzQ2hhbmdlKHRhYmxlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzID0gdGhpcy5zb3VyY2VNb2RhbERyYWZ0cy5tYXAoKGl0ZW0pID0+XG4gICAgICBpdGVtLnRhYmxlID09PSB0YWJsZVxuICAgICAgICA/IHtcbiAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgIGFsaWFzOiB2YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IGl0ZW1cbiAgICApO1xuICB9XG4gIHNhdmVTb3VyY2VNb2RhbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc291cmNlTW9kYWxEcmFmdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMgPSB0aGlzLnNvdXJjZU1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnJlc29sdmVUYWJsZU9wdGlvbihpdGVtLnRhYmxlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhYmxlOiBpdGVtLnRhYmxlLFxuICAgICAgICBhbGlhczogaXRlbS5hbGlhcz8udHJpbSgpIHx8IHRoaXMucmVzb2x2ZURlZmF1bHRTb3VyY2VBbGlhcyhpdGVtLnRhYmxlKSwgLy8gTk9TT05BUlxuICAgICAgICBzY2hlbWE6IHRhYmxlPy5zY2hlbWEsXG4gICAgICAgIGxhYmVsOiB0YWJsZT8uZGlzcGxheU5hbWUgfHwgdGFibGU/LnRleHQsIC8vIE5PU09OQVJcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmNsb3NlU291cmNlTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlblNlbGVjdGlvbk1vZGFsKG1vZGU6IFNlbGVjdGlvbk1vZGFsTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxNb2RlID0gbW9kZTtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGFsU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgaWYgKG1vZGUgPT09IFwidGFibGVzXCIpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMgPSB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5tYXAoXG4gICAgICAgIChpdGVtKSA9PiBpdGVtLnRhYmxlXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IHRoaXMubm9ybWFsaXplZEZpZWxkcy5tYXAoKGl0ZW0pID0+IGl0ZW0uY29sdW1uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IFsuLi50aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeV07XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxWaXNpYmxlID0gdHJ1ZTtcbiAgfVxuICBjbG9zZVNlbGVjdGlvbk1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgfVxuICB0b2dnbGVTZWxlY3Rpb25Nb2RhbFJvdyhpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RhbElkcyA9IHRoaXMudG9nZ2xlTXVsdGlwbGVWYWx1ZShcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMsXG4gICAgICBpZFxuICAgICk7XG4gIH1cbiAgb25TZWxlY3Rpb25Nb2RhbFNlbGVjdGVkSWRzQ2hhbmdlKGlkczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGFsSWRzID0gdGhpcy5yZXNvbHZlQ29sdW1uc0Zyb21QaWNrbGlzdElkcyhpZHMpO1xuICB9XG4gIG9uU2VsZWN0YWJsZVJvd0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIiBcIiB8fCBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbCk/LmNsaWNrKCk7XG4gICAgfVxuICB9XG4gIGNvbmZpcm1TZWxlY3Rpb25Nb2RhbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RhbE1vZGUgPT09IFwidGFibGVzXCIpIHtcbiAgICAgIGNvbnN0IGFsaWFzZXMgPSBuZXcgTWFwKFxuICAgICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcy5tYXAoKGl0ZW0pID0+IFtcbiAgICAgICAgICBpdGVtLnRhYmxlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsaWFzOiBpdGVtLmFsaWFzLFxuICAgICAgICAgICAgc2NoZW1hOiBpdGVtLnNjaGVtYSxcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMgPSAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMuaW5jbHVkZXMoaXRlbS52YWx1ZSkpXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgdGFibGU6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgYWxpYXM6XG4gICAgICAgICAgICBhbGlhc2VzLmdldChpdGVtLnZhbHVlKT8uYWxpYXM/LnRyaW0oKSB8fCB0aGlzLmJ1aWxkQWxpYXNGb3JUYWJsZShpdGVtKSwgLy8gTk9TT05BUlxuICAgICAgICAgIHNjaGVtYTogYWxpYXNlcy5nZXQoaXRlbS52YWx1ZSk/LnNjaGVtYSA/PyBpdGVtLnNjaGVtYSxcbiAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgIGFsaWFzZXMuZ2V0KGl0ZW0udmFsdWUpPy5sYWJlbCA/P1xuICAgICAgICAgICAgaXRlbS5kaXNwbGF5TmFtZSA/P1xuICAgICAgICAgICAgaXRlbS50ZXh0LFxuICAgICAgICB9KSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGFsTW9kZSA9PT0gXCJmaWVsZHNcIikge1xuICAgICAgY29uc3QgZmllbGRDb25maWdCeUNvbHVtbiA9IG5ldyBNYXAoXG4gICAgICAgIHRoaXMubm9ybWFsaXplZEZpZWxkcy5tYXAoKGl0ZW0pID0+IFtpdGVtLmNvbHVtbiwgaXRlbV0pXG4gICAgICApO1xuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpZWxkcyA9IHRoaXMuc2VsZWN0aW9uTW9kYWxJZHMubWFwKFxuICAgICAgICAoY29sdW1uKSA9PiBmaWVsZENvbmZpZ0J5Q29sdW1uLmdldChjb2x1bW4pID8/IHsgY29sdW1uIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5ID0gWy4uLnRoaXMuc2VsZWN0aW9uTW9kYWxJZHNdO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlU2VsZWN0aW9uTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlbkpvaW5Nb2RhbChpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPVxuICAgICAgdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zW2luZGV4XSA6IG51bGw7XG4gICAgdGhpcy5qb2luRWRpdEluZGV4ID0gdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gaW5kZXggOiBudWxsO1xuICAgIHRoaXMuam9pblNvdXJjZVNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuam9pblRhcmdldFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuam9pbkRyYWZ0ID0ge1xuICAgICAgc291cmNlQ29sdW1uOiBjdXJyZW50Py5zb3VyY2VDb2x1bW4gPz8gRU1QVFlfVkFMVUUsXG4gICAgICB0YXJnZXRDb2x1bW46IGN1cnJlbnQ/LnRhcmdldENvbHVtbiA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIG9wZXJhdG9yOiBjdXJyZW50Py5vcGVyYXRvciA/PyBERUZBVUxUX0pPSU5fT1BFUkFUT1IsXG4gICAgfTtcbiAgICB0aGlzLmpvaW5Nb2RhbFZpc2libGUgPSB0cnVlO1xuICB9XG4gIGNsb3NlSm9pbk1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuam9pbk1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuam9pbkVkaXRJbmRleCA9IG51bGw7XG4gICAgdGhpcy5qb2luU291cmNlU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5qb2luVGFyZ2V0U2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5qb2luRHJhZnQgPSB7XG4gICAgICBzb3VyY2VDb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgICAgdGFyZ2V0Q29sdW1uOiBFTVBUWV9WQUxVRSxcbiAgICAgIG9wZXJhdG9yOiBERUZBVUxUX0pPSU5fT1BFUkFUT1IsXG4gICAgfTtcbiAgfVxuICBzZWxlY3RKb2luU291cmNlKGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uID1cbiAgICAgIHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbiA9PT0gY29sdW1uID8gRU1QVFlfVkFMVUUgOiBjb2x1bW47XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbik7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbik7XG4gICAgaWYgKHNvdXJjZSAmJiB0YXJnZXQgJiYgc291cmNlLnRhYmxlID09PSB0YXJnZXQudGFibGUpIHtcbiAgICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA9IEVNUFRZX1ZBTFVFO1xuICAgIH1cbiAgfVxuICBvbkpvaW5Tb3VyY2VTZWxlY3RlZElkc0NoYW5nZShpZHM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlTGFzdENvbHVtbkZyb21QaWNrbGlzdElkcyhpZHMpO1xuXG4gICAgdGhpcy5qb2luRHJhZnQuc291cmNlQ29sdW1uID1cbiAgICAgIGNvbHVtbiAmJiBjb2x1bW4gPT09IHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbiA/IEVNUFRZX1ZBTFVFIDogY29sdW1uID8/IEVNUFRZX1ZBTFVFO1xuXG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbik7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbik7XG4gICAgaWYgKHNvdXJjZSAmJiB0YXJnZXQgJiYgc291cmNlLnRhYmxlID09PSB0YXJnZXQudGFibGUpIHtcbiAgICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA9IEVNUFRZX1ZBTFVFO1xuICAgIH1cbiAgfVxuICBzZWxlY3RKb2luVGFyZ2V0KGNvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uID1cbiAgICAgIHRoaXMuam9pbkRyYWZ0LnRhcmdldENvbHVtbiA9PT0gY29sdW1uID8gRU1QVFlfVkFMVUUgOiBjb2x1bW47XG4gIH1cbiAgb25Kb2luVGFyZ2V0U2VsZWN0ZWRJZHNDaGFuZ2UoaWRzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUxhc3RDb2x1bW5Gcm9tUGlja2xpc3RJZHMoaWRzKTtcbiAgICB0aGlzLmpvaW5EcmFmdC50YXJnZXRDb2x1bW4gPVxuICAgICAgY29sdW1uICYmIGNvbHVtbiA9PT0gdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uID8gRU1QVFlfVkFMVUUgOiBjb2x1bW4gPz8gRU1QVFlfVkFMVUU7XG4gIH1cbiAgc2F2ZUpvaW4oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblNhdmVKb2luKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHQ6IER5bmFtaWNWaWV3QnVpbGRlckpvaW4gPSB7XG4gICAgICBzb3VyY2VDb2x1bW46IHRoaXMuam9pbkRyYWZ0LnNvdXJjZUNvbHVtbixcbiAgICAgIHRhcmdldENvbHVtbjogdGhpcy5qb2luRHJhZnQudGFyZ2V0Q29sdW1uLFxuICAgICAgb3BlcmF0b3I6IHRoaXMuam9pbkRyYWZ0Lm9wZXJhdG9yLFxuICAgIH07XG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zXTtcbiAgICBpZiAodGhpcy5qb2luRWRpdEluZGV4ID09PSBudWxsKSB7XG4gICAgICBpdGVtcy5wdXNoKG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc1t0aGlzLmpvaW5FZGl0SW5kZXhdID0gbmV4dDtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KGl0ZW1zLCAoaXRlbSkgPT5cbiAgICAgIFtpdGVtLnNvdXJjZUNvbHVtbiwgaXRlbS50YXJnZXRDb2x1bW4sIGl0ZW0ub3BlcmF0b3JdLmpvaW4oXCJ8XCIpXG4gICAgKTtcbiAgICB0aGlzLmNsb3NlSm9pbk1vZGFsKCk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIG9wZW5Tb3J0TW9kYWwoaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID1cbiAgICAgIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiA/IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nW2luZGV4XSA6IG51bGw7XG4gICAgdGhpcy5zb3J0RWRpdEluZGV4ID0gdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gaW5kZXggOiBudWxsO1xuICAgIHRoaXMuc29ydFNlYXJjaCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuc29ydERyYWZ0ID0ge1xuICAgICAgY29sdW1uOiBjdXJyZW50Py5jb2x1bW4gPz8gRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbk5hbWU6IGN1cnJlbnQ/LmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgZGlyZWN0aW9uOiBjdXJyZW50Py5kaXJlY3Rpb24gPz8gREVGQVVMVF9TT1JUX0RJUkVDVElPTixcbiAgICB9O1xuICAgIHRoaXMuc29ydE1vZGFsVmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgY2xvc2VTb3J0TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5zb3J0TW9kYWxWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5zb3J0RWRpdEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLnNvcnRTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLnNvcnREcmFmdCA9IHtcbiAgICAgIGNvbHVtbjogRU1QVFlfVkFMVUUsXG4gICAgICBmdW5jdGlvbk5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgICAgZGlyZWN0aW9uOiBERUZBVUxUX1NPUlRfRElSRUNUSU9OLFxuICAgIH07XG4gIH1cbiAgc2VsZWN0U29ydENvbHVtbihzb3J0U2VsZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBhcnNlU29ydFNlbGVjdGlvbklkKHNvcnRTZWxlY3Rpb25JZCk7XG4gICAgY29uc3QgaXNTYW1lU2VsZWN0aW9uID1cbiAgICAgIHRoaXMuc29ydERyYWZ0LmNvbHVtbiA9PT0gbmV4dC5jb2x1bW4gJiZcbiAgICAgICh0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUgfHwgRU1QVFlfVkFMVUUpID09PSBuZXh0LmZ1bmN0aW9uTmFtZTtcblxuICAgIHRoaXMuc29ydERyYWZ0LmNvbHVtbiA9IGlzU2FtZVNlbGVjdGlvbiA/IEVNUFRZX1ZBTFVFIDogbmV4dC5jb2x1bW47XG4gICAgdGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lID0gaXNTYW1lU2VsZWN0aW9uXG4gICAgICA/IEVNUFRZX1ZBTFVFXG4gICAgICA6IG5leHQuZnVuY3Rpb25OYW1lO1xuICB9XG4gIG9uU29ydFNlbGVjdGVkSWRzQ2hhbmdlKGlkczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZElkID0gaWRzLmF0KC0xKTtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNvcnRQaWNrbGlzdEl0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHNlbGVjdGVkSWQpO1xuXG4gICAgaWYgKCFzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIHRoaXMuc29ydERyYWZ0LmNvbHVtbiA9IEVNUFRZX1ZBTFVFO1xuICAgICAgdGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lID0gRU1QVFlfVkFMVUU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RTb3J0Q29sdW1uKHNlbGVjdGVkSXRlbS5zZWxlY3Rpb25JZCk7XG4gIH1cbiAgc2F2ZVNvcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhblNhdmVTb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHQ6IER5bmFtaWNWaWV3QnVpbGRlclNvcnQgPSB7XG4gICAgICBjb2x1bW46IHRoaXMuc29ydERyYWZ0LmNvbHVtbixcbiAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy5zb3J0RHJhZnQuZnVuY3Rpb25OYW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uLFxuICAgIH07XG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvcnRpbmddO1xuICAgIGlmICh0aGlzLnNvcnRFZGl0SW5kZXggPT09IG51bGwpIHtcbiAgICAgIGl0ZW1zLnB1c2gobmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zW3RoaXMuc29ydEVkaXRJbmRleF0gPSBuZXh0O1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZyA9IHRoaXMuZGVkdXBsaWNhdGVCeUtleShpdGVtcywgKGl0ZW0pID0+XG4gICAgICBbaXRlbS5jb2x1bW4sIGl0ZW0uZnVuY3Rpb25OYW1lID8/IEVNUFRZX1ZBTFVFLCBpdGVtLmRpcmVjdGlvbl0uam9pbihcInxcIilcbiAgICApO1xuICAgIHRoaXMuY2xvc2VTb3J0TW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb3BlbkZpbHRlck1vZGFsKGluZGV4PzogbnVtYmVyKTogdm9pZCB7IC8vIE5PU09OQVIgLSBjb21wbGV4aXR5OiBleHRyYWN0aW9uIHdvdWxkIHJpc2sgYmVoYXZpb3IgY2hhbmdlXG4gICAgY29uc3QgY3VycmVudCA9XG4gICAgICB0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIgPyB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVyc1tpbmRleF0gOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyRWRpdEluZGV4ID0gdHlwZW9mIGluZGV4ID09PSBcIm51bWJlclwiID8gaW5kZXggOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyTW9kYWxNb2RlID1cbiAgICAgIGN1cnJlbnQ/LnZhbHVlVHlwZSA9PT0gRklMVEVSX01PREVfRE9NQUlOID8gRklMVEVSX01PREVfRE9NQUlOIDogXCJjb25kaXRpb25cIjtcbiAgICB0aGlzLmZpbHRlck1vZGFsU3RlcCA9IHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiAmJiBjdXJyZW50ID8gXCJjb25maWd1cmVcIiA6IFwic2VsZWN0XCI7XG4gICAgdGhpcy5maWx0ZXJTZWFyY2ggPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0ID0ge1xuICAgICAgbW9kZTogdGhpcy5maWx0ZXJNb2RhbE1vZGUsXG4gICAgICBjb2x1bW46IGN1cnJlbnQ/LmNvbHVtbiA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIG9wZXJhdG9yOiBjdXJyZW50Py5vcGVyYXRvciA/PyBERUZBVUxUX0ZJTFRFUl9PUEVSQVRPUixcbiAgICAgIGNvbm5lY3RvcjogY3VycmVudD8uY29ubmVjdG9yID8/IERFRkFVTFRfRklMVEVSX0NPTk5FQ1RPUixcbiAgICAgIG9wdGlvbmFsOiBjdXJyZW50Py5vcHRpb25hbCA/PyBmYWxzZSxcbiAgICAgIHZhbHVlVHlwZTogY3VycmVudD8udmFsdWVUeXBlID8/IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEUsXG4gICAgICB2YWx1ZTogY3VycmVudD8udmFsdWUgPz8gRU1QVFlfVkFMVUUsXG4gICAgICB2YWx1ZXNUZXh0OiBjdXJyZW50Py52YWx1ZXM/LmpvaW4oXCIsIFwiKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIGJldHdlZW5TdGFydDogY3VycmVudD8udmFsdWVzPy5bMF0gPz8gRU1QVFlfVkFMVUUsXG4gICAgICBiZXR3ZWVuRW5kOiBjdXJyZW50Py52YWx1ZXM/LlsxXSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIHBhcmFtZXRlck5hbWU6IGN1cnJlbnQ/LnBhcmFtZXRlck5hbWUgPz8gRU1QVFlfVkFMVUUsXG4gICAgICBkb21haW5FeHByZXNzaW9uOiBjdXJyZW50Py5kb21haW5FeHByZXNzaW9uID8/IEVNUFRZX1ZBTFVFLFxuICAgIH07XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgICB0aGlzLmZpbHRlck1vZGFsVmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgY2xvc2VGaWx0ZXJNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZmlsdGVyRWRpdEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLmZpbHRlck1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgdGhpcy5maWx0ZXJNb2RhbE1vZGUgPSBcImNvbmRpdGlvblwiO1xuICAgIHRoaXMuZmlsdGVyU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdCA9IHtcbiAgICAgIG1vZGU6IFwiY29uZGl0aW9uXCIsXG4gICAgICBjb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgICAgb3BlcmF0b3I6IERFRkFVTFRfRklMVEVSX09QRVJBVE9SLFxuICAgICAgY29ubmVjdG9yOiBERUZBVUxUX0ZJTFRFUl9DT05ORUNUT1IsXG4gICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICB2YWx1ZVR5cGU6IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEUsXG4gICAgICB2YWx1ZTogRU1QVFlfVkFMVUUsXG4gICAgICB2YWx1ZXNUZXh0OiBFTVBUWV9WQUxVRSxcbiAgICAgIGJldHdlZW5TdGFydDogRU1QVFlfVkFMVUUsXG4gICAgICBiZXR3ZWVuRW5kOiBFTVBUWV9WQUxVRSxcbiAgICAgIHBhcmFtZXRlck5hbWU6IEVNUFRZX1ZBTFVFLFxuICAgICAgZG9tYWluRXhwcmVzc2lvbjogRU1QVFlfVkFMVUUsXG4gICAgfTtcbiAgICB0aGlzLnN5bmNTZWxlY3RlZEZpbHRlck1vZGVJdGVtcygpO1xuICB9XG4gIHNlbGVjdEZpbHRlckNvbHVtbihjb2x1bW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID1cbiAgICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID09PSBjb2x1bW4gPyBFTVBUWV9WQUxVRSA6IGNvbHVtbjtcbiAgICB0aGlzLnJlc2V0RmlsdGVyRHJhZnRWYWx1ZVN0YXRlKCk7XG4gIH1cbiAgb25GaWx0ZXJNb2RhbFNlbGVjdGVkSWRzQ2hhbmdlKGlkczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0U2VsZWN0ZWRJZCA9IGlkcy5hdCgtMSk7XG4gICAgY29uc3QgbmV4dENvbHVtbiA9XG4gICAgICB0eXBlb2YgbmV4dFNlbGVjdGVkSWQgPT09IFwibnVtYmVyXCJcbiAgICAgICAgPyB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdENvbHVtbihuZXh0U2VsZWN0ZWRJZCkgPz8gRU1QVFlfVkFMVUVcbiAgICAgICAgOiBFTVBUWV9WQUxVRTtcblxuICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID0gbmV4dENvbHVtbjtcbiAgICB0aGlzLnJlc2V0RmlsdGVyRHJhZnRWYWx1ZVN0YXRlKCk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldEZpbHRlckRyYWZ0VmFsdWVTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdE9wZXJhdG9yID1cbiAgICAgIHRoaXMuZmlsdGVyT3BlcmF0b3JPcHRpb25zWzBdPy52YWx1ZSA/PyBERUZBVUxUX0ZJTFRFUl9PUEVSQVRPUjtcbiAgICB0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID0gZmlyc3RPcGVyYXRvcjtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSBFTVBUWV9WQUxVRTtcbiAgfVxuICBnb1RvRmlsdGVyTW9kYWxTdGVwKHN0ZXA6IEZpbHRlck1vZGFsU3RlcCk6IHZvaWQge1xuICAgIGlmIChzdGVwID09PSBcImNvbmZpZ3VyZVwiICYmICF0aGlzLmZpbHRlck1vZGFsQ2FuUHJvY2VlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdGVwID09PSBcInJldmlld1wiICYmICF0aGlzLmZpbHRlck1vZGFsQ2FuUmV2aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJNb2RhbFN0ZXAgPSBzdGVwO1xuXG4gICAgaWYgKHN0ZXAgPT09IFwic2VsZWN0XCIpIHtcbiAgICAgIHRoaXMuZmlsdGVyU2VhcmNoID0gRU1QVFlfVkFMVUU7XG4gICAgfVxuICB9XG4gIGFkdmFuY2VGaWx0ZXJNb2RhbFN0ZXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsdGVyTW9kYWxTZWxlY3Rpb25TdGVwQWN0aXZlKSB7XG4gICAgICB0aGlzLmdvVG9GaWx0ZXJNb2RhbFN0ZXAoXCJjb25maWd1cmVcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmlsdGVyTW9kYWxDb25maWd1cmF0aW9uU3RlcEFjdGl2ZSkge1xuICAgICAgdGhpcy5nb1RvRmlsdGVyTW9kYWxTdGVwKFwicmV2aWV3XCIpO1xuICAgIH1cbiAgfVxuICBvbkZpbHRlclZhbHVlVHlwZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSBFTVBUWV9WQUxVRTtcbiAgfVxuICBvbkZpbHRlck9wZXJhdG9yQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWUgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlc1RleHQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5TdGFydCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQuYmV0d2VlbkVuZCA9IEVNUFRZX1ZBTFVFO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQucGFyYW1ldGVyTmFtZSA9IEVNUFRZX1ZBTFVFO1xuXG4gICAgaWYgKCF0aGlzLmZpbHRlck5lZWRzVmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID0gREVGQVVMVF9GSUxURVJfVkFMVUVfVFlQRTtcbiAgICB9XG4gIH1cbiAgb25GaWx0ZXJNb2RlQ2hhbmdlKG1vZGU6IEZpbHRlck1vZGFsTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyTW9kYWxNb2RlID0gbW9kZTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0Lm1vZGUgPSBtb2RlO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQuY29sdW1uID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciA9IERFRkFVTFRfRklMVEVSX09QRVJBVE9SO1xuICAgIHRoaXMuZmlsdGVyRHJhZnQudmFsdWVUeXBlID0gREVGQVVMVF9GSUxURVJfVkFMVUVfVFlQRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0ID0gRU1QVFlfVkFMVUU7XG4gICAgdGhpcy5maWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlckRyYWZ0LmRvbWFpbkV4cHJlc3Npb24gPSBFTVBUWV9WQUxVRTtcbiAgICB0aGlzLmZpbHRlck1vZGFsU3RlcCA9IFwic2VsZWN0XCI7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgfVxuICBvbkZpbHRlck1vZGFsVGltZWxpbmVTdGVwU2VsZWN0KGV2ZW50OiBUaW1lbGluZVN0ZXBTZWxlY3RFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5pdGVtLmlkID09PSBcInJldmlld1wiKSB7XG4gICAgICB0aGlzLmdvVG9GaWx0ZXJNb2RhbFN0ZXAoXCJyZXZpZXdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5nb1RvRmlsdGVyTW9kYWxTdGVwKGV2ZW50Lml0ZW0uaWQgPT09IFwiY29uZmlndXJlXCIgPyBcImNvbmZpZ3VyZVwiIDogXCJzZWxlY3RcIik7XG4gIH1cbiAgc2F2ZUZpbHRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5idWlsZEZpbHRlckZyb21EcmFmdCgpO1xuXG4gICAgaWYgKCFuZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSBbLi4udGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnNdO1xuICAgIGlmICh0aGlzLmZpbHRlckVkaXRJbmRleCA9PT0gbnVsbCkge1xuICAgICAgaXRlbXMucHVzaChuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNbdGhpcy5maWx0ZXJFZGl0SW5kZXhdID0gbmV4dDtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMgPSBpdGVtcztcbiAgICB0aGlzLmNsb3NlRmlsdGVyTW9kYWwoKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgb25Tb3VyY2VBbGlhc0NoYW5nZShpbmRleDogbnVtYmVyLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzW2luZGV4XTtcbiAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnJlc29sdmVUYWJsZU9wdGlvbihjdXJyZW50LnRhYmxlKTtcbiAgICBjdXJyZW50LmFsaWFzID1cbiAgICAgIHZhbHVlLnRyaW0oKSB8fCAodGFibGUgPyB0aGlzLmJ1aWxkQWxpYXNGb3JUYWJsZSh0YWJsZSkgOiBjdXJyZW50LmFsaWFzKTtcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoKTtcbiAgICB0aGlzLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCgpO1xuICB9XG4gIHJlbW92ZVNvdXJjZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvdXJjZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgcmVtb3ZlSm9pbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUdyb3VwQnkoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5LnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUZpZWxkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZVNvcnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIHJlbW92ZUZpbHRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgY2xlYXJTb3VyY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFySm9pbnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFyR3JvdXBCeSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeSA9IFtdO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBjbGVhckZpZWxkcygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmllbGRzID0gW107XG4gICAgdGhpcy5hZnRlckJ1aWxkZXJNdXRhdGlvbigpO1xuICB9XG4gIGNsZWFyU29ydGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZyA9IFtdO1xuICAgIHRoaXMuYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTtcbiAgfVxuICBjbGVhckZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMgPSBbXTtcbiAgICB0aGlzLmFmdGVyQnVpbGRlck11dGF0aW9uKCk7XG4gIH1cbiAgaGFuZGxlU2F2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNhbml0aXplQnVpbGRlcigpO1xuICAgIHRoaXMuc2F2ZS5lbWl0KGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyh0aGlzLmNvbmZpZykpO1xuICB9XG4gIHByaXZhdGUgYWZ0ZXJCdWlsZGVyTXV0YXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zYW5pdGl6ZUJ1aWxkZXIoKTtcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoKTtcbiAgICB0aGlzLnNjaGVkdWxlRmxvd0Fycm93UmVmcmVzaCgpO1xuICB9XG4gIHByaXZhdGUgZW1pdENvbmZpZ0NoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ0NoYW5nZS5lbWl0KGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyh0aGlzLmNvbmZpZykpO1xuICB9XG4gIHByaXZhdGUgc2FuaXRpemVCdWlsZGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYmxlc0J5SWQgPSBuZXcgTWFwKFxuICAgICAgKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEudGFibGVzID8/IFtdKS5tYXAoKGl0ZW0pID0+IFtpdGVtLnZhbHVlLCBpdGVtXSlcbiAgICApO1xuICAgIGNvbnN0IHNlbGVjdGVkU291cmNlcyA9IHRoaXMuZGVkdXBsaWNhdGVCeUtleShcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgdGFibGVzQnlJZC5oYXMoaXRlbS50YWJsZSlcbiAgICAgICksXG4gICAgICAoaXRlbSkgPT4gaXRlbS50YWJsZVxuICAgICkubWFwKChpdGVtKSA9PiAoe1xuICAgICAgdGFibGU6IGl0ZW0udGFibGUsXG4gICAgICBhbGlhczpcbiAgICAgICAgaXRlbS5hbGlhcz8udHJpbSgpIHx8XG4gICAgICAgIHRoaXMuYnVpbGRBbGlhc0ZvclRhYmxlKFxuICAgICAgICAgIHRhYmxlc0J5SWQuZ2V0KGl0ZW0udGFibGUpIGFzIER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uXG4gICAgICAgICksXG4gICAgICBzY2hlbWE6IGl0ZW0uc2NoZW1hID8/IHRhYmxlc0J5SWQuZ2V0KGl0ZW0udGFibGUpPy5zY2hlbWEsXG4gICAgICBsYWJlbDpcbiAgICAgICAgaXRlbS5sYWJlbCA/P1xuICAgICAgICB0YWJsZXNCeUlkLmdldChpdGVtLnRhYmxlKT8uZGlzcGxheU5hbWUgPz9cbiAgICAgICAgdGFibGVzQnlJZC5nZXQoaXRlbS50YWJsZSk/LnRleHQsXG4gICAgfSkpO1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzID0gc2VsZWN0ZWRTb3VyY2VzO1xuICAgIGNvbnN0IHNlbGVjdGVkVGFibGVJZHMgPSBuZXcgU2V0KHNlbGVjdGVkU291cmNlcy5tYXAoKGl0ZW0pID0+IGl0ZW0udGFibGUpKTtcbiAgICBjb25zdCBhdmFpbGFibGVDb2x1bW5zID0gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEuY29sdW1ucyA/PyBbXSkuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IHNlbGVjdGVkVGFibGVJZHMuaGFzKGl0ZW0udGFibGUpXG4gICAgKTtcbiAgICBjb25zdCBhdmFpbGFibGVDb2x1bW5NYXAgPSBuZXcgTWFwKFxuICAgICAgYXZhaWxhYmxlQ29sdW1ucy5tYXAoKGl0ZW0pID0+IFtpdGVtLnZhbHVlLCBpdGVtXSlcbiAgICApO1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5ID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGF2YWlsYWJsZUNvbHVtbk1hcC5nZXQoaXRlbSk7XG4gICAgICAgIHJldHVybiAhIWNvbHVtbiAmJiBjb2x1bW4uaXNBZ2dyZWdhdGFibGUgIT09IGZhbHNlO1xuICAgICAgfSksXG4gICAgICAoaXRlbSkgPT4gaXRlbVxuICAgICk7XG4gICAgY29uc3QgZ3JvdXBCeVNldCA9IG5ldyBTZXQodGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZHMgPSB0aGlzLm1lcmdlTGVnYWN5RnVuY3Rpb25zSW50b0ZpZWxkcyhcbiAgICAgIHRoaXMubm9ybWFsaXplZEZpZWxkcyxcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5mdW5jdGlvbnNcbiAgICApO1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHMgPSB0aGlzLmRlZHVwbGljYXRlQnlLZXkoXG4gICAgICBub3JtYWxpemVkRmllbGRzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBhdmFpbGFibGVDb2x1bW5NYXAuZ2V0KGl0ZW0uY29sdW1uKTtcbiAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ3JvdXBCeVNldC5oYXMoaXRlbS5jb2x1bW4pIHx8ICghIWl0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZSAmJiBjb2x1bW4uaXNBZ2dyZWdhdGFibGUgIT09IGZhbHNlKTtcbiAgICAgIH0pLFxuICAgICAgKGl0ZW0pID0+IGAke2l0ZW0uY29sdW1ufXwke2l0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZSA/PyBFTVBUWV9WQUxVRX1gXG4gICAgKTtcbiAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZnVuY3Rpb25zID0gdGhpcy5leHRyYWN0RnVuY3Rpb25zRnJvbUZpZWxkcyhcbiAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5maWVsZHMubWFwKChpdGVtKSA9PiB0aGlzLm5vcm1hbGl6ZUdlbmVyYXRlZEZpZWxkKGl0ZW0pKVxuICAgICk7XG4gICAgY29uc3Qgc29ydEFsbG93ZWQgPSBuZXcgU2V0KFxuICAgICAgdGhpcy5zb3J0U2VsZWN0YWJsZUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5pZClcbiAgICApO1xuICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KFxuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLnNvcnRpbmcuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgICBzb3J0QWxsb3dlZC5oYXMoXG4gICAgICAgICAgdGhpcy5idWlsZFNvcnRTZWxlY3Rpb25JZChpdGVtLmNvbHVtbiwgaXRlbS5mdW5jdGlvbk5hbWUgPz8gRU1QVFlfVkFMVUUpXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICAoaXRlbSkgPT4gYCR7aXRlbS5jb2x1bW59fCR7aXRlbS5mdW5jdGlvbk5hbWUgPz8gRU1QVFlfVkFMVUV9fCR7aXRlbS5kaXJlY3Rpb259YFxuICAgICk7XG4gICAgaWYgKHNlbGVjdGVkU291cmNlcy5sZW5ndGggPCAyKSB7XG4gICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zID0gdGhpcy5kZWR1cGxpY2F0ZUJ5S2V5KFxuICAgICAgICB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuam9pbnMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gYXZhaWxhYmxlQ29sdW1uTWFwLmdldChpdGVtLnNvdXJjZUNvbHVtbik7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYXZhaWxhYmxlQ29sdW1uTWFwLmdldChpdGVtLnRhcmdldENvbHVtbik7XG4gICAgICAgICAgcmV0dXJuICEhc291cmNlICYmICEhdGFyZ2V0ICYmIHNvdXJjZS50YWJsZSAhPT0gdGFyZ2V0LnRhYmxlO1xuICAgICAgICB9KSxcbiAgICAgICAgKGl0ZW0pID0+IGAke2l0ZW0uc291cmNlQ29sdW1ufXwke2l0ZW0udGFyZ2V0Q29sdW1ufXwke2l0ZW0ub3BlcmF0b3J9YFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMgPSB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVycy5maWx0ZXIoXG4gICAgICAoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS52YWx1ZVR5cGUgPT09IEZJTFRFUl9NT0RFX0RPTUFJTikge1xuICAgICAgICAgIHJldHVybiAhIWl0ZW0uZG9tYWluRXhwcmVzc2lvbj8udHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhdmFpbGFibGVDb2x1bW5NYXAuaGFzKGl0ZW0uY29sdW1uKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVByZXZpZXdDb2x1bW5zKCk6IFByZXZpZXdDb2x1bW5MaWtlW10ge1xuICAgIGNvbnN0IHByZXZpZXdDb2x1bW5zID0gKFxuICAgICAgKHRoaXMuY29uZmlnLnByZXZpZXc/LmNvbHVtbnMgPz8gW10pIGFzIFByZXZpZXdDb2x1bW5MaWtlW11cbiAgICApXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiAhIWl0ZW0/LmZpZWxkKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgZmllbGQ6IGl0ZW0uZmllbGQsXG4gICAgICAgIGhlYWRlcjogaXRlbS5oZWFkZXIgPz8gaXRlbS5maWVsZCxcbiAgICAgICAgdHlwZTogaXRlbS50eXBlLFxuICAgICAgfSkpO1xuICAgIGlmIChwcmV2aWV3Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBwcmV2aWV3Q29sdW1ucztcbiAgICB9XG4gICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IFtcbiAgICAgIC4uLnRoaXMubm9ybWFsaXplZEZpZWxkcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGZpZWxkOlxuICAgICAgICAgIGl0ZW0uZnVuY3Rpb24/LmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgIGl0ZW0uYWxpYXM/LnRyaW0oKSB8fCAvLyBOT1NPTkFSXG4gICAgICAgICAgaXRlbS5jb2x1bW4sXG4gICAgICAgIGhlYWRlcjpcbiAgICAgICAgICBpdGVtLmZ1bmN0aW9uPy5hbGlhcz8udHJpbSgpIHx8IC8vIE5PU09OQVJcbiAgICAgICAgICBpdGVtLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgIChpdGVtLmZ1bmN0aW9uXG4gICAgICAgICAgICA/IGAke3RoaXMucmVzb2x2ZUZ1bmN0aW9uTGFiZWwoaXRlbS5mdW5jdGlvbi5mdW5jdGlvbk5hbWUpfSAke3RoaXMucmVzb2x2ZUNvbHVtbkxhYmVsKGl0ZW0uY29sdW1uKX1gXG4gICAgICAgICAgICA6IHRoaXMucmVzb2x2ZUNvbHVtbkxhYmVsKGl0ZW0uY29sdW1uKSksXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgfSkpLFxuICAgIF07XG4gICAgcmV0dXJuIHRoaXMuZGVkdXBsaWNhdGVCeUtleShnZW5lcmF0ZWRDb2x1bW5zLCAoaXRlbSkgPT4gaXRlbS5maWVsZCk7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFRhYmxlU2VsZWN0aW9uUm93cyhcbiAgICBzZWxlY3RlZElkczogc3RyaW5nW10sXG4gICAgc2VhcmNoOiBzdHJpbmdcbiAgKTogU2VsZWN0aW9uUm93W10ge1xuICAgIHJldHVybiAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgPz8gW10pXG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlVGFibGVEaXNwbGF5UGFydHMoaXRlbS52YWx1ZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgbmFtZTogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgICBkYkxhYmVsOiBwYXJ0cy5kYkxhYmVsLFxuICAgICAgICAgIHRhYmxlTGFiZWw6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgICAgcGF0aFR5cGU6IFwidGFibGVcIiBhcyBjb25zdCxcbiAgICAgICAgICBwcmVmaXg6IHBhcnRzLmRiTGFiZWwsXG4gICAgICAgICAgbWV0YTogaXRlbS5kZXNjcmlwdGlvbiB8fCBpdGVtLmRpc3BsYXlOYW1lIHx8IEVNUFRZX1ZBTFVFLCAvLyBOT1NPTkFSXG4gICAgICAgICAgbm90ZTogaXRlbS52YWx1ZSxcbiAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWRJZHMuaW5jbHVkZXMoaXRlbS52YWx1ZSksXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+XG4gICAgICAgIHRoaXMubWF0Y2hlc1NlYXJjaChbaXRlbS5wcmVmaXggPz8gRU1QVFlfVkFMVUUsIGl0ZW0ubmFtZSwgaXRlbS5tZXRhLCBpdGVtLm5vdGUgPz8gRU1QVFlfVkFMVUVdLCBzZWFyY2gpXG4gICAgICApO1xuICB9XG4gIHByaXZhdGUgYnVpbGRDb2x1bW5TZWxlY3Rpb25Sb3dzKFxuICAgIGl0ZW1zOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSxcbiAgICBzZWxlY3RlZElkczogc3RyaW5nW10sXG4gICAgc2VhcmNoOiBzdHJpbmcsXG4gICAgbXVsdGlwbGUgPSB0cnVlXG4gICk6IFNlbGVjdGlvblJvd1tdIHtcbiAgICByZXR1cm4gaXRlbXNcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVDb2x1bW5QYXJ0cyhpdGVtLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogaXRlbS52YWx1ZSxcbiAgICAgICAgICBuYW1lOiBwYXJ0cy5maWVsZExhYmVsLFxuICAgICAgICAgIGRiTGFiZWw6IHBhcnRzLmRiTGFiZWwsXG4gICAgICAgICAgdGFibGVMYWJlbDogcGFydHMudGFibGVMYWJlbCxcbiAgICAgICAgICBwYXRoVHlwZTogXCJjb2x1bW5cIiBhcyBjb25zdCxcbiAgICAgICAgICBwcmVmaXg6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgICAgbWV0YTogaXRlbS5kYXRhVHlwZSxcbiAgICAgICAgICBub3RlOiBpdGVtLmZ1bGxOYW1lLFxuICAgICAgICAgIHNlbGVjdGVkOiBtdWx0aXBsZVxuICAgICAgICAgICAgPyBzZWxlY3RlZElkcy5pbmNsdWRlcyhpdGVtLnZhbHVlKVxuICAgICAgICAgICAgOiBzZWxlY3RlZElkc1swXSA9PT0gaXRlbS52YWx1ZSxcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT5cbiAgICAgICAgdGhpcy5tYXRjaGVzU2VhcmNoKFtpdGVtLnByZWZpeCA/PyBFTVBUWV9WQUxVRSwgaXRlbS5uYW1lLCBpdGVtLm1ldGEsIGl0ZW0ubm90ZSA/PyBFTVBUWV9WQUxVRV0sIHNlYXJjaClcbiAgICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZENvbHVtblBpY2tsaXN0SXRlbXMoXG4gICAgaXRlbXM6IER5bmFtaWNWaWV3QnVpbGRlckNvbHVtbk9wdGlvbltdXG4gICk6IENvbHVtblBpY2tsaXN0SXRlbVtdIHtcbiAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBwaWNrbGlzdElkID0gdGhpcy5yZXNvbHZlQ29sdW1uUGlja2xpc3RJZChpdGVtLnZhbHVlKTtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlQ29sdW1uUGFydHMoaXRlbS52YWx1ZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBwaWNrbGlzdElkID8/IDAsXG4gICAgICAgIHRpdGxlOiBgJHtwYXJ0cy50YWJsZUxhYmVsfS4ke3BhcnRzLmZpZWxkTGFiZWx9YCxcbiAgICAgICAgdGl0bGVQcmVmaXg6IHBhcnRzLnRhYmxlTGFiZWwsXG4gICAgICAgIHRpdGxlU3VmZml4OiBwYXJ0cy5maWVsZExhYmVsLFxuICAgICAgICB0aXRsZVByZWZpeENvbG9yOiBWSVNVQUxfU1FMX1RBQkxFX0NPTE9SLFxuICAgICAgICB0aXRsZVN1ZmZpeENvbG9yOiBWSVNVQUxfU1FMX0ZJRUxEX0NPTE9SLFxuICAgICAgICBiYWRnZTogaXRlbS5kYXRhVHlwZSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgICAgYmFkZ2VDb2xvcjogUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SLFxuICAgICAgICBjb2x1bW46IGl0ZW0udmFsdWUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgYnVpbGRUYWJsZVBpY2tsaXN0SXRlbXMoXG4gICAgaXRlbXM6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uW11cbiAgKTogVGFibGVQaWNrbGlzdEl0ZW1bXSB7XG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5yZXNvbHZlVGFibGVEaXNwbGF5UGFydHMoaXRlbS52YWx1ZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpbmRleCArIDEsXG4gICAgICAgIHRpdGxlOiBgJHtwYXJ0cy5kYkxhYmVsfS4ke3BhcnRzLnRhYmxlTGFiZWx9YCxcbiAgICAgICAgdGl0bGVQcmVmaXg6IHBhcnRzLmRiTGFiZWwsXG4gICAgICAgIHRpdGxlU3VmZml4OiBwYXJ0cy50YWJsZUxhYmVsLFxuICAgICAgICB0aXRsZVByZWZpeENvbG9yOiBWSVNVQUxfU1FMX1RBQkxFX0NPTE9SLFxuICAgICAgICB0aXRsZVN1ZmZpeENvbG9yOiBWSVNVQUxfU1FMX0ZJRUxEX0NPTE9SLFxuICAgICAgICBiYWRnZTpcbiAgICAgICAgICBpdGVtLmRpc3BsYXlOYW1lICYmIGl0ZW0uZGlzcGxheU5hbWUgIT09IHBhcnRzLnRhYmxlTGFiZWxcbiAgICAgICAgICAgID8gaXRlbS5kaXNwbGF5TmFtZVxuICAgICAgICAgICAgOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgYmFkZ2VDb2xvcjogUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SLFxuICAgICAgICB0YWJsZTogaXRlbS52YWx1ZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uc0Zyb21QaWNrbGlzdElkcyhpZHM6IG51bWJlcltdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBpZHNcbiAgICAgIC5tYXAoKGlkKSA9PiB0aGlzLnJlc29sdmVDb2x1bW5QaWNrbGlzdENvbHVtbihpZCkpXG4gICAgICAuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gISFpdGVtKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVMYXN0Q29sdW1uRnJvbVBpY2tsaXN0SWRzKGlkczogbnVtYmVyW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5yZXNvbHZlQ29sdW1uc0Zyb21QaWNrbGlzdElkcyhpZHMpO1xuICAgIHJldHVybiBjb2x1bW5zLmF0KC0xKSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVRhYmxlUGlja2xpc3RJZCh0YWJsZVZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBpdGVtSW5kZXggPSAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS50YWJsZXMgPz8gW10pLmZpbmRJbmRleChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB0YWJsZVZhbHVlXG4gICAgKTtcblxuICAgIHJldHVybiBpdGVtSW5kZXggPj0gMCA/IGl0ZW1JbmRleCArIDEgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVRhYmxlUGlja2xpc3RUYWJsZShpZDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaXRlbSA9ICh0aGlzLmNvbmZpZy5hdmFpbGFibGVEYXRhLnRhYmxlcyA/PyBbXSkuZmluZChcbiAgICAgIChfZW50cnksIGluZGV4KSA9PiBpbmRleCArIDEgPT09IGlkXG4gICAgKTtcblxuICAgIHJldHVybiBpdGVtPy52YWx1ZSA/PyBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZVRhYmxlc0Zyb21QaWNrbGlzdElkcyhpZHM6IG51bWJlcltdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBpZHNcbiAgICAgIC5tYXAoKGlkKSA9PiB0aGlzLnJlc29sdmVUYWJsZVBpY2tsaXN0VGFibGUoaWQpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+ICEhaXRlbSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uUGlja2xpc3RJZChjb2x1bW46IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuYXZhaWxhYmxlQ29sdW1ucy5maW5kSW5kZXgoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gY29sdW1uXG4gICAgKTtcblxuICAgIHJldHVybiBpdGVtSW5kZXggPj0gMCA/IGl0ZW1JbmRleCArIDEgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtblBpY2tsaXN0Q29sdW1uKGlkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5hdmFpbGFibGVDb2x1bW5zW2lkIC0gMV07XG4gICAgcmV0dXJuIGl0ZW0/LnZhbHVlID8/IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBtYXRjaGVzU2VhcmNoKHZhbHVlczogc3RyaW5nW10sIHNlYXJjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IHRoaXMubm9ybWFsaXplKHNlYXJjaCk7XG4gICAgaWYgKCFub3JtYWxpemVkU2VhcmNoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKCh2YWx1ZSkgPT5cbiAgICAgIHRoaXMubm9ybWFsaXplKHZhbHVlKS5pbmNsdWRlcyhub3JtYWxpemVkU2VhcmNoKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBub3JtYWxpemUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh2YWx1ZSA/PyBcIlwiKVxuICAgICAgLm5vcm1hbGl6ZShcIk5GRFwiKVxuICAgICAgLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csIFwiXCIpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnRyaW0oKTtcbiAgfVxuICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlVmFsdWUodmFsdWVzOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHZhbHVlKVxuICAgICAgPyB2YWx1ZXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB2YWx1ZSlcbiAgICAgIDogWy4uLnZhbHVlcywgdmFsdWVdO1xuICB9XG4gIHByaXZhdGUgZmlsdGVyRnVuY3Rpb25TZWxlY3RhYmxlQ29sdW1ucyhcbiAgICBmdW5jdGlvbk5hbWU6IHN0cmluZ1xuICApOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25bXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cEJ5ID0gbmV3IFNldCh0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZ3JvdXBCeSk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5hdmFpbGFibGVDb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiAhc2VsZWN0ZWRHcm91cEJ5LmhhcyhpdGVtLnZhbHVlKVxuICAgICk7XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSA9PT0gXCJjb3VudFwiKSB7XG4gICAgICByZXR1cm4gYWxsO1xuICAgIH1cbiAgICBpZiAoW1wic3VtXCIsIFwiYXZnXCIsIFwibWluXCIsIFwibWF4XCJdLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgcmV0dXJuIGFsbC5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuaXNOdW1lcmljVHlwZShpdGVtLmRhdGFUeXBlKSk7XG4gICAgfVxuICAgIHJldHVybiBhbGw7XG4gIH1cbiAgcHJpdmF0ZSBmaWx0ZXJPcGVyYXRvcnNGb3JDb2x1bW4oXG4gICAgY29sdW1uOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb25cbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhVHlwZSA9IChjb2x1bW4uZGF0YVR5cGUgPz8gRU1QVFlfVkFMVUUpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobm9ybWFsaXplZERhdGFUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFtcIkVRVUFMXCIsIFwiTk9UX0VRVUFMXCIsIFwiRU1QVFlcIiwgXCJOT1RfRU1QVFlcIl07XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWREYXRhVHlwZSA9PT0gXCJkYXRldGltZVwiIHx8IG5vcm1hbGl6ZWREYXRhVHlwZSA9PT0gXCJ0aW1lXCIgfHwgbm9ybWFsaXplZERhdGFUeXBlID09PSBcInRpbWVzdGFtcFwiKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIkVRVUFMXCIsXG4gICAgICAgIFwiTk9UX0VRVUFMXCIsXG4gICAgICAgIFwiR1JFQVRFUl9USEFOXCIsXG4gICAgICAgIFwiR1JFQVRFUl9USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiTEVTU19USEFOXCIsXG4gICAgICAgIFwiTEVTU19USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiQkVUV0VFTlwiLFxuICAgICAgICBcIkVNUFRZXCIsXG4gICAgICAgIFwiTk9UX0VNUFRZXCIsXG4gICAgICBdO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuaXNOdW1lcmljVHlwZShjb2x1bW4uZGF0YVR5cGUpIHx8XG4gICAgICBub3JtYWxpemVkRGF0YVR5cGUgPT09IFwiZGF0ZVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIkVRVUFMXCIsXG4gICAgICAgIFwiTk9UX0VRVUFMXCIsXG4gICAgICAgIFwiR1JFQVRFUl9USEFOXCIsXG4gICAgICAgIFwiR1JFQVRFUl9USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiTEVTU19USEFOXCIsXG4gICAgICAgIFwiTEVTU19USEFOX09SX0VRVUFMXCIsXG4gICAgICAgIFwiQkVUV0VFTlwiLFxuICAgICAgICBcIklOXCIsXG4gICAgICAgIFwiRU1QVFlcIixcbiAgICAgICAgXCJOT1RfRU1QVFlcIixcbiAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBcIkVRVUFMXCIsXG4gICAgICBcIk5PVF9FUVVBTFwiLFxuICAgICAgXCJDT05UQUlOU1wiLFxuICAgICAgXCJET0VTX05PVF9DT05UQUlOXCIsXG4gICAgICBcIlNUQVJUU19XSVRIXCIsXG4gICAgICBcIkVORFNfV0lUSFwiLFxuICAgICAgXCJJTlwiLFxuICAgICAgXCJFTVBUWVwiLFxuICAgICAgXCJOT1RfRU1QVFlcIixcbiAgICBdO1xuICB9XG4gIHByaXZhdGUgaXNOdW1lcmljVHlwZSh2YWx1ZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBbXG4gICAgICBcIm51bWJlclwiLFxuICAgICAgXCJpbnRlZ2VyXCIsXG4gICAgICBcImRlY2ltYWxcIixcbiAgICAgIFwiZmxvYXRcIixcbiAgICAgIFwiZG91YmxlXCIsXG4gICAgICBcImxvbmdcIixcbiAgICAgIFwic2hvcnRcIixcbiAgICBdLmluY2x1ZGVzKCh2YWx1ZSA/PyBcIlwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICBwcml2YXRlIGlzRGF0ZVR5cGUodmFsdWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wXCIsIFwidGltZVwiXS5pbmNsdWRlcyhcbiAgICAgICh2YWx1ZSA/PyBcIlwiKS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZU9wdGlvbihcbiAgICB2YWx1ZTogc3RyaW5nXG4gICk6IER5bmFtaWNWaWV3QnVpbGRlclRhYmxlT3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLmF2YWlsYWJsZURhdGEudGFibGVzID8/IFtdKS5maW5kKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHZhbHVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVDb2x1bW5PcHRpb24oXG4gICAgdmFsdWU6IHN0cmluZ1xuICApOiBEeW5hbWljVmlld0J1aWxkZXJDb2x1bW5PcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiAodGhpcy5jb25maWcuYXZhaWxhYmxlRGF0YS5jb2x1bW5zID8/IFtdKS5maW5kKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHZhbHVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZUxhYmVsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVUYWJsZU9wdGlvbih2YWx1ZSk/LnRleHQgPz8gdmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlVGFibGVEaXNwbGF5UGFydHModmFsdWU6IHN0cmluZyk6IFRhYmxlRGlzcGxheVBhcnRzIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucmVzb2x2ZVRhYmxlT3B0aW9uKHZhbHVlKTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICBjb25zdCByYXdQYXJ0cyA9IHZhbHVlLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYkxhYmVsOiByYXdQYXJ0cy5sZW5ndGggPiAxID8gcmF3UGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oXCIuXCIpIDogXCJkYlwiLFxuICAgICAgICB0YWJsZUxhYmVsOiByYXdQYXJ0cy5hdCgtMSkgPz8gdmFsdWUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZGJMYWJlbDogdGFibGUuc2NoZW1hIHx8IFwiZGJcIiwgLy8gTk9TT05BUlxuICAgICAgdGFibGVMYWJlbDogdGFibGUudmFsdWUsXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVUYWJsZVBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnJlc29sdmVUYWJsZURpc3BsYXlQYXJ0cyh2YWx1ZSk7XG4gICAgcmV0dXJuIHBhcnRzLmRiTGFiZWwgPyBgJHtwYXJ0cy5kYkxhYmVsfS4ke3BhcnRzLnRhYmxlTGFiZWx9YCA6IHBhcnRzLnRhYmxlTGFiZWw7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uUGFydHMoIC8vIE5PU09OQVIgLSBjb21wbGV4aXR5OiBleHRyYWN0aW9uIHdvdWxkIHJpc2sgYmVoYXZpb3IgY2hhbmdlXG4gICAgdmFsdWU6IHN0cmluZyB8IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkXG4gICk6IENvbHVtbkRpc3BsYXlQYXJ0cyB7XG4gICAgY29uc3QgY29sdW1uVmFsdWUgPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS5jb2x1bW4gPz8gRU1QVFlfVkFMVUU7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKGNvbHVtblZhbHVlKTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSBgJHtjb2x1bW5WYWx1ZX1gLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYkxhYmVsOiBmYWxsYmFjay5sZW5ndGggPj0gTUlOX1BBUlRTX0ZPUl9EQiA/IGZhbGxiYWNrLnNsaWNlKDAsIERCX1BBUlRTX09GRlNFVCkuam9pbihcIi5cIikgOiBFTVBUWV9WQUxVRSxcbiAgICAgICAgdGFibGVMYWJlbDogZmFsbGJhY2subGVuZ3RoID49IE1JTl9QQVJUU19GT1JfVEFCTEUgPyBmYWxsYmFja1tmYWxsYmFjay5sZW5ndGggLSBNSU5fUEFSVFNfRk9SX1RBQkxFXSA6IGNvbHVtblZhbHVlLFxuICAgICAgICBmaWVsZExhYmVsOiBmYWxsYmFjay5hdCgtMSkgPz8gY29sdW1uVmFsdWUsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IChjb2x1bW4uZnVsbE5hbWUgPz8gY29sdW1uVmFsdWUpLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRiTGFiZWw6IHBhcnRzLmxlbmd0aCA+PSBNSU5fUEFSVFNfRk9SX0RCID8gcGFydHMuc2xpY2UoMCwgREJfUEFSVFNfT0ZGU0VUKS5qb2luKFwiLlwiKSA6IEVNUFRZX1ZBTFVFLFxuICAgICAgdGFibGVMYWJlbDogcGFydHMubGVuZ3RoID49IE1JTl9QQVJUU19GT1JfVEFCTEUgPyBwYXJ0c1twYXJ0cy5sZW5ndGggLSBNSU5fUEFSVFNfRk9SX1RBQkxFXSA6IHRoaXMucmVzb2x2ZVRhYmxlUGF0aChjb2x1bW4udGFibGUpLFxuICAgICAgZmllbGRMYWJlbDogcGFydHMuYXQoLTEpID8/IGNvbHVtbi52YWx1ZSxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtbkxhYmVsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVTb3J0RHJhZnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLnJlc29sdmVDb2x1bW5QYXRoKHRoaXMuc29ydERyYWZ0LmNvbHVtbik7XG4gICAgaWYgKCF0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5yZXNvbHZlRnVuY3Rpb25MYWJlbCh0aGlzLnNvcnREcmFmdC5mdW5jdGlvbk5hbWUpfSgke2Jhc2V9KWA7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFNvcnRTZWxlY3Rpb25JZChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBmdW5jdGlvbk5hbWUgPSBFTVBUWV9WQUxVRVxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtjb2x1bW59Ojoke2Z1bmN0aW9uTmFtZSB8fCBFTVBUWV9TT1JUX0ZVTkNUSU9OfWA7XG4gIH1cbiAgcHJpdmF0ZSBwYXJzZVNvcnRTZWxlY3Rpb25JZChcbiAgICBzZWxlY3Rpb25JZDogc3RyaW5nXG4gICk6IHsgY29sdW1uOiBzdHJpbmc7IGZ1bmN0aW9uTmFtZTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IFtjb2x1bW4sIGZ1bmN0aW9uTmFtZSA9IEVNUFRZX1NPUlRfRlVOQ1RJT05dID0gc2VsZWN0aW9uSWQuc3BsaXQoXCI6OlwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uLFxuICAgICAgZnVuY3Rpb25OYW1lOlxuICAgICAgICBmdW5jdGlvbk5hbWUgPT09IEVNUFRZX1NPUlRfRlVOQ1RJT04gPyBFTVBUWV9WQUxVRSA6IGZ1bmN0aW9uTmFtZSxcbiAgICB9O1xuICB9XG4gIHJlc29sdmVDb2x1bW5QYXRoKHZhbHVlOiBzdHJpbmcgfCBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uVmFsdWUgPVxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS5jb2x1bW4gPz8gRU1QVFlfVkFMVUU7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKGNvbHVtblZhbHVlKTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbHVtblZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IChjb2x1bW4uZnVsbE5hbWUgPz8gY29sdW1uVmFsdWUpLnNwbGl0KFwiLlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+PSBNSU5fUEFSVFNfRk9SX1RBQkxFID8gcGFydHMuc2xpY2UoREJfUEFSVFNfT0ZGU0VUKS5qb2luKFwiLlwiKSA6IGNvbHVtbi5mdWxsTmFtZTtcbiAgfVxuICBwcml2YXRlIG5vcm1hbGl6ZUdlbmVyYXRlZEZpZWxkKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFxuICApOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgY29sdW1uOiB2YWx1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uOiB2YWx1ZS5jb2x1bW4sXG4gICAgICBhbGlhczogdmFsdWUuYWxpYXM/LnRyaW0oKSA/PyBFTVBUWV9WQUxVRSxcbiAgICAgIHdpZHRoOiB2YWx1ZS53aWR0aD8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgZnVuY3Rpb246IHZhbHVlLmZ1bmN0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogdmFsdWUuZnVuY3Rpb24uZnVuY3Rpb25OYW1lPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgICAgYWxpYXM6IHZhbHVlLmZ1bmN0aW9uLmFsaWFzPy50cmltKCkgPz8gRU1QVFlfVkFMVUUsXG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkRmllbGRFbnRyaWVzKCk6IEFycmF5PFxuICAgIER5bmFtaWNWaWV3QnVpbGRlckZpZWxkICYgeyBzb3VyY2VJbmRleDogbnVtYmVyIH1cbiAgPiB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMubm9ybWFsaXplZEZpZWxkcy5tYXAoKGl0ZW0sIHNvdXJjZUluZGV4KSA9PiAoe1xuICAgICAgLi4uaXRlbSxcbiAgICAgIHNvdXJjZUluZGV4LFxuICAgIH0pKTtcbiAgICBjb25zdCBwcmV2aWV3SW5kZXhlcyA9IHRoaXMuZ2V0RmllbGRQcmV2aWV3U291cmNlSW5kZXhlcygpO1xuICAgIHJldHVybiBwcmV2aWV3SW5kZXhlcy5tYXAoKGluZGV4KSA9PiBlbnRyaWVzW2luZGV4XSkuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG4gIHByaXZhdGUgZ2V0RmllbGRQcmV2aWV3U291cmNlSW5kZXhlcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgYmFzZUluZGV4ZXMgPSB0aGlzLm5vcm1hbGl6ZWRGaWVsZHMubWFwKChfLCBpbmRleCkgPT4gaW5kZXgpO1xuICAgIGlmICh0aGlzLmRyYWdnaW5nRmllbGRJbmRleCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGJhc2VJbmRleGVzO1xuICAgIH1cbiAgICBjb25zdCByZW1haW5pbmdJbmRleGVzID0gYmFzZUluZGV4ZXMuZmlsdGVyKFxuICAgICAgKGluZGV4KSA9PiBpbmRleCAhPT0gdGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXhcbiAgICApO1xuICAgIGNvbnN0IGluc2VydGlvbkluZGV4ID1cbiAgICAgIHRoaXMuZHJhZ1ByZXZpZXdJbmRleCA9PT0gbnVsbFxuICAgICAgICA/IGJhc2VJbmRleGVzLmluZGV4T2YodGhpcy5kcmFnZ2luZ0ZpZWxkSW5kZXgpXG4gICAgICAgIDogTWF0aC5taW4odGhpcy5kcmFnUHJldmlld0luZGV4LCByZW1haW5pbmdJbmRleGVzLmxlbmd0aCk7XG4gICAgcmVtYWluaW5nSW5kZXhlcy5zcGxpY2UoaW5zZXJ0aW9uSW5kZXgsIDAsIHRoaXMuZHJhZ2dpbmdGaWVsZEluZGV4KTtcbiAgICByZXR1cm4gcmVtYWluaW5nSW5kZXhlcztcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGdW5jdGlvbkxhYmVsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVPcHRpb25MYWJlbCh2YWx1ZSwgdGhpcy5mdW5jdGlvbk9wdGlvbnMpO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUpvaW5PcGVyYXRvckxhYmVsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVPcHRpb25MYWJlbCh2YWx1ZSwgdGhpcy5qb2luT3BlcmF0b3JPcHRpb25zKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVKb2luT3BlcmF0b3JPcHRpb25UZXh0KG9wdGlvbjogRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBmYWxsYmFjayA9IEpPSU5fT1BFUkFUT1JfTEFCRUxTW29wdGlvbi52YWx1ZV07XG4gICAgY29uc3QgaGFzUmVhZGFibGVUZXh0ID0gL1tBLVphLXrDgC3Dv10vLnRlc3Qob3B0aW9uLnRleHQpO1xuXG4gICAgaWYgKCFmYWxsYmFjayB8fCBoYXNSZWFkYWJsZVRleHQpIHtcbiAgICAgIHJldHVybiBvcHRpb24udGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LiR7ZmFsbGJhY2sua2V5fWAsXG4gICAgICBmYWxsYmFjay5mYWxsYmFja1xuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRmlsdGVyT3BlcmF0b3JMYWJlbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXhcbiAgICAgIH0uZmlsdGVycy5vcGVyYXRvcnMuJHt2YWx1ZS50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICB0aGlzLmh1bWFuaXplS2V5KHZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlT3B0aW9uTGFiZWwoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBEeW5hbWljVmlld0J1aWxkZXJPcHRpb25bXVxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb25zLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHZhbHVlKT8udGV4dCA/PyB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJEaXNwbGF5VmFsdWUoZmlsdGVyOiBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIpOiBzdHJpbmcgeyAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIGlmIChmaWx0ZXIudmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4pIHtcbiAgICAgIHJldHVybiBmaWx0ZXIuZG9tYWluRXhwcmVzc2lvbiA/PyBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgaWYgKGZpbHRlci52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgOiR7ZmlsdGVyLnBhcmFtZXRlck5hbWUgPz8gRU1QVFlfVkFMVUV9YDtcbiAgICB9XG4gICAgaWYgKGZpbHRlci5vcGVyYXRvciA9PT0gXCJJTlwiKSB7XG4gICAgICByZXR1cm4gKGZpbHRlci52YWx1ZXMgPz8gW10pLmpvaW4oXCIsIFwiKTtcbiAgICB9XG4gICAgaWYgKGZpbHRlci5vcGVyYXRvciA9PT0gXCJCRVRXRUVOXCIpIHtcbiAgICAgIHJldHVybiBgJHtmaWx0ZXIudmFsdWVzPy5bMF0gPz8gRU1QVFlfVkFMVUV9IC0gJHtmaWx0ZXIudmFsdWVzPy5bMV0gPz8gRU1QVFlfVkFMVUVcbiAgICAgICAgfWA7XG4gICAgfVxuICAgIGlmIChbXCJFTVBUWVwiLCBcIk5PVF9FTVBUWVwiXS5pbmNsdWRlcyhmaWx0ZXIub3BlcmF0b3IpKSB7XG4gICAgICByZXR1cm4gXCItXCI7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXIudmFsdWUgPz8gRU1QVFlfVkFMVUU7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEdlbmVyYXRlZFNxbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNvdXJjZXMgPSB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc291cmNlcztcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdFBhcnRzID0gdGhpcy5ub3JtYWxpemVkRmllbGRzXG4gICAgICAubWFwKChmaWVsZCkgPT4gdGhpcy5yZXNvbHZlRmllbGRTcWwoZmllbGQpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBzcWwgPSBbXG4gICAgICBcIlNFTEVDVFwiLFxuICAgICAgYCAgJHsoc2VsZWN0UGFydHMubGVuZ3RoID8gc2VsZWN0UGFydHMgOiBbXCIqXCJdKS5qb2luKFwiLFxcbiAgXCIpfWAsXG4gICAgICBgRlJPTSAke3RoaXMucmVzb2x2ZVNvdXJjZVNxbChzb3VyY2VzWzBdKX1gLFxuICAgICAgLi4udGhpcy5jb25maWcuZ2VuZXJhdGVkLmpvaW5zLm1hcCgoaXRlbSkgPT4gdGhpcy5yZXNvbHZlSm9pblNxbChpdGVtKSksXG4gICAgICAuLi50aGlzLmJ1aWxkV2hlcmVTcWwoKSxcbiAgICAgIC4uLnRoaXMuYnVpbGRHcm91cEJ5U3FsKCksXG4gICAgICAuLi50aGlzLmJ1aWxkT3JkZXJCeVNxbCgpLFxuICAgIF07XG4gICAgcmV0dXJuIHNxbC5qb2luKFwiXFxuXCIpO1xuICB9XG4gIHByaXZhdGUgYnVpbGRXaGVyZVNxbCgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbnMgPSB0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuZmlsdGVyc1xuICAgICAgLm1hcCgoZmlsdGVyLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjb25uZWN0b3IgPSBpbmRleCA9PT0gMCA/IFwiV0hFUkVcIiA6IGZpbHRlci5jb25uZWN0b3I7XG4gICAgICAgIHJldHVybiBgICAke2Nvbm5lY3Rvcn0gJHt0aGlzLnJlc29sdmVGaWx0ZXJTcWwoZmlsdGVyKX1gO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmVuZHNXaXRoKEVNUFRZX1ZBTFVFKSk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25zLmxlbmd0aCA/IGV4cHJlc3Npb25zIDogW107XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEdyb3VwQnlTcWwoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5jb25maWcuZ2VuZXJhdGVkLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBcIkdST1VQIEJZXCIsXG4gICAgICBgICAke3RoaXMuY29uZmlnLmdlbmVyYXRlZC5ncm91cEJ5XG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IHRoaXMucmVzb2x2ZUNvbHVtblNxbChpdGVtKSlcbiAgICAgICAgLmpvaW4oXCIsXFxuICBcIil9YCxcbiAgICBdO1xuICB9XG4gIHByaXZhdGUgYnVpbGRPcmRlckJ5U3FsKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3J0aW5nLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgXCJPUkRFUiBCWVwiLFxuICAgICAgYCAgJHt0aGlzLmNvbmZpZy5nZW5lcmF0ZWQuc29ydGluZ1xuICAgICAgICAubWFwKChpdGVtKSA9PiBgJHt0aGlzLnJlc29sdmVTb3J0U3FsKGl0ZW0pfSAke2l0ZW0uZGlyZWN0aW9ufWApXG4gICAgICAgIC5qb2luKFwiLFxcbiAgXCIpfWAsXG4gICAgXTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVTb3VyY2VTcWwoc291cmNlOiBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbiB8IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGFsaWFzOiBzdHJpbmc7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhYmxlID0gXCJ0YWJsZVwiIGluIHNvdXJjZSA/IHRoaXMucmVzb2x2ZVRhYmxlT3B0aW9uKHNvdXJjZS50YWJsZSkgOiBzb3VyY2U7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgcmV0dXJuIEVNUFRZX1ZBTFVFO1xuICAgIH1cbiAgICBjb25zdCBzb3VyY2VBbGlhcyA9IFwidGFibGVcIiBpbiBzb3VyY2UgPyBzb3VyY2UuYWxpYXMgOiBFTVBUWV9WQUxVRTtcbiAgICBjb25zdCBmdWxsTmFtZSA9IHRhYmxlLnNjaGVtYSA/IGAke3RhYmxlLnNjaGVtYX0uJHt0YWJsZS52YWx1ZX1gIDogdGFibGUudmFsdWU7XG4gICAgcmV0dXJuIHNvdXJjZUFsaWFzID8gYCR7ZnVsbE5hbWV9ICR7c291cmNlQWxpYXN9YCA6IGZ1bGxOYW1lO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUpvaW5TcWwoaXRlbTogRHluYW1pY1ZpZXdCdWlsZGVySm9pbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBKT0lOICR7dGhpcy5yZXNvbHZlSm9pbmVkVGFibGVTcWwoXG4gICAgICBpdGVtXG4gICAgKX0gT04gJHt0aGlzLnJlc29sdmVDb2x1bW5TcWwoaXRlbS5zb3VyY2VDb2x1bW4pfSAke3RoaXMucmVzb2x2ZUpvaW5PcGVyYXRvclNxbChcbiAgICAgIGl0ZW0ub3BlcmF0b3JcbiAgICApfSAke3RoaXMucmVzb2x2ZUNvbHVtblNxbChpdGVtLnRhcmdldENvbHVtbil9YDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVKb2luZWRUYWJsZVNxbChpdGVtOiBEeW5hbWljVmlld0J1aWxkZXJKb2luKTogc3RyaW5nIHtcbiAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24oaXRlbS50YXJnZXRDb2x1bW4pO1xuICAgIGlmICghdGFyZ2V0Q29sdW1uKSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmZpbmQoXG4gICAgICAoZW50cnkpID0+IGVudHJ5LnRhYmxlID09PSB0YXJnZXRDb2x1bW4udGFibGVcbiAgICApO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlc29sdmVTb3VyY2VTcWwoc291cmNlKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVDb2x1bW5TcWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKHZhbHVlKTtcbiAgICBpZiAoIWNvbHVtbikge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBhbGlhcyA9IHRoaXMuY29uZmlnLmdlbmVyYXRlZC5zb3VyY2VzLmZpbmQoXG4gICAgICAoaXRlbSkgPT4gaXRlbS50YWJsZSA9PT0gY29sdW1uLnRhYmxlXG4gICAgKT8uYWxpYXM7XG4gICAgY29uc3QgZmllbGROYW1lID0gY29sdW1uLmZ1bGxOYW1lLnNwbGl0KFwiLlwiKS5wb3AoKSA/PyBjb2x1bW4udmFsdWU7XG4gICAgcmV0dXJuIGFsaWFzID8gYCR7YWxpYXN9LiR7ZmllbGROYW1lfWAgOiBjb2x1bW4uZnVsbE5hbWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlRmllbGRTcWwoZmllbGQ6IHN0cmluZyB8IER5bmFtaWNWaWV3QnVpbGRlckZpZWxkKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmllbGQgPSB0aGlzLm5vcm1hbGl6ZUdlbmVyYXRlZEZpZWxkKGZpZWxkKTtcbiAgICBjb25zdCBmaWVsZFNxbCA9IHRoaXMucmVzb2x2ZUNvbHVtblNxbChub3JtYWxpemVkRmllbGQuY29sdW1uKTtcbiAgICBpZiAobm9ybWFsaXplZEZpZWxkLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVGdW5jdGlvblNxbCh7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogbm9ybWFsaXplZEZpZWxkLmZ1bmN0aW9uLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgY29sdW1uOiBub3JtYWxpemVkRmllbGQuY29sdW1uLFxuICAgICAgICBhbGlhczpcbiAgICAgICAgICBub3JtYWxpemVkRmllbGQuZnVuY3Rpb24uYWxpYXM/LnRyaW0oKSB8fCAvLyBOT1NPTkFSXG4gICAgICAgICAgbm9ybWFsaXplZEZpZWxkLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUlxuICAgICAgICAgIEVNUFRZX1ZBTFVFLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGFsaWFzID0gbm9ybWFsaXplZEZpZWxkLmFsaWFzPy50cmltKCk7XG4gICAgcmV0dXJuIGFsaWFzID8gYCR7ZmllbGRTcWx9IEFTICR7YWxpYXN9YCA6IGZpZWxkU3FsO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUZ1bmN0aW9uU3FsKGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkRnVuY3Rpb24gPSBpdGVtLmZ1bmN0aW9uTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IGFyZ3VtZW50ID0gdGhpcy5yZXNvbHZlQ29sdW1uU3FsKGl0ZW0uY29sdW1uKTtcbiAgICBjb25zdCBhbGlhcyA9IGl0ZW0uYWxpYXM/LnRyaW0oKTtcbiAgICByZXR1cm4gYWxpYXNcbiAgICAgID8gYCR7bm9ybWFsaXplZEZ1bmN0aW9ufSgke2FyZ3VtZW50fSkgQVMgJHthbGlhc31gXG4gICAgICA6IGAke25vcm1hbGl6ZWRGdW5jdGlvbn0oJHthcmd1bWVudH0pYDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVTb3J0U3FsKGl0ZW06IER5bmFtaWNWaWV3QnVpbGRlclNvcnQpOiBzdHJpbmcge1xuICAgIGlmICghaXRlbS5mdW5jdGlvbk5hbWU/LnRyaW0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNvbHVtblNxbChpdGVtLmNvbHVtbik7XG4gICAgfVxuICAgIHJldHVybiBgJHtpdGVtLmZ1bmN0aW9uTmFtZS50cmltKCkudG9VcHBlckNhc2UoKX0oJHt0aGlzLnJlc29sdmVDb2x1bW5TcWwoXG4gICAgICBpdGVtLmNvbHVtblxuICAgICl9KWA7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlSm9pbk9wZXJhdG9yU3FsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB7XG4gICAgICAgIEVRVUFMUzogXCI9XCIsXG4gICAgICAgIE5PVF9FUVVBTFM6IFwiPD5cIixcbiAgICAgIH1bdmFsdWVdID8/IHZhbHVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJTcWwoZmlsdGVyOiBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIpOiBzdHJpbmcgeyAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIGlmIChmaWx0ZXIudmFsdWVUeXBlID09PSBGSUxURVJfTU9ERV9ET01BSU4pIHtcbiAgICAgIHJldHVybiBgKCR7ZmlsdGVyLmRvbWFpbkV4cHJlc3Npb24gPz8gRU1QVFlfVkFMVUV9KWA7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5yZXNvbHZlQ29sdW1uU3FsKGZpbHRlci5jb2x1bW4pO1xuICAgIGlmICghZmllbGQpIHtcbiAgICAgIHJldHVybiBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgaWYgKGZpbHRlci5vcGVyYXRvciA9PT0gXCJFTVBUWVwiKSB7XG4gICAgICByZXR1cm4gYCR7ZmllbGR9IElTIE5VTExgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIk5PVF9FTVBUWVwiKSB7XG4gICAgICByZXR1cm4gYCR7ZmllbGR9IElTIE5PVCBOVUxMYDtcbiAgICB9XG4gICAgaWYgKGZpbHRlci5vcGVyYXRvciA9PT0gXCJJTlwiKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSAoZmlsdGVyLnZhbHVlcyA/PyBbXSkubWFwKChpdGVtKSA9PlxuICAgICAgICB0aGlzLnJlc29sdmVGaWx0ZXJWYWx1ZVNxbChmaWx0ZXIuY29sdW1uLCBmaWx0ZXIub3BlcmF0b3IsIGl0ZW0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIGAke2ZpZWxkfSBJTiAoJHt2YWx1ZXMuam9pbihcIiwgXCIpfSlgO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9wZXJhdG9yID09PSBcIkJFVFdFRU5cIikge1xuICAgICAgcmV0dXJuIGAke2ZpZWxkfSBCRVRXRUVOICR7dGhpcy5yZXNvbHZlRmlsdGVyVmFsdWVTcWwoXG4gICAgICAgIGZpbHRlci5jb2x1bW4sXG4gICAgICAgIGZpbHRlci5vcGVyYXRvcixcbiAgICAgICAgZmlsdGVyLnZhbHVlcz8uWzBdXG4gICAgICApfSBBTkQgJHt0aGlzLnJlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICAgICAgZmlsdGVyLmNvbHVtbixcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yLFxuICAgICAgICBmaWx0ZXIudmFsdWVzPy5bMV1cbiAgICAgICl9YDtcbiAgICB9XG4gICAgaWYgKGZpbHRlci52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgJHtmaWVsZH0gJHt0aGlzLnJlc29sdmVGaWx0ZXJPcGVyYXRvclNxbChcbiAgICAgICAgZmlsdGVyLm9wZXJhdG9yXG4gICAgICApfSA6JHtmaWx0ZXIucGFyYW1ldGVyTmFtZSA/PyBFTVBUWV9WQUxVRX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7ZmllbGR9ICR7dGhpcy5yZXNvbHZlRmlsdGVyT3BlcmF0b3JTcWwoXG4gICAgICBmaWx0ZXIub3BlcmF0b3JcbiAgICApfSAke3RoaXMucmVzb2x2ZUZpbHRlclZhbHVlU3FsKGZpbHRlci5jb2x1bW4sIGZpbHRlci5vcGVyYXRvciwgZmlsdGVyLnZhbHVlKX1gO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZUZpbHRlck9wZXJhdG9yU3FsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB7XG4gICAgICAgIEVRVUFMOiBcIj1cIixcbiAgICAgICAgTk9UX0VRVUFMOiBcIjw+XCIsXG4gICAgICAgIEdSRUFURVI6IFwiPlwiLFxuICAgICAgICBHUkVBVEVSX1RIQU46IFwiPlwiLFxuICAgICAgICBHUkVBVEVSX09SX0VRVUFMOiBcIj49XCIsXG4gICAgICAgIEdSRUFURVJfVEhBTl9PUl9FUVVBTDogXCI+PVwiLFxuICAgICAgICBMRVNTOiBcIjxcIixcbiAgICAgICAgTEVTU19USEFOOiBcIjxcIixcbiAgICAgICAgTEVTU19PUl9FUVVBTDogXCI8PVwiLFxuICAgICAgICBMRVNTX1RIQU5fT1JfRVFVQUw6IFwiPD1cIixcbiAgICAgICAgQ09OVEFJTlM6IFwiTElLRVwiLFxuICAgICAgICBET0VTX05PVF9DT05UQUlOOiBcIk5PVCBMSUtFXCIsXG4gICAgICAgIFNUQVJUU19XSVRIOiBcIkxJS0VcIixcbiAgICAgICAgRU5EU19XSVRIOiBcIkxJS0VcIixcbiAgICAgIH1bdmFsdWVdID8/IHZhbHVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJWYWx1ZVNxbChcbiAgICBjb2x1bW5WYWx1ZTogc3RyaW5nLFxuICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd25cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyBFTVBUWV9WQUxVRSk7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5yZXNvbHZlQ29sdW1uT3B0aW9uKGNvbHVtblZhbHVlKTtcbiAgICBpZiAoY29sdW1uPy5kYXRhVHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBzdHJpbmdWYWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIiA/IFwiVFJVRVwiIDogXCJGQUxTRVwiO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc051bWVyaWNUeXBlKGNvbHVtbj8uZGF0YVR5cGUpICYmIHN0cmluZ1ZhbHVlKSB7XG4gICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgfVxuICAgIGlmIChbXCJDT05UQUlOU1wiLCBcIkRPRVNfTk9UX0NPTlRBSU5cIiwgXCJTVEFSVFNfV0lUSFwiLCBcIkVORFNfV0lUSFwiXS5pbmNsdWRlcyhcbiAgICAgIG9wZXJhdG9yXG4gICAgKSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVvdGVTcWxWYWx1ZSh0aGlzLmRlY29yYXRlTGlrZVZhbHVlKG9wZXJhdG9yLCBzdHJpbmdWYWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5xdW90ZVNxbFZhbHVlKHN0cmluZ1ZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGRlY29yYXRlTGlrZVZhbHVlKG9wZXJhdG9yOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChvcGVyYXRvciA9PT0gXCJTVEFSVFNfV0lUSFwiKSB7XG4gICAgICByZXR1cm4gYCR7dmFsdWV9JWA7XG4gICAgfVxuICAgIGlmIChvcGVyYXRvciA9PT0gXCJFTkRTX1dJVEhcIikge1xuICAgICAgcmV0dXJuIGAlJHt2YWx1ZX1gO1xuICAgIH1cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiQ09OVEFJTlNcIiB8fCBvcGVyYXRvciA9PT0gXCJET0VTX05PVF9DT05UQUlOXCIpIHtcbiAgICAgIHJldHVybiBgJSR7dmFsdWV9JWA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIHF1b3RlU3FsVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAnJHt2YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG4gIH1cbiAgcHJpdmF0ZSBzeW5jTGF5b3V0TW9kZUl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMubGF5b3V0TW9kZUl0ZW1zWzBdLmxhYmVsID0gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgYCR7dGhpcy5jb25maWcudHJhbnNsYXRpb25QcmVmaXh9LmxheW91dE1vZGVzLnN0YWNrZWRgLFxuICAgICAgXCJCbG9jb3NcIlxuICAgICk7XG4gICAgdGhpcy5sYXlvdXRNb2RlSXRlbXNbMV0ubGFiZWwgPSB0aGlzLmluc3RhbnRXaXRoRmFsbGJhY2soXG4gICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0ubGF5b3V0TW9kZXMuc3BsaXRgLFxuICAgICAgXCJMaXN0YVwiXG4gICAgKTtcbiAgICB0aGlzLnN5bmNTZWxlY3RlZExheW91dE1vZGVJdGVtcygpO1xuICB9XG4gIHByaXZhdGUgc3luY0ZpbHRlck1vZGVJdGVtcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck1vZGVJdGVtc1swXS5sYWJlbCA9IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLm1vZGVzLmNvbmRpdGlvbmAsXG4gICAgICBcIkZpbHRyb1wiXG4gICAgKTtcbiAgICB0aGlzLmZpbHRlck1vZGVJdGVtc1sxXS5sYWJlbCA9IHRoaXMuaW5zdGFudFdpdGhGYWxsYmFjayhcbiAgICAgIGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4fS5maWx0ZXJzLmRvbWFpbkxhYmVsYCxcbiAgICAgIFwiRXhwcmVzc2FvIGRlIGRvbWluaW9cIlxuICAgICk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRGaWx0ZXJNb2RlSXRlbXMoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTb3J0RGlyZWN0aW9uSXRlbXMoKTogdm9pZCB7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uSXRlbXMuc3BsaWNlKFxuICAgICAgMCxcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLnRoaXMuc29ydERpcmVjdGlvbk9wdGlvbnMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBsYWJlbDogaXRlbS50ZXh0LFxuICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZSxcbiAgICAgIH0pKVxuICAgICk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRTb3J0RGlyZWN0aW9uSXRlbXMoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTZWxlY3RlZExheW91dE1vZGVJdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMubGF5b3V0TW9kZUl0ZW1zLmZpbmQoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5sYXlvdXRNb2RlXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGVkTGF5b3V0TW9kZUl0ZW1zLnNwbGljZShcbiAgICAgIDAsXG4gICAgICB0aGlzLnNlbGVjdGVkTGF5b3V0TW9kZUl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLihzZWxlY3RlZCA/IFtzZWxlY3RlZF0gOiBbXSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc3luY1NlbGVjdGVkRmlsdGVyTW9kZUl0ZW1zKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5maWx0ZXJNb2RlSXRlbXMuZmluZChcbiAgICAgIChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSB0aGlzLmZpbHRlck1vZGFsTW9kZVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlck1vZGVJdGVtcy5zcGxpY2UoXG4gICAgICAwLFxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlck1vZGVJdGVtcy5sZW5ndGgsXG4gICAgICAuLi4oc2VsZWN0ZWQgPyBbc2VsZWN0ZWRdIDogW10pXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHN5bmNTZWxlY3RlZFNvcnREaXJlY3Rpb25JdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc29ydERpcmVjdGlvbkl0ZW1zLmZpbmQoXG4gICAgICAoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdGhpcy5zb3J0RHJhZnQuZGlyZWN0aW9uXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zLnNwbGljZShcbiAgICAgIDAsXG4gICAgICB0aGlzLnNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zLmxlbmd0aCxcbiAgICAgIC4uLihzZWxlY3RlZCA/IFtzZWxlY3RlZF0gOiBbXSlcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0IGZpbHRlclNlcXVlbmNlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJFZGl0SW5kZXggPz8gdGhpcy5jb25maWcuZ2VuZXJhdGVkLmZpbHRlcnMubGVuZ3RoO1xuICB9XG4gIHByaXZhdGUgcGFyc2VNdWx0aVZhbHVlVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG4gIHByaXZhdGUgYnVpbGRBbGlhc0ZvclRhYmxlKHRhYmxlOiBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3Qgd29yZHMgPSB0YWJsZS50ZXh0XG4gICAgICAuc3BsaXQoL1tcXHNfLi1dKy8pXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHdvcmRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHJldHVybiB3b3Jkc1xuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtWzBdPy50b0xvd2VyQ2FzZSgpID8/IEVNUFRZX1ZBTFVFKVxuICAgICAgICAuam9pbihcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuICh0YWJsZS52YWx1ZS5zcGxpdChcIi5cIikucG9wKCkgPz8gdGFibGUudmFsdWUpXG4gICAgICAuc2xpY2UoMCwgQUxJQVNfTUFYX0xFTkdUSClcbiAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHByaXZhdGUgcmVzb2x2ZURlZmF1bHRTb3VyY2VBbGlhcyh0YWJsZVZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5yZXNvbHZlVGFibGVPcHRpb24odGFibGVWYWx1ZSk7XG4gICAgcmV0dXJuIHRhYmxlID8gdGhpcy5idWlsZEFsaWFzRm9yVGFibGUodGFibGUpIDogRU1QVFlfVkFMVUU7XG4gIH1cbiAgcHJpdmF0ZSBoYXNDdXN0b21BbGlhcyh0YWJsZVZhbHVlOiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucmVzb2x2ZVRhYmxlT3B0aW9uKHRhYmxlVmFsdWUpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhYWxpYXMudHJpbSgpICYmIGFsaWFzLnRyaW0oKSAhPT0gdGhpcy5idWlsZEFsaWFzRm9yVGFibGUodGFibGUpO1xuICB9XG4gIG9uRmllbGRGdW5jdGlvbk5hbWVDaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uQWxpYXMgPSBFTVBUWV9WQUxVRTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW4gPSB0aGlzLnJlc29sdmVDb2x1bW5PcHRpb24odGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuY29sdW1uKTtcbiAgICBpZiAoXG4gICAgICBzZWxlY3RlZENvbHVtbiAmJlxuICAgICAgIXRoaXMuZmlsdGVyRnVuY3Rpb25TZWxlY3RhYmxlQ29sdW1ucyh0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWUpXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udmFsdWUpXG4gICAgICAgIC5pbmNsdWRlcyhzZWxlY3RlZENvbHVtbi52YWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZSA9IEVNUFRZX1ZBTFVFO1xuICAgICAgdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25BbGlhcyA9IEVNUFRZX1ZBTFVFO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uQWxpYXMudHJpbSgpKSB7XG4gICAgICB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbkFsaWFzID0gdGhpcy5idWlsZEZpZWxkRnVuY3Rpb25BbGlhcygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGJ1aWxkRnVuY3Rpb25BbGlhcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucmVzb2x2ZUNvbHVtbk9wdGlvbih0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5jb2x1bW4pO1xuICAgIGNvbnN0IGJhc2UgPSBjb2x1bW4/LnRleHQgPz8gdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuY29sdW1uID8/IEVNUFRZX1ZBTFVFO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHRoaXMuc2x1Z2lmeShiYXNlKTtcbiAgICByZXR1cm4gc3VmZml4XG4gICAgICA/IGAke3RoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZX1fJHtzdWZmaXh9YFxuICAgICAgOiB0aGlzLmZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWU7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEZpZWxkRnVuY3Rpb25BbGlhcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkRnVuY3Rpb25BbGlhcygpO1xuICB9XG4gIHByaXZhdGUgYnVpbGRGaWVsZEZ1bmN0aW9uRHJhZnQoKTogRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRGdW5jdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHRoaXMuZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uTmFtZS50cmltKCk7XG4gICAgaWYgKCFmdW5jdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgYWxpYXM6IChcbiAgICAgICAgdGhpcy5maWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25BbGlhcyB8fCB0aGlzLmJ1aWxkRmllbGRGdW5jdGlvbkFsaWFzKClcbiAgICAgICkudHJpbSgpLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBwYXRjaEZpZWxkTW9kYWxEcmFmdChcbiAgICBjb2x1bW46IHN0cmluZyxcbiAgICBwYXRjaDogUGFydGlhbDxEeW5hbWljVmlld0J1aWxkZXJGaWVsZD5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZE1vZGFsRHJhZnRzID0gdGhpcy5maWVsZE1vZGFsRHJhZnRzLm1hcCgoaXRlbSkgPT5cbiAgICAgIGl0ZW0uY29sdW1uID09PSBjb2x1bW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAuLi5wYXRjaCxcbiAgICAgICAgfVxuICAgICAgICA6IGl0ZW1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgbWVyZ2VMZWdhY3lGdW5jdGlvbnNJbnRvRmllbGRzKFxuICAgIGZpZWxkczogRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRbXSxcbiAgICBmdW5jdGlvbnM6IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uW11cbiAgKTogRHluYW1pY1ZpZXdCdWlsZGVyRmllbGRbXSB7XG4gICAgY29uc3QgZmllbGRCeUNvbHVtbiA9IG5ldyBNYXAoZmllbGRzLm1hcCgoaXRlbSkgPT4gW2l0ZW0uY29sdW1uLCB7IC4uLml0ZW0gfV0pKTtcblxuICAgIGZ1bmN0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZmllbGRCeUNvbHVtbi5nZXQoaXRlbS5jb2x1bW4pID8/IHsgY29sdW1uOiBpdGVtLmNvbHVtbiB9O1xuICAgICAgaWYgKCFjdXJyZW50LmZ1bmN0aW9uKSB7XG4gICAgICAgIGN1cnJlbnQuZnVuY3Rpb24gPSB7XG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiBpdGVtLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICBhbGlhczogaXRlbS5hbGlhcyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZpZWxkQnlDb2x1bW4uc2V0KGl0ZW0uY29sdW1uLCBjdXJyZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpZWxkQnlDb2x1bW4udmFsdWVzKCkpO1xuICB9XG4gIHByaXZhdGUgZXh0cmFjdEZ1bmN0aW9uc0Zyb21GaWVsZHMoXG4gICAgZmllbGRzOiBEeW5hbWljVmlld0J1aWxkZXJGaWVsZFtdXG4gICk6IER5bmFtaWNWaWV3QnVpbGRlckZ1bmN0aW9uW10ge1xuICAgIHJldHVybiBmaWVsZHNcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICEhaXRlbS5mdW5jdGlvbj8uZnVuY3Rpb25OYW1lPy50cmltKCkpXG4gICAgICAubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGl0ZW0uZnVuY3Rpb24/LmZ1bmN0aW9uTmFtZT8udHJpbSgpID8/IEVNUFRZX1ZBTFVFLFxuICAgICAgICBjb2x1bW46IGl0ZW0uY29sdW1uLFxuICAgICAgICBhbGlhczpcbiAgICAgICAgICBpdGVtLmZ1bmN0aW9uPy5hbGlhcz8udHJpbSgpIHx8IC8vIE5PU09OQVIgLSBlbXB0eSBzdHJpbmcgZmFsbGJhY2sgaXMgaW50ZW50aW9uYWxcbiAgICAgICAgICBpdGVtLmFsaWFzPy50cmltKCkgfHwgLy8gTk9TT05BUiAtIGVtcHR5IHN0cmluZyBmYWxsYmFjayBpcyBpbnRlbnRpb25hbFxuICAgICAgICAgIHRoaXMuc2x1Z2lmeShgJHtpdGVtLmZ1bmN0aW9uPy5mdW5jdGlvbk5hbWUgPz8gRU1QVFlfVkFMVUV9XyR7aXRlbS5jb2x1bW59YCksXG4gICAgICB9KSk7XG4gIH1cbiAgcHJpdmF0ZSBzbHVnaWZ5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZSh2YWx1ZSkucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIl9cIik7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgZW5kID0gbm9ybWFsaXplZC5sZW5ndGg7XG5cbiAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgbm9ybWFsaXplZC5jaGFyQXQoc3RhcnQpID09PSBcIl9cIikge1xuICAgICAgc3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICB3aGlsZSAoZW5kID4gc3RhcnQgJiYgbm9ybWFsaXplZC5jaGFyQXQoZW5kIC0gMSkgPT09IFwiX1wiKSB7XG4gICAgICBlbmQgLT0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZC5zbGljZShzdGFydCwgZW5kKTtcbiAgfVxuICBwcml2YXRlIGRlZHVwbGljYXRlQnlLZXk8VD4oXG4gICAgaXRlbXM6IFRbXSxcbiAgICBrZXlSZXNvbHZlcjogKGl0ZW06IFQpID0+IHN0cmluZ1xuICApOiBUW10ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IG1hcC5zZXQoa2V5UmVzb2x2ZXIoaXRlbSksIGl0ZW0pKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShtYXAudmFsdWVzKCkpO1xuICB9XG4gIHByaXZhdGUgaHVtYW5pemVLZXkodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnNwbGl0KFwiX1wiKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGl0ZW0uc2xpY2UoMSkpXG4gICAgICAuam9pbihcIiBcIik7XG4gIH1cbiAgcHJpdmF0ZSBpbnN0YW50V2l0aEZhbGxiYWNrKGtleTogc3RyaW5nLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0cmFuc2xhdGVkID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChrZXkpO1xuICAgIHJldHVybiB0cmFuc2xhdGVkICYmIHRyYW5zbGF0ZWQgIT09IGtleSA/IHRyYW5zbGF0ZWQgOiBmYWxsYmFjaztcbiAgfVxuICBwcml2YXRlIGJ1aWxkRmlsdGVyRnJvbURyYWZ0KCk6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlciB8IG51bGwgeyAvLyBOT1NPTkFSIC0gY29tcGxleGl0eTogZXh0cmFjdGlvbiB3b3VsZCByaXNrIGJlaGF2aW9yIGNoYW5nZVxuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICBjb25zdCBkb21haW5FeHByZXNzaW9uID0gdGhpcy5maWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uLnRyaW0oKTtcblxuICAgICAgaWYgKCFkb21haW5FeHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW46IEVNUFRZX1ZBTFVFLFxuICAgICAgICBvcGVyYXRvcjogRU1QVFlfVkFMVUUsXG4gICAgICAgIGNvbm5lY3RvcjogdGhpcy5maWx0ZXJEcmFmdC5jb25uZWN0b3IsXG4gICAgICAgIG9wdGlvbmFsOiB0aGlzLmZpbHRlckRyYWZ0Lm9wdGlvbmFsLFxuICAgICAgICB2YWx1ZVR5cGU6IEZJTFRFUl9NT0RFX0RPTUFJTixcbiAgICAgICAgZG9tYWluRXhwcmVzc2lvbixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbiB8fCAhdGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dDogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyID0ge1xuICAgICAgY29sdW1uOiB0aGlzLmZpbHRlckRyYWZ0LmNvbHVtbixcbiAgICAgIG9wZXJhdG9yOiB0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yLFxuICAgICAgY29ubmVjdG9yOiB0aGlzLmZpbHRlckRyYWZ0LmNvbm5lY3RvcixcbiAgICAgIG9wdGlvbmFsOiB0aGlzLmZpbHRlckRyYWZ0Lm9wdGlvbmFsLFxuICAgICAgdmFsdWVUeXBlOiB0aGlzLmZpbHRlck5lZWRzVmFsdWUgPyB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlVHlwZSA6IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEUsXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5maWx0ZXJOZWVkc1ZhbHVlKSB7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUudHJpbSgpO1xuXG4gICAgICBpZiAoIXBhcmFtZXRlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5leHQucGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlck5hbWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC5vcGVyYXRvciA9PT0gXCJJTlwiKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnBhcnNlTXVsdGlWYWx1ZVRleHQodGhpcy5maWx0ZXJEcmFmdC52YWx1ZXNUZXh0KTtcblxuICAgICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBuZXh0LnZhbHVlcyA9IHZhbHVlcztcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZpbHRlckRyYWZ0Lm9wZXJhdG9yID09PSBcIkJFVFdFRU5cIikge1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5TdGFydC50cmltKCk7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmQudHJpbSgpO1xuXG4gICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5leHQudmFsdWVzID0gW3N0YXJ0LCBlbmRdO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmZpbHRlckRyYWZ0LnZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIG5leHQudmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJEcmFmdFNxbFByZXZpZXcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5idWlsZEZpbHRlckZyb21EcmFmdCgpO1xuXG4gICAgaWYgKCFuZXh0KSB7XG4gICAgICByZXR1cm4gRU1QVFlfVkFMVUU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUZpbHRlclNxbChuZXh0KTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVGaWx0ZXJEcmFmdERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbHRlck1vZGFsTW9kZSA9PT0gRklMVEVSX01PREVfRE9NQUlOKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5maWx0ZXJEcmFmdC52YWx1ZVR5cGUgPT09IFwicGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWVcbiAgICAgICAgPyBgOiR7dGhpcy5maWx0ZXJEcmFmdC5wYXJhbWV0ZXJOYW1lfWBcbiAgICAgICAgOiBFTVBUWV9WQUxVRTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiSU5cIikge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyRHJhZnQudmFsdWVzVGV4dDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmlsdGVyRHJhZnQub3BlcmF0b3IgPT09IFwiQkVUV0VFTlwiKSB7XG4gICAgICByZXR1cm4gW3RoaXMuZmlsdGVyRHJhZnQuYmV0d2VlblN0YXJ0LCB0aGlzLmZpbHRlckRyYWZ0LmJldHdlZW5FbmRdXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmpvaW4oXCIgLSBcIik7XG4gICAgfVxuICAgIGlmICghdGhpcy5maWx0ZXJOZWVkc1ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW50V2l0aEZhbGxiYWNrKFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy50cmFuc2xhdGlvblByZWZpeH0uc3RhdGVzLm9wdGlvbmFsYCxcbiAgICAgICAgXCJTZW0gdmFsb3JcIlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRHJhZnQudmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZUZsb3dBcnJvd1JlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaEZsb3dBcnJvd3NGcmFtZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZWZyZXNoRmxvd0Fycm93c0ZyYW1lKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVmcmVzaEZsb3dBcnJvd3NUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoRmxvd0Fycm93c1RpbWVvdXQpO1xuICAgICAgdGhpcy5yZWZyZXNoRmxvd0Fycm93c1RpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hGbG93QXJyb3dzRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5yZWZyZXNoRmxvd0Fycm93c0ZyYW1lID0gbnVsbDtcbiAgICAgIHRoaXMucmVmcmVzaEZsb3dBcnJvd3MoKTtcbiAgICAgIHRoaXMucmVmcmVzaEZsb3dBcnJvd3NUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVmcmVzaEZsb3dBcnJvd3NUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZyZXNoRmxvd0Fycm93cygpO1xuICAgICAgfSwgRkxPV19BUlJPV1NfUkVGUkVTSF9ERUxBWV9NUyk7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByZWZyZXNoRmxvd0Fycm93cygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hNZWFzdXJlZFByZXZpZXdIZWlnaHQoKTtcbiAgICBjb25zdCBuZXh0QXJyb3dzID0gdGhpcy5idWlsZEZsb3dBcnJvd3MoKTtcbiAgICB0aGlzLmZsb3dBcnJvd3MgPSBuZXh0QXJyb3dzO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcHJpdmF0ZSByZWZyZXNoTWVhc3VyZWRQcmV2aWV3SGVpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNlY3Rpb25zSGVpZ2h0ID0gdGhpcy5zZWN0aW9uc0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPz8gMDtcbiAgICB0aGlzLm1lYXN1cmVkU3BsaXRQcmV2aWV3SGVpZ2h0ID1cbiAgICAgIHNlY3Rpb25zSGVpZ2h0ID4gMCA/IGAke3NlY3Rpb25zSGVpZ2h0fXB4YCA6IFwiMjRyZW1cIjtcbiAgfVxuICBwcml2YXRlIGJ1aWxkRmxvd0Fycm93cygpOiBCdWlsZGVyRmxvd0Fycm93W10ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2VjdGlvbnNDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmJ1aWxkZXJTZWN0aW9ucz8udG9BcnJheSgpID8/IFtdO1xuICAgIGlmICghY29udGFpbmVyIHx8IHNlY3Rpb25zLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgc2VjdGlvbk1hcCA9IG5ldyBNYXA8QnVpbGRlclNlY3Rpb25JZCwgSFRNTEVsZW1lbnQ+KCk7XG4gICAgc2VjdGlvbnMuZm9yRWFjaCgoc2VjdGlvblJlZikgPT4ge1xuICAgICAgY29uc3Qgc2VjdGlvbklkID0gc2VjdGlvblJlZi5uYXRpdmVFbGVtZW50LmRhdGFzZXRbXG4gICAgICAgIFwic2VjdGlvbklkXCJcbiAgICAgIF0gYXMgQnVpbGRlclNlY3Rpb25JZCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChzZWN0aW9uSWQpIHtcbiAgICAgICAgc2VjdGlvbk1hcC5zZXQoc2VjdGlvbklkLCBzZWN0aW9uUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHRoaXMuc2VjdGlvbk9yZGVyXG4gICAgICAuc2xpY2UoMCwgLTEpXG4gICAgICAubWFwKChzZWN0aW9uSWQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzZWN0aW9uTWFwLmdldChzZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBuZXh0ID0gc2VjdGlvbk1hcC5nZXQodGhpcy5zZWN0aW9uT3JkZXJbaW5kZXggKyAxXSk7XG4gICAgICAgIGlmICghY3VycmVudCB8fCAhbmV4dCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgbmV4dFJlY3QgPSBuZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBpc1NhbWVSb3cgPSBNYXRoLmFicyhjdXJyZW50UmVjdC50b3AgLSBuZXh0UmVjdC50b3ApIDwgMTY7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxHYXAgPSBNYXRoLm1heChGTE9XX0FSUk9XX01JTl9HQVAsIG5leHRSZWN0LmxlZnQgLSBjdXJyZW50UmVjdC5yaWdodCk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsR2FwID0gTWF0aC5tYXgoRkxPV19BUlJPV19NSU5fR0FQLCBuZXh0UmVjdC50b3AgLSBjdXJyZW50UmVjdC5ib3R0b20pO1xuICAgICAgICBjb25zdCBvdmVybGFwTGVmdCA9IE1hdGgubWF4KGN1cnJlbnRSZWN0LmxlZnQsIG5leHRSZWN0LmxlZnQpO1xuICAgICAgICBjb25zdCBvdmVybGFwUmlnaHQgPSBNYXRoLm1pbihjdXJyZW50UmVjdC5yaWdodCwgbmV4dFJlY3QucmlnaHQpO1xuICAgICAgICBjb25zdCBvdmVybGFwVG9wID0gTWF0aC5tYXgoY3VycmVudFJlY3QudG9wLCBuZXh0UmVjdC50b3ApO1xuICAgICAgICBjb25zdCBvdmVybGFwQm90dG9tID0gTWF0aC5taW4oY3VycmVudFJlY3QuYm90dG9tLCBuZXh0UmVjdC5ib3R0b20pO1xuICAgICAgICBjb25zdCBuZXh0Q2VudGVyWCA9IG5leHRSZWN0LmxlZnQgKyBuZXh0UmVjdC53aWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IHNhbWVSb3dUb3AgPVxuICAgICAgICAgIG92ZXJsYXBUb3AgPCBvdmVybGFwQm90dG9tXG4gICAgICAgICAgICA/IG92ZXJsYXBUb3AgKyAob3ZlcmxhcEJvdHRvbSAtIG92ZXJsYXBUb3ApIC8gMlxuICAgICAgICAgICAgOiAoY3VycmVudFJlY3QudG9wICtcbiAgICAgICAgICAgICAgY3VycmVudFJlY3QuaGVpZ2h0IC8gMiArXG4gICAgICAgICAgICAgIChuZXh0UmVjdC50b3AgKyBuZXh0UmVjdC5oZWlnaHQgLyAyKSkgL1xuICAgICAgICAgICAgMjtcbiAgICAgICAgY29uc3QgZG93bkxlZnQgPVxuICAgICAgICAgIG92ZXJsYXBMZWZ0IDwgb3ZlcmxhcFJpZ2h0XG4gICAgICAgICAgICA/IG92ZXJsYXBMZWZ0ICsgKG92ZXJsYXBSaWdodCAtIG92ZXJsYXBMZWZ0KSAvIDJcbiAgICAgICAgICAgIDogKGN1cnJlbnRSZWN0LmxlZnQgKyBjdXJyZW50UmVjdC53aWR0aCAvIDIgKyBuZXh0Q2VudGVyWCkgLyAyO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBgJHtzZWN0aW9uSWR9LSR7dGhpcy5zZWN0aW9uT3JkZXJbaW5kZXggKyAxXX1gLFxuICAgICAgICAgIGRpcmVjdGlvbjogaXNTYW1lUm93ID8gXCJyaWdodFwiIDogXCJkb3duXCIsXG4gICAgICAgICAgbGVmdDogaXNTYW1lUm93XG4gICAgICAgICAgICA/IGN1cnJlbnRSZWN0LnJpZ2h0IC0gY29udGFpbmVyUmVjdC5sZWZ0IC0gRkxPV19BUlJPV19JTlNFVCArIGhvcml6b250YWxHYXAgLyAyXG4gICAgICAgICAgICA6IGRvd25MZWZ0IC0gY29udGFpbmVyUmVjdC5sZWZ0LFxuICAgICAgICAgIHRvcDogaXNTYW1lUm93XG4gICAgICAgICAgICA/IHNhbWVSb3dUb3AgLSBjb250YWluZXJSZWN0LnRvcFxuICAgICAgICAgICAgOiBjdXJyZW50UmVjdC5ib3R0b20gLSBjb250YWluZXJSZWN0LnRvcCAtIEZMT1dfQVJST1dfSU5TRVQgKyB2ZXJ0aWNhbEdhcCAvIDIsXG4gICAgICAgIH0gc2F0aXNmaWVzIEJ1aWxkZXJGbG93QXJyb3c7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQnVpbGRlckZsb3dBcnJvdyA9PiAhIWl0ZW0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFZpc3VhbFNxbEVkaXRvckNvbXBvbmVudCBhcyBEeW5hbWljVmlld0J1aWxkZXJDb21wb25lbnQgfTtcbiIsIjxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlclwiIFthdHRyLmFyaWEtYnVzeV09XCJsb2FkaW5nXCI+XG4gIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fdG9vbGJhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fdG9vbGJhci1jb3B5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3RpdGxlXCI+XG4gICAgICAgIHt7IGNvbmZpZy5tZXRhZGF0YS50aXRsZSB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N1YnRpdGxlXCI+XG4gICAgICAgIHt7IGNvbmZpZy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX190b29sYmFyLWFjdGlvbnNcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Rvb2xiYXItbGFiZWxcIj5cbiAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmxheW91dE1vZGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNkYy1zZWxlY3QtYnV0dG9uXG4gICAgICAgIFtpdGVtc109XCJsYXlvdXRNb2RlSXRlbXNcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZExheW91dE1vZGVJdGVtc1wiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTGF5b3V0TW9kZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L3NkYy1zZWxlY3QtYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy10b2dnbGVcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlUHJldmlldygpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInByZXZpZXdWaXNpYmxlXCJcbiAgICAgICAgW3RpdGxlXT1cInByZXZpZXdUb2dnbGVMYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicHJldmlld1RvZ2dsZUxhYmVsXCJcbiAgICAgICAgPlxuICAgICAgICA8aVxuICAgICAgICAgIFtjbGFzc109XCJwcmV2aWV3VmlzaWJsZSA/ICdmYXMgZmEtZXllLXNsYXNoJyA6ICdmYXMgZmEtZXllJ1wiXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAge3sgcHJldmlld1RvZ2dsZUxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgQGlmIChzZWxlY3Rpb25Nb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJzZWxlY3Rpb25Nb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKHNlbGVjdGlvbk1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTZWxlY3Rpb25Nb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwic2VsZWN0aW9uTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLnNlbGVjdGlvbi53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zZWxlY3Rpb24uaGVpZ2h0XCJcbiAgICAgIFttYXhpbWl6YWJsZV09XCJmYWxzZVwiXG4gICAgICBbZm9vdGVyQnV0dG9uc109XCJbXVwiXG4gICAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbC0tZnVsbFxuICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZmxvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2VcIlxuICAgICAgICA+XG4gICAgICAgIEBpZiAoc2VsZWN0aW9uTW9kYWxNb2RlID09PSAndGFibGVzJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtaW5saW5lLXN1cmZhY2VcIj5cbiAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICBbbGFiZWxdPVwibW9kYWxTZWFyY2hMYWJlbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtb2RhbFNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0aW9uTW9kYWxTZWFyY2hcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3Rpb25Nb2RhbFNlYXJjaCA9ICRldmVudFwiXG4gICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkLS1zZWN0aW9uXG4gICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZS1ib2R5XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXRhYmxlXG4gICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS0tY2hvb3NlclxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tdGFibGUtLWZsdWlkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1oZWFkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tY29sXCI+XG4gICAgICAgICAgICAgICAgICB7eyBtb2RhbE5hbWVMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNvbFwiPlxuICAgICAgICAgICAgICAgICAge3sgbW9kYWxUeXBlTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jb2wgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jb2wtLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAge3sgbW9kYWxTZWxlY3RMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tYm9keVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBzZWxlY3Rpb25Nb2RhbFJvd3M7IHRyYWNrIHRyYWNrQnlJZCgkaW5kZXgsIHJvdykpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXJvd1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXJvdy0tc2VsZWN0ZWRdPVwicm93LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInJvdy5kaXNhYmxlZCA/IC0xIDogMFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJyb3cuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInJvdy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb25Nb2RhbFJvdyhyb3cuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25TZWxlY3RhYmxlUm93S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cudGFibGVMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXBhdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cucGF0aFR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5kYkxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZGJcIj57eyByb3cuZGJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cuZGJMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLXNlcGFyYXRvclwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IHJvdy50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tdGFibGUtbGFiZWxcIj57eyByb3cudGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tc2VwYXJhdG9yXCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tYWNjZW50XCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tY2VsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNlbGwtLW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyByb3cubWV0YSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5ub3RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tbm90ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cubm90ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWNlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1jZWxsLS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLW1hcmtlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1tYXJrZXItLXNlbGVjdGVkXT1cInJvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2tcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlLWJvZHlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgICBbaXRlbXNdPVwic2VsZWN0aW9uTW9kYWxQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cInNlbGVjdGlvbk1vZGFsU2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICAgIGlkS2V5PVwiaWRcIlxuICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4S2V5PVwidGl0bGVTdWZmaXhcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgICAgYmFkZ2VLZXk9XCJiYWRnZVwiXG4gICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuc2VhcmNoUGxhY2Vob2xkZXInXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uU2VsZWN0aW9uTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGZvb3RlciBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jYW5jZWwnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgcHJpb3JpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZVNlbGVjdGlvbk1vZGFsKClcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNsb3NlU2VsZWN0aW9uTW9kYWwoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY29uZmlybVNlbGVjdGlvbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlybVNlbGVjdGlvbk1vZGFsKClcIlxuICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNvbmZpcm1TZWxlY3Rpb25Nb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2RjLW1vZGFsPlxuICB9XG5cbiAgQGlmIChzb3VyY2VNb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJzb3VyY2VNb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKHNvdXJjZU1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTb3VyY2VNb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwic291cmNlTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLnNvdXJjZS53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zb3VyY2UuaGVpZ2h0XCJcbiAgICAgIFttYXhpbWl6YWJsZV09XCJmYWxzZVwiXG4gICAgICBbZm9vdGVyQnV0dG9uc109XCJbXVwiXG4gICAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1tb2RhbFwiPlxuICAgICAgICA8c2RjLXRpbWVsaW5lXG4gICAgICAgICAgW2l0ZW1zXT1cInNvdXJjZU1vZGFsVGltZWxpbmVJdGVtc1wiXG4gICAgICAgICAgW2FjdGl2ZUluZGV4XT1cInNvdXJjZU1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUgPyAxIDogMFwiXG4gICAgICAgICAgW2ludGVyYWN0aXZlXT1cInRydWVcIlxuICAgICAgICAgIFtzaG93RGVzY3JpcHRpb25zXT1cImZhbHNlXCJcbiAgICAgICAgICBbYXJpYUxhYmVsXT1cInNvdXJjZU1vZGFsVGltZWxpbmVBcmlhTGFiZWxcIlxuICAgICAgICAgIChzdGVwU2VsZWN0KT1cIm9uU291cmNlTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID48L3NkYy10aW1lbGluZT5cbiAgICAgICAgQGlmIChzb3VyY2VNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc2hlbGwtLWZ1bGxcbiAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1mbG93IGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlLWJvZHlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwic291cmNlTW9kYWxQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRJZHNdPVwic291cmNlTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgICBbc2hvd1BhZ2luYXRvcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dJdGVtSWNvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uU291cmNlTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvc2RjLXBpY2tsaXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtY29uZmlnLXNoZWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1saXN0LXNoZWxsXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvdXJjZS1jb25maWctbGlzdFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc291cmNlTW9kYWxDb25maWd1cmVkSXRlbXM7IHRyYWNrIHRyYWNrQnlJZCgkaW5kZXgsIGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvdXJjZS1jb25maWctcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc291cmNlLWNvbmZpZy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IGl0ZW0uZGJMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1zZXBhcmF0b3JcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWFjY2VudFwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc291cmNlLWNvbmZpZy1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmFsaWFzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpdGVtLmFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU291cmNlTW9kYWxBbGlhc0NoYW5nZShpdGVtLnRhYmxlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBmb290ZXIgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2FuY2VsJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VTb3VyY2VNb2RhbCgpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZVNvdXJjZU1vZGFsKClcIlxuICAgICAgICA+PC9zZGMtYnV0dG9uPlxuICAgICAgICBAaWYgKHNvdXJjZU1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSAmJiBzb3VyY2VNb2RhbENhblByb2NlZWQpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMubmV4dFN0ZXAnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZVNvdXJjZU1vZGFsU3RlcCgpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImFkdmFuY2VTb3VyY2VNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKHNvdXJjZU1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc291cmNlTW9kYWxDYW5Qcm9jZWVkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzYXZlU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9zZGMtbW9kYWw+XG4gIH1cblxuICBAaWYgKGpvaW5Nb2RhbFZpc2libGUpIHtcbiAgICA8c2RjLW1vZGFsXG4gICAgICBbdmlzaWJsZV09XCJqb2luTW9kYWxWaXNpYmxlXCJcbiAgICAgICh2aXNpYmxlQ2hhbmdlKT1cIiRldmVudCA/IChqb2luTW9kYWxWaXNpYmxlID0gdHJ1ZSkgOiBjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgIFtoZWFkZXJdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuY2FyZHMuam9pbnMudGl0bGUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLmpvaW4ud2lkdGhcIlxuICAgICAgW2hlaWdodF09XCJtb2RhbERpbWVuc2lvbnMuam9pbi5oZWlnaHRcIlxuICAgICAgW21heGltaXphYmxlXT1cImZhbHNlXCJcbiAgICAgIFtmb290ZXJCdXR0b25zXT1cIltdXCJcbiAgICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc2hlbGwgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2pvaW4tbW9kYWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19qb2luLW1vZGFsLXRvcFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeSBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LWxhYmVsXCI+XG4gICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5sZWZ0JykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlXG4gICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWUtLXBhdGhcIlxuICAgICAgICAgICAgICA+e3sgam9pblNvdXJjZVN1bW1hcnkgfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQtLWNvbXBhY3RcbiAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMub3BlcmF0b3InXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiam9pbkRyYWZ0Lm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiam9pbkRyYWZ0Lm9wZXJhdG9yID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiam9pbk9wZXJhdG9yT3B0aW9uc1wiXG4gICAgICAgICAgICAgIFthcHBlbmRUb109XCJvdmVybGF5QXBwZW5kVGFyZ2V0XCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCJvdmVybGF5WkluZGV4XCJcbiAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgID48L3NkYy1jb21ib2JveD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnkgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMucmlnaHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZS0tcGF0aFwiXG4gICAgICAgICAgICAgID57eyBqb2luVGFyZ2V0U3VtbWFyeSB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLS1maXRcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXIgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMubGVmdCcpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgW2l0ZW1zXT1cImpvaW5Tb3VyY2VQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImpvaW5Tb3VyY2VTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgaWRLZXk9XCJpZFwiXG4gICAgICAgICAgICAgIHRpdGxlS2V5PVwidGl0bGVcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgdGl0bGVTdWZmaXhLZXk9XCJ0aXRsZVN1ZmZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlUHJlZml4Q29sb3JLZXk9XCJ0aXRsZVByZWZpeENvbG9yXCJcbiAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICBiYWRnZUtleT1cImJhZGdlXCJcbiAgICAgICAgICAgICAgYmFkZ2VDb2xvcktleT1cImJhZGdlQ29sb3JcIlxuICAgICAgICAgICAgICBbc2hvd1BhZ2luYXRvcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtzaG93SXRlbUljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvdW50ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFttYXhWaXNpYmxlU2VsZWN0ZWRJdGVtc109XCIxXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgIChzZWxlY3RlZElkc0NoYW5nZSk9XCJvbkpvaW5Tb3VyY2VTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXIgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMucmlnaHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2RjLXBpY2tsaXN0XG4gICAgICAgICAgICAgIFtpdGVtc109XCJqb2luVGFyZ2V0UGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJqb2luVGFyZ2V0U2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICAgIGlkS2V5PVwiaWRcIlxuICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4S2V5PVwidGl0bGVTdWZmaXhcIlxuICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgICAgYmFkZ2VLZXk9XCJiYWRnZVwiXG4gICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbbWF4VmlzaWJsZVNlbGVjdGVkSXRlbXNdPVwiMVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5zZWFyY2hQbGFjZWhvbGRlcidcIlxuICAgICAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25Kb2luVGFyZ2V0U2VsZWN0ZWRJZHNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9zZGMtcGlja2xpc3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGZvb3RlciBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXJcIj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jYW5jZWwnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgcHJpb3JpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZUpvaW5Nb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zYXZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUpvaW5cIlxuICAgICAgICAgIChjbGljayk9XCJzYXZlSm9pbigpXCJcbiAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlSm9pbigpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvc2RjLW1vZGFsPlxuICB9XG5cbiAgQGlmIChzb3J0TW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwic29ydE1vZGFsVmlzaWJsZVwiXG4gICAgICAodmlzaWJsZUNoYW5nZSk9XCIkZXZlbnQgPyAoc29ydE1vZGFsVmlzaWJsZSA9IHRydWUpIDogY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cInNvcnRNb2RhbFRpdGxlXCJcbiAgICAgIFt3aWR0aF09XCJtb2RhbERpbWVuc2lvbnMuc29ydC53aWR0aFwiXG4gICAgICBbaGVpZ2h0XT1cIm1vZGFsRGltZW5zaW9ucy5zb3J0LmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fc29ydC1tb2RhbFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGRcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tZnVsbFxuICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NvcnQtZGlyZWN0aW9uLWZpZWxkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1sYWJlbFwiPlxuICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmRpcmVjdGlvbicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNkYy1zZWxlY3QtYnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zb3J0LWRpcmVjdGlvblwiXG4gICAgICAgICAgICBbaXRlbXNdPVwic29ydERpcmVjdGlvbkl0ZW1zXCJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzb2Z0XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkU29ydERpcmVjdGlvbkl0ZW1zXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU29ydERpcmVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9zZGMtc2VsZWN0LWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1jYXJkLS1zZWN0aW9uXG4gICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGlja2VyIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXItLXN0cmV0Y2hcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWxlY3Rpb24tZmxvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fcGlja2xpc3Qtc2hlbGxcbiAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdGFnZS1ib2R5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgW2l0ZW1zXT1cInNvcnRQaWNrbGlzdEl0ZW1zXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJzb3J0U2VsZWN0ZWRQaWNrbGlzdElkc1wiXG4gICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgIHRpdGxlS2V5PVwidGl0bGVcIlxuICAgICAgICAgICAgdGl0bGVQcmVmaXhLZXk9XCJ0aXRsZVByZWZpeFwiXG4gICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgIHRpdGxlUHJlZml4Q29sb3JLZXk9XCJ0aXRsZVByZWZpeENvbG9yXCJcbiAgICAgICAgICAgIHRpdGxlU3VmZml4Q29sb3JLZXk9XCJ0aXRsZVN1ZmZpeENvbG9yXCJcbiAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgYmFkZ2VDb2xvcktleT1cImJhZGdlQ29sb3JcIlxuICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3Nob3dJdGVtSWNvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbc2hvd1NlbGVjdGlvbkNvdW50ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW21heFZpc2libGVTZWxlY3RlZEl0ZW1zXT1cIjFcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAoc2VsZWN0ZWRJZHNDaGFuZ2UpPVwib25Tb3J0U2VsZWN0ZWRJZHNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvc2RjLXBpY2tsaXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBmb290ZXIgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyXCI+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2FuY2VsJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xvc2VTb3J0TW9kYWwoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblNhdmVTb3J0XCJcbiAgICAgICAgICAoY2xpY2spPVwic2F2ZVNvcnQoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2F2ZVNvcnQoKVwiXG4gICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NkYy1tb2RhbD5cbiAgfVxuXG4gIEBpZiAoZmlsdGVyTW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwiZmlsdGVyTW9kYWxWaXNpYmxlXCJcbiAgICAgICh2aXNpYmxlQ2hhbmdlKT1cIiRldmVudCA/IChmaWx0ZXJNb2RhbFZpc2libGUgPSB0cnVlKSA6IGNsb3NlRmlsdGVyTW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cImZpbHRlck1vZGFsVGl0bGVcIlxuICAgICAgW3dpZHRoXT1cIm1vZGFsRGltZW5zaW9ucy5maWx0ZXIud2lkdGhcIlxuICAgICAgW2hlaWdodF09XCJtb2RhbERpbWVuc2lvbnMuZmlsdGVyLmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW1vZGFsXCI+XG4gICAgICAgIDxzZGMtdGltZWxpbmVcbiAgICAgICAgICBbaXRlbXNdPVwiZmlsdGVyTW9kYWxUaW1lbGluZUl0ZW1zXCJcbiAgICAgICAgICBbYWN0aXZlSW5kZXhdPVwiZmlsdGVyTW9kYWxSZXZpZXdTdGVwQWN0aXZlID8gMiA6IChmaWx0ZXJNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlID8gMSA6IDApXCJcbiAgICAgICAgICBbaW50ZXJhY3RpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dEZXNjcmlwdGlvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIFthcmlhTGFiZWxdPVwiZmlsdGVyTW9kYWxUaW1lbGluZUFyaWFMYWJlbFwiXG4gICAgICAgICAgKHN0ZXBTZWxlY3QpPVwib25GaWx0ZXJNb2RhbFRpbWVsaW5lU3RlcFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgPjwvc2RjLXRpbWVsaW5lPlxuICAgICAgICBAaWYgKGZpbHRlck1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXN0ZXBcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItYmFzZS1zZWxlY3RvclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGFuZWwtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5maWx0ZXIuc3RlcHMuc2VsZWN0LnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWx0ZXJzLnRvb2x0aXBzLm1vZGUnXCJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItbW9kZS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1tb2RlLWNvcHlcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1vZGFscy5maWx0ZXIudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItbW9kZS1zZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgIDxzZGMtc2VsZWN0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpbHRlck1vZGVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwic29mdFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEZpbHRlck1vZGVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpbHRlck1vZGVDaGFuZ2UoJGV2ZW50WzBdPy52YWx1ZSB8fCAnY29uZGl0aW9uJylcIlxuICAgICAgICAgICAgICAgID48L3NkYy1zZWxlY3QtYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChmaWx0ZXJNb2RhbE1vZGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXJcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1waWNrZXItLWZpbHRlclxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBpY2tlci0tc3RyZXRjaFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1mbG93XG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2UtYm9keVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3BpY2tsaXN0LXNoZWxsXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzZGMtcGlja2xpc3RcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImZpbHRlck1vZGFsUGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZElkc109XCJmaWx0ZXJNb2RhbFNlbGVjdGVkUGlja2xpc3RJZHNcIlxuICAgICAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVLZXk9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlUHJlZml4S2V5PVwidGl0bGVQcmVmaXhcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQcmVmaXhDb2xvcktleT1cInRpdGxlUHJlZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeENvbG9yS2V5PVwidGl0bGVTdWZmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgICAgICBiYWRnZUNvbG9yS2V5PVwiYmFkZ2VDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIFthdXRvUmVzaXplXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0l0ZW1JY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db3VudGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW21heFZpc2libGVTZWxlY3RlZEl0ZW1zXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuc2VhcmNoUGxhY2Vob2xkZXInXCJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uRmlsdGVyTW9kYWxTZWxlY3RlZElkc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgID48L3NkYy1waWNrbGlzdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItZG9tYWluLWludHJvXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1wYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWx0ZXJzLmRvbWFpbkxhYmVsJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNkYy1pbmZvLXNpZ25cbiAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiZmlsdGVyRG9tYWluRXhwcmVzc2lvblRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWRvbWFpbi1ncmlkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1kb21haW4taXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZG9tYWluRXhwcmVzc2lvbicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJEb21haW5FeHByZXNzaW9uVG9vbHRpcCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItZG9tYWluLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmNvbm5lY3RvcicpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJDb25uZWN0b3JUb29sdGlwIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBAaWYgKGZpbHRlck1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXN0ZXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItdG9vbGJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeSBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS0tZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLmZpbHRlci5zdGVwcy5jb25maWd1cmUudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZS0tcGF0aFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyQ29uZmlndXJhdGlvblN1bW1hcnlMYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0ZpbHRlck1vZGFsU3RlcCgnc2VsZWN0JylcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZmlsdGVyQmFja1RvU2VsZWN0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEBpZiAoZmlsdGVyTW9kYWxNb2RlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZC0tc3RyZXRjaFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWNvbmZpZy1jYXJkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWNvbmZpZy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXBhbmVsLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuZmlsdGVyLnN0ZXBzLmNvbmZpZ3VyZS50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPHNkYy1pbmZvLXNpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmlsdGVycy50b29sdGlwcy5jb25maWd1cmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLS1maWx0ZXItY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNvbWJvYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuY29ubmVjdG9yJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5jb25uZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyRHJhZnQuY29ubmVjdG9yID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpbHRlckNvbm5lY3Rvck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm92ZXJsYXlBcHBlbmRUYXJnZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJvdmVybGF5WkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJDb25uZWN0b3JEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5mb1Rvb2x0aXBdPVwiZmlsdGVyQ29ubmVjdG9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jb21ib2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNvbWJvYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMub3BlcmF0b3InXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0Lm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wZXJhdG9yID0gJGV2ZW50OyBvbkZpbHRlck9wZXJhdG9yQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyT3BlcmF0b3JPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJvdmVybGF5QXBwZW5kVGFyZ2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWx0ZXJEcmFmdC5jb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZm9Ub29sdGlwXT1cImZpbHRlck9wZXJhdG9yVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZVR5cGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0LnZhbHVlVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC52YWx1ZVR5cGUgPSAkZXZlbnQ7IG9uRmlsdGVyVmFsdWVUeXBlQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwidmFsdWVUeXBlT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cIm92ZXJsYXlaSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlclZhbHVlVHlwZURpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmZvVG9vbHRpcF09XCJmaWx0ZXJWYWx1ZVR5cGVUb29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW9wdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLnN0YXRlcy5vcHRpb25hbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5vcHRpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wdGlvbmFsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaW5mby1zaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImZpbHRlck9wdGlvbmFsVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLXNlY3Rpb24tLXZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQtLXNpbmdsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ZpbHRlckJvb2xlYW5Db21ib2JveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMudmFsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC52YWx1ZSA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImJvb2xlYW5WYWx1ZU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY29tYm9ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ZpbHRlclZhbHVlVGV4dGJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10ZXh0Ym94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0LnZhbHVlID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dGaWx0ZXJWYWx1ZXNUZXh0Ym94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnZhbHVlcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC52YWx1ZXNUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyRHJhZnQudmFsdWVzVGV4dCA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93RmlsdGVyQmV0d2VlbklucHV0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19iZXR3ZWVuIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1ncmlkLWNvbHVtbi1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGV4dGJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy52YWx1ZVN0YXJ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQuYmV0d2VlblN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuU3RhcnQgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMudmFsdWVFbmQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuRW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5iZXR3ZWVuRW5kID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dGaWx0ZXJQYXJhbWV0ZXJUZXh0Ym94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnBhcmFtZXRlck5hbWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyRHJhZnQucGFyYW1ldGVyTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0LnBhcmFtZXRlck5hbWUgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRib3g+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQtLXN0cmV0Y2hcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmRcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctY2FyZFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWdyaWQtLWZpbHRlci1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5jb25uZWN0b3InXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckRyYWZ0LmNvbm5lY3RvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5jb25uZWN0b3IgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZmlsdGVyQ29ubmVjdG9yT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cIm92ZXJsYXlaSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlckNvbm5lY3RvckRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmZvVG9vbHRpcF09XCJmaWx0ZXJDb25uZWN0b3JUb29sdGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNvbWJvYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLW9wdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLnN0YXRlcy5vcHRpb25hbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5vcHRpb25hbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckRyYWZ0Lm9wdGlvbmFsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaW5mby1zaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cImZpbHRlck9wdGlvbmFsVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1jb25maWctc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLXNlY3Rpb24tLWRvbWFpblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtcGFuZWwtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5kb21haW5FeHByZXNzaW9uJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiZmlsdGVyRG9tYWluRXhwcmVzc2lvblRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCInbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1kb21haW4taGludFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbHRlckRvbWFpbkV4cHJlc3Npb25Ub29sdGlwIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIicnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEcmFmdC5kb21haW5FeHByZXNzaW9uID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItc3RlcFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci10b29sYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5IGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LS1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tb2RhbHMuZmlsdGVyLnN0ZXBzLnJldmlldy50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS12YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlLS1wYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJDb25maWd1cmF0aW9uU3VtbWFyeUxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvRmlsdGVyTW9kYWxTdGVwKCdjb25maWd1cmUnKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJCYWNrVG9Db25maWd1cmF0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1maWVsZFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkLS1zdHJldGNoXG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZFxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItY29uZmlnLWNhcmRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1yZXZpZXctZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBmaWx0ZXJSZXZpZXdJdGVtczsgdHJhY2sgdHJhY2tCeUlkKCRpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpbHRlci1yZXZpZXctaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3VtbWFyeS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zdW1tYXJ5LXZhbHVlLS1wYXRoXT1cIml0ZW0uZW1waGFzaXplID09PSAncGF0aCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19maWx0ZXItcmV2aWV3LWNvZGVdPVwiaXRlbS5lbXBoYXNpemUgPT09ICdjb2RlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmlsdGVyLXJldmlldy1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN1bW1hcnktbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLnNxbFByZXZpZXcnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c2RjLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlclJldmlld1ByZXZpZXdMYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjZcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgZm9vdGVyIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZvb3RlclwiPlxuICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBwcmlvcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsb3NlRmlsdGVyTW9kYWwoKVwiXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xvc2VGaWx0ZXJNb2RhbCgpXCJcbiAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbFNlbGVjdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cImZpbHRlck1vZGFsQ29uZmlndXJlQWN0aW9uTGFiZWxcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWx0ZXJNb2RhbENhblByb2NlZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWx0ZXJNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhZHZhbmNlRmlsdGVyTW9kYWxTdGVwKClcIlxuICAgICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbENvbmZpZ3VyYXRpb25TdGVwQWN0aXZlKSB7XG4gICAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICAgIFtsYWJlbF09XCJmaWx0ZXJNb2RhbFJldmlld0FjdGlvbkxhYmVsXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZmlsdGVyTW9kYWxDYW5SZXZpZXdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWx0ZXJNb2RhbFN0ZXAoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJhZHZhbmNlRmlsdGVyTW9kYWxTdGVwKClcIlxuICAgICAgICAgID48L3NkYy1idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChmaWx0ZXJNb2RhbFJldmlld1N0ZXBBY3RpdmUpIHtcbiAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUZpbHRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZUZpbHRlcigpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNhdmVGaWx0ZXIoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9zZGMtbW9kYWw+XG4gIH1cblxuICBAaWYgKGZpZWxkTW9kYWxWaXNpYmxlKSB7XG4gICAgPHNkYy1tb2RhbFxuICAgICAgW3Zpc2libGVdPVwiZmllbGRNb2RhbFZpc2libGVcIlxuICAgICAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gKGZpZWxkTW9kYWxWaXNpYmxlID0gdHJ1ZSkgOiBjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICBbaGVhZGVyXT1cImZpZWxkTW9kYWxUaXRsZVwiXG4gICAgICBbd2lkdGhdPVwibW9kYWxEaW1lbnNpb25zLmZpZWxkLndpZHRoXCJcbiAgICAgIFtoZWlnaHRdPVwibW9kYWxEaW1lbnNpb25zLmZpZWxkLmhlaWdodFwiXG4gICAgICBbbWF4aW1pemFibGVdPVwiZmFsc2VcIlxuICAgICAgW2Zvb3RlckJ1dHRvbnNdPVwiW11cIlxuICAgICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtbW9kYWxcIj5cbiAgICAgICAgPHNkYy10aW1lbGluZVxuICAgICAgICAgIFtpdGVtc109XCJmaWVsZE1vZGFsVGltZWxpbmVJdGVtc1wiXG4gICAgICAgICAgW2FjdGl2ZUluZGV4XT1cImZpZWxkTW9kYWxDb25maWd1cmF0aW9uU3RlcEFjdGl2ZSA/IDEgOiAwXCJcbiAgICAgICAgICBbaW50ZXJhY3RpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dEZXNjcmlwdGlvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIFthcmlhTGFiZWxdPVwiZmllbGRNb2RhbFRpbWVsaW5lQXJpYUxhYmVsXCJcbiAgICAgICAgICAoc3RlcFNlbGVjdCk9XCJvbkZpZWxkTW9kYWxUaW1lbGluZVN0ZXBTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgID48L3NkYy10aW1lbGluZT5cbiAgICAgICAgQGlmIChmaWVsZE1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXNoZWxsIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1zaGVsbC0tZnVsbFxuICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWZsb3cgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLXN0YWdlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtY2FyZC0tc2VjdGlvblxuICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19waWNrbGlzdC1zaGVsbCBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtc3RhZ2UtYm9keVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNkYy1waWNrbGlzdFxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJmaWVsZE1vZGFsUGlja2xpc3RJdGVtc1wiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkSWRzXT1cImZpZWxkTW9kYWxTZWxlY3RlZFBpY2tsaXN0SWRzXCJcbiAgICAgICAgICAgICAgICBpZEtleT1cImlkXCJcbiAgICAgICAgICAgICAgICB0aXRsZUtleT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeEtleT1cInRpdGxlUHJlZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVN1ZmZpeEtleT1cInRpdGxlU3VmZml4XCJcbiAgICAgICAgICAgICAgICB0aXRsZVByZWZpeENvbG9yS2V5PVwidGl0bGVQcmVmaXhDb2xvclwiXG4gICAgICAgICAgICAgICAgdGl0bGVTdWZmaXhDb2xvcktleT1cInRpdGxlU3VmZml4Q29sb3JcIlxuICAgICAgICAgICAgICAgIGJhZGdlS2V5PVwiYmFkZ2VcIlxuICAgICAgICAgICAgICAgIGJhZGdlQ29sb3JLZXk9XCJiYWRnZUNvbG9yXCJcbiAgICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dQYWdpbmF0b3JdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtzaG93SXRlbUljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0aW9uQ291bnRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcubW9kYWxzLnNlYXJjaFBsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSWRzQ2hhbmdlKT1cIm9uRmllbGRNb2RhbFNlbGVjdGVkSWRzQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9zZGMtcGlja2xpc3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZmllbGQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZpZWxkLS1zdHJldGNoXG4gICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctc2hlbGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdG9vbGJhclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1zdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAge3sgZmllbGRNb2RhbENvbmZpZ3VyZWRJdGVtcy5sZW5ndGggfX1cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5maWVsZHMudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChmaWVsZE1vZGFsSGFzU2VsZWN0YWJsZUNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQW5vdGhlckZpZWxkRnJvbU1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQgZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWNhcmQtLXNlY3Rpb25cbiAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtbGlzdC1zaGVsbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctbGlzdFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZmllbGRNb2RhbENvbmZpZ3VyZWRJdGVtczsgdHJhY2sgdHJhY2tCeUlkKCRpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZmllbGQtY29uZmlnLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi10YWJsZS1sYWJlbFwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlbGVjdGlvbi1zZXBhcmF0b3JcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VsZWN0aW9uLWFjY2VudFwiPnt7IGl0ZW0uZmllbGRMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25OYW1lICYmICFpc0ZpZWxkRnVuY3Rpb25FZGl0aW5nKGl0ZW0uY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctZnVuY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1vcGVyYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5mdW5jdGlvbkFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25BbGlhcyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICghaXNGaWVsZEZ1bmN0aW9uRWRpdGluZyhpdGVtLmNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10ZXh0Ym94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmZpZWxkcy5hbGlhcydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpdGVtLmFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25GaWVsZE1vZGFsQWxpYXNDaGFuZ2UoaXRlbS5jb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWxhYmVsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMud2lkdGgnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5tZXNzYWdlcy5maWVsZFdpZHRoSW5mbydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pbmZvLXNpZ24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIml0ZW0ud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmllbGRNb2RhbFdpZHRoQ2hhbmdlKGl0ZW0uY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhsZW5ndGhdPVwiMTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRleHRib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN0YXJ0RmllbGRGdW5jdGlvbkVkaXQoaXRlbS5jb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmZ1bmN0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY29uZmlndXJlRmllbGQnKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZnVuY3Rpb25OYW1lJykgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWVsZE1vZGFsRHJhZnQoaXRlbS5jb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1jb25maWctY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ZpZWxkLWNvbmZpZy1jb250cm9scy0tZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jb21ib2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5maWVsZHMuZnVuY3Rpb25OYW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbk5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpZWxkRnVuY3Rpb25EcmFmdE5hbWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkTW9kYWxGdW5jdGlvbk9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwib3ZlcmxheUFwcGVuZFRhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwib3ZlcmxheVpJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY29tYm9ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRleHRib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuZmllbGRzLmFsaWFzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpZWxkRnVuY3Rpb25EcmFmdC5mdW5jdGlvbkFsaWFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmllbGRGdW5jdGlvbkRyYWZ0LmZ1bmN0aW9uQWxpYXMgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmaWVsZEZ1bmN0aW9uRHJhZnQuZnVuY3Rpb25OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10ZXh0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24tLWRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbEZpZWxkRnVuY3Rpb25FZGl0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2F2ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNhdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlRmllbGRGdW5jdGlvbkVkaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hlY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgZm9vdGVyIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX21vZGFsLWZvb3RlciBkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLWdyb3VwIGR5bmFtaWMtdmlldy1idWlsZGVyX19tb2RhbC1mb290ZXItZ3JvdXAtLXN0YXJ0XCI+XG4gICAgICAgICAgQGlmIChmaWVsZE1vZGFsU2VsZWN0aW9uU3RlcEFjdGl2ZSAmJiBmaWVsZE1vZGFsQ2FuU2VsZWN0QWxsKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QWxsRmllbGRNb2RhbENvbHVtbnMoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RBbGxDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fbW9kYWwtZm9vdGVyLWdyb3VwXCI+XG4gICAgICAgICAgPHNkYy1idXR0b25cbiAgICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNhbmNlbCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjbG9zZUZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgICBAaWYgKGZpZWxkTW9kYWxTZWxlY3Rpb25TdGVwQWN0aXZlICYmIGZpZWxkTW9kYWxDYW5Qcm9jZWVkKSB7XG4gICAgICAgICAgICA8c2RjLWJ1dHRvblxuICAgICAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5uZXh0U3RlcCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFkdmFuY2VGaWVsZE1vZGFsU3RlcCgpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiYWR2YW5jZUZpZWxkTW9kYWxTdGVwKClcIlxuICAgICAgICAgICAgPjwvc2RjLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChmaWVsZE1vZGFsQ29uZmlndXJhdGlvblN0ZXBBY3RpdmUpIHtcbiAgICAgICAgICAgIDxzZGMtYnV0dG9uXG4gICAgICAgICAgICAgIFtsYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNhdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZUZpZWxkTW9kYWxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZUZpZWxkKClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlRmllbGQoKVwiXG4gICAgICAgICAgICA+PC9zZGMtYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NkYy1tb2RhbD5cbiAgfVxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX193b3Jrc3BhY2VcIlxuICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fd29ya3NwYWNlLS1zdGFja2VkXT1cImxheW91dE1vZGUgPT09ICdzdGFja2VkJ1wiXG4gICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX193b3Jrc3BhY2UtLXNwbGl0XT1cImxheW91dE1vZGUgPT09ICdzcGxpdCdcIlxuICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fd29ya3NwYWNlLS1wcmV2aWV3LWhpZGRlbl09XCIhcHJldmlld1Zpc2libGVcIlxuICAgID5cbiAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2J1aWxkZXItYXJlYVwiPlxuICAgICAgPGRpdlxuICAgICAgICAjc2VjdGlvbnNDb250YWluZXJcbiAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbnNcIlxuICAgICAgICBbY2xhc3MuZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb25zLS1zdGFja2VkXT1cImxheW91dE1vZGUgPT09ICdzdGFja2VkJ1wiXG4gICAgICAgIFtjbGFzcy5keW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbnMtLXNwbGl0XT1cImxheW91dE1vZGUgPT09ICdzcGxpdCdcIlxuICAgICAgICA+XG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwidGFibGVzXCJcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5zb3VyY2VzLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2VsZWN0VGFibGVzJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuU291cmNlTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmsgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhY2FuT3BlblNvdXJjZUNvbmZpZ3VyYXRpb25cIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUFsaWFzZXMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUFsaWFzZXMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3VyY2VDb25maWd1cmF0aW9uTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFzb3VyY2VJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNsZWFyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTb3VyY2VzKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaC1hbHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICghc291cmNlSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19lbXB0eS1yb3dcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3VyY2VNb2RhbCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdFRhYmxlcycpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChzb3VyY2VJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2sgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrLS13cmFwXCI+XG4gICAgICAgICAgICAgIEBmb3IgKHNvdXJjZSBvZiBzb3VyY2VJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIHNvdXJjZSk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93IGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctLXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kYlwiPnt7IHNvdXJjZS5kYkxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kb3RcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc291cmNlLnRhYmxlTGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzb3VyY2UuYWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctbWV0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXMge3sgc291cmNlLmFsaWFzIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNvdXJjZShpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tcm93XCI+XG4gICAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAgICNidWlsZGVyU2VjdGlvblxuICAgICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiam9pbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbiBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi0tZmx1aWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuY2FyZHMuam9pbnMudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWNhbkNvbmZpZ3VyZUpvaW5zXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZEpvaW4nKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSm9pbk1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAham9pbkl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckpvaW5zKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghY2FuQ29uZmlndXJlSm9pbnMpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19pbmZvLXJvd1wiPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLm1lc3NhZ2VzLmpvaW5SZXF1aXJlc1R3b1RhYmxlcycpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChjYW5Db25maWd1cmVKb2lucyAmJiAham9pbkl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkSm9pbicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkpvaW5Nb2RhbCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRKb2luJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGpvaW5JdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGpvaW5JdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS5zb3VyY2VUYWJsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1kb3RcIj4uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWZpZWxkXCI+e3sgaXRlbS5zb3VyY2VGaWVsZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fam9pbi1vcGVyYXRvclwiPnt7IGl0ZW0ub3BlcmF0b3IgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fam9pbi1hcnJvd1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbG9uZy1hcnJvdy1hbHQtcmlnaHRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1wYXRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctdGFibGVcIj57eyBpdGVtLnRhcmdldFRhYmxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLnRhcmdldEZpZWxkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmVkaXQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSm9pbk1vZGFsKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBlblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19pY29uLWFjdGlvbi0tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlSm9pbihpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgICBkYXRhLXNlY3Rpb24taWQ9XCJncm91cEJ5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tLWNvbXBhY3RcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmNhcmRzLmdyb3VwQnkudGl0bGUnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rXG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWdyb3VwQnlTZWxlY3RhYmxlQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuc2VsZWN0Q29sdW1ucycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TZWxlY3Rpb25Nb2RhbCgnZ3JvdXBCeScpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWdyb3VwQnlJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJHcm91cEJ5KClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghZ3JvdXBCeUl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TZWxlY3Rpb25Nb2RhbCgnZ3JvdXBCeScpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGdyb3VwQnlJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGdyb3VwQnlJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVHcm91cEJ5KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgI2J1aWxkZXJTZWN0aW9uXG4gICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiZmllbGRzXCJcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLWhlYWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmNhcmRzLmZpZWxkcy50aXRsZScpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c2RjLWluZm8tc2lnblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2hpbnRcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidWb2PDqiBwb2RlIG9yZGVuYXIgYSBzZXF1w6puY2lhIGRvcyBjYW1wb3MgYXJyYXN0YW5kbyBlIHNvbHRhbmRvLidcIlxuICAgICAgICAgICAgICA+PC9zZGMtaW5mby1zaWduPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmtcbiAgICAgICAgICAgICAgICAgIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0tcHJpbWFyeVxuICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhZmllbGRTZWxlY3RhYmxlQ29sdW1ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdENvbHVtbnMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnNlbGVjdENvbHVtbnMnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWVsZE1vZGFsKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rIGR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluay0taWNvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWNhbk9wZW5GaWVsZENvbmZpZ3VyYXRpb25cIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNvbmZpZ3VyZUZpZWxkJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jb25maWd1cmVGaWVsZCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZpZWxkQ29uZmlndXJhdGlvbk1vZGFsKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmsgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSB8fCAhZmllbGRJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmNsZWFyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZHMoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRyYXNoLWFsdFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKCFmaWVsZEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZpZWxkTW9kYWwoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5zZWxlY3RDb2x1bW5zJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGZpZWxkSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrIGR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjay0td3JhcFwiPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGZpZWxkSXRlbXM7IHRyYWNrIHRyYWNrQnlJZChpLCBpdGVtKTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBAaWYgKGlzRmllbGREcm9wSW5kaWNhdG9yVmlzaWJsZShpKSkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1kcm9wLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3JvdyBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LS1kcmFnZ2FibGVcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctLWRyYWctb3JpZ2luXT1cImRyYWdnaW5nRmllbGRJbmRleCA9PT0gaXRlbS5zb3VyY2VJbmRleFwiXG4gICAgICAgICAgICAgICAgICBbZHJhZ2dhYmxlXT1cIiFpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgIChkcmFnc3RhcnQpPVwib25GaWVsZERyYWdTdGFydChpdGVtLnNvdXJjZUluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAoZHJhZ292ZXIpPVwib25GaWVsZERyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgICAgICAgICAgICAgKGRyb3ApPVwib25GaWVsZERyb3AoKVwiXG4gICAgICAgICAgICAgICAgICAoZHJhZ2VuZCk9XCJvbkZpZWxkRHJhZ0VuZCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW9yZGVyXCI+e3sgaXRlbS5vcmRlckxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy10YWJsZVwiPnt7IGl0ZW0udGFibGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZG90XCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzIHt7IGl0ZW0uYWxpYXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1ldGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ud2lkdGggfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmZ1bmN0aW9uTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwIGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcC0tb3BlcmF0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25BbGlhcykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tZXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmZ1bmN0aW9uQWxpYXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5yZW1vdmUnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmllbGQoaXRlbS5zb3VyY2VJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKGlzRmllbGREcm9wSW5kaWNhdG9yQXRFbmRWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19maWVsZC1kcm9wLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLXJvd1wiPlxuICAgICAgICAgIDxzZWN0aW9uXG4gICAgICAgICAgICAjYnVpbGRlclNlY3Rpb25cbiAgICAgICAgICAgIGRhdGEtc2VjdGlvbi1pZD1cInNvcnRpbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbiBkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi0tY29tcGFjdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5zb3J0aW5nLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFzb3J0U2VsZWN0YWJsZUl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRTb3J0JykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZFNvcnQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblNvcnRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIXNvcnRJdGVtcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuY2xlYXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTb3J0aW5nKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2gtYWx0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghc29ydEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fZW1wdHktcm93XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkU29ydCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkU29ydCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblNvcnRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRTb3J0JykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHNvcnRJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjayBkeW5hbWljLXZpZXctYnVpbGRlcl9fc3RhY2stLXdyYXBcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHNvcnRJdGVtczsgdHJhY2sgdHJhY2tCeUlkKGksIGl0ZW0pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3dcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LW1haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZnVuY3Rpb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLW9wZXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZnVuY3Rpb25MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctcGF0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWRvdFwiPi48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZmllbGRcIj57eyBpdGVtLmZpZWxkTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwIGR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcC0tb3BlcmF0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGlyZWN0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5lZGl0JykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Tb3J0TW9kYWwoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGVuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTb3J0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAgICNidWlsZGVyU2VjdGlvblxuICAgICAgICAgICAgZGF0YS1zZWN0aW9uLWlkPVwiZmlsdGVyc1wiXG4gICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uIGR5bmFtaWMtdmlldy1idWlsZGVyX19zZWN0aW9uLS1mbHVpZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24taGVhZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3NlY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5jYXJkcy5maWx0ZXJzLnRpdGxlJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fc2VjdGlvbi1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGlua1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLXByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX2FjdGlvbi1saW5rLS1pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5IHx8ICFhdmFpbGFibGVDb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5hZGRGaWx0ZXInKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWx0ZXJNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19hY3Rpb24tbGluayBkeW5hbWljLXZpZXctYnVpbGRlcl9fYWN0aW9uLWxpbmstLWljb25cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkgfHwgIWZpbHRlckl0ZW1zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGNvbmZpZy50cmFuc2xhdGlvblByZWZpeCArICcuYWN0aW9ucy5jbGVhcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaC1hbHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKCFmaWx0ZXJJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2VtcHR5LXJvd1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmFkZEZpbHRlcicpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVyTW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IChjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuYWRkRmlsdGVyJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGZpbHRlckl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3N0YWNrIGR5bmFtaWMtdmlldy1idWlsZGVyX19zdGFjay0td3JhcFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZmlsdGVySXRlbXM7IHRyYWNrIHRyYWNrQnlJZChpLCBpdGVtKTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghaXRlbS5pc0RvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXBhdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LXRhYmxlXCI+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctZG90XCI+Ljwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWZpZWxkXCI+e3sgaXRlbS5maWVsZExhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLW9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGl0ZW0ub3BlcmF0b3JMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1kb21haW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgaXRlbS50YWJsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19yb3ctY2hpcCBkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAtLXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnN1YnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWNoaXAgZHluYW1pYy12aWV3LWJ1aWxkZXJfX3Jvdy1jaGlwLS1vcHRpb25hbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5zdGF0ZXMub3B0aW9uYWwnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLmVkaXQnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMuZWRpdCcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVyTW9kYWwoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGVuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9faWNvbi1hY3Rpb24gZHluYW1pYy12aWV3LWJ1aWxkZXJfX2ljb24tYWN0aW9uLS1kYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb25maWcudHJhbnNsYXRpb25QcmVmaXggKyAnLmFjdGlvbnMucmVtb3ZlJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoY29uZmlnLnRyYW5zbGF0aW9uUHJlZml4ICsgJy5hY3Rpb25zLnJlbW92ZScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBmb3IgKGFycm93IG9mIGZsb3dBcnJvd3M7IHRyYWNrIHRyYWNrQnlBcnJvdygkaW5kZXgsIGFycm93KSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX2Zsb3ctYXJyb3dcIlxuICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19mbG93LWFycm93LS1yaWdodF09XCJhcnJvdy5kaXJlY3Rpb24gPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgW2NsYXNzLmR5bmFtaWMtdmlldy1idWlsZGVyX19mbG93LWFycm93LS1kb3duXT1cImFycm93LmRpcmVjdGlvbiA9PT0gJ2Rvd24nXCJcbiAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImFycm93LmxlZnRcIlxuICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJhcnJvdy50b3BcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIFtjbGFzc109XCJhcnJvdy5kaXJlY3Rpb24gPT09ICdyaWdodCdcbiAgICAgICAgICAgICAgICA/ICdmYXMgZmEtYW5nbGUtZG91YmxlLXJpZ2h0J1xuICAgICAgICAgICAgICAgIDogJ2ZhcyBmYS1hbmdsZS1kb3VibGUtZG93bidcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKHByZXZpZXdWaXNpYmxlKSB7XG4gICAgICA8YXNpZGUgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy1hcmVhXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImR5bmFtaWMtdmlldy1idWlsZGVyX19wcmV2aWV3XCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cInNxbFByZXZpZXdQYW5lbEhlaWdodFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXZpZXctYnVpbGRlcl9fcHJldmlldy10aXRsZVwiPlNRTCBQcmV2aWV3PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3ByZXZpZXctc3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgQ29uc3VsdGEgZ2VyYWRhIGF1dG9tYXRpY2FtZW50ZSBhIHBhcnRpciBkYSBjb25maWd1cmFjYW8gYXR1YWwuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy12aWV3LWJ1aWxkZXJfX3ByZXZpZXctYm9keVwiPlxuICAgICAgICAgICAgPHNkYy1jb2RlLWVkaXRvclxuICAgICAgICAgICAgICBbc3FsXT1cInNxbFByZXZpZXdcIlxuICAgICAgICAgICAgICBsYW5ndWFnZT1cInNxbFwiXG4gICAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dDb3B5XT1cInRydWVcIlxuICAgICAgICAgICAgICBbaGVpZ2h0XT1cInNxbFByZXZpZXdIZWlnaHRcIlxuICAgICAgICAgICAgPjwvc2RjLWNvZGUtZWRpdG9yPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYXNpZGU+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|