@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.
Files changed (81) hide show
  1. package/core/config/dynamic-view-builder.config.d.ts +3 -0
  2. package/core/constants/dynamic-view-builder.const.d.ts +15 -0
  3. package/core/constants/picklist.const.d.ts +4 -0
  4. package/core/constants/timeline.const.d.ts +6 -0
  5. package/core/types/confirm.type.d.ts +1 -0
  6. package/core/types/dynamic-view-builder.type.d.ts +130 -0
  7. package/core/types/row-card.type.d.ts +10 -0
  8. package/core/types/timeline.type.d.ts +22 -0
  9. package/esm2022/core/config/dynamic-view-builder.config.mjs +396 -0
  10. package/esm2022/core/config/row-card.type.config.mjs +2 -1
  11. package/esm2022/core/constants/dynamic-view-builder.const.mjs +24 -0
  12. package/esm2022/core/constants/picklist.const.mjs +5 -1
  13. package/esm2022/core/constants/timeline.const.mjs +6 -0
  14. package/esm2022/core/handlers/sqlFormatter.mjs +3 -2
  15. package/esm2022/core/types/confirm.type.mjs +1 -1
  16. package/esm2022/core/types/dynamic-view-builder.type.mjs +2 -0
  17. package/esm2022/core/types/row-card.type.mjs +1 -1
  18. package/esm2022/core/types/timeline.type.mjs +2 -0
  19. package/esm2022/core/utils/layout.util.mjs +4 -4
  20. package/esm2022/core/utils/number-input.util.mjs +2 -2
  21. package/esm2022/features/breadcrumb/breadcrumb.component.mjs +21 -3
  22. package/esm2022/features/button/button.component.mjs +5 -5
  23. package/esm2022/features/card-list/card/card.component.mjs +4 -6
  24. package/esm2022/features/card-list/card-list.component.mjs +4 -7
  25. package/esm2022/features/code-editor/code-editor.component.mjs +5 -5
  26. package/esm2022/features/color-picker/color-picker.component.mjs +4 -4
  27. package/esm2022/features/combobox/combobox.component.mjs +8 -8
  28. package/esm2022/features/confirm/confirm.component.mjs +8 -4
  29. package/esm2022/features/country-phone-picker/country-phone-picker.component.mjs +6 -8
  30. package/esm2022/features/empty-state/empty-state.component.mjs +3 -3
  31. package/esm2022/features/hyperlink/hyperlink.component.mjs +10 -12
  32. package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
  33. package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
  34. package/esm2022/features/list/list.component.mjs +1 -1
  35. package/esm2022/features/loading-state/loading-state.component.mjs +20 -25
  36. package/esm2022/features/localized-number-input/localized-number-input.component.mjs +4 -4
  37. package/esm2022/features/mask/mask.component.mjs +4 -4
  38. package/esm2022/features/modal/modal.component.mjs +5 -5
  39. package/esm2022/features/modalc/modalc.component.mjs +1 -1
  40. package/esm2022/features/number-input/number-input.component.mjs +4 -4
  41. package/esm2022/features/numeric/numeric.component.mjs +4 -6
  42. package/esm2022/features/paginator/paginator.component.mjs +2 -2
  43. package/esm2022/features/password-strength/password-strength.component.mjs +3 -3
  44. package/esm2022/features/picklist/picklist.component.mjs +50 -9
  45. package/esm2022/features/radio/radio.component.mjs +12 -12
  46. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +32 -9
  47. package/esm2022/features/row-card-list/row-card-list.component.mjs +3 -3
  48. package/esm2022/features/searchbox/searchbox.component.mjs +1 -1
  49. package/esm2022/features/sidebar/sidebar.component.mjs +7 -3
  50. package/esm2022/features/switch/switch.component.mjs +3 -3
  51. package/esm2022/features/table/table.component.mjs +3 -3
  52. package/esm2022/features/textarea/textarea.component.mjs +4 -4
  53. package/esm2022/features/textbox/textbox.component.mjs +4 -4
  54. package/esm2022/features/timeline/timeline.component.mjs +90 -0
  55. package/esm2022/features/toast/toast.component.mjs +4 -6
  56. package/esm2022/features/tooltip/tooltip.component.mjs +3 -3
  57. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2810 -0
  58. package/esm2022/locales/en.json +202 -1
  59. package/esm2022/locales/es-CO.json +202 -1
  60. package/esm2022/locales/pt.json +202 -1
  61. package/esm2022/public-api.mjs +6 -1
  62. package/features/breadcrumb/breadcrumb.component.d.ts +2 -0
  63. package/features/button/button.component.d.ts +2 -2
  64. package/features/code-editor/code-editor.component.d.ts +2 -2
  65. package/features/hyperlink/hyperlink.component.d.ts +3 -3
  66. package/features/loading-state/loading-state.component.d.ts +3 -4
  67. package/features/modal/modal.component.d.ts +2 -2
  68. package/features/picklist/picklist.component.d.ts +10 -1
  69. package/features/radio/radio.component.d.ts +4 -4
  70. package/features/row-card-list/row-card/row-card.component.d.ts +8 -1
  71. package/features/sidebar/sidebar.component.d.ts +2 -1
  72. package/features/timeline/timeline.component.d.ts +27 -0
  73. package/features/visual-sql-editor/visual-sql-editor.component.d.ts +560 -0
  74. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +4161 -176
  75. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  76. package/package.json +2 -2
  77. package/public-api.d.ts +7 -0
  78. package/src/locales/en.json +211 -1
  79. package/src/locales/es-CO.json +211 -1
  80. package/src/locales/pt.json +211 -1
  81. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlzdWFsLXNxbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy92aXN1YWwtc3FsLWVkaXRvci92aXN1YWwtc3FsLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3Zpc3VhbC1zcWwtZWRpdG9yL3Zpc3VhbC1zcWwtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzFHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBd0IvRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7OztBQXlMbkUsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDO0FBQ3ZDLE1BQU0scUJBQXFCLEdBQUcsT0FBTyxDQUFDO0FBQ3RDLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLE1BQU0sNEJBQTRCLEdBQUcsR0FBRyxDQUFDO0FBQ3pDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDO0FBQ3hDLE1BQU0sd0JBQXdCLEdBQXNDLEtBQUssQ0FBQztBQUMxRSxNQUFNLHlCQUF5QixHQUFzQyxPQUFPLENBQUM7QUFDN0UsTUFBTSxrQkFBa0IsR0FBRyxRQUFpQixDQUFDO0FBQzdDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBQ3JDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcscUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7QUFDM0UsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFDL0IsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFDekMsTUFBTSxzQkFBc0IsR0FBRyxTQUFTLENBQUM7QUFDekMsTUFBTSw4QkFBOEIsR0FBZSxNQUFNLENBQUM7QUFDMUQsTUFBTSw2QkFBNkIsR0FBZSxNQUFNLENBQUM7QUFDekQsTUFBTSxzQkFBc0IsR0FBRyxvQkFBb0IsQ0FBQztBQUNwRCxNQUFNLHdCQUF3QixHQUFHLG9CQUFvQixDQUFDO0FBQ3RELE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sb0JBQW9CLEdBQXNEO0lBQzlFLE1BQU0sRUFBRTtRQUNOLEdBQUcsRUFBRSxzQkFBc0I7UUFDM0IsUUFBUSxFQUFFLGFBQWE7S0FDeEI7SUFDRCxVQUFVLEVBQUU7UUFDVixHQUFHLEVBQUUseUJBQXlCO1FBQzlCLFFBQVEsRUFBRSxtQkFBbUI7S0FDOUI7SUFDRCxZQUFZLEVBQUU7UUFDWixHQUFHLEVBQUUsMkJBQTJCO1FBQ2hDLFFBQVEsRUFBRSxlQUFlO0tBQzFCO0lBQ0QscUJBQXFCLEVBQUU7UUFDckIsR0FBRyxFQUFFLGtDQUFrQztRQUN2QyxRQUFRLEVBQUUsdUJBQXVCO0tBQ2xDO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsR0FBRyxFQUFFLHdCQUF3QjtRQUM3QixRQUFRLEVBQUUsZUFBZTtLQUMxQjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLEdBQUcsRUFBRSwrQkFBK0I7UUFDcEMsUUFBUSxFQUFFLHVCQUF1QjtLQUNsQztDQUNGLENBQUM7QUFDRixNQUFNLHdCQUF3QixHQUE4QjtJQUMxRCxNQUFNLEVBQUU7UUFDTixLQUFLLEVBQUUsT0FBTztRQUNkLE1BQU0sRUFBRSxPQUFPO0tBQ2hCO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsS0FBSyxFQUFFLE9BQU87UUFDZCxNQUFNLEVBQUUsT0FBTztLQUNoQjtJQUNELElBQUksRUFBRTtRQUNKLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87S0FDaEI7SUFDRCxJQUFJLEVBQUU7UUFDSixLQUFLLEVBQUUsT0FBTztRQUNkLE1BQU0sRUFBRSxPQUFPO0tBQ2hCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sS0FBSyxFQUFFLE9BQU87UUFDZCxNQUFNLEVBQUUsT0FBTztLQUNoQjtJQUNELEtBQUssRUFBRTtRQUNMLEtBQUssRUFBRSxPQUFPO1FBQ2QsTUFBTSxFQUFFLE9BQU87S0FDaEI7Q0FDRixDQUFDO0FBd0JGLE1BQU0sT0FBTyx3QkFBd0I7SUE0SGhCO0lBQ0E7SUE1SFgsY0FBYyxHQUFHLDhCQUE4QixFQUFFLENBQUM7SUFDekMsWUFBWSxHQUF1QjtRQUNsRCxRQUFRO1FBQ1IsT0FBTztRQUNQLFNBQVM7UUFDVCxRQUFRO1FBQ1IsU0FBUztRQUNULFNBQVM7S0FDVixDQUFDO0lBQ00sc0JBQXNCLEdBQWtCLElBQUksQ0FBQztJQUM3Qyx3QkFBd0IsR0FBeUMsSUFBSSxDQUFDO0lBQ3JFLGVBQWUsR0FBMEM7UUFDaEU7WUFDRSxLQUFLLEVBQUUsUUFBUTtZQUNmLEtBQUssRUFBRSxTQUFTO1lBQ2hCLFNBQVMsRUFBRSxpQkFBaUI7U0FDN0I7UUFDRDtZQUNFLEtBQUssRUFBRSxPQUFPO1lBQ2QsS0FBSyxFQUFFLE9BQU87WUFDZCxTQUFTLEVBQUUsYUFBYTtTQUN6QjtLQUNGLENBQUM7SUFDTyxlQUFlLEdBQXdDO1FBQzlEO1lBQ0UsS0FBSyxFQUFFLFFBQVE7WUFDZixLQUFLLEVBQUUsV0FBVztTQUNuQjtRQUNEO1lBQ0UsS0FBSyxFQUFFLHNCQUFzQjtZQUM3QixLQUFLLEVBQUUsa0JBQWtCO1NBQzFCO0tBQ0YsQ0FBQztJQUNPLHVCQUF1QixHQUF3QyxFQUFFLENBQUM7SUFDbEUsa0JBQWtCLEdBQStCLEVBQUUsQ0FBQztJQUNwRCx1QkFBdUIsR0FBMEMsRUFBRSxDQUFDO0lBQ3BFLDBCQUEwQixHQUErQixFQUFFLENBQUM7SUFDNUQsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFhLE1BQU0sQ0FBQyxLQUErQjtRQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUs7WUFDekIsQ0FBQyxDQUFDLDhCQUE4QixDQUFDLEtBQUssQ0FBQztZQUN2QyxDQUFDLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBQ2tCLFlBQVksR0FDN0IsSUFBSSxZQUFZLEVBQTRCLENBQUM7SUFDNUIsSUFBSSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBQ3BELE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXBDLGlCQUFpQixDQUEyQjtJQUU1QyxlQUFlLENBQXNDO0lBQ3RFLFVBQVUsR0FBc0IsU0FBUyxDQUFDO0lBQzFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsVUFBVSxHQUF1QixFQUFFLENBQUM7SUFDcEMsMEJBQTBCLEdBQUcsT0FBTyxDQUFDO0lBQ3JDLGtCQUFrQixHQUFrQixJQUFJLENBQUM7SUFDekMsZ0JBQWdCLEdBQWtCLElBQUksQ0FBQztJQUM5QixtQkFBbUIsR0FBRyxxQkFBcUIsQ0FBQztJQUM1QyxhQUFhLEdBQUcscUJBQXFCLENBQUM7SUFDdEMsZUFBZSxHQUFHLHdCQUF3QixDQUFDO0lBQzNDLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDO0lBQ3hDLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0lBQ25ELGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixlQUFlLEdBQW9CLFFBQVEsQ0FBQztJQUM1QyxpQkFBaUIsR0FBdUIsRUFBRSxDQUFDO0lBQzNDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUM5QixrQkFBa0IsR0FBdUIsUUFBUSxDQUFDO0lBQ2xELGlCQUFpQixHQUFhLEVBQUUsQ0FBQztJQUNqQyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7SUFDbkMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGFBQWEsR0FBa0IsSUFBSSxDQUFDO0lBQ3BDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztJQUMvQixnQkFBZ0IsR0FBRyxXQUFXLENBQUM7SUFDL0IsU0FBUyxHQUFHO1FBQ1YsWUFBWSxFQUFFLFdBQVc7UUFDekIsWUFBWSxFQUFFLFdBQVc7UUFDekIsUUFBUSxFQUFFLHFCQUFxQjtLQUNoQyxDQUFDO0lBQ0YsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLGFBQWEsR0FBa0IsSUFBSSxDQUFDO0lBQ3BDLFVBQVUsR0FBRyxXQUFXLENBQUM7SUFDekIsU0FBUyxHQUFHO1FBQ1YsTUFBTSxFQUFFLFdBQVc7UUFDbkIsWUFBWSxFQUFFLFdBQVc7UUFDekIsU0FBUyxFQUFFLHNCQUFzQjtLQUNsQyxDQUFDO0lBQ0YsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLGNBQWMsR0FBbUIsUUFBUSxDQUFDO0lBQzFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztJQUMvQixnQkFBZ0IsR0FBOEIsRUFBRSxDQUFDO0lBQ2pELHVCQUF1QixHQUFrQixJQUFJLENBQUM7SUFDOUMsa0JBQWtCLEdBQUc7UUFDbkIsTUFBTSxFQUFFLFdBQVc7UUFDbkIsWUFBWSxFQUFFLFdBQVc7UUFDekIsYUFBYSxFQUFFLFdBQVc7S0FDM0IsQ0FBQztJQUNGLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixlQUFlLEdBQWtCLElBQUksQ0FBQztJQUN0QyxlQUFlLEdBQW9CLFFBQVEsQ0FBQztJQUM1QyxlQUFlLEdBQW9CLFdBQVcsQ0FBQztJQUMvQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQzNCLFdBQVcsR0FBRztRQUNaLElBQUksRUFBRSxXQUE4QjtRQUNwQyxNQUFNLEVBQUUsV0FBVztRQUNuQixRQUFRLEVBQUUsdUJBQXVCO1FBQ2pDLFNBQVMsRUFBRSx3QkFBd0I7UUFDbkMsUUFBUSxFQUFFLEtBQUs7UUFDZixTQUFTLEVBQUUseUJBQXlCO1FBQ3BDLEtBQUssRUFBRSxXQUFXO1FBQ2xCLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLFlBQVksRUFBRSxXQUFXO1FBQ3pCLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLGFBQWEsRUFBRSxXQUFXO1FBQzFCLGdCQUFnQixFQUFFLFdBQVc7S0FDOUIsQ0FBQztJQUNGLFlBQ21CLFNBQTJCLEVBQzNCLGlCQUFvQztRQURwQyxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBRXJELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsZUFBZTtRQUNiLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDM0MsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3pDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzQyxZQUFZLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksc0JBQXNCO1FBQ3hCLE9BQU8sQ0FDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ25FLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLFVBQVUsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEUsR0FBRyxJQUFJO1lBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUM7U0FDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTztZQUNMO2dCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzVCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsMkJBQTJCLEVBQzNELE9BQU8sQ0FDUjtnQkFDRCxLQUFLLEVBQUUsT0FBTzthQUNmO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDNUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwrQkFBK0IsRUFDL0QsV0FBVyxDQUNaO2dCQUNELEtBQUssRUFBRSxXQUFXO2FBQ25CO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDNUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix1QkFBdUIsRUFDdkQsTUFBTSxDQUNQO2dCQUNELEtBQUssRUFBRSxNQUFNO2FBQ2Q7WUFDRDtnQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCxPQUFPLENBQ1I7Z0JBQ0QsS0FBSyxFQUFFLE9BQU87YUFDZjtTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ3hELENBQUM7UUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzlELEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDeEQsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDL0QsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDakMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0IsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDakMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksd0JBQXdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxLQUFLLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsSUFBSSxtQkFBbUI7UUFDckIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTFELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUMxQixnQkFBZ0I7YUFDYixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzFDLE9BQU8sTUFBTSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUM7WUFDckMsQ0FBQztZQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzlFLENBQUMsQ0FBQzthQUNELEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUM7WUFFeEUsT0FBTztnQkFDTCxZQUFZO2dCQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLElBQUksRUFBRSxZQUFZO29CQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQztvQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxJQUFJLFdBQVc7YUFDbkUsQ0FBQztRQUNKLENBQUMsQ0FBQyxFQUNKLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNsQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELElBQUksT0FBTztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ2IsSUFDRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtZQUM1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtZQUM1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUN4QixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckUsT0FBTyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQy9ELENBQUM7SUFDRCxJQUFJLFdBQVc7UUFDYixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksYUFBYTtRQUNmLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxJQUFJLHlCQUF5QjtRQUMzQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsSUFBSSw4QkFBOEI7UUFDaEMsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxrQ0FBa0M7UUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFdBQVcsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFFBQVEsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLGtCQUFrQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUNsRixDQUFDO0lBQ0QsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNELElBQUksdUJBQXVCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSw2QkFBNkI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixvQ0FBb0MsRUFDcEUsNEVBQTRFLENBQzdFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSw0QkFBNEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixtQ0FBbUMsRUFDbkUsc0ZBQXNGLENBQ3ZGLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLDZCQUE2QjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixpREFBaUQsRUFDakYsOEVBQThFLENBQy9FLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGdEQUFnRCxFQUNoRiw4RUFBOEUsQ0FDL0UsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxxQkFBcUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsbUNBQW1DLEVBQ25FLDJEQUEyRCxDQUM1RCxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLElBQUksV0FBbUIsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDekMsV0FBVyxHQUFHLGlCQUFpQixDQUFDO1FBQ2xDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0MsV0FBVyxHQUFHLGNBQWMsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekUsV0FBVyxHQUFHLGlCQUFpQixDQUFDO1FBQ2xDLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxHQUFHLGNBQWMsQ0FBQztRQUMvQixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQTJCO1lBQzVDLGVBQWUsRUFBRSx5REFBeUQ7WUFDMUUsWUFBWSxFQUFFLHNFQUFzRTtZQUNwRixlQUFlLEVBQUUscUVBQXFFO1lBQ3RGLFlBQVksRUFBRSxxRUFBcUU7U0FDcEYsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHFCQUFxQixXQUFXLEVBQUUsRUFDbEUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUMzQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksc0JBQXNCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLG9DQUFvQyxFQUNwRSw4RkFBOEYsQ0FDL0YsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsd0NBQXdDLEVBQ3hFLHVEQUF1RCxDQUN4RCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLDZCQUE2QixFQUM3RCxxR0FBcUcsQ0FDdEcsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiw2QkFBNkIsRUFDN0QsdUZBQXVGLENBQ3hGLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsNEJBQTRCLEVBQzVELGtGQUFrRixDQUNuRixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksNkJBQTZCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLG9DQUFvQyxFQUNwRSxnSEFBZ0gsQ0FDakgsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHVCQUF1QjtRQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGlDQUFpQyxFQUNqRSxnRkFBZ0YsQ0FDakYsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLDhCQUE4QixFQUM5RCxnRUFBZ0UsQ0FDakUsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLDJCQUEyQixFQUMzRCx5REFBeUQsQ0FDMUQsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix5QkFBeUIsRUFDekQsZ0VBQWdFLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxzQkFBc0I7UUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNwRixPQUFPLENBQ0wsV0FBVztZQUNYLENBQUMsSUFBSSxDQUFDLHVCQUF1QjtZQUM3QixDQUFDLElBQUksQ0FBQyx1QkFBdUI7WUFDN0IsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQ2hDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxDQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLE9BQU87WUFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksdUJBQXVCO1FBQ3pCLE9BQU8sQ0FDTCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxPQUFPO1lBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FDeEMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLDBCQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSx5QkFBeUI7UUFDM0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsT0FBTyxDQUNMLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLEtBQUssa0JBQWtCO1lBQ2hFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsc0JBQXNCLEVBQ3RELHNCQUFzQixDQUN2QjtZQUNELENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFL0UsTUFBTSxLQUFLLEdBQXVCO1lBQ2hDO2dCQUNFLEVBQUUsRUFBRSxNQUFNO2dCQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsY0FBYyxFQUM5QyxNQUFNLENBQ1A7Z0JBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLEtBQUssa0JBQWtCO29CQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxzQkFBc0IsQ0FDdkI7b0JBQ0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDeEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwwQkFBMEIsRUFDMUQsUUFBUSxDQUNUO2FBQ0o7WUFDRDtnQkFDRSxFQUFFLEVBQUUsV0FBVztnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLG1CQUFtQixFQUNuRCxVQUFVLENBQ1g7Z0JBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyx1QkFBdUI7b0JBQ2pDLENBQUMsQ0FBQyxPQUFPO29CQUNULENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2FBQ3JGO1NBQ0YsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hELEtBQUssQ0FBQyxJQUFJLENBQ1I7Z0JBQ0UsRUFBRSxFQUFFLFlBQVk7Z0JBQ2hCLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsMEJBQTBCLEVBQzFELHNCQUFzQixDQUN2QjtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHO2dCQUN0RCxTQUFTLEVBQUUsTUFBTTthQUNsQixDQUNGLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxJQUFJLENBQ1I7Z0JBQ0UsRUFBRSxFQUFFLE9BQU87Z0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixlQUFlLEVBQy9DLE9BQU8sQ0FDUjtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUN0RixTQUFTLEVBQUUsTUFBTTthQUNsQixFQUNEO2dCQUNFLEVBQUUsRUFBRSxVQUFVO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsa0JBQWtCLEVBQ2xELFVBQVUsQ0FDWDtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO2FBQ2xFLEVBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFdBQVc7Z0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixtQkFBbUIsRUFDbkQsZUFBZSxDQUNoQjtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDdEUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixjQUFjLEVBQzlDLFdBQVcsQ0FDWjthQUNGLEVBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLE9BQU87Z0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixlQUFlLEVBQy9DLE9BQU8sQ0FDUjtnQkFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLDhCQUE4QixFQUFFLElBQUksR0FBRztnQkFDbkQsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzNFLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ1QsRUFBRSxFQUFFLFVBQVU7WUFDZCxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGtCQUFrQixFQUNsRCxVQUFVLENBQ1g7WUFDRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO2dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGFBQWEsRUFDN0MsS0FBSyxDQUNOO2dCQUNELENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsWUFBWSxFQUM1QyxLQUFLLENBQ047U0FDSixDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLHdCQUF3QjtRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNwRCxPQUFPLE9BQU8sSUFBSSxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUNELElBQUksOEJBQThCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGVBQWUsS0FBSyxRQUFRLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksa0NBQWtDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLGVBQWUsS0FBSyxXQUFXLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELElBQUksMEJBQTBCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNkLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUM1RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSx3QkFBd0I7UUFDMUIsT0FBTztZQUNMO2dCQUNFLEVBQUUsRUFBRSxRQUFRO2dCQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsdUJBQXVCLEVBQ3ZELHNCQUFzQixDQUN2QjtnQkFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNuQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHVDQUF1QyxFQUN2RSxnRkFBZ0YsQ0FDakY7Z0JBQ0QsY0FBYyxFQUFFLEdBQUc7YUFDcEI7WUFDRDtnQkFDRSxFQUFFLEVBQUUsV0FBVztnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLDJCQUEyQixFQUMzRCxvQkFBb0IsQ0FDckI7Z0JBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDbkMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwwQ0FBMEMsRUFDMUUsZ0ZBQWdGLENBQ2pGO2dCQUNELGNBQWMsRUFBRSxHQUFHO2dCQUNuQixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCO2FBQ3RDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix1QkFBdUIsRUFDdkQsc0JBQXNCLENBQ3ZCLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSw0QkFBNEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsb0NBQW9DLEVBQ3BFLG9DQUFvQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksd0JBQXdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsSUFBSSw4QkFBOEI7UUFDaEMsT0FBTyxJQUFJLENBQUMsaUJBQWlCO2FBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0RCxNQUFNLENBQ0wsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHLENBQUMsQ0FDL0QsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLDBCQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzthQUNsQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxRCxPQUFPO2dCQUNMLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLEVBQUU7Z0JBQ3hELFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDOUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM5QixRQUFRLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3RELFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDOUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVO2FBQy9CLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEQsRUFBRSxFQUFFLElBQUk7WUFDUixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7U0FDakMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFELEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNoQixLQUFLLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUQsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN4RCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUM7WUFDekUsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDO1lBRW5FLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0JBQzlCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDOUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixVQUFVLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHO2dCQUMzQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO2dCQUN6QyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO2dCQUN6QyxZQUFZO2dCQUNaLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVztnQkFDbkYsYUFBYTtnQkFDYixlQUFlLEVBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsYUFBYTtnQkFDckYsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUNoRCxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUkseUJBQXlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQztZQUV4RSxPQUFPO2dCQUNMLFlBQVk7Z0JBQ1osRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7Z0JBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM1QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7Z0JBQ3hDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7Z0JBQ3hDLGFBQWEsRUFBRSxZQUFZO29CQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQztvQkFDekMsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2YsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7YUFDM0QsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksOEJBQThCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FDckMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQzlFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELElBQUksNkJBQTZCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQjthQUN6QixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDeEQsTUFBTSxDQUNMLENBQUMsSUFBSSxFQUFrQixFQUFFLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksR0FBRyxDQUFDLENBQy9ELENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSw2QkFBNkI7UUFDL0IsT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLFFBQVEsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsSUFBSSxpQ0FBaUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsY0FBYyxLQUFLLFdBQVcsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsbUNBQW1DLEVBQ25FLGlDQUFpQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksdUJBQXVCO1FBQ3pCLE9BQU87WUFDTDtnQkFDRSxFQUFFLEVBQUUsUUFBUTtnQkFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCxvQkFBb0IsQ0FDckI7Z0JBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDbkMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix5QkFBeUIsRUFDekQsc0RBQXNELENBQ3ZEO2dCQUNELGNBQWMsRUFBRSxHQUFHO2FBQ3BCO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFdBQVc7Z0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNuQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCx5REFBeUQsQ0FDMUQ7Z0JBQ0QsY0FBYyxFQUFFLEdBQUc7Z0JBQ25CLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNO2FBQ3hDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLDRCQUE0QjtRQUM5QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixvQ0FBb0MsRUFDcEUsa0NBQWtDLENBQ25DLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx3QkFBd0I7UUFDMUIsT0FBTztZQUNMO2dCQUNFLEVBQUUsRUFBRSxRQUFRO2dCQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsbUNBQW1DLEVBQ25FLGlCQUFpQixDQUNsQjtnQkFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNuQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNDQUFzQyxFQUN0RSx3RUFBd0UsQ0FDekU7Z0JBQ0QsY0FBYyxFQUFFLEdBQUc7YUFDcEI7WUFDRDtnQkFDRSxFQUFFLEVBQUUsV0FBVztnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNDQUFzQyxFQUN0RSxtQkFBbUIsQ0FDcEI7Z0JBQ0QsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDbkMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix5Q0FBeUMsRUFDekUseURBQXlELENBQzFEO2dCQUNELGNBQWMsRUFBRSxHQUFHO2dCQUNuQixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCO2FBQ3RDO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLFFBQVE7Z0JBQ1osS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixtQ0FBbUMsRUFDbkUsZUFBZSxDQUNoQjtnQkFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNuQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNDQUFzQyxFQUN0RSxtREFBbUQsQ0FDcEQ7Z0JBQ0QsY0FBYyxFQUFFLEdBQUc7Z0JBQ25CLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0I7YUFDckM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksK0JBQStCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLG1CQUFtQixFQUNuRCxlQUFlLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSw0QkFBNEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIscUJBQXFCLEVBQ3JELGVBQWUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLDhCQUE4QjtRQUNoQyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixvQ0FBb0MsRUFDcEUsMkRBQTJELENBQzVELENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsdUNBQXVDLEVBQ3ZFLHFFQUFxRSxDQUN0RSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUkseUJBQXlCO1FBQzNCLE9BQU87WUFDTDtnQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGNBQWMsRUFDOUMsWUFBWSxDQUNiO2dCQUNELEtBQUssRUFBRSxXQUFXO2FBQ25CO1lBQ0QsR0FBRyxJQUFJLENBQUMsZUFBZTtTQUN4QixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekQsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssRUFBRTtZQUNuRixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7WUFDdEQsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQzlDLENBQUMsQ0FBQyxXQUFXO1lBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FDaEMsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsb0JBQW9CLENBQzFCO1NBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RCxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO1lBQy9DLEtBQUssRUFDSCxJQUFJLENBQUMsU0FBUyxLQUFLLGtCQUFrQjtnQkFDbkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDeEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixzQkFBc0IsRUFDdEQsc0JBQXNCLENBQ3ZCO2dCQUNELENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDMUIsSUFBSSxDQUFDLE1BQU0sQ0FDWixNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0QsUUFBUSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUM7WUFDOUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2RCxNQUFNLEtBQUssR0FDVCxJQUFJLENBQUMsU0FBUyxLQUFLLGtCQUFrQjtnQkFDbkMsQ0FBQyxDQUFDO29CQUNBLE9BQU8sRUFBRSxXQUFXO29CQUNwQixVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUNsQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxzQkFBc0IsQ0FDdkI7b0JBQ0QsVUFBVSxFQUFFLFdBQVc7aUJBQ3hCO2dCQUNELENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTNDLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTtnQkFDL0MsR0FBRyxLQUFLO2dCQUNSLGFBQWEsRUFDWCxJQUFJLENBQUMsU0FBUyxLQUFLLGtCQUFrQjtvQkFDbkMsQ0FBQyxDQUFDLFdBQVc7b0JBQ2IsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNwRCxRQUFRLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQztnQkFDOUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsS0FBSyxrQkFBa0I7YUFDaEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELElBQUksbUJBQW1CO1FBQ3JCLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHVCQUF1QixFQUN2RCxzQkFBc0IsQ0FDdkIsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixzQkFBc0IsRUFDdEQsbUJBQW1CLENBQ3BCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsdUJBQXVCLEVBQ3ZELHFCQUFxQixDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGdCQUFnQixFQUNoRCxRQUFRLENBQ1QsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwyQkFBMkIsRUFDM0QsUUFBUSxDQUNULENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGNBQWMsRUFDOUMsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLGNBQWMsRUFDOUMsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsaUJBQWlCLEVBQ2pELFlBQVksQ0FDYixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxTQUFTLENBQ1YsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsc0JBQXNCLEVBQ3RELFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixxQkFBcUIsRUFDckQsa0JBQWtCLENBQ25CLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxrQkFBa0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQ2pDLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxJQUFJLENBQUMsc0JBQXNCLEVBQzNCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxJQUFJLENBQUMsd0JBQXdCLEVBQzdCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksMkJBQTJCO1FBQzdCLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsSUFBSSxpQ0FBaUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCO2FBQzFCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pELE1BQU0sQ0FDTCxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUMvRCxDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ2hFLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksNkJBQTZCO1FBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdFLE9BQU8sT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNkLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sS0FBSyxHQUFHLE1BQU07WUFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNyRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUNoRSxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksMkJBQTJCO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sTUFBTTtZQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDckUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksNkJBQTZCO1FBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdFLE9BQU8sT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNkLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBQ0QsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQjthQUM1QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNmLElBQUksQ0FBQyxhQUFhLENBQ2hCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FDRjthQUNBLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNkLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07Z0JBQ3JDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVk7WUFDcEUsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsUUFBUSxFQUFFLFFBQWlCO1NBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDO1lBQ2IsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDNUIsZ0JBQWdCLEVBQUUsc0JBQXNCO1lBQ3hDLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUMzQixDQUFDLENBQUMsNkJBQTZCO2dCQUMvQixDQUFDLENBQUMsOEJBQThCO1lBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDMUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO1lBQ3JDLElBQUksQ0FBQyxXQUFXO2dCQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxtQkFBbUIsQ0FDbkQsQ0FDSixDQUFDO1FBRUYsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDeEQsSUFBSSxDQUFDLFlBQVksRUFDakIsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx3QkFBd0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksOEJBQThCO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsR0FBRyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNkLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxDQUFDO0lBQ0QsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCx3QkFBd0IsQ0FDekIsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixzQkFBc0IsRUFDdEQsc0JBQXNCLENBQ3ZCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCx3QkFBd0IsQ0FDekIsQ0FBQztJQUNOLENBQUM7SUFDRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtZQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsd0JBQXdCLEVBQ3hELHdCQUF3QixDQUN6QixDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FDeEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQix3QkFBd0IsRUFDeEQsd0JBQXdCLENBQ3pCLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxxQkFBcUI7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELEtBQUs7WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUM1QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQ2Ysc0JBQXNCLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUN4QjtTQUNGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQy9DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLHlCQUF5QjtRQUMzQixPQUFPLENBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDMUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2xELElBQUksSUFBSSxDQUNWLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSx1QkFBdUI7UUFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDaEQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xELENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHdCQUF3QixFQUN4RCx3QkFBd0IsQ0FDekIsQ0FBQztRQUNKLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1lBQzVELENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsd0JBQXdCLEVBQ3hELHdCQUF3QixDQUN6QixDQUFDO1FBQ0osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDcEQsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSwrQkFBK0I7UUFDakMsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLGtCQUFrQjtZQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUN4QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxzQkFBc0IsQ0FDdkI7WUFDRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQy9CLENBQUM7SUFDRCxJQUFJLDBCQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQiwwQkFBMEIsRUFDMUQscUJBQXFCLENBQ3RCLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSw4QkFBOEI7UUFDaEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsOEJBQThCLEVBQzlELDBCQUEwQixDQUMzQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNuRCxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ2pDLElBQUksRUFBRyxJQUFJLENBQUMsSUFBNEIsSUFBSSxNQUFNO1NBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjO2FBQy9CLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUN6QixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNqRSxNQUFNLElBQUksR0FBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxFQUFFLENBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN4RSxNQUFNLElBQUksR0FBWSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNuRCxNQUFNLElBQUksR0FBWSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPO1lBQ0wsSUFBSSxFQUFFLHVDQUF1QztZQUM3QyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGtCQUFrQixFQUFFLDZCQUE2QjtZQUNqRCxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixxQkFBcUI7WUFDakUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsb0JBQW9CO1NBQ3BELENBQUM7SUFDcEIsQ0FBQztJQUNELElBQUksVUFBVTtRQUNaLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzlDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDeEQsQ0FBQztJQUNELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxPQUFPO1lBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBQ0QsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQ2xGLEVBQUUsRUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQy9ELENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDeEUsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBQ0QsU0FBUyxDQUFDLENBQVMsRUFBRSxJQUFvQjtRQUN2QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUNELFlBQVksQ0FBQyxDQUFTLEVBQUUsSUFBc0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxLQUE0QztRQUM3RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzdCLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUNELHFCQUFxQixDQUFDLEtBQWlDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDN0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUNoQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUNELDJCQUEyQixDQUFDLEtBQWE7UUFDdkMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLENBQUM7SUFDN0UsQ0FBQztJQUNELGdDQUFnQztRQUM5QixPQUFPLENBQ0wsSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUk7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUNELGdCQUFnQixDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFDRCxlQUFlLENBQUMsS0FBZ0IsRUFBRSxLQUFhO1FBQzdDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBbUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzVDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUM5QixLQUFLLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQ3ZCLENBQUM7SUFDSixDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQy9DLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQ3ZELENBQUM7UUFDRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUNELGNBQWMsQ0FBQyxLQUFjO1FBQzNCLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdkUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztZQUN4QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO1lBQ3hDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDckIsQ0FBQyxDQUFDO29CQUNBLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO29CQUMvRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztpQkFDbEQ7Z0JBQ0QsQ0FBQyxDQUFDLElBQUk7U0FDVCxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUc7WUFDeEIsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLFdBQVc7WUFDekIsYUFBYSxFQUFFLFdBQVc7U0FDM0IsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjO1lBQ2pCLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUNELDJCQUEyQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDcEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsa0JBQWtCLEdBQUc7WUFDeEIsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLFdBQVc7WUFDekIsYUFBYSxFQUFFLFdBQVc7U0FDM0IsQ0FBQztJQUNKLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxJQUFvQjtRQUNyQyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDMUQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsOEJBQThCLENBQUMsS0FBOEI7UUFDM0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBQ0Qsc0JBQXNCLENBQUMsTUFBYztRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQzdFLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDdEIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3hCO2dCQUNFLE1BQU07Z0JBQ04sS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLEtBQUssRUFBRSxXQUFXO2dCQUNsQixRQUFRLEVBQUUsSUFBSTthQUNmO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUNELDBCQUEwQjtRQUN4QixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUNqRCxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FDckQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQzNDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHO1lBQ3RCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtZQUN4QixHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDbEIsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLEtBQUssRUFBRSxXQUFXO2dCQUNsQixRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztTQUNKLENBQUM7UUFDRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLENBQUM7SUFDRCx3QkFBd0I7UUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsR0FBYTtRQUN6QyxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FDN0IsR0FBRzthQUNBLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDNUMsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM1RCxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDakMsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQzlCLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDM0MsQ0FBQztRQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0I7YUFDL0MsTUFBTSxDQUNMLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ3ZFO2FBQ0EsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2xCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLGVBQWUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDO1FBRWhFLElBQ0UsSUFBSSxDQUFDLHVCQUF1QjtZQUM1QixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQ2xELENBQUM7WUFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUNELHVCQUF1QixDQUFDLE1BQWMsRUFBRSxLQUFhO1FBQ25ELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsdUJBQXVCLENBQUMsTUFBYyxFQUFFLEtBQWE7UUFDbkQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxxQkFBcUIsQ0FBQyxNQUFjO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUNsRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQ2pDLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUNELHNCQUFzQixDQUFDLE1BQWM7UUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3hCLE1BQU07WUFDTixZQUFZLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztZQUNuRSxhQUFhLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztTQUM5RCxDQUFDO0lBQ0osQ0FBQztJQUNELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxrQkFBa0IsR0FBRztZQUN4QixNQUFNLEVBQUUsV0FBVztZQUNuQixZQUFZLEVBQUUsV0FBVztZQUN6QixhQUFhLEVBQUUsV0FBVztTQUMzQixDQUFDO0lBQ0osQ0FBQztJQUNELDhCQUE4QixDQUFDLEtBQWE7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDN0MsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUNELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDbEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ3RELFFBQVEsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELHNCQUFzQixDQUFDLE1BQWM7UUFDbkMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLEtBQUssTUFBTSxDQUFDO0lBQ2pELENBQUM7SUFDRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7WUFDeEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksV0FBVztZQUN4QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO2dCQUMzQyxDQUFDLENBQUM7b0JBQ0EsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRTtvQkFDL0MsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7aUJBQ2xEO2dCQUNELENBQUMsQ0FBQyxJQUFJO1NBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGVBQWUsQ0FBQyxPQUF3QixRQUFRO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUN4RSxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxlQUFlO1lBQ2xCLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU07Z0JBQ25ELENBQUMsQ0FBQyxXQUFXO2dCQUNiLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDZixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFDRCw0QkFBNEI7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxJQUFxQjtRQUN2QyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBQ0Qsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsK0JBQStCLENBQUMsS0FBOEI7UUFDNUQsSUFBSSxDQUFDLG1CQUFtQixDQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUN2RCxDQUFDO0lBQ0osQ0FBQztJQUNELDhCQUE4QixDQUFDLEdBQWE7UUFDMUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlELE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDekQsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxPQUFPLENBQ0wsT0FBTyxJQUFJO2dCQUNULEtBQUs7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUM7YUFDN0MsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBQ0Qsd0JBQXdCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDbkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMzRCxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUs7WUFDbEIsQ0FBQyxDQUFDO2dCQUNBLEdBQUcsSUFBSTtnQkFDUCxLQUFLLEVBQUUsS0FBSzthQUNiO1lBQ0QsQ0FBQyxDQUFDLElBQUksQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUNELGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVU7Z0JBQ25GLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTTtnQkFDckIsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLElBQUksS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVO2FBQ3JELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxJQUF3QjtRQUN6QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7UUFDeEMsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQ3hELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUNyQixDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7SUFDMUMsQ0FBQztJQUNELHVCQUF1QixDQUFDLEVBQVU7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDL0MsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixFQUFFLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFDRCxpQ0FBaUMsQ0FBQyxHQUFhO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELHNCQUFzQixDQUFDLEtBQW9CO1FBQ3pDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsS0FBSyxDQUFDLGFBQW9DLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFDRCxxQkFBcUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLENBQUMsS0FBSztnQkFDVjtvQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7b0JBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2lCQUNsQjthQUNGLENBQUMsQ0FDSCxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztpQkFDckUsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDN0QsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsS0FBSyxFQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVTtnQkFDckYsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFDdEQsS0FBSyxFQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUs7b0JBQzlCLElBQUksQ0FBQyxXQUFXO29CQUNoQixJQUFJLENBQUMsSUFBSTthQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUN6RCxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQ3ZELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FDMUQsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGFBQWEsQ0FBQyxLQUFjO1FBQzFCLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLElBQUksV0FBVztZQUNsRCxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxXQUFXO1lBQ2xELFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLHFCQUFxQjtTQUNyRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBQ0QsY0FBYztRQUNaLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixZQUFZLEVBQUUsV0FBVztZQUN6QixZQUFZLEVBQUUsV0FBVztZQUN6QixRQUFRLEVBQUUscUJBQXFCO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsR0FBYTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pCLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztRQUV6RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyRSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRSxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsR0FBYTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pCLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztJQUMzRixDQUFDO0lBQ0QsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLElBQUksR0FBMkI7WUFDbkMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWTtZQUN6QyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7U0FDbEMsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2xFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2hFLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGFBQWEsQ0FBQyxLQUFjO1FBQzFCLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlELElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxXQUFXO1lBQ3RDLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7WUFDMUQsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksc0JBQXNCO1NBQ3hELENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFDRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLFdBQVc7WUFDekIsU0FBUyxFQUFFLHNCQUFzQjtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUNELGdCQUFnQixDQUFDLGVBQXVCO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4RCxNQUFNLGVBQWUsR0FDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07WUFDckMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXJFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLGVBQWU7WUFDM0MsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBQ0QsdUJBQXVCLENBQUMsR0FBYTtRQUNuQyxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQztRQUVuRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztZQUMxQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQTJCO1lBQ25DLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07WUFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVM7WUFDdEQsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztTQUNwQyxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDcEUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQzFFLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGVBQWUsQ0FBQyxLQUFjO1FBQzVCLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxlQUFlO1lBQ2xCLE9BQU8sRUFBRSxTQUFTLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDL0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNyRixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMxQixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxXQUFXO1lBQ3RDLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLHVCQUF1QjtZQUN0RCxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSx3QkFBd0I7WUFDekQsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLElBQUksS0FBSztZQUNwQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSx5QkFBeUI7WUFDMUQsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksV0FBVztZQUNwQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVztZQUN0RCxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVc7WUFDakQsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXO1lBQy9DLGFBQWEsRUFBRSxPQUFPLEVBQUUsYUFBYSxJQUFJLFdBQVc7WUFDcEQsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixJQUFJLFdBQVc7U0FDM0QsQ0FBQztRQUNGLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUNELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRztZQUNqQixJQUFJLEVBQUUsV0FBVztZQUNqQixNQUFNLEVBQUUsV0FBVztZQUNuQixRQUFRLEVBQUUsdUJBQXVCO1lBQ2pDLFNBQVMsRUFBRSx3QkFBd0I7WUFDbkMsUUFBUSxFQUFFLEtBQUs7WUFDZixTQUFTLEVBQUUseUJBQXlCO1lBQ3BDLEtBQUssRUFBRSxXQUFXO1lBQ2xCLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFlBQVksRUFBRSxXQUFXO1lBQ3pCLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLGFBQWEsRUFBRSxXQUFXO1lBQzFCLGdCQUFnQixFQUFFLFdBQVc7U0FDOUIsQ0FBQztRQUNGLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxNQUFjO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzVELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFDRCw4QkFBOEIsQ0FBQyxHQUFhO1FBQzFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FDZCxPQUFPLGNBQWMsS0FBSyxRQUFRO1lBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsY0FBYyxDQUFDLElBQUksV0FBVztZQUNqRSxDQUFDLENBQUMsV0FBVyxDQUFDO1FBRWxCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ08sMEJBQTBCO1FBQ2hDLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLHVCQUF1QixDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO0lBQy9DLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxJQUFxQjtRQUN2QyxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4RCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3BELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFFNUIsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUNELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO0lBQy9DLENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQztRQUU3QyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcseUJBQXlCLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxJQUFxQjtRQUN0QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxHQUFHLHVCQUF1QixDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLHlCQUF5QixDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7UUFDaEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNELCtCQUErQixDQUFDLEtBQThCO1FBQzVELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBQ0QsVUFBVTtRQUNSLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRXpDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELG1CQUFtQixDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsT0FBTyxDQUFDLEtBQUs7WUFDWCxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDRCxZQUFZLENBQUMsS0FBYTtRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxXQUFXLENBQUMsS0FBYTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsVUFBVSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsVUFBVTtRQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDTyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNPLGVBQWU7UUFDckIsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQ3hCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQzNFLENBQUM7UUFDRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM1QyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDM0IsRUFDRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FDckIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsS0FBSyxFQUNILElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO2dCQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQ3JCLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBa0MsQ0FDNUQ7WUFDSCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNO1lBQ3pELEtBQUssRUFDSCxJQUFJLENBQUMsS0FBSztnQkFDVixVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXO2dCQUN2QyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJO1NBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQztRQUNoRCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUN2RSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FDM0MsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQ2hDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQ25ELENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDNUMsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsY0FBYyxLQUFLLEtBQUssQ0FBQztRQUNyRCxDQUFDLENBQUMsRUFDRixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUNmLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FDMUQsSUFBSSxDQUFDLGdCQUFnQixFQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2hDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUNsRCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMvQixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDM0csQ0FBQyxDQUFDLEVBQ0YsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksSUFBSSxXQUFXLEVBQUUsQ0FDekUsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUMvRSxDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDaEQsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUM1QyxXQUFXLENBQUMsR0FBRyxDQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLENBQ3pFLENBQ0YsRUFDRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FDakYsQ0FBQztRQUNGLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUMxQyxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDL0QsQ0FBQyxDQUFDLEVBQ0YsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FDdkUsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDbEUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDekMsQ0FBQztZQUNELE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFDTyxxQkFBcUI7UUFDM0IsTUFBTSxjQUFjLEdBQ2xCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FDcEM7YUFDRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO2FBQy9CLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNkLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSztZQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQyxDQUFDLENBQUM7UUFDTixJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxnQkFBZ0IsR0FBRztZQUN2QixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLEtBQUssRUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVO29CQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVU7b0JBQ2hDLElBQUksQ0FBQyxNQUFNO2dCQUNiLE1BQU0sRUFDSixJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVO29CQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVU7b0JBQ2hDLENBQUMsSUFBSSxDQUFDLFFBQVE7d0JBQ1osQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDcEcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNDLElBQUksRUFBRSxNQUFNO2FBQ2IsQ0FBQyxDQUFDO1NBQ0osQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNPLHVCQUF1QixDQUM3QixXQUFxQixFQUNyQixNQUFjO1FBRWQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7YUFDNUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNkLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLFFBQVEsRUFBRSxPQUFnQjtnQkFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsRUFBRSxVQUFVO2dCQUNyRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2hCLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzFDLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUM7UUFDSixDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDekcsQ0FBQztJQUNOLENBQUM7SUFDTyx3QkFBd0IsQ0FDOUIsS0FBdUMsRUFDdkMsV0FBcUIsRUFDckIsTUFBYyxFQUNkLFFBQVEsR0FBRyxJQUFJO1FBRWYsT0FBTyxLQUFLO2FBQ1QsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNkLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDdEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLFFBQVEsRUFBRSxRQUFpQjtnQkFDM0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDbkIsUUFBUSxFQUFFLFFBQVE7b0JBQ2hCLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ2xDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUs7Z0JBQ2pDLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUM7UUFDSixDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDekcsQ0FBQztJQUNOLENBQUM7SUFDTyx3QkFBd0IsQ0FDOUIsS0FBdUM7UUFFdkMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRWxELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLFVBQVUsSUFBSSxDQUFDO2dCQUNuQixLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7Z0JBQ2hELFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDN0IsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUM3QixnQkFBZ0IsRUFBRSxzQkFBc0I7Z0JBQ3hDLGdCQUFnQixFQUFFLHNCQUFzQjtnQkFDeEMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksV0FBVztnQkFDbkMsVUFBVSxFQUFFLDhCQUE4QjtnQkFDMUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO2FBQ25CLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTyx1QkFBdUIsQ0FDN0IsS0FBc0M7UUFFdEMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEQsT0FBTztnQkFDTCxFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUM7Z0JBQ2IsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFO2dCQUM3QyxXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQzFCLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDN0IsZ0JBQWdCLEVBQUUsc0JBQXNCO2dCQUN4QyxnQkFBZ0IsRUFBRSxzQkFBc0I7Z0JBQ3hDLEtBQUssRUFDSCxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLFVBQVU7b0JBQ3ZELENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDbEIsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2pCLFVBQVUsRUFBRSw4QkFBOEI7Z0JBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSzthQUNsQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ08sNkJBQTZCLENBQUMsR0FBYTtRQUNqRCxPQUFPLEdBQUc7YUFDUCxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNqRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNPLGdDQUFnQyxDQUFDLEdBQWE7UUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBQ08sc0JBQXNCLENBQUMsVUFBa0I7UUFDL0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUNsRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQ3BDLENBQUM7UUFFRixPQUFPLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBQ08seUJBQXlCLENBQUMsRUFBVTtRQUMxQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3hELENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQ3BDLENBQUM7UUFFRixPQUFPLElBQUksRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFDTyw0QkFBNEIsQ0FBQyxHQUFhO1FBQ2hELE9BQU8sR0FBRzthQUNQLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQy9DLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ08sdUJBQXVCLENBQUMsTUFBYztRQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUMvQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQ2hDLENBQUM7UUFFRixPQUFPLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBQ08sMkJBQTJCLENBQUMsRUFBVTtRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUNPLGFBQWEsQ0FBQyxNQUFnQixFQUFFLE1BQWM7UUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQ2pELENBQUM7SUFDSixDQUFDO0lBQ08sU0FBUyxDQUFDLEtBQWE7UUFDN0IsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7YUFDakIsU0FBUyxDQUFDLEtBQUssQ0FBQzthQUNoQixPQUFPLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO2FBQy9CLFdBQVcsRUFBRTthQUNiLElBQUksRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNPLG1CQUFtQixDQUFDLE1BQWdCLEVBQUUsS0FBYTtRQUN6RCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDTywrQkFBK0IsQ0FDckMsWUFBb0I7UUFFcEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQzNDLENBQUM7UUFDRixJQUFJLFlBQVksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDTyx3QkFBd0IsQ0FDOUIsTUFBc0M7UUFFdEMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFMUUsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELElBQUksa0JBQWtCLEtBQUssVUFBVSxJQUFJLGtCQUFrQixLQUFLLE1BQU0sSUFBSSxrQkFBa0IsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM3RyxPQUFPO2dCQUNMLE9BQU87Z0JBQ1AsV0FBVztnQkFDWCxjQUFjO2dCQUNkLHVCQUF1QjtnQkFDdkIsV0FBVztnQkFDWCxvQkFBb0I7Z0JBQ3BCLFNBQVM7Z0JBQ1QsT0FBTztnQkFDUCxXQUFXO2FBQ1osQ0FBQztRQUNKLENBQUM7UUFFRCxJQUNFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNuQyxrQkFBa0IsS0FBSyxNQUFNLEVBQzdCLENBQUM7WUFDRCxPQUFPO2dCQUNMLE9BQU87Z0JBQ1AsV0FBVztnQkFDWCxjQUFjO2dCQUNkLHVCQUF1QjtnQkFDdkIsV0FBVztnQkFDWCxvQkFBb0I7Z0JBQ3BCLFNBQVM7Z0JBQ1QsSUFBSTtnQkFDSixPQUFPO2dCQUNQLFdBQVc7YUFDWixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU87WUFDTCxPQUFPO1lBQ1AsV0FBVztZQUNYLFVBQVU7WUFDVixrQkFBa0I7WUFDbEIsYUFBYTtZQUNiLFdBQVc7WUFDWCxJQUFJO1lBQ0osT0FBTztZQUNQLFdBQVc7U0FDWixDQUFDO0lBQ0osQ0FBQztJQUNPLGFBQWEsQ0FBQyxLQUFjO1FBQ2xDLE9BQU87WUFDTCxRQUFRO1lBQ1IsU0FBUztZQUNULFNBQVM7WUFDVCxPQUFPO1lBQ1AsUUFBUTtZQUNSLE1BQU07WUFDTixPQUFPO1NBQ1IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ08sVUFBVSxDQUFDLEtBQWM7UUFDL0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FDdkQsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQzVCLENBQUM7SUFDSixDQUFDO0lBQ08sa0JBQWtCLENBQ3hCLEtBQWE7UUFFYixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDbEQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUMvQixDQUFDO0lBQ0osQ0FBQztJQUNPLG1CQUFtQixDQUN6QixLQUFhO1FBRWIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ25ELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FDL0IsQ0FBQztJQUNKLENBQUM7SUFDTyxpQkFBaUIsQ0FBQyxLQUFhO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLLENBQUM7SUFDdkQsQ0FBQztJQUNPLHdCQUF3QixDQUFDLEtBQWE7UUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDckUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLO2FBQ3JDLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztZQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxVQUFVO1lBQ3pDLFVBQVUsRUFBRSxLQUFLLENBQUMsS0FBSztTQUN4QixDQUFDO0lBQ0osQ0FBQztJQUNPLGdCQUFnQixDQUFDLEtBQWE7UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNuRixDQUFDO0lBQ08sa0JBQWtCLENBQUUsOERBQThEO0lBQ3hGLEtBQXVDO1FBRXZDLE1BQU0sV0FBVyxHQUNmLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztRQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLFFBQVEsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVztnQkFDekcsVUFBVSxFQUFFLFFBQVEsQ0FBQyxNQUFNLElBQUksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2xILFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVzthQUMzQyxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFFLE9BQU87WUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXO1lBQ25HLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNqSSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLO1NBQ3pDLENBQUM7SUFDSixDQUFDO0lBQ08sa0JBQWtCLENBQUMsS0FBYTtRQUN0QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ08scUJBQXFCO1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztJQUM5RSxDQUFDO0lBQ08sb0JBQW9CLENBQzFCLE1BQWMsRUFDZCxZQUFZLEdBQUcsV0FBVztRQUUxQixPQUFPLEdBQUcsTUFBTSxLQUFLLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFDTyxvQkFBb0IsQ0FDMUIsV0FBbUI7UUFFbkIsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdFLE9BQU87WUFDTCxNQUFNO1lBQ04sWUFBWSxFQUNWLFlBQVksS0FBSyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZO1NBQ3BFLENBQUM7SUFDSixDQUFDO0lBQ0QsaUJBQWlCLENBQUMsS0FBdUM7UUFDdkQsTUFBTSxXQUFXLEdBQ2YsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUUsT0FBTyxLQUFLLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN4RyxDQUFDO0lBQ08sdUJBQXVCLENBQzdCLEtBQXVDO1FBRXZDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTztZQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO1lBQ3pDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7WUFDekMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO2dCQUN0QixDQUFDLENBQUM7b0JBQ0EsWUFBWSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVc7b0JBQ2hFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO2lCQUNuRDtnQkFDRCxDQUFDLENBQUMsSUFBSTtTQUNULENBQUM7SUFDSixDQUFDO0lBQ08sc0JBQXNCO1FBRzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLEdBQUcsSUFBSTtZQUNQLFdBQVc7U0FDWixDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQzNELE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDTyw0QkFBNEI7UUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25FLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3JDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQ3pDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUM3QyxDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJO1lBQzVCLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0QsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDcEUsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBQ08sb0JBQW9CLENBQUMsS0FBYTtRQUN4QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDTyx3QkFBd0IsQ0FBQyxLQUFhO1FBQzVDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ08sNkJBQTZCLENBQUMsTUFBZ0M7UUFDcEUsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxRQUFRLElBQUksZUFBZSxFQUFFLENBQUM7WUFDakMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFDbEQsUUFBUSxDQUFDLFFBQVEsQ0FDbEIsQ0FBQztJQUNKLENBQUM7SUFDTywwQkFBMEIsQ0FBQyxLQUFhO1FBQzlDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQ2Ysc0JBQXNCLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUN4QixDQUFDO0lBQ0osQ0FBQztJQUNPLGtCQUFrQixDQUN4QixLQUFhLEVBQ2IsT0FBbUM7UUFFbkMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxLQUFLLENBQUM7SUFDckUsQ0FBQztJQUNPLHlCQUF5QixDQUFDLE1BQWdDO1FBQ2hFLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVDLE9BQU8sTUFBTSxDQUFDLGdCQUFnQixJQUFJLFdBQVcsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQ3JFLEVBQUUsQ0FBQztRQUNQLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDO0lBQ3JDLENBQUM7SUFDTyxpQkFBaUI7UUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0I7YUFDdEMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzNDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRztZQUNWLFFBQVE7WUFDUixLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9ELFFBQVEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRTtTQUMxQixDQUFDO1FBQ0YsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFDTyxhQUFhO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU87YUFDOUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3JCLE1BQU0sU0FBUyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUMzRCxPQUFPLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzNELENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDakQsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ08sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU87WUFDTCxVQUFVO1lBQ1YsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBQ08sZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU87WUFDTCxVQUFVO1lBQ1YsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7aUJBQy9ELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQUNPLGdCQUFnQixDQUFDLE1BR3hCO1FBQ0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2pGLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxPQUFPLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDbkUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUMvRSxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMvRCxDQUFDO0lBQ08sY0FBYyxDQUFDLElBQTRCO1FBQ2pELE9BQU8sUUFBUSxJQUFJLENBQUMscUJBQXFCLENBQ3ZDLElBQUksQ0FDTCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUM3RSxJQUFJLENBQUMsUUFBUSxDQUNkLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFDTyxxQkFBcUIsQ0FBQyxJQUE0QjtRQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDL0MsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDLEtBQUssQ0FDOUMsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ08sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDOUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FDdEMsRUFBRSxLQUFLLENBQUM7UUFDVCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ25FLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUMzRCxDQUFDO0lBQ08sZUFBZSxDQUFDLEtBQXVDO1FBQzdELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUMzQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDN0IsWUFBWSxFQUFFLGVBQWUsQ0FBQyxRQUFRLENBQUMsWUFBWTtnQkFDbkQsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNO2dCQUM5QixLQUFLLEVBQ0gsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksVUFBVTtvQkFDcEQsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVO29CQUMzQyxXQUFXO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDNUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdEQsQ0FBQztJQUNPLGtCQUFrQixDQUFDLElBQWdDO1FBQ3pELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDakMsT0FBTyxLQUFLO1lBQ1YsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLElBQUksUUFBUSxRQUFRLEtBQUssRUFBRTtZQUNsRCxDQUFDLENBQUMsR0FBRyxrQkFBa0IsSUFBSSxRQUFRLEdBQUcsQ0FBQztJQUMzQyxDQUFDO0lBQ08sY0FBYyxDQUFDLElBQTRCO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQ1osR0FBRyxDQUFDO0lBQ1AsQ0FBQztJQUNPLHNCQUFzQixDQUFDLEtBQWE7UUFDMUMsT0FBTyxDQUNMO1lBQ0UsTUFBTSxFQUFFLEdBQUc7WUFDWCxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FDbEIsQ0FBQztJQUNKLENBQUM7SUFDTyxnQkFBZ0IsQ0FBQyxNQUFnQztRQUN2RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztZQUM1QyxPQUFPLElBQUksTUFBTSxDQUFDLGdCQUFnQixJQUFJLFdBQVcsR0FBRyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsT0FBTyxHQUFHLEtBQUssVUFBVSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsT0FBTyxHQUFHLEtBQUssY0FBYyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ2hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQ2pFLENBQUM7WUFDRixPQUFPLEdBQUcsS0FBSyxRQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLHFCQUFxQixDQUNuRCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUNuQixRQUFRLElBQUksQ0FBQyxxQkFBcUIsQ0FDakMsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsUUFBUSxFQUNmLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDbkIsRUFBRSxDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FDOUMsTUFBTSxDQUFDLFFBQVEsQ0FDaEIsS0FBSyxNQUFNLENBQUMsYUFBYSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FDOUMsTUFBTSxDQUFDLFFBQVEsQ0FDaEIsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQ2xGLENBQUM7SUFDTyx3QkFBd0IsQ0FBQyxLQUFhO1FBQzVDLE9BQU8sQ0FDTDtZQUNFLEtBQUssRUFBRSxHQUFHO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixPQUFPLEVBQUUsR0FBRztZQUNaLFlBQVksRUFBRSxHQUFHO1lBQ2pCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixJQUFJLEVBQUUsR0FBRztZQUNULFNBQVMsRUFBRSxHQUFHO1lBQ2QsYUFBYSxFQUFFLElBQUk7WUFDbkIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixRQUFRLEVBQUUsTUFBTTtZQUNoQixnQkFBZ0IsRUFBRSxVQUFVO1lBQzVCLFdBQVcsRUFBRSxNQUFNO1lBQ25CLFNBQVMsRUFBRSxNQUFNO1NBQ2xCLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUNsQixDQUFDO0lBQ0osQ0FBQztJQUNPLHFCQUFxQixDQUMzQixXQUFtQixFQUNuQixRQUFnQixFQUNoQixLQUFjO1FBRWQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsQ0FBQztRQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckQsSUFBSSxNQUFNLEVBQUUsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sV0FBVyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDeEQsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FDdkUsUUFBUSxDQUNULEVBQUUsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ08saUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxLQUFhO1FBQ3ZELElBQUksUUFBUSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQy9CLE9BQU8sR0FBRyxLQUFLLEdBQUcsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLFFBQVEsS0FBSyxVQUFVLElBQUksUUFBUSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDL0QsT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDTyxhQUFhLENBQUMsS0FBYTtRQUNqQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUMxQyxDQUFDO0lBQ08sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDdEQsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixzQkFBc0IsRUFDdEQsUUFBUSxDQUNULENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ3RELEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsb0JBQW9CLEVBQ3BELE9BQU8sQ0FDUixDQUFDO1FBQ0YsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUNPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQ3RELEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsMEJBQTBCLEVBQzFELFFBQVEsQ0FDVCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUN0RCxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLHNCQUFzQixFQUN0RCxzQkFBc0IsQ0FDdkIsQ0FBQztRQUNGLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDTyxzQkFBc0I7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FDNUIsQ0FBQyxFQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQzlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ2xCLENBQUMsQ0FBQyxDQUNKLENBQUM7UUFDRixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ08sMkJBQTJCO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUN4QyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxDQUN6QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FDakMsQ0FBQyxFQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQ25DLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUNPLDJCQUEyQjtRQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDeEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FDOUMsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQ2pDLENBQUMsRUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUNuQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDaEMsQ0FBQztJQUNKLENBQUM7SUFDTyw4QkFBOEI7UUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDM0MsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2xELENBQUM7UUFDRixJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUNwQyxDQUFDLEVBQ0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFDdEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ2hDLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBWSxtQkFBbUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDdEUsQ0FBQztJQUNPLG1CQUFtQixDQUFDLEtBQWE7UUFDdkMsT0FBTyxLQUFLO2FBQ1QsS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUNWLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ08sa0JBQWtCLENBQUMsS0FBb0M7UUFDN0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUk7YUFDckIsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUNqQixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkIsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sS0FBSztpQkFDVCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQUM7aUJBQ3BELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNqRCxLQUFLLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDO2FBQzFCLFdBQVcsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDTyx5QkFBeUIsQ0FBQyxVQUFrQjtRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQzlELENBQUM7SUFDTyxjQUFjLENBQUMsVUFBa0IsRUFBRSxLQUFhO1FBQ3RELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QseUJBQXlCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7WUFDcEQsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hGLElBQ0UsY0FBYztZQUNkLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7aUJBQ3hFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztpQkFDekIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO1lBQ3BELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBQ08sa0JBQWtCO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztRQUMzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sTUFBTTtZQUNYLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLElBQUksTUFBTSxFQUFFO1lBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFDTyx1QkFBdUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQ08sdUJBQXVCO1FBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU87WUFDTCxZQUFZO1lBQ1osS0FBSyxFQUFFLENBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FDeEUsQ0FBQyxJQUFJLEVBQUU7U0FDVCxDQUFDO0lBQ0osQ0FBQztJQUNPLG9CQUFvQixDQUMxQixNQUFjLEVBQ2QsS0FBdUM7UUFFdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN6RCxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU07WUFDcEIsQ0FBQyxDQUFDO2dCQUNBLEdBQUcsSUFBSTtnQkFDUCxHQUFHLEtBQUs7YUFDVDtZQUNELENBQUMsQ0FBQyxJQUFJLENBQ1QsQ0FBQztJQUNKLENBQUM7SUFDTyw4QkFBOEIsQ0FDcEMsTUFBaUMsRUFDakMsU0FBdUM7UUFFdkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDekIsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxRQUFRLEdBQUc7b0JBQ2pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2lCQUNsQixDQUFDO1lBQ0osQ0FBQztZQUNELGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ08sMEJBQTBCLENBQ2hDLE1BQWlDO1FBRWpDLE9BQU8sTUFBTTthQUNWLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQ3ZELEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNkLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxXQUFXO1lBQ2hFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixLQUFLLEVBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksaURBQWlEO2dCQUNqRixJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLGlEQUFpRDtnQkFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDL0UsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBQ08sT0FBTyxDQUFDLEtBQWE7UUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFNUIsT0FBTyxLQUFLLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDdkQsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLEdBQUcsR0FBRyxLQUFLLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDekQsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDTyxnQkFBZ0IsQ0FDdEIsS0FBVSxFQUNWLFdBQWdDO1FBRWhDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFhLENBQUM7UUFDakMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNPLFdBQVcsQ0FBQyxLQUFhO1FBQy9CLE9BQU8sS0FBSzthQUNULFdBQVcsRUFBRTthQUNiLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBQ08sbUJBQW1CLENBQUMsR0FBVyxFQUFFLFFBQWdCO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sVUFBVSxJQUFJLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ2xFLENBQUM7SUFDTyxvQkFBb0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLGtCQUFrQixFQUFFLENBQUM7WUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1lBRWxFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixRQUFRLEVBQUUsV0FBVztnQkFDckIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUztnQkFDckMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtnQkFDbkMsU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsZ0JBQWdCO2FBQ2pCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLElBQUksR0FBNkI7WUFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUMvQixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRO1lBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVM7WUFDckMsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUTtZQUNuQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1NBQzFGLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU1RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUUvQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFNUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ08sNEJBQTRCO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRXpDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ08sOEJBQThCO1FBQ3BDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYTtnQkFDbkMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7aUJBQ2hFLE1BQU0sQ0FBQyxPQUFPLENBQUM7aUJBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsa0JBQWtCLEVBQ2xELFdBQVcsQ0FDWixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUNPLHdCQUF3QjtRQUM5QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN6QyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0MsWUFBWSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7WUFDdkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQztnQkFDckMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsQ0FBQyxFQUFFLDRCQUE0QixDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ08saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUNPLDRCQUE0QjtRQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLDBCQUEwQjtZQUM3QixjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDekQsQ0FBQztJQUNPLGVBQWU7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQztRQUN4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7UUFDNUQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQzlCLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUNoRCxXQUFXLENBQ29CLENBQUM7WUFDbEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUMsWUFBWTthQUNyQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1osR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDaEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEUsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN2RCxNQUFNLFVBQVUsR0FDZCxVQUFVLEdBQUcsYUFBYTtnQkFDeEIsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUMvQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRztvQkFDaEIsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUN0QixDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsQ0FBQyxDQUFDO1lBQ04sTUFBTSxRQUFRLEdBQ1osV0FBVyxHQUFHLFlBQVk7Z0JBQ3hCLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQztnQkFDaEQsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkUsT0FBTztnQkFDTCxFQUFFLEVBQUUsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xELFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDdkMsSUFBSSxFQUFFLFNBQVM7b0JBQ2IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsR0FBRyxhQUFhLEdBQUcsQ0FBQztvQkFDL0UsQ0FBQyxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSTtnQkFDakMsR0FBRyxFQUFFLFNBQVM7b0JBQ1osQ0FBQyxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRztvQkFDaEMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsR0FBRyxXQUFXLEdBQUcsQ0FBQzthQUNyRCxDQUFDO1FBQy9CLENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBNEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO3dHQTd4R1Usd0JBQXdCOzRGQUF4Qix3QkFBd0IsMmRDdlZyQywyNHRGQW93REEsZzgwQkRoOENJLFdBQVcsaWdCQUNYLGVBQWUsNEZBQ2YsZUFBZSw4U0FDZixpQkFBaUIsMEtBQ2pCLG1CQUFtQixrUUFDbkIsaUJBQWlCLGlTQUNqQixpQkFBaUIsbU1BQ2pCLGNBQWMseVFBQ2QsaUJBQWlCLHdtQkFDakIscUJBQXFCLHNKQUVyQixpQkFBaUIsbUpBQ2pCLGdCQUFnQiw0SEFDaEIsaUJBQWlCOzs0RkFNUix3QkFBd0I7a0JBdkJwQyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixtQkFBbUI7d0JBQ25CLGlCQUFpQjt3QkFDakIsaUJBQWlCO3dCQUNqQixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIscUJBQXFCO3dCQUNyQixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQixpQkFBaUI7cUJBQ2xCLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNO3FIQXdDdEMsT0FBTztzQkFBZixLQUFLO2dCQUNPLE1BQU07c0JBQWxCLEtBQUs7Z0JBWWEsWUFBWTtzQkFBOUIsTUFBTTtnQkFFWSxJQUFJO3NCQUF0QixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBRVUsaUJBQWlCO3NCQURqQyxTQUFTO3VCQUFDLG1CQUFtQjtnQkFHYixlQUFlO3NCQUQvQixZQUFZO3VCQUFDLGdCQUFnQjtnQkEwRjlCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlOztBQThvRy9CLE9BQU8sRUFBRSx3QkFBd0IsSUFBSSwyQkFBMkIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgRFlOQU1JQ19WSUVXX0JVSUxERVJfREVGQVVMVF9UQUJMRV9ST1dTIH0gZnJvbSBcIi4uLy4uL2NvcmUvY29uc3RhbnRzL2R5bmFtaWMtdmlldy1idWlsZGVyLmNvbnN0XCI7XG5pbXBvcnQgeyBERUZBVUxUX01PREFMX1pfSU5ERVggfSBmcm9tIFwiLi4vLi4vY29yZS9jb25zdGFudHMvbW9kYWwuY29uc3RcIjtcbmltcG9ydCB7IGNyZWF0ZUR5bmFtaWNWaWV3QnVpbGRlckNvbmZpZyB9IGZyb20gXCIuLi8uLi9jb3JlL2NvbmZpZy9keW5hbWljLXZpZXctYnVpbGRlci5jb25maWdcIjtcbmltcG9ydCB0eXBlIHsgQmFkZ2VDb2xvciB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL2JhZGdlLnR5cGVcIjtcbmltcG9ydCB0eXBlIHsgU2VsZWN0QnV0dG9uSXRlbSB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3NlbGVjdC1idXR0b24udHlwZVwiO1xuaW1wb3J0IHR5cGUgeyBQaWNrbGlzdFJlY29yZCB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3BpY2tsaXN0LnR5cGVcIjtcbmltcG9ydCB0eXBlIHsgVGltZWxpbmVJdGVtLCBUaW1lbGluZVN0ZXBTZWxlY3RFdmVudCB9IGZyb20gXCIuLi8uLi9jb3JlL3R5cGVzL3RpbWVsaW5lLnR5cGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgRHluYW1pY1ZpZXdCdWlsZGVyQ29sdW1uT3B0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJDb25maWcsXG4gIER5bmFtaWNWaWV3QnVpbGRlckZpZWxkLFxuICBEeW5hbWljVmlld0J1aWxkZXJGaWVsZEZ1bmN0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJGaWx0ZXIsXG4gIER5bmFtaWNWaWV3QnVpbGRlckZpbHRlckNvbm5lY3RvcixcbiAgRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyVmFsdWVUeXBlLFxuICBEeW5hbWljVmlld0J1aWxkZXJGdW5jdGlvbixcbiAgRHluYW1pY1ZpZXdCdWlsZGVySm9pbixcbiAgRHluYW1pY1ZpZXdCdWlsZGVyT3B0aW9uLFxuICBEeW5hbWljVmlld0J1aWxkZXJTb3J0LFxuICBEeW5hbWljVmlld0J1aWxkZXJUYWJsZU9wdGlvbixcbn0gZnJvbSBcIi4uLy4uL2NvcmUvdHlwZXMvZHluYW1pYy12aWV3LWJ1aWxkZXIudHlwZVwiO1xuaW1wb3J0IHR5cGUge1xuICBSb3dCYXNlLFxuICBUYWJsZUNvbHVtbixcbiAgVGFibGVPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vY29yZS90eXBlcy90YWJsZS50eXBlXCI7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29kZUVkaXRvckNvbXBvbmVudCB9IGZyb20gXCIuLi9jb2RlLWVkaXRvci9jb2RlLWVkaXRvci5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvbWJvYm94Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSW5mb1NpZ25Db21wb25lbnQgfSBmcm9tIFwiLi4vaW5mby1zaWduL2luZm8tc2lnbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IE1vZGFsQ29tcG9uZW50IH0gZnJvbSBcIi4uL21vZGFsL21vZGFsLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUGlja2xpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vcGlja2xpc3QvcGlja2xpc3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTZWxlY3RCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vc2VsZWN0LWJ1dHRvbi9zZWxlY3QtYnV0dG9uLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vdGFibGUvdGFibGUuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUZXh0YXJlYUNvbXBvbmVudCB9IGZyb20gXCIuLi90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tIFwiLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGltZWxpbmVDb21wb25lbnQgfSBmcm9tIFwiLi4vdGltZWxpbmUvdGltZWxpbmUuY29tcG9uZW50XCI7XG50eXBlIFNlbGVjdGlvbk1vZGFsTW9kZSA9IFwidGFibGVzXCIgfCBcImZpZWxkc1wiIHwgXCJncm91cEJ5XCI7XG50eXBlIEJ1aWxkZXJMYXlvdXRNb2RlID0gXCJzdGFja2VkXCIgfCBcInNwbGl0XCI7XG50eXBlIFNvdXJjZU1vZGFsU3RlcCA9IFwic2VsZWN0XCIgfCBcImNvbmZpZ3VyZVwiO1xudHlwZSBGaWVsZE1vZGFsU3RlcCA9IFwic2VsZWN0XCIgfCBcImNvbmZpZ3VyZVwiO1xudHlwZSBGaWx0ZXJNb2RhbFN0ZXAgPSBcInNlbGVjdFwiIHwgXCJjb25maWd1cmVcIiB8IFwicmV2aWV3XCI7XG50eXBlIEJ1aWxkZXJTZWN0aW9uSWQgPVxuICB8IFwidGFibGVzXCJcbiAgfCBcImpvaW5zXCJcbiAgfCBcImdyb3VwQnlcIlxuICB8IFwiZmllbGRzXCJcbiAgfCBcInNvcnRpbmdcIlxuICB8IFwiZmlsdGVyc1wiO1xudHlwZSBGaWx0ZXJNb2RhbE1vZGUgPSBcImNvbmRpdGlvblwiIHwgXCJkb21haW5cIjtcbmludGVyZmFjZSBTZWxlY3Rpb25Sb3cge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIG1ldGE6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBkYkxhYmVsPzogc3RyaW5nO1xuICB0YWJsZUxhYmVsPzogc3RyaW5nO1xuICBwYXRoVHlwZT86IFwidGFibGVcIiB8IFwiY29sdW1uXCI7XG4gIHByZWZpeD86IHN0cmluZztcbiAgbm90ZT86IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3VyY2VWaWV3SXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xuICBoYXNDdXN0b21BbGlhczogYm9vbGVhbjtcbn1cbmludGVyZmFjZSBTb3VyY2VNb2RhbERyYWZ0IHtcbiAgdGFibGU6IHN0cmluZztcbiAgYWxpYXM6IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3VyY2VDb25maWd1cmVkSXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xufVxuaW50ZXJmYWNlIEpvaW5WaWV3SXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIHNvdXJjZVRhYmxlOiBzdHJpbmc7XG4gIHNvdXJjZUZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yOiBzdHJpbmc7XG4gIHRhcmdldFRhYmxlOiBzdHJpbmc7XG4gIHRhcmdldEZpZWxkOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgU2ltcGxlVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xufVxuaW50ZXJmYWNlIEZpZWxkVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBzb3VyY2VJbmRleDogbnVtYmVyO1xuICBjb2x1bW46IHN0cmluZztcbiAgb3JkZXJMYWJlbDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBhbGlhczogc3RyaW5nO1xuICB3aWR0aDogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgZnVuY3Rpb25MYWJlbDogc3RyaW5nO1xuICBmdW5jdGlvbkFsaWFzOiBzdHJpbmc7XG4gIGhhc0N1c3RvbUNvbmZpZzogYm9vbGVhbjtcbiAgb3JkZXI6IG51bWJlcjtcbn1cbmludGVyZmFjZSBTb3J0Vmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgZnVuY3Rpb25MYWJlbDogc3RyaW5nO1xuICBkaXJlY3Rpb246IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3J0U2VsZWN0YWJsZUl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBjb2x1bW46IHN0cmluZztcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBtZXRhOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgRmlsdGVyVmlld0l0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbiAgZmllbGRMYWJlbDogc3RyaW5nO1xuICBvcGVyYXRvckxhYmVsOiBzdHJpbmc7XG4gIHN1YnRpdGxlOiBzdHJpbmc7XG4gIG9wdGlvbmFsOiBib29sZWFuO1xuICBpc0RvbWFpbjogYm9vbGVhbjtcbn1cbmludGVyZmFjZSBGaWx0ZXJSZXZpZXdJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgZW1waGFzaXplPzogXCJwYXRoXCIgfCBcImNvZGVcIiB8IFwiZGVmYXVsdFwiO1xufVxuaW50ZXJmYWNlIENvbHVtbkRpc3BsYXlQYXJ0cyB7XG4gIGRiTGFiZWw6IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBmaWVsZExhYmVsOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgVGFibGVEaXNwbGF5UGFydHMge1xuICBkYkxhYmVsOiBzdHJpbmc7XG4gIHRhYmxlTGFiZWw6IHN0cmluZztcbn1cbmludGVyZmFjZSBGaWVsZE1vZGFsQ29uZmlndXJlZEl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBjb2x1bW46IHN0cmluZztcbiAgdGFibGVMYWJlbDogc3RyaW5nO1xuICBmaWVsZExhYmVsOiBzdHJpbmc7XG4gIGFsaWFzOiBzdHJpbmc7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbkxhYmVsOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQWxpYXM6IHN0cmluZztcbn1cbmludGVyZmFjZSBCdWlsZGVyRmxvd0Fycm93IHtcbiAgaWQ6IHN0cmluZztcbiAgZGlyZWN0aW9uOiBcInJpZ2h0XCIgfCBcImRvd25cIjtcbiAgbGVmdDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbn1cbmludGVyZmFjZSBDb2x1bW5QaWNrbGlzdEl0ZW0gZXh0ZW5kcyBQaWNrbGlzdFJlY29yZCB7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4OiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4OiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4Q29sb3I6IHN0cmluZztcbiAgdGl0bGVTdWZmaXhDb2xvcjogc3RyaW5nO1xuICBiYWRnZTogc3RyaW5nO1xuICBiYWRnZUNvbG9yOiBCYWRnZUNvbG9yO1xuICBjb2x1bW46IHN0cmluZztcbn1cbmludGVyZmFjZSBTb3J0UGlja2xpc3RJdGVtIGV4dGVuZHMgUGlja2xpc3RSZWNvcmQge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB0aXRsZVByZWZpeDogc3RyaW5nO1xuICB0aXRsZVN1ZmZpeDogc3RyaW5nO1xuICB0aXRsZVByZWZpeENvbG9yOiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4Q29sb3I6IHN0cmluZztcbiAgYmFkZ2U6IHN0cmluZztcbiAgYmFkZ2VDb2xvcjogQmFkZ2VDb2xvcjtcbiAgc2VsZWN0aW9uSWQ6IHN0cmluZztcbiAgY29sdW1uOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgVGFibGVQaWNrbGlzdEl0ZW0gZXh0ZW5kcyBQaWNrbGlzdFJlY29yZCB7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4OiBzdHJpbmc7XG4gIHRpdGxlU3VmZml4OiBzdHJpbmc7XG4gIHRpdGxlUHJlZml4Q29sb3I6IHN0cmluZztcbiAgdGl0bGVTdWZmaXhDb2xvcjogc3RyaW5nO1xuICBiYWRnZTogc3RyaW5nO1xuICBiYWRnZUNvbG9yOiBCYWRnZUNvbG9yO1xuICB0YWJsZTogc3RyaW5nO1xufVxuaW50ZXJmYWNlIFByZXZpZXdDb2x1bW5MaWtlIHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGVhZGVyPzogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xufVxudHlwZSBEeW5hbWljTW9kYWxEaW1lbnNpb24gPSB7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIGhlaWdodDogc3RyaW5nO1xufTtcblxudHlwZSBEeW5hbWljTW9kYWxEaW1lbnNpb25zTWFwID0ge1xuICBzb3VyY2U6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgc2VsZWN0aW9uOiBEeW5hbWljTW9kYWxEaW1lbnNpb247XG4gIGpvaW46IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgc29ydDogRHluYW1pY01vZGFsRGltZW5zaW9uO1xuICBmaWx0ZXI6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbiAgZmllbGQ6IER5bmFtaWNNb2RhbERpbWVuc2lvbjtcbn07XG5jb25zdCBFTVBUWV9WQUxVRSA9IFwiXCI7XG5jb25zdCBERUZBVUxUX0pPSU5fT1BFUkFUT1IgPSBcIkVRVUFMU1wiO1xuY29uc3QgREVGQVVMVF9GVU5DVElPTl9OQU1FID0gXCJjb3VudFwiO1xuY29uc3QgREVGQVVMVF9TT1JUX0RJUkVDVElPTiA9IFwiQVNDXCI7XG5jb25zdCBFTVBUWV9TT1JUX0ZVTkNUSU9OID0gXCJfX2Jhc2VfX1wiO1xuY29uc3QgRkxPV19BUlJPV19JTlNFVCA9IDM7XG5jb25zdCBGTE9XX0FSUk9XX01JTl9HQVAgPSAxMjtcbmNvbnN0IEZMT1dfQVJST1dTX1JFRlJFU0hfREVMQVlfTVMgPSAxMjA7XG5jb25zdCBERUZBVUxUX0ZJTFRFUl9PUEVSQVRPUiA9IFwiRVFVQUxcIjtcbmNvbnN0IERFRkFVTFRfRklMVEVSX0NPTk5FQ1RPUjogRHluYW1pY1ZpZXdCdWlsZGVyRmlsdGVyQ29ubmVjdG9yID0gXCJBTkRcIjtcbmNvbnN0IERFRkFVTFRfRklMVEVSX1ZBTFVFX1RZUEU6IER5bmFtaWNWaWV3QnVpbGRlckZpbHRlclZhbHVlVHlwZSA9IFwidmFsdWVcIjtcbmNvbnN0IEZJTFRFUl9NT0RFX0RPTUFJTiA9IFwiZG9tYWluXCIgYXMgY29uc3Q7XG5jb25zdCBPVkVSTEFZX0FQUEVORF9UQVJHRVQgPSBcImJvZHlcIjtcbmNvbnN0IE1PREFMX1pfSU5ERVhfT0ZGU0VUID0gMjA7XG5jb25zdCBNT0RBTF9PVkVSTEFZX1pfSU5ERVggPSBERUZBVUxUX01PREFMX1pfSU5ERVggKyBNT0RBTF9aX0lOREVYX09GRlNFVDtcbmNvbnN0IEZJRUxEX1BJQ0tMSVNUX1JPV1MgPSA4O1xuY29uc3QgRklMVEVSX1BJQ0tMSVNUX1JPV1MgPSA5O1xuY29uc3QgVklTVUFMX1NRTF9UQUJMRV9DT0xPUiA9IFwiIzQyNTQ2NlwiO1xuY29uc3QgVklTVUFMX1NRTF9GSUVMRF9DT0xPUiA9IFwiIzFmOGE1MlwiO1xuY29uc3QgUElDS0xJU1RfREFUQV9UWVBFX0JBREdFX0NPTE9SOiBCYWRnZUNvbG9yID0gXCJncmF5XCI7XG5jb25zdCBQSUNLTElTVF9GVU5DVElPTl9CQURHRV9DT0xPUjogQmFkZ2VDb2xvciA9IFwiYmx1ZVwiO1xuY29uc3QgRkFMTEJBQ0tfU0VMRUNUX1RBQkxFUyA9IFwiU2VsZWNpb25hciB0YWJlbGFzXCI7XG5jb25zdCBGQUxMQkFDS19FTVBUWV9TRUxFQ1RJT04gPSBcIk5lbmh1bSBzZWxlY2lvbmFkb1wiO1xuY29uc3QgUFJFVklFV19ST1dTX1BFUl9QQUdFX09QVElPTlMgPSBbNSwgMTAsIDIwXTtcbmNvbnN0IEFMSUFTX01BWF9MRU5HVEggPSAxMjtcbmNvbnN0IE1JTl9QQVJUU19GT1JfREIgPSAzO1xuY29uc3QgREJfUEFSVFNfT0ZGU0VUID0gLTI7XG5jb25zdCBNSU5fUEFSVFNfRk9SX1RBQkxFID0gMjtcbmNvbnN0IEpPSU5fT1BFUkFUT1JfTEFCRUxTOiBSZWNvcmQ8c3RyaW5nLCB7IGtleTogc3RyaW5nOyBmYWxsYmFjazogc3RyaW5nIH0+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