@cqa-lib/cqa-ui 1.1.210 → 1.1.212
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/custom-textarea/custom-textarea.component.mjs +53 -5
- package/esm2020/lib/detail-drawer/detail-drawer.component.mjs +3 -3
- package/esm2020/lib/detail-side-panel/detail-side-panel.component.mjs +22 -6
- package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +11 -6
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +1 -1
- package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/custom-edit-step/custom-edit-step.component.mjs +1 -1
- package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.component.mjs +1 -1
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +226 -52
- package/esm2020/lib/test-case-details/test-case-details.component.mjs +34 -11
- package/esm2020/lib/test-case-details/test-case-details.models.mjs +14 -2
- package/esm2020/lib/ui-kit.module.mjs +3 -2
- package/esm2020/public-api.mjs +1 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +385 -104
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +361 -83
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/custom-textarea/custom-textarea.component.d.ts +13 -3
- package/lib/detail-side-panel/detail-side-panel.component.d.ts +11 -2
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +32 -4
- package/lib/test-case-details/test-case-details.component.d.ts +11 -3
- package/lib/test-case-details/test-case-details.models.d.ts +6 -0
- package/package.json +1 -1
- package/styles.css +1 -1
package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs
CHANGED
|
@@ -5,16 +5,19 @@ import * as i1 from "@angular/material/icon";
|
|
|
5
5
|
import * as i2 from "../../custom-textarea/custom-textarea.component";
|
|
6
6
|
import * as i3 from "../../dynamic-select/dynamic-select-field.component";
|
|
7
7
|
import * as i4 from "../../badge/badge.component";
|
|
8
|
-
import * as i5 from "../../
|
|
9
|
-
import * as i6 from "../../custom-
|
|
10
|
-
import * as i7 from "../../
|
|
11
|
-
import * as i8 from "
|
|
12
|
-
import * as i9 from "@angular/common";
|
|
8
|
+
import * as i5 from "../../custom-toggle/custom-toggle.component";
|
|
9
|
+
import * as i6 from "../../custom-input/custom-input.component";
|
|
10
|
+
import * as i7 from "../../button/button.component";
|
|
11
|
+
import * as i8 from "@angular/common";
|
|
13
12
|
/** Keys for each dynamic select in test-case-details-edit. Use these with selectConfigOverrides. */
|
|
14
13
|
export const TEST_CASE_DETAILS_SELECT_KEYS = {
|
|
15
14
|
status: 'status',
|
|
16
15
|
priority: 'priority',
|
|
16
|
+
type: 'type',
|
|
17
|
+
labels: 'labels',
|
|
17
18
|
prerequisiteCases: 'prerequisiteCases',
|
|
19
|
+
testDataProfile: 'testDataProfile',
|
|
20
|
+
testDataSet: 'testDataSet',
|
|
18
21
|
videoRecording: 'videoRecording',
|
|
19
22
|
enableAiSmartness: 'enableAiSmartness',
|
|
20
23
|
defaultAiAction: 'defaultAiAction',
|
|
@@ -38,9 +41,12 @@ const FREQUENTLY_USED_LABELS = [
|
|
|
38
41
|
'Smoke',
|
|
39
42
|
];
|
|
40
43
|
export class TestCaseDetailsEditComponent {
|
|
41
|
-
constructor() {
|
|
44
|
+
constructor(cdr) {
|
|
45
|
+
this.cdr = cdr;
|
|
42
46
|
this.descriptionTitle = 'Description';
|
|
43
47
|
this.descriptionContent = '';
|
|
48
|
+
/** When true, description uses Trix rich text editor (Bold, Italic, etc.). Host app must load Trix. */
|
|
49
|
+
this.enableMarkdown = false;
|
|
44
50
|
this.metadataItems = [];
|
|
45
51
|
this.labels = [];
|
|
46
52
|
this.configTitle = 'Configuration';
|
|
@@ -68,12 +74,13 @@ export class TestCaseDetailsEditComponent {
|
|
|
68
74
|
this.selectOpened = new EventEmitter();
|
|
69
75
|
/** Emitted when selection changes in any select. */
|
|
70
76
|
this.selectionChange = new EventEmitter();
|
|
77
|
+
/** Emitted when user adds a new custom label via the "New" option. */
|
|
78
|
+
this.labelAdded = new EventEmitter();
|
|
71
79
|
/** Form state */
|
|
72
80
|
this.editDescription = '';
|
|
73
81
|
this.editStatus = '';
|
|
74
82
|
this.editPriority = '';
|
|
75
83
|
this.editLabels = [];
|
|
76
|
-
this.labelSearch = '';
|
|
77
84
|
this.testCaseTimeout = '';
|
|
78
85
|
this.waitTimeoutLocators = '';
|
|
79
86
|
this.autoWaitEnabled = false;
|
|
@@ -92,7 +99,11 @@ export class TestCaseDetailsEditComponent {
|
|
|
92
99
|
this.editForm = new FormGroup({
|
|
93
100
|
status: new FormControl(''),
|
|
94
101
|
priority: new FormControl(''),
|
|
102
|
+
type: new FormControl(''),
|
|
103
|
+
labels: new FormControl([]),
|
|
95
104
|
prerequisiteCases: new FormControl([]),
|
|
105
|
+
testDataProfile: new FormControl(''),
|
|
106
|
+
testDataSet: new FormControl(''),
|
|
96
107
|
defaultBrowser: new FormControl(''),
|
|
97
108
|
videoRecording: new FormControl(''),
|
|
98
109
|
defaultViewport: new FormControl(''),
|
|
@@ -118,6 +129,27 @@ export class TestCaseDetailsEditComponent {
|
|
|
118
129
|
{ value: 'Blocked', name: 'Blocked' },
|
|
119
130
|
],
|
|
120
131
|
};
|
|
132
|
+
this.typeSelectConfig = {
|
|
133
|
+
key: 'type',
|
|
134
|
+
label: '',
|
|
135
|
+
placeholder: 'Type',
|
|
136
|
+
searchable: true,
|
|
137
|
+
options: [],
|
|
138
|
+
};
|
|
139
|
+
this.testDataProfileSelectConfig = {
|
|
140
|
+
key: 'testDataProfile',
|
|
141
|
+
label: '',
|
|
142
|
+
placeholder: 'Test Data Profile',
|
|
143
|
+
searchable: true,
|
|
144
|
+
options: [],
|
|
145
|
+
};
|
|
146
|
+
this.testDataSetSelectConfig = {
|
|
147
|
+
key: 'testDataSet',
|
|
148
|
+
label: '',
|
|
149
|
+
placeholder: 'Test Data Set',
|
|
150
|
+
searchable: true,
|
|
151
|
+
options: [],
|
|
152
|
+
};
|
|
121
153
|
this.defaultPrerequisiteCaseOptions = [
|
|
122
154
|
{ value: 'TC-001', name: 'TC-001: Login flow' },
|
|
123
155
|
{ value: 'TC-002', name: 'TC-002: User registration' },
|
|
@@ -147,6 +179,9 @@ export class TestCaseDetailsEditComponent {
|
|
|
147
179
|
{ value: 'Org level', name: 'Org level' },
|
|
148
180
|
],
|
|
149
181
|
};
|
|
182
|
+
/** Cached labels config to avoid new object on every CD (prevents freeze) */
|
|
183
|
+
this._labelsSelectConfigCache = null;
|
|
184
|
+
this._labelsSelectConfigDirty = true;
|
|
150
185
|
this.prerequisiteCaseSelectConfig = {
|
|
151
186
|
key: 'prerequisiteCases',
|
|
152
187
|
label: 'Prerequisite Case',
|
|
@@ -170,12 +205,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
170
205
|
placeholder: 'Select',
|
|
171
206
|
searchable: false,
|
|
172
207
|
options: [
|
|
173
|
-
{ value: '1920x1080', name: '1920x1080' },
|
|
174
|
-
{ value: '1366x768', name: '1366x768' },
|
|
175
|
-
{ value: '1536x864', name: '1536x864' },
|
|
176
208
|
{ value: '1280x720', name: '1280x720' },
|
|
177
|
-
{ value: '1440x900', name: '1440x900' },
|
|
178
|
-
{ value: '2560x1440', name: '2560x1440' },
|
|
179
209
|
],
|
|
180
210
|
};
|
|
181
211
|
this.deviceTypeSelectConfig = {
|
|
@@ -260,11 +290,10 @@ export class TestCaseDetailsEditComponent {
|
|
|
260
290
|
this.knowledgeBaseDefaultTestCaseSelectConfig = {
|
|
261
291
|
key: 'knowledgeBaseDefaultTestCase',
|
|
262
292
|
label: 'Knowledge Base Default Test Case',
|
|
263
|
-
placeholder: '
|
|
293
|
+
placeholder: 'None',
|
|
264
294
|
searchable: false,
|
|
265
295
|
options: [
|
|
266
|
-
{ value: '
|
|
267
|
-
{ value: 'Disabled', name: 'Disabled' },
|
|
296
|
+
{ value: 'none', name: 'None' },
|
|
268
297
|
],
|
|
269
298
|
};
|
|
270
299
|
/** Current labels use consistent indigo style */
|
|
@@ -281,12 +310,43 @@ export class TestCaseDetailsEditComponent {
|
|
|
281
310
|
get priorityItem() {
|
|
282
311
|
return this.metadataItems.find((m) => m.label === 'Priority');
|
|
283
312
|
}
|
|
313
|
+
get typeItem() {
|
|
314
|
+
return this.metadataItems.find((m) => m.label === 'Type');
|
|
315
|
+
}
|
|
284
316
|
get statusOptions() {
|
|
285
317
|
return ['Draft', 'In Review', 'Approved', 'Active', 'Inactive', 'Blocked'];
|
|
286
318
|
}
|
|
287
319
|
get priorityOptions() {
|
|
288
320
|
return ['Critical', 'Major', 'High', 'Medium', 'Low', 'Minor', 'Not set'];
|
|
289
321
|
}
|
|
322
|
+
/** Labels multi-select: options = frequently used + current + API options from selectConfigOverrides */
|
|
323
|
+
get labelsSelectConfig() {
|
|
324
|
+
if (!this._labelsSelectConfigDirty && this._labelsSelectConfigCache)
|
|
325
|
+
return this._labelsSelectConfigCache;
|
|
326
|
+
const override = this.selectConfigOverrides[TEST_CASE_DETAILS_SELECT_KEYS.labels];
|
|
327
|
+
const apiOptions = override?.options ?? [];
|
|
328
|
+
const allLabels = new Set([
|
|
329
|
+
...this.frequentlyUsedLabels,
|
|
330
|
+
...this.editLabels,
|
|
331
|
+
...apiOptions.map((o) => String(o.name ?? o.value ?? '').trim()).filter(Boolean),
|
|
332
|
+
]);
|
|
333
|
+
const options = Array.from(allLabels)
|
|
334
|
+
.filter(Boolean)
|
|
335
|
+
.sort((a, b) => a.localeCompare(b))
|
|
336
|
+
.map((v) => ({ value: v, name: v }));
|
|
337
|
+
this._labelsSelectConfigCache = {
|
|
338
|
+
key: 'labels',
|
|
339
|
+
label: '',
|
|
340
|
+
placeholder: 'Search labels to add ......',
|
|
341
|
+
searchable: true,
|
|
342
|
+
multiple: true,
|
|
343
|
+
optionStyle: 'checkbox',
|
|
344
|
+
allowCustomValue: true,
|
|
345
|
+
options,
|
|
346
|
+
};
|
|
347
|
+
this._labelsSelectConfigDirty = false;
|
|
348
|
+
return this._labelsSelectConfigCache;
|
|
349
|
+
}
|
|
290
350
|
/**
|
|
291
351
|
* Returns merged config for a select: base config + override.
|
|
292
352
|
* Wires onSearch, onLoadMore to both override callbacks and output events.
|
|
@@ -330,13 +390,42 @@ export class TestCaseDetailsEditComponent {
|
|
|
330
390
|
override?.onLoadMore?.(event.query);
|
|
331
391
|
}
|
|
332
392
|
onSelectionChange(event) {
|
|
393
|
+
if (event.key === TEST_CASE_DETAILS_SELECT_KEYS.labels) {
|
|
394
|
+
const val = event.value;
|
|
395
|
+
this.editLabels = Array.isArray(val) ? val.map((v) => String(v)).filter(Boolean) : val != null ? [String(val)] : [];
|
|
396
|
+
this._labelsSelectConfigDirty = true;
|
|
397
|
+
this.cdr.markForCheck();
|
|
398
|
+
}
|
|
333
399
|
this.selectionChange.emit({ key: event.key, value: event.value });
|
|
334
400
|
}
|
|
401
|
+
onLabelsAddCustomValue(event) {
|
|
402
|
+
const v = (event.value || '').trim();
|
|
403
|
+
if (!v || this.editLabels.includes(v))
|
|
404
|
+
return;
|
|
405
|
+
this.editLabels = [...this.editLabels, v];
|
|
406
|
+
this._labelsSelectConfigDirty = true;
|
|
407
|
+
this.editForm.get(TEST_CASE_DETAILS_SELECT_KEYS.labels)?.setValue(this.editLabels, { emitEvent: false });
|
|
408
|
+
this.labelAdded.emit(v);
|
|
409
|
+
this.cdr.markForCheck();
|
|
410
|
+
}
|
|
335
411
|
getConfigItemValue(sectionTitle, itemLabel) {
|
|
336
412
|
const section = [...this.configSections, ...this.configSectionsRow2].find((s) => s.title === sectionTitle);
|
|
337
413
|
const item = section?.items?.find((i) => i.label === itemLabel);
|
|
338
414
|
return item?.value ?? '';
|
|
339
415
|
}
|
|
416
|
+
/** Get value from Device section - supports both 'Device' and 'Device Setting' titles */
|
|
417
|
+
getDeviceConfigValue(itemLabel) {
|
|
418
|
+
const val = this.getConfigItemValue('Device', itemLabel) ||
|
|
419
|
+
this.getConfigItemValue('Device Setting', itemLabel);
|
|
420
|
+
return val != null && val !== '' && String(val).trim() !== '' ? String(val) : '';
|
|
421
|
+
}
|
|
422
|
+
/** Get value from Waits section - supports both 'Wait and retries' and 'Waits & Retries' titles */
|
|
423
|
+
getWaitsRetriesValue(itemLabel) {
|
|
424
|
+
const v1 = this.getConfigItemValue('Wait and retries', itemLabel);
|
|
425
|
+
const v2 = this.getConfigItemValue('Waits & Retries', itemLabel);
|
|
426
|
+
const val = (v1 !== '' && v1 != null) ? v1 : v2;
|
|
427
|
+
return val != null && val !== '' && String(val).trim() !== '' ? String(val) : '';
|
|
428
|
+
}
|
|
340
429
|
getPrerequisiteCasesFromConfig() {
|
|
341
430
|
const val = this.getConfigItemValue('Execution', 'Prerequisite Case');
|
|
342
431
|
if (!val)
|
|
@@ -347,9 +436,15 @@ export class TestCaseDetailsEditComponent {
|
|
|
347
436
|
this.editDescription = this.descriptionContent;
|
|
348
437
|
this.editStatus = this.statusItem?.value ?? '';
|
|
349
438
|
this.editPriority = this.priorityItem?.value ?? '';
|
|
439
|
+
const typeVal = (this.getConfigItemValue('Execution', 'Type') || this.typeItem?.value) ?? '';
|
|
440
|
+
const testDataProfileVal = this.getConfigItemValue('Execution', 'Test Data Profile') ?? '';
|
|
441
|
+
const testDataSetVal = this.getConfigItemValue('Execution', 'Test Data Set') ?? '';
|
|
350
442
|
this.editLabels = [...this.labels];
|
|
351
|
-
const autoWaitVal = this.getConfigItemValue('Waits & Retries', 'Auto Wait');
|
|
352
|
-
this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '');
|
|
443
|
+
const autoWaitVal = this.getWaitsRetriesValue('Enable Avoid Auto wait for steps') || this.getConfigItemValue('Waits & Retries', 'Auto Wait');
|
|
444
|
+
this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '' && String(autoWaitVal) !== 'false');
|
|
445
|
+
this.retryFailedSteps = this.getWaitsRetriesValue('Retry Failed Steps');
|
|
446
|
+
this.testCaseTimeout = this.getWaitsRetriesValue('Test Case Timeout (minutes)');
|
|
447
|
+
this.waitTimeoutLocators = this.getWaitsRetriesValue('Wait Timeout for Locators (secs)');
|
|
353
448
|
this.mobileTestingEnabled = !!this.getConfigItemValue('Key Flags', 'Mobile Testing');
|
|
354
449
|
this.extensionUseEnabled = !!this.getConfigItemValue('Key Flags', 'Extension Use');
|
|
355
450
|
this.dataDrivenEnabled = !!this.getConfigItemValue('Key Flags', 'Data Driven');
|
|
@@ -360,16 +455,21 @@ export class TestCaseDetailsEditComponent {
|
|
|
360
455
|
const useAiMetadata = this.normalizeBooleanSelectValue(useAiMetadataRaw);
|
|
361
456
|
const prerequisiteCases = this.getPrerequisiteCasesFromConfig();
|
|
362
457
|
const defaultBrowser = this.platform === 'web'
|
|
363
|
-
? this.
|
|
458
|
+
? this.getDeviceConfigValue('Default Browser') || this.getConfigItemValue('Execution', 'Default Browser')
|
|
364
459
|
: this.getConfigItemValue('Execution', 'Default Browser');
|
|
365
460
|
const videoRecordingRaw = this.getConfigItemValue('Execution', 'Video Recording');
|
|
366
461
|
const videoRecording = this.normalizeBooleanSelectValue(videoRecordingRaw);
|
|
367
|
-
const defaultViewport = this.
|
|
462
|
+
const defaultViewport = this.getDeviceConfigValue('Default Viewport') || this.getDeviceConfigValue('Viewport') || '';
|
|
368
463
|
const deviceType = this.getConfigItemValue('Device', 'Type');
|
|
369
464
|
const deviceOS = this.getConfigItemValue('Device', 'OS');
|
|
465
|
+
this._labelsSelectConfigDirty = true;
|
|
370
466
|
this.editForm.patchValue({
|
|
371
467
|
status: this.editStatus,
|
|
372
468
|
priority: this.editPriority,
|
|
469
|
+
type: typeVal || '',
|
|
470
|
+
labels: this.editLabels,
|
|
471
|
+
testDataProfile: testDataProfileVal || '',
|
|
472
|
+
testDataSet: testDataSetVal || '',
|
|
373
473
|
prerequisiteCases,
|
|
374
474
|
defaultBrowser: defaultBrowser || 'Chrome',
|
|
375
475
|
videoRecording: videoRecording || '',
|
|
@@ -378,9 +478,10 @@ export class TestCaseDetailsEditComponent {
|
|
|
378
478
|
deviceOS: deviceOS || '',
|
|
379
479
|
enableAiSmartness: enableAiSmartness || 'Advanced',
|
|
380
480
|
defaultAiAction: defaultAiAction || 'Smart wait',
|
|
381
|
-
knowledgeBaseDefaultTestCase: knowledgeBaseDefaultTestCase || '
|
|
481
|
+
knowledgeBaseDefaultTestCase: knowledgeBaseDefaultTestCase || 'none',
|
|
382
482
|
useAiMetadata: useAiMetadata || '',
|
|
383
483
|
});
|
|
484
|
+
this.cdr.markForCheck();
|
|
384
485
|
}
|
|
385
486
|
normalizeBooleanSelectValue(val) {
|
|
386
487
|
if (val === true || val === 'true')
|
|
@@ -394,14 +495,28 @@ export class TestCaseDetailsEditComponent {
|
|
|
394
495
|
return val && String(val).trim() ? String(val) : '';
|
|
395
496
|
}
|
|
396
497
|
ngOnChanges(changes) {
|
|
498
|
+
if (changes['labels'] || changes['selectConfigOverrides']) {
|
|
499
|
+
this._labelsSelectConfigDirty = true;
|
|
500
|
+
}
|
|
397
501
|
if (changes['descriptionContent'] || changes['labels'] || changes['metadataItems']) {
|
|
398
502
|
this.editDescription = this.descriptionContent;
|
|
399
503
|
this.editLabels = [...this.labels];
|
|
400
504
|
this.editStatus = this.statusItem?.value ?? '';
|
|
401
505
|
this.editPriority = this.priorityItem?.value ?? '';
|
|
506
|
+
const typeVal = (this.getConfigItemValue('Execution', 'Type') || this.typeItem?.value) ?? '';
|
|
507
|
+
const statusControl = this.editForm.get('status');
|
|
508
|
+
const priorityControl = this.editForm.get('priority');
|
|
509
|
+
const typeControl = this.editForm.get('type');
|
|
510
|
+
const labelsControl = this.editForm.get(TEST_CASE_DETAILS_SELECT_KEYS.labels);
|
|
511
|
+
const preserveStatus = statusControl?.touched || statusControl?.dirty;
|
|
512
|
+
const preservePriority = priorityControl?.touched || priorityControl?.dirty;
|
|
513
|
+
const preserveType = typeControl?.touched || typeControl?.dirty;
|
|
514
|
+
const preserveLabels = labelsControl?.touched || labelsControl?.dirty;
|
|
402
515
|
this.editForm.patchValue({
|
|
403
|
-
status: this.editStatus,
|
|
404
|
-
priority: this.editPriority,
|
|
516
|
+
...(preserveStatus ? {} : { status: this.editStatus }),
|
|
517
|
+
...(preservePriority ? {} : { priority: this.editPriority }),
|
|
518
|
+
...(preserveType ? {} : { type: typeVal }),
|
|
519
|
+
...(preserveLabels ? {} : { labels: this.editLabels }),
|
|
405
520
|
});
|
|
406
521
|
}
|
|
407
522
|
if (changes['prerequisiteCaseOptions'] && this.prerequisiteCaseOptions.length) {
|
|
@@ -415,72 +530,93 @@ export class TestCaseDetailsEditComponent {
|
|
|
415
530
|
const defaultAiAction = this.getConfigItemValue('AI Configuration', 'Default AI Action');
|
|
416
531
|
const knowledgeBaseDefaultTestCase = this.getConfigItemValue('AI Configuration', 'Knowledge Base Default Test Case');
|
|
417
532
|
const prerequisiteCases = this.getPrerequisiteCasesFromConfig();
|
|
533
|
+
const typeVal = (this.getConfigItemValue('Execution', 'Type') || this.typeItem?.value) ?? '';
|
|
534
|
+
const testDataProfileVal = this.getConfigItemValue('Execution', 'Test Data Profile') ?? '';
|
|
535
|
+
const testDataSetVal = this.getConfigItemValue('Execution', 'Test Data Set') ?? '';
|
|
418
536
|
const defaultBrowser = this.getConfigItemValue('Execution', 'Default Browser');
|
|
419
537
|
const videoRecordingRaw = this.getConfigItemValue('Execution', 'Video Recording');
|
|
420
538
|
const videoRecording = this.normalizeBooleanSelectValue(videoRecordingRaw);
|
|
421
539
|
const useAiMetadataRaw = this.getConfigItemValue('AI Configuration', 'Enable AI metadata collection');
|
|
422
540
|
const useAiMetadata = this.normalizeBooleanSelectValue(useAiMetadataRaw);
|
|
423
|
-
const defaultViewport = this.
|
|
541
|
+
const defaultViewport = this.getDeviceConfigValue('Default Viewport') || this.getDeviceConfigValue('Viewport') || '';
|
|
424
542
|
const deviceType = this.getConfigItemValue('Device', 'Type');
|
|
425
543
|
const deviceOS = this.getConfigItemValue('Device', 'OS');
|
|
426
|
-
const autoWaitVal = this.getConfigItemValue('Waits & Retries', 'Auto Wait');
|
|
427
|
-
this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '');
|
|
544
|
+
const autoWaitVal = this.getWaitsRetriesValue('Enable Avoid Auto wait for steps') || this.getConfigItemValue('Waits & Retries', 'Auto Wait');
|
|
545
|
+
this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '' && String(autoWaitVal) !== 'false');
|
|
546
|
+
this.retryFailedSteps = this.getWaitsRetriesValue('Retry Failed Steps');
|
|
547
|
+
this.testCaseTimeout = this.getWaitsRetriesValue('Test Case Timeout (minutes)');
|
|
548
|
+
this.waitTimeoutLocators = this.getWaitsRetriesValue('Wait Timeout for Locators (secs)');
|
|
428
549
|
this.mobileTestingEnabled = !!this.getConfigItemValue('Key Flags', 'Mobile Testing');
|
|
429
550
|
this.extensionUseEnabled = !!this.getConfigItemValue('Key Flags', 'Extension Use');
|
|
430
551
|
this.dataDrivenEnabled = !!this.getConfigItemValue('Key Flags', 'Data Driven');
|
|
552
|
+
this.cdr.markForCheck();
|
|
431
553
|
const patch = {};
|
|
432
554
|
if (enableAiSmartness)
|
|
433
|
-
patch
|
|
555
|
+
patch['enableAiSmartness'] = enableAiSmartness;
|
|
434
556
|
if (defaultAiAction)
|
|
435
|
-
patch
|
|
557
|
+
patch['defaultAiAction'] = defaultAiAction;
|
|
436
558
|
if (knowledgeBaseDefaultTestCase)
|
|
437
|
-
patch
|
|
559
|
+
patch['knowledgeBaseDefaultTestCase'] = knowledgeBaseDefaultTestCase;
|
|
438
560
|
if (useAiMetadata)
|
|
439
|
-
patch
|
|
561
|
+
patch['useAiMetadata'] = useAiMetadata;
|
|
440
562
|
if (prerequisiteCases.length)
|
|
441
|
-
patch
|
|
563
|
+
patch['prerequisiteCases'] = prerequisiteCases;
|
|
564
|
+
if (typeVal)
|
|
565
|
+
patch['type'] = typeVal;
|
|
566
|
+
if (testDataProfileVal)
|
|
567
|
+
patch['testDataProfile'] = testDataProfileVal;
|
|
568
|
+
if (testDataSetVal)
|
|
569
|
+
patch['testDataSet'] = testDataSetVal;
|
|
442
570
|
if (defaultBrowser)
|
|
443
|
-
patch
|
|
571
|
+
patch['defaultBrowser'] = defaultBrowser;
|
|
444
572
|
if (videoRecording)
|
|
445
|
-
patch
|
|
573
|
+
patch['videoRecording'] = videoRecording;
|
|
446
574
|
if (defaultViewport)
|
|
447
|
-
patch
|
|
575
|
+
patch['defaultViewport'] = defaultViewport;
|
|
448
576
|
if (deviceType)
|
|
449
|
-
patch
|
|
577
|
+
patch['deviceType'] = deviceType;
|
|
450
578
|
if (deviceOS)
|
|
451
|
-
patch
|
|
579
|
+
patch['deviceOS'] = deviceOS;
|
|
452
580
|
if (Object.keys(patch).length)
|
|
453
581
|
this.editForm.patchValue(patch);
|
|
454
582
|
}
|
|
455
583
|
}
|
|
456
584
|
onRemoveLabel(label) {
|
|
457
585
|
this.editLabels = this.editLabels.filter((l) => l !== label);
|
|
586
|
+
this._labelsSelectConfigDirty = true;
|
|
587
|
+
this.editForm.get(TEST_CASE_DETAILS_SELECT_KEYS.labels)?.setValue(this.editLabels, { emitEvent: false });
|
|
588
|
+
this.cdr.markForCheck();
|
|
458
589
|
}
|
|
459
590
|
onClearAllLabels() {
|
|
460
591
|
this.editLabels = [];
|
|
592
|
+
this._labelsSelectConfigDirty = true;
|
|
593
|
+
this.editForm.get(TEST_CASE_DETAILS_SELECT_KEYS.labels)?.setValue([], { emitEvent: false });
|
|
594
|
+
this.cdr.markForCheck();
|
|
461
595
|
}
|
|
462
596
|
onAddFrequentLabel(label) {
|
|
463
597
|
if (!this.editLabels.includes(label)) {
|
|
464
598
|
this.editLabels = [...this.editLabels, label];
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
const trimmed = this.labelSearch.trim();
|
|
469
|
-
if (trimmed && !this.editLabels.includes(trimmed)) {
|
|
470
|
-
this.editLabels = [...this.editLabels, trimmed];
|
|
471
|
-
this.labelSearch = '';
|
|
599
|
+
this._labelsSelectConfigDirty = true;
|
|
600
|
+
this.editForm.get(TEST_CASE_DETAILS_SELECT_KEYS.labels)?.setValue(this.editLabels, { emitEvent: false });
|
|
601
|
+
this.cdr.markForCheck();
|
|
472
602
|
}
|
|
473
603
|
}
|
|
474
604
|
onSave() {
|
|
475
605
|
const status = this.editForm.get('status')?.value ?? this.editStatus;
|
|
476
606
|
const priority = this.editForm.get('priority')?.value ?? this.editPriority;
|
|
607
|
+
const typeVal = this.editForm.get('type')?.value ?? '';
|
|
608
|
+
const testDataProfileVal = this.editForm.get('testDataProfile')?.value ?? '';
|
|
609
|
+
const testDataSetVal = this.editForm.get('testDataSet')?.value ?? '';
|
|
477
610
|
const configSectionsMerged = this.mergeConfigSections();
|
|
478
611
|
const configSectionsRow2Merged = this.mergeConfigSectionsRow2();
|
|
479
612
|
this.save.emit({
|
|
480
613
|
descriptionContent: this.editDescription,
|
|
481
614
|
status,
|
|
482
615
|
priority,
|
|
616
|
+
type: typeVal,
|
|
483
617
|
labels: this.editLabels,
|
|
618
|
+
testDataProfileId: testDataProfileVal || null,
|
|
619
|
+
testDataSetIndex: testDataSetVal ?? null,
|
|
484
620
|
configSections: configSectionsMerged,
|
|
485
621
|
configSectionsRow2: configSectionsRow2Merged,
|
|
486
622
|
});
|
|
@@ -491,11 +627,33 @@ export class TestCaseDetailsEditComponent {
|
|
|
491
627
|
const videoRecording = videoRecordingValue === 'true' ? true : videoRecordingValue === 'false' ? false : videoRecordingValue;
|
|
492
628
|
const useAiMetadataValue = this.editForm.get('useAiMetadata')?.value ?? '';
|
|
493
629
|
const useAiMetadata = useAiMetadataValue === 'true' ? true : useAiMetadataValue === 'false' ? false : useAiMetadataValue;
|
|
630
|
+
const prerequisiteCasesRaw = this.editForm.get('prerequisiteCases')?.value;
|
|
631
|
+
const prerequisiteCases = Array.isArray(prerequisiteCasesRaw)
|
|
632
|
+
? prerequisiteCasesRaw.map((v) => String(v)).filter(Boolean)
|
|
633
|
+
: prerequisiteCasesRaw != null && prerequisiteCasesRaw !== ''
|
|
634
|
+
? [String(prerequisiteCasesRaw)]
|
|
635
|
+
: [];
|
|
636
|
+
const prerequisiteCaseValue = prerequisiteCases.length ? prerequisiteCases.join(',') : null;
|
|
637
|
+
const typeValue = this.editForm.get('type')?.value ?? '';
|
|
638
|
+
const testDataProfileValue = this.editForm.get('testDataProfile')?.value ?? '';
|
|
639
|
+
const testDataSetValue = this.editForm.get('testDataSet')?.value ?? '';
|
|
494
640
|
return this.configSections.map((section) => {
|
|
495
641
|
if (section.title === 'Execution') {
|
|
496
642
|
const items = section.items
|
|
497
643
|
.filter((item) => !(platform === 'web' && item.label === 'Default Browser'))
|
|
498
|
-
.map((item) =>
|
|
644
|
+
.map((item) => {
|
|
645
|
+
if (item.label === 'Video Recording')
|
|
646
|
+
return { ...item, value: videoRecording };
|
|
647
|
+
if (item.label === 'Prerequisite Case')
|
|
648
|
+
return { ...item, value: prerequisiteCaseValue };
|
|
649
|
+
if (item.label === 'Type')
|
|
650
|
+
return { ...item, value: typeValue };
|
|
651
|
+
if (item.label === 'Test Data Profile')
|
|
652
|
+
return { ...item, value: testDataProfileValue };
|
|
653
|
+
if (item.label === 'Test Data Set')
|
|
654
|
+
return { ...item, value: testDataSetValue };
|
|
655
|
+
return item;
|
|
656
|
+
});
|
|
499
657
|
return { ...section, items };
|
|
500
658
|
}
|
|
501
659
|
if (section.title === 'AI Configuration') {
|
|
@@ -512,12 +670,24 @@ export class TestCaseDetailsEditComponent {
|
|
|
512
670
|
const deviceType = this.editForm.get('deviceType')?.value ?? '';
|
|
513
671
|
const deviceOS = this.editForm.get('deviceOS')?.value ?? '';
|
|
514
672
|
let result = this.configSectionsRow2.map((section) => {
|
|
515
|
-
if (section.title === 'Waits & Retries') {
|
|
673
|
+
if (section.title === 'Waits & Retries' || section.title === 'Wait and retries') {
|
|
516
674
|
const autoWaitValue = this.autoWaitEnabled ? 'Enabled' : '';
|
|
517
|
-
const items = section.items.map((item) =>
|
|
675
|
+
const items = section.items.map((item) => {
|
|
676
|
+
if (item.label === 'Auto Wait')
|
|
677
|
+
return { ...item, value: autoWaitValue };
|
|
678
|
+
if (item.label === 'Enable Avoid Auto wait for steps')
|
|
679
|
+
return { ...item, value: this.autoWaitEnabled };
|
|
680
|
+
if (item.label === 'Retry Failed Steps')
|
|
681
|
+
return { ...item, value: this.retryFailedSteps };
|
|
682
|
+
if (item.label === 'Test Case Timeout (minutes)')
|
|
683
|
+
return { ...item, value: this.testCaseTimeout };
|
|
684
|
+
if (item.label === 'Wait Timeout for Locators (secs)')
|
|
685
|
+
return { ...item, value: this.waitTimeoutLocators };
|
|
686
|
+
return item;
|
|
687
|
+
});
|
|
518
688
|
return { ...section, items };
|
|
519
689
|
}
|
|
520
|
-
if (section.title === 'Device') {
|
|
690
|
+
if (section.title === 'Device' || section.title === 'Device Setting') {
|
|
521
691
|
const items = [
|
|
522
692
|
...(platform === 'web'
|
|
523
693
|
? [
|
|
@@ -533,7 +703,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
533
703
|
}
|
|
534
704
|
return section;
|
|
535
705
|
});
|
|
536
|
-
const existingDevice = result.find((s) => s.title === 'Device');
|
|
706
|
+
const existingDevice = result.find((s) => s.title === 'Device' || s.title === 'Device Setting');
|
|
537
707
|
if (!existingDevice) {
|
|
538
708
|
const deviceSection = {
|
|
539
709
|
title: 'Device',
|
|
@@ -593,15 +763,17 @@ export class TestCaseDetailsEditComponent {
|
|
|
593
763
|
return this.LABEL_CHIP_STYLE.icon;
|
|
594
764
|
}
|
|
595
765
|
}
|
|
596
|
-
TestCaseDetailsEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
597
|
-
TestCaseDetailsEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: { descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", selectConfigOverrides: "selectConfigOverrides" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-py-4 cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status & Priority (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <cqa-search-bar\n [value]=\"labelSearch\"\n (valueChange)=\"labelSearch = $event\"\n (search)=\"onAddSearchedLabel()\"\n placeholder=\"Search labels to add ......\"\n [fullWidth]=\"true\">\n </cqa-search-bar>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light purple inputs) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[12px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-[16px] cqa-py-0 cqa-px-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-px-3 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-py-0 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = $event\"\n placeholder=\".\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = $event\"\n placeholder=\"25\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Wait Timeout for Locators (secs)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = $event\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <!-- Device Settings -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <ng-container *ngIf=\"platform === 'web'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"platform === 'mobile'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceType', deviceTypeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceType')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceOS', deviceOSSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceOS')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading"] }, { type: i5.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i6.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i7.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i8.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
766
|
+
TestCaseDetailsEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
767
|
+
TestCaseDetailsEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseDetailsEditComponent, selector: "cqa-test-case-details-edit", inputs: { descriptionTitle: "descriptionTitle", descriptionContent: "descriptionContent", enableMarkdown: "enableMarkdown", metadataItems: "metadataItems", labels: "labels", configTitle: "configTitle", configSections: "configSections", configSectionsRow2: "configSectionsRow2", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", selectConfigOverrides: "selectConfigOverrides" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-py-4 cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light purple inputs) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[12px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-[16px] cqa-py-0 cqa-px-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-px-3 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Prerequisite Case</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"editForm.get('testDataProfile')?.value\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-py-0 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = $event\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = $event\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Wait Timeout for Locators (secs)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = $event\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <!-- Device Settings -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <ng-container *ngIf=\"platform === 'web'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"platform === 'mobile'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceType', deviceTypeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceType')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceOS', deviceOSSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceOS')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "enableMarkdown", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused"] }, { type: i3.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i4.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
598
768
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, decorators: [{
|
|
599
769
|
type: Component,
|
|
600
|
-
args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-py-4 cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status & Priority (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <cqa-search-bar\n [value]=\"labelSearch\"\n (valueChange)=\"labelSearch = $event\"\n (search)=\"onAddSearchedLabel()\"\n placeholder=\"Search labels to add ......\"\n [fullWidth]=\"true\">\n </cqa-search-bar>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light purple inputs) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[12px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-[16px] cqa-py-0 cqa-px-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-px-3 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-py-0 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = $event\"\n placeholder=\".\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = $event\"\n placeholder=\"25\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Wait Timeout for Locators (secs)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = $event\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <!-- Device Settings -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <ng-container *ngIf=\"platform === 'web'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"platform === 'mobile'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceType', deviceTypeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceType')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceOS', deviceOSSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceOS')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg cqa-bg-[#fbfcff]\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n" }]
|
|
601
|
-
}], propDecorators: { descriptionTitle: [{
|
|
770
|
+
args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-py-4 cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg\">\n <!-- Description (Figma: document icon, textarea with light purple bg) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">description</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.6px]\">{{ descriptionTitle }}</span>\n </div>\n <cqa-custom-textarea\n [value]=\"editDescription\"\n (valueChange)=\"editDescription = $event\"\n [fullWidth]=\"true\"\n [rows]=\"4\"\n [enableMarkdown]=\"enableMarkdown\"\n placeholder=\"Enter description...\"\n textareaInlineStyle=\"padding: 12px; font-size: 12px; line-height: 100%\"\n class=\"cqa-w-full\">\n </cqa-custom-textarea>\n </div>\n\n <!-- Status, Priority & Type (Figma: side-by-side dropdowns, cqa-dynamic-select) -->\n <div class=\"cqa-grid cqa-grid-cols-2 cqa-gap-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Status</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('status', statusSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('status')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Priority</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('priority', prioritySelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('priority')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <label class=\"cqa-text-[#6B7280] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Type</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('type', typeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('type')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n\n <!-- Labels (Figma: Current Labels with Clear All, cqa-badge with x, Frequently used, Search) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between\">\n <span class=\"cqa-text-[#374151] cqa-text-[15px] cqa-leading-[19.6px] cqa-font-medium\">Current Labels ({{ editLabels.length }})</span>\n <button\n type=\"button\"\n *ngIf=\"editLabels.length > 0\"\n class=\"cqa-text-xs cqa-text-[#DC2626] hover:cqa-underline cqa-font-normal\"\n (click)=\"onClearAllLabels()\">\n Clear All\n </button>\n </div>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\" *ngIf=\"editLabels.length > 0\">\n <div\n *ngFor=\"let label of editLabels; trackBy: trackByLabel\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-px-2.5 cqa-py-1 cqa-text-xs cqa-font-medium cqa-rounded-md cqa-border\"\n [ngStyle]=\"getCurrentLabelChipStyle(label)\">\n <span>{{ label }}</span>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3.5 cqa-h-3.5 cqa-rounded hover:cqa-opacity-80 cqa-transition-opacity cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n [style.color]=\"getLabelCloseIconColor(label)\"\n (click)=\"onRemoveLabel(label)\"\n [attr.aria-label]=\"'Remove ' + label\">\n <mat-icon class=\"cqa-text-[14px] cqa-w-3.5 cqa-h-3.5\">close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Frequently used</span>\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-2\">\n <button\n *ngFor=\"let label of frequentlyUsedLabels; trackBy: trackByLabel\"\n type=\"button\"\n class=\"cqa-cursor-pointer\"\n (click)=\"onAddFrequentLabel(label)\">\n <cqa-badge\n [label]=\"label\"\n variant=\"default\"\n size=\"small\"\n backgroundColor=\"#E8E9FF\"\n textColor=\"#3F43EE\"\n borderColor=\"#E8E9FF\">\n </cqa-badge>\n </button>\n </div>\n </div>\n <label class=\"cqa-text-[#374151] cqa-text-sm cqa-leading-[19.6px] cqa-font-medium\">Add labels</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"labelsSelectConfig\"\n (searchChange)=\"onSelectSearch($event)\"\n (selectClick)=\"onSelectOpened('labels')\"\n (selectionChange)=\"onSelectionChange($event)\"\n (addCustomValue)=\"onLabelsAddCustomValue($event)\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n\n <!-- Configuration (Figma: collapsible, gear icon, light purple inputs) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[12px]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-text-left cqa-w-full\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">settings</mat-icon>\n </div>\n <span class=\"cqa-text-[#374151] cqa-text-sm cqa-font-semibold cqa-leading-[19.5px]\">{{ configTitle }}</span>\n </div>\n\n <div *ngIf=\"configExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-[16px] cqa-py-0 cqa-px-3\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5 cqa-px-3 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"executionExpanded = !executionExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">play_circle</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Execution</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ executionExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"executionExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Prerequisite Case</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('prerequisiteCases', prerequisiteCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('prerequisiteCases')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Profile</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataProfile', testDataProfileSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataProfile')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div *ngIf=\"editForm.get('testDataProfile')?.value\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Test Data Set</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('testDataSet', testDataSetSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('testDataSet')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#6B7280] cqa-text-xs cqa-font-medium\">Video Recording</label>\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('videoRecording', videoRecordingSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('videoRecording')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- AI Configuration -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-py-0 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"aiConfigExpanded = !aiConfigExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">smart_toy</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">AI Configuration</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ aiConfigExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"aiConfigExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-py-0 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('enableAiSmartness', enableAiSmartnessSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('enableAiSmartness')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultAiAction', defaultAiActionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultAiAction')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('knowledgeBaseDefaultTestCase', knowledgeBaseDefaultTestCaseSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('knowledgeBaseDefaultTestCase')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('useAiMetadata', aiMetadataCollectionSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('useAiMetadata')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </div>\n </div>\n <!-- Waits & Retries-->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"waitsRetriesExpanded = !waitsRetriesExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">timer</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Wait and Retries</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ waitsRetriesExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"waitsRetriesExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"autoWaitEnabled\" (checkedChange)=\"autoWaitEnabled = $event\" ariaLabel=\"Enable Avoid Auto wait for steps\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Enable Avoid Auto wait for steps</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = $event\"\n placeholder=\"0\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Test Case Timeout (minutes)\"\n [value]=\"testCaseTimeout\"\n (valueChange)=\"testCaseTimeout = $event\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <cqa-custom-input\n label=\"Wait Timeout for Locators (secs)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = $event\"\n placeholder=\"15\"\n [fullWidth]=\"true\"\n size=\"sm\"\n labelInlineStyle=\"font-size: 14px; line-height: 19.6px\">\n </cqa-custom-input>\n </div>\n </div>\n </div>\n <!-- Device Settings -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"deviceExpanded = !deviceExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">devices</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Device Settings</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ deviceExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"deviceExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-w-0 cqa-w-full\">\n <ng-container *ngIf=\"platform === 'web'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultBrowser', defaultBrowserSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultBrowser')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('defaultViewport', defaultViewportSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('defaultViewport')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-container *ngIf=\"platform === 'mobile'\">\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceType', deviceTypeSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceType')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n <div class=\"cqa-min-w-0 cqa-w-full\">\n <cqa-dynamic-select\n [form]=\"editForm\"\n [config]=\"getConfigForSelect('deviceOS', deviceOSSelectConfig)\"\n (searchChange)=\"onSelectSearch($event)\"\n (loadMore)=\"onSelectLoadMore($event)\"\n (selectClick)=\"onSelectOpened('deviceOS')\"\n (selectionChange)=\"onSelectionChange($event)\"\n class=\"cqa-w-full\"></cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-bg-white cqa-rounded-lg cqa-border cqa-border-[#E2E8F0]\">\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-bg-transparent cqa-border-none cqa-p-0 cqa-cursor-pointer\"\n (click)=\"keyFlagsExpanded = !keyFlagsExpanded\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div class=\"cqa-w-5 cqa-h-5 cqa-p-1 cqa-flex-shrink-0 cqa-bg-[#3F43EE1A] cqa-rounded-md cqa-inline-flex cqa-justify-center cqa-items-center\">\n <mat-icon class=\"cqa-text-[#1B1FEB] cqa-text-[12px] cqa-w-3 cqa-h-3 cqa-leading-none cqa-block\">flag</mat-icon>\n </div>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-semibold cqa-text-[#111827]\">Key Flags</span>\n </div>\n <mat-icon class=\"cqa-text-[#64748B] cqa-text-xl cqa-w-5 cqa-h-5\">\n {{ keyFlagsExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </button>\n <div *ngIf=\"keyFlagsExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"mobileTestingEnabled\" (checkedChange)=\"mobileTestingEnabled = $event\" ariaLabel=\"Mobile Testing\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Mobile Testing</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"extensionUseEnabled\" (checkedChange)=\"extensionUseEnabled = $event\" ariaLabel=\"Extension Use\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Extension Use</span>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-2.5 cqa-rounded-lg\">\n <cqa-custom-toggle [checked]=\"dataDrivenEnabled\" (checkedChange)=\"dataDrivenEnabled = $event\" ariaLabel=\"Data Driven\"></cqa-custom-toggle>\n <span class=\"cqa-text-sm cqa-leading-[19.6px] cqa-font-normal cqa-text-[#111827]\">Data Driven</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-gap-3 cqa-pt-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"outlined\"\n [text]=\"'Cancel'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n (clicked)=\"onSave()\">\n </cqa-button>\n </div>\n </div>\n</div>\n" }]
|
|
771
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { descriptionTitle: [{
|
|
602
772
|
type: Input
|
|
603
773
|
}], descriptionContent: [{
|
|
604
774
|
type: Input
|
|
775
|
+
}], enableMarkdown: [{
|
|
776
|
+
type: Input
|
|
605
777
|
}], metadataItems: [{
|
|
606
778
|
type: Input
|
|
607
779
|
}], labels: [{
|
|
@@ -630,5 +802,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
630
802
|
type: Output
|
|
631
803
|
}], selectionChange: [{
|
|
632
804
|
type: Output
|
|
805
|
+
}], labelAdded: [{
|
|
806
|
+
type: Output
|
|
633
807
|
}] } });
|
|
634
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixHQUl4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7OztBQWlDeEQsb0dBQW9HO0FBQ3BHLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHO0lBQzNDLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLDRCQUE0QixFQUFFLDhCQUE4QjtJQUM1RCxhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFVBQVU7Q0FDWixDQUFDO0FBV1gsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixNQUFNO0lBQ04sVUFBVTtJQUNWLElBQUk7SUFDSixRQUFRO0lBQ1IsWUFBWTtJQUNaLFFBQVE7SUFDUixZQUFZO0lBQ1osVUFBVTtJ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QixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTTtnQkFHRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbixcbiAgVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtLFxufSBmcm9tICcuLi90ZXN0LWNhc2UtZGV0YWlscy5tb2RlbHMnO1xuaW1wb3J0IHtcbiAgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLFxuICBTZWxlY3RPcHRpb24sXG59IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5cbi8qKiBPdmVycmlkZSBjb25maWcgZm9yIGEgc3BlY2lmaWMgc2VsZWN0LiBVc2UgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCwgbG9hZCBtb3JlLCBjdXN0b20gb3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0Q29uZmlnT3ZlcnJpZGUge1xuICAvKiogUmVwbGFjZSBvcHRpb25zIChlLmcuIGZyb20gQVBJKS4gVXBkYXRlIHdoZW4gQVBJIHJldHVybnMuICovXG4gIG9wdGlvbnM/OiBTZWxlY3RPcHRpb25bXTtcbiAgLyoqIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2g7IGNvbXBvbmVudCBlbWl0cyBzZWxlY3RTZWFyY2ggaW5zdGVhZCBvZiBsb2NhbCBmaWx0ZXJpbmcuICovXG4gIHNlcnZlclNlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBJbmRpY2F0ZXMgbW9yZSByZXN1bHRzIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsLiAqL1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgLyoqIExvYWRpbmcgc3RhdGUgKGUuZy4gZHVyaW5nIEFQSSBjYWxsKS4gKi9cbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2ggaW5wdXQgaW4gdGhlIHNlbGVjdC4gKi9cbiAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIHRyaWdnZXJzIGluaXRpYWwgc2VhcmNoIG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlKS4gKi9cbiAgaW5pdGlhbEZldGNoT25PcGVuPzogYm9vbGVhbjtcbiAgLyoqIENhbGxiYWNrIHdoZW4gdXNlciB0eXBlcyBpbiBzZWFyY2guIENhbGwgQVBJLCB0aGVuIHVwZGF0ZSBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUuIENhbGwgQVBJLCBhcHBlbmQgb3B0aW9ucyB2aWEgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuICBvbkxvYWRNb3JlPzogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKiogTWFwIG9mIHNlbGVjdCBrZXkgLT4gY29uZmlnIG92ZXJyaWRlLiBFbmFibGVzIEFQSS1kcml2ZW4gb3B0aW9ucywgaW5maW5pdGUgc2VhcmNoLCBsb2FkIG1vcmUuICovXG5leHBvcnQgdHlwZSBTZWxlY3RDb25maWdPdmVycmlkZXMgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIFNlbGVjdENvbmZpZ092ZXJyaWRlPj47XG5cbi8qKiBLZXlzIGZvciBlYWNoIGR5bmFtaWMgc2VsZWN0IGluIHRlc3QtY2FzZS1kZXRhaWxzLWVkaXQuIFVzZSB0aGVzZSB3aXRoIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbmV4cG9ydCBjb25zdCBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUyA9IHtcbiAgc3RhdHVzOiAnc3RhdHVzJyxcbiAgcHJpb3JpdHk6ICdwcmlvcml0eScsXG4gIHByZXJlcXVpc2l0ZUNhc2VzOiAncHJlcmVxdWlzaXRlQ2FzZXMnLFxuICB2aWRlb1JlY29yZGluZzogJ3ZpZGVvUmVjb3JkaW5nJyxcbiAgZW5hYmxlQWlTbWFydG5lc3M6ICdlbmFibGVBaVNtYXJ0bmVzcycsXG4gIGRlZmF1bHRBaUFjdGlvbjogJ2RlZmF1bHRBaUFjdGlvbicsXG4gIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6ICdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyxcbiAgdXNlQWlNZXRhZGF0YTogJ3VzZUFpTWV0YWRhdGEnLFxuICBkZWZhdWx0QnJvd3NlcjogJ2RlZmF1bHRCcm93c2VyJyxcbiAgZGVmYXVsdFZpZXdwb3J0OiAnZGVmYXVsdFZpZXdwb3J0JyxcbiAgZGV2aWNlVHlwZTogJ2RldmljZVR5cGUnLFxuICBkZXZpY2VPUzogJ2RldmljZU9TJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhIHtcbiAgZGVzY3JpcHRpb25Db250ZW50OiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBwcmlvcml0eTogc3RyaW5nO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBjb25maWdTZWN0aW9uczogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdO1xuICBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXTtcbn1cblxuY29uc3QgRlJFUVVFTlRMWV9VU0VEX0xBQkVMUyA9IFtcbiAgJ0Nhc2UnLFxuICAnQ3JpdGljYWwnLFxuICAnUE8nLFxuICAnVXBsb2FkJyxcbiAgJ1ZhbGlkYXRpb24nLFxuICAnUmV2aWV3JyxcbiAgJ0VkZ2UtY2FzZXMnLFxuICAnU2VjdXJpdHknLFxuICAnSW50ZWdyYXRpb24nLFxuICAnU21va2UnLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZURldGFpbHNFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRpdGxlID0gJ0Rlc2NyaXB0aW9uJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25Db250ZW50ID0gJyc7XG4gIEBJbnB1dCgpIG1ldGFkYXRhSXRlbXM6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbVtdID0gW107XG4gIEBJbnB1dCgpIGxhYmVsczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgY29uZmlnVGl0bGUgPSAnQ29uZmlndXJhdGlvbic7XG4gIEBJbnB1dCgpIGNvbmZpZ1NlY3Rpb25zOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnNSb3cyOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10gPSBbXTtcbiAgLyoqIE9wdGlvbmFsIGxpc3Qgb2YgcHJlcmVxdWlzaXRlIHRlc3QgY2FzZSBvcHRpb25zIGZvciB0aGUgbXVsdGktc2VsZWN0LiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgZGVmYXVsdCBzYW1wbGUgb3B0aW9ucy4gKi9cbiAgQElucHV0KCkgcHJlcmVxdWlzaXRlQ2FzZU9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogUGxhdGZvcm06ICd3ZWInIHNob3dzIERlZmF1bHQgQnJvd3NlciArIFZpZXdwb3J0OyAnbW9iaWxlJyBzaG93cyBEZXZpY2UgVHlwZSArIE9TLiBEZWZhdWx0cyB0byAnd2ViJy4gKi9cbiAgQElucHV0KCkgcGxhdGZvcm06ICd3ZWInIHwgJ21vYmlsZScgPSAnd2ViJztcblxuICAvKipcbiAgICogT3ZlcnJpZGUgY29uZmlnIHBlciBzZWxlY3Qga2V5LiBVc2UgZm9yOlxuICAgKiAtIEFQSS1kcml2ZW4gb3B0aW9uczogcGFzcyBvcHRpb25zIGFycmF5ICh1cGRhdGUgd2hlbiBBUEkgcmV0dXJucylcbiAgICogLSBTZXJ2ZXItc2lkZSBzZWFyY2g6IHNlcnZlclNlYXJjaDogdHJ1ZSwgb25TZWFyY2ggaW4gb3ZlcnJpZGUgb3IgbGlzdGVuIHRvIHNlbGVjdFNlYXJjaFxuICAgKiAtIEluZmluaXRlIHNjcm9sbDogaGFzTW9yZTogdHJ1ZSwgb25Mb2FkTW9yZSBpbiBvdmVycmlkZSBvciBsaXN0ZW4gdG8gc2VsZWN0TG9hZE1vcmVcbiAgICogLSBJbml0aWFsIGZldGNoIG9uIG9wZW46IGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzOiBTZWxlY3RDb25maWdPdmVycmlkZXMgPSB7fTtcblxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzZWFyY2hlcyBpbiBhIHNlbGVjdCAoc2VydmVyU2VhcmNoIG1vZGUpLiBDYWxsIEFQSSBhbmQgdXBkYXRlIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZS4gQ2FsbCBBUEksIGFwcGVuZCB0byBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RMb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWxlY3QgcGFuZWwgaXMgb3BlbmVkLiBVc2UgdG8gY2FsbCBBUEkgZm9yIGluaXRpYWwgbG9hZCAoZS5nLiB3aGVuIGluaXRpYWxGZXRjaE9uT3BlbikuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmcgfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzIGluIGFueSBzZWxlY3QuICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0+KCk7XG5cbiAgLyoqIEZvcm0gc3RhdGUgKi9cbiAgZWRpdERlc2NyaXB0aW9uID0gJyc7XG4gIGVkaXRTdGF0dXMgPSAnJztcbiAgZWRpdFByaW9yaXR5ID0gJyc7XG4gIGVkaXRMYWJlbHM6IHN0cmluZ1tdID0gW107XG4gIGxhYmVsU2VhcmNoID0gJyc7XG4gIHRlc3RDYXNlVGltZW91dCA9ICcnO1xuICB3YWl0VGltZW91dExvY2F0b3JzID0gJyc7XG4gIGF1dG9XYWl0RW5hYmxlZCA9IGZhbHNlO1xuICByZXRyeUZhaWxlZFN0ZXBzID0gJyc7XG4gIGNvbmZpZ0V4cGFuZGVkID0gdHJ1ZTtcbiAgZXhlY3V0aW9uRXhwYW5kZWQgPSB0cnVlO1xuICBhaUNvbmZpZ0V4cGFuZGVkID0gdHJ1ZTtcbiAgd2FpdHNSZXRyaWVzRXhwYW5kZWQgPSB0cnVlO1xuICBkZXZpY2VFeHBhbmRlZCA9IHRydWU7XG4gIGtleUZsYWdzRXhwYW5kZWQgPSB0cnVlO1xuICBtb2JpbGVUZXN0aW5nRW5hYmxlZCA9IGZhbHNlO1xuICBleHRlbnNpb25Vc2VFbmFibGVkID0gZmFsc2U7XG4gIGRhdGFEcml2ZW5FbmFibGVkID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZnJlcXVlbnRseVVzZWRMYWJlbHMgPSBGUkVRVUVOVExZX1VTRURfTEFCRUxTO1xuXG4gIC8qKiBGb3JtR3JvdXAgZm9yIGNxYS1keW5hbWljLXNlbGVjdCBiaW5kaW5ncyAqL1xuICBlZGl0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXR1czogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBwcmlvcml0eTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBwcmVyZXF1aXNpdGVDYXNlczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICBkZWZhdWx0QnJvd3NlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB2aWRlb1JlY29yZGluZzogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZWZhdWx0Vmlld3BvcnQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGV2aWNlVHlwZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZXZpY2VPUzogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBlbmFibGVBaVNtYXJ0bmVzczogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZWZhdWx0QWlBY3Rpb246IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB1c2VBaU1ldGFkYXRhOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICB9KTtcblxuICBnZXQgc3RhdHVzSXRlbSgpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSXRlbXMuZmluZCgobSkgPT4gbS5sYWJlbCA9PT0gJ1N0YXR1cycpO1xuICB9XG5cbiAgZ2V0IHByaW9yaXR5SXRlbSgpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSXRlbXMuZmluZCgobSkgPT4gbS5sYWJlbCA9PT0gJ1ByaW9yaXR5Jyk7XG4gIH1cblxuICBnZXQgc3RhdHVzT3B0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnRHJhZnQnLCAnSW4gUmV2aWV3JywgJ0FwcHJvdmVkJywgJ0FjdGl2ZScsICdJbmFjdGl2ZScsICdCbG9ja2VkJ107XG4gIH1cblxuICBnZXQgcHJpb3JpdHlPcHRpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydDcml0aWNhbCcsICdNYWpvcicsICdIaWdoJywgJ01lZGl1bScsICdMb3cnLCAnTWlub3InLCAnTm90IHNldCddO1xuICB9XG5cbiAgLyoqIENhY2hlZCBjb25maWdzIHRvIGF2b2lkIG5ldyBvYmplY3QgcmVmcyBlYWNoIGNoYW5nZSBkZXRlY3Rpb24gKHByZXZlbnRzIGluZmluaXRlIGxvb3BzKSAqL1xuICByZWFkb25seSBzdGF0dXNTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdzdGF0dXMnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1N0YXR1cycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ0RyYWZ0JywgbmFtZTogJ0RyYWZ0JyB9LFxuICAgICAgeyB2YWx1ZTogJ0luIFJldmlldycsIG5hbWU6ICdJbiBSZXZpZXcnIH0sXG4gICAgICB7IHZhbHVlOiAnQXBwcm92ZWQnLCBuYW1lOiAnQXBwcm92ZWQnIH0sXG4gICAgICB7IHZhbHVlOiAnQWN0aXZlJywgbmFtZTogJ0FjdGl2ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdJbmFjdGl2ZScsIG5hbWU6ICdJbmFjdGl2ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdCbG9ja2VkJywgbmFtZTogJ0Jsb2NrZWQnIH0sXG4gICAgXSxcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRQcmVyZXF1aXNpdGVDYXNlT3B0aW9ucyA9IFtcbiAgICB7IHZhbHVlOiAnVEMtMDAxJywgbmFtZTogJ1RDLTAwMTogTG9naW4gZmxvdycgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDAyJywgbmFtZTogJ1RDLTAwMjogVXNlciByZWdpc3RyYXRpb24nIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwMycsIG5hbWU6ICdUQy0wMDM6IFBhc3N3b3JkIHJlc2V0JyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDQnLCBuYW1lOiAnVEMtMDA0OiBEYXNoYm9hcmQgbG9hZCcgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDA1JywgbmFtZTogJ1RDLTAwNTogQVBJIGhlYWx0aCBjaGVjaycgfSxcbiAgXTtcblxuICByZWFkb25seSB2aWRlb1JlY29yZGluZ1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZpZGVvUmVjb3JkaW5nJyxcbiAgICBsYWJlbDogJ1JlY29yZCB0ZXN0IGV4ZWN1dGlvbiB2aWRlbycsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICd0cnVlJywgbmFtZTogJ1RydWUnIH0sXG4gICAgICB7IHZhbHVlOiAnZmFsc2UnLCBuYW1lOiAnRmFsc2UnIH0sXG4gICAgICB7IHZhbHVlOiAnT3JnIGxldmVsJywgbmFtZTogJ09yZyBsZXZlbCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGFpTWV0YWRhdGFDb2xsZWN0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndXNlQWlNZXRhZGF0YScsXG4gICAgbGFiZWw6ICdFbmFibGUgQUkgbWV0YWRhdGEgY29sbGVjdGlvbicsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICd0cnVlJywgbmFtZTogJ1RydWUnIH0sXG4gICAgICB7IHZhbHVlOiAnZmFsc2UnLCBuYW1lOiAnRmFsc2UnIH0sXG4gICAgICB7IHZhbHVlOiAnT3JnIGxldmVsJywgbmFtZTogJ09yZyBsZXZlbCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHByZXJlcXVpc2l0ZUNhc2VTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdwcmVyZXF1aXNpdGVDYXNlcycsXG4gICAgbGFiZWw6ICdQcmVyZXF1aXNpdGUgQ2FzZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgb3B0aW9uU3R5bGU6ICdjaGVja2JveCcsXG4gICAgc2hvd1NlbGVjdEFsbDogdHJ1ZSxcbiAgICBzZWxlY3RBbGxMYWJlbDogJ0FsbCcsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ1RDLTAwMScsIG5hbWU6ICdUQy0wMDE6IExvZ2luIGZsb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDAyJywgbmFtZTogJ1RDLTAwMjogVXNlciByZWdpc3RyYXRpb24nIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDAzJywgbmFtZTogJ1RDLTAwMzogUGFzc3dvcmQgcmVzZXQnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDA0JywgbmFtZTogJ1RDLTAwNDogRGFzaGJvYXJkIGxvYWQnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDA1JywgbmFtZTogJ1RDLTAwNTogQVBJIGhlYWx0aCBjaGVjaycgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRlZmF1bHRWaWV3cG9ydFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRWaWV3cG9ydCcsXG4gICAgbGFiZWw6ICdEZWZhdWx0IFZpZXdwb3J0JyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJzE5MjB4MTA4MCcsIG5hbWU6ICcxOTIweDEwODAnIH0sXG4gICAgICB7IHZhbHVlOiAnMTM2Nng3NjgnLCBuYW1lOiAnMTM2Nng3NjgnIH0sXG4gICAgICB7IHZhbHVlOiAnMTUzNng4NjQnLCBuYW1lOiAnMTUzNng4NjQnIH0sXG4gICAgICB7IHZhbHVlOiAnMTI4MHg3MjAnLCBuYW1lOiAnMTI4MHg3MjAnIH0sXG4gICAgICB7IHZhbHVlOiAnMTQ0MHg5MDAnLCBuYW1lOiAnMTQ0MHg5MDAnIH0sXG4gICAgICB7IHZhbHVlOiAnMjU2MHgxNDQwJywgbmFtZTogJzI1NjB4MTQ0MCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRldmljZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZXZpY2VUeXBlJyxcbiAgICBsYWJlbDogJ0RldmljZSBUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lQaG9uZSAxNCcsIG5hbWU6ICdpUGhvbmUgMTQnIH0sXG4gICAgICB7IHZhbHVlOiAnaVBob25lIDE1JywgbmFtZTogJ2lQaG9uZSAxNScgfSxcbiAgICAgIHsgdmFsdWU6ICdpUGhvbmUgMTcnLCBuYW1lOiAnaVBob25lIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0lwaG9uZSAxNycsIG5hbWU6ICdJcGhvbmUgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnU2Ftc3VuZyBHYWxheHknLCBuYW1lOiAnU2Ftc3VuZyBHYWxheHknIH0sXG4gICAgICB7IHZhbHVlOiAnUGl4ZWwnLCBuYW1lOiAnUGl4ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZXZpY2VPU1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RldmljZU9TJyxcbiAgICBsYWJlbDogJ09TJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lwYScsIG5hbWU6ICdpT1MgKGlwYSknIH0sXG4gICAgICB7IHZhbHVlOiAnYXBrJywgbmFtZTogJ0FuZHJvaWQgKGFwayknIH0sXG4gICAgICB7IHZhbHVlOiAnaU9TIDE2JywgbmFtZTogJ2lPUyAxNicgfSxcbiAgICAgIHsgdmFsdWU6ICdpT1MgMTcnLCBuYW1lOiAnaU9TIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FuZHJvaWQgMTMnLCBuYW1lOiAnQW5kcm9pZCAxMycgfSxcbiAgICAgIHsgdmFsdWU6ICdBbmRyb2lkIDE0JywgbmFtZTogJ0FuZHJvaWQgMTQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRCcm93c2VyJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsXG4gICAgcGxhY2Vob2xkZXI6ICdDaHJvbWUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdDaHJvbWUnLCBuYW1lOiAnQ2hyb21lJyB9LFxuICAgICAgeyB2YWx1ZTogJ0ZpcmVmb3gnLCBuYW1lOiAnRmlyZWZveCcgfSxcbiAgICAgIHsgdmFsdWU6ICdTYWZhcmknLCBuYW1lOiAnU2FmYXJpJyB9LFxuICAgICAgeyB2YWx1ZTogJ0VkZ2UnLCBuYW1lOiAnRWRnZScgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHByaW9yaXR5U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJpb3JpdHknLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1ByaW9yaXR5JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnQ3JpdGljYWwnLCBuYW1lOiAnQ3JpdGljYWwnIH0sXG4gICAgICB7IHZhbHVlOiAnTWFqb3InLCBuYW1lOiAnTWFqb3InIH0sXG4gICAgICB7IHZhbHVlOiAnSGlnaCcsIG5hbWU6ICdIaWdoJyB9LFxuICAgICAgeyB2YWx1ZTogJ01lZGl1bScsIG5hbWU6ICdNZWRpdW0nIH0sXG4gICAgICB7IHZhbHVlOiAnTG93JywgbmFtZTogJ0xvdycgfSxcbiAgICAgIHsgdmFsdWU6ICdNaW5vcicsIG5hbWU6ICdNaW5vcicgfSxcbiAgICAgIHsgdmFsdWU6ICdOb3Qgc2V0JywgbmFtZTogJ05vdCBzZXQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBlbmFibGVBaVNtYXJ0bmVzc1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBTbWFydG5lc3MnLFxuICAgIHBsYWNlaG9sZGVyOiAnQWR2YW5jZWQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdCYXNpYycsIG5hbWU6ICdCYXNpYycgfSxcbiAgICAgIHsgdmFsdWU6ICdBZHZhbmNlZCcsIG5hbWU6ICdBZHZhbmNlZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdPZmYnLCBuYW1lOiAnT2ZmJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQUkgQWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NtYXJ0IHdhaXQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdTbWFydCB3YWl0JywgbmFtZTogJ1NtYXJ0IHdhaXQnIH0sXG4gICAgICB7IHZhbHVlOiAnU21hcnQgV2FpdCcsIG5hbWU6ICdTbWFydCBXYWl0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1dhaXQgZm9yIGVsZW1lbnQnLCBuYW1lOiAnV2FpdCBmb3IgZWxlbWVudCcgfSxcbiAgICAgIHsgdmFsdWU6ICdSZXRyeScsIG5hbWU6ICdSZXRyeScgfSxcbiAgICAgIHsgdmFsdWU6ICdTa2lwJywgbmFtZTogJ1NraXAnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScsXG4gICAgbGFiZWw6ICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdFbmFibGVkJywgbmFtZTogJ0VuYWJsZWQnIH0sXG4gICAgICB7IHZhbHVlOiAnRGlzYWJsZWQnLCBuYW1lOiAnRGlzYWJsZWQnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBtZXJnZWQgY29uZmlnIGZvciBhIHNlbGVjdDogYmFzZSBjb25maWcgKyBvdmVycmlkZS5cbiAgICogV2lyZXMgb25TZWFyY2gsIG9uTG9hZE1vcmUgdG8gYm90aCBvdmVycmlkZSBjYWxsYmFja3MgYW5kIG91dHB1dCBldmVudHMuXG4gICAqL1xuICBnZXRDb25maWdGb3JTZWxlY3Qoa2V5OiBzdHJpbmcsIGJhc2VDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uW2tleV07XG4gICAgaWYgKCFvdmVycmlkZSkgcmV0dXJuIGJhc2VDb25maWc7XG5cbiAgICBjb25zdCBtZXJnZWQ6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIC4uLmJhc2VDb25maWcsXG4gICAgICAuLi5vdmVycmlkZSxcbiAgICAgIG9wdGlvbnM6IG92ZXJyaWRlLm9wdGlvbnMgPz8gYmFzZUNvbmZpZy5vcHRpb25zLFxuICAgICAga2V5OiBiYXNlQ29uZmlnLmtleSxcbiAgICB9O1xuXG4gICAgaWYgKG92ZXJyaWRlLnNlcnZlclNlYXJjaCB8fCBvdmVycmlkZS5vblNlYXJjaCkge1xuICAgICAgbWVyZ2VkLm9uU2VhcmNoID0gKHF1ZXJ5KSA9PiB7XG4gICAgICAgIG92ZXJyaWRlLm9uU2VhcmNoPy4ocXVlcnkpO1xuICAgICAgICB0aGlzLnNlbGVjdFNlYXJjaC5lbWl0KHsga2V5LCBxdWVyeSB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdmVycmlkZS5oYXNNb3JlIHx8IG92ZXJyaWRlLm9uTG9hZE1vcmUpIHtcbiAgICAgIG1lcmdlZC5vbkxvYWRNb3JlID0gKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyAnJztcbiAgICAgICAgb3ZlcnJpZGUub25Mb2FkTW9yZT8uKHEpO1xuICAgICAgICB0aGlzLnNlbGVjdExvYWRNb3JlLmVtaXQoeyBrZXksIHF1ZXJ5OiBxIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgb25TZWxlY3RPcGVuZWQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdE9wZW5lZC5lbWl0KHsga2V5IH0pO1xuICB9XG5cbiAgb25TZWxlY3RTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0U2VhcmNoLmVtaXQoZXZlbnQpO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltldmVudC5rZXldO1xuICAgIG92ZXJyaWRlPy5vblNlYXJjaD8uKGV2ZW50LnF1ZXJ5KTtcbiAgfVxuXG4gIG9uU2VsZWN0TG9hZE1vcmUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0TG9hZE1vcmUuZW1pdChldmVudCk7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uW2V2ZW50LmtleV07XG4gICAgb3ZlcnJpZGU/Lm9uTG9hZE1vcmU/LihldmVudC5xdWVyeSk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBrZXk6IGV2ZW50LmtleSwgdmFsdWU6IGV2ZW50LnZhbHVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWdJdGVtVmFsdWUoc2VjdGlvblRpdGxlOiBzdHJpbmcsIGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWN0aW9uID0gWy4uLnRoaXMuY29uZmlnU2VjdGlvbnMsIC4uLnRoaXMuY29uZmlnU2VjdGlvbnNSb3cyXS5maW5kKFxuICAgICAgKHMpID0+IHMudGl0bGUgPT09IHNlY3Rpb25UaXRsZVxuICAgICk7XG4gICAgY29uc3QgaXRlbSA9IHNlY3Rpb24/Lml0ZW1zPy5maW5kKChpKSA9PiBpLmxhYmVsID09PSBpdGVtTGFiZWwpO1xuICAgIHJldHVybiAoaXRlbT8udmFsdWUgYXMgc3RyaW5nKSA/PyAnJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJlcmVxdWlzaXRlQ2FzZXNGcm9tQ29uZmlnKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1ByZXJlcXVpc2l0ZSBDYXNlJyk7XG4gICAgaWYgKCF2YWwpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdmFsLmluY2x1ZGVzKCcsJykgPyB2YWwuc3BsaXQoJywnKS5tYXAoKHMpID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbdmFsXTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQ7XG4gICAgdGhpcy5lZGl0U3RhdHVzID0gdGhpcy5zdGF0dXNJdGVtPy52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5sYWJlbHNdO1xuICAgIGNvbnN0IGF1dG9XYWl0VmFsID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsICdBdXRvIFdhaXQnKTtcbiAgICB0aGlzLmF1dG9XYWl0RW5hYmxlZCA9ICEhKGF1dG9XYWl0VmFsICYmIGF1dG9XYWl0VmFsLnRyaW0oKSAhPT0gJycpO1xuICAgIHRoaXMubW9iaWxlVGVzdGluZ0VuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnTW9iaWxlIFRlc3RpbmcnKTtcbiAgICB0aGlzLmV4dGVuc2lvblVzZUVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRXh0ZW5zaW9uIFVzZScpO1xuICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICBjb25zdCBlbmFibGVBaVNtYXJ0bmVzcyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBTbWFydG5lc3MnKTtcbiAgICBjb25zdCBkZWZhdWx0QWlBY3Rpb24gPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdEZWZhdWx0IEFJIEFjdGlvbicpO1xuICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScpO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGFSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgbWV0YWRhdGEgY29sbGVjdGlvbicpO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh1c2VBaU1ldGFkYXRhUmF3KTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IHRoaXMuZ2V0UHJlcmVxdWlzaXRlQ2FzZXNGcm9tQ29uZmlnKCk7XG4gICAgY29uc3QgZGVmYXVsdEJyb3dzZXIgPVxuICAgICAgdGhpcy5wbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgPyB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ0RlZmF1bHQgQnJvd3NlcicpIHx8IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJylcbiAgICAgICAgOiB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ0RlZmF1bHQgQnJvd3NlcicpO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdWaWRlbyBSZWNvcmRpbmcnKTtcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZpZGVvUmVjb3JkaW5nUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnRGVmYXVsdCBWaWV3cG9ydCcpIHx8IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnVmlld3BvcnQnKSB8fCAnJztcbiAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdUeXBlJyk7XG4gICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIHN0YXR1czogdGhpcy5lZGl0U3RhdHVzLFxuICAgICAgcHJpb3JpdHk6IHRoaXMuZWRpdFByaW9yaXR5LFxuICAgICAgcHJlcmVxdWlzaXRlQ2FzZXMsXG4gICAgICBkZWZhdWx0QnJvd3NlcjogZGVmYXVsdEJyb3dzZXIgfHwgJ0Nocm9tZScsXG4gICAgICB2aWRlb1JlY29yZGluZzogdmlkZW9SZWNvcmRpbmcgfHwgJycsXG4gICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCB8fCAnJyxcbiAgICAgIGRldmljZVR5cGU6IGRldmljZVR5cGUgfHwgJycsXG4gICAgICBkZXZpY2VPUzogZGV2aWNlT1MgfHwgJycsXG4gICAgICBlbmFibGVBaVNtYXJ0bmVzczogZW5hYmxlQWlTbWFydG5lc3MgfHwgJ0FkdmFuY2VkJyxcbiAgICAgIGRlZmF1bHRBaUFjdGlvbjogZGVmYXVsdEFpQWN0aW9uIHx8ICdTbWFydCB3YWl0JyxcbiAgICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgfHwgJ0VuYWJsZWQnLFxuICAgICAgdXNlQWlNZXRhZGF0YTogdXNlQWlNZXRhZGF0YSB8fCAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZhbDogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09ICd0cnVlJykgcmV0dXJuICd0cnVlJztcbiAgICBpZiAodmFsID09PSBmYWxzZSB8fCB2YWwgPT09ICdmYWxzZScpIHJldHVybiAnZmFsc2UnO1xuICAgIGlmICh2YWwgPT09ICdPcmcgbGV2ZWwnIHx8IHZhbCA9PT0gJ09yZyBMZXZlbCcpIHJldHVybiAnT3JnIGxldmVsJztcbiAgICBpZiAodmFsID09PSAnT24gV2FpdCcgfHwgdmFsID09PSAnb24gd2FpdCcpIHJldHVybiAndHJ1ZSc7XG4gICAgcmV0dXJuIHZhbCAmJiBTdHJpbmcodmFsKS50cmltKCkgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2Rlc2NyaXB0aW9uQ29udGVudCddIHx8IGNoYW5nZXNbJ2xhYmVscyddIHx8IGNoYW5nZXNbJ21ldGFkYXRhSXRlbXMnXSkge1xuICAgICAgdGhpcy5lZGl0RGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uQ29udGVudDtcbiAgICAgIHRoaXMuZWRpdExhYmVscyA9IFsuLi50aGlzLmxhYmVsc107XG4gICAgICB0aGlzLmVkaXRTdGF0dXMgPSB0aGlzLnN0YXR1c0l0ZW0/LnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy5lZGl0UHJpb3JpdHkgPSB0aGlzLnByaW9yaXR5SXRlbT8udmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBzdGF0dXM6IHRoaXMuZWRpdFN0YXR1cyxcbiAgICAgICAgcHJpb3JpdHk6IHRoaXMuZWRpdFByaW9yaXR5LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydwcmVyZXF1aXNpdGVDYXNlT3B0aW9ucyddICYmIHRoaXMucHJlcmVxdWlzaXRlQ2FzZU9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnByZXJlcXVpc2l0ZUNhc2VTZWxlY3RDb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMucHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZyxcbiAgICAgICAgb3B0aW9uczogdGhpcy5wcmVyZXF1aXNpdGVDYXNlT3B0aW9ucyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydjb25maWdTZWN0aW9ucyddIHx8IGNoYW5nZXNbJ2NvbmZpZ1NlY3Rpb25zUm93MiddKSB7XG4gICAgICBjb25zdCBlbmFibGVBaVNtYXJ0bmVzcyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBTbWFydG5lc3MnKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRBaUFjdGlvbiA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0RlZmF1bHQgQUkgQWN0aW9uJyk7XG4gICAgICBjb25zdCBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnS25vd2xlZGdlIEJhc2UgRGVmYXVsdCBUZXN0IENhc2UnKTtcbiAgICAgIGNvbnN0IHByZXJlcXVpc2l0ZUNhc2VzID0gdGhpcy5nZXRQcmVyZXF1aXNpdGVDYXNlc0Zyb21Db25maWcoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdEZWZhdWx0IEJyb3dzZXInKTtcbiAgICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdWaWRlbyBSZWNvcmRpbmcnKTtcbiAgICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodmlkZW9SZWNvcmRpbmdSYXcgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCB1c2VBaU1ldGFkYXRhUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKTtcbiAgICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh1c2VBaU1ldGFkYXRhUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdEZWZhdWx0IFZpZXdwb3J0JykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdWaWV3cG9ydCcpIHx8ICcnO1xuICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnVHlwZScpO1xuICAgICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgICBjb25zdCBhdXRvV2FpdFZhbCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0cyAmIFJldHJpZXMnLCAnQXV0byBXYWl0Jyk7XG4gICAgICB0aGlzLmF1dG9XYWl0RW5hYmxlZCA9ICEhKGF1dG9XYWl0VmFsICYmIGF1dG9XYWl0VmFsLnRyaW0oKSAhPT0gJycpO1xuICAgICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgICAgdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0V4dGVuc2lvbiBVc2UnKTtcbiAgICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICAgIGNvbnN0IHBhdGNoOiB7IGVuYWJsZUFpU21hcnRuZXNzPzogc3RyaW5nOyBkZWZhdWx0QWlBY3Rpb24/OiBzdHJpbmc7IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U/OiBzdHJpbmc7IHVzZUFpTWV0YWRhdGE/OiBzdHJpbmc7IHByZXJlcXVpc2l0ZUNhc2VzPzogc3RyaW5nW107IGRlZmF1bHRCcm93c2VyPzogc3RyaW5nOyB2aWRlb1JlY29yZGluZz86IHN0cmluZzsgZGVmYXVsdFZpZXdwb3J0Pzogc3RyaW5nOyBkZXZpY2VUeXBlPzogc3RyaW5nOyBkZXZpY2VPUz86IHN0cmluZyB9ID0ge307XG4gICAgICBpZiAoZW5hYmxlQWlTbWFydG5lc3MpIHBhdGNoLmVuYWJsZUFpU21hcnRuZXNzID0gZW5hYmxlQWlTbWFydG5lc3M7XG4gICAgICBpZiAoZGVmYXVsdEFpQWN0aW9uKSBwYXRjaC5kZWZhdWx0QWlBY3Rpb24gPSBkZWZhdWx0QWlBY3Rpb247XG4gICAgICBpZiAoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSkgcGF0Y2gua25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSA9IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U7XG4gICAgICBpZiAodXNlQWlNZXRhZGF0YSkgcGF0Y2gudXNlQWlNZXRhZGF0YSA9IHVzZUFpTWV0YWRhdGE7XG4gICAgICBpZiAocHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoKSBwYXRjaC5wcmVyZXF1aXNpdGVDYXNlcyA9IHByZXJlcXVpc2l0ZUNhc2VzO1xuICAgICAgaWYgKGRlZmF1bHRCcm93c2VyKSBwYXRjaC5kZWZhdWx0QnJvd3NlciA9IGRlZmF1bHRCcm93c2VyO1xuICAgICAgaWYgKHZpZGVvUmVjb3JkaW5nKSBwYXRjaC52aWRlb1JlY29yZGluZyA9IHZpZGVvUmVjb3JkaW5nO1xuICAgICAgaWYgKGRlZmF1bHRWaWV3cG9ydCkgcGF0Y2guZGVmYXVsdFZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0O1xuICAgICAgaWYgKGRldmljZVR5cGUpIHBhdGNoLmRldmljZVR5cGUgPSBkZXZpY2VUeXBlO1xuICAgICAgaWYgKGRldmljZU9TKSBwYXRjaC5kZXZpY2VPUyA9IGRldmljZU9TO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZShwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gdGhpcy5lZGl0TGFiZWxzLmZpbHRlcigobCkgPT4gbCAhPT0gbGFiZWwpO1xuICB9XG5cbiAgb25DbGVhckFsbExhYmVscygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSBbXTtcbiAgfVxuXG4gIG9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRMYWJlbHMuaW5jbHVkZXMobGFiZWwpKSB7XG4gICAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5lZGl0TGFiZWxzLCBsYWJlbF07XG4gICAgfVxuICB9XG5cbiAgb25BZGRTZWFyY2hlZExhYmVsKCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB0aGlzLmxhYmVsU2VhcmNoLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZCAmJiAhdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKHRyaW1tZWQpKSB7XG4gICAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5lZGl0TGFiZWxzLCB0cmltbWVkXTtcbiAgICAgIHRoaXMubGFiZWxTZWFyY2ggPSAnJztcbiAgICB9XG4gIH1cblxuICBvblNhdmUoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXR1cycpPy52YWx1ZSA/PyB0aGlzLmVkaXRTdGF0dXM7XG4gICAgY29uc3QgcHJpb3JpdHkgPSB0aGlzLmVkaXRGb3JtLmdldCgncHJpb3JpdHknKT8udmFsdWUgPz8gdGhpcy5lZGl0UHJpb3JpdHk7XG4gICAgY29uc3QgY29uZmlnU2VjdGlvbnNNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnMoKTtcbiAgICBjb25zdCBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk7XG4gICAgdGhpcy5zYXZlLmVtaXQoe1xuICAgICAgZGVzY3JpcHRpb25Db250ZW50OiB0aGlzLmVkaXREZXNjcmlwdGlvbixcbiAgICAgIHN0YXR1cyxcbiAgICAgIHByaW9yaXR5LFxuICAgICAgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMsXG4gICAgICBjb25maWdTZWN0aW9uczogY29uZmlnU2VjdGlvbnNNZXJnZWQsXG4gICAgICBjb25maWdTZWN0aW9uc1JvdzI6IGNvbmZpZ1NlY3Rpb25zUm93Mk1lcmdlZCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDb25maWdTZWN0aW9ucygpOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10ge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZ1ZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3ZpZGVvUmVjb3JkaW5nJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nID0gdmlkZW9SZWNvcmRpbmdWYWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IHZpZGVvUmVjb3JkaW5nVmFsdWUgPT09ICdmYWxzZScgPyBmYWxzZSA6IHZpZGVvUmVjb3JkaW5nVmFsdWU7XG4gICAgY29uc3QgdXNlQWlNZXRhZGF0YVZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3VzZUFpTWV0YWRhdGEnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdXNlQWlNZXRhZGF0YSA9IHVzZUFpTWV0YWRhdGFWYWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IHVzZUFpTWV0YWRhdGFWYWx1ZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdXNlQWlNZXRhZGF0YVZhbHVlO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1NlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24udGl0bGUgPT09ICdFeGVjdXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtc1xuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICEocGxhdGZvcm0gPT09ICd3ZWInICYmIGl0ZW0ubGFiZWwgPT09ICdEZWZhdWx0IEJyb3dzZXInKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgaXRlbS5sYWJlbCA9PT0gJ1ZpZGVvIFJlY29yZGluZycgPyB7IC4uLml0ZW0sIHZhbHVlOiB2aWRlb1JlY29yZGluZyB9IDogaXRlbVxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbi50aXRsZSA9PT0gJ0FJIENvbmZpZ3VyYXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtcy5tYXAoKGl0ZW0pID0+XG4gICAgICAgICAgaXRlbS5sYWJlbCA9PT0gJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyA/IHsgLi4uaXRlbSwgdmFsdWU6IHVzZUFpTWV0YWRhdGEgfSA6IGl0ZW1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1NlY3Rpb25zUm93MigpOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10ge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcbiAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0QnJvd3NlcicpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGVmYXVsdFZpZXdwb3J0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRldmljZVR5cGUgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGV2aWNlVHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBkZXZpY2VPUyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZXZpY2VPUycpPy52YWx1ZSA/PyAnJztcblxuICAgIGxldCByZXN1bHQgPSB0aGlzLmNvbmZpZ1NlY3Rpb25zUm93Mi5tYXAoKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnV2FpdHMgJiBSZXRyaWVzJykge1xuICAgICAgICBjb25zdCBhdXRvV2FpdFZhbHVlID0gdGhpcy5hdXRvV2FpdEVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJztcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICBpdGVtLmxhYmVsID09PSAnQXV0byBXYWl0JyA/IHsgLi4uaXRlbSwgdmFsdWU6IGF1dG9XYWl0VmFsdWUgfSA6IGl0ZW1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlJykge1xuICAgICAgICBjb25zdCBpdGVtczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcbiAgICAgICAgICAuLi4ocGxhdGZvcm0gPT09ICd3ZWInXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBCcm93c2VyJywgdmFsdWU6IGRlZmF1bHRCcm93c2VyIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmlld3BvcnQnLCB2YWx1ZTogZGVmYXVsdFZpZXdwb3J0IH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdUeXBlJywgdmFsdWU6IGRldmljZVR5cGUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnT1MnLCB2YWx1ZTogZGV2aWNlT1MgfSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlID0gcmVzdWx0LmZpbmQoKHMpID0+IHMudGl0bGUgPT09ICdEZXZpY2UnKTtcbiAgICBpZiAoIWV4aXN0aW5nRGV2aWNlKSB7XG4gICAgICBjb25zdCBkZXZpY2VTZWN0aW9uOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uID0ge1xuICAgICAgICB0aXRsZTogJ0RldmljZScsXG4gICAgICAgIGljb246ICdkZXZpY2VzJyxcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAuLi4ocGxhdGZvcm0gPT09ICd3ZWInXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBCcm93c2VyJywgdmFsdWU6IGRlZmF1bHRCcm93c2VyIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmlld3BvcnQnLCB2YWx1ZTogZGVmYXVsdFZpZXdwb3J0IH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdUeXBlJywgdmFsdWU6IGRldmljZVR5cGUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnT1MnLCB2YWx1ZTogZGV2aWNlT1MgfSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgICAgcmVzdWx0ID0gWy4uLnJlc3VsdCwgZGV2aWNlU2VjdGlvbl07XG4gICAgfVxuXG4gICAgY29uc3Qga2V5RmxhZ3NTZWN0aW9uOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uID0ge1xuICAgICAgdGl0bGU6ICdLZXkgRmxhZ3MnLFxuICAgICAgaWNvbjogJ2ZsYWcnLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAgeyBsYWJlbDogJ01vYmlsZSBUZXN0aW5nJywgdmFsdWU6IHRoaXMubW9iaWxlVGVzdGluZ0VuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXh0ZW5zaW9uIFVzZScsIHZhbHVlOiB0aGlzLmV4dGVuc2lvblVzZUVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRGF0YSBEcml2ZW4nLCB2YWx1ZTogdGhpcy5kYXRhRHJpdmVuRW5hYmxlZCA/ICdFbmFibGVkJyA6ICcnIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgY29uc3QgZXhpc3RpbmdLZXlGbGFncyA9IHJlc3VsdC5maW5kKChzKSA9PiBzLnRpdGxlID09PSAnS2V5IEZsYWdzJyk7XG4gICAgaWYgKGV4aXN0aW5nS2V5RmxhZ3MpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoKHMpID0+XG4gICAgICAgIHMudGl0bGUgPT09ICdLZXkgRmxhZ3MnID8ga2V5RmxhZ3NTZWN0aW9uIDogc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gWy4uLnJlc3VsdCwga2V5RmxhZ3NTZWN0aW9uXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIHRyYWNrQnlMYWJlbChfaTogbnVtYmVyLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICB0cmFja0J5Q29uZmlnVGl0bGUoX2k6IG51bWJlciwgc2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNlY3Rpb24udGl0bGU7XG4gIH1cblxuICAvKiogQ3VycmVudCBsYWJlbHMgdXNlIGNvbnNpc3RlbnQgaW5kaWdvIHN0eWxlICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTEFCRUxfQ0hJUF9TVFlMRSA9IHtcbiAgICBiZzogJyM2MzY2RjEnLFxuICAgIGJvcmRlcjogJyM2MzY2RjEnLFxuICAgIHRleHQ6ICcjRkZGRkZGJyxcbiAgICBpY29uOiAnI0ZGRkZGRicsXG4gIH07XG5cbiAgZ2V0Q3VycmVudExhYmVsQ2hpcFN0eWxlKF9sYWJlbDogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5MQUJFTF9DSElQX1NUWUxFO1xuICAgIHJldHVybiB7XG4gICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGNvbG9ycy5iZyxcbiAgICAgICdib3JkZXItY29sb3InOiBjb2xvcnMuYm9yZGVyLFxuICAgICAgJ2JvcmRlci13aWR0aCc6ICcxcHgnLFxuICAgICAgJ2JvcmRlci1zdHlsZSc6ICdzb2xpZCcsXG4gICAgICBjb2xvcjogY29sb3JzLnRleHQsXG4gICAgfTtcbiAgfVxuXG4gIGdldExhYmVsQ2xvc2VJY29uQ29sb3IoX2xhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLkxBQkVMX0NISVBfU1RZTEUuaWNvbjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLXB5LTQgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNCBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtcm91bmRlZC1sZ1wiPlxuICA8IS0tIERlc2NyaXB0aW9uIChGaWdtYTogZG9jdW1lbnQgaWNvbiwgdGV4dGFyZWEgd2l0aCBsaWdodCBwdXJwbGUgYmcpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRlc2NyaXB0aW9uPC9tYXQtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzE5LjZweF1cIj57eyBkZXNjcmlwdGlvblRpdGxlIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICBbdmFsdWVdPVwiZWRpdERlc2NyaXB0aW9uXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJlZGl0RGVzY3JpcHRpb24gPSAkZXZlbnRcIlxuICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgIFtyb3dzXT1cIjRcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBkZXNjcmlwdGlvbi4uLlwiXG4gICAgICB0ZXh0YXJlYUlubGluZVN0eWxlPVwicGFkZGluZzogMTJweDsgZm9udC1zaXplOiAxMnB4OyBsaW5lLWhlaWdodDogMTAwJVwiXG4gICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RhdHVzICYgUHJpb3JpdHkgKEZpZ21hOiBzaWRlLWJ5LXNpZGUgZHJvcGRvd25zLCBjcWEtZHluYW1pYy1zZWxlY3QpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtNFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+U3RhdHVzPC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3N0YXR1cycsIHN0YXR1c1NlbGVjdENvbmZpZylcIlxuICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdzdGF0dXMnKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPlByaW9yaXR5PC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3ByaW9yaXR5JywgcHJpb3JpdHlTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgncHJpb3JpdHknKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMYWJlbHMgKEZpZ21hOiBDdXJyZW50IExhYmVscyB3aXRoIENsZWFyIEFsbCwgY3FhLWJhZGdlIHdpdGggeCwgRnJlcXVlbnRseSB1c2VkLCBTZWFyY2gpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtWzE1cHhdIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPkN1cnJlbnQgTGFiZWxzICh7eyBlZGl0TGFiZWxzLmxlbmd0aCB9fSk8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImVkaXRMYWJlbHMubGVuZ3RoID4gMFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyNEQzI2MjZdIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWZvbnQtbm9ybWFsXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xlYXJBbGxMYWJlbHMoKVwiPlxuICAgICAgICBDbGVhciBBbGxcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtMlwiICpuZ0lmPVwiZWRpdExhYmVscy5sZW5ndGggPiAwXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBlZGl0TGFiZWxzOyB0cmFja0J5OiB0cmFja0J5TGFiZWxcIlxuICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC0yLjUgY3FhLXB5LTEgY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRDdXJyZW50TGFiZWxDaGlwU3R5bGUobGFiZWwpXCI+XG4gICAgICAgIDxzcGFuPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy0zLjUgY3FhLWgtMy41IGNxYS1yb3VuZGVkIGhvdmVyOmNxYS1vcGFjaXR5LTgwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldExhYmVsQ2xvc2VJY29uQ29sb3IobGFiZWwpXCJcbiAgICAgICAgICAoY2xpY2spPVwib25SZW1vdmVMYWJlbChsYWJlbClcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZSAnICsgbGFiZWxcIj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMTRweF0gY3FhLXctMy41IGNxYS1oLTMuNVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+RnJlcXVlbnRseSB1c2VkPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgbGFiZWwgb2YgZnJlcXVlbnRseVVzZWRMYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlMYWJlbFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJvbkFkZEZyZXF1ZW50TGFiZWwobGFiZWwpXCI+XG4gICAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I9XCIjRThFOUZGXCJcbiAgICAgICAgICAgIHRleHRDb2xvcj1cIiMzRjQzRUVcIlxuICAgICAgICAgICAgYm9yZGVyQ29sb3I9XCIjRThFOUZGXCI+XG4gICAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICBbdmFsdWVdPVwibGFiZWxTZWFyY2hcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImxhYmVsU2VhcmNoID0gJGV2ZW50XCJcbiAgICAgIChzZWFyY2gpPVwib25BZGRTZWFyY2hlZExhYmVsKClcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggbGFiZWxzIHRvIGFkZCAuLi4uLi5cIlxuICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCI+XG4gICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBDb25maWd1cmF0aW9uIChGaWdtYTogY29sbGFwc2libGUsIGdlYXIgaWNvbiwgbGlnaHQgcHVycGxlIGlucHV0cykgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bMTJweF1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXRleHQtbGVmdCBjcWEtdy1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLWxlYWRpbmctWzE5LjVweF1cIj57eyBjb25maWdUaXRsZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJjb25maWdFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzE2cHhdIGNxYS1weS0wIGNxYS1weC0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtNSBjcWEtcHgtMyBjcWEtdGV4dC14c1wiPlxuICAgICAgICA8IS0tIEV4ZWN1dGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImV4ZWN1dGlvbkV4cGFuZGVkID0gIWV4ZWN1dGlvbkV4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnBsYXlfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5FeGVjdXRpb248L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2NDc0OEJdIGNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPlxuICAgICAgICAgICAge3sgZXhlY3V0aW9uRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZXhlY3V0aW9uRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3ByZXJlcXVpc2l0ZUNhc2VzJywgcHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdwcmVyZXF1aXNpdGVDYXNlcycpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCd2aWRlb1JlY29yZGluZycsIHZpZGVvUmVjb3JkaW5nU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ZpZGVvUmVjb3JkaW5nJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEFJIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLXB5LTAgY3FhLW1pbi13LTAgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWlDb25maWdFeHBhbmRlZCA9ICFhaUNvbmZpZ0V4cGFuZGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNtYXJ0X3RveTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkFJIENvbmZpZ3VyYXRpb248L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgICAge3sgYWlDb25maWdFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhaUNvbmZpZ0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1weS0wIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2VuYWJsZUFpU21hcnRuZXNzJywgZW5hYmxlQWlTbWFydG5lc3NTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZW5hYmxlQWlTbWFydG5lc3MnKVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdkZWZhdWx0QWlBY3Rpb24nLCBkZWZhdWx0QWlBY3Rpb25TZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZGVmYXVsdEFpQWN0aW9uJylcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScsIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3VzZUFpTWV0YWRhdGEnLCBhaU1ldGFkYXRhQ29sbGVjdGlvblNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCd1c2VBaU1ldGFkYXRhJylcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBXYWl0cyAmIFJldHJpZXMtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ3YWl0c1JldHJpZXNFeHBhbmRlZCA9ICF3YWl0c1JldHJpZXNFeHBhbmRlZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj50aW1lcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPldhaXQgYW5kIFJldHJpZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgICAge3sgd2FpdHNSZXRyaWVzRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2FpdHNSZXRyaWVzRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjZmJmY2ZmXVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwiYXV0b1dhaXRFbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiYXV0b1dhaXRFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiRW5hYmxlIEF2b2lkIEF1dG8gd2FpdCBmb3Igc3RlcHNcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5FbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwczwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgbGFiZWw9XCJSZXRyeSBGYWlsZWQgU3RlcHNcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyZXRyeUZhaWxlZFN0ZXBzXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicmV0cnlGYWlsZWRTdGVwcyA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIuXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgbGFiZWxJbmxpbmVTdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGVzdENhc2VUaW1lb3V0XCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwidGVzdENhc2VUaW1lb3V0ID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjI1XCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgbGFiZWxJbmxpbmVTdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICAgIGxhYmVsPVwiV2FpdCBUaW1lb3V0IGZvciBMb2NhdG9ycyAoc2VjcylcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ3YWl0VGltZW91dExvY2F0b3JzXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwid2FpdFRpbWVvdXRMb2NhdG9ycyA9ICRldmVudFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIzMFwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICAgIGxhYmVsSW5saW5lU3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOS42cHhcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIERldmljZSBTZXR0aW5ncyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgIChjbGljayk9XCJkZXZpY2VFeHBhbmRlZCA9ICFkZXZpY2VFeHBhbmRlZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5kZXZpY2VzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+RGV2aWNlIFNldHRpbmdzPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICAgIHt7IGRldmljZUV4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImRldmljZUV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwbGF0Zm9ybSA9PT0gJ3dlYidcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEJyb3dzZXInLCBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdkZWZhdWx0QnJvd3NlcicpXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2RlZmF1bHRWaWV3cG9ydCcsIGRlZmF1bHRWaWV3cG9ydFNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdkZWZhdWx0Vmlld3BvcnQnKVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGxhdGZvcm0gPT09ICdtb2JpbGUnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2RldmljZVR5cGUnLCBkZXZpY2VUeXBlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RldmljZVR5cGUnKVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdkZXZpY2VPUycsIGRldmljZU9TU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RldmljZU9TJylcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBLZXkgRmxhZ3MgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwia2V5RmxhZ3NFeHBhbmRlZCA9ICFrZXlGbGFnc0V4cGFuZGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmZsYWc8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5LZXkgRmxhZ3M8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgICAge3sga2V5RmxhZ3NFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJrZXlGbGFnc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZyBjcWEtYmctWyNmYmZjZmZdXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJtb2JpbGVUZXN0aW5nRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cIm1vYmlsZVRlc3RpbmdFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiTW9iaWxlIFRlc3RpbmdcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5Nb2JpbGUgVGVzdGluZzwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjZmJmY2ZmXVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwiZXh0ZW5zaW9uVXNlRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImV4dGVuc2lvblVzZUVuYWJsZWQgPSAkZXZlbnRcIiBhcmlhTGFiZWw9XCJFeHRlbnNpb24gVXNlXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RXh0ZW5zaW9uIFVzZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjZmJmY2ZmXVwiPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwiZGF0YURyaXZlbkVuYWJsZWRcIiAoY2hlY2tlZENoYW5nZSk9XCJkYXRhRHJpdmVuRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkRhdGEgRHJpdmVuXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RGF0YSBEcml2ZW48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMyBjcWEtcHQtMiBjcWEtdy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgIFt0ZXh0XT1cIidDYW5jZWwnXCJcbiAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgICAgW3RleHRdPVwiJ1NhdmUgQ2hhbmdlcydcIlxuICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvblNhdmUoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
808
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBaUN4RCxvR0FBb0c7QUFDcEcsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFDM0MsTUFBTSxFQUFFLFFBQVE7SUFDaEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxXQUFXLEVBQUUsYUFBYTtJQUMxQixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLDRCQUE0QixFQUFFLDhCQUE4QjtJQUM1RCxhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsUUFBUSxFQUFFLFVBQVU7Q0FDWixDQUFDO0FBY1gsTUFBTSxzQkFBc0IsR0FB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Qix1QkFBdUIsQ0FBQyxNQUFNO3dHQUd0QyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFTRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksSUFBSTtzQkFBYixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFHRyxZQUFZO3NCQUFyQixNQUFNO2dCQUdHLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0csWUFBWTtzQkFBckIsTUFBTTtnQkFHRyxlQUFlO3NCQUF4QixNQUFNO2dCQUdHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBPbkluaXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbixcbiAgVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtLFxufSBmcm9tICcuLi90ZXN0LWNhc2UtZGV0YWlscy5tb2RlbHMnO1xuaW1wb3J0IHtcbiAgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnLFxuICBTZWxlY3RPcHRpb24sXG59IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5cbi8qKiBPdmVycmlkZSBjb25maWcgZm9yIGEgc3BlY2lmaWMgc2VsZWN0LiBVc2UgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCwgbG9hZCBtb3JlLCBjdXN0b20gb3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0Q29uZmlnT3ZlcnJpZGUge1xuICAvKiogUmVwbGFjZSBvcHRpb25zIChlLmcuIGZyb20gQVBJKS4gVXBkYXRlIHdoZW4gQVBJIHJldHVybnMuICovXG4gIG9wdGlvbnM/OiBTZWxlY3RPcHRpb25bXTtcbiAgLyoqIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2g7IGNvbXBvbmVudCBlbWl0cyBzZWxlY3RTZWFyY2ggaW5zdGVhZCBvZiBsb2NhbCBmaWx0ZXJpbmcuICovXG4gIHNlcnZlclNlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBJbmRpY2F0ZXMgbW9yZSByZXN1bHRzIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsLiAqL1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgLyoqIExvYWRpbmcgc3RhdGUgKGUuZy4gZHVyaW5nIEFQSSBjYWxsKS4gKi9cbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2ggaW5wdXQgaW4gdGhlIHNlbGVjdC4gKi9cbiAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIHRyaWdnZXJzIGluaXRpYWwgc2VhcmNoIG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlKS4gKi9cbiAgaW5pdGlhbEZldGNoT25PcGVuPzogYm9vbGVhbjtcbiAgLyoqIENhbGxiYWNrIHdoZW4gdXNlciB0eXBlcyBpbiBzZWFyY2guIENhbGwgQVBJLCB0aGVuIHVwZGF0ZSBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUuIENhbGwgQVBJLCBhcHBlbmQgb3B0aW9ucyB2aWEgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuICBvbkxvYWRNb3JlPzogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKiogTWFwIG9mIHNlbGVjdCBrZXkgLT4gY29uZmlnIG92ZXJyaWRlLiBFbmFibGVzIEFQSS1kcml2ZW4gb3B0aW9ucywgaW5maW5pdGUgc2VhcmNoLCBsb2FkIG1vcmUuICovXG5leHBvcnQgdHlwZSBTZWxlY3RDb25maWdPdmVycmlkZXMgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIFNlbGVjdENvbmZpZ092ZXJyaWRlPj47XG5cbi8qKiBLZXlzIGZvciBlYWNoIGR5bmFtaWMgc2VsZWN0IGluIHRlc3QtY2FzZS1kZXRhaWxzLWVkaXQuIFVzZSB0aGVzZSB3aXRoIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbmV4cG9ydCBjb25zdCBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUyA9IHtcbiAgc3RhdHVzOiAnc3RhdHVzJyxcbiAgcHJpb3JpdHk6ICdwcmlvcml0eScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgbGFiZWxzOiAnbGFiZWxzJyxcbiAgcHJlcmVxdWlzaXRlQ2FzZXM6ICdwcmVyZXF1aXNpdGVDYXNlcycsXG4gIHRlc3REYXRhUHJvZmlsZTogJ3Rlc3REYXRhUHJvZmlsZScsXG4gIHRlc3REYXRhU2V0OiAndGVzdERhdGFTZXQnLFxuICB2aWRlb1JlY29yZGluZzogJ3ZpZGVvUmVjb3JkaW5nJyxcbiAgZW5hYmxlQWlTbWFydG5lc3M6ICdlbmFibGVBaVNtYXJ0bmVzcycsXG4gIGRlZmF1bHRBaUFjdGlvbjogJ2RlZmF1bHRBaUFjdGlvbicsXG4gIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6ICdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyxcbiAgdXNlQWlNZXRhZGF0YTogJ3VzZUFpTWV0YWRhdGEnLFxuICBkZWZhdWx0QnJvd3NlcjogJ2RlZmF1bHRCcm93c2VyJyxcbiAgZGVmYXVsdFZpZXdwb3J0OiAnZGVmYXVsdFZpZXdwb3J0JyxcbiAgZGV2aWNlVHlwZTogJ2RldmljZVR5cGUnLFxuICBkZXZpY2VPUzogJ2RldmljZU9TJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhIHtcbiAgZGVzY3JpcHRpb25Db250ZW50OiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBwcmlvcml0eTogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nIHwgbnVtYmVyO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICB0ZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIHRlc3REYXRhU2V0SW5kZXg/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjb25maWdTZWN0aW9uczogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdO1xuICBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXTtcbn1cblxuY29uc3QgRlJFUVVFTlRMWV9VU0VEX0xBQkVMUyA9IFtcbiAgJ0Nhc2UnLFxuICAnQ3JpdGljYWwnLFxuICAnUE8nLFxuICAnVXBsb2FkJyxcbiAgJ1ZhbGlkYXRpb24nLFxuICAnUmV2aWV3JyxcbiAgJ0VkZ2UtY2FzZXMnLFxuICAnU2VjdXJpdHknLFxuICAnSW50ZWdyYXRpb24nLFxuICAnU21va2UnLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZURldGFpbHNFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRpdGxlID0gJ0Rlc2NyaXB0aW9uJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25Db250ZW50ID0gJyc7XG4gIC8qKiBXaGVuIHRydWUsIGRlc2NyaXB0aW9uIHVzZXMgVHJpeCByaWNoIHRleHQgZWRpdG9yIChCb2xkLCBJdGFsaWMsIGV0Yy4pLiBIb3N0IGFwcCBtdXN0IGxvYWQgVHJpeC4gKi9cbiAgQElucHV0KCkgZW5hYmxlTWFya2Rvd24gPSBmYWxzZTtcbiAgQElucHV0KCkgbWV0YWRhdGFJdGVtczogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBjb25maWdUaXRsZSA9ICdDb25maWd1cmF0aW9uJztcbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnM6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICAvKiogT3B0aW9uYWwgbGlzdCBvZiBwcmVyZXF1aXNpdGUgdGVzdCBjYXNlIG9wdGlvbnMgZm9yIHRoZSBtdWx0aS1zZWxlY3QuIElmIG5vdCBwcm92aWRlZCwgdXNlcyBkZWZhdWx0IHNhbXBsZSBvcHRpb25zLiAqL1xuICBASW5wdXQoKSBwcmVyZXF1aXNpdGVDYXNlT3B0aW9uczogeyB2YWx1ZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBQbGF0Zm9ybTogJ3dlYicgc2hvd3MgRGVmYXVsdCBCcm93c2VyICsgVmlld3BvcnQ7ICdtb2JpbGUnIHNob3dzIERldmljZSBUeXBlICsgT1MuIERlZmF1bHRzIHRvICd3ZWInLiAqL1xuICBASW5wdXQoKSBwbGF0Zm9ybTogJ3dlYicgfCAnbW9iaWxlJyA9ICd3ZWInO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBjb25maWcgcGVyIHNlbGVjdCBrZXkuIFVzZSBmb3I6XG4gICAqIC0gQVBJLWRyaXZlbiBvcHRpb25zOiBwYXNzIG9wdGlvbnMgYXJyYXkgKHVwZGF0ZSB3aGVuIEFQSSByZXR1cm5zKVxuICAgKiAtIFNlcnZlci1zaWRlIHNlYXJjaDogc2VydmVyU2VhcmNoOiB0cnVlLCBvblNlYXJjaCBpbiBvdmVycmlkZSBvciBsaXN0ZW4gdG8gc2VsZWN0U2VhcmNoXG4gICAqIC0gSW5maW5pdGUgc2Nyb2xsOiBoYXNNb3JlOiB0cnVlLCBvbkxvYWRNb3JlIGluIG92ZXJyaWRlIG9yIGxpc3RlbiB0byBzZWxlY3RMb2FkTW9yZVxuICAgKiAtIEluaXRpYWwgZmV0Y2ggb24gb3BlbjogaW5pdGlhbEZldGNoT25PcGVuOiB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RDb25maWdPdmVycmlkZXM6IFNlbGVjdENvbmZpZ092ZXJyaWRlcyA9IHt9O1xuXG4gIEBPdXRwdXQoKSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGE+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIHNlYXJjaGVzIGluIGEgc2VsZWN0IChzZXJ2ZXJTZWFyY2ggbW9kZSkuIENhbGwgQVBJIGFuZCB1cGRhdGUgb3B0aW9ucyB2aWEgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0U2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIHNjcm9sbHMgdG8gbG9hZCBtb3JlLiBDYWxsIEFQSSwgYXBwZW5kIHRvIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdExvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHNlbGVjdCBwYW5lbCBpcyBvcGVuZWQuIFVzZSB0byBjYWxsIEFQSSBmb3IgaW5pdGlhbCBsb2FkIChlLmcuIHdoZW4gaW5pdGlhbEZldGNoT25PcGVuKS4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMgaW4gYW55IHNlbGVjdC4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgYWRkcyBhIG5ldyBjdXN0b20gbGFiZWwgdmlhIHRoZSBcIk5ld1wiIG9wdGlvbi4gKi9cbiAgQE91dHB1dCgpIGxhYmVsQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgLyoqIEZvcm0gc3RhdGUgKi9cbiAgZWRpdERlc2NyaXB0aW9uID0gJyc7XG4gIGVkaXRTdGF0dXMgPSAnJztcbiAgZWRpdFByaW9yaXR5ID0gJyc7XG4gIGVkaXRMYWJlbHM6IHN0cmluZ1tdID0gW107XG4gIHRlc3RDYXNlVGltZW91dCA9ICcnO1xuICB3YWl0VGltZW91dExvY2F0b3JzID0gJyc7XG4gIGF1dG9XYWl0RW5hYmxlZCA9IGZhbHNlO1xuICByZXRyeUZhaWxlZFN0ZXBzID0gJyc7XG4gIGNvbmZpZ0V4cGFuZGVkID0gdHJ1ZTtcbiAgZXhlY3V0aW9uRXhwYW5kZWQgPSB0cnVlO1xuICBhaUNvbmZpZ0V4cGFuZGVkID0gdHJ1ZTtcbiAgd2FpdHNSZXRyaWVzRXhwYW5kZWQgPSB0cnVlO1xuICBkZXZpY2VFeHBhbmRlZCA9IHRydWU7XG4gIGtleUZsYWdzRXhwYW5kZWQgPSB0cnVlO1xuICBtb2JpbGVUZXN0aW5nRW5hYmxlZCA9IGZhbHNlO1xuICBleHRlbnNpb25Vc2VFbmFibGVkID0gZmFsc2U7XG4gIGRhdGFEcml2ZW5FbmFibGVkID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZnJlcXVlbnRseVVzZWRMYWJlbHMgPSBGUkVRVUVOVExZX1VTRURfTEFCRUxTO1xuXG4gIC8qKiBGb3JtR3JvdXAgZm9yIGNxYS1keW5hbWljLXNlbGVjdCBiaW5kaW5ncyAqL1xuICBlZGl0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXR1czogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBwcmlvcml0eTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB0eXBlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGxhYmVsczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICBwcmVyZXF1aXNpdGVDYXNlczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICB0ZXN0RGF0YVByb2ZpbGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdGVzdERhdGFTZXQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdEJyb3dzZXI6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdmlkZW9SZWNvcmRpbmc6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdFZpZXdwb3J0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRldmljZVR5cGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGV2aWNlT1M6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZW5hYmxlQWlTbWFydG5lc3M6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdEFpQWN0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdXNlQWlNZXRhZGF0YTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgfSk7XG5cbiAgZ2V0IHN0YXR1c0l0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdTdGF0dXMnKTtcbiAgfVxuXG4gIGdldCBwcmlvcml0eUl0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdQcmlvcml0eScpO1xuICB9XG5cbiAgZ2V0IHR5cGVJdGVtKCk6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFJdGVtcy5maW5kKChtKSA9PiBtLmxhYmVsID09PSAnVHlwZScpO1xuICB9XG5cbiAgZ2V0IHN0YXR1c09wdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ0RyYWZ0JywgJ0luIFJldmlldycsICdBcHByb3ZlZCcsICdBY3RpdmUnLCAnSW5hY3RpdmUnLCAnQmxvY2tlZCddO1xuICB9XG5cbiAgZ2V0IHByaW9yaXR5T3B0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnQ3JpdGljYWwnLCAnTWFqb3InLCAnSGlnaCcsICdNZWRpdW0nLCAnTG93JywgJ01pbm9yJywgJ05vdCBzZXQnXTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgY29uZmlncyB0byBhdm9pZCBuZXcgb2JqZWN0IHJlZnMgZWFjaCBjaGFuZ2UgZGV0ZWN0aW9uIChwcmV2ZW50cyBpbmZpbml0ZSBsb29wcykgKi9cbiAgcmVhZG9ubHkgc3RhdHVzU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnc3RhdHVzJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdTdGF0dXMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdEcmFmdCcsIG5hbWU6ICdEcmFmdCcgfSxcbiAgICAgIHsgdmFsdWU6ICdJbiBSZXZpZXcnLCBuYW1lOiAnSW4gUmV2aWV3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FwcHJvdmVkJywgbmFtZTogJ0FwcHJvdmVkJyB9LFxuICAgICAgeyB2YWx1ZTogJ0FjdGl2ZScsIG5hbWU6ICdBY3RpdmUnIH0sXG4gICAgICB7IHZhbHVlOiAnSW5hY3RpdmUnLCBuYW1lOiAnSW5hY3RpdmUnIH0sXG4gICAgICB7IHZhbHVlOiAnQmxvY2tlZCcsIG5hbWU6ICdCbG9ja2VkJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgdHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3R5cGUnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1R5cGUnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcmVhZG9ubHkgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndGVzdERhdGFQcm9maWxlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXN0IERhdGEgUHJvZmlsZScsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICByZWFkb25seSB0ZXN0RGF0YVNldFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3Rlc3REYXRhU2V0JyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXN0IERhdGEgU2V0JyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFByZXJlcXVpc2l0ZUNhc2VPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdUQy0wMDEnLCBuYW1lOiAnVEMtMDAxOiBMb2dpbiBmbG93JyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDInLCBuYW1lOiAnVEMtMDAyOiBVc2VyIHJlZ2lzdHJhdGlvbicgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDAzJywgbmFtZTogJ1RDLTAwMzogUGFzc3dvcmQgcmVzZXQnIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwNCcsIG5hbWU6ICdUQy0wMDQ6IERhc2hib2FyZCBsb2FkJyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDUnLCBuYW1lOiAnVEMtMDA1OiBBUEkgaGVhbHRoIGNoZWNrJyB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHZpZGVvUmVjb3JkaW5nU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmlkZW9SZWNvcmRpbmcnLFxuICAgIGxhYmVsOiAnUmVjb3JkIHRlc3QgZXhlY3V0aW9uIHZpZGVvJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3RydWUnLCBuYW1lOiAnVHJ1ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdGYWxzZScgfSxcbiAgICAgIHsgdmFsdWU6ICdPcmcgbGV2ZWwnLCBuYW1lOiAnT3JnIGxldmVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgYWlNZXRhZGF0YUNvbGxlY3Rpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd1c2VBaU1ldGFkYXRhJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3RydWUnLCBuYW1lOiAnVHJ1ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdGYWxzZScgfSxcbiAgICAgIHsgdmFsdWU6ICdPcmcgbGV2ZWwnLCBuYW1lOiAnT3JnIGxldmVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIENhY2hlZCBsYWJlbHMgY29uZmlnIHRvIGF2b2lkIG5ldyBvYmplY3Qgb24gZXZlcnkgQ0QgKHByZXZlbnRzIGZyZWV6ZSkgKi9cbiAgcHJpdmF0ZSBfbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG5cbiAgLyoqIExhYmVscyBtdWx0aS1zZWxlY3Q6IG9wdGlvbnMgPSBmcmVxdWVudGx5IHVzZWQgKyBjdXJyZW50ICsgQVBJIG9wdGlvbnMgZnJvbSBzZWxlY3RDb25maWdPdmVycmlkZXMgKi9cbiAgZ2V0IGxhYmVsc1NlbGVjdENvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGlmICghdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgJiYgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGUpIHJldHVybiB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzW1RFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVsc107XG4gICAgY29uc3QgYXBpT3B0aW9ucyA9IG92ZXJyaWRlPy5vcHRpb25zID8/IFtdO1xuICAgIGNvbnN0IGFsbExhYmVscyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICAuLi50aGlzLmZyZXF1ZW50bHlVc2VkTGFiZWxzLFxuICAgICAgLi4udGhpcy5lZGl0TGFiZWxzLFxuICAgICAgLi4uYXBpT3B0aW9ucy5tYXAoKG8pID0+IFN0cmluZyhvLm5hbWUgPz8gby52YWx1ZSA/PyAnJykudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgXSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5LmZyb20oYWxsTGFiZWxzKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgIC5tYXAoKHYpID0+ICh7IHZhbHVlOiB2LCBuYW1lOiB2IH0pKTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ2xhYmVscycsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBsYWJlbHMgdG8gYWRkIC4uLi4uLicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBvcHRpb25TdHlsZTogJ2NoZWNrYm94JyxcbiAgICAgIGFsbG93Q3VzdG9tVmFsdWU6IHRydWUsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU7XG4gIH1cblxuICBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJlcmVxdWlzaXRlQ2FzZXMnLFxuICAgIGxhYmVsOiAnUHJlcmVxdWlzaXRlIENhc2UnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG9wdGlvblN0eWxlOiAnY2hlY2tib3gnLFxuICAgIHNob3dTZWxlY3RBbGw6IHRydWUsXG4gICAgc2VsZWN0QWxsTGFiZWw6ICdBbGwnLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdUQy0wMDEnLCBuYW1lOiAnVEMtMDAxOiBMb2dpbiBmbG93JyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwMicsIG5hbWU6ICdUQy0wMDI6IFVzZXIgcmVnaXN0cmF0aW9uJyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwMycsIG5hbWU6ICdUQy0wMDM6IFBhc3N3b3JkIHJlc2V0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwNCcsIG5hbWU6ICdUQy0wMDQ6IERhc2hib2FyZCBsb2FkJyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwNScsIG5hbWU6ICdUQy0wMDU6IEFQSSBoZWFsdGggY2hlY2snIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0Vmlld3BvcnRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZWZhdWx0Vmlld3BvcnQnLFxuICAgIGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICcxMjgweDcyMCcsIG5hbWU6ICcxMjgweDcyMCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRldmljZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZXZpY2VUeXBlJyxcbiAgICBsYWJlbDogJ0RldmljZSBUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lQaG9uZSAxNCcsIG5hbWU6ICdpUGhvbmUgMTQnIH0sXG4gICAgICB7IHZhbHVlOiAnaVBob25lIDE1JywgbmFtZTogJ2lQaG9uZSAxNScgfSxcbiAgICAgIHsgdmFsdWU6ICdpUGhvbmUgMTcnLCBuYW1lOiAnaVBob25lIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0lwaG9uZSAxNycsIG5hbWU6ICdJcGhvbmUgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnU2Ftc3VuZyBHYWxheHknLCBuYW1lOiAnU2Ftc3VuZyBHYWxheHknIH0sXG4gICAgICB7IHZhbHVlOiAnUGl4ZWwnLCBuYW1lOiAnUGl4ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZXZpY2VPU1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RldmljZU9TJyxcbiAgICBsYWJlbDogJ09TJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lwYScsIG5hbWU6ICdpT1MgKGlwYSknIH0sXG4gICAgICB7IHZhbHVlOiAnYXBrJywgbmFtZTogJ0FuZHJvaWQgKGFwayknIH0sXG4gICAgICB7IHZhbHVlOiAnaU9TIDE2JywgbmFtZTogJ2lPUyAxNicgfSxcbiAgICAgIHsgdmFsdWU6ICdpT1MgMTcnLCBuYW1lOiAnaU9TIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FuZHJvaWQgMTMnLCBuYW1lOiAnQW5kcm9pZCAxMycgfSxcbiAgICAgIHsgdmFsdWU6ICdBbmRyb2lkIDE0JywgbmFtZTogJ0FuZHJvaWQgMTQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRCcm93c2VyJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsXG4gICAgcGxhY2Vob2xkZXI6ICdDaHJvbWUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdDaHJvbWUnLCBuYW1lOiAnQ2hyb21lJyB9LFxuICAgICAgeyB2YWx1ZTogJ0ZpcmVmb3gnLCBuYW1lOiAnRmlyZWZveCcgfSxcbiAgICAgIHsgdmFsdWU6ICdTYWZhcmknLCBuYW1lOiAnU2FmYXJpJyB9LFxuICAgICAgeyB2YWx1ZTogJ0VkZ2UnLCBuYW1lOiAnRWRnZScgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHByaW9yaXR5U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJpb3JpdHknLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1ByaW9yaXR5JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnQ3JpdGljYWwnLCBuYW1lOiAnQ3JpdGljYWwnIH0sXG4gICAgICB7IHZhbHVlOiAnTWFqb3InLCBuYW1lOiAnTWFqb3InIH0sXG4gICAgICB7IHZhbHVlOiAnSGlnaCcsIG5hbWU6ICdIaWdoJyB9LFxuICAgICAgeyB2YWx1ZTogJ01lZGl1bScsIG5hbWU6ICdNZWRpdW0nIH0sXG4gICAgICB7IHZhbHVlOiAnTG93JywgbmFtZTogJ0xvdycgfSxcbiAgICAgIHsgdmFsdWU6ICdNaW5vcicsIG5hbWU6ICdNaW5vcicgfSxcbiAgICAgIHsgdmFsdWU6ICdOb3Qgc2V0JywgbmFtZTogJ05vdCBzZXQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBlbmFibGVBaVNtYXJ0bmVzc1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBTbWFydG5lc3MnLFxuICAgIHBsYWNlaG9sZGVyOiAnQWR2YW5jZWQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdCYXNpYycsIG5hbWU6ICdCYXNpYycgfSxcbiAgICAgIHsgdmFsdWU6ICdBZHZhbmNlZCcsIG5hbWU6ICdBZHZhbmNlZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdPZmYnLCBuYW1lOiAnT2ZmJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQUkgQWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NtYXJ0IHdhaXQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdTbWFydCB3YWl0JywgbmFtZTogJ1NtYXJ0IHdhaXQnIH0sXG4gICAgICB7IHZhbHVlOiAnU21hcnQgV2FpdCcsIG5hbWU6ICdTbWFydCBXYWl0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1dhaXQgZm9yIGVsZW1lbnQnLCBuYW1lOiAnV2FpdCBmb3IgZWxlbWVudCcgfSxcbiAgICAgIHsgdmFsdWU6ICdSZXRyeScsIG5hbWU6ICdSZXRyeScgfSxcbiAgICAgIHsgdmFsdWU6ICdTa2lwJywgbmFtZTogJ1NraXAnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScsXG4gICAgbGFiZWw6ICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScsXG4gICAgcGxhY2Vob2xkZXI6ICdOb25lJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnbm9uZScsIG5hbWU6ICdOb25lJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWVyZ2VkIGNvbmZpZyBmb3IgYSBzZWxlY3Q6IGJhc2UgY29uZmlnICsgb3ZlcnJpZGUuXG4gICAqIFdpcmVzIG9uU2VhcmNoLCBvbkxvYWRNb3JlIHRvIGJvdGggb3ZlcnJpZGUgY2FsbGJhY2tzIGFuZCBvdXRwdXQgZXZlbnRzLlxuICAgKi9cbiAgZ2V0Q29uZmlnRm9yU2VsZWN0KGtleTogc3RyaW5nLCBiYXNlQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltrZXldO1xuICAgIGlmICghb3ZlcnJpZGUpIHJldHVybiBiYXNlQ29uZmlnO1xuXG4gICAgY29uc3QgbWVyZ2VkOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAuLi5iYXNlQ29uZmlnLFxuICAgICAgLi4ub3ZlcnJpZGUsXG4gICAgICBvcHRpb25zOiBvdmVycmlkZS5vcHRpb25zID8/IGJhc2VDb25maWcub3B0aW9ucyxcbiAgICAgIGtleTogYmFzZUNvbmZpZy5rZXksXG4gICAgfTtcblxuICAgIGlmIChvdmVycmlkZS5zZXJ2ZXJTZWFyY2ggfHwgb3ZlcnJpZGUub25TZWFyY2gpIHtcbiAgICAgIG1lcmdlZC5vblNlYXJjaCA9IChxdWVyeSkgPT4ge1xuICAgICAgICBvdmVycmlkZS5vblNlYXJjaD8uKHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5zZWxlY3RTZWFyY2guZW1pdCh7IGtleSwgcXVlcnkgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAob3ZlcnJpZGUuaGFzTW9yZSB8fCBvdmVycmlkZS5vbkxvYWRNb3JlKSB7XG4gICAgICBtZXJnZWQub25Mb2FkTW9yZSA9IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnkgPz8gJyc7XG4gICAgICAgIG92ZXJyaWRlLm9uTG9hZE1vcmU/LihxKTtcbiAgICAgICAgdGhpcy5zZWxlY3RMb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIG9uU2VsZWN0T3BlbmVkKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RPcGVuZWQuZW1pdCh7IGtleSB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0U2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdFNlYXJjaC5lbWl0KGV2ZW50KTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bZXZlbnQua2V5XTtcbiAgICBvdmVycmlkZT8ub25TZWFyY2g/LihldmVudC5xdWVyeSk7XG4gIH1cblxuICBvblNlbGVjdExvYWRNb3JlKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdExvYWRNb3JlLmVtaXQoZXZlbnQpO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltldmVudC5rZXldO1xuICAgIG92ZXJyaWRlPy5vbkxvYWRNb3JlPy4oZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGV2ZW50LnZhbHVlO1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLm1hcCgodikgPT4gU3RyaW5nKHYpKS5maWx0ZXIoQm9vbGVhbikgOiB2YWwgIT0gbnVsbCA/IFtTdHJpbmcodmFsKV0gOiBbXTtcbiAgICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHsga2V5OiBldmVudC5rZXksIHZhbHVlOiBldmVudC52YWx1ZSB9KTtcbiAgfVxuXG4gIG9uTGFiZWxzQWRkQ3VzdG9tVmFsdWUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXYgfHwgdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKHYpKSByZXR1cm47XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMuZWRpdExhYmVscywgdl07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMubGFiZWxBZGRlZC5lbWl0KHYpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWdJdGVtVmFsdWUoc2VjdGlvblRpdGxlOiBzdHJpbmcsIGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWN0aW9uID0gWy4uLnRoaXMuY29uZmlnU2VjdGlvbnMsIC4uLnRoaXMuY29uZmlnU2VjdGlvbnNSb3cyXS5maW5kKFxuICAgICAgKHMpID0+IHMudGl0bGUgPT09IHNlY3Rpb25UaXRsZVxuICAgICk7XG4gICAgY29uc3QgaXRlbSA9IHNlY3Rpb24/Lml0ZW1zPy5maW5kKChpKSA9PiBpLmxhYmVsID09PSBpdGVtTGFiZWwpO1xuICAgIHJldHVybiAoaXRlbT8udmFsdWUgYXMgc3RyaW5nKSA/PyAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdmFsdWUgZnJvbSBEZXZpY2Ugc2VjdGlvbiAtIHN1cHBvcnRzIGJvdGggJ0RldmljZScgYW5kICdEZXZpY2UgU2V0dGluZycgdGl0bGVzICovXG4gIHByaXZhdGUgZ2V0RGV2aWNlQ29uZmlnVmFsdWUoaXRlbUxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbCA9XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgaXRlbUxhYmVsKSB8fFxuICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZSBTZXR0aW5nJywgaXRlbUxhYmVsKTtcbiAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsICE9PSAnJyAmJiBTdHJpbmcodmFsKS50cmltKCkgIT09ICcnID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdmFsdWUgZnJvbSBXYWl0cyBzZWN0aW9uIC0gc3VwcG9ydHMgYm90aCAnV2FpdCBhbmQgcmV0cmllcycgYW5kICdXYWl0cyAmIFJldHJpZXMnIHRpdGxlcyAqL1xuICBwcml2YXRlIGdldFdhaXRzUmV0cmllc1ZhbHVlKGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB2MSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0IGFuZCByZXRyaWVzJywgaXRlbUxhYmVsKTtcbiAgICBjb25zdCB2MiA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0cyAmIFJldHJpZXMnLCBpdGVtTGFiZWwpO1xuICAgIGNvbnN0IHZhbCA9ICh2MSAhPT0gJycgJiYgdjEgIT0gbnVsbCkgPyB2MSA6IHYyO1xuICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnICYmIFN0cmluZyh2YWwpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmVyZXF1aXNpdGVDYXNlc0Zyb21Db25maWcoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnUHJlcmVxdWlzaXRlIENhc2UnKTtcbiAgICBpZiAoIXZhbCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB2YWwuaW5jbHVkZXMoJywnKSA/IHZhbC5zcGxpdCgnLCcpLm1hcCgocykgPT4gcy50cmltKCkpLmZpbHRlcihCb29sZWFuKSA6IFt2YWxdO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0RGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uQ29udGVudDtcbiAgICB0aGlzLmVkaXRTdGF0dXMgPSB0aGlzLnN0YXR1c0l0ZW0/LnZhbHVlID8/ICcnO1xuICAgIHRoaXMuZWRpdFByaW9yaXR5ID0gdGhpcy5wcmlvcml0eUl0ZW0/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHR5cGVWYWwgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVNldFZhbCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFNldCcpID8/ICcnO1xuICAgIHRoaXMuZWRpdExhYmVscyA9IFsuLi50aGlzLmxhYmVsc107XG4gICAgY29uc3QgYXV0b1dhaXRWYWwgPSB0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdFbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwcycpIHx8IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0cyAmIFJldHJpZXMnLCAnQXV0byBXYWl0Jyk7XG4gICAgdGhpcy5hdXRvV2FpdEVuYWJsZWQgPSAhIShhdXRvV2FpdFZhbCAmJiBhdXRvV2FpdFZhbC50cmltKCkgIT09ICcnICYmIFN0cmluZyhhdXRvV2FpdFZhbCkgIT09ICdmYWxzZScpO1xuICAgIHRoaXMucmV0cnlGYWlsZWRTdGVwcyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1JldHJ5IEZhaWxlZCBTdGVwcycpO1xuICAgIHRoaXMudGVzdENhc2VUaW1lb3V0ID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJyk7XG4gICAgdGhpcy53YWl0VGltZW91dExvY2F0b3JzID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnV2FpdCBUaW1lb3V0IGZvciBMb2NhdG9ycyAoc2VjcyknKTtcbiAgICB0aGlzLm1vYmlsZVRlc3RpbmdFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ01vYmlsZSBUZXN0aW5nJyk7XG4gICAgdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0V4dGVuc2lvbiBVc2UnKTtcbiAgICB0aGlzLmRhdGFEcml2ZW5FbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0RhdGEgRHJpdmVuJyk7XG4gICAgY29uc3QgZW5hYmxlQWlTbWFydG5lc3MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgU21hcnRuZXNzJyk7XG4gICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRGVmYXVsdCBBSSBBY3Rpb24nKTtcbiAgICBjb25zdCBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnS25vd2xlZGdlIEJhc2UgRGVmYXVsdCBUZXN0IENhc2UnKTtcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKTtcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodXNlQWlNZXRhZGF0YVJhdyk7XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSB0aGlzLmdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpO1xuICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID1cbiAgICAgIHRoaXMucGxhdGZvcm0gPT09ICd3ZWInXG4gICAgICAgID8gdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnRGVmYXVsdCBCcm93c2VyJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdEZWZhdWx0IEJyb3dzZXInKVxuICAgICAgICA6IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJyk7XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmdSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1ZpZGVvIFJlY29yZGluZycpO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodmlkZW9SZWNvcmRpbmdSYXcgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0gdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnRGVmYXVsdCBWaWV3cG9ydCcpIHx8IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ1ZpZXdwb3J0JykgfHwgJyc7XG4gICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnVHlwZScpO1xuICAgIGNvbnN0IGRldmljZU9TID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdPUycpO1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgc3RhdHVzOiB0aGlzLmVkaXRTdGF0dXMsXG4gICAgICBwcmlvcml0eTogdGhpcy5lZGl0UHJpb3JpdHksXG4gICAgICB0eXBlOiB0eXBlVmFsIHx8ICcnLFxuICAgICAgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGU6IHRlc3REYXRhUHJvZmlsZVZhbCB8fCAnJyxcbiAgICAgIHRlc3REYXRhU2V0OiB0ZXN0RGF0YVNldFZhbCB8fCAnJyxcbiAgICAgIHByZXJlcXVpc2l0ZUNhc2VzLFxuICAgICAgZGVmYXVsdEJyb3dzZXI6IGRlZmF1bHRCcm93c2VyIHx8ICdDaHJvbWUnLFxuICAgICAgdmlkZW9SZWNvcmRpbmc6IHZpZGVvUmVjb3JkaW5nIHx8ICcnLFxuICAgICAgZGVmYXVsdFZpZXdwb3J0OiBkZWZhdWx0Vmlld3BvcnQgfHwgJycsXG4gICAgICBkZXZpY2VUeXBlOiBkZXZpY2VUeXBlIHx8ICcnLFxuICAgICAgZGV2aWNlT1M6IGRldmljZU9TIHx8ICcnLFxuICAgICAgZW5hYmxlQWlTbWFydG5lc3M6IGVuYWJsZUFpU21hcnRuZXNzIHx8ICdBZHZhbmNlZCcsXG4gICAgICBkZWZhdWx0QWlBY3Rpb246IGRlZmF1bHRBaUFjdGlvbiB8fCAnU21hcnQgd2FpdCcsXG4gICAgICBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlOiBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlIHx8ICdub25lJyxcbiAgICAgIHVzZUFpTWV0YWRhdGE6IHVzZUFpTWV0YWRhdGEgfHwgJycsXG4gICAgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh2YWw6IHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSAndHJ1ZScpIHJldHVybiAndHJ1ZSc7XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UgfHwgdmFsID09PSAnZmFsc2UnKSByZXR1cm4gJ2ZhbHNlJztcbiAgICBpZiAodmFsID09PSAnT3JnIGxldmVsJyB8fCB2YWwgPT09ICdPcmcgTGV2ZWwnKSByZXR1cm4gJ09yZyBsZXZlbCc7XG4gICAgaWYgKHZhbCA9PT0gJ09uIFdhaXQnIHx8IHZhbCA9PT0gJ29uIHdhaXQnKSByZXR1cm4gJ3RydWUnO1xuICAgIHJldHVybiB2YWwgJiYgU3RyaW5nKHZhbCkudHJpbSgpID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydsYWJlbHMnXSB8fCBjaGFuZ2VzWydzZWxlY3RDb25maWdPdmVycmlkZXMnXSkge1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGVzY3JpcHRpb25Db250ZW50J10gfHwgY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1snbWV0YWRhdGFJdGVtcyddKSB7XG4gICAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25Db250ZW50O1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMubGFiZWxzXTtcbiAgICAgIHRoaXMuZWRpdFN0YXR1cyA9IHRoaXMuc3RhdHVzSXRlbT8udmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKTtcbiAgICAgIGNvbnN0IHByaW9yaXR5Q29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmlvcml0eScpO1xuICAgICAgY29uc3QgdHlwZUNvbnRyb2wgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpO1xuICAgICAgY29uc3QgbGFiZWxzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVN0YXR1cyA9IHN0YXR1c0NvbnRyb2w/LnRvdWNoZWQgfHwgc3RhdHVzQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVByaW9yaXR5ID0gcHJpb3JpdHlDb250cm9sPy50b3VjaGVkIHx8IHByaW9yaXR5Q29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVR5cGUgPSB0eXBlQ29udHJvbD8udG91Y2hlZCB8fCB0eXBlQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZUxhYmVscyA9IGxhYmVsc0NvbnRyb2w/LnRvdWNoZWQgfHwgbGFiZWxzQ29udHJvbD8uZGlydHk7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi4ocHJlc2VydmVTdGF0dXMgPyB7fSA6IHsgc3RhdHVzOiB0aGlzLmVkaXRTdGF0dXMgfSksXG4gICAgICAgIC4uLihwcmVzZXJ2ZVByaW9yaXR5ID8ge30gOiB7IHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSB9KSxcbiAgICAgICAgLi4uKHByZXNlcnZlVHlwZSA/IHt9IDogeyB0eXBlOiB0eXBlVmFsIH0pLFxuICAgICAgICAuLi4ocHJlc2VydmVMYWJlbHMgPyB7fSA6IHsgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ByZXJlcXVpc2l0ZUNhc2VPcHRpb25zJ10gJiYgdGhpcy5wcmVyZXF1aXNpdGVDYXNlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5wcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnLFxuICAgICAgICBvcHRpb25zOiB0aGlzLnByZXJlcXVpc2l0ZUNhc2VPcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZ1NlY3Rpb25zJ10gfHwgY2hhbmdlc1snY29uZmlnU2VjdGlvbnNSb3cyJ10pIHtcbiAgICAgIGNvbnN0IGVuYWJsZUFpU21hcnRuZXNzID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRGVmYXVsdCBBSSBBY3Rpb24nKTtcbiAgICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScpO1xuICAgICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSB0aGlzLmdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpO1xuICAgICAgY29uc3QgdHlwZVZhbCA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBQcm9maWxlJykgPz8gJyc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVNldFZhbCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFNldCcpID8/ICcnO1xuICAgICAgY29uc3QgZGVmYXVsdEJyb3dzZXIgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ0RlZmF1bHQgQnJvd3NlcicpO1xuICAgICAgY29uc3QgdmlkZW9SZWNvcmRpbmdSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1ZpZGVvIFJlY29yZGluZycpO1xuICAgICAgY29uc3QgdmlkZW9SZWNvcmRpbmcgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh2aWRlb1JlY29yZGluZ1JhdyBhcyBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IHVzZUFpTWV0YWRhdGFSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgbWV0YWRhdGEgY29sbGVjdGlvbicpO1xuICAgICAgY29uc3QgdXNlQWlNZXRhZGF0YSA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHVzZUFpTWV0YWRhdGFSYXcgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdEZWZhdWx0IFZpZXdwb3J0JykgfHwgdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnVmlld3BvcnQnKSB8fCAnJztcbiAgICAgIGNvbnN0IGRldmljZVR5cGUgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ1R5cGUnKTtcbiAgICAgIGNvbnN0IGRldmljZU9TID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdPUycpO1xuICAgICAgY29uc3QgYXV0b1dhaXRWYWwgPSB0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdFbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwcycpIHx8IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0cyAmIFJldHJpZXMnLCAnQXV0byBXYWl0Jyk7XG4gICAgICB0aGlzLmF1dG9XYWl0RW5hYmxlZCA9ICEhKGF1dG9XYWl0VmFsICYmIGF1dG9XYWl0VmFsLnRyaW0oKSAhPT0gJycgJiYgU3RyaW5nKGF1dG9XYWl0VmFsKSAhPT0gJ2ZhbHNlJyk7XG4gICAgICB0aGlzLnJldHJ5RmFpbGVkU3RlcHMgPSB0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdSZXRyeSBGYWlsZWQgU3RlcHMnKTtcbiAgICAgIHRoaXMudGVzdENhc2VUaW1lb3V0ID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJyk7XG4gICAgICB0aGlzLndhaXRUaW1lb3V0TG9jYXRvcnMgPSB0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWNzKScpO1xuICAgICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgICAgdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0V4dGVuc2lvbiBVc2UnKTtcbiAgICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAoZW5hYmxlQWlTbWFydG5lc3MpIHBhdGNoWydlbmFibGVBaVNtYXJ0bmVzcyddID0gZW5hYmxlQWlTbWFydG5lc3M7XG4gICAgICBpZiAoZGVmYXVsdEFpQWN0aW9uKSBwYXRjaFsnZGVmYXVsdEFpQWN0aW9uJ10gPSBkZWZhdWx0QWlBY3Rpb247XG4gICAgICBpZiAoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U7XG4gICAgICBpZiAodXNlQWlNZXRhZGF0YSkgcGF0Y2hbJ3VzZUFpTWV0YWRhdGEnXSA9IHVzZUFpTWV0YWRhdGE7XG4gICAgICBpZiAocHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoKSBwYXRjaFsncHJlcmVxdWlzaXRlQ2FzZXMnXSA9IHByZXJlcXVpc2l0ZUNhc2VzO1xuICAgICAgaWYgKHR5cGVWYWwpIHBhdGNoWyd0eXBlJ10gPSB0eXBlVmFsO1xuICAgICAgaWYgKHRlc3REYXRhUHJvZmlsZVZhbCkgcGF0Y2hbJ3Rlc3REYXRhUHJvZmlsZSddID0gdGVzdERhdGFQcm9maWxlVmFsO1xuICAgICAgaWYgKHRlc3REYXRhU2V0VmFsKSBwYXRjaFsndGVzdERhdGFTZXQnXSA9IHRlc3REYXRhU2V0VmFsO1xuICAgICAgaWYgKGRlZmF1bHRCcm93c2VyKSBwYXRjaFsnZGVmYXVsdEJyb3dzZXInXSA9IGRlZmF1bHRCcm93c2VyO1xuICAgICAgaWYgKHZpZGVvUmVjb3JkaW5nKSBwYXRjaFsndmlkZW9SZWNvcmRpbmcnXSA9IHZpZGVvUmVjb3JkaW5nO1xuICAgICAgaWYgKGRlZmF1bHRWaWV3cG9ydCkgcGF0Y2hbJ2RlZmF1bHRWaWV3cG9ydCddID0gZGVmYXVsdFZpZXdwb3J0O1xuICAgICAgaWYgKGRldmljZVR5cGUpIHBhdGNoWydkZXZpY2VUeXBlJ10gPSBkZXZpY2VUeXBlO1xuICAgICAgaWYgKGRldmljZU9TKSBwYXRjaFsnZGV2aWNlT1MnXSA9IGRldmljZU9TO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZShwYXRjaCk7XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gdGhpcy5lZGl0TGFiZWxzLmZpbHRlcigobCkgPT4gbCAhPT0gbGFiZWwpO1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpPy5zZXRWYWx1ZSh0aGlzLmVkaXRMYWJlbHMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ2xlYXJBbGxMYWJlbHMoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gW107XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkFkZEZyZXF1ZW50TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKGxhYmVsKSkge1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMuZWRpdExhYmVscywgbGFiZWxdO1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKT8uc2V0VmFsdWUodGhpcy5lZGl0TGFiZWxzLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBvblNhdmUoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3N0YXR1cycpPy52YWx1ZSA/PyB0aGlzLmVkaXRTdGF0dXM7XG4gICAgY29uc3QgcHJpb3JpdHkgPSB0aGlzLmVkaXRGb3JtLmdldCgncHJpb3JpdHknKT8udmFsdWUgPz8gdGhpcy5lZGl0UHJpb3JpdHk7XG4gICAgY29uc3QgdHlwZVZhbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFTZXQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgY29uZmlnU2VjdGlvbnNNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnMoKTtcbiAgICBjb25zdCBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQgPSB0aGlzLm1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk7XG4gICAgdGhpcy5zYXZlLmVtaXQoe1xuICAgICAgZGVzY3JpcHRpb25Db250ZW50OiB0aGlzLmVkaXREZXNjcmlwdGlvbixcbiAgICAgIHN0YXR1cyxcbiAgICAgIHByaW9yaXR5LFxuICAgICAgdHlwZTogdHlwZVZhbCxcbiAgICAgIGxhYmVsczogdGhpcy5lZGl0TGFiZWxzLFxuICAgICAgdGVzdERhdGFQcm9maWxlSWQ6IHRlc3REYXRhUHJvZmlsZVZhbCB8fCBudWxsLFxuICAgICAgdGVzdERhdGFTZXRJbmRleDogdGVzdERhdGFTZXRWYWwgPz8gbnVsbCxcbiAgICAgIGNvbmZpZ1NlY3Rpb25zOiBjb25maWdTZWN0aW9uc01lcmdlZCxcbiAgICAgIGNvbmZpZ1NlY3Rpb25zUm93MjogY29uZmlnU2VjdGlvbnNSb3cyTWVyZ2VkLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1NlY3Rpb25zKCk6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndmlkZW9SZWNvcmRpbmcnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmcgPSB2aWRlb1JlY29yZGluZ1ZhbHVlID09PSAndHJ1ZScgPyB0cnVlIDogdmlkZW9SZWNvcmRpbmdWYWx1ZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdmlkZW9SZWNvcmRpbmdWYWx1ZTtcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndXNlQWlNZXRhZGF0YScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdXNlQWlNZXRhZGF0YVZhbHVlID09PSAndHJ1ZScgPyB0cnVlIDogdXNlQWlNZXRhZGF0YVZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB1c2VBaU1ldGFkYXRhVmFsdWU7XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXNSYXcgPSB0aGlzLmVkaXRGb3JtLmdldCgncHJlcmVxdWlzaXRlQ2FzZXMnKT8udmFsdWU7XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSBBcnJheS5pc0FycmF5KHByZXJlcXVpc2l0ZUNhc2VzUmF3KVxuICAgICAgPyBwcmVyZXF1aXNpdGVDYXNlc1Jhdy5tYXAoKHYpID0+IFN0cmluZyh2KSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICA6IHByZXJlcXVpc2l0ZUNhc2VzUmF3ICE9IG51bGwgJiYgcHJlcmVxdWlzaXRlQ2FzZXNSYXcgIT09ICcnXG4gICAgICAgID8gW1N0cmluZyhwcmVyZXF1aXNpdGVDYXNlc1JhdyldXG4gICAgICAgIDogW107XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZVZhbHVlID0gcHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoID8gcHJlcmVxdWlzaXRlQ2FzZXMuam9pbignLCcpIDogbnVsbDtcbiAgICBjb25zdCB0eXBlVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpPy52YWx1ZSA/PyAnJztcbiAgICByZXR1cm4gdGhpcy5jb25maWdTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRXhlY3V0aW9uJykge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHNlY3Rpb24uaXRlbXNcbiAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiAhKHBsYXRmb3JtID09PSAnd2ViJyAmJiBpdGVtLmxhYmVsID09PSAnRGVmYXVsdCBCcm93c2VyJykpXG4gICAgICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdWaWRlbyBSZWNvcmRpbmcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdmlkZW9SZWNvcmRpbmcgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnUHJlcmVxdWlzaXRlIENhc2UnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogcHJlcmVxdWlzaXRlQ2FzZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1R5cGUnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdHlwZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1Rlc3QgRGF0YSBQcm9maWxlJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRlc3REYXRhUHJvZmlsZVZhbHVlIH07XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1Rlc3QgRGF0YSBTZXQnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGVzdERhdGFTZXRWYWx1ZSB9O1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbi50aXRsZSA9PT0gJ0FJIENvbmZpZ3VyYXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtcy5tYXAoKGl0ZW0pID0+XG4gICAgICAgICAgaXRlbS5sYWJlbCA9PT0gJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyA/IHsgLi4uaXRlbSwgdmFsdWU6IHVzZUFpTWV0YWRhdGEgfSA6IGl0ZW1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ1NlY3Rpb25zUm93MigpOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10ge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcbiAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0QnJvd3NlcicpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGVmYXVsdFZpZXdwb3J0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRldmljZVR5cGUgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGV2aWNlVHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCBkZXZpY2VPUyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZXZpY2VPUycpPy52YWx1ZSA/PyAnJztcblxuICAgIGxldCByZXN1bHQgPSB0aGlzLmNvbmZpZ1NlY3Rpb25zUm93Mi5tYXAoKHNlY3Rpb24pID0+IHtcbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnV2FpdHMgJiBSZXRyaWVzJyB8fCBzZWN0aW9uLnRpdGxlID09PSAnV2FpdCBhbmQgcmV0cmllcycpIHtcbiAgICAgICAgY29uc3QgYXV0b1dhaXRWYWx1ZSA9IHRoaXMuYXV0b1dhaXRFbmFibGVkID8gJ0VuYWJsZWQnIDogJyc7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0F1dG8gV2FpdCcpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiBhdXRvV2FpdFZhbHVlIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdFbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwcycpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0aGlzLmF1dG9XYWl0RW5hYmxlZCB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnUmV0cnkgRmFpbGVkIFN0ZXBzJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMucmV0cnlGYWlsZWRTdGVwcyB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMudGVzdENhc2VUaW1lb3V0IH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWNzKScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0aGlzLndhaXRUaW1lb3V0TG9jYXRvcnMgfTtcbiAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbi50aXRsZSA9PT0gJ0RldmljZScgfHwgc2VjdGlvbi50aXRsZSA9PT0gJ0RldmljZSBTZXR0aW5nJykge1xuICAgICAgICBjb25zdCBpdGVtczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcbiAgICAgICAgICAuLi4ocGxhdGZvcm0gPT09ICd3ZWInXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBCcm93c2VyJywgdmFsdWU6IGRlZmF1bHRCcm93c2VyIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmlld3BvcnQnLCB2YWx1ZTogZGVmYXVsdFZpZXdwb3J0IH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdUeXBlJywgdmFsdWU6IGRldmljZVR5cGUgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnT1MnLCB2YWx1ZTogZGV2aWNlT1MgfSxcbiAgICAgICAgICAgICAgXSksXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiB7IC4uLnNlY3Rpb24sIGl0ZW1zIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlID0gcmVzdWx0LmZpbmQoKHMpID0+IHMudGl0bGUgPT09ICdEZXZpY2UnIHx8IHMudGl0bGUgPT09ICdEZXZpY2UgU2V0dGluZycpO1xuICAgIGlmICghZXhpc3RpbmdEZXZpY2UpIHtcbiAgICAgIGNvbnN0IGRldmljZVNlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24gPSB7XG4gICAgICAgIHRpdGxlOiAnRGV2aWNlJyxcbiAgICAgICAgaWNvbjogJ2RldmljZXMnLFxuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIC4uLihwbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IEJyb3dzZXInLCB2YWx1ZTogZGVmYXVsdEJyb3dzZXIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsIHZhbHVlOiBkZWZhdWx0Vmlld3BvcnQgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCB2YWx1ZTogZGV2aWNlVHlwZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdPUycsIHZhbHVlOiBkZXZpY2VPUyB9LFxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCBkZXZpY2VTZWN0aW9uXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlGbGFnc1NlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24gPSB7XG4gICAgICB0aXRsZTogJ0tleSBGbGFncycsXG4gICAgICBpY29uOiAnZmxhZycsXG4gICAgICBpdGVtczogW1xuICAgICAgICB7IGxhYmVsOiAnTW9iaWxlIFRlc3RpbmcnLCB2YWx1ZTogdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA/ICdFbmFibGVkJyA6ICcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFeHRlbnNpb24gVXNlJywgdmFsdWU6IHRoaXMuZXh0ZW5zaW9uVXNlRW5hYmxlZCA/ICdFbmFibGVkJyA6ICcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEYXRhIERyaXZlbicsIHZhbHVlOiB0aGlzLmRhdGFEcml2ZW5FbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBjb25zdCBleGlzdGluZ0tleUZsYWdzID0gcmVzdWx0LmZpbmQoKHMpID0+IHMudGl0bGUgPT09ICdLZXkgRmxhZ3MnKTtcbiAgICBpZiAoZXhpc3RpbmdLZXlGbGFncykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcCgocykgPT5cbiAgICAgICAgcy50aXRsZSA9PT0gJ0tleSBGbGFncycgPyBrZXlGbGFnc1NlY3Rpb24gOiBzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCBrZXlGbGFnc1NlY3Rpb25dO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgdHJhY2tCeUxhYmVsKF9pOiBudW1iZXIsIGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIHRyYWNrQnlDb25maWdUaXRsZShfaTogbnVtYmVyLCBzZWN0aW9uOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2VjdGlvbi50aXRsZTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGxhYmVscyB1c2UgY29uc2lzdGVudCBpbmRpZ28gc3R5bGUgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBMQUJFTF9DSElQX1NUWUxFID0ge1xuICAgIGJnOiAnIzYzNjZGMScsXG4gICAgYm9yZGVyOiAnIzYzNjZGMScsXG4gICAgdGV4dDogJyNGRkZGRkYnLFxuICAgIGljb246ICcjRkZGRkZGJyxcbiAgfTtcblxuICBnZXRDdXJyZW50TGFiZWxDaGlwU3R5bGUoX2xhYmVsOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLkxBQkVMX0NISVBfU1RZTEU7XG4gICAgcmV0dXJuIHtcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogY29sb3JzLmJnLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IGNvbG9ycy5ib3JkZXIsXG4gICAgICAnYm9yZGVyLXdpZHRoJzogJzFweCcsXG4gICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAgIGNvbG9yOiBjb2xvcnMudGV4dCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TGFiZWxDbG9zZUljb25Db2xvcihfbGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuTEFCRUxfQ0hJUF9TVFlMRS5pY29uO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLXNlbGYtc3RyZXRjaCBjcWEtcHktNCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1yb3VuZGVkLWxnXCI+XG4gIDwhLS0gRGVzY3JpcHRpb24gKEZpZ21hOiBkb2N1bWVudCBpY29uLCB0ZXh0YXJlYSB3aXRoIGxpZ2h0IHB1cnBsZSBiZykgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+ZGVzY3JpcHRpb248L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtbGVhZGluZy1bMTkuNnB4XVwiPnt7IGRlc2NyaXB0aW9uVGl0bGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGNxYS1jdXN0b20tdGV4dGFyZWFcbiAgICAgIFt2YWx1ZV09XCJlZGl0RGVzY3JpcHRpb25cIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cImVkaXREZXNjcmlwdGlvbiA9ICRldmVudFwiXG4gICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgW3Jvd3NdPVwiNFwiXG4gICAgICBbZW5hYmxlTWFya2Rvd25dPVwiZW5hYmxlTWFya2Rvd25cIlxuICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBkZXNjcmlwdGlvbi4uLlwiXG4gICAgICB0ZXh0YXJlYUlubGluZVN0eWxlPVwicGFkZGluZzogMTJweDsgZm9udC1zaXplOiAxMnB4OyBsaW5lLWhlaWdodDogMTAwJVwiXG4gICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICA8L2NxYS1jdXN0b20tdGV4dGFyZWE+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU3RhdHVzLCBQcmlvcml0eSAmIFR5cGUgKEZpZ21hOiBzaWRlLWJ5LXNpZGUgZHJvcGRvd25zLCBjcWEtZHluYW1pYy1zZWxlY3QpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtNFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+U3RhdHVzPC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3N0YXR1cycsIHN0YXR1c1NlbGVjdENvbmZpZylcIlxuICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdzdGF0dXMnKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPlByaW9yaXR5PC9sYWJlbD5cbiAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3ByaW9yaXR5JywgcHJpb3JpdHlTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgncHJpb3JpdHknKVwiXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPlR5cGU8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndHlwZScsIHR5cGVTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndHlwZScpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExhYmVscyAoRmlnbWE6IEN1cnJlbnQgTGFiZWxzIHdpdGggQ2xlYXIgQWxsLCBjcWEtYmFkZ2Ugd2l0aCB4LCBGcmVxdWVudGx5IHVzZWQsIFNlYXJjaCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTVweF0gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+Q3VycmVudCBMYWJlbHMgKHt7IGVkaXRMYWJlbHMubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwiZWRpdExhYmVscy5sZW5ndGggPiAwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bI0RDMjYyNl0gaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtZm9udC1ub3JtYWxcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhckFsbExhYmVscygpXCI+XG4gICAgICAgIENsZWFyIEFsbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCIgKm5nSWY9XCJlZGl0TGFiZWxzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGVkaXRMYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlMYWJlbFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXB4LTIuNSBjcWEtcHktMSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXJvdW5kZWQtbWQgY3FhLWJvcmRlclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShsYWJlbClcIj5cbiAgICAgICAgPHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTMuNSBjcWEtaC0zLjUgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0TGFiZWxDbG9zZUljb25Db2xvcihsYWJlbClcIlxuICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUxhYmVsKGxhYmVsKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlICcgKyBsYWJlbFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdy0zLjUgY3FhLWgtMy41XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5GcmVxdWVudGx5IHVzZWQ8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBmcmVxdWVudGx5VXNlZExhYmVsczsgdHJhY2tCeTogdHJhY2tCeUxhYmVsXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbClcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFOEU5RkZcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwiIzNGNDNFRVwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNFOEU5RkZcIj5cbiAgICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+QWRkIGxhYmVsczwvbGFiZWw+XG4gICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgW2NvbmZpZ109XCJsYWJlbHNTZWxlY3RDb25maWdcIlxuICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnbGFiZWxzJylcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkxhYmVsc0FkZEN1c3RvbVZhbHVlKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ29uZmlndXJhdGlvbiAoRmlnbWE6IGNvbGxhcHNpYmxlLCBnZWFyIGljb24sIGxpZ2h0IHB1cnBsZSBpbnB1dHMpIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzEycHhdXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS10ZXh0LWxlZnQgY3FhLXctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS41cHhdXCI+e3sgY29uZmlnVGl0bGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsxNnB4XSBjcWEtcHktMCBjcWEtcHgtM1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTUgY3FhLXB4LTMgY3FhLXRleHQteHNcIj5cbiAgICAgICAgPCEtLSBFeGVjdXRpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41IGNxYS1taW4tdy0wIGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFMkU4RjBdXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgIChjbGljayk9XCJleGVjdXRpb25FeHBhbmRlZCA9ICFleGVjdXRpb25FeHBhbmRlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5wbGF5X2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+RXhlY3V0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgIHt7IGV4ZWN1dGlvbkV4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImV4ZWN1dGlvbkV4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5QcmVyZXF1aXNpdGUgQ2FzZTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgncHJlcmVxdWlzaXRlQ2FzZXMnLCBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByZXJlcXVpc2l0ZUNhc2VzJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bVwiPlRlc3QgRGF0YSBQcm9maWxlPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCd0ZXN0RGF0YVByb2ZpbGUnLCB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndGVzdERhdGFQcm9maWxlJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJlZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpPy52YWx1ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5UZXN0IERhdGEgU2V0PC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCd0ZXN0RGF0YVNldCcsIHRlc3REYXRhU2V0U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3Rlc3REYXRhU2V0JylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bVwiPlZpZGVvIFJlY29yZGluZzwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndmlkZW9SZWNvcmRpbmcnLCB2aWRlb1JlY29yZGluZ1NlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCd2aWRlb1JlY29yZGluZycpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBBSSBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41IGNxYS1weS0wIGNxYS1taW4tdy0wIGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFMkU4RjBdXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFpQ29uZmlnRXhwYW5kZWQgPSAhYWlDb25maWdFeHBhbmRlZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5zbWFydF90b3k8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5BSSBDb25maWd1cmF0aW9uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICAgIHt7IGFpQ29uZmlnRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWlDb25maWdFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtcHktMCBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdlbmFibGVBaVNtYXJ0bmVzcycsIGVuYWJsZUFpU21hcnRuZXNzU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2VuYWJsZUFpU21hcnRuZXNzJylcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEFpQWN0aW9uJywgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRBaUFjdGlvbicpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnLCBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnKVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCd1c2VBaU1ldGFkYXRhJywgYWlNZXRhZGF0YUNvbGxlY3Rpb25TZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndXNlQWlNZXRhZGF0YScpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gV2FpdHMgJiBSZXRyaWVzLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwid2FpdHNSZXRyaWVzRXhwYW5kZWQgPSAhd2FpdHNSZXRyaWVzRXhwYW5kZWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+dGltZXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5XYWl0IGFuZCBSZXRyaWVzPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICAgIHt7IHdhaXRzUmV0cmllc0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIndhaXRzUmV0cmllc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJhdXRvV2FpdEVuYWJsZWRcIiAoY2hlY2tlZENoYW5nZSk9XCJhdXRvV2FpdEVuYWJsZWQgPSAkZXZlbnRcIiBhcmlhTGFiZWw9XCJFbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwc1wiPjwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlJldHJ5IEZhaWxlZCBTdGVwc1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJldHJ5RmFpbGVkU3RlcHNcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJyZXRyeUZhaWxlZFN0ZXBzID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICBsYWJlbElubGluZVN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuNnB4XCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgbGFiZWw9XCJUZXN0IENhc2UgVGltZW91dCAobWludXRlcylcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0ZXN0Q2FzZVRpbWVvdXRcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ0ZXN0Q2FzZVRpbWVvdXQgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMzBcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICBsYWJlbElubGluZVN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuNnB4XCI+XG4gICAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgICAgICAgICAgbGFiZWw9XCJXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWNzKVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIndhaXRUaW1lb3V0TG9jYXRvcnNcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ3YWl0VGltZW91dExvY2F0b3JzID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjE1XCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgbGFiZWxJbmxpbmVTdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRGV2aWNlIFNldHRpbmdzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMi41IGNxYS1taW4tdy0wIGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNFMkU4RjBdXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtdy1mdWxsIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLXAtMCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRldmljZUV4cGFuZGVkID0gIWRldmljZUV4cGFuZGVkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRldmljZXM8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5EZXZpY2UgU2V0dGluZ3M8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgICAge3sgZGV2aWNlRXhwYW5kZWQgPyAnZXhwYW5kX2xlc3MnIDogJ2V4cGFuZF9tb3JlJyB9fVxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV2aWNlRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBsYXRmb3JtID09PSAnd2ViJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdkZWZhdWx0QnJvd3NlcicsIGRlZmF1bHRCcm93c2VyU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRCcm93c2VyJylcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdFZpZXdwb3J0JywgZGVmYXVsdFZpZXdwb3J0U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRWaWV3cG9ydCcpXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwbGF0Zm9ybSA9PT0gJ21vYmlsZSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGV2aWNlVHlwZScsIGRldmljZVR5cGVTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZGV2aWNlVHlwZScpXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2RldmljZU9TJywgZGV2aWNlT1NTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZGV2aWNlT1MnKVwiXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEtleSBGbGFncyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgIChjbGljayk9XCJrZXlGbGFnc0V4cGFuZGVkID0gIWtleUZsYWdzRXhwYW5kZWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+ZmxhZzwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPktleSBGbGFnczwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2NDc0OEJdIGNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPlxuICAgICAgICAgICAgICB7eyBrZXlGbGFnc0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImtleUZsYWdzRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJtb2JpbGVUZXN0aW5nRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cIm1vYmlsZVRlc3RpbmdFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiTW9iaWxlIFRlc3RpbmdcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5Nb2JpbGUgVGVzdGluZzwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImV4dGVuc2lvblVzZUVuYWJsZWRcIiAoY2hlY2tlZENoYW5nZSk9XCJleHRlbnNpb25Vc2VFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiRXh0ZW5zaW9uIFVzZVwiPjwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPkV4dGVuc2lvbiBVc2U8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJkYXRhRHJpdmVuRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImRhdGFEcml2ZW5FbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiRGF0YSBEcml2ZW5cIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5EYXRhIERyaXZlbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC0zIGNxYS1wdC0yIGNxYS13LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgW3RleHRdPVwiJ0NhbmNlbCdcIlxuICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICBbdGV4dF09XCInU2F2ZSBDaGFuZ2VzJ1wiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIChjbGlja2VkKT1cIm9uU2F2ZSgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|