@cqa-lib/cqa-ui 1.1.543 → 1.1.545
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/templates/modular-table-template/dialogs/delete-folder-dialog.component.mjs +7 -7
- package/esm2020/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.mjs +23 -23
- package/esm2020/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.mjs +2 -2
- package/esm2020/lib/templates/modular-table-template/directives/folder-drop.directive.mjs +2 -2
- package/esm2020/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.mjs +10 -10
- package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +15 -15
- package/esm2020/lib/templates/modular-table-template/modular-table-template.models.mjs +8 -8
- package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs +159 -7
- package/esm2020/lib/test-case-details/test-case-details.component.mjs +7 -3
- package/esm2020/lib/ui-kit.module.mjs +6 -1
- package/esm2020/lib/viewport-selector/viewport-selector.component.mjs +348 -0
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +583 -104
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +599 -101
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/templates/modular-table-template/dialogs/move-to-folder-dialog.component.d.ts +2 -2
- package/lib/templates/modular-table-template/dialogs/new-folder-dialog.component.d.ts +1 -1
- package/lib/templates/modular-table-template/directives/folder-drop.directive.d.ts +1 -1
- package/lib/templates/modular-table-template/folder-sidebar/folder-sidebar.component.d.ts +5 -5
- package/lib/templates/modular-table-template/modular-table-template.component.d.ts +8 -8
- package/lib/templates/modular-table-template/modular-table-template.models.d.ts +7 -7
- package/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.d.ts +30 -1
- package/lib/test-case-details/test-case-details.component.d.ts +8 -1
- package/lib/ui-kit.module.d.ts +189 -188
- package/lib/viewport-selector/viewport-selector.component.d.ts +74 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/styles.css +1 -1
package/esm2020/lib/test-case-details/test-case-details-edit/test-case-details-edit.component.mjs
CHANGED
|
@@ -8,9 +8,11 @@ import * as i4 from "../../badge/badge.component";
|
|
|
8
8
|
import * as i5 from "../../custom-toggle/custom-toggle.component";
|
|
9
9
|
import * as i6 from "../../custom-input/custom-input.component";
|
|
10
10
|
import * as i7 from "../../dropdown-button/dropdown-button.component";
|
|
11
|
-
import * as i8 from "
|
|
12
|
-
import * as i9 from "
|
|
13
|
-
import * as i10 from "
|
|
11
|
+
import * as i8 from "../../radio-card-group/radio-card-group.component";
|
|
12
|
+
import * as i9 from "../api-mocking-card/api-mocking-card.component";
|
|
13
|
+
import * as i10 from "../../button/button.component";
|
|
14
|
+
import * as i11 from "@angular/common";
|
|
15
|
+
import * as i12 from "@angular/forms";
|
|
14
16
|
/** Sentinel value emitted in save payloads to tell the host to send null for the field (use org-level default). */
|
|
15
17
|
const ORG_LEVEL_SENTINEL = 'Org level';
|
|
16
18
|
/** Keys for each dynamic select in test-case-details-edit. Use these with selectConfigOverrides. */
|
|
@@ -93,6 +95,8 @@ export class TestCaseDetailsEditComponent {
|
|
|
93
95
|
/** Forwarded to `cqa-api-mocking-card`. In edit mode the card hides the block anyway, but
|
|
94
96
|
* we still pipe the input through for symmetry with the read-only component. */
|
|
95
97
|
this.apiMockingShowProgress = false;
|
|
98
|
+
/** Viewport dropdown options per category from the API. Pass DESKTOP, LAPTOP, TABLET, MOBILE arrays. */
|
|
99
|
+
this.viewportCategoryOptions = {};
|
|
96
100
|
this.save = new EventEmitter();
|
|
97
101
|
this.cancel = new EventEmitter();
|
|
98
102
|
/** Emitted when user searches in a select (serverSearch mode). Call API and update options via selectConfigOverrides. */
|
|
@@ -135,6 +139,48 @@ export class TestCaseDetailsEditComponent {
|
|
|
135
139
|
this.mobileTestingEnabled = false;
|
|
136
140
|
this.extensionUseEnabled = false;
|
|
137
141
|
this.dataDrivenEnabled = false;
|
|
142
|
+
this.viewportMode = 'desktop';
|
|
143
|
+
this.viewportDesktopDeviceForm = new FormGroup({ viewportDesktopDevice: new FormControl('') });
|
|
144
|
+
this.viewportLaptopDeviceForm = new FormGroup({ viewportLaptopDevice: new FormControl('') });
|
|
145
|
+
this.viewportTabletDeviceForm = new FormGroup({ viewportTabletDevice: new FormControl('') });
|
|
146
|
+
this.viewportMobileDeviceForm = new FormGroup({ viewportMobileDevice: new FormControl('') });
|
|
147
|
+
this.customViewportWidth = '';
|
|
148
|
+
this.customViewportHeight = '';
|
|
149
|
+
this.customViewportTags = [];
|
|
150
|
+
this.viewportModeOptions = [
|
|
151
|
+
{ value: 'desktop', label: 'Desktop', icon: 'desktop_windows' },
|
|
152
|
+
{ value: 'laptop', label: 'Laptop', icon: 'laptop_windows' },
|
|
153
|
+
{ value: 'tablet', label: 'Tablet', icon: 'tablet_mac' },
|
|
154
|
+
{ value: 'mobile', label: 'Mobile', icon: 'smartphone' },
|
|
155
|
+
];
|
|
156
|
+
this.desktopViewportConfig = {
|
|
157
|
+
key: 'viewportDesktopDevice',
|
|
158
|
+
label: '',
|
|
159
|
+
placeholder: 'Select resolution',
|
|
160
|
+
searchable: true,
|
|
161
|
+
options: [],
|
|
162
|
+
};
|
|
163
|
+
this.laptopViewportConfig = {
|
|
164
|
+
key: 'viewportLaptopDevice',
|
|
165
|
+
label: '',
|
|
166
|
+
placeholder: 'Select resolution',
|
|
167
|
+
searchable: true,
|
|
168
|
+
options: [],
|
|
169
|
+
};
|
|
170
|
+
this.tabletViewportConfig = {
|
|
171
|
+
key: 'viewportTabletDevice',
|
|
172
|
+
label: '',
|
|
173
|
+
placeholder: 'Select resolution',
|
|
174
|
+
searchable: true,
|
|
175
|
+
options: [],
|
|
176
|
+
};
|
|
177
|
+
this.mobileViewportConfig = {
|
|
178
|
+
key: 'viewportMobileDevice',
|
|
179
|
+
label: '',
|
|
180
|
+
placeholder: 'Select device',
|
|
181
|
+
searchable: true,
|
|
182
|
+
options: [],
|
|
183
|
+
};
|
|
138
184
|
this.frequentlyUsedLabels = FREQUENTLY_USED_LABELS;
|
|
139
185
|
this._initialFormSnapshot = null;
|
|
140
186
|
/** FormGroup for cqa-dynamic-select bindings */
|
|
@@ -547,6 +593,105 @@ export class TestCaseDetailsEditComponent {
|
|
|
547
593
|
const section = [...this.configSections, ...this.configSectionsRow2].find((s) => s.title === 'Execution');
|
|
548
594
|
return !!section?.items?.some((i) => i.label === 'Prerequisite Case');
|
|
549
595
|
}
|
|
596
|
+
initViewportFromValue(defaultViewport) {
|
|
597
|
+
const vp = String(defaultViewport || '');
|
|
598
|
+
this.customViewportWidth = '';
|
|
599
|
+
this.customViewportHeight = '';
|
|
600
|
+
this.customViewportTags = [];
|
|
601
|
+
this.viewportDesktopDeviceForm.reset({ viewportDesktopDevice: '' });
|
|
602
|
+
this.viewportLaptopDeviceForm.reset({ viewportLaptopDevice: '' });
|
|
603
|
+
this.viewportTabletDeviceForm.reset({ viewportTabletDevice: '' });
|
|
604
|
+
this.viewportMobileDeviceForm.reset({ viewportMobileDevice: '' });
|
|
605
|
+
if (vp.startsWith('laptop:')) {
|
|
606
|
+
this.viewportMode = 'laptop';
|
|
607
|
+
this.viewportLaptopDeviceForm.patchValue({ viewportLaptopDevice: vp.slice(7).trim() });
|
|
608
|
+
}
|
|
609
|
+
else if (vp.startsWith('tablet:')) {
|
|
610
|
+
this.viewportMode = 'tablet';
|
|
611
|
+
this.viewportTabletDeviceForm.patchValue({ viewportTabletDevice: vp.slice(7).trim() });
|
|
612
|
+
}
|
|
613
|
+
else if (vp.startsWith('desktop:')) {
|
|
614
|
+
this.viewportMode = 'desktop';
|
|
615
|
+
this.viewportDesktopDeviceForm.patchValue({ viewportDesktopDevice: vp.slice(8).trim() });
|
|
616
|
+
}
|
|
617
|
+
else if (vp.startsWith('mobile:')) {
|
|
618
|
+
this.viewportMode = 'mobile';
|
|
619
|
+
this.viewportMobileDeviceForm.patchValue({ viewportMobileDevice: vp.slice(7).trim() });
|
|
620
|
+
}
|
|
621
|
+
else if (vp && vp.includes('*')) {
|
|
622
|
+
this.viewportMode = 'custom';
|
|
623
|
+
this.customViewportTags = vp.split(',').map((v) => v.trim()).filter(Boolean);
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
this.viewportMode = 'desktop';
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
buildViewportValue() {
|
|
630
|
+
if (this.viewportMode === 'laptop') {
|
|
631
|
+
const res = (this.viewportLaptopDeviceForm.get('viewportLaptopDevice')?.value ?? '').trim();
|
|
632
|
+
return res ? `laptop:${res}` : 'laptop:';
|
|
633
|
+
}
|
|
634
|
+
if (this.viewportMode === 'tablet') {
|
|
635
|
+
const res = (this.viewportTabletDeviceForm.get('viewportTabletDevice')?.value ?? '').trim();
|
|
636
|
+
return res ? `tablet:${res}` : 'tablet:';
|
|
637
|
+
}
|
|
638
|
+
if (this.viewportMode === 'mobile') {
|
|
639
|
+
const device = (this.viewportMobileDeviceForm.get('viewportMobileDevice')?.value ?? '').trim();
|
|
640
|
+
return device ? `mobile:${device}` : 'mobile:';
|
|
641
|
+
}
|
|
642
|
+
if (this.viewportMode === 'custom') {
|
|
643
|
+
return this.customViewportTags.join(',');
|
|
644
|
+
}
|
|
645
|
+
// desktop
|
|
646
|
+
const res = (this.viewportDesktopDeviceForm.get('viewportDesktopDevice')?.value ?? '').trim();
|
|
647
|
+
return res ? `desktop:${res}` : '1280x720';
|
|
648
|
+
}
|
|
649
|
+
onViewportModeChange(mode) {
|
|
650
|
+
this.viewportMode = mode;
|
|
651
|
+
if (mode !== 'desktop')
|
|
652
|
+
this.viewportDesktopDeviceForm.reset({ viewportDesktopDevice: '' });
|
|
653
|
+
if (mode !== 'laptop')
|
|
654
|
+
this.viewportLaptopDeviceForm.reset({ viewportLaptopDevice: '' });
|
|
655
|
+
if (mode !== 'tablet')
|
|
656
|
+
this.viewportTabletDeviceForm.reset({ viewportTabletDevice: '' });
|
|
657
|
+
if (mode !== 'mobile')
|
|
658
|
+
this.viewportMobileDeviceForm.reset({ viewportMobileDevice: '' });
|
|
659
|
+
if (mode !== 'custom') {
|
|
660
|
+
this.customViewportWidth = '';
|
|
661
|
+
this.customViewportHeight = '';
|
|
662
|
+
this.customViewportTags = [];
|
|
663
|
+
}
|
|
664
|
+
this.cdr.markForCheck();
|
|
665
|
+
}
|
|
666
|
+
applyViewportCategoryOptions() {
|
|
667
|
+
const opts = this.viewportCategoryOptions || {};
|
|
668
|
+
if (opts.DESKTOP)
|
|
669
|
+
this.desktopViewportConfig = { ...this.desktopViewportConfig, options: opts.DESKTOP };
|
|
670
|
+
if (opts.LAPTOP)
|
|
671
|
+
this.laptopViewportConfig = { ...this.laptopViewportConfig, options: opts.LAPTOP };
|
|
672
|
+
if (opts.TABLET)
|
|
673
|
+
this.tabletViewportConfig = { ...this.tabletViewportConfig, options: opts.TABLET };
|
|
674
|
+
if (opts.MOBILE)
|
|
675
|
+
this.mobileViewportConfig = { ...this.mobileViewportConfig, options: opts.MOBILE };
|
|
676
|
+
this.cdr.markForCheck();
|
|
677
|
+
}
|
|
678
|
+
addViewportCustomTag() {
|
|
679
|
+
const w = (this.customViewportWidth || '').trim();
|
|
680
|
+
const h = (this.customViewportHeight || '').trim();
|
|
681
|
+
if (!w || !h)
|
|
682
|
+
return;
|
|
683
|
+
const tag = `${w}*${h}`;
|
|
684
|
+
if (!this.customViewportTags.includes(tag)) {
|
|
685
|
+
this.customViewportTags = [...this.customViewportTags, tag];
|
|
686
|
+
}
|
|
687
|
+
this.customViewportWidth = '';
|
|
688
|
+
this.customViewportHeight = '';
|
|
689
|
+
this.cdr.markForCheck();
|
|
690
|
+
}
|
|
691
|
+
removeViewportCustomTag(index) {
|
|
692
|
+
this.customViewportTags = this.customViewportTags.filter((_, i) => i !== index);
|
|
693
|
+
this.cdr.markForCheck();
|
|
694
|
+
}
|
|
550
695
|
ngOnInit() {
|
|
551
696
|
this.editDescription = this.descriptionContent;
|
|
552
697
|
this.editStatus = this.statusItem?.value ?? '';
|
|
@@ -582,6 +727,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
582
727
|
const defaultViewport = this.getDeviceConfigValue('Default Viewport') || this.getDeviceConfigValue('Viewport') || '';
|
|
583
728
|
const deviceType = this.getConfigItemValue('Device', 'Type');
|
|
584
729
|
const deviceOS = this.getConfigItemValue('Device', 'OS');
|
|
730
|
+
this.initViewportFromValue(defaultViewport);
|
|
585
731
|
this._labelsSelectConfigDirty = true;
|
|
586
732
|
this.editApiMockingRestoreMock = !!this.apiMockingRestoreMock;
|
|
587
733
|
this.editApiMockingStoreMock = !!this.apiMockingStoreMock;
|
|
@@ -772,6 +918,9 @@ export class TestCaseDetailsEditComponent {
|
|
|
772
918
|
options: this.prerequisiteCaseOptions,
|
|
773
919
|
};
|
|
774
920
|
}
|
|
921
|
+
if (changes['viewportCategoryOptions']) {
|
|
922
|
+
this.applyViewportCategoryOptions();
|
|
923
|
+
}
|
|
775
924
|
if (changes['configSections'] || changes['configSectionsRow2']) {
|
|
776
925
|
const enableAiSmartness = this.getConfigItemValue('AI Configuration', 'Enable AI Smartness');
|
|
777
926
|
const defaultAiAction = this.getConfigItemValue('AI Configuration', 'Default AI Action');
|
|
@@ -792,6 +941,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
792
941
|
const defaultViewport = this.getDeviceConfigValue('Default Viewport') || this.getDeviceConfigValue('Viewport') || '';
|
|
793
942
|
const deviceType = this.getConfigItemValue('Device', 'Type');
|
|
794
943
|
const deviceOS = this.getConfigItemValue('Device', 'OS');
|
|
944
|
+
this.initViewportFromValue(defaultViewport);
|
|
795
945
|
const autoWaitVal = this.getWaitsRetriesValue('Enable Avoid Auto wait for steps') || this.getConfigItemValue('Waits & Retries', 'Auto Wait');
|
|
796
946
|
this.autoWaitEnabled = !!(autoWaitVal && autoWaitVal.trim() !== '' && String(autoWaitVal) !== 'false');
|
|
797
947
|
this.retryFailedSteps = this.getWaitsRetriesValue('Retry Failed Steps');
|
|
@@ -919,7 +1069,7 @@ export class TestCaseDetailsEditComponent {
|
|
|
919
1069
|
mergeConfigSectionsRow2() {
|
|
920
1070
|
const platform = this.platform;
|
|
921
1071
|
const defaultBrowser = this.editForm.get('defaultBrowser')?.value ?? '';
|
|
922
|
-
const defaultViewport = this.
|
|
1072
|
+
const defaultViewport = this.buildViewportValue();
|
|
923
1073
|
const deviceType = this.editForm.get('deviceType')?.value ?? '';
|
|
924
1074
|
const deviceOS = this.editForm.get('deviceOS')?.value ?? '';
|
|
925
1075
|
let result = this.configSectionsRow2.map((section) => {
|
|
@@ -1020,10 +1170,10 @@ export class TestCaseDetailsEditComponent {
|
|
|
1020
1170
|
}
|
|
1021
1171
|
}
|
|
1022
1172
|
TestCaseDetailsEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1023
|
-
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", isSaving: "isSaving", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides", showApiMockingCard: "showApiMockingCard", apiMockingTitle: "apiMockingTitle", apiMockingStatusLabel: "apiMockingStatusLabel", apiMockingCaptureLabel: "apiMockingCaptureLabel", apiMockingCaptureHint: "apiMockingCaptureHint", apiMockingRenewLabel: "apiMockingRenewLabel", apiMockingRenewHint: "apiMockingRenewHint", apiMockingRestoreMock: "apiMockingRestoreMock", apiMockingStoreMock: "apiMockingStoreMock", apiMockingMockedApisCount: "apiMockingMockedApisCount", apiMockingTotalApisCount: "apiMockingTotalApisCount", apiMockingProgressPercent: "apiMockingProgressPercent", apiMockingShowProgress: "apiMockingShowProgress", apiMockingSummaryText: "apiMockingSummaryText", apiMockingPercentText: "apiMockingPercentText", orgLevelTestCaseTimeout: "orgLevelTestCaseTimeout" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", apiMockingRestoreMockChange: "apiMockingRestoreMockChange", apiMockingStoreMockChange: "apiMockingStoreMockChange", configureApiMocking: "configureApiMocking" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\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 *ngIf=\"!isStepGroup\" 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 *ngIf=\"!isStepGroup\" 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 </div>\n\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\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-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 *ngIf=\"hasPrerequisiteCaseConfig\" 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 <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=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] 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-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($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 <label class=\"cqa-font-medium cqa-text-[#374151] cqa-text-xs cqa-mb-1\" style=\"font-size: 14px; line-height: 19.6px\">\n Test Case Timeout (minutes)\n </label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-rounded-md cqa-border cqa-border-solid cqa-border-gray-200\">\n <cqa-dropdown-button\n [options]=\"testCaseTimeoutModeOptions\"\n [selectedValue]=\"testCaseTimeoutMode\"\n (selectionChange)=\"onTestCaseTimeoutModeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n type=\"number\"\n [value]=\"testCaseTimeoutDisplayValue\"\n [disabled]=\"testCaseTimeoutMode === 'org'\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\">\n </cqa-custom-input>\n </div>\n </div>\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 type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($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 <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 <!-- Web only: mobile Device Settings hidden temporarily -->\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 </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid 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\n \n <!-- API Mocking Card (edit mode: mutually-exclusive toggles driven by one boolean) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [captureHint]=\"apiMockingCaptureHint\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [renewHint]=\"apiMockingRenewHint\"\n [restoreMock]=\"editApiMockingRestoreMock\"\n [storeMock]=\"editApiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [editing]=\"true\"\n (restoreMockChange)=\"onApiMockingRestoreMockChange($event)\"\n (storeMockChange)=\"onApiMockingStoreMockChange($event)\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\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 *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n [disabled]=\"!hasUnsavedChanges\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\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", "fullWidth", "centerContent", "title"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i7.DropdownButtonComponent, selector: "cqa-dropdown-button", inputs: ["label", "options", "selectedValue", "disabled", "placeholder"], outputs: ["selectionChange", "opened", "closed"] }, { type: i8.ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: ["title", "statusLabel", "captureLabel", "captureHint", "renewLabel", "renewHint", "restoreMock", "storeMock", "mockedApisCount", "totalApisCount", "progressPercent", "summaryText", "percentText", "configureButtonLabel", "editing", "showProgress", "noDataHint"], outputs: ["configure", "restoreMockChange", "storeMockChange"] }, { type: i9.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1173
|
+
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", isSaving: "isSaving", prerequisiteCaseOptions: "prerequisiteCaseOptions", platform: "platform", isStepGroup: "isStepGroup", selectConfigOverrides: "selectConfigOverrides", showApiMockingCard: "showApiMockingCard", apiMockingTitle: "apiMockingTitle", apiMockingStatusLabel: "apiMockingStatusLabel", apiMockingCaptureLabel: "apiMockingCaptureLabel", apiMockingCaptureHint: "apiMockingCaptureHint", apiMockingRenewLabel: "apiMockingRenewLabel", apiMockingRenewHint: "apiMockingRenewHint", apiMockingRestoreMock: "apiMockingRestoreMock", apiMockingStoreMock: "apiMockingStoreMock", apiMockingMockedApisCount: "apiMockingMockedApisCount", apiMockingTotalApisCount: "apiMockingTotalApisCount", apiMockingProgressPercent: "apiMockingProgressPercent", apiMockingShowProgress: "apiMockingShowProgress", apiMockingSummaryText: "apiMockingSummaryText", apiMockingPercentText: "apiMockingPercentText", orgLevelTestCaseTimeout: "orgLevelTestCaseTimeout", viewportCategoryOptions: "viewportCategoryOptions" }, outputs: { save: "save", cancel: "cancel", selectSearch: "selectSearch", selectLoadMore: "selectLoadMore", selectOpened: "selectOpened", selectionChange: "selectionChange", labelAdded: "labelAdded", apiMockingRestoreMockChange: "apiMockingRestoreMockChange", apiMockingStoreMockChange: "apiMockingStoreMockChange", configureApiMocking: "configureApiMocking" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\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 *ngIf=\"!isStepGroup\" 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 *ngIf=\"!isStepGroup\" 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 </div>\n\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\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-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 *ngIf=\"hasPrerequisiteCaseConfig\" 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 <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=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] 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-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($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 <label class=\"cqa-font-medium cqa-text-[#374151] cqa-text-xs cqa-mb-1\" style=\"font-size: 14px; line-height: 19.6px\">\n Test Case Timeout (minutes)\n </label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-rounded-md cqa-border cqa-border-solid cqa-border-gray-200\">\n <cqa-dropdown-button\n [options]=\"testCaseTimeoutModeOptions\"\n [selectedValue]=\"testCaseTimeoutMode\"\n (selectionChange)=\"onTestCaseTimeoutModeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n type=\"number\"\n [value]=\"testCaseTimeoutDisplayValue\"\n [disabled]=\"testCaseTimeoutMode === 'org'\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\">\n </cqa-custom-input>\n </div>\n </div>\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 type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($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 <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 <!-- Web only: mobile Device Settings hidden temporarily -->\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 <!-- Viewport selector \u2014 replaces single dropdown -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151] cqa-leading-[18.2px]\">Viewport</span>\n <cqa-radio-card-group\n class=\"viewport-selector\"\n [options]=\"viewportModeOptions\"\n [ngModel]=\"viewportMode\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onViewportModeChange($event)\">\n </cqa-radio-card-group>\n <div *ngIf=\"viewportMode === 'desktop'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6b7280]\">Resolution</span>\n <cqa-dynamic-select\n [form]=\"viewportDesktopDeviceForm\"\n [config]=\"desktopViewportConfig\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"viewportMode === 'laptop'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6b7280]\">Resolution</span>\n <cqa-dynamic-select\n [form]=\"viewportLaptopDeviceForm\"\n [config]=\"laptopViewportConfig\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"viewportMode === 'tablet'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6b7280]\">Resolution</span>\n <cqa-dynamic-select\n [form]=\"viewportTabletDeviceForm\"\n [config]=\"tabletViewportConfig\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"viewportMode === 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6b7280]\">Device</span>\n <cqa-dynamic-select\n [form]=\"viewportMobileDeviceForm\"\n [config]=\"mobileViewportConfig\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid 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\n \n <!-- API Mocking Card (edit mode: mutually-exclusive toggles driven by one boolean) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [captureHint]=\"apiMockingCaptureHint\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [renewHint]=\"apiMockingRenewHint\"\n [restoreMock]=\"editApiMockingRestoreMock\"\n [storeMock]=\"editApiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [editing]=\"true\"\n (restoreMockChange)=\"onApiMockingRestoreMockChange($event)\"\n (storeMockChange)=\"onApiMockingStoreMockChange($event)\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\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 *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n [disabled]=\"!hasUnsavedChanges\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\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", "fullWidth", "centerContent", "title"] }, { type: i5.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i6.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i7.DropdownButtonComponent, selector: "cqa-dropdown-button", inputs: ["label", "options", "selectedValue", "disabled", "placeholder"], outputs: ["selectionChange", "opened", "closed"] }, { type: i8.RadioCardGroupComponent, selector: "cqa-radio-card-group", inputs: ["options", "wrap", "disabled"], outputs: ["selectionChange"] }, { type: i9.ApiMockingCardComponent, selector: "cqa-api-mocking-card", inputs: ["title", "statusLabel", "captureLabel", "captureHint", "renewLabel", "renewHint", "restoreMock", "storeMock", "mockedApisCount", "totalApisCount", "progressPercent", "summaryText", "percentText", "configureButtonLabel", "editing", "showProgress", "noDataHint"], outputs: ["configure", "restoreMockChange", "storeMockChange"] }, { type: i10.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1024
1174
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseDetailsEditComponent, decorators: [{
|
|
1025
1175
|
type: Component,
|
|
1026
|
-
args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\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 *ngIf=\"!isStepGroup\" 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 *ngIf=\"!isStepGroup\" 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 </div>\n\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\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-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 *ngIf=\"hasPrerequisiteCaseConfig\" 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 <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=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] 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-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($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 <label class=\"cqa-font-medium cqa-text-[#374151] cqa-text-xs cqa-mb-1\" style=\"font-size: 14px; line-height: 19.6px\">\n Test Case Timeout (minutes)\n </label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-rounded-md cqa-border cqa-border-solid cqa-border-gray-200\">\n <cqa-dropdown-button\n [options]=\"testCaseTimeoutModeOptions\"\n [selectedValue]=\"testCaseTimeoutMode\"\n (selectionChange)=\"onTestCaseTimeoutModeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n type=\"number\"\n [value]=\"testCaseTimeoutDisplayValue\"\n [disabled]=\"testCaseTimeoutMode === 'org'\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\">\n </cqa-custom-input>\n </div>\n </div>\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 type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($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 <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 <!-- Web only: mobile Device Settings hidden temporarily -->\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 </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid 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\n \n <!-- API Mocking Card (edit mode: mutually-exclusive toggles driven by one boolean) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [captureHint]=\"apiMockingCaptureHint\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [renewHint]=\"apiMockingRenewHint\"\n [restoreMock]=\"editApiMockingRestoreMock\"\n [storeMock]=\"editApiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [editing]=\"true\"\n (restoreMockChange)=\"onApiMockingRestoreMockChange($event)\"\n (storeMockChange)=\"onApiMockingStoreMockChange($event)\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\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 *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n [disabled]=\"!hasUnsavedChanges\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
1176
|
+
args: [{ selector: 'cqa-test-case-details-edit', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-text-sm cqa-leading-[19.6px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-py-4\">\n <!-- Basic details: Description, Status/Priority/Type, Labels (light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-4 cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\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 *ngIf=\"!isStepGroup\" 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 *ngIf=\"!isStepGroup\" 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 </div>\n\n\n <!-- Configuration (Figma: collapsible, gear icon, light background container) -->\n <div class=\"cqa-self-stretch cqa-flex cqa-flex-col cqa-gap-[12px] cqa-rounded-lg cqa-border cqa-border-[#E2E8F0] cqa-bg-[#F8F9FE] cqa-p-4\">\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-5 cqa-text-xs\">\n <!-- Execution -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 *ngIf=\"hasPrerequisiteCaseConfig\" 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 <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=\"!isStepGroup\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-w-0 cqa-w-full\">\n <label class=\"cqa-text-[#687389] 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-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 type=\"number\"\n label=\"Retry Failed Steps\"\n [value]=\"retryFailedSteps\"\n (valueChange)=\"retryFailedSteps = onlyDigits($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 <label class=\"cqa-font-medium cqa-text-[#374151] cqa-text-xs cqa-mb-1\" style=\"font-size: 14px; line-height: 19.6px\">\n Test Case Timeout (minutes)\n </label>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-w-0 cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-rounded-md cqa-border cqa-border-solid cqa-border-gray-200\">\n <cqa-dropdown-button\n [options]=\"testCaseTimeoutModeOptions\"\n [selectedValue]=\"testCaseTimeoutMode\"\n (selectionChange)=\"onTestCaseTimeoutModeChange($event)\">\n </cqa-dropdown-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-custom-input\n type=\"number\"\n [value]=\"testCaseTimeoutDisplayValue\"\n [disabled]=\"testCaseTimeoutMode === 'org'\"\n (valueChange)=\"testCaseTimeout = onlyDigits($event)\"\n placeholder=\"30\"\n [fullWidth]=\"true\"\n size=\"sm\">\n </cqa-custom-input>\n </div>\n </div>\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 type=\"number\"\n label=\"Wait Timeout for Locators (sec)\"\n [value]=\"waitTimeoutLocators\"\n (valueChange)=\"waitTimeoutLocators = onlyDigits($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 <div *ngIf=\"platform !== 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-4 cqa-border cqa-border-solid 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 <!-- Web only: mobile Device Settings hidden temporarily -->\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 <!-- Viewport selector \u2014 replaces single dropdown -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151] cqa-leading-[18.2px]\">Viewport</span>\n <cqa-radio-card-group\n class=\"viewport-selector\"\n [options]=\"viewportModeOptions\"\n [ngModel]=\"viewportMode\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onViewportModeChange($event)\">\n </cqa-radio-card-group>\n <div *ngIf=\"viewportMode === 'desktop'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6b7280]\">Resolution</span>\n <cqa-dynamic-select\n [form]=\"viewportDesktopDeviceForm\"\n [config]=\"desktopViewportConfig\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"viewportMode === 'laptop'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6b7280]\">Resolution</span>\n <cqa-dynamic-select\n [form]=\"viewportLaptopDeviceForm\"\n [config]=\"laptopViewportConfig\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"viewportMode === 'tablet'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6b7280]\">Resolution</span>\n <cqa-dynamic-select\n [form]=\"viewportTabletDeviceForm\"\n [config]=\"tabletViewportConfig\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n <div *ngIf=\"viewportMode === 'mobile'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6b7280]\">Device</span>\n <cqa-dynamic-select\n [form]=\"viewportMobileDeviceForm\"\n [config]=\"mobileViewportConfig\"\n class=\"cqa-w-full\">\n </cqa-dynamic-select>\n </div>\n </div>\n </div>\n </div>\n <!-- Key Flags -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2.5 cqa-min-w-0 cqa-rounded-lg cqa-p-4 cqa-mb-0 cqa-border cqa-border-solid 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\n \n <!-- API Mocking Card (edit mode: mutually-exclusive toggles driven by one boolean) -->\n <cqa-api-mocking-card\n *ngIf=\"showApiMockingCard\"\n style=\"width: 100%;\"\n [title]=\"apiMockingTitle\"\n [statusLabel]=\"apiMockingStatusLabel\"\n [captureLabel]=\"apiMockingCaptureLabel\"\n [captureHint]=\"apiMockingCaptureHint\"\n [renewLabel]=\"apiMockingRenewLabel\"\n [renewHint]=\"apiMockingRenewHint\"\n [restoreMock]=\"editApiMockingRestoreMock\"\n [storeMock]=\"editApiMockingStoreMock\"\n [mockedApisCount]=\"apiMockingMockedApisCount\"\n [totalApisCount]=\"apiMockingTotalApisCount\"\n [progressPercent]=\"apiMockingProgressPercent\"\n [showProgress]=\"apiMockingShowProgress\"\n [summaryText]=\"apiMockingSummaryText\"\n [percentText]=\"apiMockingPercentText\"\n [editing]=\"true\"\n (restoreMockChange)=\"onApiMockingRestoreMockChange($event)\"\n (storeMockChange)=\"onApiMockingStoreMockChange($event)\"\n (configure)=\"configureApiMocking.emit()\">\n </cqa-api-mocking-card>\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 *ngIf=\"!isSaving\"\n variant=\"filled\"\n [text]=\"'Save Changes'\"\n btnSize=\"md\"\n [fullWidth]=\"true\"\n [disabled]=\"!hasUnsavedChanges\"\n (clicked)=\"onSave()\">\n </cqa-button>\n <div *ngIf=\"isSaving\" class=\"cqa-w-full\">\n <cqa-badge\n label=\"Saving\u2026\"\n icon=\"autorenew\"\n [isLoading]=\"true\"\n [fullWidth]=\"true\"\n [centerContent]=\"true\"\n variant=\"info\"\n size=\"medium\">\n </cqa-badge>\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
1027
1177
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { descriptionTitle: [{
|
|
1028
1178
|
type: Input
|
|
1029
1179
|
}], descriptionContent: [{
|
|
@@ -1082,6 +1232,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1082
1232
|
type: Input
|
|
1083
1233
|
}], orgLevelTestCaseTimeout: [{
|
|
1084
1234
|
type: Input
|
|
1235
|
+
}], viewportCategoryOptions: [{
|
|
1236
|
+
type: Input
|
|
1085
1237
|
}], save: [{
|
|
1086
1238
|
type: Output
|
|
1087
1239
|
}], cancel: [{
|
|
@@ -1103,4 +1255,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1103
1255
|
}], configureApiMocking: [{
|
|
1104
1256
|
type: Output
|
|
1105
1257
|
}] } });
|
|
1106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7QUFXeEQsbUhBQW1IO0FBQ25ILE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBeUJ2QyxvR0FBb0c7QUFDcEcsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUc7SUFDM0MsTUFBTSxFQUFFLFFBQVE7SUFDaEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxXQUFXLEVBQUUsYUFBYTtJQUMxQixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLDRCQUE0QixFQUFFLDhCQUE4QjtJQUM1RCxhQUFhLEVBQUUsZUFBZTtJQUM5QixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsVUFBVSxFQUFFLFlBQVk7SUFD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QkFBdkIsTUFBTTtnQkFHRyxZQUFZO3NCQUFyQixNQUFNO2dCQUdHLGVBQWU7c0JBQXhCLE1BQU07Z0JBR0csVUFBVTtzQkFBbkIsTUFBTTtnQkFFRywyQkFBMkI7c0JBQXBDLE1BQU07Z0JBRUcseUJBQXlCO3NCQUFsQyxNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uLFxuICBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0sXG59IGZyb20gJy4uL3Rlc3QtY2FzZS1kZXRhaWxzLm1vZGVscyc7XG5pbXBvcnQge1xuICBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsXG4gIFNlbGVjdE9wdGlvbixcbn0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IERyb3Bkb3duT3B0aW9uIH0gZnJvbSAnLi4vLi4vZHJvcGRvd24tYnV0dG9uL2Ryb3Bkb3duLWJ1dHRvbi5jb21wb25lbnQnO1xuXG4vKiogU2VudGluZWwgdmFsdWUgZW1pdHRlZCBpbiBzYXZlIHBheWxvYWRzIHRvIHRlbGwgdGhlIGhvc3QgdG8gc2VuZCBudWxsIGZvciB0aGUgZmllbGQgKHVzZSBvcmctbGV2ZWwgZGVmYXVsdCkuICovXG5jb25zdCBPUkdfTEVWRUxfU0VOVElORUwgPSAnT3JnIGxldmVsJztcblxuLyoqIE92ZXJyaWRlIGNvbmZpZyBmb3IgYSBzcGVjaWZpYyBzZWxlY3QuIFVzZSBmb3Igc2VydmVyLXNpZGUgc2VhcmNoLCBsb2FkIG1vcmUsIGN1c3RvbSBvcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RDb25maWdPdmVycmlkZSB7XG4gIC8qKiBSZXBsYWNlIG9wdGlvbnMgKGUuZy4gZnJvbSBBUEkpLiBVcGRhdGUgd2hlbiBBUEkgcmV0dXJucy4gKi9cbiAgb3B0aW9ucz86IFNlbGVjdE9wdGlvbltdO1xuICAvKiogRW5hYmxlIHNlcnZlci1zaWRlIHNlYXJjaDsgY29tcG9uZW50IGVtaXRzIHNlbGVjdFNlYXJjaCBpbnN0ZWFkIG9mIGxvY2FsIGZpbHRlcmluZy4gKi9cbiAgc2VydmVyU2VhcmNoPzogYm9vbGVhbjtcbiAgLyoqIEluZGljYXRlcyBtb3JlIHJlc3VsdHMgYXZhaWxhYmxlIGZvciBpbmZpbml0ZSBzY3JvbGwuICovXG4gIGhhc01vcmU/OiBib29sZWFuO1xuICAvKiogTG9hZGluZyBzdGF0ZSAoZS5nLiBkdXJpbmcgQVBJIGNhbGwpLiAqL1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIHNlYXJjaCBpbnB1dCBpbiB0aGUgc2VsZWN0LiAqL1xuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgdHJpZ2dlcnMgaW5pdGlhbCBzZWFyY2ggb24gcGFuZWwgb3BlbiAoc2VydmVyU2VhcmNoIG1vZGUpLiAqL1xuICBpbml0aWFsRmV0Y2hPbk9wZW4/OiBib29sZWFuO1xuICAvKiogQ2FsbGJhY2sgd2hlbiB1c2VyIHR5cGVzIGluIHNlYXJjaC4gQ2FsbCBBUEksIHRoZW4gdXBkYXRlIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgb25TZWFyY2g/OiAocXVlcnk6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZS4gQ2FsbCBBUEksIGFwcGVuZCBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIG9uTG9hZE1vcmU/OiAocXVlcnk/OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8qKiBNYXAgb2Ygc2VsZWN0IGtleSAtPiBjb25maWcgb3ZlcnJpZGUuIEVuYWJsZXMgQVBJLWRyaXZlbiBvcHRpb25zLCBpbmZpbml0ZSBzZWFyY2gsIGxvYWQgbW9yZS4gKi9cbmV4cG9ydCB0eXBlIFNlbGVjdENvbmZpZ092ZXJyaWRlcyA9IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgU2VsZWN0Q29uZmlnT3ZlcnJpZGU+PjtcblxuLyoqIEtleXMgZm9yIGVhY2ggZHluYW1pYyBzZWxlY3QgaW4gdGVzdC1jYXNlLWRldGFpbHMtZWRpdC4gVXNlIHRoZXNlIHdpdGggc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuZXhwb3J0IGNvbnN0IFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTID0ge1xuICBzdGF0dXM6ICdzdGF0dXMnLFxuICBwcmlvcml0eTogJ3ByaW9yaXR5JyxcbiAgdHlwZTogJ3R5cGUnLFxuICBsYWJlbHM6ICdsYWJlbHMnLFxuICBwcmVyZXF1aXNpdGVDYXNlczogJ3ByZXJlcXVpc2l0ZUNhc2VzJyxcbiAgdGVzdERhdGFQcm9maWxlOiAndGVzdERhdGFQcm9maWxlJyxcbiAgdGVzdERhdGFTZXQ6ICd0ZXN0RGF0YVNldCcsXG4gIHZpZGVvUmVjb3JkaW5nOiAndmlkZW9SZWNvcmRpbmcnLFxuICBlbmFibGVBaVNtYXJ0bmVzczogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgZGVmYXVsdEFpQWN0aW9uOiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZTogJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnLFxuICB1c2VBaU1ldGFkYXRhOiAndXNlQWlNZXRhZGF0YScsXG4gIGRlZmF1bHRCcm93c2VyOiAnZGVmYXVsdEJyb3dzZXInLFxuICBkZWZhdWx0Vmlld3BvcnQ6ICdkZWZhdWx0Vmlld3BvcnQnLFxuICBkZXZpY2VUeXBlOiAnZGV2aWNlVHlwZScsXG4gIGRldmljZU9TOiAnZGV2aWNlT1MnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEge1xuICBkZXNjcmlwdGlvbkNvbnRlbnQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHByaW9yaXR5OiBzdHJpbmc7XG4gIHR5cGU/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGxhYmVsczogc3RyaW5nW107XG4gIHRlc3REYXRhUHJvZmlsZUlkPzogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbDtcbiAgdGVzdERhdGFTZXRJbmRleD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIGNvbmZpZ1NlY3Rpb25zOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW107XG4gIGNvbmZpZ1NlY3Rpb25zUm93MjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdO1xuICAvKiogXCJVc2UgbW9jayBBUEkgcmVzcG9uc2VzXCIgcm93IHN0YXRlLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXBpTW9ja2luZ1N0b3JlTW9ja2Agd2hlbiB0cnVlLiAqL1xuICBhcGlNb2NraW5nUmVzdG9yZU1vY2s/OiBib29sZWFuO1xuICAvKiogXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHJvdyBzdGF0ZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGFwaU1vY2tpbmdSZXN0b3JlTW9ja2Agd2hlbiB0cnVlLiAqL1xuICBhcGlNb2NraW5nU3RvcmVNb2NrPzogYm9vbGVhbjtcbn1cblxuY29uc3QgRlJFUVVFTlRMWV9VU0VEX0xBQkVMUyA9IFtcbiAgJ0Nhc2UnLFxuICAnQ3JpdGljYWwnLFxuICAnUE8nLFxuICAnVXBsb2FkJyxcbiAgJ1ZhbGlkYXRpb24nLFxuICAnUmV2aWV3JyxcbiAgJ0VkZ2UtY2FzZXMnLFxuICAnU2VjdXJpdHknLFxuICAnSW50ZWdyYXRpb24nLFxuICAnU21va2UnLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXRlc3QtY2FzZS1kZXRhaWxzLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZURldGFpbHNFZGl0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkZXNjcmlwdGlvblRpdGxlID0gJ0Rlc2NyaXB0aW9uJztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25Db250ZW50ID0gJyc7XG4gIC8qKiBXaGVuIHRydWUsIGRlc2NyaXB0aW9uIHVzZXMgVHJpeCByaWNoIHRleHQgZWRpdG9yIChCb2xkLCBJdGFsaWMsIGV0Yy4pLiBIb3N0IGFwcCBtdXN0IGxvYWQgVHJpeC4gKi9cbiAgQElucHV0KCkgZW5hYmxlTWFya2Rvd24gPSBmYWxzZTtcbiAgQElucHV0KCkgbWV0YWRhdGFJdGVtczogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBjb25maWdUaXRsZSA9ICdDb25maWd1cmF0aW9uJztcbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnM6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBpc1NhdmluZyA9IGZhbHNlO1xuICAvKiogT3B0aW9uYWwgbGlzdCBvZiBwcmVyZXF1aXNpdGUgdGVzdCBjYXNlIG9wdGlvbnMgZm9yIHRoZSBtdWx0aS1zZWxlY3QuIElmIG5vdCBwcm92aWRlZCwgdXNlcyBkZWZhdWx0IHNhbXBsZSBvcHRpb25zLiAqL1xuICBASW5wdXQoKSBwcmVyZXF1aXNpdGVDYXNlT3B0aW9uczogeyB2YWx1ZTogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdID0gW107XG4gIC8qKiBQbGF0Zm9ybTogJ3dlYicgc2hvd3MgRGVmYXVsdCBCcm93c2VyICsgVmlld3BvcnQ7ICdtb2JpbGUnIHNob3dzIERldmljZSBUeXBlICsgT1MuIERlZmF1bHRzIHRvICd3ZWInLiAqL1xuICBASW5wdXQoKSBwbGF0Zm9ybTogJ3dlYicgfCAnbW9iaWxlJyA9ICd3ZWInO1xuXG4gIC8qKiBXaGVuIHRydWUsIGhpZGVzIFByaW9yaXR5LCBUeXBlLCBhbmQgVGVzdCBEYXRhIFNldCBmaWVsZHMgKHN0ZXAgZ3JvdXBzIGRvbid0IGhhdmUgdGhlc2UpLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgQElucHV0KCkgaXNTdGVwR3JvdXAgPSBmYWxzZTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgY29uZmlnIHBlciBzZWxlY3Qga2V5LiBVc2UgZm9yOlxuICAgKiAtIEFQSS1kcml2ZW4gb3B0aW9uczogcGFzcyBvcHRpb25zIGFycmF5ICh1cGRhdGUgd2hlbiBBUEkgcmV0dXJucylcbiAgICogLSBTZXJ2ZXItc2lkZSBzZWFyY2g6IHNlcnZlclNlYXJjaDogdHJ1ZSwgb25TZWFyY2ggaW4gb3ZlcnJpZGUgb3IgbGlzdGVuIHRvIHNlbGVjdFNlYXJjaFxuICAgKiAtIEluZmluaXRlIHNjcm9sbDogaGFzTW9yZTogdHJ1ZSwgb25Mb2FkTW9yZSBpbiBvdmVycmlkZSBvciBsaXN0ZW4gdG8gc2VsZWN0TG9hZE1vcmVcbiAgICogLSBJbml0aWFsIGZldGNoIG9uIG9wZW46IGluaXRpYWxGZXRjaE9uT3BlbjogdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzOiBTZWxlY3RDb25maWdPdmVycmlkZXMgPSB7fTtcblxuICAvLyDilIDilIAgQVBJIE1vY2tpbmcgY2FyZCAoZWRpdCBtb2RlOiBzaG93cyB0d28gdG9nZ2xlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIEBJbnB1dCgpIHNob3dBcGlNb2NraW5nQ2FyZCA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nVGl0bGUgPSAnQVBJIE1vY2tpbmcnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nU3RhdHVzTGFiZWwgPSAnTm90IGNvbmZpZ3VyZWQnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nQ2FwdHVyZUxhYmVsID0gJ1VzZSBtb2NrIEFQSSByZXNwb25zZXMnO1xuICBASW5wdXQoKSBhcGlNb2NraW5nQ2FwdHVyZUhpbnQgPSAnVXNlcyBzdG9yZWQgcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJuIG9uIGFmdGVyIGNhcHR1cmUgY29tcGxldGVzLic7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZW5ld0xhYmVsID0gJ1JlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1JlbmV3SGludCA9ICdSZS1jYXB0dXJlcyBmcmVzaCByZXNwb25zZXMgb24gbmV4dCBydW4uIFR1cm5zIG9mZiBVc2UgbW9jay4nO1xuICAvKipcbiAgICogU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGNhcmQncyBkdWFsIHRvZ2dsZSBzdGF0ZS5cbiAgICogICB0cnVlICDihpIgUmVuZXcgT04sIENhcHR1cmUgT0ZGXG4gICAqICAgZmFsc2Ug4oaSIFJlbmV3IE9GRiwgQ2FwdHVyZSBPTlxuICAgKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrID0gZmFsc2U7XG4gIC8qKiBcIlJlbmV3IGFuZCBzdG9yZSBBUEkgcmVzcG9uc2VzXCIg4oCUIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhcGlNb2NraW5nUmVzdG9yZU1vY2tgIHdoZW4gdHJ1ZS4gKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1N0b3JlTW9jayA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nTW9ja2VkQXBpc0NvdW50ID0gMDtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50ID0gMDtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1Byb2dyZXNzUGVyY2VudCA9IDA7XG4gIC8qKiBGb3J3YXJkZWQgdG8gYGNxYS1hcGktbW9ja2luZy1jYXJkYC4gSW4gZWRpdCBtb2RlIHRoZSBjYXJkIGhpZGVzIHRoZSBibG9jayBhbnl3YXksIGJ1dFxuICAgKiAgd2Ugc3RpbGwgcGlwZSB0aGUgaW5wdXQgdGhyb3VnaCBmb3Igc3ltbWV0cnkgd2l0aCB0aGUgcmVhZC1vbmx5IGNvbXBvbmVudC4gKi9cbiAgQElucHV0KCkgYXBpTW9ja2luZ1Nob3dQcm9ncmVzcyA9IGZhbHNlO1xuICBASW5wdXQoKSBhcGlNb2NraW5nU3VtbWFyeVRleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdQZXJjZW50VGV4dD86IHN0cmluZztcblxuICAvKiogT3JnLWxldmVsIGRlZmF1bHQgZm9yIFRlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKS4gVXNlZCB0byBmbGFnIHRoZSBpbnB1dCBhcyBcIk9SRyBsZXZlbFwiIHZzIFwiQ3VzdG9tXCIuICovXG4gIEBJbnB1dCgpIG9yZ0xldmVsVGVzdENhc2VUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbDtcblxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzZWFyY2hlcyBpbiBhIHNlbGVjdCAoc2VydmVyU2VhcmNoIG1vZGUpLiBDYWxsIEFQSSBhbmQgdXBkYXRlIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZS4gQ2FsbCBBUEksIGFwcGVuZCB0byBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RMb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWxlY3QgcGFuZWwgaXMgb3BlbmVkLiBVc2UgdG8gY2FsbCBBUEkgZm9yIGluaXRpYWwgbG9hZCAoZS5nLiB3aGVuIGluaXRpYWxGZXRjaE9uT3BlbikuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmcgfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzIGluIGFueSBzZWxlY3QuICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGFkZHMgYSBuZXcgY3VzdG9tIGxhYmVsIHZpYSB0aGUgXCJOZXdcIiBvcHRpb24uICovXG4gIEBPdXRwdXQoKSBsYWJlbEFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgZmxpcHMgdGhlIFwiVXNlIG1vY2sgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBmbGlwcyB0aGUgXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFwiQ29uZmlndXJlIE1vY2sgQVBJc1wiIG9uIHRoZSBlbWJlZGRlZCBjYXJkIGluIGVkaXQgbW9kZS4gKi9cbiAgQE91dHB1dCgpIGNvbmZpZ3VyZUFwaU1vY2tpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKiBGb3JtIHN0YXRlICovXG4gIGVkaXREZXNjcmlwdGlvbiA9ICcnO1xuICBlZGl0U3RhdHVzID0gJyc7XG4gIGVkaXRQcmlvcml0eSA9ICcnO1xuICBlZGl0TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogTG9jYWwgZWRpdC1tb2RlIG1pcnJvciBvZiB0aGUgYHJlc3RvcmVNb2NrYCBib29sZWFuLiBTZWVkZWQgZnJvbSBASW5wdXQoKSBvbiBpbml0L2NoYW5nZXMuICovXG4gIGVkaXRBcGlNb2NraW5nUmVzdG9yZU1vY2sgPSBmYWxzZTtcbiAgLyoqIExvY2FsIGVkaXQtbW9kZSBtaXJyb3Igb2YgdGhlIGBzdG9yZU1vY2tgIGJvb2xlYW4uICovXG4gIGVkaXRBcGlNb2NraW5nU3RvcmVNb2NrID0gZmFsc2U7XG4gIHRlc3RDYXNlVGltZW91dCA9ICcnO1xuICAvKiogJ29yZycg4oaSIGlucHV0IGRpc2FibGVkLCBwYXlsb2FkIHNlbmRzIG51bGwgZm9yIHRlc3RjYXNlVGltZW91dDsgJ2N1c3RvbScg4oaSIGlucHV0IGVuYWJsZWQsIHBheWxvYWQgc2VuZHMgdGhlIHR5cGVkIHZhbHVlLiAqL1xuICB0ZXN0Q2FzZVRpbWVvdXRNb2RlOiAnb3JnJyB8ICdjdXN0b20nID0gJ29yZyc7XG4gIHdhaXRUaW1lb3V0TG9jYXRvcnMgPSAnJztcbiAgYXV0b1dhaXRFbmFibGVkID0gZmFsc2U7XG4gIHJldHJ5RmFpbGVkU3RlcHMgPSAnJztcbiAgY29uZmlnRXhwYW5kZWQgPSB0cnVlO1xuICBleGVjdXRpb25FeHBhbmRlZCA9IHRydWU7XG4gIGFpQ29uZmlnRXhwYW5kZWQgPSB0cnVlO1xuICB3YWl0c1JldHJpZXNFeHBhbmRlZCA9IHRydWU7XG4gIGRldmljZUV4cGFuZGVkID0gdHJ1ZTtcbiAga2V5RmxhZ3NFeHBhbmRlZCA9IHRydWU7XG4gIG1vYmlsZVRlc3RpbmdFbmFibGVkID0gZmFsc2U7XG4gIGV4dGVuc2lvblVzZUVuYWJsZWQgPSBmYWxzZTtcbiAgZGF0YURyaXZlbkVuYWJsZWQgPSBmYWxzZTtcblxuICByZWFkb25seSBmcmVxdWVudGx5VXNlZExhYmVscyA9IEZSRVFVRU5UTFlfVVNFRF9MQUJFTFM7XG4gIHByaXZhdGUgX2luaXRpYWxGb3JtU25hcHNob3Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBGb3JtR3JvdXAgZm9yIGNxYS1keW5hbWljLXNlbGVjdCBiaW5kaW5ncyAqL1xuICBlZGl0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXR1czogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBwcmlvcml0eTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB0eXBlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGxhYmVsczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICBwcmVyZXF1aXNpdGVDYXNlczogbmV3IEZvcm1Db250cm9sKFtdIGFzIHN0cmluZ1tdKSxcbiAgICB0ZXN0RGF0YVByb2ZpbGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdGVzdERhdGFTZXQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdEJyb3dzZXI6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdmlkZW9SZWNvcmRpbmc6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdFZpZXdwb3J0OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGRldmljZVR5cGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGV2aWNlT1M6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZW5hYmxlQWlTbWFydG5lc3M6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGVmYXVsdEFpQWN0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgdXNlQWlNZXRhZGF0YTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgfSk7XG5cbiAgZ2V0IHN0YXR1c0l0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdTdGF0dXMnKTtcbiAgfVxuXG4gIGdldCBwcmlvcml0eUl0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdQcmlvcml0eScpO1xuICB9XG5cbiAgZ2V0IHR5cGVJdGVtKCk6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFJdGVtcy5maW5kKChtKSA9PiBtLmxhYmVsID09PSAnVHlwZScpO1xuICB9XG5cbiAgZ2V0IHN0YXR1c09wdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ0RyYWZ0JywgJ0luIFJldmlldycsICdBcHByb3ZlZCcsICdBY3RpdmUnLCAnSW5hY3RpdmUnLCAnQmxvY2tlZCddO1xuICB9XG5cbiAgZ2V0IHByaW9yaXR5T3B0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnQ3JpdGljYWwnLCAnTWFqb3InLCAnSGlnaCcsICdNZWRpdW0nLCAnTG93JywgJ01pbm9yJywgJ05vdCBzZXQnXTtcbiAgfVxuXG4gIC8qKiBDYWNoZWQgY29uZmlncyB0byBhdm9pZCBuZXcgb2JqZWN0IHJlZnMgZWFjaCBjaGFuZ2UgZGV0ZWN0aW9uIChwcmV2ZW50cyBpbmZpbml0ZSBsb29wcykgKi9cbiAgcmVhZG9ubHkgc3RhdHVzU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnc3RhdHVzJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdTdGF0dXMnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdEcmFmdCcsIG5hbWU6ICdEcmFmdCcgfSxcbiAgICAgIHsgdmFsdWU6ICdJbiBSZXZpZXcnLCBuYW1lOiAnSW4gUmV2aWV3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FwcHJvdmVkJywgbmFtZTogJ0FwcHJvdmVkJyB9LFxuICAgICAgeyB2YWx1ZTogJ0FjdGl2ZScsIG5hbWU6ICdBY3RpdmUnIH0sXG4gICAgICB7IHZhbHVlOiAnSW5hY3RpdmUnLCBuYW1lOiAnSW5hY3RpdmUnIH0sXG4gICAgICB7IHZhbHVlOiAnQmxvY2tlZCcsIG5hbWU6ICdCbG9ja2VkJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgdHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3R5cGUnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1R5cGUnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcmVhZG9ubHkgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndGVzdERhdGFQcm9maWxlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXN0IERhdGEgUHJvZmlsZScsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICByZWFkb25seSB0ZXN0RGF0YVNldFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3Rlc3REYXRhU2V0JyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXN0IERhdGEgU2V0JyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFByZXJlcXVpc2l0ZUNhc2VPcHRpb25zID0gW1xuICAgIHsgdmFsdWU6ICdUQy0wMDEnLCBuYW1lOiAnVEMtMDAxOiBMb2dpbiBmbG93JyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDInLCBuYW1lOiAnVEMtMDAyOiBVc2VyIHJlZ2lzdHJhdGlvbicgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDAzJywgbmFtZTogJ1RDLTAwMzogUGFzc3dvcmQgcmVzZXQnIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwNCcsIG5hbWU6ICdUQy0wMDQ6IERhc2hib2FyZCBsb2FkJyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDUnLCBuYW1lOiAnVEMtMDA1OiBBUEkgaGVhbHRoIGNoZWNrJyB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHZpZGVvUmVjb3JkaW5nU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmlkZW9SZWNvcmRpbmcnLFxuICAgIGxhYmVsOiAnUmVjb3JkIHRlc3QgZXhlY3V0aW9uIHZpZGVvJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3RydWUnLCBuYW1lOiAnVHJ1ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdGYWxzZScgfSxcbiAgICAgIHsgdmFsdWU6ICdPcmcgbGV2ZWwnLCBuYW1lOiAnT3JnIGxldmVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgYWlNZXRhZGF0YUNvbGxlY3Rpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd1c2VBaU1ldGFkYXRhJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3RydWUnLCBuYW1lOiAnVHJ1ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdmYWxzZScsIG5hbWU6ICdGYWxzZScgfSxcbiAgICAgIHsgdmFsdWU6ICdPcmcgbGV2ZWwnLCBuYW1lOiAnT3JnIGxldmVsJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqIENhY2hlZCBsYWJlbHMgY29uZmlnIHRvIGF2b2lkIG5ldyBvYmplY3Qgb24gZXZlcnkgQ0QgKHByZXZlbnRzIGZyZWV6ZSkgKi9cbiAgcHJpdmF0ZSBfbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG5cbiAgLyoqIExhYmVscyBtdWx0aS1zZWxlY3Q6IG9wdGlvbnMgPSBmcmVxdWVudGx5IHVzZWQgKyBjdXJyZW50ICsgQVBJIG9wdGlvbnMgZnJvbSBzZWxlY3RDb25maWdPdmVycmlkZXMgKi9cbiAgZ2V0IGxhYmVsc1NlbGVjdENvbmZpZygpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGlmICghdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgJiYgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGUpIHJldHVybiB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzW1RFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVsc107XG4gICAgY29uc3QgYXBpT3B0aW9ucyA9IG92ZXJyaWRlPy5vcHRpb25zID8/IFtdO1xuICAgIGNvbnN0IGFsbExhYmVscyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICAuLi50aGlzLmZyZXF1ZW50bHlVc2VkTGFiZWxzLFxuICAgICAgLi4udGhpcy5lZGl0TGFiZWxzLFxuICAgICAgLi4uYXBpT3B0aW9ucy5tYXAoKG8pID0+IFN0cmluZyhvLm5hbWUgPz8gby52YWx1ZSA/PyAnJykudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgXSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5LmZyb20oYWxsTGFiZWxzKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgIC5tYXAoKHYpID0+ICh7IHZhbHVlOiB2LCBuYW1lOiB2IH0pKTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZSA9IHtcbiAgICAgIGtleTogJ2xhYmVscycsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBsYWJlbHMgdG8gYWRkIC4uLi4uLicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBvcHRpb25TdHlsZTogJ2NoZWNrYm94JyxcbiAgICAgIGFsbG93Q3VzdG9tVmFsdWU6IHRydWUsXG4gICAgICBvcHRpb25zLFxuICAgIH07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnQ2FjaGU7XG4gIH1cblxuICBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJlcmVxdWlzaXRlQ2FzZXMnLFxuICAgIGxhYmVsOiAnUHJlcmVxdWlzaXRlIENhc2UnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG11bHRpcGxlOiB0cnVlLFxuICAgIG9wdGlvblN0eWxlOiAnY2hlY2tib3gnLFxuICAgIHNob3dTZWxlY3RBbGw6IHRydWUsXG4gICAgc2VsZWN0QWxsTGFiZWw6ICdBbGwnLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdUQy0wMDEnLCBuYW1lOiAnVEMtMDAxOiBMb2dpbiBmbG93JyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwMicsIG5hbWU6ICdUQy0wMDI6IFVzZXIgcmVnaXN0cmF0aW9uJyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwMycsIG5hbWU6ICdUQy0wMDM6IFBhc3N3b3JkIHJlc2V0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwNCcsIG5hbWU6ICdUQy0wMDQ6IERhc2hib2FyZCBsb2FkJyB9LFxuICAgICAgeyB2YWx1ZTogJ1RDLTAwNScsIG5hbWU6ICdUQy0wMDU6IEFQSSBoZWFsdGggY2hlY2snIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0Vmlld3BvcnRTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZWZhdWx0Vmlld3BvcnQnLFxuICAgIGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICcxMjgweDcyMCcsIG5hbWU6ICcxMjgweDcyMCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRldmljZVR5cGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZXZpY2VUeXBlJyxcbiAgICBsYWJlbDogJ0RldmljZSBUeXBlJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lQaG9uZSAxNCcsIG5hbWU6ICdpUGhvbmUgMTQnIH0sXG4gICAgICB7IHZhbHVlOiAnaVBob25lIDE1JywgbmFtZTogJ2lQaG9uZSAxNScgfSxcbiAgICAgIHsgdmFsdWU6ICdpUGhvbmUgMTcnLCBuYW1lOiAnaVBob25lIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0lwaG9uZSAxNycsIG5hbWU6ICdJcGhvbmUgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnU2Ftc3VuZyBHYWxheHknLCBuYW1lOiAnU2Ftc3VuZyBHYWxheHknIH0sXG4gICAgICB7IHZhbHVlOiAnUGl4ZWwnLCBuYW1lOiAnUGl4ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZXZpY2VPU1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RldmljZU9TJyxcbiAgICBsYWJlbDogJ09TJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ2lwYScsIG5hbWU6ICdpT1MgKGlwYSknIH0sXG4gICAgICB7IHZhbHVlOiAnYXBrJywgbmFtZTogJ0FuZHJvaWQgKGFwayknIH0sXG4gICAgICB7IHZhbHVlOiAnaU9TIDE2JywgbmFtZTogJ2lPUyAxNicgfSxcbiAgICAgIHsgdmFsdWU6ICdpT1MgMTcnLCBuYW1lOiAnaU9TIDE3JyB9LFxuICAgICAgeyB2YWx1ZTogJ0FuZHJvaWQgMTMnLCBuYW1lOiAnQW5kcm9pZCAxMycgfSxcbiAgICAgIHsgdmFsdWU6ICdBbmRyb2lkIDE0JywgbmFtZTogJ0FuZHJvaWQgMTQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRCcm93c2VyJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsXG4gICAgcGxhY2Vob2xkZXI6ICdDaHJvbWUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdDaHJvbWUnLCBuYW1lOiAnQ2hyb21lJyB9LFxuICAgICAgeyB2YWx1ZTogJ0ZpcmVmb3gnLCBuYW1lOiAnRmlyZWZveCcgfSxcbiAgICAgIHsgdmFsdWU6ICdTYWZhcmknLCBuYW1lOiAnU2FmYXJpJyB9LFxuICAgICAgeyB2YWx1ZTogJ0VkZ2UnLCBuYW1lOiAnRWRnZScgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHByaW9yaXR5U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAncHJpb3JpdHknLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1ByaW9yaXR5JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnQ3JpdGljYWwnLCBuYW1lOiAnQ3JpdGljYWwnIH0sXG4gICAgICB7IHZhbHVlOiAnTWFqb3InLCBuYW1lOiAnTWFqb3InIH0sXG4gICAgICB7IHZhbHVlOiAnSGlnaCcsIG5hbWU6ICdIaWdoJyB9LFxuICAgICAgeyB2YWx1ZTogJ01lZGl1bScsIG5hbWU6ICdNZWRpdW0nIH0sXG4gICAgICB7IHZhbHVlOiAnTG93JywgbmFtZTogJ0xvdycgfSxcbiAgICAgIHsgdmFsdWU6ICdNaW5vcicsIG5hbWU6ICdNaW5vcicgfSxcbiAgICAgIHsgdmFsdWU6ICdOb3Qgc2V0JywgbmFtZTogJ05vdCBzZXQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBlbmFibGVBaVNtYXJ0bmVzc1NlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2VuYWJsZUFpU21hcnRuZXNzJyxcbiAgICBsYWJlbDogJ0VuYWJsZSBBSSBTbWFydG5lc3MnLFxuICAgIHBsYWNlaG9sZGVyOiAnQWR2YW5jZWQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdCYXNpYycsIG5hbWU6ICdCYXNpYycgfSxcbiAgICAgIHsgdmFsdWU6ICdBZHZhbmNlZCcsIG5hbWU6ICdBZHZhbmNlZCcgfSxcbiAgICAgIHsgdmFsdWU6ICdPZmYnLCBuYW1lOiAnT2ZmJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGVmYXVsdEFpQWN0aW9uJyxcbiAgICBsYWJlbDogJ0RlZmF1bHQgQUkgQWN0aW9uJyxcbiAgICBwbGFjZWhvbGRlcjogJ1NtYXJ0IHdhaXQnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdTbWFydCB3YWl0JywgbmFtZTogJ1NtYXJ0IHdhaXQnIH0sXG4gICAgICB7IHZhbHVlOiAnU21hcnQgV2FpdCcsIG5hbWU6ICdTbWFydCBXYWl0JyB9LFxuICAgICAgeyB2YWx1ZTogJ1dhaXQgZm9yIGVsZW1lbnQnLCBuYW1lOiAnV2FpdCBmb3IgZWxlbWVudCcgfSxcbiAgICAgIHsgdmFsdWU6ICdSZXRyeScsIG5hbWU6ICdSZXRyeScgfSxcbiAgICAgIHsgdmFsdWU6ICdTa2lwJywgbmFtZTogJ1NraXAnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScsXG4gICAgbGFiZWw6ICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScsXG4gICAgcGxhY2Vob2xkZXI6ICdOb25lJyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnbm9uZScsIG5hbWU6ICdOb25lJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWVyZ2VkIGNvbmZpZyBmb3IgYSBzZWxlY3Q6IGJhc2UgY29uZmlnICsgb3ZlcnJpZGUuXG4gICAqIFdpcmVzIG9uU2VhcmNoLCBvbkxvYWRNb3JlIHRvIGJvdGggb3ZlcnJpZGUgY2FsbGJhY2tzIGFuZCBvdXRwdXQgZXZlbnRzLlxuICAgKi9cbiAgZ2V0Q29uZmlnRm9yU2VsZWN0KGtleTogc3RyaW5nLCBiYXNlQ29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltrZXldO1xuICAgIGlmICghb3ZlcnJpZGUpIHJldHVybiBiYXNlQ29uZmlnO1xuXG4gICAgY29uc3QgbWVyZ2VkOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICAuLi5iYXNlQ29uZmlnLFxuICAgICAgLi4ub3ZlcnJpZGUsXG4gICAgICBvcHRpb25zOiBvdmVycmlkZS5vcHRpb25zID8/IGJhc2VDb25maWcub3B0aW9ucyxcbiAgICAgIGtleTogYmFzZUNvbmZpZy5rZXksXG4gICAgfTtcblxuICAgIGlmIChvdmVycmlkZS5zZXJ2ZXJTZWFyY2ggfHwgb3ZlcnJpZGUub25TZWFyY2gpIHtcbiAgICAgIG1lcmdlZC5vblNlYXJjaCA9IChxdWVyeSkgPT4ge1xuICAgICAgICBvdmVycmlkZS5vblNlYXJjaD8uKHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5zZWxlY3RTZWFyY2guZW1pdCh7IGtleSwgcXVlcnkgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAob3ZlcnJpZGUuaGFzTW9yZSB8fCBvdmVycmlkZS5vbkxvYWRNb3JlKSB7XG4gICAgICBtZXJnZWQub25Mb2FkTW9yZSA9IChxdWVyeT86IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnkgPz8gJyc7XG4gICAgICAgIG92ZXJyaWRlLm9uTG9hZE1vcmU/LihxKTtcbiAgICAgICAgdGhpcy5zZWxlY3RMb2FkTW9yZS5lbWl0KHsga2V5LCBxdWVyeTogcSB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfVxuXG4gIG9uU2VsZWN0T3BlbmVkKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RPcGVuZWQuZW1pdCh7IGtleSB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0U2VhcmNoKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdFNlYXJjaC5lbWl0KGV2ZW50KTtcbiAgICBjb25zdCBvdmVycmlkZSA9IHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bZXZlbnQua2V5XTtcbiAgICBvdmVycmlkZT8ub25TZWFyY2g/LihldmVudC5xdWVyeSk7XG4gIH1cblxuICBvblNlbGVjdExvYWRNb3JlKGV2ZW50OiB7IGtleTogc3RyaW5nOyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdExvYWRNb3JlLmVtaXQoZXZlbnQpO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltldmVudC5rZXldO1xuICAgIG92ZXJyaWRlPy5vbkxvYWRNb3JlPy4oZXZlbnQucXVlcnkpO1xuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGV2ZW50LnZhbHVlO1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLm1hcCgodikgPT4gU3RyaW5nKHYpKS5maWx0ZXIoQm9vbGVhbikgOiB2YWwgIT0gbnVsbCA/IFtTdHJpbmcodmFsKV0gOiBbXTtcbiAgICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICAvLyBNYXJrIFRlc3QgRGF0YSBzZWxlY3RzIGFzIGRpcnR5IHNvIGxhdGVyIGlucHV0IGNoYW5nZXMgKG9wdGlvbnMvY29uZmlnKSBkb24ndCBvdmVyd3JpdGUgdXNlciBjaG9pY2VcbiAgICBpZiAoZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVByb2ZpbGUgfHwgZXZlbnQua2V5ID09PSBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy50ZXN0RGF0YVNldCkge1xuICAgICAgY29uc3QgY3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KGV2ZW50LmtleSk7XG4gICAgICBjdHJsPy5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHsga2V5OiBldmVudC5rZXksIHZhbHVlOiBldmVudC52YWx1ZSB9KTtcbiAgfVxuXG4gIG9uTGFiZWxzQWRkQ3VzdG9tVmFsdWUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXYgfHwgdGhpcy5lZGl0TGFiZWxzLmluY2x1ZGVzKHYpKSByZXR1cm47XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMuZWRpdExhYmVscywgdl07XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMubGFiZWxBZGRlZC5lbWl0KHYpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWdJdGVtVmFsdWUoc2VjdGlvblRpdGxlOiBzdHJpbmcsIGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWN0aW9uID0gWy4uLnRoaXMuY29uZmlnU2VjdGlvbnMsIC4uLnRoaXMuY29uZmlnU2VjdGlvbnNSb3cyXS5maW5kKFxuICAgICAgKHMpID0+XG4gICAgICAgIHMudGl0bGUgPT09IHNlY3Rpb25UaXRsZSB8fFxuICAgICAgICBzLnRpdGxlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlY3Rpb25UaXRsZS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgY29uc3QgaXRlbSA9IHNlY3Rpb24/Lml0ZW1zPy5maW5kKFxuICAgICAgKGkpID0+XG4gICAgICAgIGkubGFiZWwgPT09IGl0ZW1MYWJlbCB8fFxuICAgICAgICBpLmxhYmVsPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGl0ZW1MYWJlbC50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gICAgcmV0dXJuIChpdGVtPy52YWx1ZSBhcyBzdHJpbmcpID8/ICcnO1xuICB9XG5cbiAgLyoqIEdldCB2YWx1ZSBmcm9tIERldmljZSBzZWN0aW9uIC0gc3VwcG9ydHMgYm90aCAnRGV2aWNlJyBhbmQgJ0RldmljZSBTZXR0aW5nJyB0aXRsZXMgKi9cbiAgcHJpdmF0ZSBnZXREZXZpY2VDb25maWdWYWx1ZShpdGVtTGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsID1cbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCBpdGVtTGFiZWwpIHx8XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlIFNldHRpbmcnLCBpdGVtTGFiZWwpO1xuICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnICYmIFN0cmluZyh2YWwpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcodmFsKSA6ICcnO1xuICB9XG5cbiAgLyoqIEdldCB2YWx1ZSBmcm9tIFdhaXRzIHNlY3Rpb24gLSBzdXBwb3J0cyBib3RoICdXYWl0IGFuZCByZXRyaWVzJyBhbmQgJ1dhaXRzICYgUmV0cmllcycgdGl0bGVzICovXG4gIHByaXZhdGUgZ2V0V2FpdHNSZXRyaWVzVmFsdWUoaXRlbUxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHYxID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXQgYW5kIHJldHJpZXMnLCBpdGVtTGFiZWwpO1xuICAgIGNvbnN0IHYyID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsIGl0ZW1MYWJlbCk7XG4gICAgbGV0IHZhbCA9ICh2MSAhPT0gJycgJiYgdjEgIT0gbnVsbCkgPyB2MSA6IHYyO1xuXG4gICAgLy8gV2hlbiB2YWx1ZXMgYXJlIGNvbWluZyBmcm9tIG9yZ2FuaXphdGlvbiBzZXR0aW5ncywgdGhlIHBvcnRhbCB3cmFwcyB0aGVtIGFzXG4gICAgLy8gXCJPcmcgTGV2ZWwgKEFDVFVBTCBWQUxVRSlcIi4gRm9yIGVkaXQgaW5wdXRzIChSZXRyeSBGYWlsZWQgU3RlcHMsIFRlc3QgQ2FzZSBUaW1lb3V0LFxuICAgIC8vIFdhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMpLCB3ZSBvbmx5IHdhbnQgdG8gc2hvdyB0aGUgaW5uZXIgdmFsdWUsIG5vdCB0aGUgd3JhcHBlci5cbiAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJhdyA9IFN0cmluZyh2YWwpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGxvd2VyID0gcmF3LnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBwcmVmaXggPSAnb3JnIGxldmVsICgnO1xuICAgICAgaWYgKGxvd2VyLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBjb25zdCBvcGVuSWR4ID0gcmF3LmluZGV4T2YoJygnKTtcbiAgICAgICAgY29uc3QgY2xvc2VJZHggPSByYXcubGFzdEluZGV4T2YoJyknKTtcbiAgICAgICAgaWYgKG9wZW5JZHggPj0gMCAmJiBjbG9zZUlkeCA+IG9wZW5JZHgpIHtcbiAgICAgICAgICB2YWwgPSByYXcuc3Vic3RyaW5nKG9wZW5JZHggKyAxLCBjbG9zZUlkeCkudHJpbSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IHJhdy5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkudHJpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgJiYgU3RyaW5nKHZhbCkudHJpbSgpICE9PSAnJyA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH1cblxuICAvKiogU3RyaXAgdHJhaWxpbmcgJ3MnIGZyb20gdmFsdWUgKGUuZy4gXCIxMHNcIiAtPiBcIjEwXCIpIGZvciBkaXNwbGF5IGluIHRpbWVvdXQgaW5wdXRzICovXG4gIHByaXZhdGUgc3RyaXBUcmFpbGluZ1VuaXRTKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSAnJykgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBzID0gU3RyaW5nKHZhbCkudHJpbSgpO1xuICAgIHJldHVybiBzLnJlcGxhY2UoL1xccypzJC9pLCAnJyk7XG4gIH1cblxuICByZWFkb25seSB0ZXN0Q2FzZVRpbWVvdXRNb2RlT3B0aW9uczogRHJvcGRvd25PcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnT1JHIGxldmVsJywgdmFsdWU6ICdvcmcnIH0sXG4gICAgeyBsYWJlbDogJ0N1c3RvbScsIHZhbHVlOiAnY3VzdG9tJyB9LFxuICBdO1xuXG4gIC8qKiBWYWx1ZSBzaG93biBpbiB0aGUgZGlzYWJsZWQgKG9yZykgb3IgZW5hYmxlZCAoY3VzdG9tKSBUZXN0IENhc2UgVGltZW91dCBpbnB1dC4gKi9cbiAgZ2V0IHRlc3RDYXNlVGltZW91dERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRlc3RDYXNlVGltZW91dE1vZGUgPT09ICdvcmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmdMZXZlbFRlc3RDYXNlVGltZW91dCAhPSBudWxsID8gU3RyaW5nKHRoaXMub3JnTGV2ZWxUZXN0Q2FzZVRpbWVvdXQpIDogJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlc3RDYXNlVGltZW91dDtcbiAgfVxuXG4gIG9uVGVzdENhc2VUaW1lb3V0TW9kZUNoYW5nZShtb2RlOiAnb3JnJyB8ICdjdXN0b20nKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gbW9kZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHBvcnRhbCB3cmFwcGVkIHRoZSBUZXN0IENhc2UgVGltZW91dCB2YWx1ZSBhcyBcIk9yZyBMZXZlbCAoLi4uKVwiLCBtZWFuaW5nIHRoZSBUQyBBUEkgcmV0dXJuZWQgbnVsbC4gKi9cbiAgcHJpdmF0ZSBpc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmF3ID1cbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0IGFuZCByZXRyaWVzJywgJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpIHx8XG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnV2FpdHMgJiBSZXRyaWVzJywgJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpO1xuICAgIHJldHVybiByYXcudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChPUkdfTEVWRUxfU0VOVElORUwudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICAvKiogQWxsb3cgb25seSBkaWdpdHM7IHVzZWQgZm9yIFJldHJ5IEZhaWxlZCBTdGVwcywgVGVzdCBDYXNlIFRpbWVvdXQsIFdhaXQgVGltZW91dCBpbnB1dHMgKi9cbiAgb25seURpZ2l0cyh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PT0gJycpIHJldHVybiAnJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgfVxuXG4gIC8qKiBGb3IgdXBkYXRlOiB1c2UgXCIwXCIgd2hlbiB2YWx1ZSBpcyBlbXB0eSBzbyBBUEkgZ2V0cyBhIG51bWJlciAqL1xuICBwcml2YXRlIGVtcHR5TnVtVG9aZXJvKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgU3RyaW5nKHZhbCkudHJpbSgpID09PSAnJykgcmV0dXJuICcwJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCkudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmVyZXF1aXNpdGVDYXNlc0Zyb21Db25maWcoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnUHJlcmVxdWlzaXRlIENhc2UnKTtcbiAgICBpZiAoIXZhbCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB2YWwuaW5jbHVkZXMoJywnKSA/IHZhbC5zcGxpdCgnLCcpLm1hcCgocykgPT4gcy50cmltKCkpLmZpbHRlcihCb29sZWFuKSA6IFt2YWxdO1xuICB9XG5cbiAgLyoqIEVkaXQgbW9kZSBzaG91bGQgc2hvdyBwbGFjZWhvbGRlciB3aGVuIGRhdGFzZXQgaXMgbm90IHNlbGVjdGVkLiAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVRlc3REYXRhU2V0UmF3VmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlPy50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ25vdCBzZXQnID8gJycgOiB2YWx1ZTtcbiAgfVxuXG4gIGdldCBoYXNQcmVyZXF1aXNpdGVDYXNlQ29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBbLi4udGhpcy5jb25maWdTZWN0aW9ucywgLi4udGhpcy5jb25maWdTZWN0aW9uc1JvdzJdLmZpbmQoXG4gICAgICAocykgPT4gcy50aXRsZSA9PT0gJ0V4ZWN1dGlvbidcbiAgICApO1xuICAgIHJldHVybiAhIXNlY3Rpb24/Lml0ZW1zPy5zb21lKChpKSA9PiBpLmxhYmVsID09PSAnUHJlcmVxdWlzaXRlIENhc2UnKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbkNvbnRlbnQ7XG4gICAgdGhpcy5lZGl0U3RhdHVzID0gdGhpcy5zdGF0dXNJdGVtPy52YWx1ZSA/PyAnJztcbiAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0eXBlUmF3ID0gKHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVHlwZScpIHx8ICh0aGlzLnR5cGVJdGVtPy52YWx1ZSBhcyBzdHJpbmcpKSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBQcm9maWxlJykgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFTZXRSYXcgPSB0aGlzLm5vcm1hbGl6ZVRlc3REYXRhU2V0UmF3VmFsdWUoXG4gICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBTZXQnKSA/PyAnJ1xuICAgICk7XG4gICAgY29uc3QgdHlwZVZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodHlwZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndHlwZSddPy5vcHRpb25zKSA/PyB0eXBlUmF3O1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFQcm9maWxlUmF3O1xuICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0ZXN0RGF0YVNldFJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFTZXQnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFTZXRSYXc7XG4gICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMubGFiZWxzXTtcbiAgICBjb25zdCBhdXRvV2FpdFZhbCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsICdBdXRvIFdhaXQnKTtcbiAgICB0aGlzLmF1dG9XYWl0RW5hYmxlZCA9ICEhKGF1dG9XYWl0VmFsICYmIGF1dG9XYWl0VmFsLnRyaW0oKSAhPT0gJycgJiYgU3RyaW5nKGF1dG9XYWl0VmFsKSAhPT0gJ2ZhbHNlJyk7XG4gICAgdGhpcy5yZXRyeUZhaWxlZFN0ZXBzID0gdGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnUmV0cnkgRmFpbGVkIFN0ZXBzJyk7XG4gICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gdGhpcy5pc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKSA/ICdvcmcnIDogJ2N1c3RvbSc7XG4gICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXQgPSB0aGlzLnN0cmlwVHJhaWxpbmdVbml0Uyh0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdUZXN0IENhc2UgVGltZW91dCAobWludXRlcyknKSk7XG4gICAgdGhpcy53YWl0VGltZW91dExvY2F0b3JzID0gdGhpcy5zdHJpcFRyYWlsaW5nVW5pdFModGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnV2FpdCBUaW1lb3V0IGZvciBMb2NhdG9ycyAoc2VjcyknKSk7XG4gICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgIHRoaXMuZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdFeHRlbnNpb24gVXNlJyk7XG4gICAgdGhpcy5kYXRhRHJpdmVuRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdEYXRhIERyaXZlbicpO1xuICAgIGNvbnN0IGVuYWJsZUFpU21hcnRuZXNzID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgIGNvbnN0IGRlZmF1bHRBaUFjdGlvbiA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0RlZmF1bHQgQUkgQWN0aW9uJyk7XG4gICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyk7XG4gICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlUmF3O1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGFSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgbWV0YWRhdGEgY29sbGVjdGlvbicpO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh1c2VBaU1ldGFkYXRhUmF3KTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IHRoaXMuZ2V0UHJlcmVxdWlzaXRlQ2FzZXNGcm9tQ29uZmlnKCk7XG4gICAgY29uc3QgZGVmYXVsdEJyb3dzZXIgPVxuICAgICAgdGhpcy5wbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgPyB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdEZWZhdWx0IEJyb3dzZXInKSB8fCB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ0RlZmF1bHQgQnJvd3NlcicpXG4gICAgICAgIDogdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdEZWZhdWx0IEJyb3dzZXInKTtcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZ1JhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVmlkZW8gUmVjb3JkaW5nJyk7XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmcgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh2aWRlb1JlY29yZGluZ1JhdyBhcyBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICBjb25zdCBkZWZhdWx0Vmlld3BvcnQgPSB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdEZWZhdWx0IFZpZXdwb3J0JykgfHwgdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnVmlld3BvcnQnKSB8fCAnJztcbiAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdUeXBlJyk7XG4gICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayA9ICEhdGhpcy5hcGlNb2NraW5nUmVzdG9yZU1vY2s7XG4gICAgdGhpcy5lZGl0QXBpTW9ja2luZ1N0b3JlTW9jayA9ICEhdGhpcy5hcGlNb2NraW5nU3RvcmVNb2NrO1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBzdGF0dXM6IHRoaXMuZWRpdFN0YXR1cyxcbiAgICAgIHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSxcbiAgICAgIHR5cGU6IHR5cGVWYWwgfHwgJycsXG4gICAgICBsYWJlbHM6IHRoaXMuZWRpdExhYmVscyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGVzdERhdGFQcm9maWxlVmFsIHx8ICcnLFxuICAgICAgdGVzdERhdGFTZXQ6IHRlc3REYXRhU2V0VmFsID8/ICcnLFxuICAgICAgcHJlcmVxdWlzaXRlQ2FzZXMsXG4gICAgICBkZWZhdWx0QnJvd3NlcjogZGVmYXVsdEJyb3dzZXIgfHwgJ0Nocm9tZScsXG4gICAgICB2aWRlb1JlY29yZGluZzogdmlkZW9SZWNvcmRpbmcgfHwgJycsXG4gICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCB8fCAnJyxcbiAgICAgIGRldmljZVR5cGU6IGRldmljZVR5cGUgfHwgJycsXG4gICAgICBkZXZpY2VPUzogZGV2aWNlT1MgfHwgJycsXG4gICAgICBlbmFibGVBaVNtYXJ0bmVzczogZW5hYmxlQWlTbWFydG5lc3MgfHwgJ0FkdmFuY2VkJyxcbiAgICAgIGRlZmF1bHRBaUFjdGlvbjogZGVmYXVsdEFpQWN0aW9uIHx8ICdTbWFydCB3YWl0JyxcbiAgICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgfHwgJ25vbmUnLFxuICAgICAgdXNlQWlNZXRhZGF0YTogdXNlQWlNZXRhZGF0YSB8fCAnJyxcbiAgICB9KTtcbiAgICB0aGlzLl9pbml0aWFsRm9ybVNuYXBzaG90ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5idWlsZFNhdmVQYXlsb2FkKCkpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGhhc1Vuc2F2ZWRDaGFuZ2VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9pbml0aWFsRm9ybVNuYXBzaG90ID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRTYXZlUGF5bG9hZCgpKSAhPT0gdGhpcy5faW5pdGlhbEZvcm1TbmFwc2hvdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTYXZlUGF5bG9hZCgpOiBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKT8udmFsdWUgPz8gdGhpcy5lZGl0U3RhdHVzO1xuICAgIGNvbnN0IHByaW9yaXR5ID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3ByaW9yaXR5Jyk/LnZhbHVlID8/IHRoaXMuZWRpdFByaW9yaXR5O1xuICAgIGNvbnN0IHR5cGVWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGNvbmZpZ1NlY3Rpb25zTWVyZ2VkID0gdGhpcy5tZXJnZUNvbmZpZ1NlY3Rpb25zKCk7XG4gICAgY29uc3QgY29uZmlnU2VjdGlvbnNSb3cyTWVyZ2VkID0gdGhpcy5tZXJnZUNvbmZpZ1NlY3Rpb25zUm93MigpO1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbkNvbnRlbnQ6IHRoaXMuZWRpdERlc2NyaXB0aW9uLFxuICAgICAgc3RhdHVzLFxuICAgICAgcHJpb3JpdHksXG4gICAgICB0eXBlOiB0eXBlVmFsLFxuICAgICAgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlVmFsIHx8IG51bGwsXG4gICAgICB0ZXN0RGF0YVNldEluZGV4OiB0ZXN0RGF0YVNldFZhbCA/PyBudWxsLFxuICAgICAgY29uZmlnU2VjdGlvbnM6IGNvbmZpZ1NlY3Rpb25zTWVyZ2VkLFxuICAgICAgY29uZmlnU2VjdGlvbnNSb3cyOiBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQsXG4gICAgICBhcGlNb2NraW5nUmVzdG9yZU1vY2s6IHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayxcbiAgICAgIGFwaU1vY2tpbmdTdG9yZU1vY2s6IHRoaXMuZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGJvdW5kIHRvIHRoZSBlbWJlZGRlZCBgPGNxYS1hcGktbW9ja2luZy1jYXJkPmAgYHJlc3RvcmVNb2NrQ2hhbmdlYCBvdXRwdXQuXG4gICAqIEtlZXBzIHRoZSBsb2NhbCBlZGl0LW1vZGUgbWlycm9yIGluIHN5bmMgKGluY2x1ZGluZyB0aGUgbXV0dWFsLWV4Y2x1c2l2aXR5IHJ1bGUg4oCUXG4gICAqIHR1cm5pbmcgVXNlLW1vY2sgb24gZm9yY2VzIHN0b3JlLW1vY2sgb2ZmKSBhbmQgcmUtZW1pdHMgdG8gdGhlIHBhcmVudCBzbyB0aGUgc2F2ZVxuICAgKiBwYXlsb2FkIHJlZmxlY3RzIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICBvbkFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSAmJiB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrKSB7XG4gICAgICB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrID0gZmFsc2U7XG4gICAgICB0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIE1pcnJvciBoYW5kbGVyIGZvciB0aGUgXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggVXNlLW1vY2suICovXG4gIG9uQXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2sgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgJiYgdGhpcy5lZGl0QXBpTW9ja2luZ1Jlc3RvcmVNb2NrKSB7XG4gICAgICB0aGlzLmVkaXRBcGlNb2NraW5nUmVzdG9yZU1vY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVUb09wdGlvblZhbHVlKFxuICAgIGNvbmZpZ1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gfCB1bmRlZmluZWRcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY29uZmlnVmFsdWUgPT0gbnVsbCB8fCBjb25maWdWYWx1ZSA9PT0gJycpIHJldHVybiBjb25maWdWYWx1ZTtcbiAgICBjb25zdCBvcHRzID0gb3B0aW9ucyA/PyBbXTtcbiAgICBpZiAoIW9wdHMubGVuZ3RoKSByZXR1cm4gY29uZmlnVmFsdWU7XG4gICAgY29uc3QgbnVtID0gdHlwZW9mIGNvbmZpZ1ZhbHVlID09PSAnbnVtYmVyJyA/IGNvbmZpZ1ZhbHVlIDogTnVtYmVyKGNvbmZpZ1ZhbHVlKTtcbiAgICBjb25zdCBpc051bWVyaWMgPSAhTnVtYmVyLmlzTmFOKG51bSkgJiYgU3RyaW5nKGNvbmZpZ1ZhbHVlKS50cmltKCkgPT09IFN0cmluZyhudW0pO1xuICAgIGlmIChpc051bWVyaWMpIHtcbiAgICAgIC8vIElmIG9wdGlvbnMgdXNlIG51bWVyaWMgdmFsdWVzIChlLmcuIGluZGljZXMgZm9yIFRlc3QgRGF0YSBTZXQpLFxuICAgICAgLy8gcmV0dXJuIHRoZSBudW1lcmljIGZvcm0gc28gdGhlIHNlbGVjdCBjYW4gbWF0Y2ggYnkgc3RyaWN0IGVxdWFsaXR5LlxuICAgICAgY29uc3QgaGFzTnVtZXJpY09wdGlvbiA9IG9wdHMuc29tZShcbiAgICAgICAgKG8pID0+IHR5cGVvZiBvLnZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgKG8gYXMgYW55KS5pZCA9PT0gJ251bWJlcidcbiAgICAgICk7XG4gICAgICByZXR1cm4gaGFzTnVtZXJpY09wdGlvbiA/IG51bSA6IGNvbmZpZ1ZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBzdHIgPSBTdHJpbmcoY29uZmlnVmFsdWUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG1hdGNoID0gb3B0cy5maW5kKChvKSA9PiB7XG4gICAgICBjb25zdCBuID0gU3RyaW5nKG8ubmFtZSA/PyBvLmxhYmVsID8/IG8udmFsdWUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIG4gPT09IHN0cjtcbiAgICB9KTtcbiAgICByZXR1cm4gbWF0Y2ggIT0gbnVsbCA/IChtYXRjaC52YWx1ZSA/PyAobWF0Y2ggYXMgYW55KS5pZCA/PyBtYXRjaCkgOiBjb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZhbDogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09ICd0cnVlJykgcmV0dXJuICd0cnVlJztcbiAgICBpZiAodmFsID09PSBmYWxzZSB8fCB2YWwgPT09ICdmYWxzZScpIHJldHVybiAnZmFsc2UnO1xuICAgIGlmIChcbiAgICAgIHZhbCA9PT0gJ09yZyBsZXZlbCcgfHxcbiAgICAgIHZhbCA9PT0gJ09yZyBMZXZlbCcgfHxcbiAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb3JnIGxldmVsICgnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiAnT3JnIGxldmVsJztcbiAgICB9XG4gICAgaWYgKHZhbCA9PT0gJ09uIFdhaXQnIHx8IHZhbCA9PT0gJ29uIHdhaXQnKSByZXR1cm4gJ3RydWUnO1xuICAgIHJldHVybiB2YWwgJiYgU3RyaW5nKHZhbCkudHJpbSgpID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydsYWJlbHMnXSB8fCBjaGFuZ2VzWydzZWxlY3RDb25maWdPdmVycmlkZXMnXSkge1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdENvbmZpZ092ZXJyaWRlcyddICYmIHRoaXMuZWRpdEZvcm0/LmdldCgndHlwZScpKSB7XG4gICAgICAgIGNvbnN0IHR5cGVDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3R5cGUnKTtcbiAgICAgICAgY29uc3QgdGRwQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgICAgY29uc3QgdGRzQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpO1xuICAgICAgICBjb25zdCBlbmFibGVBaUN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnZW5hYmxlQWlTbWFydG5lc3MnKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdEFpQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0QWlBY3Rpb24nKTtcbiAgICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+O1xuICAgICAgICBpZiAodHlwZUN0cmwgJiYgIXR5cGVDdHJsLmRpcnR5KSB7XG4gICAgICAgICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICAgICAgcGF0Y2hbJ3R5cGUnXSA9ICh0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdykgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIFRlc3QgRGF0YSBQcm9maWxlIC8gU2V0LCBhbGxvdyBvbmUtdGltZSByZS1yZXNvbHZlIGZyb20gY29uZmlnIHdoZW4gb3B0aW9ucyBhcnJpdmUsXG4gICAgICAgIC8vIGJ1dCBuZXZlciBvdmVyd3JpdGUgYSB1c2VyLWVkaXRlZCAoZGlydHkpIHZhbHVlLlxuICAgICAgICBpZiAodGRwQ3RybCAmJiAhdGRwQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICAgICAgICBwYXRjaFsndGVzdERhdGFQcm9maWxlJ10gPVxuICAgICAgICAgICAgKHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz9cbiAgICAgICAgICAgICAgdGVzdERhdGFQcm9maWxlUmF3KSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGRzQ3RybCAmJiAhdGRzQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoWyd0ZXN0RGF0YVNldCddID1cbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFTZXRSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhU2V0J10/Lm9wdGlvbnMpID8/XG4gICAgICAgICAgICB0ZXN0RGF0YVNldFJhdyA/PyAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZS1yZXNvbHZlIEFJIGZpZWxkcyB3aGVuIHRoZWlyIG9wdGlvbnMgYXJyaXZlICh0aGV5IHVzZSBkaXNwbGF5IG5hbWVzIGFzIHZhbHVlcykuXG4gICAgICAgIGlmIChlbmFibGVBaUN0cmwgJiYgIWVuYWJsZUFpQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGFpU21hcnRuZXNzUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgICAgIGlmIChhaVNtYXJ0bmVzc1JhdykgcGF0Y2hbJ2VuYWJsZUFpU21hcnRuZXNzJ10gPSBhaVNtYXJ0bmVzc1JhdztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdEFpQ3RybCAmJiAhZGVmYXVsdEFpQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRBaVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0RlZmF1bHQgQUkgQWN0aW9uJyk7XG4gICAgICAgICAgaWYgKGRlZmF1bHRBaVJhdykgcGF0Y2hbJ2RlZmF1bHRBaUFjdGlvbiddID0gZGVmYXVsdEFpUmF3O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtiQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyk7XG4gICAgICAgIGlmIChrYkN0cmwgJiYgIWtiQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGtiUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnS25vd2xlZGdlIEJhc2UgRGVmYXVsdCBUZXN0IENhc2UnKTtcbiAgICAgICAgICBjb25zdCBrYlJlc29sdmVkID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShrYlJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrYlJhdztcbiAgICAgICAgICBpZiAoa2JSZXNvbHZlZCkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtiUmVzb2x2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUocGF0Y2gsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGVzY3JpcHRpb25Db250ZW50J10gfHwgY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1snbWV0YWRhdGFJdGVtcyddKSB7XG4gICAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25Db250ZW50O1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMubGFiZWxzXTtcbiAgICAgIHRoaXMuZWRpdFN0YXR1cyA9IHRoaXMuc3RhdHVzSXRlbT8udmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKTtcbiAgICAgIGNvbnN0IHByaW9yaXR5Q29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmlvcml0eScpO1xuICAgICAgY29uc3QgdHlwZUNvbnRyb2wgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpO1xuICAgICAgY29uc3QgbGFiZWxzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVN0YXR1cyA9IHN0YXR1c0NvbnRyb2w/LnRvdWNoZWQgfHwgc3RhdHVzQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVByaW9yaXR5ID0gcHJpb3JpdHlDb250cm9sPy50b3VjaGVkIHx8IHByaW9yaXR5Q29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVR5cGUgPSB0eXBlQ29udHJvbD8udG91Y2hlZCB8fCB0eXBlQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZUxhYmVscyA9IGxhYmVsc0NvbnRyb2w/LnRvdWNoZWQgfHwgbGFiZWxzQ29udHJvbD8uZGlydHk7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi4ocHJlc2VydmVTdGF0dXMgPyB7fSA6IHsgc3RhdHVzOiB0aGlzLmVkaXRTdGF0dXMgfSksXG4gICAgICAgIC4uLihwcmVzZXJ2ZVByaW9yaXR5ID8ge30gOiB7IHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSB9KSxcbiAgICAgICAgLi4uKHByZXNlcnZlVHlwZSA/IHt9IDogeyB0eXBlOiB0eXBlVmFsIH0pLFxuICAgICAgICAuLi4ocHJlc2VydmVMYWJlbHMgPyB7fSA6IHsgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ByZXJlcXVpc2l0ZUNhc2VPcHRpb25zJ10gJiYgdGhpcy5wcmVyZXF1aXNpdGVDYXNlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5wcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnLFxuICAgICAgICBvcHRpb25zOiB0aGlzLnByZXJlcXVpc2l0ZUNhc2VPcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZ1NlY3Rpb25zJ10gfHwgY2hhbmdlc1snY29uZmlnU2VjdGlvbnNSb3cyJ10pIHtcbiAgICAgIGNvbnN0IGVuYWJsZUFpU21hcnRuZXNzID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRGVmYXVsdCBBSSBBY3Rpb24nKTtcbiAgICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScpO1xuICAgICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlUmF3O1xuICAgICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSB0aGlzLmdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpO1xuICAgICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBQcm9maWxlJykgPz8gJyc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVNldFJhdyA9IHRoaXMubm9ybWFsaXplVGVzdERhdGFTZXRSYXdWYWx1ZShcbiAgICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICAgICk7XG4gICAgICBjb25zdCB0eXBlVmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0eXBlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0eXBlJ10/Lm9wdGlvbnMpID8/IHR5cGVSYXc7XG4gICAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhUHJvZmlsZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFQcm9maWxlJ10/Lm9wdGlvbnMpID8/IHRlc3REYXRhUHJvZmlsZVJhdztcbiAgICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZSh0ZXN0RGF0YVNldFJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFTZXQnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFTZXRSYXc7XG4gICAgICBjb25zdCBkZWZhdWx0QnJvd3NlciA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJyk7XG4gICAgICBjb25zdCB2aWRlb1JlY29yZGluZ1JhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVmlkZW8gUmVjb3JkaW5nJyk7XG4gICAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHRoaXMubm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZpZGVvUmVjb3JkaW5nUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgdXNlQWlNZXRhZGF0YVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBtZXRhZGF0YSBjb2xsZWN0aW9uJyk7XG4gICAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodXNlQWlNZXRhZGF0YVJhdyBhcyBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ0RlZmF1bHQgVmlld3BvcnQnKSB8fCB0aGlzLmdldERldmljZUNvbmZpZ1ZhbHVlKCdWaWV3cG9ydCcpIHx8ICcnO1xuICAgICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnVHlwZScpO1xuICAgICAgY29uc3QgZGV2aWNlT1MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRGV2aWNlJywgJ09TJyk7XG4gICAgICBjb25zdCBhdXRvV2FpdFZhbCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsICdBdXRvIFdhaXQnKTtcbiAgICAgIHRoaXMuYXV0b1dhaXRFbmFibGVkID0gISEoYXV0b1dhaXRWYWwgJiYgYXV0b1dhaXRWYWwudHJpbSgpICE9PSAnJyAmJiBTdHJpbmcoYXV0b1dhaXRWYWwpICE9PSAnZmFsc2UnKTtcbiAgICAgIHRoaXMucmV0cnlGYWlsZWRTdGVwcyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1JldHJ5IEZhaWxlZCBTdGVwcycpO1xuICAgICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gdGhpcy5pc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKSA/ICdvcmcnIDogJ2N1c3RvbSc7XG4gICAgICB0aGlzLnRlc3RDYXNlVGltZW91dCA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpKTtcbiAgICAgIHRoaXMud2FpdFRpbWVvdXRMb2NhdG9ycyA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykpO1xuICAgICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgICAgdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0V4dGVuc2lvbiBVc2UnKTtcbiAgICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAoZW5hYmxlQWlTbWFydG5lc3MpIHBhdGNoWydlbmFibGVBaVNtYXJ0bmVzcyddID0gZW5hYmxlQWlTbWFydG5lc3M7XG4gICAgICBpZiAoZGVmYXVsdEFpQWN0aW9uKSBwYXRjaFsnZGVmYXVsdEFpQWN0aW9uJ10gPSBkZWZhdWx0QWlBY3Rpb247XG4gICAgICBpZiAoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U7XG4gICAgICBpZiAodXNlQWlNZXRhZGF0YSkgcGF0Y2hbJ3VzZUFpTWV0YWRhdGEnXSA9IHVzZUFpTWV0YWRhdGE7XG4gICAgICBpZiAocHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoKSBwYXRjaFsncHJlcmVxdWlzaXRlQ2FzZXMnXSA9IHByZXJlcXVpc2l0ZUNhc2VzO1xuICAgICAgaWYgKHR5cGVWYWwpIHBhdGNoWyd0eXBlJ10gPSB0eXBlVmFsO1xuXG4gICAgICAvLyBSZS1zeW5jIFRlc3QgRGF0YSBQcm9maWxlIC8gU2V0IGZyb20gY29uZmlnIG9ubHkgd2hlbiBjb250cm9scyBhcmUgTk9UIGRpcnR5XG4gICAgICBjb25zdCB0ZHBDdHJsMiA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgIGNvbnN0IHRkc0N0cmwyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVRkcDIgPSB0ZHBDdHJsMj8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVRkczIgPSB0ZHNDdHJsMj8uZGlydHk7XG5cbiAgICAgIGlmICh0ZXN0RGF0YVByb2ZpbGVWYWwgJiYgIXByZXNlcnZlVGRwMikgcGF0Y2hbJ3Rlc3REYXRhUHJvZmlsZSddID0gdGVzdERhdGFQcm9maWxlVmFsO1xuICAgICAgaWYgKHRlc3REYXRhU2V0VmFsICE9IG51bGwgJiYgdGVzdERhdGFTZXRWYWwgIT09ICcnICYmICFwcmVzZXJ2ZVRkczIpIHBhdGNoWyd0ZXN0RGF0YVNldCddID0gdGVzdERhdGFTZXRWYWw7XG4gICAgICBpZiAoZGVmYXVsdEJyb3dzZXIpIHBhdGNoWydkZWZhdWx0QnJvd3NlciddID0gZGVmYXVsdEJyb3dzZXI7XG4gICAgICBpZiAodmlkZW9SZWNvcmRpbmcpIHBhdGNoWyd2aWRlb1JlY29yZGluZyddID0gdmlkZW9SZWNvcmRpbmc7XG4gICAgICBpZiAoZGVmYXVsdFZpZXdwb3J0KSBwYXRjaFsnZGVmYXVsdFZpZXdwb3J0J10gPSBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgICBpZiAoZGV2aWNlVHlwZSkgcGF0Y2hbJ2RldmljZVR5cGUnXSA9IGRldmljZVR5cGU7XG4gICAgICBpZiAoZGV2aWNlT1MpIHBhdGNoWydkZXZpY2VPUyddID0gZGV2aWNlT1M7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCkgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHBhdGNoKTtcbiAgICB9XG4gIH1cblxuICBvblJlbW92ZUxhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSB0aGlzLmVkaXRMYWJlbHMuZmlsdGVyKChsKSA9PiBsICE9PSBsYWJlbCk7XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DbGVhckFsbExhYmVscygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSBbXTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKT8uc2V0VmFsdWUoW10sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRMYWJlbHMuaW5jbHVkZXMobGFiZWwpKSB7XG4gICAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5lZGl0TGFiZWxzLCBsYWJlbF07XG4gICAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgICB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpPy5zZXRWYWx1ZSh0aGlzLmVkaXRMYWJlbHMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNhdmUuZW1pdCh0aGlzLmJ1aWxkU2F2ZVBheWxvYWQoKSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZmlnU2VjdGlvbnMoKTogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHRoaXMucGxhdGZvcm07XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmdWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd2aWRlb1JlY29yZGluZycpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHZpZGVvUmVjb3JkaW5nVmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiB2aWRlb1JlY29yZGluZ1ZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB2aWRlb1JlY29yZGluZ1ZhbHVlO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGFWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd1c2VBaU1ldGFkYXRhJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB1c2VBaU1ldGFkYXRhVmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiB1c2VBaU1ldGFkYXRhVmFsdWUgPT09ICdmYWxzZScgPyBmYWxzZSA6IHVzZUFpTWV0YWRhdGFWYWx1ZTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlc1JhdyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmVyZXF1aXNpdGVDYXNlcycpPy52YWx1ZTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IEFycmF5LmlzQXJyYXkocHJlcmVxdWlzaXRlQ2FzZXNSYXcpXG4gICAgICA/IHByZXJlcXVpc2l0ZUNhc2VzUmF3Lm1hcCgodikgPT4gU3RyaW5nKHYpKS5maWx0ZXIoQm9vbGVhbilcbiAgICAgIDogcHJlcmVxdWlzaXRlQ2FzZXNSYXcgIT0gbnVsbCAmJiBwcmVyZXF1aXNpdGVDYXNlc1JhdyAhPT0gJydcbiAgICAgICAgPyBbU3RyaW5nKHByZXJlcXVpc2l0ZUNhc2VzUmF3KV1cbiAgICAgICAgOiBbXTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlVmFsdWUgPSBwcmVyZXF1aXNpdGVDYXNlcy5sZW5ndGggPyBwcmVyZXF1aXNpdGVDYXNlcy5qb2luKCcsJykgOiBudWxsO1xuICAgIGNvbnN0IHR5cGVWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVNldFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk/LnZhbHVlID8/ICcnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1NlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24udGl0bGUgPT09ICdFeGVjdXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtc1xuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICEocGxhdGZvcm0gPT09ICd3ZWInICYmIGl0ZW0ubGFiZWwgPT09ICdEZWZhdWx0IEJyb3dzZXInKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1ZpZGVvIFJlY29yZGluZycpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB2aWRlb1JlY29yZGluZyB9O1xuICAgICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdQcmVyZXF1aXNpdGUgQ2FzZScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiBwcmVyZXF1aXNpdGVDYXNlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVHlwZScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0eXBlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBEYXRhIFByb2ZpbGUnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGVzdERhdGFQcm9maWxlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBEYXRhIFNldCcpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0ZXN0RGF0YVNldFZhbHVlIH07XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnQUkgQ29uZmlndXJhdGlvbicpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmFibGVBaVNtYXJ0bmVzcycpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGVmYXVsdEFpQWN0aW9uJyk/LnZhbHVlO1xuICAgICAgICBjb25zdCBrbm93bGVkZ2VCYXNlVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdXNlQWlNZXRhZGF0YSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRW5hYmxlIEFJIFNtYXJ0bmVzcycgJiYgZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSAhPSBudWxsICYmIGVuYWJsZUFpU21hcnRuZXNzVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRGVmYXVsdCBBSSBBY3Rpb24nICYmIGRlZmF1bHRBaUFjdGlvblZhbHVlICE9IG51bGwgJiYgZGVmYXVsdEFpQWN0aW9uVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogZGVmYXVsdEFpQWN0aW9uVmFsdWUgfTtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyAmJiBrbm93bGVkZ2VCYXNlVmFsdWUgIT0gbnVsbCAmJiBrbm93bGVkZ2VCYXNlVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZToga25vd2xlZGdlQmFzZVZhbHVlIH07XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAuLi5zZWN0aW9uLCBpdGVtcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RlZmF1bHRCcm93c2VyJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0Vmlld3BvcnQnKT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZXZpY2VUeXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRldmljZU9TID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RldmljZU9TJyk/LnZhbHVlID8/ICcnO1xuXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuY29uZmlnU2VjdGlvbnNSb3cyLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24udGl0bGUgPT09ICdXYWl0cyAmIFJldHJpZXMnIHx8IHNlY3Rpb24udGl0bGUgPT09ICdXYWl0IGFuZCByZXRyaWVzJykge1xuICAgICAgICBjb25zdCBhdXRvV2FpdFZhbHVlID0gdGhpcy5hdXRvV2FpdEVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJztcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnQXV0byBXYWl0JykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IGF1dG9XYWl0VmFsdWUgfTtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuYXV0b1dhaXRFbmFibGVkIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdSZXRyeSBGYWlsZWQgU3RlcHMnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGhpcy5lbXB0eU51bVRvWmVybyh0aGlzLnJldHJ5RmFpbGVkU3RlcHMpIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdUZXN0IENhc2UgVGltZW91dCAobWludXRlcyknKSB7XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gKHRoaXMudGVzdENhc2VUaW1lb3V0ID8/ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID09PSAnb3JnJyB8fCB0cmltbWVkID09PSAnJyA/IE9SR19MRVZFTF9TRU5USU5FTCA6IHRyaW1tZWQ7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuZW1wdHlOdW1Ub1plcm8odGhpcy53YWl0VGltZW91dExvY2F0b3JzKSB9O1xuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlJyB8fCBzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlIFNldHRpbmcnKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW1xuICAgICAgICAgIC4uLihwbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IEJyb3dzZXInLCB2YWx1ZTogZGVmYXVsdEJyb3dzZXIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsIHZhbHVlOiBkZWZhdWx0Vmlld3BvcnQgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCB2YWx1ZTogZGV2aWNlVHlwZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdPUycsIHZhbHVlOiBkZXZpY2VPUyB9LFxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXhpc3RpbmdEZXZpY2UgPSByZXN1bHQuZmluZCgocykgPT4gcy50aXRsZSA9PT0gJ0RldmljZScgfHwgcy50aXRsZSA9PT0gJ0RldmljZSBTZXR0aW5nJyk7XG4gICAgaWYgKCFleGlzdGluZ0RldmljZSkge1xuICAgICAgY29uc3QgZGV2aWNlU2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbiA9IHtcbiAgICAgICAgdGl0bGU6ICdEZXZpY2UnLFxuICAgICAgICBpY29uOiAnZGV2aWNlcycsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgLi4uKHBsYXRmb3JtID09PSAnd2ViJ1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsIHZhbHVlOiBkZWZhdWx0QnJvd3NlciB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZpZXdwb3J0JywgdmFsdWU6IGRlZmF1bHRWaWV3cG9ydCB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHZhbHVlOiBkZXZpY2VUeXBlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ09TJywgdmFsdWU6IGRldmljZU9TIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIGRldmljZVNlY3Rpb25dO1xuICAgIH1cblxuICAgIGNvbnN0IGtleUZsYWdzU2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbiA9IHtcbiAgICAgIHRpdGxlOiAnS2V5IEZsYWdzJyxcbiAgICAgIGljb246ICdmbGFnJyxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdNb2JpbGUgVGVzdGluZycsIHZhbHVlOiB0aGlzLm1vYmlsZVRlc3RpbmdFbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0V4dGVuc2lvbiBVc2UnLCB2YWx1ZTogdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RhdGEgRHJpdmVuJywgdmFsdWU6IHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJyB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5RmxhZ3MgPSByZXN1bHQuZmluZCgocykgPT4gcy50aXRsZSA9PT0gJ0tleSBGbGFncycpO1xuICAgIGlmIChleGlzdGluZ0tleUZsYWdzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQubWFwKChzKSA9PlxuICAgICAgICBzLnRpdGxlID09PSAnS2V5IEZsYWdzJyA/IGtleUZsYWdzU2VjdGlvbiA6IHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIGtleUZsYWdzU2VjdGlvbl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICB0cmFja0J5TGFiZWwoX2k6IG51bWJlciwgbGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgdHJhY2tCeUNvbmZpZ1RpdGxlKF9pOiBudW1iZXIsIHNlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzZWN0aW9uLnRpdGxlO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgbGFiZWxzIHVzZSBjb25zaXN0ZW50IGluZGlnbyBzdHlsZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IExBQkVMX0NISVBfU1RZTEUgPSB7XG4gICAgYmc6ICcjNjM2NkYxJyxcbiAgICBib3JkZXI6ICcjNjM2NkYxJyxcbiAgICB0ZXh0OiAnI0ZGRkZGRicsXG4gICAgaWNvbjogJyNGRkZGRkYnLFxuICB9O1xuXG4gIGdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShfbGFiZWw6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuTEFCRUxfQ0hJUF9TVFlMRTtcbiAgICByZXR1cm4ge1xuICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBjb2xvcnMuYmcsXG4gICAgICAnYm9yZGVyLWNvbG9yJzogY29sb3JzLmJvcmRlcixcbiAgICAgICdib3JkZXItd2lkdGgnOiAnMXB4JyxcbiAgICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICAgY29sb3I6IGNvbG9ycy50ZXh0LFxuICAgIH07XG4gIH1cblxuICBnZXRMYWJlbENsb3NlSWNvbkNvbG9yKF9sYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5MQUJFTF9DSElQX1NUWUxFLmljb247XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtcHktNFwiPlxuICA8IS0tIEJhc2ljIGRldGFpbHM6IERlc2NyaXB0aW9uLCBTdGF0dXMvUHJpb3JpdHkvVHlwZSwgTGFiZWxzIChsaWdodCBiYWNrZ3JvdW5kIGNvbnRhaW5lcikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOEY5RkVdIGNxYS1wLTRcIj5cbiAgPCEtLSBEZXNjcmlwdGlvbiAoRmlnbWE6IGRvY3VtZW50IGljb24sIHRleHRhcmVhIHdpdGggbGlnaHQgcHVycGxlIGJnKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5kZXNjcmlwdGlvbjwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+e3sgZGVzY3JpcHRpb25UaXRsZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgW3ZhbHVlXT1cImVkaXREZXNjcmlwdGlvblwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiZWRpdERlc2NyaXB0aW9uID0gJGV2ZW50XCJcbiAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICBbcm93c109XCI0XCJcbiAgICAgIFtlbmFibGVNYXJrZG93bl09XCJlbmFibGVNYXJrZG93blwiXG4gICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGRlc2NyaXB0aW9uLi4uXCJcbiAgICAgIHRleHRhcmVhSW5saW5lU3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxMDAlXCJcbiAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPlxuICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGF0dXMsIFByaW9yaXR5ICYgVHlwZSAoRmlnbWE6IHNpZGUtYnktc2lkZSBkcm9wZG93bnMsIGNxYS1keW5hbWljLXNlbGVjdCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTIgY3FhLWdhcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnc3RhdHVzJywgc3RhdHVzU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3N0YXR1cycpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5Qcmlvcml0eTwvbGFiZWw+XG4gICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdwcmlvcml0eScsIHByaW9yaXR5U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByaW9yaXR5JylcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1N0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPlR5cGU8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndHlwZScsIHR5cGVTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndHlwZScpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExhYmVscyAoRmlnbWE6IEN1cnJlbnQgTGFiZWxzIHdpdGggQ2xlYXIgQWxsLCBjcWEtYmFkZ2Ugd2l0aCB4LCBGcmVxdWVudGx5IHVzZWQsIFNlYXJjaCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTVweF0gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+Q3VycmVudCBMYWJlbHMgKHt7IGVkaXRMYWJlbHMubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwiZWRpdExhYmVscy5sZW5ndGggPiAwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bI0RDMjYyNl0gaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtZm9udC1ub3JtYWxcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhckFsbExhYmVscygpXCI+XG4gICAgICAgIENsZWFyIEFsbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCIgKm5nSWY9XCJlZGl0TGFiZWxzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGVkaXRMYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlMYWJlbFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXB4LTIuNSBjcWEtcHktMSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXJvdW5kZWQtbWQgY3FhLWJvcmRlclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShsYWJlbClcIj5cbiAgICAgICAgPHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTMuNSBjcWEtaC0zLjUgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0TGFiZWxDbG9zZUljb25Db2xvcihsYWJlbClcIlxuICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUxhYmVsKGxhYmVsKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlICcgKyBsYWJlbFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdy0zLjUgY3FhLWgtMy41XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5GcmVxdWVudGx5IHVzZWQ8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBmcmVxdWVudGx5VXNlZExhYmVsczsgdHJhY2tCeTogdHJhY2tCeUxhYmVsXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbClcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFOEU5RkZcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwiIzNGNDNFRVwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNFOEU5RkZcIj5cbiAgICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+QWRkIGxhYmVsczwvbGFiZWw+XG4gICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgW2NvbmZpZ109XCJsYWJlbHNTZWxlY3RDb25maWdcIlxuICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnbGFiZWxzJylcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkxhYmVsc0FkZEN1c3RvbVZhbHVlKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gIDwvZGl2PlxuICA8L2Rpdj5cblxuXG4gIDwhLS0gQ29uZmlndXJhdGlvbiAoRmlnbWE6IGNvbGxhcHNpYmxlLCBnZWFyIGljb24sIGxpZ2h0IGJhY2tncm91bmQgY29udGFpbmVyKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzEycHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF0gY3FhLWJnLVsjRjhGOUZFXSBjcWEtcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS10ZXh0LWxlZnQgY3FhLXctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS41cHhdXCI+e3sgY29uZmlnVGl0bGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTUgY3FhLXRleHQteHNcIj5cbiAgICAgIDwhLS0gRXhlY3V0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0aW9uRXhwYW5kZWQgPSAhZXhlY3V0aW9uRXhwYW5kZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+cGxheV9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkV4ZWN1dGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBleGVjdXRpb25FeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJleGVjdXRpb25FeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaGFzUHJlcmVxdWlzaXRlQ2FzZUNvbmZpZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj4gXG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgncHJlcmVxdWlzaXRlQ2FzZXMnLCBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByZXJlcXVpc2l0ZUNhc2VzJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5UZXN0IERhdGEgUHJvZmlsZTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndGVzdERhdGFQcm9maWxlJywgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3Rlc3REYXRhUHJvZmlsZScpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2ODczODldIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bVwiPlRlc3QgRGF0YSBTZXQ8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3Rlc3REYXRhU2V0JywgdGVzdERhdGFTZXRTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndGVzdERhdGFTZXQnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5WaWRlbyBSZWNvcmRpbmc8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3ZpZGVvUmVjb3JkaW5nJywgdmlkZW9SZWNvcmRpbmdTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndmlkZW9SZWNvcmRpbmcnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBSSBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWlDb25maWdFeHBhbmRlZCA9ICFhaUNvbmZpZ0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNtYXJ0X3RveTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+QUkgQ29uZmlndXJhdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBhaUNvbmZpZ0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFpQ29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB5LTAgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2VuYWJsZUFpU21hcnRuZXNzJywgZW5hYmxlQWlTbWFydG5lc3NTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZW5hYmxlQWlTbWFydG5lc3MnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEFpQWN0aW9uJywgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRBaUFjdGlvbicpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJywga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3VzZUFpTWV0YWRhdGEnLCBhaU1ldGFkYXRhQ29sbGVjdGlvblNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCd1c2VBaU1ldGFkYXRhJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBXYWl0cyAmIFJldHJpZXMtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItNCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIndhaXRzUmV0cmllc0V4cGFuZGVkID0gIXdhaXRzUmV0cmllc0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnRpbWVyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5XYWl0IGFuZCBSZXRyaWVzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgIHt7IHdhaXRzUmV0cmllc0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIndhaXRzUmV0cmllc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImF1dG9XYWl0RW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImF1dG9XYWl0RW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUmV0cnkgRmFpbGVkIFN0ZXBzXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJldHJ5RmFpbGVkU3RlcHNcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicmV0cnlGYWlsZWRTdGVwcyA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgIGxhYmVsSW5saW5lU3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOS42cHhcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQteHMgY3FhLW1iLTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgICBUZXN0IENhc2UgVGltZW91dCAobWludXRlcylcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1kcm9wZG93bi1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInRlc3RDYXNlVGltZW91dE1vZGVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cInRlc3RDYXNlVGltZW91dE1vZGVcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblRlc3RDYXNlVGltZW91dE1vZGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWRyb3Bkb3duLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlc3RDYXNlVGltZW91dERpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGVzdENhc2VUaW1lb3V0TW9kZSA9PT0gJ29yZydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlc3RDYXNlVGltZW91dCA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjMwXCJcbiAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWMpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIndhaXRUaW1lb3V0TG9jYXRvcnNcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwid2FpdFRpbWVvdXRMb2NhdG9ycyA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICBsYWJlbElubGluZVN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuNnB4XCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicGxhdGZvcm0gIT09ICdtb2JpbGUnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItNCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImRldmljZUV4cGFuZGVkID0gIWRldmljZUV4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRldmljZXM8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkRldmljZSBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBkZXZpY2VFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkZXZpY2VFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSBXZWIgb25seTogbW9iaWxlIERldmljZSBTZXR0aW5ncyBoaWRkZW4gdGVtcG9yYXJpbHkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEJyb3dzZXInLCBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdkZWZhdWx0QnJvd3NlcicpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdFZpZXdwb3J0JywgZGVmYXVsdFZpZXdwb3J0U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRWaWV3cG9ydCcpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIEtleSBGbGFncyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItMCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImtleUZsYWdzRXhwYW5kZWQgPSAha2V5RmxhZ3NFeHBhbmRlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5mbGFnPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5LZXkgRmxhZ3M8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyM2NDc0OEJdIGNxYS10ZXh0LXhsIGNxYS13LTUgY3FhLWgtNVwiPlxuICAgICAgICAgICAge3sga2V5RmxhZ3NFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJrZXlGbGFnc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJtb2JpbGVUZXN0aW5nRW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cIm1vYmlsZVRlc3RpbmdFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiTW9iaWxlIFRlc3RpbmdcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+TW9iaWxlIFRlc3Rpbmc8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbGdcIj5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRvZ2dsZSBbY2hlY2tlZF09XCJleHRlbnNpb25Vc2VFbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiZXh0ZW5zaW9uVXNlRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkV4dGVuc2lvbiBVc2VcIj48L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXRleHQtWyMxMTE4MjddXCI+RXh0ZW5zaW9uIFVzZTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImRhdGFEcml2ZW5FbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwiZGF0YURyaXZlbkVuYWJsZWQgPSAkZXZlbnRcIiBhcmlhTGFiZWw9XCJEYXRhIERyaXZlblwiPjwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5EYXRhIERyaXZlbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgXG4gICAgICA8IS0tIEFQSSBNb2NraW5nIENhcmQgKGVkaXQgbW9kZTogbXV0dWFsbHktZXhjbHVzaXZlIHRvZ2dsZXMgZHJpdmVuIGJ5IG9uZSBib29sZWFuKSAtLT5cbiAgICAgIDxjcWEtYXBpLW1vY2tpbmctY2FyZFxuICAgICAgICAqbmdJZj1cInNob3dBcGlNb2NraW5nQ2FyZFwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCJcbiAgICAgICAgW3RpdGxlXT1cImFwaU1vY2tpbmdUaXRsZVwiXG4gICAgICAgIFtzdGF0dXNMYWJlbF09XCJhcGlNb2NraW5nU3RhdHVzTGFiZWxcIlxuICAgICAgICBbY2FwdHVyZUxhYmVsXT1cImFwaU1vY2tpbmdDYXB0dXJlTGFiZWxcIlxuICAgICAgICBbY2FwdHVyZUhpbnRdPVwiYXBpTW9ja2luZ0NhcHR1cmVIaW50XCJcbiAgICAgICAgW3JlbmV3TGFiZWxdPVwiYXBpTW9ja2luZ1JlbmV3TGFiZWxcIlxuICAgICAgICBbcmVuZXdIaW50XT1cImFwaU1vY2tpbmdSZW5ld0hpbnRcIlxuICAgICAgICBbcmVzdG9yZU1vY2tdPVwiZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9ja1wiXG4gICAgICAgIFtzdG9yZU1vY2tdPVwiZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2tcIlxuICAgICAgICBbbW9ja2VkQXBpc0NvdW50XT1cImFwaU1vY2tpbmdNb2NrZWRBcGlzQ291bnRcIlxuICAgICAgICBbdG90YWxBcGlzQ291bnRdPVwiYXBpTW9ja2luZ1RvdGFsQXBpc0NvdW50XCJcbiAgICAgICAgW3Byb2dyZXNzUGVyY2VudF09XCJhcGlNb2NraW5nUHJvZ3Jlc3NQZXJjZW50XCJcbiAgICAgICAgW3Nob3dQcm9ncmVzc109XCJhcGlNb2NraW5nU2hvd1Byb2dyZXNzXCJcbiAgICAgICAgW3N1bW1hcnlUZXh0XT1cImFwaU1vY2tpbmdTdW1tYXJ5VGV4dFwiXG4gICAgICAgIFtwZXJjZW50VGV4dF09XCJhcGlNb2NraW5nUGVyY2VudFRleHRcIlxuICAgICAgICBbZWRpdGluZ109XCJ0cnVlXCJcbiAgICAgICAgKHJlc3RvcmVNb2NrQ2hhbmdlKT1cIm9uQXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoc3RvcmVNb2NrQ2hhbmdlKT1cIm9uQXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGNvbmZpZ3VyZSk9XCJjb25maWd1cmVBcGlNb2NraW5nLmVtaXQoKVwiPlxuICAgICAgPC9jcWEtYXBpLW1vY2tpbmctY2FyZD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1nYXAtMyBjcWEtcHQtMiBjcWEtdy1mdWxsXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgIFt0ZXh0XT1cIidDYW5jZWwnXCJcbiAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAqbmdJZj1cIiFpc1NhdmluZ1wiXG4gICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICBbdGV4dF09XCInU2F2ZSBDaGFuZ2VzJ1wiXG4gICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVW5zYXZlZENoYW5nZXNcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvblNhdmUoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGRpdiAqbmdJZj1cImlzU2F2aW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgIDxjcWEtYmFkZ2VcbiAgICAgICAgICBsYWJlbD1cIlNhdmluZ+KAplwiXG4gICAgICAgICAgaWNvbj1cImF1dG9yZW5ld1wiXG4gICAgICAgICAgW2lzTG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFtjZW50ZXJDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIHZhcmlhbnQ9XCJpbmZvXCJcbiAgICAgICAgICBzaXplPVwibWVkaXVtXCI+XG4gICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
1258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQvdGVzdC1jYXNlLWRldGFpbHMtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQWN4RCxtSEFBbUg7QUFDbkgsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUM7QUF5QnZDLG9HQUFvRztBQUNwRyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRztJQUMzQyxNQUFNLEVBQUUsUUFBUTtJQUNoQixRQUFRLEVBQUUsVUFBVTtJQUNwQixJQUFJLEVBQUUsTUFBTTtJQUNaLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLFdBQVcsRUFBRSxhQUFhO0lBQzFCLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsNEJBQTRCLEVBQUUsOEJBQThCO0lBQzVELGFBQWEsRUFBRSxlQUFlO0lBQzlCLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxVQUFVLEVBQUUsWUFBWTtJ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c0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24sXG4gIFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbSxcbn0gZnJvbSAnLi4vdGVzdC1jYXNlLWRldGFpbHMubW9kZWxzJztcbmltcG9ydCB7XG4gIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyxcbiAgU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcGRvd25PcHRpb24gfSBmcm9tICcuLi8uLi9kcm9wZG93bi1idXR0b24vZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSYWRpb0NhcmRPcHRpb24gfSBmcm9tICcuLi8uLi9yYWRpby1jYXJkLWdyb3VwL3JhZGlvLWNhcmQtb3B0aW9uLm1vZGVsJztcblxudHlwZSBWaWV3cG9ydE1vZGUgPSAnZGVza3RvcCcgfCAnbGFwdG9wJyB8ICd0YWJsZXQnIHwgJ21vYmlsZScgfCAnY3VzdG9tJztcblxuLyoqIFNlbnRpbmVsIHZhbHVlIGVtaXR0ZWQgaW4gc2F2ZSBwYXlsb2FkcyB0byB0ZWxsIHRoZSBob3N0IHRvIHNlbmQgbnVsbCBmb3IgdGhlIGZpZWxkICh1c2Ugb3JnLWxldmVsIGRlZmF1bHQpLiAqL1xuY29uc3QgT1JHX0xFVkVMX1NFTlRJTkVMID0gJ09yZyBsZXZlbCc7XG5cbi8qKiBPdmVycmlkZSBjb25maWcgZm9yIGEgc3BlY2lmaWMgc2VsZWN0LiBVc2UgZm9yIHNlcnZlci1zaWRlIHNlYXJjaCwgbG9hZCBtb3JlLCBjdXN0b20gb3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0Q29uZmlnT3ZlcnJpZGUge1xuICAvKiogUmVwbGFjZSBvcHRpb25zIChlLmcuIGZyb20gQVBJKS4gVXBkYXRlIHdoZW4gQVBJIHJldHVybnMuICovXG4gIG9wdGlvbnM/OiBTZWxlY3RPcHRpb25bXTtcbiAgLyoqIEVuYWJsZSBzZXJ2ZXItc2lkZSBzZWFyY2g7IGNvbXBvbmVudCBlbWl0cyBzZWxlY3RTZWFyY2ggaW5zdGVhZCBvZiBsb2NhbCBmaWx0ZXJpbmcuICovXG4gIHNlcnZlclNlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBJbmRpY2F0ZXMgbW9yZSByZXN1bHRzIGF2YWlsYWJsZSBmb3IgaW5maW5pdGUgc2Nyb2xsLiAqL1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgLyoqIExvYWRpbmcgc3RhdGUgKGUuZy4gZHVyaW5nIEFQSSBjYWxsKS4gKi9cbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2ggaW5wdXQgaW4gdGhlIHNlbGVjdC4gKi9cbiAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIHRyaWdnZXJzIGluaXRpYWwgc2VhcmNoIG9uIHBhbmVsIG9wZW4gKHNlcnZlclNlYXJjaCBtb2RlKS4gKi9cbiAgaW5pdGlhbEZldGNoT25PcGVuPzogYm9vbGVhbjtcbiAgLyoqIENhbGxiYWNrIHdoZW4gdXNlciB0eXBlcyBpbiBzZWFyY2guIENhbGwgQVBJLCB0aGVuIHVwZGF0ZSBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIG9uU2VhcmNoPzogKHF1ZXJ5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIHVzZXIgc2Nyb2xscyB0byBsb2FkIG1vcmUuIENhbGwgQVBJLCBhcHBlbmQgb3B0aW9ucyB2aWEgc2VsZWN0Q29uZmlnT3ZlcnJpZGVzLiAqL1xuICBvbkxvYWRNb3JlPzogKHF1ZXJ5Pzogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKiogTWFwIG9mIHNlbGVjdCBrZXkgLT4gY29uZmlnIG92ZXJyaWRlLiBFbmFibGVzIEFQSS1kcml2ZW4gb3B0aW9ucywgaW5maW5pdGUgc2VhcmNoLCBsb2FkIG1vcmUuICovXG5leHBvcnQgdHlwZSBTZWxlY3RDb25maWdPdmVycmlkZXMgPSBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIFNlbGVjdENvbmZpZ092ZXJyaWRlPj47XG5cbi8qKiBLZXlzIGZvciBlYWNoIGR5bmFtaWMgc2VsZWN0IGluIHRlc3QtY2FzZS1kZXRhaWxzLWVkaXQuIFVzZSB0aGVzZSB3aXRoIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbmV4cG9ydCBjb25zdCBURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUyA9IHtcbiAgc3RhdHVzOiAnc3RhdHVzJyxcbiAgcHJpb3JpdHk6ICdwcmlvcml0eScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgbGFiZWxzOiAnbGFiZWxzJyxcbiAgcHJlcmVxdWlzaXRlQ2FzZXM6ICdwcmVyZXF1aXNpdGVDYXNlcycsXG4gIHRlc3REYXRhUHJvZmlsZTogJ3Rlc3REYXRhUHJvZmlsZScsXG4gIHRlc3REYXRhU2V0OiAndGVzdERhdGFTZXQnLFxuICB2aWRlb1JlY29yZGluZzogJ3ZpZGVvUmVjb3JkaW5nJyxcbiAgZW5hYmxlQWlTbWFydG5lc3M6ICdlbmFibGVBaVNtYXJ0bmVzcycsXG4gIGRlZmF1bHRBaUFjdGlvbjogJ2RlZmF1bHRBaUFjdGlvbicsXG4gIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6ICdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyxcbiAgdXNlQWlNZXRhZGF0YTogJ3VzZUFpTWV0YWRhdGEnLFxuICBkZWZhdWx0QnJvd3NlcjogJ2RlZmF1bHRCcm93c2VyJyxcbiAgZGVmYXVsdFZpZXdwb3J0OiAnZGVmYXVsdFZpZXdwb3J0JyxcbiAgZGV2aWNlVHlwZTogJ2RldmljZVR5cGUnLFxuICBkZXZpY2VPUzogJ2RldmljZU9TJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhIHtcbiAgZGVzY3JpcHRpb25Db250ZW50OiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBwcmlvcml0eTogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nIHwgbnVtYmVyO1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICB0ZXN0RGF0YVByb2ZpbGVJZD86IG51bWJlciB8IHN0cmluZyB8IG51bGw7XG4gIHRlc3REYXRhU2V0SW5kZXg/OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsO1xuICBjb25maWdTZWN0aW9uczogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdO1xuICBjb25maWdTZWN0aW9uc1JvdzI6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXTtcbiAgLyoqIFwiVXNlIG1vY2sgQVBJIHJlc3BvbnNlc1wiIHJvdyBzdGF0ZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGFwaU1vY2tpbmdTdG9yZU1vY2tgIHdoZW4gdHJ1ZS4gKi9cbiAgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrPzogYm9vbGVhbjtcbiAgLyoqIFwiUmVuZXcgYW5kIHN0b3JlIEFQSSByZXNwb25zZXNcIiByb3cgc3RhdGUuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhcGlNb2NraW5nUmVzdG9yZU1vY2tgIHdoZW4gdHJ1ZS4gKi9cbiAgYXBpTW9ja2luZ1N0b3JlTW9jaz86IGJvb2xlYW47XG59XG5cbmNvbnN0IEZSRVFVRU5UTFlfVVNFRF9MQUJFTFMgPSBbXG4gICdDYXNlJyxcbiAgJ0NyaXRpY2FsJyxcbiAgJ1BPJyxcbiAgJ1VwbG9hZCcsXG4gICdWYWxpZGF0aW9uJyxcbiAgJ1JldmlldycsXG4gICdFZGdlLWNhc2VzJyxcbiAgJ1NlY3VyaXR5JyxcbiAgJ0ludGVncmF0aW9uJyxcbiAgJ1Ntb2tlJyxcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtZGV0YWlscy1lZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rlc3QtY2FzZS1kZXRhaWxzLWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VEZXRhaWxzRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgZGVzY3JpcHRpb25UaXRsZSA9ICdEZXNjcmlwdGlvbic7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uQ29udGVudCA9ICcnO1xuICAvKiogV2hlbiB0cnVlLCBkZXNjcmlwdGlvbiB1c2VzIFRyaXggcmljaCB0ZXh0IGVkaXRvciAoQm9sZCwgSXRhbGljLCBldGMuKS4gSG9zdCBhcHAgbXVzdCBsb2FkIFRyaXguICovXG4gIEBJbnB1dCgpIGVuYWJsZU1hcmtkb3duID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1ldGFkYXRhSXRlbXM6IFRlc3RDYXNlRGV0YWlsc01ldGFkYXRhSXRlbVtdID0gW107XG4gIEBJbnB1dCgpIGxhYmVsczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgY29uZmlnVGl0bGUgPSAnQ29uZmlndXJhdGlvbic7XG4gIEBJbnB1dCgpIGNvbmZpZ1NlY3Rpb25zOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgY29uZmlnU2VjdGlvbnNSb3cyOiBUZXN0Q2FzZURldGFpbHNDb25maWdTZWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgaXNTYXZpbmcgPSBmYWxzZTtcbiAgLyoqIE9wdGlvbmFsIGxpc3Qgb2YgcHJlcmVxdWlzaXRlIHRlc3QgY2FzZSBvcHRpb25zIGZvciB0aGUgbXVsdGktc2VsZWN0LiBJZiBub3QgcHJvdmlkZWQsIHVzZXMgZGVmYXVsdCBzYW1wbGUgb3B0aW9ucy4gKi9cbiAgQElucHV0KCkgcHJlcmVxdWlzaXRlQ2FzZU9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogUGxhdGZvcm06ICd3ZWInIHNob3dzIERlZmF1bHQgQnJvd3NlciArIFZpZXdwb3J0OyAnbW9iaWxlJyBzaG93cyBEZXZpY2UgVHlwZSArIE9TLiBEZWZhdWx0cyB0byAnd2ViJy4gKi9cbiAgQElucHV0KCkgcGxhdGZvcm06ICd3ZWInIHwgJ21vYmlsZScgPSAnd2ViJztcblxuICAvKiogV2hlbiB0cnVlLCBoaWRlcyBQcmlvcml0eSwgVHlwZSwgYW5kIFRlc3QgRGF0YSBTZXQgZmllbGRzIChzdGVwIGdyb3VwcyBkb24ndCBoYXZlIHRoZXNlKS4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIEBJbnB1dCgpIGlzU3RlcEdyb3VwID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGNvbmZpZyBwZXIgc2VsZWN0IGtleS4gVXNlIGZvcjpcbiAgICogLSBBUEktZHJpdmVuIG9wdGlvbnM6IHBhc3Mgb3B0aW9ucyBhcnJheSAodXBkYXRlIHdoZW4gQVBJIHJldHVybnMpXG4gICAqIC0gU2VydmVyLXNpZGUgc2VhcmNoOiBzZXJ2ZXJTZWFyY2g6IHRydWUsIG9uU2VhcmNoIGluIG92ZXJyaWRlIG9yIGxpc3RlbiB0byBzZWxlY3RTZWFyY2hcbiAgICogLSBJbmZpbml0ZSBzY3JvbGw6IGhhc01vcmU6IHRydWUsIG9uTG9hZE1vcmUgaW4gb3ZlcnJpZGUgb3IgbGlzdGVuIHRvIHNlbGVjdExvYWRNb3JlXG4gICAqIC0gSW5pdGlhbCBmZXRjaCBvbiBvcGVuOiBpbml0aWFsRmV0Y2hPbk9wZW46IHRydWVcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdENvbmZpZ092ZXJyaWRlczogU2VsZWN0Q29uZmlnT3ZlcnJpZGVzID0ge307XG5cbiAgLy8g4pSA4pSAIEFQSSBNb2NraW5nIGNhcmQgKGVkaXQgbW9kZTogc2hvd3MgdHdvIHRvZ2dsZXMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBASW5wdXQoKSBzaG93QXBpTW9ja2luZ0NhcmQgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1RpdGxlID0gJ0FQSSBNb2NraW5nJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ1N0YXR1c0xhYmVsID0gJ05vdCBjb25maWd1cmVkJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ0NhcHR1cmVMYWJlbCA9ICdVc2UgbW9jayBBUEkgcmVzcG9uc2VzJztcbiAgQElucHV0KCkgYXBpTW9ja2luZ0NhcHR1cmVIaW50ID0gJ1VzZXMgc3RvcmVkIHJlc3BvbnNlcyBvbiBuZXh0IHJ1bi4gVHVybiBvbiBhZnRlciBjYXB0dXJlIGNvbXBsZXRlcy4nO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUmVuZXdMYWJlbCA9ICdSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlcyc7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZW5ld0hpbnQgPSAnUmUtY2FwdHVyZXMgZnJlc2ggcmVzcG9uc2VzIG9uIG5leHQgcnVuLiBUdXJucyBvZmYgVXNlIG1vY2suJztcbiAgLyoqXG4gICAqIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBjYXJkJ3MgZHVhbCB0b2dnbGUgc3RhdGUuXG4gICAqICAgdHJ1ZSAg4oaSIFJlbmV3IE9OLCBDYXB0dXJlIE9GRlxuICAgKiAgIGZhbHNlIOKGkiBSZW5ldyBPRkYsIENhcHR1cmUgT05cbiAgICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdSZXN0b3JlTW9jayA9IGZhbHNlO1xuICAvKiogXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIOKAlCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXBpTW9ja2luZ1Jlc3RvcmVNb2NrYCB3aGVuIHRydWUuICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2sgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ01vY2tlZEFwaXNDb3VudCA9IDA7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdUb3RhbEFwaXNDb3VudCA9IDA7XG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnQgPSAwO1xuICAvKiogRm9yd2FyZGVkIHRvIGBjcWEtYXBpLW1vY2tpbmctY2FyZGAuIEluIGVkaXQgbW9kZSB0aGUgY2FyZCBoaWRlcyB0aGUgYmxvY2sgYW55d2F5LCBidXRcbiAgICogIHdlIHN0aWxsIHBpcGUgdGhlIGlucHV0IHRocm91Z2ggZm9yIHN5bW1ldHJ5IHdpdGggdGhlIHJlYWQtb25seSBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIGFwaU1vY2tpbmdTaG93UHJvZ3Jlc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpTW9ja2luZ1N1bW1hcnlUZXh0Pzogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlNb2NraW5nUGVyY2VudFRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqIE9yZy1sZXZlbCBkZWZhdWx0IGZvciBUZXN0IENhc2UgVGltZW91dCAobWludXRlcykuIFVzZWQgdG8gZmxhZyB0aGUgaW5wdXQgYXMgXCJPUkcgbGV2ZWxcIiB2cyBcIkN1c3RvbVwiLiAqL1xuICBASW5wdXQoKSBvcmdMZXZlbFRlc3RDYXNlVGltZW91dD86IHN0cmluZyB8IG51bWJlciB8IG51bGw7XG5cbiAgLyoqIFZpZXdwb3J0IGRyb3Bkb3duIG9wdGlvbnMgcGVyIGNhdGVnb3J5IGZyb20gdGhlIEFQSS4gUGFzcyBERVNLVE9QLCBMQVBUT1AsIFRBQkxFVCwgTU9CSUxFIGFycmF5cy4gKi9cbiAgQElucHV0KCkgdmlld3BvcnRDYXRlZ29yeU9wdGlvbnM6IHsgREVTS1RPUD86IFNlbGVjdE9wdGlvbltdLCBMQVBUT1A/OiBTZWxlY3RPcHRpb25bXSwgVEFCTEVUPzogU2VsZWN0T3B0aW9uW10sIE1PQklMRT86IFNlbGVjdE9wdGlvbltdIH0gPSB7fTtcblxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGVzdENhc2VEZXRhaWxzRWRpdEZvcm1EYXRhPigpO1xuICBAT3V0cHV0KCkgY2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzZWFyY2hlcyBpbiBhIHNlbGVjdCAoc2VydmVyU2VhcmNoIG1vZGUpLiBDYWxsIEFQSSBhbmQgdXBkYXRlIG9wdGlvbnMgdmlhIHNlbGVjdENvbmZpZ092ZXJyaWRlcy4gKi9cbiAgQE91dHB1dCgpIHNlbGVjdFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBzY3JvbGxzIHRvIGxvYWQgbW9yZS4gQ2FsbCBBUEksIGFwcGVuZCB0byBvcHRpb25zIHZpYSBzZWxlY3RDb25maWdPdmVycmlkZXMuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RMb2FkTW9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9PigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWxlY3QgcGFuZWwgaXMgb3BlbmVkLiBVc2UgdG8gY2FsbCBBUEkgZm9yIGluaXRpYWwgbG9hZCAoZS5nLiB3aGVuIGluaXRpYWxGZXRjaE9uT3BlbikuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RPcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmcgfT4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzIGluIGFueSBzZWxlY3QuICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGFkZHMgYSBuZXcgY3VzdG9tIGxhYmVsIHZpYSB0aGUgXCJOZXdcIiBvcHRpb24uICovXG4gIEBPdXRwdXQoKSBsYWJlbEFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgZmxpcHMgdGhlIFwiVXNlIG1vY2sgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBmbGlwcyB0aGUgXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gKi9cbiAgQE91dHB1dCgpIGFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFwiQ29uZmlndXJlIE1vY2sgQVBJc1wiIG9uIHRoZSBlbWJlZGRlZCBjYXJkIGluIGVkaXQgbW9kZS4gKi9cbiAgQE91dHB1dCgpIGNvbmZpZ3VyZUFwaU1vY2tpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKiBGb3JtIHN0YXRlICovXG4gIGVkaXREZXNjcmlwdGlvbiA9ICcnO1xuICBlZGl0U3RhdHVzID0gJyc7XG4gIGVkaXRQcmlvcml0eSA9ICcnO1xuICBlZGl0TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogTG9jYWwgZWRpdC1tb2RlIG1pcnJvciBvZiB0aGUgYHJlc3RvcmVNb2NrYCBib29sZWFuLiBTZWVkZWQgZnJvbSBASW5wdXQoKSBvbiBpbml0L2NoYW5nZXMuICovXG4gIGVkaXRBcGlNb2NraW5nUmVzdG9yZU1vY2sgPSBmYWxzZTtcbiAgLyoqIExvY2FsIGVkaXQtbW9kZSBtaXJyb3Igb2YgdGhlIGBzdG9yZU1vY2tgIGJvb2xlYW4uICovXG4gIGVkaXRBcGlNb2NraW5nU3RvcmVNb2NrID0gZmFsc2U7XG4gIHRlc3RDYXNlVGltZW91dCA9ICcnO1xuICAvKiogJ29yZycg4oaSIGlucHV0IGRpc2FibGVkLCBwYXlsb2FkIHNlbmRzIG51bGwgZm9yIHRlc3RjYXNlVGltZW91dDsgJ2N1c3RvbScg4oaSIGlucHV0IGVuYWJsZWQsIHBheWxvYWQgc2VuZHMgdGhlIHR5cGVkIHZhbHVlLiAqL1xuICB0ZXN0Q2FzZVRpbWVvdXRNb2RlOiAnb3JnJyB8ICdjdXN0b20nID0gJ29yZyc7XG4gIHdhaXRUaW1lb3V0TG9jYXRvcnMgPSAnJztcbiAgYXV0b1dhaXRFbmFibGVkID0gZmFsc2U7XG4gIHJldHJ5RmFpbGVkU3RlcHMgPSAnJztcbiAgY29uZmlnRXhwYW5kZWQgPSB0cnVlO1xuICBleGVjdXRpb25FeHBhbmRlZCA9IHRydWU7XG4gIGFpQ29uZmlnRXhwYW5kZWQgPSB0cnVlO1xuICB3YWl0c1JldHJpZXNFeHBhbmRlZCA9IHRydWU7XG4gIGRldmljZUV4cGFuZGVkID0gdHJ1ZTtcbiAga2V5RmxhZ3NFeHBhbmRlZCA9IHRydWU7XG4gIG1vYmlsZVRlc3RpbmdFbmFibGVkID0gZmFsc2U7XG4gIGV4dGVuc2lvblVzZUVuYWJsZWQgPSBmYWxzZTtcbiAgZGF0YURyaXZlbkVuYWJsZWQgPSBmYWxzZTtcblxuICB2aWV3cG9ydE1vZGU6IFZpZXdwb3J0TW9kZSA9ICdkZXNrdG9wJztcbiAgdmlld3BvcnREZXNrdG9wRGV2aWNlRm9ybSA9IG5ldyBGb3JtR3JvdXAoeyB2aWV3cG9ydERlc2t0b3BEZXZpY2U6IG5ldyBGb3JtQ29udHJvbCgnJykgfSk7XG4gIHZpZXdwb3J0TGFwdG9wRGV2aWNlRm9ybSA9IG5ldyBGb3JtR3JvdXAoeyB2aWV3cG9ydExhcHRvcERldmljZTogbmV3IEZvcm1Db250cm9sKCcnKSB9KTtcbiAgdmlld3BvcnRUYWJsZXREZXZpY2VGb3JtID0gbmV3IEZvcm1Hcm91cCh7IHZpZXdwb3J0VGFibGV0RGV2aWNlOiBuZXcgRm9ybUNvbnRyb2woJycpIH0pO1xuICB2aWV3cG9ydE1vYmlsZURldmljZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHsgdmlld3BvcnRNb2JpbGVEZXZpY2U6IG5ldyBGb3JtQ29udHJvbCgnJykgfSk7XG4gIGN1c3RvbVZpZXdwb3J0V2lkdGggPSAnJztcbiAgY3VzdG9tVmlld3BvcnRIZWlnaHQgPSAnJztcbiAgY3VzdG9tVmlld3BvcnRUYWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHJlYWRvbmx5IHZpZXdwb3J0TW9kZU9wdGlvbnM6IFJhZGlvQ2FyZE9wdGlvbltdID0gW1xuICAgIHsgdmFsdWU6ICdkZXNrdG9wJywgbGFiZWw6ICdEZXNrdG9wJywgaWNvbjogJ2Rlc2t0b3Bfd2luZG93cycgfSxcbiAgICB7IHZhbHVlOiAnbGFwdG9wJywgbGFiZWw6ICdMYXB0b3AnLCBpY29uOiAnbGFwdG9wX3dpbmRvd3MnIH0sXG4gICAgeyB2YWx1ZTogJ3RhYmxldCcsIGxhYmVsOiAnVGFibGV0JywgaWNvbjogJ3RhYmxldF9tYWMnIH0sXG4gICAgeyB2YWx1ZTogJ21vYmlsZScsIGxhYmVsOiAnTW9iaWxlJywgaWNvbjogJ3NtYXJ0cGhvbmUnIH0sXG4gIF07XG5cbiAgZGVza3RvcFZpZXdwb3J0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndmlld3BvcnREZXNrdG9wRGV2aWNlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgcmVzb2x1dGlvbicsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBsYXB0b3BWaWV3cG9ydENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZpZXdwb3J0TGFwdG9wRGV2aWNlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgcmVzb2x1dGlvbicsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICB0YWJsZXRWaWV3cG9ydENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZpZXdwb3J0VGFibGV0RGV2aWNlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgcmVzb2x1dGlvbicsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICBtb2JpbGVWaWV3cG9ydENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3ZpZXdwb3J0TW9iaWxlRGV2aWNlJyxcbiAgICBsYWJlbDogJycsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QgZGV2aWNlJyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGZyZXF1ZW50bHlVc2VkTGFiZWxzID0gRlJFUVVFTlRMWV9VU0VEX0xBQkVMUztcbiAgcHJpdmF0ZSBfaW5pdGlhbEZvcm1TbmFwc2hvdDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEZvcm1Hcm91cCBmb3IgY3FhLWR5bmFtaWMtc2VsZWN0IGJpbmRpbmdzICovXG4gIGVkaXRGb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgc3RhdHVzOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIHByaW9yaXR5OiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIHR5cGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgbGFiZWxzOiBuZXcgRm9ybUNvbnRyb2woW10gYXMgc3RyaW5nW10pLFxuICAgIHByZXJlcXVpc2l0ZUNhc2VzOiBuZXcgRm9ybUNvbnRyb2woW10gYXMgc3RyaW5nW10pLFxuICAgIHRlc3REYXRhUHJvZmlsZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB0ZXN0RGF0YVNldDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZWZhdWx0QnJvd3NlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB2aWRlb1JlY29yZGluZzogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZWZhdWx0Vmlld3BvcnQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGV2aWNlVHlwZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZXZpY2VPUzogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBlbmFibGVBaVNtYXJ0bmVzczogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkZWZhdWx0QWlBY3Rpb246IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICB1c2VBaU1ldGFkYXRhOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICB9KTtcblxuICBnZXQgc3RhdHVzSXRlbSgpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSXRlbXMuZmluZCgobSkgPT4gbS5sYWJlbCA9PT0gJ1N0YXR1cycpO1xuICB9XG5cbiAgZ2V0IHByaW9yaXR5SXRlbSgpOiBUZXN0Q2FzZURldGFpbHNNZXRhZGF0YUl0ZW0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSXRlbXMuZmluZCgobSkgPT4gbS5sYWJlbCA9PT0gJ1ByaW9yaXR5Jyk7XG4gIH1cblxuICBnZXQgdHlwZUl0ZW0oKTogVGVzdENhc2VEZXRhaWxzTWV0YWRhdGFJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUl0ZW1zLmZpbmQoKG0pID0+IG0ubGFiZWwgPT09ICdUeXBlJyk7XG4gIH1cblxuICBnZXQgc3RhdHVzT3B0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnRHJhZnQnLCAnSW4gUmV2aWV3JywgJ0FwcHJvdmVkJywgJ0FjdGl2ZScsICdJbmFjdGl2ZScsICdCbG9ja2VkJ107XG4gIH1cblxuICBnZXQgcHJpb3JpdHlPcHRpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydDcml0aWNhbCcsICdNYWpvcicsICdIaWdoJywgJ01lZGl1bScsICdMb3cnLCAnTWlub3InLCAnTm90IHNldCddO1xuICB9XG5cbiAgLyoqIENhY2hlZCBjb25maWdzIHRvIGF2b2lkIG5ldyBvYmplY3QgcmVmcyBlYWNoIGNoYW5nZSBkZXRlY3Rpb24gKHByZXZlbnRzIGluZmluaXRlIGxvb3BzKSAqL1xuICByZWFkb25seSBzdGF0dXNTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdzdGF0dXMnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1N0YXR1cycsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ0RyYWZ0JywgbmFtZTogJ0RyYWZ0JyB9LFxuICAgICAgeyB2YWx1ZTogJ0luIFJldmlldycsIG5hbWU6ICdJbiBSZXZpZXcnIH0sXG4gICAgICB7IHZhbHVlOiAnQXBwcm92ZWQnLCBuYW1lOiAnQXBwcm92ZWQnIH0sXG4gICAgICB7IHZhbHVlOiAnQWN0aXZlJywgbmFtZTogJ0FjdGl2ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdJbmFjdGl2ZScsIG5hbWU6ICdJbmFjdGl2ZScgfSxcbiAgICAgIHsgdmFsdWU6ICdCbG9ja2VkJywgbmFtZTogJ0Jsb2NrZWQnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSB0eXBlU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndHlwZScsXG4gICAgbGFiZWw6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiAnVHlwZScsXG4gICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICBvcHRpb25zOiBbXSxcbiAgfTtcblxuICByZWFkb25seSB0ZXN0RGF0YVByb2ZpbGVTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd0ZXN0RGF0YVByb2ZpbGUnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1Rlc3QgRGF0YSBQcm9maWxlJyxcbiAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgIG9wdGlvbnM6IFtdLFxuICB9O1xuXG4gIHJlYWRvbmx5IHRlc3REYXRhU2V0U2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAndGVzdERhdGFTZXQnLFxuICAgIGxhYmVsOiAnJyxcbiAgICBwbGFjZWhvbGRlcjogJ1Rlc3QgRGF0YSBTZXQnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgb3B0aW9uczogW10sXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UHJlcmVxdWlzaXRlQ2FzZU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogJ1RDLTAwMScsIG5hbWU6ICdUQy0wMDE6IExvZ2luIGZsb3cnIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwMicsIG5hbWU6ICdUQy0wMDI6IFVzZXIgcmVnaXN0cmF0aW9uJyB9LFxuICAgIHsgdmFsdWU6ICdUQy0wMDMnLCBuYW1lOiAnVEMtMDAzOiBQYXNzd29yZCByZXNldCcgfSxcbiAgICB7IHZhbHVlOiAnVEMtMDA0JywgbmFtZTogJ1RDLTAwNDogRGFzaGJvYXJkIGxvYWQnIH0sXG4gICAgeyB2YWx1ZTogJ1RDLTAwNScsIG5hbWU6ICdUQy0wMDU6IEFQSSBoZWFsdGggY2hlY2snIH0sXG4gIF07XG5cbiAgcmVhZG9ubHkgdmlkZW9SZWNvcmRpbmdTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICd2aWRlb1JlY29yZGluZycsXG4gICAgbGFiZWw6ICdSZWNvcmQgdGVzdCBleGVjdXRpb24gdmlkZW8nLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAndHJ1ZScsIG5hbWU6ICdUcnVlJyB9LFxuICAgICAgeyB2YWx1ZTogJ2ZhbHNlJywgbmFtZTogJ0ZhbHNlJyB9LFxuICAgICAgeyB2YWx1ZTogJ09yZyBsZXZlbCcsIG5hbWU6ICdPcmcgbGV2ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBhaU1ldGFkYXRhQ29sbGVjdGlvblNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ3VzZUFpTWV0YWRhdGEnLFxuICAgIGxhYmVsOiAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAndHJ1ZScsIG5hbWU6ICdUcnVlJyB9LFxuICAgICAgeyB2YWx1ZTogJ2ZhbHNlJywgbmFtZTogJ0ZhbHNlJyB9LFxuICAgICAgeyB2YWx1ZTogJ09yZyBsZXZlbCcsIG5hbWU6ICdPcmcgbGV2ZWwnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKiogQ2FjaGVkIGxhYmVscyBjb25maWcgdG8gYXZvaWQgbmV3IG9iamVjdCBvbiBldmVyeSBDRCAocHJldmVudHMgZnJlZXplKSAqL1xuICBwcml2YXRlIF9sYWJlbHNTZWxlY3RDb25maWdDYWNoZTogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2xhYmVsc1NlbGVjdENvbmZpZ0RpcnR5ID0gdHJ1ZTtcblxuICAvKiogTGFiZWxzIG11bHRpLXNlbGVjdDogb3B0aW9ucyA9IGZyZXF1ZW50bHkgdXNlZCArIGN1cnJlbnQgKyBBUEkgb3B0aW9ucyBmcm9tIHNlbGVjdENvbmZpZ092ZXJyaWRlcyAqL1xuICBnZXQgbGFiZWxzU2VsZWN0Q29uZmlnKCk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgaWYgKCF0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSAmJiB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZSkgcmV0dXJuIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0NhY2hlO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXNbVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzXTtcbiAgICBjb25zdCBhcGlPcHRpb25zID0gb3ZlcnJpZGU/Lm9wdGlvbnMgPz8gW107XG4gICAgY29uc3QgYWxsTGFiZWxzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICAgIC4uLnRoaXMuZnJlcXVlbnRseVVzZWRMYWJlbHMsXG4gICAgICAuLi50aGlzLmVkaXRMYWJlbHMsXG4gICAgICAuLi5hcGlPcHRpb25zLm1hcCgobykgPT4gU3RyaW5nKG8ubmFtZSA/PyBvLnZhbHVlID8/ICcnKS50cmltKCkpLmZpbHRlcihCb29sZWFuKSxcbiAgICBdKTtcbiAgICBjb25zdCBvcHRpb25zID0gQXJyYXkuZnJvbShhbGxMYWJlbHMpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgLm1hcCgodikgPT4gKHsgdmFsdWU6IHYsIG5hbWU6IHYgfSkpO1xuICAgIHRoaXMuX2xhYmVsc1NlbGVjdENvbmZpZ0NhY2hlID0ge1xuICAgICAga2V5OiAnbGFiZWxzJyxcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnU2VhcmNoIGxhYmVscyB0byBhZGQgLi4uLi4uJyxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIG9wdGlvblN0eWxlOiAnY2hlY2tib3gnLFxuICAgICAgYWxsb3dDdXN0b21WYWx1ZTogdHJ1ZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgfTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdDYWNoZTtcbiAgfVxuXG4gIHByZXJlcXVpc2l0ZUNhc2VTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdwcmVyZXF1aXNpdGVDYXNlcycsXG4gICAgbGFiZWw6ICdQcmVyZXF1aXNpdGUgQ2FzZScsXG4gICAgcGxhY2Vob2xkZXI6ICdTZWxlY3QnLFxuICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgb3B0aW9uU3R5bGU6ICdjaGVja2JveCcsXG4gICAgc2hvd1NlbGVjdEFsbDogdHJ1ZSxcbiAgICBzZWxlY3RBbGxMYWJlbDogJ0FsbCcsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ1RDLTAwMScsIG5hbWU6ICdUQy0wMDE6IExvZ2luIGZsb3cnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDAyJywgbmFtZTogJ1RDLTAwMjogVXNlciByZWdpc3RyYXRpb24nIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDAzJywgbmFtZTogJ1RDLTAwMzogUGFzc3dvcmQgcmVzZXQnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDA0JywgbmFtZTogJ1RDLTAwNDogRGFzaGJvYXJkIGxvYWQnIH0sXG4gICAgICB7IHZhbHVlOiAnVEMtMDA1JywgbmFtZTogJ1RDLTAwNTogQVBJIGhlYWx0aCBjaGVjaycgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRlZmF1bHRWaWV3cG9ydFNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RlZmF1bHRWaWV3cG9ydCcsXG4gICAgbGFiZWw6ICdEZWZhdWx0IFZpZXdwb3J0JyxcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJzEyODB4NzIwJywgbmFtZTogJzEyODB4NzIwJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZGV2aWNlVHlwZVNlbGVjdENvbmZpZzogRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnID0ge1xuICAgIGtleTogJ2RldmljZVR5cGUnLFxuICAgIGxhYmVsOiAnRGV2aWNlIFR5cGUnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnaVBob25lIDE0JywgbmFtZTogJ2lQaG9uZSAxNCcgfSxcbiAgICAgIHsgdmFsdWU6ICdpUGhvbmUgMTUnLCBuYW1lOiAnaVBob25lIDE1JyB9LFxuICAgICAgeyB2YWx1ZTogJ2lQaG9uZSAxNycsIG5hbWU6ICdpUGhvbmUgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnSXBob25lIDE3JywgbmFtZTogJ0lwaG9uZSAxNycgfSxcbiAgICAgIHsgdmFsdWU6ICdTYW1zdW5nIEdhbGF4eScsIG5hbWU6ICdTYW1zdW5nIEdhbGF4eScgfSxcbiAgICAgIHsgdmFsdWU6ICdQaXhlbCcsIG5hbWU6ICdQaXhlbCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRldmljZU9TU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGV2aWNlT1MnLFxuICAgIGxhYmVsOiAnT1MnLFxuICAgIHBsYWNlaG9sZGVyOiAnU2VsZWN0JyxcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnaXBhJywgbmFtZTogJ2lPUyAoaXBhKScgfSxcbiAgICAgIHsgdmFsdWU6ICdhcGsnLCBuYW1lOiAnQW5kcm9pZCAoYXBrKScgfSxcbiAgICAgIHsgdmFsdWU6ICdpT1MgMTYnLCBuYW1lOiAnaU9TIDE2JyB9LFxuICAgICAgeyB2YWx1ZTogJ2lPUyAxNycsIG5hbWU6ICdpT1MgMTcnIH0sXG4gICAgICB7IHZhbHVlOiAnQW5kcm9pZCAxMycsIG5hbWU6ICdBbmRyb2lkIDEzJyB9LFxuICAgICAgeyB2YWx1ZTogJ0FuZHJvaWQgMTQnLCBuYW1lOiAnQW5kcm9pZCAxNCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGRlZmF1bHRCcm93c2VyU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZGVmYXVsdEJyb3dzZXInLFxuICAgIGxhYmVsOiAnRGVmYXVsdCBCcm93c2VyJyxcbiAgICBwbGFjZWhvbGRlcjogJ0Nocm9tZScsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ0Nocm9tZScsIG5hbWU6ICdDaHJvbWUnIH0sXG4gICAgICB7IHZhbHVlOiAnRmlyZWZveCcsIG5hbWU6ICdGaXJlZm94JyB9LFxuICAgICAgeyB2YWx1ZTogJ1NhZmFyaScsIG5hbWU6ICdTYWZhcmknIH0sXG4gICAgICB7IHZhbHVlOiAnRWRnZScsIG5hbWU6ICdFZGdlJyB9LFxuICAgIF0sXG4gIH07XG5cbiAgcmVhZG9ubHkgcHJpb3JpdHlTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdwcmlvcml0eScsXG4gICAgbGFiZWw6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiAnUHJpb3JpdHknLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdDcml0aWNhbCcsIG5hbWU6ICdDcml0aWNhbCcgfSxcbiAgICAgIHsgdmFsdWU6ICdNYWpvcicsIG5hbWU6ICdNYWpvcicgfSxcbiAgICAgIHsgdmFsdWU6ICdIaWdoJywgbmFtZTogJ0hpZ2gnIH0sXG4gICAgICB7IHZhbHVlOiAnTWVkaXVtJywgbmFtZTogJ01lZGl1bScgfSxcbiAgICAgIHsgdmFsdWU6ICdMb3cnLCBuYW1lOiAnTG93JyB9LFxuICAgICAgeyB2YWx1ZTogJ01pbm9yJywgbmFtZTogJ01pbm9yJyB9LFxuICAgICAgeyB2YWx1ZTogJ05vdCBzZXQnLCBuYW1lOiAnTm90IHNldCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGVuYWJsZUFpU21hcnRuZXNzU2VsZWN0Q29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAga2V5OiAnZW5hYmxlQWlTbWFydG5lc3MnLFxuICAgIGxhYmVsOiAnRW5hYmxlIEFJIFNtYXJ0bmVzcycsXG4gICAgcGxhY2Vob2xkZXI6ICdBZHZhbmNlZCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ0Jhc2ljJywgbmFtZTogJ0Jhc2ljJyB9LFxuICAgICAgeyB2YWx1ZTogJ0FkdmFuY2VkJywgbmFtZTogJ0FkdmFuY2VkJyB9LFxuICAgICAgeyB2YWx1ZTogJ09mZicsIG5hbWU6ICdPZmYnIH0sXG4gICAgXSxcbiAgfTtcblxuICByZWFkb25seSBkZWZhdWx0QWlBY3Rpb25TZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdkZWZhdWx0QWlBY3Rpb24nLFxuICAgIGxhYmVsOiAnRGVmYXVsdCBBSSBBY3Rpb24nLFxuICAgIHBsYWNlaG9sZGVyOiAnU21hcnQgd2FpdCcsXG4gICAgc2VhcmNoYWJsZTogZmFsc2UsXG4gICAgb3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ1NtYXJ0IHdhaXQnLCBuYW1lOiAnU21hcnQgd2FpdCcgfSxcbiAgICAgIHsgdmFsdWU6ICdTbWFydCBXYWl0JywgbmFtZTogJ1NtYXJ0IFdhaXQnIH0sXG4gICAgICB7IHZhbHVlOiAnV2FpdCBmb3IgZWxlbWVudCcsIG5hbWU6ICdXYWl0IGZvciBlbGVtZW50JyB9LFxuICAgICAgeyB2YWx1ZTogJ1JldHJ5JywgbmFtZTogJ1JldHJ5JyB9LFxuICAgICAgeyB2YWx1ZTogJ1NraXAnLCBuYW1lOiAnU2tpcCcgfSxcbiAgICBdLFxuICB9O1xuXG4gIHJlYWRvbmx5IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VTZWxlY3RDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICBrZXk6ICdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyxcbiAgICBsYWJlbDogJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyxcbiAgICBwbGFjZWhvbGRlcjogJ05vbmUnLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICdub25lJywgbmFtZTogJ05vbmUnIH0sXG4gICAgXSxcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBtZXJnZWQgY29uZmlnIGZvciBhIHNlbGVjdDogYmFzZSBjb25maWcgKyBvdmVycmlkZS5cbiAgICogV2lyZXMgb25TZWFyY2gsIG9uTG9hZE1vcmUgdG8gYm90aCBvdmVycmlkZSBjYWxsYmFja3MgYW5kIG91dHB1dCBldmVudHMuXG4gICAqL1xuICBnZXRDb25maWdGb3JTZWxlY3Qoa2V5OiBzdHJpbmcsIGJhc2VDb25maWc6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uW2tleV07XG4gICAgaWYgKCFvdmVycmlkZSkgcmV0dXJuIGJhc2VDb25maWc7XG5cbiAgICBjb25zdCBtZXJnZWQ6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyA9IHtcbiAgICAgIC4uLmJhc2VDb25maWcsXG4gICAgICAuLi5vdmVycmlkZSxcbiAgICAgIG9wdGlvbnM6IG92ZXJyaWRlLm9wdGlvbnMgPz8gYmFzZUNvbmZpZy5vcHRpb25zLFxuICAgICAga2V5OiBiYXNlQ29uZmlnLmtleSxcbiAgICB9O1xuXG4gICAgaWYgKG92ZXJyaWRlLnNlcnZlclNlYXJjaCB8fCBvdmVycmlkZS5vblNlYXJjaCkge1xuICAgICAgbWVyZ2VkLm9uU2VhcmNoID0gKHF1ZXJ5KSA9PiB7XG4gICAgICAgIG92ZXJyaWRlLm9uU2VhcmNoPy4ocXVlcnkpO1xuICAgICAgICB0aGlzLnNlbGVjdFNlYXJjaC5lbWl0KHsga2V5LCBxdWVyeSB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvdmVycmlkZS5oYXNNb3JlIHx8IG92ZXJyaWRlLm9uTG9hZE1vcmUpIHtcbiAgICAgIG1lcmdlZC5vbkxvYWRNb3JlID0gKHF1ZXJ5Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyAnJztcbiAgICAgICAgb3ZlcnJpZGUub25Mb2FkTW9yZT8uKHEpO1xuICAgICAgICB0aGlzLnNlbGVjdExvYWRNb3JlLmVtaXQoeyBrZXksIHF1ZXJ5OiBxIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgb25TZWxlY3RPcGVuZWQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdE9wZW5lZC5lbWl0KHsga2V5IH0pO1xuICB9XG5cbiAgb25TZWxlY3RTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0U2VhcmNoLmVtaXQoZXZlbnQpO1xuICAgIGNvbnN0IG92ZXJyaWRlID0gdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LltldmVudC5rZXldO1xuICAgIG92ZXJyaWRlPy5vblNlYXJjaD8uKGV2ZW50LnF1ZXJ5KTtcbiAgfVxuXG4gIG9uU2VsZWN0TG9hZE1vcmUoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0TG9hZE1vcmUuZW1pdChldmVudCk7XG4gICAgY29uc3Qgb3ZlcnJpZGUgPSB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uW2V2ZW50LmtleV07XG4gICAgb3ZlcnJpZGU/Lm9uTG9hZE1vcmU/LihldmVudC5xdWVyeSk7XG4gIH1cblxuICBvblNlbGVjdGlvbkNoYW5nZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09IFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscykge1xuICAgICAgY29uc3QgdmFsID0gZXZlbnQudmFsdWU7XG4gICAgICB0aGlzLmVkaXRMYWJlbHMgPSBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwubWFwKCh2KSA9PiBTdHJpbmcodikpLmZpbHRlcihCb29sZWFuKSA6IHZhbCAhPSBudWxsID8gW1N0cmluZyh2YWwpXSA6IFtdO1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICAgIC8vIE1hcmsgVGVzdCBEYXRhIHNlbGVjdHMgYXMgZGlydHkgc28gbGF0ZXIgaW5wdXQgY2hhbmdlcyAob3B0aW9ucy9jb25maWcpIGRvbid0IG92ZXJ3cml0ZSB1c2VyIGNob2ljZVxuICAgIGlmIChldmVudC5rZXkgPT09IFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLnRlc3REYXRhUHJvZmlsZSB8fCBldmVudC5rZXkgPT09IFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLnRlc3REYXRhU2V0KSB7XG4gICAgICBjb25zdCBjdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoZXZlbnQua2V5KTtcbiAgICAgIGN0cmw/Lm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBrZXk6IGV2ZW50LmtleSwgdmFsdWU6IGV2ZW50LnZhbHVlIH0pO1xuICB9XG5cbiAgb25MYWJlbHNBZGRDdXN0b21WYWx1ZShldmVudDogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgY29uc3QgdiA9IChldmVudC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGlmICghdiB8fCB0aGlzLmVkaXRMYWJlbHMuaW5jbHVkZXModikpIHJldHVybjtcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5lZGl0TGFiZWxzLCB2XTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKT8uc2V0VmFsdWUodGhpcy5lZGl0TGFiZWxzLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5sYWJlbEFkZGVkLmVtaXQodik7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbmZpZ0l0ZW1WYWx1ZShzZWN0aW9uVGl0bGU6IHN0cmluZywgaXRlbUxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBbLi4udGhpcy5jb25maWdTZWN0aW9ucywgLi4udGhpcy5jb25maWdTZWN0aW9uc1JvdzJdLmZpbmQoXG4gICAgICAocykgPT5cbiAgICAgICAgcy50aXRsZSA9PT0gc2VjdGlvblRpdGxlIHx8XG4gICAgICAgIHMudGl0bGU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VjdGlvblRpdGxlLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgICBjb25zdCBpdGVtID0gc2VjdGlvbj8uaXRlbXM/LmZpbmQoXG4gICAgICAoaSkgPT5cbiAgICAgICAgaS5sYWJlbCA9PT0gaXRlbUxhYmVsIHx8XG4gICAgICAgIGkubGFiZWw/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaXRlbUxhYmVsLnRvTG93ZXJDYXNlKCkpXG4gICAgKTtcbiAgICByZXR1cm4gKGl0ZW0/LnZhbHVlIGFzIHN0cmluZykgPz8gJyc7XG4gIH1cblxuICAvKiogR2V0IHZhbHVlIGZyb20gRGV2aWNlIHNlY3Rpb24gLSBzdXBwb3J0cyBib3RoICdEZXZpY2UnIGFuZCAnRGV2aWNlIFNldHRpbmcnIHRpdGxlcyAqL1xuICBwcml2YXRlIGdldERldmljZUNvbmZpZ1ZhbHVlKGl0ZW1MYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWwgPVxuICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsIGl0ZW1MYWJlbCkgfHxcbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UgU2V0dGluZycsIGl0ZW1MYWJlbCk7XG4gICAgcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycgJiYgU3RyaW5nKHZhbCkudHJpbSgpICE9PSAnJyA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH1cblxuICAvKiogR2V0IHZhbHVlIGZyb20gV2FpdHMgc2VjdGlvbiAtIHN1cHBvcnRzIGJvdGggJ1dhaXQgYW5kIHJldHJpZXMnIGFuZCAnV2FpdHMgJiBSZXRyaWVzJyB0aXRsZXMgKi9cbiAgcHJpdmF0ZSBnZXRXYWl0c1JldHJpZXNWYWx1ZShpdGVtTGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdjEgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnV2FpdCBhbmQgcmV0cmllcycsIGl0ZW1MYWJlbCk7XG4gICAgY29uc3QgdjIgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnV2FpdHMgJiBSZXRyaWVzJywgaXRlbUxhYmVsKTtcbiAgICBsZXQgdmFsID0gKHYxICE9PSAnJyAmJiB2MSAhPSBudWxsKSA/IHYxIDogdjI7XG5cbiAgICAvLyBXaGVuIHZhbHVlcyBhcmUgY29taW5nIGZyb20gb3JnYW5pemF0aW9uIHNldHRpbmdzLCB0aGUgcG9ydGFsIHdyYXBzIHRoZW0gYXNcbiAgICAvLyBcIk9yZyBMZXZlbCAoQUNUVUFMIFZBTFVFKVwiLiBGb3IgZWRpdCBpbnB1dHMgKFJldHJ5IEZhaWxlZCBTdGVwcywgVGVzdCBDYXNlIFRpbWVvdXQsXG4gICAgLy8gV2FpdCBUaW1lb3V0IGZvciBMb2NhdG9ycyksIHdlIG9ubHkgd2FudCB0byBzaG93IHRoZSBpbm5lciB2YWx1ZSwgbm90IHRoZSB3cmFwcGVyLlxuICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcmF3ID0gU3RyaW5nKHZhbCkudHJpbSgpO1xuICAgICAgY29uc3QgbG93ZXIgPSByYXcudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHByZWZpeCA9ICdvcmcgbGV2ZWwgKCc7XG4gICAgICBpZiAobG93ZXIuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICAgIGNvbnN0IG9wZW5JZHggPSByYXcuaW5kZXhPZignKCcpO1xuICAgICAgICBjb25zdCBjbG9zZUlkeCA9IHJhdy5sYXN0SW5kZXhPZignKScpO1xuICAgICAgICBpZiAob3BlbklkeCA+PSAwICYmIGNsb3NlSWR4ID4gb3BlbklkeCkge1xuICAgICAgICAgIHZhbCA9IHJhdy5zdWJzdHJpbmcob3BlbklkeCArIDEsIGNsb3NlSWR4KS50cmltKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gcmF3LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsICE9PSAnJyAmJiBTdHJpbmcodmFsKS50cmltKCkgIT09ICcnID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG4gIC8qKiBTdHJpcCB0cmFpbGluZyAncycgZnJvbSB2YWx1ZSAoZS5nLiBcIjEwc1wiIC0+IFwiMTBcIikgZm9yIGRpc3BsYXkgaW4gdGltZW91dCBpbnB1dHMgKi9cbiAgcHJpdmF0ZSBzdHJpcFRyYWlsaW5nVW5pdFModmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT09ICcnKSByZXR1cm4gdmFsO1xuICAgIGNvbnN0IHMgPSBTdHJpbmcodmFsKS50cmltKCk7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvXFxzKnMkL2ksICcnKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHRlc3RDYXNlVGltZW91dE1vZGVPcHRpb25zOiBEcm9wZG93bk9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdPUkcgbGV2ZWwnLCB2YWx1ZTogJ29yZycgfSxcbiAgICB7IGxhYmVsOiAnQ3VzdG9tJywgdmFsdWU6ICdjdXN0b20nIH0sXG4gIF07XG5cbiAgLyoqIFZhbHVlIHNob3duIGluIHRoZSBkaXNhYmxlZCAob3JnKSBvciBlbmFibGVkIChjdXN0b20pIFRlc3QgQ2FzZSBUaW1lb3V0IGlucHV0LiAqL1xuICBnZXQgdGVzdENhc2VUaW1lb3V0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGVzdENhc2VUaW1lb3V0TW9kZSA9PT0gJ29yZycpIHtcbiAgICAgIHJldHVybiB0aGlzLm9yZ0xldmVsVGVzdENhc2VUaW1lb3V0ICE9IG51bGwgPyBTdHJpbmcodGhpcy5vcmdMZXZlbFRlc3RDYXNlVGltZW91dCkgOiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVzdENhc2VUaW1lb3V0O1xuICB9XG5cbiAgb25UZXN0Q2FzZVRpbWVvdXRNb2RlQ2hhbmdlKG1vZGU6ICdvcmcnIHwgJ2N1c3RvbScpOiB2b2lkIHtcbiAgICB0aGlzLnRlc3RDYXNlVGltZW91dE1vZGUgPSBtb2RlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgcG9ydGFsIHdyYXBwZWQgdGhlIFRlc3QgQ2FzZSBUaW1lb3V0IHZhbHVlIGFzIFwiT3JnIExldmVsICguLi4pXCIsIG1lYW5pbmcgdGhlIFRDIEFQSSByZXR1cm5lZCBudWxsLiAqL1xuICBwcml2YXRlIGlzVGVzdENhc2VUaW1lb3V0RnJvbU9yZygpOiBib29sZWFuIHtcbiAgICBjb25zdCByYXcgPVxuICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXQgYW5kIHJldHJpZXMnLCAnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJykgfHxcbiAgICAgIHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0cyAmIFJldHJpZXMnLCAnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJyk7XG4gICAgcmV0dXJuIHJhdy50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKE9SR19MRVZFTF9TRU5USU5FTC50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIC8qKiBBbGxvdyBvbmx5IGRpZ2l0czsgdXNlZCBmb3IgUmV0cnkgRmFpbGVkIFN0ZXBzLCBUZXN0IENhc2UgVGltZW91dCwgV2FpdCBUaW1lb3V0IGlucHV0cyAqL1xuICBvbmx5RGlnaXRzKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsID09IG51bGwgfHwgdmFsID09PSAnJykgcmV0dXJuICcnO1xuICAgIHJldHVybiBTdHJpbmcodmFsKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICB9XG5cbiAgLyoqIEZvciB1cGRhdGU6IHVzZSBcIjBcIiB3aGVuIHZhbHVlIGlzIGVtcHR5IHNvIEFQSSBnZXRzIGEgbnVtYmVyICovXG4gIHByaXZhdGUgZW1wdHlOdW1Ub1plcm8odmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh2YWwgPT0gbnVsbCB8fCBTdHJpbmcodmFsKS50cmltKCkgPT09ICcnKSByZXR1cm4gJzAnO1xuICAgIHJldHVybiBTdHJpbmcodmFsKS50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdQcmVyZXF1aXNpdGUgQ2FzZScpO1xuICAgIGlmICghdmFsKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHZhbC5pbmNsdWRlcygnLCcpID8gdmFsLnNwbGl0KCcsJykubWFwKChzKSA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pIDogW3ZhbF07XG4gIH1cblxuICAvKiogRWRpdCBtb2RlIHNob3VsZCBzaG93IHBsYWNlaG9sZGVyIHdoZW4gZGF0YXNldCBpcyBub3Qgc2VsZWN0ZWQuICovXG4gIHByaXZhdGUgbm9ybWFsaXplVGVzdERhdGFTZXRSYXdWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAnbm90IHNldCcgPyAnJyA6IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGhhc1ByZXJlcXVpc2l0ZUNhc2VDb25maWcoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IFsuLi50aGlzLmNvbmZpZ1NlY3Rpb25zLCAuLi50aGlzLmNvbmZpZ1NlY3Rpb25zUm93Ml0uZmluZChcbiAgICAgIChzKSA9PiBzLnRpdGxlID09PSAnRXhlY3V0aW9uJ1xuICAgICk7XG4gICAgcmV0dXJuICEhc2VjdGlvbj8uaXRlbXM/LnNvbWUoKGkpID0+IGkubGFiZWwgPT09ICdQcmVyZXF1aXNpdGUgQ2FzZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Vmlld3BvcnRGcm9tVmFsdWUoZGVmYXVsdFZpZXdwb3J0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2cCA9IFN0cmluZyhkZWZhdWx0Vmlld3BvcnQgfHwgJycpO1xuICAgIHRoaXMuY3VzdG9tVmlld3BvcnRXaWR0aCA9ICcnO1xuICAgIHRoaXMuY3VzdG9tVmlld3BvcnRIZWlnaHQgPSAnJztcbiAgICB0aGlzLmN1c3RvbVZpZXdwb3J0VGFncyA9IFtdO1xuICAgIHRoaXMudmlld3BvcnREZXNrdG9wRGV2aWNlRm9ybS5yZXNldCh7IHZpZXdwb3J0RGVza3RvcERldmljZTogJycgfSk7XG4gICAgdGhpcy52aWV3cG9ydExhcHRvcERldmljZUZvcm0ucmVzZXQoeyB2aWV3cG9ydExhcHRvcERldmljZTogJycgfSk7XG4gICAgdGhpcy52aWV3cG9ydFRhYmxldERldmljZUZvcm0ucmVzZXQoeyB2aWV3cG9ydFRhYmxldERldmljZTogJycgfSk7XG4gICAgdGhpcy52aWV3cG9ydE1vYmlsZURldmljZUZvcm0ucmVzZXQoeyB2aWV3cG9ydE1vYmlsZURldmljZTogJycgfSk7XG5cbiAgICBpZiAodnAuc3RhcnRzV2l0aCgnbGFwdG9wOicpKSB7XG4gICAgICB0aGlzLnZpZXdwb3J0TW9kZSA9ICdsYXB0b3AnO1xuICAgICAgdGhpcy52aWV3cG9ydExhcHRvcERldmljZUZvcm0ucGF0Y2hWYWx1ZSh7IHZpZXdwb3J0TGFwdG9wRGV2aWNlOiB2cC5zbGljZSg3KS50cmltKCkgfSk7XG4gICAgfSBlbHNlIGlmICh2cC5zdGFydHNXaXRoKCd0YWJsZXQ6JykpIHtcbiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gJ3RhYmxldCc7XG4gICAgICB0aGlzLnZpZXdwb3J0VGFibGV0RGV2aWNlRm9ybS5wYXRjaFZhbHVlKHsgdmlld3BvcnRUYWJsZXREZXZpY2U6IHZwLnNsaWNlKDcpLnRyaW0oKSB9KTtcbiAgICB9IGVsc2UgaWYgKHZwLnN0YXJ0c1dpdGgoJ2Rlc2t0b3A6JykpIHtcbiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gJ2Rlc2t0b3AnO1xuICAgICAgdGhpcy52aWV3cG9ydERlc2t0b3BEZXZpY2VGb3JtLnBhdGNoVmFsdWUoeyB2aWV3cG9ydERlc2t0b3BEZXZpY2U6IHZwLnNsaWNlKDgpLnRyaW0oKSB9KTtcbiAgICB9IGVsc2UgaWYgKHZwLnN0YXJ0c1dpdGgoJ21vYmlsZTonKSkge1xuICAgICAgdGhpcy52aWV3cG9ydE1vZGUgPSAnbW9iaWxlJztcbiAgICAgIHRoaXMudmlld3BvcnRNb2JpbGVEZXZpY2VGb3JtLnBhdGNoVmFsdWUoeyB2aWV3cG9ydE1vYmlsZURldmljZTogdnAuc2xpY2UoNykudHJpbSgpIH0pO1xuICAgIH0gZWxzZSBpZiAodnAgJiYgdnAuaW5jbHVkZXMoJyonKSkge1xuICAgICAgdGhpcy52aWV3cG9ydE1vZGUgPSAnY3VzdG9tJztcbiAgICAgIHRoaXMuY3VzdG9tVmlld3BvcnRUYWdzID0gdnAuc3BsaXQoJywnKS5tYXAoKHYpID0+IHYudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlld3BvcnRNb2RlID0gJ2Rlc2t0b3AnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWaWV3cG9ydFZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudmlld3BvcnRNb2RlID09PSAnbGFwdG9wJykge1xuICAgICAgY29uc3QgcmVzID0gKHRoaXMudmlld3BvcnRMYXB0b3BEZXZpY2VGb3JtLmdldCgndmlld3BvcnRMYXB0b3BEZXZpY2UnKT8udmFsdWUgPz8gJycpLnRyaW0oKTtcbiAgICAgIHJldHVybiByZXMgPyBgbGFwdG9wOiR7cmVzfWAgOiAnbGFwdG9wOic7XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXdwb3J0TW9kZSA9PT0gJ3RhYmxldCcpIHtcbiAgICAgIGNvbnN0IHJlcyA9ICh0aGlzLnZpZXdwb3J0VGFibGV0RGV2aWNlRm9ybS5nZXQoJ3ZpZXdwb3J0VGFibGV0RGV2aWNlJyk/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gcmVzID8gYHRhYmxldDoke3Jlc31gIDogJ3RhYmxldDonO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3cG9ydE1vZGUgPT09ICdtb2JpbGUnKSB7XG4gICAgICBjb25zdCBkZXZpY2UgPSAodGhpcy52aWV3cG9ydE1vYmlsZURldmljZUZvcm0uZ2V0KCd2aWV3cG9ydE1vYmlsZURldmljZScpPy52YWx1ZSA/PyAnJykudHJpbSgpO1xuICAgICAgcmV0dXJuIGRldmljZSA/IGBtb2JpbGU6JHtkZXZpY2V9YCA6ICdtb2JpbGU6JztcbiAgICB9XG4gICAgaWYgKHRoaXMudmlld3BvcnRNb2RlID09PSAnY3VzdG9tJykge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tVmlld3BvcnRUYWdzLmpvaW4oJywnKTtcbiAgICB9XG4gICAgLy8gZGVza3RvcFxuICAgIGNvbnN0IHJlcyA9ICh0aGlzLnZpZXdwb3J0RGVza3RvcERldmljZUZvcm0uZ2V0KCd2aWV3cG9ydERlc2t0b3BEZXZpY2UnKT8udmFsdWUgPz8gJycpLnRyaW0oKTtcbiAgICByZXR1cm4gcmVzID8gYGRlc2t0b3A6JHtyZXN9YCA6ICcxMjgweDcyMCc7XG4gIH1cblxuICBvblZpZXdwb3J0TW9kZUNoYW5nZShtb2RlOiBWaWV3cG9ydE1vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdwb3J0TW9kZSA9IG1vZGU7XG4gICAgaWYgKG1vZGUgIT09ICdkZXNrdG9wJykgdGhpcy52aWV3cG9ydERlc2t0b3BEZXZpY2VGb3JtLnJlc2V0KHsgdmlld3BvcnREZXNrdG9wRGV2aWNlOiAnJyB9KTtcbiAgICBpZiAobW9kZSAhPT0gJ2xhcHRvcCcpIHRoaXMudmlld3BvcnRMYXB0b3BEZXZpY2VGb3JtLnJlc2V0KHsgdmlld3BvcnRMYXB0b3BEZXZpY2U6ICcnIH0pO1xuICAgIGlmIChtb2RlICE9PSAndGFibGV0JykgdGhpcy52aWV3cG9ydFRhYmxldERldmljZUZvcm0ucmVzZXQoeyB2aWV3cG9ydFRhYmxldERldmljZTogJycgfSk7XG4gICAgaWYgKG1vZGUgIT09ICdtb2JpbGUnKSB0aGlzLnZpZXdwb3J0TW9iaWxlRGV2aWNlRm9ybS5yZXNldCh7IHZpZXdwb3J0TW9iaWxlRGV2aWNlOiAnJyB9KTtcbiAgICBpZiAobW9kZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAgIHRoaXMuY3VzdG9tVmlld3BvcnRXaWR0aCA9ICcnO1xuICAgICAgdGhpcy5jdXN0b21WaWV3cG9ydEhlaWdodCA9ICcnO1xuICAgICAgdGhpcy5jdXN0b21WaWV3cG9ydFRhZ3MgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Vmlld3BvcnRDYXRlZ29yeU9wdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMudmlld3BvcnRDYXRlZ29yeU9wdGlvbnMgfHwge307XG4gICAgaWYgKG9wdHMuREVTS1RPUCkgdGhpcy5kZXNrdG9wVmlld3BvcnRDb25maWcgPSB7IC4uLnRoaXMuZGVza3RvcFZpZXdwb3J0Q29uZmlnLCBvcHRpb25zOiBvcHRzLkRFU0tUT1AgfTtcbiAgICBpZiAob3B0cy5MQVBUT1ApIHRoaXMubGFwdG9wVmlld3BvcnRDb25maWcgPSB7IC4uLnRoaXMubGFwdG9wVmlld3BvcnRDb25maWcsIG9wdGlvbnM6IG9wdHMuTEFQVE9QIH07XG4gICAgaWYgKG9wdHMuVEFCTEVUKSB0aGlzLnRhYmxldFZpZXdwb3J0Q29uZmlnID0geyAuLi50aGlzLnRhYmxldFZpZXdwb3J0Q29uZmlnLCBvcHRpb25zOiBvcHRzLlRBQkxFVCB9O1xuICAgIGlmIChvcHRzLk1PQklMRSkgdGhpcy5tb2JpbGVWaWV3cG9ydENvbmZpZyA9IHsgLi4udGhpcy5tb2JpbGVWaWV3cG9ydENvbmZpZywgb3B0aW9uczogb3B0cy5NT0JJTEUgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFkZFZpZXdwb3J0Q3VzdG9tVGFnKCk6IHZvaWQge1xuICAgIGNvbnN0IHcgPSAodGhpcy5jdXN0b21WaWV3cG9ydFdpZHRoIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgaCA9ICh0aGlzLmN1c3RvbVZpZXdwb3J0SGVpZ2h0IHx8ICcnKS50cmltKCk7XG4gICAgaWYgKCF3IHx8ICFoKSByZXR1cm47XG4gICAgY29uc3QgdGFnID0gYCR7d30qJHtofWA7XG4gICAgaWYgKCF0aGlzLmN1c3RvbVZpZXdwb3J0VGFncy5pbmNsdWRlcyh0YWcpKSB7XG4gICAgICB0aGlzLmN1c3RvbVZpZXdwb3J0VGFncyA9IFsuLi50aGlzLmN1c3RvbVZpZXdwb3J0VGFncywgdGFnXTtcbiAgICB9XG4gICAgdGhpcy5jdXN0b21WaWV3cG9ydFdpZHRoID0gJyc7XG4gICAgdGhpcy5jdXN0b21WaWV3cG9ydEhlaWdodCA9ICcnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVtb3ZlVmlld3BvcnRDdXN0b21UYWcoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VzdG9tVmlld3BvcnRUYWdzID0gdGhpcy5jdXN0b21WaWV3cG9ydFRhZ3MuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25Db250ZW50O1xuICAgIHRoaXMuZWRpdFN0YXR1cyA9IHRoaXMuc3RhdHVzSXRlbT8udmFsdWUgPz8gJyc7XG4gICAgdGhpcy5lZGl0UHJpb3JpdHkgPSB0aGlzLnByaW9yaXR5SXRlbT8udmFsdWUgPz8gJyc7XG4gICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgY29uc3QgdGVzdERhdGFQcm9maWxlUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgUHJvZmlsZScpID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICApO1xuICAgIGNvbnN0IHR5cGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhUHJvZmlsZVJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/LlsndGVzdERhdGFQcm9maWxlJ10/Lm9wdGlvbnMpID8/IHRlc3REYXRhUHJvZmlsZVJhdztcbiAgICBjb25zdCB0ZXN0RGF0YVNldFZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFTZXRSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhU2V0J10/Lm9wdGlvbnMpID8/IHRlc3REYXRhU2V0UmF3O1xuICAgIHRoaXMuZWRpdExhYmVscyA9IFsuLi50aGlzLmxhYmVsc107XG4gICAgY29uc3QgYXV0b1dhaXRWYWwgPSB0aGlzLmdldFdhaXRzUmV0cmllc1ZhbHVlKCdFbmFibGUgQXZvaWQgQXV0byB3YWl0IGZvciBzdGVwcycpIHx8IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdXYWl0cyAmIFJldHJpZXMnLCAnQXV0byBXYWl0Jyk7XG4gICAgdGhpcy5hdXRvV2FpdEVuYWJsZWQgPSAhIShhdXRvV2FpdFZhbCAmJiBhdXRvV2FpdFZhbC50cmltKCkgIT09ICcnICYmIFN0cmluZyhhdXRvV2FpdFZhbCkgIT09ICdmYWxzZScpO1xuICAgIHRoaXMucmV0cnlGYWlsZWRTdGVwcyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1JldHJ5IEZhaWxlZCBTdGVwcycpO1xuICAgIHRoaXMudGVzdENhc2VUaW1lb3V0TW9kZSA9IHRoaXMuaXNUZXN0Q2FzZVRpbWVvdXRGcm9tT3JnKCkgPyAnb3JnJyA6ICdjdXN0b20nO1xuICAgIHRoaXMudGVzdENhc2VUaW1lb3V0ID0gdGhpcy5zdHJpcFRyYWlsaW5nVW5pdFModGhpcy5nZXRXYWl0c1JldHJpZXNWYWx1ZSgnVGVzdCBDYXNlIFRpbWVvdXQgKG1pbnV0ZXMpJykpO1xuICAgIHRoaXMud2FpdFRpbWVvdXRMb2NhdG9ycyA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykpO1xuICAgIHRoaXMubW9iaWxlVGVzdGluZ0VuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnTW9iaWxlIFRlc3RpbmcnKTtcbiAgICB0aGlzLmV4dGVuc2lvblVzZUVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRXh0ZW5zaW9uIFVzZScpO1xuICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICBjb25zdCBlbmFibGVBaVNtYXJ0bmVzcyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0VuYWJsZSBBSSBTbWFydG5lc3MnKTtcbiAgICBjb25zdCBkZWZhdWx0QWlBY3Rpb24gPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdEZWZhdWx0IEFJIEFjdGlvbicpO1xuICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdLbm93bGVkZ2UgQmFzZSBEZWZhdWx0IFRlc3QgQ2FzZScpO1xuICAgIGNvbnN0IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXT8ub3B0aW9ucykgPz8ga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdztcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKTtcbiAgICBjb25zdCB1c2VBaU1ldGFkYXRhID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodXNlQWlNZXRhZGF0YVJhdyk7XG4gICAgY29uc3QgcHJlcmVxdWlzaXRlQ2FzZXMgPSB0aGlzLmdldFByZXJlcXVpc2l0ZUNhc2VzRnJvbUNvbmZpZygpO1xuICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID1cbiAgICAgIHRoaXMucGxhdGZvcm0gPT09ICd3ZWInXG4gICAgICAgID8gdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnRGVmYXVsdCBCcm93c2VyJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdEZWZhdWx0IEJyb3dzZXInKVxuICAgICAgICA6IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnRGVmYXVsdCBCcm93c2VyJyk7XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmdSYXcgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1ZpZGVvIFJlY29yZGluZycpO1xuICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodmlkZW9SZWNvcmRpbmdSYXcgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0gdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnRGVmYXVsdCBWaWV3cG9ydCcpIHx8IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ1ZpZXdwb3J0JykgfHwgJyc7XG4gICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnVHlwZScpO1xuICAgIGNvbnN0IGRldmljZU9TID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdPUycpO1xuICAgIHRoaXMuaW5pdFZpZXdwb3J0RnJvbVZhbHVlKGRlZmF1bHRWaWV3cG9ydCk7XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayA9ICEhdGhpcy5hcGlNb2NraW5nUmVzdG9yZU1vY2s7XG4gICAgdGhpcy5lZGl0QXBpTW9ja2luZ1N0b3JlTW9jayA9ICEhdGhpcy5hcGlNb2NraW5nU3RvcmVNb2NrO1xuICAgIHRoaXMuZWRpdEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICBzdGF0dXM6IHRoaXMuZWRpdFN0YXR1cyxcbiAgICAgIHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSxcbiAgICAgIHR5cGU6IHR5cGVWYWwgfHwgJycsXG4gICAgICBsYWJlbHM6IHRoaXMuZWRpdExhYmVscyxcbiAgICAgIHRlc3REYXRhUHJvZmlsZTogdGVzdERhdGFQcm9maWxlVmFsIHx8ICcnLFxuICAgICAgdGVzdERhdGFTZXQ6IHRlc3REYXRhU2V0VmFsID8/ICcnLFxuICAgICAgcHJlcmVxdWlzaXRlQ2FzZXMsXG4gICAgICBkZWZhdWx0QnJvd3NlcjogZGVmYXVsdEJyb3dzZXIgfHwgJ0Nocm9tZScsXG4gICAgICB2aWRlb1JlY29yZGluZzogdmlkZW9SZWNvcmRpbmcgfHwgJycsXG4gICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCB8fCAnJyxcbiAgICAgIGRldmljZVR5cGU6IGRldmljZVR5cGUgfHwgJycsXG4gICAgICBkZXZpY2VPUzogZGV2aWNlT1MgfHwgJycsXG4gICAgICBlbmFibGVBaVNtYXJ0bmVzczogZW5hYmxlQWlTbWFydG5lc3MgfHwgJ0FkdmFuY2VkJyxcbiAgICAgIGRlZmF1bHRBaUFjdGlvbjogZGVmYXVsdEFpQWN0aW9uIHx8ICdTbWFydCB3YWl0JyxcbiAgICAgIGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U6IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UgfHwgJ25vbmUnLFxuICAgICAgdXNlQWlNZXRhZGF0YTogdXNlQWlNZXRhZGF0YSB8fCAnJyxcbiAgICB9KTtcbiAgICB0aGlzLl9pbml0aWFsRm9ybVNuYXBzaG90ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5idWlsZFNhdmVQYXlsb2FkKCkpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IGhhc1Vuc2F2ZWRDaGFuZ2VzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9pbml0aWFsRm9ybVNuYXBzaG90ID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuYnVpbGRTYXZlUGF5bG9hZCgpKSAhPT0gdGhpcy5faW5pdGlhbEZvcm1TbmFwc2hvdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTYXZlUGF5bG9hZCgpOiBUZXN0Q2FzZURldGFpbHNFZGl0Rm9ybURhdGEge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKT8udmFsdWUgPz8gdGhpcy5lZGl0U3RhdHVzO1xuICAgIGNvbnN0IHByaW9yaXR5ID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3ByaW9yaXR5Jyk/LnZhbHVlID8/IHRoaXMuZWRpdFByaW9yaXR5O1xuICAgIGNvbnN0IHR5cGVWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVByb2ZpbGVWYWwgPSB0aGlzLmVkaXRGb3JtLmdldCgndGVzdERhdGFQcm9maWxlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhU2V0VmFsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGNvbmZpZ1NlY3Rpb25zTWVyZ2VkID0gdGhpcy5tZXJnZUNvbmZpZ1NlY3Rpb25zKCk7XG4gICAgY29uc3QgY29uZmlnU2VjdGlvbnNSb3cyTWVyZ2VkID0gdGhpcy5tZXJnZUNvbmZpZ1NlY3Rpb25zUm93MigpO1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbkNvbnRlbnQ6IHRoaXMuZWRpdERlc2NyaXB0aW9uLFxuICAgICAgc3RhdHVzLFxuICAgICAgcHJpb3JpdHksXG4gICAgICB0eXBlOiB0eXBlVmFsLFxuICAgICAgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMsXG4gICAgICB0ZXN0RGF0YVByb2ZpbGVJZDogdGVzdERhdGFQcm9maWxlVmFsIHx8IG51bGwsXG4gICAgICB0ZXN0RGF0YVNldEluZGV4OiB0ZXN0RGF0YVNldFZhbCA/PyBudWxsLFxuICAgICAgY29uZmlnU2VjdGlvbnM6IGNvbmZpZ1NlY3Rpb25zTWVyZ2VkLFxuICAgICAgY29uZmlnU2VjdGlvbnNSb3cyOiBjb25maWdTZWN0aW9uc1JvdzJNZXJnZWQsXG4gICAgICBhcGlNb2NraW5nUmVzdG9yZU1vY2s6IHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayxcbiAgICAgIGFwaU1vY2tpbmdTdG9yZU1vY2s6IHRoaXMuZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2ssXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGJvdW5kIHRvIHRoZSBlbWJlZGRlZCBgPGNxYS1hcGktbW9ja2luZy1jYXJkPmAgYHJlc3RvcmVNb2NrQ2hhbmdlYCBvdXRwdXQuXG4gICAqIEtlZXBzIHRoZSBsb2NhbCBlZGl0LW1vZGUgbWlycm9yIGluIHN5bmMgKGluY2x1ZGluZyB0aGUgbXV0dWFsLWV4Y2x1c2l2aXR5IHJ1bGUg4oCUXG4gICAqIHR1cm5pbmcgVXNlLW1vY2sgb24gZm9yY2VzIHN0b3JlLW1vY2sgb2ZmKSBhbmQgcmUtZW1pdHMgdG8gdGhlIHBhcmVudCBzbyB0aGUgc2F2ZVxuICAgKiBwYXlsb2FkIHJlZmxlY3RzIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICBvbkFwaU1vY2tpbmdSZXN0b3JlTW9ja0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdSZXN0b3JlTW9jayA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSAmJiB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrKSB7XG4gICAgICB0aGlzLmVkaXRBcGlNb2NraW5nU3RvcmVNb2NrID0gZmFsc2U7XG4gICAgICB0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIE1pcnJvciBoYW5kbGVyIGZvciB0aGUgXCJSZW5ldyBhbmQgc3RvcmUgQVBJIHJlc3BvbnNlc1wiIHRvZ2dsZS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggVXNlLW1vY2suICovXG4gIG9uQXBpTW9ja2luZ1N0b3JlTW9ja0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdEFwaU1vY2tpbmdTdG9yZU1vY2sgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgJiYgdGhpcy5lZGl0QXBpTW9ja2luZ1Jlc3RvcmVNb2NrKSB7XG4gICAgICB0aGlzLmVkaXRBcGlNb2NraW5nUmVzdG9yZU1vY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMuYXBpTW9ja2luZ1Jlc3RvcmVNb2NrQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmFwaU1vY2tpbmdTdG9yZU1vY2tDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVUb09wdGlvblZhbHVlKFxuICAgIGNvbmZpZ1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gfCB1bmRlZmluZWRcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY29uZmlnVmFsdWUgPT0gbnVsbCB8fCBjb25maWdWYWx1ZSA9PT0gJycpIHJldHVybiBjb25maWdWYWx1ZTtcbiAgICBjb25zdCBvcHRzID0gb3B0aW9ucyA/PyBbXTtcbiAgICBpZiAoIW9wdHMubGVuZ3RoKSByZXR1cm4gY29uZmlnVmFsdWU7XG4gICAgY29uc3QgbnVtID0gdHlwZW9mIGNvbmZpZ1ZhbHVlID09PSAnbnVtYmVyJyA/IGNvbmZpZ1ZhbHVlIDogTnVtYmVyKGNvbmZpZ1ZhbHVlKTtcbiAgICBjb25zdCBpc051bWVyaWMgPSAhTnVtYmVyLmlzTmFOKG51bSkgJiYgU3RyaW5nKGNvbmZpZ1ZhbHVlKS50cmltKCkgPT09IFN0cmluZyhudW0pO1xuICAgIGlmIChpc051bWVyaWMpIHtcbiAgICAgIC8vIElmIG9wdGlvbnMgdXNlIG51bWVyaWMgdmFsdWVzIChlLmcuIGluZGljZXMgZm9yIFRlc3QgRGF0YSBTZXQpLFxuICAgICAgLy8gcmV0dXJuIHRoZSBudW1lcmljIGZvcm0gc28gdGhlIHNlbGVjdCBjYW4gbWF0Y2ggYnkgc3RyaWN0IGVxdWFsaXR5LlxuICAgICAgY29uc3QgaGFzTnVtZXJpY09wdGlvbiA9IG9wdHMuc29tZShcbiAgICAgICAgKG8pID0+IHR5cGVvZiBvLnZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgKG8gYXMgYW55KS5pZCA9PT0gJ251bWJlcidcbiAgICAgICk7XG4gICAgICByZXR1cm4gaGFzTnVtZXJpY09wdGlvbiA/IG51bSA6IGNvbmZpZ1ZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBzdHIgPSBTdHJpbmcoY29uZmlnVmFsdWUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG1hdGNoID0gb3B0cy5maW5kKChvKSA9PiB7XG4gICAgICBjb25zdCBuID0gU3RyaW5nKG8ubmFtZSA/PyBvLmxhYmVsID8/IG8udmFsdWUgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIG4gPT09IHN0cjtcbiAgICB9KTtcbiAgICByZXR1cm4gbWF0Y2ggIT0gbnVsbCA/IChtYXRjaC52YWx1ZSA/PyAobWF0Y2ggYXMgYW55KS5pZCA/PyBtYXRjaCkgOiBjb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQm9vbGVhblNlbGVjdFZhbHVlKHZhbDogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09ICd0cnVlJykgcmV0dXJuICd0cnVlJztcbiAgICBpZiAodmFsID09PSBmYWxzZSB8fCB2YWwgPT09ICdmYWxzZScpIHJldHVybiAnZmFsc2UnO1xuICAgIGlmIChcbiAgICAgIHZhbCA9PT0gJ09yZyBsZXZlbCcgfHxcbiAgICAgIHZhbCA9PT0gJ09yZyBMZXZlbCcgfHxcbiAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb3JnIGxldmVsICgnKSlcbiAgICApIHtcbiAgICAgIHJldHVybiAnT3JnIGxldmVsJztcbiAgICB9XG4gICAgaWYgKHZhbCA9PT0gJ09uIFdhaXQnIHx8IHZhbCA9PT0gJ29uIHdhaXQnKSByZXR1cm4gJ3RydWUnO1xuICAgIHJldHVybiB2YWwgJiYgU3RyaW5nKHZhbCkudHJpbSgpID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydsYWJlbHMnXSB8fCBjaGFuZ2VzWydzZWxlY3RDb25maWdPdmVycmlkZXMnXSkge1xuICAgICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdENvbmZpZ092ZXJyaWRlcyddICYmIHRoaXMuZWRpdEZvcm0/LmdldCgndHlwZScpKSB7XG4gICAgICAgIGNvbnN0IHR5cGVDdHJsID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3R5cGUnKTtcbiAgICAgICAgY29uc3QgdGRwQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgICAgY29uc3QgdGRzQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVNldCcpO1xuICAgICAgICBjb25zdCBlbmFibGVBaUN0cmwgPSB0aGlzLmVkaXRGb3JtLmdldCgnZW5hYmxlQWlTbWFydG5lc3MnKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdEFpQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZWZhdWx0QWlBY3Rpb24nKTtcbiAgICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+O1xuICAgICAgICBpZiAodHlwZUN0cmwgJiYgIXR5cGVDdHJsLmRpcnR5KSB7XG4gICAgICAgICAgY29uc3QgdHlwZVJhdyA9ICh0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1R5cGUnKSB8fCAodGhpcy50eXBlSXRlbT8udmFsdWUgYXMgc3RyaW5nKSkgPz8gJyc7XG4gICAgICAgICAgcGF0Y2hbJ3R5cGUnXSA9ICh0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdykgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIFRlc3QgRGF0YSBQcm9maWxlIC8gU2V0LCBhbGxvdyBvbmUtdGltZSByZS1yZXNvbHZlIGZyb20gY29uZmlnIHdoZW4gb3B0aW9ucyBhcnJpdmUsXG4gICAgICAgIC8vIGJ1dCBuZXZlciBvdmVyd3JpdGUgYSB1c2VyLWVkaXRlZCAoZGlydHkpIHZhbHVlLlxuICAgICAgICBpZiAodGRwQ3RybCAmJiAhdGRwQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICAgICAgICBwYXRjaFsndGVzdERhdGFQcm9maWxlJ10gPVxuICAgICAgICAgICAgKHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz9cbiAgICAgICAgICAgICAgdGVzdERhdGFQcm9maWxlUmF3KSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGRzQ3RybCAmJiAhdGRzQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgICAgICAgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUZXN0IERhdGEgU2V0JykgPz8gJydcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoWyd0ZXN0RGF0YVNldCddID1cbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFTZXRSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3Rlc3REYXRhU2V0J10/Lm9wdGlvbnMpID8/XG4gICAgICAgICAgICB0ZXN0RGF0YVNldFJhdyA/PyAnJztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZS1yZXNvbHZlIEFJIGZpZWxkcyB3aGVuIHRoZWlyIG9wdGlvbnMgYXJyaXZlICh0aGV5IHVzZSBkaXNwbGF5IG5hbWVzIGFzIHZhbHVlcykuXG4gICAgICAgIGlmIChlbmFibGVBaUN0cmwgJiYgIWVuYWJsZUFpQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGFpU21hcnRuZXNzUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIFNtYXJ0bmVzcycpO1xuICAgICAgICAgIGlmIChhaVNtYXJ0bmVzc1JhdykgcGF0Y2hbJ2VuYWJsZUFpU21hcnRuZXNzJ10gPSBhaVNtYXJ0bmVzc1JhdztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmYXVsdEFpQ3RybCAmJiAhZGVmYXVsdEFpQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRBaVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0RlZmF1bHQgQUkgQWN0aW9uJyk7XG4gICAgICAgICAgaWYgKGRlZmF1bHRBaVJhdykgcGF0Y2hbJ2RlZmF1bHRBaUFjdGlvbiddID0gZGVmYXVsdEFpUmF3O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtiQ3RybCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJyk7XG4gICAgICAgIGlmIChrYkN0cmwgJiYgIWtiQ3RybC5kaXJ0eSkge1xuICAgICAgICAgIGNvbnN0IGtiUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnS25vd2xlZGdlIEJhc2UgRGVmYXVsdCBUZXN0IENhc2UnKTtcbiAgICAgICAgICBjb25zdCBrYlJlc29sdmVkID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShrYlJhdywgdGhpcy5zZWxlY3RDb25maWdPdmVycmlkZXM/Llsna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSddPy5vcHRpb25zKSA/PyBrYlJhdztcbiAgICAgICAgICBpZiAoa2JSZXNvbHZlZCkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtiUmVzb2x2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUocGF0Y2gsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGVzY3JpcHRpb25Db250ZW50J10gfHwgY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1snbWV0YWRhdGFJdGVtcyddKSB7XG4gICAgICB0aGlzLmVkaXREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25Db250ZW50O1xuICAgICAgdGhpcy5lZGl0TGFiZWxzID0gWy4uLnRoaXMubGFiZWxzXTtcbiAgICAgIHRoaXMuZWRpdFN0YXR1cyA9IHRoaXMuc3RhdHVzSXRlbT8udmFsdWUgPz8gJyc7XG4gICAgICB0aGlzLmVkaXRQcmlvcml0eSA9IHRoaXMucHJpb3JpdHlJdGVtPy52YWx1ZSA/PyAnJztcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSAodGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdUeXBlJykgfHwgKHRoaXMudHlwZUl0ZW0/LnZhbHVlIGFzIHN0cmluZykpID8/ICcnO1xuICAgICAgY29uc3Qgc3RhdHVzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdzdGF0dXMnKTtcbiAgICAgIGNvbnN0IHByaW9yaXR5Q29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmlvcml0eScpO1xuICAgICAgY29uc3QgdHlwZUNvbnRyb2wgPSB0aGlzLmVkaXRGb3JtLmdldCgndHlwZScpO1xuICAgICAgY29uc3QgbGFiZWxzQ29udHJvbCA9IHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVN0YXR1cyA9IHN0YXR1c0NvbnRyb2w/LnRvdWNoZWQgfHwgc3RhdHVzQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVByaW9yaXR5ID0gcHJpb3JpdHlDb250cm9sPy50b3VjaGVkIHx8IHByaW9yaXR5Q29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVR5cGUgPSB0eXBlQ29udHJvbD8udG91Y2hlZCB8fCB0eXBlQ29udHJvbD8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZUxhYmVscyA9IGxhYmVsc0NvbnRyb2w/LnRvdWNoZWQgfHwgbGFiZWxzQ29udHJvbD8uZGlydHk7XG4gICAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi4ocHJlc2VydmVTdGF0dXMgPyB7fSA6IHsgc3RhdHVzOiB0aGlzLmVkaXRTdGF0dXMgfSksXG4gICAgICAgIC4uLihwcmVzZXJ2ZVByaW9yaXR5ID8ge30gOiB7IHByaW9yaXR5OiB0aGlzLmVkaXRQcmlvcml0eSB9KSxcbiAgICAgICAgLi4uKHByZXNlcnZlVHlwZSA/IHt9IDogeyB0eXBlOiB0eXBlVmFsIH0pLFxuICAgICAgICAuLi4ocHJlc2VydmVMYWJlbHMgPyB7fSA6IHsgbGFiZWxzOiB0aGlzLmVkaXRMYWJlbHMgfSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ByZXJlcXVpc2l0ZUNhc2VPcHRpb25zJ10gJiYgdGhpcy5wcmVyZXF1aXNpdGVDYXNlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucHJlcmVxdWlzaXRlQ2FzZVNlbGVjdENvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5wcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnLFxuICAgICAgICBvcHRpb25zOiB0aGlzLnByZXJlcXVpc2l0ZUNhc2VPcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZXdwb3J0Q2F0ZWdvcnlPcHRpb25zJ10pIHtcbiAgICAgIHRoaXMuYXBwbHlWaWV3cG9ydENhdGVnb3J5T3B0aW9ucygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY29uZmlnU2VjdGlvbnMnXSB8fCBjaGFuZ2VzWydjb25maWdTZWN0aW9uc1JvdzInXSkge1xuICAgICAgY29uc3QgZW5hYmxlQWlTbWFydG5lc3MgPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdFbmFibGUgQUkgU21hcnRuZXNzJyk7XG4gICAgICBjb25zdCBkZWZhdWx0QWlBY3Rpb24gPSB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnQUkgQ29uZmlndXJhdGlvbicsICdEZWZhdWx0IEFJIEFjdGlvbicpO1xuICAgICAgY29uc3Qga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdBSSBDb25maWd1cmF0aW9uJywgJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyk7XG4gICAgICBjb25zdCBrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlID0gdGhpcy5yZXNvbHZlVG9PcHRpb25WYWx1ZShrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWydrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJ10/Lm9wdGlvbnMpID8/IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2VSYXc7XG4gICAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IHRoaXMuZ2V0UHJlcmVxdWlzaXRlQ2FzZXNGcm9tQ29uZmlnKCk7XG4gICAgICBjb25zdCB0eXBlUmF3ID0gKHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVHlwZScpIHx8ICh0aGlzLnR5cGVJdGVtPy52YWx1ZSBhcyBzdHJpbmcpKSA/PyAnJztcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVJhdyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdFeGVjdXRpb24nLCAnVGVzdCBEYXRhIFByb2ZpbGUnKSA/PyAnJztcbiAgICAgIGNvbnN0IHRlc3REYXRhU2V0UmF3ID0gdGhpcy5ub3JtYWxpemVUZXN0RGF0YVNldFJhd1ZhbHVlKFxuICAgICAgICB0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnRXhlY3V0aW9uJywgJ1Rlc3QgRGF0YSBTZXQnKSA/PyAnJ1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHR5cGVWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHR5cGVSYXcsIHRoaXMuc2VsZWN0Q29uZmlnT3ZlcnJpZGVzPy5bJ3R5cGUnXT8ub3B0aW9ucykgPz8gdHlwZVJhdztcbiAgICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbCA9IHRoaXMucmVzb2x2ZVRvT3B0aW9uVmFsdWUodGVzdERhdGFQcm9maWxlUmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVByb2ZpbGUnXT8ub3B0aW9ucykgPz8gdGVzdERhdGFQcm9maWxlUmF3O1xuICAgICAgY29uc3QgdGVzdERhdGFTZXRWYWwgPSB0aGlzLnJlc29sdmVUb09wdGlvblZhbHVlKHRlc3REYXRhU2V0UmF3LCB0aGlzLnNlbGVjdENvbmZpZ092ZXJyaWRlcz8uWyd0ZXN0RGF0YVNldCddPy5vcHRpb25zKSA/PyB0ZXN0RGF0YVNldFJhdztcbiAgICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdEZWZhdWx0IEJyb3dzZXInKTtcbiAgICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0V4ZWN1dGlvbicsICdWaWRlbyBSZWNvcmRpbmcnKTtcbiAgICAgIGNvbnN0IHZpZGVvUmVjb3JkaW5nID0gdGhpcy5ub3JtYWxpemVCb29sZWFuU2VsZWN0VmFsdWUodmlkZW9SZWNvcmRpbmdSYXcgYXMgc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCB1c2VBaU1ldGFkYXRhUmF3ID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0FJIENvbmZpZ3VyYXRpb24nLCAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKTtcbiAgICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB0aGlzLm5vcm1hbGl6ZUJvb2xlYW5TZWxlY3RWYWx1ZSh1c2VBaU1ldGFkYXRhUmF3IGFzIHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0gdGhpcy5nZXREZXZpY2VDb25maWdWYWx1ZSgnRGVmYXVsdCBWaWV3cG9ydCcpIHx8IHRoaXMuZ2V0RGV2aWNlQ29uZmlnVmFsdWUoJ1ZpZXdwb3J0JykgfHwgJyc7XG4gICAgICBjb25zdCBkZXZpY2VUeXBlID0gdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0RldmljZScsICdUeXBlJyk7XG4gICAgICBjb25zdCBkZXZpY2VPUyA9IHRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdEZXZpY2UnLCAnT1MnKTtcbiAgICAgIHRoaXMuaW5pdFZpZXdwb3J0RnJvbVZhbHVlKGRlZmF1bHRWaWV3cG9ydCk7XG4gICAgICBjb25zdCBhdXRvV2FpdFZhbCA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgfHwgdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ1dhaXRzICYgUmV0cmllcycsICdBdXRvIFdhaXQnKTtcbiAgICAgIHRoaXMuYXV0b1dhaXRFbmFibGVkID0gISEoYXV0b1dhaXRWYWwgJiYgYXV0b1dhaXRWYWwudHJpbSgpICE9PSAnJyAmJiBTdHJpbmcoYXV0b1dhaXRWYWwpICE9PSAnZmFsc2UnKTtcbiAgICAgIHRoaXMucmV0cnlGYWlsZWRTdGVwcyA9IHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1JldHJ5IEZhaWxlZCBTdGVwcycpO1xuICAgICAgdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID0gdGhpcy5pc1Rlc3RDYXNlVGltZW91dEZyb21PcmcoKSA/ICdvcmcnIDogJ2N1c3RvbSc7XG4gICAgICB0aGlzLnRlc3RDYXNlVGltZW91dCA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1Rlc3QgQ2FzZSBUaW1lb3V0IChtaW51dGVzKScpKTtcbiAgICAgIHRoaXMud2FpdFRpbWVvdXRMb2NhdG9ycyA9IHRoaXMuc3RyaXBUcmFpbGluZ1VuaXRTKHRoaXMuZ2V0V2FpdHNSZXRyaWVzVmFsdWUoJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykpO1xuICAgICAgdGhpcy5tb2JpbGVUZXN0aW5nRW5hYmxlZCA9ICEhdGhpcy5nZXRDb25maWdJdGVtVmFsdWUoJ0tleSBGbGFncycsICdNb2JpbGUgVGVzdGluZycpO1xuICAgICAgdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID0gISF0aGlzLmdldENvbmZpZ0l0ZW1WYWx1ZSgnS2V5IEZsYWdzJywgJ0V4dGVuc2lvbiBVc2UnKTtcbiAgICAgIHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPSAhIXRoaXMuZ2V0Q29uZmlnSXRlbVZhbHVlKCdLZXkgRmxhZ3MnLCAnRGF0YSBEcml2ZW4nKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgY29uc3QgcGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAoZW5hYmxlQWlTbWFydG5lc3MpIHBhdGNoWydlbmFibGVBaVNtYXJ0bmVzcyddID0gZW5hYmxlQWlTbWFydG5lc3M7XG4gICAgICBpZiAoZGVmYXVsdEFpQWN0aW9uKSBwYXRjaFsnZGVmYXVsdEFpQWN0aW9uJ10gPSBkZWZhdWx0QWlBY3Rpb247XG4gICAgICBpZiAoa25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZSkgcGF0Y2hbJ2tub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2UnXSA9IGtub3dsZWRnZUJhc2VEZWZhdWx0VGVzdENhc2U7XG4gICAgICBpZiAodXNlQWlNZXRhZGF0YSkgcGF0Y2hbJ3VzZUFpTWV0YWRhdGEnXSA9IHVzZUFpTWV0YWRhdGE7XG4gICAgICBpZiAocHJlcmVxdWlzaXRlQ2FzZXMubGVuZ3RoKSBwYXRjaFsncHJlcmVxdWlzaXRlQ2FzZXMnXSA9IHByZXJlcXVpc2l0ZUNhc2VzO1xuICAgICAgaWYgKHR5cGVWYWwpIHBhdGNoWyd0eXBlJ10gPSB0eXBlVmFsO1xuXG4gICAgICAvLyBSZS1zeW5jIFRlc3QgRGF0YSBQcm9maWxlIC8gU2V0IGZyb20gY29uZmlnIG9ubHkgd2hlbiBjb250cm9scyBhcmUgTk9UIGRpcnR5XG4gICAgICBjb25zdCB0ZHBDdHJsMiA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0ZXN0RGF0YVByb2ZpbGUnKTtcbiAgICAgIGNvbnN0IHRkc0N0cmwyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVRkcDIgPSB0ZHBDdHJsMj8uZGlydHk7XG4gICAgICBjb25zdCBwcmVzZXJ2ZVRkczIgPSB0ZHNDdHJsMj8uZGlydHk7XG5cbiAgICAgIGlmICh0ZXN0RGF0YVByb2ZpbGVWYWwgJiYgIXByZXNlcnZlVGRwMikgcGF0Y2hbJ3Rlc3REYXRhUHJvZmlsZSddID0gdGVzdERhdGFQcm9maWxlVmFsO1xuICAgICAgaWYgKHRlc3REYXRhU2V0VmFsICE9IG51bGwgJiYgdGVzdERhdGFTZXRWYWwgIT09ICcnICYmICFwcmVzZXJ2ZVRkczIpIHBhdGNoWyd0ZXN0RGF0YVNldCddID0gdGVzdERhdGFTZXRWYWw7XG4gICAgICBpZiAoZGVmYXVsdEJyb3dzZXIpIHBhdGNoWydkZWZhdWx0QnJvd3NlciddID0gZGVmYXVsdEJyb3dzZXI7XG4gICAgICBpZiAodmlkZW9SZWNvcmRpbmcpIHBhdGNoWyd2aWRlb1JlY29yZGluZyddID0gdmlkZW9SZWNvcmRpbmc7XG4gICAgICBpZiAoZGVmYXVsdFZpZXdwb3J0KSBwYXRjaFsnZGVmYXVsdFZpZXdwb3J0J10gPSBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgICBpZiAoZGV2aWNlVHlwZSkgcGF0Y2hbJ2RldmljZVR5cGUnXSA9IGRldmljZVR5cGU7XG4gICAgICBpZiAoZGV2aWNlT1MpIHBhdGNoWydkZXZpY2VPUyddID0gZGV2aWNlT1M7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCkgdGhpcy5lZGl0Rm9ybS5wYXRjaFZhbHVlKHBhdGNoKTtcbiAgICB9XG4gIH1cblxuICBvblJlbW92ZUxhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSB0aGlzLmVkaXRMYWJlbHMuZmlsdGVyKChsKSA9PiBsICE9PSBsYWJlbCk7XG4gICAgdGhpcy5fbGFiZWxzU2VsZWN0Q29uZmlnRGlydHkgPSB0cnVlO1xuICAgIHRoaXMuZWRpdEZvcm0uZ2V0KFRFU1RfQ0FTRV9ERVRBSUxTX1NFTEVDVF9LRVlTLmxhYmVscyk/LnNldFZhbHVlKHRoaXMuZWRpdExhYmVscywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25DbGVhckFsbExhYmVscygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRMYWJlbHMgPSBbXTtcbiAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5lZGl0Rm9ybS5nZXQoVEVTVF9DQVNFX0RFVEFJTFNfU0VMRUNUX0tFWVMubGFiZWxzKT8uc2V0VmFsdWUoW10sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRMYWJlbHMuaW5jbHVkZXMobGFiZWwpKSB7XG4gICAgICB0aGlzLmVkaXRMYWJlbHMgPSBbLi4udGhpcy5lZGl0TGFiZWxzLCBsYWJlbF07XG4gICAgICB0aGlzLl9sYWJlbHNTZWxlY3RDb25maWdEaXJ0eSA9IHRydWU7XG4gICAgICB0aGlzLmVkaXRGb3JtLmdldChURVNUX0NBU0VfREVUQUlMU19TRUxFQ1RfS0VZUy5sYWJlbHMpPy5zZXRWYWx1ZSh0aGlzLmVkaXRMYWJlbHMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNhdmUuZW1pdCh0aGlzLmJ1aWxkU2F2ZVBheWxvYWQoKSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZmlnU2VjdGlvbnMoKTogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbltdIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHRoaXMucGxhdGZvcm07XG4gICAgY29uc3QgdmlkZW9SZWNvcmRpbmdWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd2aWRlb1JlY29yZGluZycpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB2aWRlb1JlY29yZGluZyA9IHZpZGVvUmVjb3JkaW5nVmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiB2aWRlb1JlY29yZGluZ1ZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB2aWRlb1JlY29yZGluZ1ZhbHVlO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGFWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd1c2VBaU1ldGFkYXRhJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHVzZUFpTWV0YWRhdGEgPSB1c2VBaU1ldGFkYXRhVmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiB1c2VBaU1ldGFkYXRhVmFsdWUgPT09ICdmYWxzZScgPyBmYWxzZSA6IHVzZUFpTWV0YWRhdGFWYWx1ZTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlc1JhdyA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdwcmVyZXF1aXNpdGVDYXNlcycpPy52YWx1ZTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlcyA9IEFycmF5LmlzQXJyYXkocHJlcmVxdWlzaXRlQ2FzZXNSYXcpXG4gICAgICA/IHByZXJlcXVpc2l0ZUNhc2VzUmF3Lm1hcCgodikgPT4gU3RyaW5nKHYpKS5maWx0ZXIoQm9vbGVhbilcbiAgICAgIDogcHJlcmVxdWlzaXRlQ2FzZXNSYXcgIT0gbnVsbCAmJiBwcmVyZXF1aXNpdGVDYXNlc1JhdyAhPT0gJydcbiAgICAgICAgPyBbU3RyaW5nKHByZXJlcXVpc2l0ZUNhc2VzUmF3KV1cbiAgICAgICAgOiBbXTtcbiAgICBjb25zdCBwcmVyZXF1aXNpdGVDYXNlVmFsdWUgPSBwcmVyZXF1aXNpdGVDYXNlcy5sZW5ndGggPyBwcmVyZXF1aXNpdGVDYXNlcy5qb2luKCcsJykgOiBudWxsO1xuICAgIGNvbnN0IHR5cGVWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCd0eXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IHRlc3REYXRhUHJvZmlsZVZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhUHJvZmlsZScpPy52YWx1ZSA/PyAnJztcbiAgICBjb25zdCB0ZXN0RGF0YVNldFZhbHVlID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3Rlc3REYXRhU2V0Jyk/LnZhbHVlID8/ICcnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ1NlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24udGl0bGUgPT09ICdFeGVjdXRpb24nKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gc2VjdGlvbi5pdGVtc1xuICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICEocGxhdGZvcm0gPT09ICd3ZWInICYmIGl0ZW0ubGFiZWwgPT09ICdEZWZhdWx0IEJyb3dzZXInKSlcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1ZpZGVvIFJlY29yZGluZycpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB2aWRlb1JlY29yZGluZyB9O1xuICAgICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdQcmVyZXF1aXNpdGUgQ2FzZScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiBwcmVyZXF1aXNpdGVDYXNlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVHlwZScpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0eXBlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBEYXRhIFByb2ZpbGUnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGVzdERhdGFQcm9maWxlVmFsdWUgfTtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnVGVzdCBEYXRhIFNldCcpIHJldHVybiB7IC4uLml0ZW0sIHZhbHVlOiB0ZXN0RGF0YVNldFZhbHVlIH07XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnQUkgQ29uZmlndXJhdGlvbicpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdlbmFibGVBaVNtYXJ0bmVzcycpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgZGVmYXVsdEFpQWN0aW9uVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgnZGVmYXVsdEFpQWN0aW9uJyk/LnZhbHVlO1xuICAgICAgICBjb25zdCBrbm93bGVkZ2VCYXNlVmFsdWUgPSB0aGlzLmVkaXRGb3JtLmdldCgna25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZScpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRW5hYmxlIEFJIG1ldGFkYXRhIGNvbGxlY3Rpb24nKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdXNlQWlNZXRhZGF0YSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRW5hYmxlIEFJIFNtYXJ0bmVzcycgJiYgZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSAhPSBudWxsICYmIGVuYWJsZUFpU21hcnRuZXNzVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogZW5hYmxlQWlTbWFydG5lc3NWYWx1ZSB9O1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnRGVmYXVsdCBBSSBBY3Rpb24nICYmIGRlZmF1bHRBaUFjdGlvblZhbHVlICE9IG51bGwgJiYgZGVmYXVsdEFpQWN0aW9uVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogZGVmYXVsdEFpQWN0aW9uVmFsdWUgfTtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0tub3dsZWRnZSBCYXNlIERlZmF1bHQgVGVzdCBDYXNlJyAmJiBrbm93bGVkZ2VCYXNlVmFsdWUgIT0gbnVsbCAmJiBrbm93bGVkZ2VCYXNlVmFsdWUgIT09ICcnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZToga25vd2xlZGdlQmFzZVZhbHVlIH07XG4gICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAuLi5zZWN0aW9uLCBpdGVtcyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ29uZmlnU2VjdGlvbnNSb3cyKCk6IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb25bXSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLnBsYXRmb3JtO1xuICAgIGNvbnN0IGRlZmF1bHRCcm93c2VyID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RlZmF1bHRCcm93c2VyJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRlZmF1bHRWaWV3cG9ydCA9IHRoaXMuYnVpbGRWaWV3cG9ydFZhbHVlKCk7XG4gICAgY29uc3QgZGV2aWNlVHlwZSA9IHRoaXMuZWRpdEZvcm0uZ2V0KCdkZXZpY2VUeXBlJyk/LnZhbHVlID8/ICcnO1xuICAgIGNvbnN0IGRldmljZU9TID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ2RldmljZU9TJyk/LnZhbHVlID8/ICcnO1xuXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuY29uZmlnU2VjdGlvbnNSb3cyLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24udGl0bGUgPT09ICdXYWl0cyAmIFJldHJpZXMnIHx8IHNlY3Rpb24udGl0bGUgPT09ICdXYWl0IGFuZCByZXRyaWVzJykge1xuICAgICAgICBjb25zdCBhdXRvV2FpdFZhbHVlID0gdGhpcy5hdXRvV2FpdEVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJztcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzZWN0aW9uLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmxhYmVsID09PSAnQXV0byBXYWl0JykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IGF1dG9XYWl0VmFsdWUgfTtcbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ0VuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuYXV0b1dhaXRFbmFibGVkIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdSZXRyeSBGYWlsZWQgU3RlcHMnKSByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZTogdGhpcy5lbXB0eU51bVRvWmVybyh0aGlzLnJldHJ5RmFpbGVkU3RlcHMpIH07XG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09ICdUZXN0IENhc2UgVGltZW91dCAobWludXRlcyknKSB7XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkID0gKHRoaXMudGVzdENhc2VUaW1lb3V0ID8/ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXN0Q2FzZVRpbWVvdXRNb2RlID09PSAnb3JnJyB8fCB0cmltbWVkID09PSAnJyA/IE9SR19MRVZFTF9TRU5USU5FTCA6IHRyaW1tZWQ7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtLCB2YWx1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXRlbS5sYWJlbCA9PT0gJ1dhaXQgVGltZW91dCBmb3IgTG9jYXRvcnMgKHNlY3MpJykgcmV0dXJuIHsgLi4uaXRlbSwgdmFsdWU6IHRoaXMuZW1wdHlOdW1Ub1plcm8odGhpcy53YWl0VGltZW91dExvY2F0b3JzKSB9O1xuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlJyB8fCBzZWN0aW9uLnRpdGxlID09PSAnRGV2aWNlIFNldHRpbmcnKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW1xuICAgICAgICAgIC4uLihwbGF0Zm9ybSA9PT0gJ3dlYidcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IEJyb3dzZXInLCB2YWx1ZTogZGVmYXVsdEJyb3dzZXIgfSxcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWaWV3cG9ydCcsIHZhbHVlOiBkZWZhdWx0Vmlld3BvcnQgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCB2YWx1ZTogZGV2aWNlVHlwZSB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdPUycsIHZhbHVlOiBkZXZpY2VPUyB9LFxuICAgICAgICAgICAgICBdKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHsgLi4uc2VjdGlvbiwgaXRlbXMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWN0aW9uO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXhpc3RpbmdEZXZpY2UgPSByZXN1bHQuZmluZCgocykgPT4gcy50aXRsZSA9PT0gJ0RldmljZScgfHwgcy50aXRsZSA9PT0gJ0RldmljZSBTZXR0aW5nJyk7XG4gICAgaWYgKCFleGlzdGluZ0RldmljZSkge1xuICAgICAgY29uc3QgZGV2aWNlU2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbiA9IHtcbiAgICAgICAgdGl0bGU6ICdEZXZpY2UnLFxuICAgICAgICBpY29uOiAnZGV2aWNlcycsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgLi4uKHBsYXRmb3JtID09PSAnd2ViJ1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgQnJvd3NlcicsIHZhbHVlOiBkZWZhdWx0QnJvd3NlciB9LFxuICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZpZXdwb3J0JywgdmFsdWU6IGRlZmF1bHRWaWV3cG9ydCB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHZhbHVlOiBkZXZpY2VUeXBlIH0sXG4gICAgICAgICAgICAgICAgeyBsYWJlbDogJ09TJywgdmFsdWU6IGRldmljZU9TIH0sXG4gICAgICAgICAgICAgIF0pLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIGRldmljZVNlY3Rpb25dO1xuICAgIH1cblxuICAgIGNvbnN0IGtleUZsYWdzU2VjdGlvbjogVGVzdENhc2VEZXRhaWxzQ29uZmlnU2VjdGlvbiA9IHtcbiAgICAgIHRpdGxlOiAnS2V5IEZsYWdzJyxcbiAgICAgIGljb246ICdmbGFnJyxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdNb2JpbGUgVGVzdGluZycsIHZhbHVlOiB0aGlzLm1vYmlsZVRlc3RpbmdFbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0V4dGVuc2lvbiBVc2UnLCB2YWx1ZTogdGhpcy5leHRlbnNpb25Vc2VFbmFibGVkID8gJ0VuYWJsZWQnIDogJycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RhdGEgRHJpdmVuJywgdmFsdWU6IHRoaXMuZGF0YURyaXZlbkVuYWJsZWQgPyAnRW5hYmxlZCcgOiAnJyB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIGNvbnN0IGV4aXN0aW5nS2V5RmxhZ3MgPSByZXN1bHQuZmluZCgocykgPT4gcy50aXRsZSA9PT0gJ0tleSBGbGFncycpO1xuICAgIGlmIChleGlzdGluZ0tleUZsYWdzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQubWFwKChzKSA9PlxuICAgICAgICBzLnRpdGxlID09PSAnS2V5IEZsYWdzJyA/IGtleUZsYWdzU2VjdGlvbiA6IHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFsuLi5yZXN1bHQsIGtleUZsYWdzU2VjdGlvbl07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICB0cmFja0J5TGFiZWwoX2k6IG51bWJlciwgbGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgdHJhY2tCeUNvbmZpZ1RpdGxlKF9pOiBudW1iZXIsIHNlY3Rpb246IFRlc3RDYXNlRGV0YWlsc0NvbmZpZ1NlY3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzZWN0aW9uLnRpdGxlO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgbGFiZWxzIHVzZSBjb25zaXN0ZW50IGluZGlnbyBzdHlsZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IExBQkVMX0NISVBfU1RZTEUgPSB7XG4gICAgYmc6ICcjNjM2NkYxJyxcbiAgICBib3JkZXI6ICcjNjM2NkYxJyxcbiAgICB0ZXh0OiAnI0ZGRkZGRicsXG4gICAgaWNvbjogJyNGRkZGRkYnLFxuICB9O1xuXG4gIGdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShfbGFiZWw6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuTEFCRUxfQ0hJUF9TVFlMRTtcbiAgICByZXR1cm4ge1xuICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBjb2xvcnMuYmcsXG4gICAgICAnYm9yZGVyLWNvbG9yJzogY29sb3JzLmJvcmRlcixcbiAgICAgICdib3JkZXItd2lkdGgnOiAnMXB4JyxcbiAgICAgICdib3JkZXItc3R5bGUnOiAnc29saWQnLFxuICAgICAgY29sb3I6IGNvbG9ycy50ZXh0LFxuICAgIH07XG4gIH1cblxuICBnZXRMYWJlbENsb3NlSWNvbkNvbG9yKF9sYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5MQUJFTF9DSElQX1NUWUxFLmljb247XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtcHktNFwiPlxuICA8IS0tIEJhc2ljIGRldGFpbHM6IERlc2NyaXB0aW9uLCBTdGF0dXMvUHJpb3JpdHkvVHlwZSwgTGFiZWxzIChsaWdodCBiYWNrZ3JvdW5kIGNvbnRhaW5lcikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtc2VsZi1zdHJldGNoIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTQgY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtYmctWyNGOEY5RkVdIGNxYS1wLTRcIj5cbiAgPCEtLSBEZXNjcmlwdGlvbiAoRmlnbWE6IGRvY3VtZW50IGljb24sIHRleHRhcmVhIHdpdGggbGlnaHQgcHVycGxlIGJnKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5kZXNjcmlwdGlvbjwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS42cHhdXCI+e3sgZGVzY3JpcHRpb25UaXRsZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgW3ZhbHVlXT1cImVkaXREZXNjcmlwdGlvblwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwiZWRpdERlc2NyaXB0aW9uID0gJGV2ZW50XCJcbiAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICBbcm93c109XCI0XCJcbiAgICAgIFtlbmFibGVNYXJrZG93bl09XCJlbmFibGVNYXJrZG93blwiXG4gICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGRlc2NyaXB0aW9uLi4uXCJcbiAgICAgIHRleHRhcmVhSW5saW5lU3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxMDAlXCJcbiAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPlxuICAgIDwvY3FhLWN1c3RvbS10ZXh0YXJlYT5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGF0dXMsIFByaW9yaXR5ICYgVHlwZSAoRmlnbWE6IHNpZGUtYnktc2lkZSBkcm9wZG93bnMsIGNxYS1keW5hbWljLXNlbGVjdCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZ3JpZCBjcWEtZ3JpZC1jb2xzLTIgY3FhLWdhcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5TdGF0dXM8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnc3RhdHVzJywgc3RhdHVzU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3N0YXR1cycpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNTdGVwR3JvdXBcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5Qcmlvcml0eTwvbGFiZWw+XG4gICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdwcmlvcml0eScsIHByaW9yaXR5U2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByaW9yaXR5JylcIlxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1N0ZXBHcm91cFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW1lZGl1bVwiPlR5cGU8L2xhYmVsPlxuICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndHlwZScsIHR5cGVTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndHlwZScpXCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIExhYmVscyAoRmlnbWE6IEN1cnJlbnQgTGFiZWxzIHdpdGggQ2xlYXIgQWxsLCBjcWEtYmFkZ2Ugd2l0aCB4LCBGcmVxdWVudGx5IHVzZWQsIFNlYXJjaCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTVweF0gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+Q3VycmVudCBMYWJlbHMgKHt7IGVkaXRMYWJlbHMubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwiZWRpdExhYmVscy5sZW5ndGggPiAwXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bI0RDMjYyNl0gaG92ZXI6Y3FhLXVuZGVybGluZSBjcWEtZm9udC1ub3JtYWxcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhckFsbExhYmVscygpXCI+XG4gICAgICAgIENsZWFyIEFsbFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0yXCIgKm5nSWY9XCJlZGl0TGFiZWxzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGVkaXRMYWJlbHM7IHRyYWNrQnk6IHRyYWNrQnlMYWJlbFwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLXB4LTIuNSBjcWEtcHktMSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXJvdW5kZWQtbWQgY3FhLWJvcmRlclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEN1cnJlbnRMYWJlbENoaXBTdHlsZShsYWJlbClcIj5cbiAgICAgICAgPHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTMuNSBjcWEtaC0zLjUgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLW9wYWNpdHktODAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0TGFiZWxDbG9zZUljb25Db2xvcihsYWJlbClcIlxuICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZUxhYmVsKGxhYmVsKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlICcgKyBsYWJlbFwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtdy0zLjUgY3FhLWgtMy41XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1tZWRpdW1cIj5GcmVxdWVudGx5IHVzZWQ8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtd3JhcCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBmcmVxdWVudGx5VXNlZExhYmVsczsgdHJhY2tCeTogdHJhY2tCeUxhYmVsXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRnJlcXVlbnRMYWJlbChsYWJlbClcIj5cbiAgICAgICAgICA8Y3FhLWJhZGdlXG4gICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFOEU5RkZcIlxuICAgICAgICAgICAgdGV4dENvbG9yPVwiIzNGNDNFRVwiXG4gICAgICAgICAgICBib3JkZXJDb2xvcj1cIiNFOEU5RkZcIj5cbiAgICAgICAgICA8L2NxYS1iYWRnZT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbWVkaXVtXCI+QWRkIGxhYmVsczwvbGFiZWw+XG4gICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgW2NvbmZpZ109XCJsYWJlbHNTZWxlY3RDb25maWdcIlxuICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnbGFiZWxzJylcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChhZGRDdXN0b21WYWx1ZSk9XCJvbkxhYmVsc0FkZEN1c3RvbVZhbHVlKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gIDwvZGl2PlxuICA8L2Rpdj5cblxuXG4gIDwhLS0gQ29uZmlndXJhdGlvbiAoRmlnbWE6IGNvbGxhcHNpYmxlLCBnZWFyIGljb24sIGxpZ2h0IGJhY2tncm91bmQgY29udGFpbmVyKSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1zZWxmLXN0cmV0Y2ggY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzEycHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0UyRThGMF0gY3FhLWJnLVsjRjhGOUZFXSBjcWEtcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS10ZXh0LWxlZnQgY3FhLXctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTUgY3FhLWgtNSBjcWEtcC0xIGNxYS1mbGV4LXNocmluay0wIGNxYS1iZy1bIzNGNDNFRTFBXSBjcWEtcm91bmRlZC1tZCBjcWEtaW5saW5lLWZsZXggY3FhLWp1c3RpZnktY2VudGVyIGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWyMxQjFGRUJdIGNxYS10ZXh0LVsxMnB4XSBjcWEtdy0zIGNxYS1oLTMgY3FhLWxlYWRpbmctbm9uZSBjcWEtYmxvY2tcIj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdIGNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS1sZWFkaW5nLVsxOS41cHhdXCI+e3sgY29uZmlnVGl0bGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTUgY3FhLXRleHQteHNcIj5cbiAgICAgIDwhLS0gRXhlY3V0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0aW9uRXhwYW5kZWQgPSAhZXhlY3V0aW9uRXhwYW5kZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy01IGNxYS1oLTUgY3FhLXAtMSBjcWEtZmxleC1zaHJpbmstMCBjcWEtYmctWyMzRjQzRUUxQV0gY3FhLXJvdW5kZWQtbWQgY3FhLWlubGluZS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjMUIxRkVCXSBjcWEtdGV4dC1bMTJweF0gY3FhLXctMyBjcWEtaC0zIGNxYS1sZWFkaW5nLW5vbmUgY3FhLWJsb2NrXCI+cGxheV9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkV4ZWN1dGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBleGVjdXRpb25FeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJleGVjdXRpb25FeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaGFzUHJlcmVxdWlzaXRlQ2FzZUNvbmZpZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj4gXG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgncHJlcmVxdWlzaXRlQ2FzZXMnLCBwcmVyZXF1aXNpdGVDYXNlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3ByZXJlcXVpc2l0ZUNhc2VzJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5UZXN0IERhdGEgUHJvZmlsZTwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgndGVzdERhdGFQcm9maWxlJywgdGVzdERhdGFQcm9maWxlU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ3Rlc3REYXRhUHJvZmlsZScpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzU3RlcEdyb3VwXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWyM2ODczODldIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bVwiPlRlc3QgRGF0YSBTZXQ8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3Rlc3REYXRhU2V0JywgdGVzdERhdGFTZXRTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndGVzdERhdGFTZXQnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW1cIj5WaWRlbyBSZWNvcmRpbmc8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3ZpZGVvUmVjb3JkaW5nJywgdmlkZW9SZWNvcmRpbmdTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgndmlkZW9SZWNvcmRpbmcnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBSSBDb25maWd1cmF0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi00IGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWlDb25maWdFeHBhbmRlZCA9ICFhaUNvbmZpZ0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnNtYXJ0X3RveTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+QUkgQ29uZmlndXJhdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBhaUNvbmZpZ0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFpQ29uZmlnRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB5LTAgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ2VuYWJsZUFpU21hcnRuZXNzJywgZW5hYmxlQWlTbWFydG5lc3NTZWxlY3RDb25maWcpXCJcbiAgICAgICAgICAgIChzZWFyY2hDaGFuZ2UpPVwib25TZWxlY3RTZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzZWxlY3RDbGljayk9XCJvblNlbGVjdE9wZW5lZCgnZW5hYmxlQWlTbWFydG5lc3MnKVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybV09XCJlZGl0Rm9ybVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEFpQWN0aW9uJywgZGVmYXVsdEFpQWN0aW9uU2VsZWN0Q29uZmlnKVwiXG4gICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGxvYWRNb3JlKT1cIm9uU2VsZWN0TG9hZE1vcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0Q2xpY2spPVwib25TZWxlY3RPcGVuZWQoJ2RlZmF1bHRBaUFjdGlvbicpXCJcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj48L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgIFtmb3JtXT1cImVkaXRGb3JtXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiZ2V0Q29uZmlnRm9yU2VsZWN0KCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJywga25vd2xlZGdlQmFzZURlZmF1bHRUZXN0Q2FzZVNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdrbm93bGVkZ2VCYXNlRGVmYXVsdFRlc3RDYXNlJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJnZXRDb25maWdGb3JTZWxlY3QoJ3VzZUFpTWV0YWRhdGEnLCBhaU1ldGFkYXRhQ29sbGVjdGlvblNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgKHNlYXJjaENoYW5nZSk9XCJvblNlbGVjdFNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChsb2FkTW9yZSk9XCJvblNlbGVjdExvYWRNb3JlKCRldmVudClcIlxuICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCd1c2VBaU1ldGFkYXRhJylcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPjwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBXYWl0cyAmIFJldHJpZXMtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItNCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cIndhaXRzUmV0cmllc0V4cGFuZGVkID0gIXdhaXRzUmV0cmllc0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPnRpbWVyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1bMTkuNnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN11cIj5XYWl0IGFuZCBSZXRyaWVzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNjQ3NDhCXSBjcWEtdGV4dC14bCBjcWEtdy01IGNxYS1oLTVcIj5cbiAgICAgICAgICAgIHt7IHdhaXRzUmV0cmllc0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIndhaXRzUmV0cmllc0V4cGFuZGVkXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImF1dG9XYWl0RW5hYmxlZFwiIChjaGVja2VkQ2hhbmdlKT1cImF1dG9XYWl0RW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPkVuYWJsZSBBdm9pZCBBdXRvIHdhaXQgZm9yIHN0ZXBzPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjUgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUmV0cnkgRmFpbGVkIFN0ZXBzXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInJldHJ5RmFpbGVkU3RlcHNcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwicmV0cnlGYWlsZWRTdGVwcyA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXG4gICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgIGxhYmVsSW5saW5lU3R5bGU9XCJmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOS42cHhcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV0gY3FhLXRleHQteHMgY3FhLW1iLTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE5LjZweFwiPlxuICAgICAgICAgICAgICBUZXN0IENhc2UgVGltZW91dCAobWludXRlcylcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLW1pbi13LTAgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1kcm9wZG93bi1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInRlc3RDYXNlVGltZW91dE1vZGVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlXT1cInRlc3RDYXNlVGltZW91dE1vZGVcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblRlc3RDYXNlVGltZW91dE1vZGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvY3FhLWRyb3Bkb3duLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlc3RDYXNlVGltZW91dERpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGVzdENhc2VUaW1lb3V0TW9kZSA9PT0gJ29yZydcIlxuICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInRlc3RDYXNlVGltZW91dCA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjMwXCJcbiAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBzaXplPVwic21cIj5cbiAgICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJXYWl0IFRpbWVvdXQgZm9yIExvY2F0b3JzIChzZWMpXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIndhaXRUaW1lb3V0TG9jYXRvcnNcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwid2FpdFRpbWVvdXRMb2NhdG9ycyA9IG9ubHlEaWdpdHMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMTVcIlxuICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgICAgICBsYWJlbElubGluZVN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMTkuNnB4XCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicGxhdGZvcm0gIT09ICdtb2JpbGUnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yLjUgY3FhLW1pbi13LTAgY3FhLXJvdW5kZWQtbGcgY3FhLXAtNCBjcWEtbWItNCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF1cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtcC0wIGNxYS1jdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgKGNsaWNrKT1cImRldmljZUV4cGFuZGVkID0gIWRldmljZUV4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmRldmljZXM8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPkRldmljZSBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBkZXZpY2VFeHBhbmRlZCA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnIH19XG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkZXZpY2VFeHBhbmRlZFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtbWluLXctMCBjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgPCEtLSBXZWIgb25seTogbW9iaWxlIERldmljZSBTZXR0aW5ncyBoaWRkZW4gdGVtcG9yYXJpbHkgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4tdy0wIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1dPVwiZWRpdEZvcm1cIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImdldENvbmZpZ0ZvclNlbGVjdCgnZGVmYXVsdEJyb3dzZXInLCBkZWZhdWx0QnJvd3NlclNlbGVjdENvbmZpZylcIlxuICAgICAgICAgICAgICAoc2VhcmNoQ2hhbmdlKT1cIm9uU2VsZWN0U2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAobG9hZE1vcmUpPVwib25TZWxlY3RMb2FkTW9yZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdENsaWNrKT1cIm9uU2VsZWN0T3BlbmVkKCdkZWZhdWx0QnJvd3NlcicpXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+PC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBWaWV3cG9ydCBzZWxlY3RvciDigJQgcmVwbGFjZXMgc2luZ2xlIGRyb3Bkb3duIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxM3B4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1sZWFkaW5nLVsxOC4ycHhdXCI+Vmlld3BvcnQ8L3NwYW4+XG4gICAgICAgICAgICA8Y3FhLXJhZGlvLWNhcmQtZ3JvdXBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2aWV3cG9ydC1zZWxlY3RvclwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cInZpZXdwb3J0TW9kZU9wdGlvbnNcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJ2aWV3cG9ydE1vZGVcIlxuICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblZpZXdwb3J0TW9kZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS1yYWRpby1jYXJkLWdyb3VwPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZpZXdwb3J0TW9kZSA9PT0gJ2Rlc2t0b3AnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNmI3MjgwXVwiPlJlc29sdXRpb248L3NwYW4+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICBbZm9ybV09XCJ2aWV3cG9ydERlc2t0b3BEZXZpY2VGb3JtXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnXT1cImRlc2t0b3BWaWV3cG9ydENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmlld3BvcnRNb2RlID09PSAnbGFwdG9wJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZiNzI4MF1cIj5SZXNvbHV0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgW2Zvcm1dPVwidmlld3BvcnRMYXB0b3BEZXZpY2VGb3JtXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnXT1cImxhcHRvcFZpZXdwb3J0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2aWV3cG9ydE1vZGUgPT09ICd0YWJsZXQnXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xLjVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNmI3MjgwXVwiPlJlc29sdXRpb248L3NwYW4+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3RcbiAgICAgICAgICAgICAgICBbZm9ybV09XCJ2aWV3cG9ydFRhYmxldERldmljZUZvcm1cIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwidGFibGV0Vmlld3BvcnRDb25maWdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInZpZXdwb3J0TW9kZSA9PT0gJ21vYmlsZSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM2YjcyODBdXCI+RGV2aWNlPC9zcGFuPlxuICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0XG4gICAgICAgICAgICAgICAgW2Zvcm1dPVwidmlld3BvcnRNb2JpbGVEZXZpY2VGb3JtXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnXT1cIm1vYmlsZVZpZXdwb3J0Q29uZmlnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gS2V5IEZsYWdzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIuNSBjcWEtbWluLXctMCBjcWEtcm91bmRlZC1sZyBjcWEtcC00IGNxYS1tYi0wIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXctZnVsbCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1wLTAgY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAoY2xpY2spPVwia2V5RmxhZ3NFeHBhbmRlZCA9ICFrZXlGbGFnc0V4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctNSBjcWEtaC01IGNxYS1wLTEgY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJnLVsjM0Y0M0VFMUFdIGNxYS1yb3VuZGVkLW1kIGNxYS1pbmxpbmUtZmxleCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzFCMUZFQl0gY3FhLXRleHQtWzEycHhdIGNxYS13LTMgY3FhLWgtMyBjcWEtbGVhZGluZy1ub25lIGNxYS1ibG9ja1wiPmZsYWc8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPktleSBGbGFnczwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bIzY0NzQ4Ql0gY3FhLXRleHQteGwgY3FhLXctNSBjcWEtaC01XCI+XG4gICAgICAgICAgICB7eyBrZXlGbGFnc0V4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZScgfX1cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImtleUZsYWdzRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cIm1vYmlsZVRlc3RpbmdFbmFibGVkXCIgKGNoZWNrZWRDaGFuZ2UpPVwibW9iaWxlVGVzdGluZ0VuYWJsZWQgPSAkZXZlbnRcIiBhcmlhTGFiZWw9XCJNb2JpbGUgVGVzdGluZ1wiPjwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5Nb2JpbGUgVGVzdGluZzwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTIuNSBjcWEtcm91bmRlZC1sZ1wiPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlIFtjaGVja2VkXT1cImV4dGVuc2lvblVzZUVuYWJsZWRcIiAoY2hlY2tlZENoYW5nZSk9XCJleHRlbnNpb25Vc2VFbmFibGVkID0gJGV2ZW50XCIgYXJpYUxhYmVsPVwiRXh0ZW5zaW9uIFVzZVwiPjwvY3FhLWN1c3RvbS10b2dnbGU+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLVsxOS42cHhdIGNxYS1mb250LW5vcm1hbCBjcWEtdGV4dC1bIzExMTgyN11cIj5FeHRlbnNpb24gVXNlPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGUgW2NoZWNrZWRdPVwiZGF0YURyaXZlbkVuYWJsZWRcIiAoY2hlY2tlZENoYW5nZSk9XCJkYXRhRHJpdmVuRW5hYmxlZCA9ICRldmVudFwiIGFyaWFMYWJlbD1cIkRhdGEgRHJpdmVuXCI+PC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctWzE5LjZweF0gY3FhLWZvbnQtbm9ybWFsIGNxYS10ZXh0LVsjMTExODI3XVwiPkRhdGEgRHJpdmVuPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBcbiAgICAgIDwhLS0gQVBJIE1vY2tpbmcgQ2FyZCAoZWRpdCBtb2RlOiBtdXR1YWxseS1leGNsdXNpdmUgdG9nZ2xlcyBkcml2ZW4gYnkgb25lIGJvb2xlYW4pIC0tPlxuICAgICAgPGNxYS1hcGktbW9ja2luZy1jYXJkXG4gICAgICAgICpuZ0lmPVwic2hvd0FwaU1vY2tpbmdDYXJkXCJcbiAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIlxuICAgICAgICBbdGl0bGVdPVwiYXBpTW9ja2luZ1RpdGxlXCJcbiAgICAgICAgW3N0YXR1c0xhYmVsXT1cImFwaU1vY2tpbmdTdGF0dXNMYWJlbFwiXG4gICAgICAgIFtjYXB0dXJlTGFiZWxdPVwiYXBpTW9ja2luZ0NhcHR1cmVMYWJlbFwiXG4gICAgICAgIFtjYXB0dXJlSGludF09XCJhcGlNb2NraW5nQ2FwdHVyZUhpbnRcIlxuICAgICAgICBbcmVuZXdMYWJlbF09XCJhcGlNb2NraW5nUmVuZXdMYWJlbFwiXG4gICAgICAgIFtyZW5ld0hpbnRdPVwiYXBpTW9ja2luZ1JlbmV3SGludFwiXG4gICAgICAgIFtyZXN0b3JlTW9ja109XCJlZGl0QXBpTW9ja2luZ1Jlc3RvcmVNb2NrXCJcbiAgICAgICAgW3N0b3JlTW9ja109XCJlZGl0QXBpTW9ja2luZ1N0b3JlTW9ja1wiXG4gICAgICAgIFttb2NrZWRBcGlzQ291bnRdPVwiYXBpTW9ja2luZ01vY2tlZEFwaXNDb3VudFwiXG4gICAgICAgIFt0b3RhbEFwaXNDb3VudF09XCJhcGlNb2NraW5nVG90YWxBcGlzQ291bnRcIlxuICAgICAgICBbcHJvZ3Jlc3NQZXJjZW50XT1cImFwaU1vY2tpbmdQcm9ncmVzc1BlcmNlbnRcIlxuICAgICAgICBbc2hvd1Byb2dyZXNzXT1cImFwaU1vY2tpbmdTaG93UHJvZ3Jlc3NcIlxuICAgICAgICBbc3VtbWFyeVRleHRdPVwiYXBpTW9ja2luZ1N1bW1hcnlUZXh0XCJcbiAgICAgICAgW3BlcmNlbnRUZXh0XT1cImFwaU1vY2tpbmdQZXJjZW50VGV4dFwiXG4gICAgICAgIFtlZGl0aW5nXT1cInRydWVcIlxuICAgICAgICAocmVzdG9yZU1vY2tDaGFuZ2UpPVwib25BcGlNb2NraW5nUmVzdG9yZU1vY2tDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChzdG9yZU1vY2tDaGFuZ2UpPVwib25BcGlNb2NraW5nU3RvcmVNb2NrQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoY29uZmlndXJlKT1cImNvbmZpZ3VyZUFwaU1vY2tpbmcuZW1pdCgpXCI+XG4gICAgICA8L2NxYS1hcGktbW9ja2luZy1jYXJkPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC0zIGNxYS1wdC0yIGNxYS13LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgICAgW3RleHRdPVwiJ0NhbmNlbCdcIlxuICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICpuZ0lmPVwiIWlzU2F2aW5nXCJcbiAgICAgICAgdmFyaWFudD1cImZpbGxlZFwiXG4gICAgICAgIFt0ZXh0XT1cIidTYXZlIENoYW5nZXMnXCJcbiAgICAgICAgYnRuU2l6ZT1cIm1kXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNVbnNhdmVkQ2hhbmdlc1wiXG4gICAgICAgIChjbGlja2VkKT1cIm9uU2F2ZSgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNTYXZpbmdcIiBjbGFzcz1cImNxYS13LWZ1bGxcIj5cbiAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgIGxhYmVsPVwiU2F2aW5n4oCmXCJcbiAgICAgICAgICBpY29uPVwiYXV0b3JlbmV3XCJcbiAgICAgICAgICBbaXNMb2FkaW5nXT1cInRydWVcIlxuICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW2NlbnRlckNvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgdmFyaWFudD1cImluZm9cIlxuICAgICAgICAgIHNpemU9XCJtZWRpdW1cIj5cbiAgICAgICAgPC9jcWEtYmFkZ2U+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|