@cqa-lib/cqa-ui 1.1.548-gamma.21 → 1.1.548-gamma.23
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/step-builder/step-builder-action/step-builder-action.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-condition/step-builder-condition.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-loop/step-builder-loop.component.mjs +3 -3
- package/esm2020/lib/test-case-details/api-edit-step/api-edit-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/variables-panel/variables-panel.component.mjs +15 -51
- package/fesm2015/cqa-lib-cqa-ui.mjs +73 -108
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +73 -106
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/test-case-details/variables-panel/variables-panel.component.d.ts +5 -15
- package/package.json +1 -1
|
@@ -2,51 +2,32 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from
|
|
|
2
2
|
import { EMPTY_STATE_IMAGES } from '../../assets/images/image-assets.constants';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "../../search-bar/search-bar.component";
|
|
5
|
-
import * as i2 from "
|
|
6
|
-
import * as i3 from "./
|
|
7
|
-
import * as i4 from "
|
|
8
|
-
import * as i5 from "
|
|
9
|
-
import * as i6 from "./used-variable-row.component";
|
|
10
|
-
import * as i7 from "./used-profile-row.component";
|
|
11
|
-
import * as i8 from "@angular/common";
|
|
5
|
+
import * as i2 from "./used-variable-row.component";
|
|
6
|
+
import * as i3 from "./used-profile-row.component";
|
|
7
|
+
import * as i4 from "../../empty-state/empty-state.component";
|
|
8
|
+
import * as i5 from "@angular/common";
|
|
12
9
|
export class TestCaseVariablesPanelComponent {
|
|
13
10
|
constructor() {
|
|
14
|
-
this.activeSubTab = 'available';
|
|
15
11
|
this.searchTerm = '';
|
|
16
12
|
this.searchPlaceholder = 'Search by';
|
|
17
|
-
this.available = { environment: [], global: [], testDataProfiles: [] };
|
|
18
13
|
this.used = { environment: [], global: [], testDataProfiles: [] };
|
|
19
|
-
this.isLoadingAvailable = false;
|
|
20
14
|
this.isLoadingUsed = false;
|
|
21
15
|
this.showManageEnvAndDataLink = true;
|
|
22
|
-
this.activeSubTabChange = new EventEmitter();
|
|
23
16
|
this.searchTermChange = new EventEmitter();
|
|
24
17
|
this.searchCleared = new EventEmitter();
|
|
25
18
|
this.manageEnvAndDataClick = new EventEmitter();
|
|
26
|
-
this.topSegments = [
|
|
27
|
-
{ label: 'Available', value: 'available' },
|
|
28
|
-
{ label: 'Used in Test', value: 'used' },
|
|
29
|
-
{ label: 'Parameters', value: 'parameters' },
|
|
30
|
-
];
|
|
31
19
|
this.skeletonRows = [0, 1, 2, 3];
|
|
32
20
|
/** Empty-state imagery — exposed to the template so we can bind [imageUrl]. */
|
|
33
21
|
this.searchEmptyImageUrl = EMPTY_STATE_IMAGES.SEARCH_DEBUG;
|
|
34
22
|
this.noDataImageUrl = EMPTY_STATE_IMAGES.CHECKLIST_ADD;
|
|
35
|
-
/** Per-row expanded state. Key format: `<
|
|
23
|
+
/** Per-row expanded state. Key format: `<group>:<id>`. */
|
|
36
24
|
this.expandedKeys = {};
|
|
37
25
|
}
|
|
38
26
|
ngOnChanges(changes) {
|
|
39
|
-
if (changes['
|
|
40
|
-
// Drop expansion state when the data set is replaced wholesale.
|
|
27
|
+
if (changes['used']) {
|
|
41
28
|
this.expandedKeys = {};
|
|
42
29
|
}
|
|
43
30
|
}
|
|
44
|
-
onSegmentChange(value) {
|
|
45
|
-
if (value === 'available' || value === 'used' || value === 'parameters') {
|
|
46
|
-
this.activeSubTab = value;
|
|
47
|
-
this.activeSubTabChange.emit(value);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
31
|
onSearchValueChange(value) {
|
|
51
32
|
this.searchTerm = value ?? '';
|
|
52
33
|
this.searchTermChange.emit(this.searchTerm);
|
|
@@ -62,18 +43,15 @@ export class TestCaseVariablesPanelComponent {
|
|
|
62
43
|
event.preventDefault();
|
|
63
44
|
this.manageEnvAndDataClick.emit();
|
|
64
45
|
}
|
|
65
|
-
isExpanded(
|
|
66
|
-
return !!this.expandedKeys[`${
|
|
46
|
+
isExpanded(_tab, group, id) {
|
|
47
|
+
return !!this.expandedKeys[`${group}:${id}`];
|
|
67
48
|
}
|
|
68
|
-
setExpanded(
|
|
69
|
-
this.expandedKeys[`${
|
|
49
|
+
setExpanded(_tab, group, id, expanded) {
|
|
50
|
+
this.expandedKeys[`${group}:${id}`] = expanded;
|
|
70
51
|
}
|
|
71
52
|
trackByRow(_i, item) {
|
|
72
53
|
return item?.id ?? _i;
|
|
73
54
|
}
|
|
74
|
-
trackByTdp(_i, item) {
|
|
75
|
-
return item?.id ?? _i;
|
|
76
|
-
}
|
|
77
55
|
trackByUsedTdp(_i, item) {
|
|
78
56
|
return item?.attachmentId ?? _i;
|
|
79
57
|
}
|
|
@@ -82,48 +60,34 @@ export class TestCaseVariablesPanelComponent {
|
|
|
82
60
|
? this.environmentName
|
|
83
61
|
: 'this test case';
|
|
84
62
|
}
|
|
85
|
-
get hasAvailableData() {
|
|
86
|
-
return ((this.available?.environment?.length ?? 0) > 0 ||
|
|
87
|
-
(this.available?.global?.length ?? 0) > 0 ||
|
|
88
|
-
(this.available?.testDataProfiles?.length ?? 0) > 0);
|
|
89
|
-
}
|
|
90
63
|
get hasUsedData() {
|
|
91
64
|
return ((this.used?.environment?.length ?? 0) > 0 ||
|
|
92
65
|
(this.used?.global?.length ?? 0) > 0 ||
|
|
93
66
|
(this.used?.testDataProfiles?.length ?? 0) > 0);
|
|
94
67
|
}
|
|
95
|
-
// Avoid unused-import warning in template-strict checks
|
|
96
|
-
asEnvVar(item) { return item; }
|
|
68
|
+
// Avoid unused-import warning in template-strict checks.
|
|
97
69
|
asUsedVar(item) { return item; }
|
|
98
70
|
}
|
|
99
71
|
TestCaseVariablesPanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseVariablesPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
100
|
-
TestCaseVariablesPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseVariablesPanelComponent, selector: "cqa-test-case-variables-panel", inputs: { activeSubTab: "activeSubTab", searchTerm: "searchTerm", searchPlaceholder: "searchPlaceholder", environmentName: "environmentName", available: "available", used: "used", isLoadingAvailable: "isLoadingAvailable", isLoadingUsed: "isLoadingUsed", showManageEnvAndDataLink: "showManageEnvAndDataLink" }, outputs: { activeSubTabChange: "activeSubTabChange", searchTermChange: "searchTermChange", searchCleared: "searchCleared", manageEnvAndDataClick: "manageEnvAndDataClick" }, host: { styleAttribute: "display: flex; flex: 1 1 auto; min-height: 0; flex-direction: column;", classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-w-full cqa-flex-1 cqa-min-h-0 cqa-bg-white\">\n <!-- Header: search + env banner + segment-control. Not sticky \u2014 laid out as a normal block above the scroll body so the Parameters tab can grant the slotted form full height. -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2 cqa-pb-3 cqa-bg-white\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchTerm\"\n [showClear]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\"\n (search)=\"onSearchSubmit($event)\"\n (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n\n <div class=\"cqa-text-xs cqa-text-[#475569] cqa-bg-[#F8FAFC] cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-rounded-md cqa-px-3 cqa-py-2\">\n Variables are resolved using: <span class=\"cqa-font-semibold cqa-text-[#0F172A]\">{{ bannerEnvLabel }}</span>\n </div>\n\n <cqa-segment-control\n [segments]=\"topSegments\"\n [value]=\"activeSubTab\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Scrolling body for Available + Used. -->\n <div\n [hidden]=\"activeSubTab === 'parameters'\"\n class=\"cqa-flex-1 cqa-min-h-0 cqa-overflow-y-auto cqa-overflow-x-hidden\">\n\n <!-- AVAILABLE -->\n <div [hidden]=\"activeSubTab !== 'available'\" class=\"cqa-pb-6\">\n <ng-container *ngIf=\"!isLoadingAvailable; else availableLoadingTpl\">\n <ng-container *ngIf=\"hasAvailableData; else availableEmptyTpl\">\n <ng-container *ngIf=\"available.environment?.length\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF]\">Environment Variables</span>\n <a\n *ngIf=\"showManageEnvAndDataLink\"\n href=\"#\"\n (click)=\"onManageEnvAndData($event)\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[2px] cqa-text-xs cqa-font-medium cqa-text-[#4F46E5] cqa-no-underline hover:cqa-underline\">\n View full library<span class=\"cqa-text-sm cqa-leading-none\">›</span>\n </a>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-available-variable-row\n *ngFor=\"let v of available.environment; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [environmentName]=\"environmentName\"\n [expanded]=\"isExpanded('available', 'env', v.id)\"\n (expandedChange)=\"setExpanded('available', 'env', v.id, $event)\">\n </cqa-available-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"available.global?.length\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF]\">Global Data</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-available-variable-row\n *ngFor=\"let v of available.global; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [expanded]=\"isExpanded('available', 'global', v.id)\"\n (expandedChange)=\"setExpanded('available', 'global', v.id, $event)\">\n </cqa-available-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"available.testDataProfiles?.length\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF]\">Test Data Profiles</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-2\">\n <cqa-test-data-profile-card\n *ngFor=\"let p of available.testDataProfiles; trackBy: trackByTdp\"\n [name]=\"p.name\"\n [rowsCount]=\"p.rowsCount\"\n [columnsCount]=\"p.columnsCount\"\n [permission]=\"p.permission ?? null\"\n [environmentName]=\"p.envName\"\n [activeOnTestCase]=\"!!p.activeOnTestCase\">\n </cqa-test-data-profile-card>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #availableEmptyTpl>\n <cqa-empty-state\n *ngIf=\"searchTerm; else noAvailableAtAll\"\n title=\"No variables found\"\n [description]=\"'No variables match “' + searchTerm + '”.'\"\n [imageUrl]=\"searchEmptyImageUrl\">\n </cqa-empty-state>\n <ng-template #noAvailableAtAll>\n <cqa-empty-state\n title=\"No variables available\"\n description=\"There are no environment variables, global data, or test data profiles available for this test case yet.\"\n [imageUrl]=\"noDataImageUrl\">\n </cqa-empty-state>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-template #availableLoadingTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pt-2\">\n <div *ngFor=\"let _ of skeletonRows\" class=\"cqa-h-[40px] cqa-rounded-lg cqa-bg-[#F1F5F9] cqa-animate-pulse\"></div>\n </div>\n </ng-template>\n </div>\n\n <!-- USED IN TEST -->\n <div [hidden]=\"activeSubTab !== 'used'\" class=\"cqa-pb-6\">\n <ng-container *ngIf=\"!isLoadingUsed; else usedLoadingTpl\">\n <ng-container *ngIf=\"hasUsedData; else usedEmptyTpl\">\n <ng-container *ngIf=\"used.environment?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Environment Variables Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-used-variable-row\n *ngFor=\"let v of used.environment; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [stepLabel]=\"'Step ' + v.stepNumber\"\n [expanded]=\"isExpanded('used', 'env', v.id)\"\n (expandedChange)=\"setExpanded('used', 'env', v.id, $event)\">\n </cqa-used-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"used.global?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Global Data Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-used-variable-row\n *ngFor=\"let v of used.global; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [stepLabel]=\"'Step ' + v.stepNumber\"\n [expanded]=\"isExpanded('used', 'global', v.id)\"\n (expandedChange)=\"setExpanded('used', 'global', v.id, $event)\">\n </cqa-used-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"used.testDataProfiles?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Test Data Profiles Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-2\">\n <cqa-used-profile-row\n *ngFor=\"let p of used.testDataProfiles; trackBy: trackByUsedTdp\"\n [name]=\"p.name\"\n [envName]=\"p.envName\"\n [stepRange]=\"p.stepRange\">\n </cqa-used-profile-row>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #usedEmptyTpl>\n <cqa-empty-state\n *ngIf=\"searchTerm; else noUsedAtAll\"\n title=\"No usages found\"\n [description]=\"'No usages match “' + searchTerm + '”.'\"\n [imageUrl]=\"searchEmptyImageUrl\">\n </cqa-empty-state>\n <ng-template #noUsedAtAll>\n <cqa-empty-state\n title=\"No variables used yet\"\n description=\"This test case does not reference any environment variables, global data, or test data profiles.\"\n [imageUrl]=\"noDataImageUrl\">\n </cqa-empty-state>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-template #usedLoadingTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pt-2\">\n <div *ngFor=\"let _ of skeletonRows\" class=\"cqa-h-[40px] cqa-rounded-lg cqa-bg-[#F1F5F9] cqa-animate-pulse\"></div>\n </div>\n </ng-template>\n\n <div *ngIf=\"showManageEnvAndDataLink\" class=\"cqa-pt-2\">\n <a\n href=\"#\"\n (click)=\"onManageEnvAndData($event)\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[2px] cqa-text-xs cqa-font-medium cqa-text-[#4F46E5] cqa-no-underline hover:cqa-underline\">\n Manage in Environment & Data Management<span class=\"cqa-text-sm cqa-leading-none\">›</span>\n </a>\n </div>\n </div>\n </div>\n\n <!-- PARAMETERS \u2014 host slots <app-steps-variables> here. Uses *ngIf rather than\n [hidden] because the body needs `cqa-flex` to give the slotted form a bounded\n height, and Tailwind's `important: '.cqa-ui-root'` config compiles `cqa-flex`\n to `display: flex !important`, which would override `[hidden]`'s display: none\n and leak the projected content into Available/Used. -->\n <div\n *ngIf=\"activeSubTab === 'parameters'\"\n class=\"cqa-flex-1 cqa-min-h-0 cqa-flex cqa-flex-col\">\n <ng-content select=\"[parametersSlot]\"></ng-content>\n </div>\n</div>\n", components: [{ type: i1.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i2.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i3.AvailableVariableRowComponent, selector: "cqa-available-variable-row", inputs: ["name", "value", "type", "source", "permission", "environmentName", "expanded"], outputs: ["expandedChange"] }, { type: i4.TestDataProfileCardComponent, selector: "cqa-test-data-profile-card", inputs: ["name", "rowsCount", "columnsCount", "environmentName", "permission", "activeOnTestCase"] }, { type: i5.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }, { type: i6.UsedVariableRowComponent, selector: "cqa-used-variable-row", inputs: ["name", "value", "type", "source", "permission", "stepLabel", "expanded"], outputs: ["expandedChange"] }, { type: i7.UsedProfileRowComponent, selector: "cqa-used-profile-row", inputs: ["name", "envName", "stepRange"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
72
|
+
TestCaseVariablesPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestCaseVariablesPanelComponent, selector: "cqa-test-case-variables-panel", inputs: { searchTerm: "searchTerm", searchPlaceholder: "searchPlaceholder", environmentName: "environmentName", used: "used", isLoadingUsed: "isLoadingUsed", showManageEnvAndDataLink: "showManageEnvAndDataLink" }, outputs: { searchTermChange: "searchTermChange", searchCleared: "searchCleared", manageEnvAndDataClick: "manageEnvAndDataClick" }, host: { styleAttribute: "display: flex; flex: 1 1 auto; min-height: 0; flex-direction: column;", classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-w-full cqa-flex-1 cqa-min-h-0 cqa-bg-white\">\n <!-- Header: search + env banner. The segment strip and the Available / Parameters\n views were removed \u2014 the panel now shows only the Used in Test list. -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2 cqa-pb-3 cqa-bg-white\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchTerm\"\n [showClear]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\"\n (search)=\"onSearchSubmit($event)\"\n (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n\n <div class=\"cqa-text-xs cqa-text-[#475569] cqa-bg-[#F8FAFC] cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-rounded-md cqa-px-3 cqa-py-2\">\n Variables are resolved using: <span class=\"cqa-font-semibold cqa-text-[#0F172A]\">{{ bannerEnvLabel }}</span>\n </div>\n </div>\n\n <!-- USED IN TEST -->\n <div class=\"cqa-flex-1 cqa-min-h-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-pb-6\">\n <ng-container *ngIf=\"!isLoadingUsed; else usedLoadingTpl\">\n <ng-container *ngIf=\"hasUsedData; else usedEmptyTpl\">\n <ng-container *ngIf=\"used.environment?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Environment Variables Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-used-variable-row\n *ngFor=\"let v of used.environment; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [stepLabel]=\"'Step ' + v.stepNumber\"\n [expanded]=\"isExpanded('used', 'env', v.id)\"\n (expandedChange)=\"setExpanded('used', 'env', v.id, $event)\">\n </cqa-used-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"used.global?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Global Data Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-used-variable-row\n *ngFor=\"let v of used.global; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [stepLabel]=\"'Step ' + v.stepNumber\"\n [expanded]=\"isExpanded('used', 'global', v.id)\"\n (expandedChange)=\"setExpanded('used', 'global', v.id, $event)\">\n </cqa-used-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"used.testDataProfiles?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Test Data Profiles Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-2\">\n <cqa-used-profile-row\n *ngFor=\"let p of used.testDataProfiles; trackBy: trackByUsedTdp\"\n [name]=\"p.name\"\n [envName]=\"p.envName\"\n [stepRange]=\"p.stepRange\">\n </cqa-used-profile-row>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #usedEmptyTpl>\n <cqa-empty-state\n *ngIf=\"searchTerm; else noUsedAtAll\"\n title=\"No usages found\"\n [description]=\"'No usages match “' + searchTerm + '”.'\"\n [imageUrl]=\"searchEmptyImageUrl\">\n </cqa-empty-state>\n <ng-template #noUsedAtAll>\n <cqa-empty-state\n title=\"No variables used yet\"\n description=\"This test case does not reference any environment variables, global data, or test data profiles.\"\n [imageUrl]=\"noDataImageUrl\">\n </cqa-empty-state>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-template #usedLoadingTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pt-2\">\n <div *ngFor=\"let _ of skeletonRows\" class=\"cqa-h-[40px] cqa-rounded-lg cqa-bg-[#F1F5F9] cqa-animate-pulse\"></div>\n </div>\n </ng-template>\n\n <div *ngIf=\"showManageEnvAndDataLink\" class=\"cqa-pt-2\">\n <a\n href=\"#\"\n (click)=\"onManageEnvAndData($event)\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[2px] cqa-text-xs cqa-font-medium cqa-text-[#4F46E5] cqa-no-underline hover:cqa-underline\">\n Manage in Environment & Data Management<span class=\"cqa-text-sm cqa-leading-none\">›</span>\n </a>\n </div>\n </div>\n</div>\n", components: [{ type: i1.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i2.UsedVariableRowComponent, selector: "cqa-used-variable-row", inputs: ["name", "value", "type", "source", "permission", "stepLabel", "expanded"], outputs: ["expandedChange"] }, { type: i3.UsedProfileRowComponent, selector: "cqa-used-profile-row", inputs: ["name", "envName", "stepRange"] }, { type: i4.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["preset", "imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
101
73
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestCaseVariablesPanelComponent, decorators: [{
|
|
102
74
|
type: Component,
|
|
103
75
|
args: [{ selector: 'cqa-test-case-variables-panel', host: {
|
|
104
76
|
class: 'cqa-ui-root',
|
|
105
77
|
style: 'display: flex; flex: 1 1 auto; min-height: 0; flex-direction: column;',
|
|
106
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-flex-col cqa-w-full cqa-flex-1 cqa-min-h-0 cqa-bg-white\">\n <!-- Header: search + env banner + segment-control. Not sticky \u2014 laid out as a normal block above the scroll body so the Parameters tab can grant the slotted form full height. -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2 cqa-pb-3 cqa-bg-white\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchTerm\"\n [showClear]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\"\n (search)=\"onSearchSubmit($event)\"\n (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n\n <div class=\"cqa-text-xs cqa-text-[#475569] cqa-bg-[#F8FAFC] cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-rounded-md cqa-px-3 cqa-py-2\">\n Variables are resolved using: <span class=\"cqa-font-semibold cqa-text-[#0F172A]\">{{ bannerEnvLabel }}</span>\n </div>\n\n <cqa-segment-control\n [segments]=\"topSegments\"\n [value]=\"activeSubTab\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Scrolling body for Available + Used. -->\n <div\n [hidden]=\"activeSubTab === 'parameters'\"\n class=\"cqa-flex-1 cqa-min-h-0 cqa-overflow-y-auto cqa-overflow-x-hidden\">\n\n <!-- AVAILABLE -->\n <div [hidden]=\"activeSubTab !== 'available'\" class=\"cqa-pb-6\">\n <ng-container *ngIf=\"!isLoadingAvailable; else availableLoadingTpl\">\n <ng-container *ngIf=\"hasAvailableData; else availableEmptyTpl\">\n <ng-container *ngIf=\"available.environment?.length\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF]\">Environment Variables</span>\n <a\n *ngIf=\"showManageEnvAndDataLink\"\n href=\"#\"\n (click)=\"onManageEnvAndData($event)\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[2px] cqa-text-xs cqa-font-medium cqa-text-[#4F46E5] cqa-no-underline hover:cqa-underline\">\n View full library<span class=\"cqa-text-sm cqa-leading-none\">›</span>\n </a>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-available-variable-row\n *ngFor=\"let v of available.environment; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [environmentName]=\"environmentName\"\n [expanded]=\"isExpanded('available', 'env', v.id)\"\n (expandedChange)=\"setExpanded('available', 'env', v.id, $event)\">\n </cqa-available-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"available.global?.length\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF]\">Global Data</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-available-variable-row\n *ngFor=\"let v of available.global; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [expanded]=\"isExpanded('available', 'global', v.id)\"\n (expandedChange)=\"setExpanded('available', 'global', v.id, $event)\">\n </cqa-available-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"available.testDataProfiles?.length\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF]\">Test Data Profiles</span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-2\">\n <cqa-test-data-profile-card\n *ngFor=\"let p of available.testDataProfiles; trackBy: trackByTdp\"\n [name]=\"p.name\"\n [rowsCount]=\"p.rowsCount\"\n [columnsCount]=\"p.columnsCount\"\n [permission]=\"p.permission ?? null\"\n [environmentName]=\"p.envName\"\n [activeOnTestCase]=\"!!p.activeOnTestCase\">\n </cqa-test-data-profile-card>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #availableEmptyTpl>\n <cqa-empty-state\n *ngIf=\"searchTerm; else noAvailableAtAll\"\n title=\"No variables found\"\n [description]=\"'No variables match “' + searchTerm + '”.'\"\n [imageUrl]=\"searchEmptyImageUrl\">\n </cqa-empty-state>\n <ng-template #noAvailableAtAll>\n <cqa-empty-state\n title=\"No variables available\"\n description=\"There are no environment variables, global data, or test data profiles available for this test case yet.\"\n [imageUrl]=\"noDataImageUrl\">\n </cqa-empty-state>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-template #availableLoadingTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pt-2\">\n <div *ngFor=\"let _ of skeletonRows\" class=\"cqa-h-[40px] cqa-rounded-lg cqa-bg-[#F1F5F9] cqa-animate-pulse\"></div>\n </div>\n </ng-template>\n </div>\n\n <!-- USED IN TEST -->\n <div [hidden]=\"activeSubTab !== 'used'\" class=\"cqa-pb-6\">\n <ng-container *ngIf=\"!isLoadingUsed; else usedLoadingTpl\">\n <ng-container *ngIf=\"hasUsedData; else usedEmptyTpl\">\n <ng-container *ngIf=\"used.environment?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Environment Variables Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-used-variable-row\n *ngFor=\"let v of used.environment; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [stepLabel]=\"'Step ' + v.stepNumber\"\n [expanded]=\"isExpanded('used', 'env', v.id)\"\n (expandedChange)=\"setExpanded('used', 'env', v.id, $event)\">\n </cqa-used-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"used.global?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Global Data Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-used-variable-row\n *ngFor=\"let v of used.global; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [stepLabel]=\"'Step ' + v.stepNumber\"\n [expanded]=\"isExpanded('used', 'global', v.id)\"\n (expandedChange)=\"setExpanded('used', 'global', v.id, $event)\">\n </cqa-used-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"used.testDataProfiles?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Test Data Profiles Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-2\">\n <cqa-used-profile-row\n *ngFor=\"let p of used.testDataProfiles; trackBy: trackByUsedTdp\"\n [name]=\"p.name\"\n [envName]=\"p.envName\"\n [stepRange]=\"p.stepRange\">\n </cqa-used-profile-row>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #usedEmptyTpl>\n <cqa-empty-state\n *ngIf=\"searchTerm; else noUsedAtAll\"\n title=\"No usages found\"\n [description]=\"'No usages match “' + searchTerm + '”.'\"\n [imageUrl]=\"searchEmptyImageUrl\">\n </cqa-empty-state>\n <ng-template #noUsedAtAll>\n <cqa-empty-state\n title=\"No variables used yet\"\n description=\"This test case does not reference any environment variables, global data, or test data profiles.\"\n [imageUrl]=\"noDataImageUrl\">\n </cqa-empty-state>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-template #usedLoadingTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pt-2\">\n <div *ngFor=\"let _ of skeletonRows\" class=\"cqa-h-[40px] cqa-rounded-lg cqa-bg-[#F1F5F9] cqa-animate-pulse\"></div>\n </div>\n </ng-template>\n\n <div *ngIf=\"showManageEnvAndDataLink\" class=\"cqa-pt-2\">\n <a\n href=\"#\"\n (click)=\"onManageEnvAndData($event)\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[2px] cqa-text-xs cqa-font-medium cqa-text-[#4F46E5] cqa-no-underline hover:cqa-underline\">\n Manage in Environment & Data Management<span class=\"cqa-text-sm cqa-leading-none\">›</span>\n </a>\n </div>\n </div>\n </div>\n\n <!-- PARAMETERS \u2014 host slots <app-steps-variables> here. Uses *ngIf rather than\n [hidden] because the body needs `cqa-flex` to give the slotted form a bounded\n height, and Tailwind's `important: '.cqa-ui-root'` config compiles `cqa-flex`\n to `display: flex !important`, which would override `[hidden]`'s display: none\n and leak the projected content into Available/Used. -->\n <div\n *ngIf=\"activeSubTab === 'parameters'\"\n class=\"cqa-flex-1 cqa-min-h-0 cqa-flex cqa-flex-col\">\n <ng-content select=\"[parametersSlot]\"></ng-content>\n </div>\n</div>\n" }]
|
|
107
|
-
}], propDecorators: {
|
|
108
|
-
type: Input
|
|
109
|
-
}], searchTerm: [{
|
|
78
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cqa-flex cqa-flex-col cqa-w-full cqa-flex-1 cqa-min-h-0 cqa-bg-white\">\n <!-- Header: search + env banner. The segment strip and the Available / Parameters\n views were removed \u2014 the panel now shows only the Used in Test list. -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2 cqa-pb-3 cqa-bg-white\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchTerm\"\n [showClear]=\"true\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\"\n (search)=\"onSearchSubmit($event)\"\n (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n\n <div class=\"cqa-text-xs cqa-text-[#475569] cqa-bg-[#F8FAFC] cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-rounded-md cqa-px-3 cqa-py-2\">\n Variables are resolved using: <span class=\"cqa-font-semibold cqa-text-[#0F172A]\">{{ bannerEnvLabel }}</span>\n </div>\n </div>\n\n <!-- USED IN TEST -->\n <div class=\"cqa-flex-1 cqa-min-h-0 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-pb-6\">\n <ng-container *ngIf=\"!isLoadingUsed; else usedLoadingTpl\">\n <ng-container *ngIf=\"hasUsedData; else usedEmptyTpl\">\n <ng-container *ngIf=\"used.environment?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Environment Variables Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-used-variable-row\n *ngFor=\"let v of used.environment; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [stepLabel]=\"'Step ' + v.stepNumber\"\n [expanded]=\"isExpanded('used', 'env', v.id)\"\n (expandedChange)=\"setExpanded('used', 'env', v.id, $event)\">\n </cqa-used-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"used.global?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Global Data Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-4\">\n <cqa-used-variable-row\n *ngFor=\"let v of used.global; trackBy: trackByRow\"\n [name]=\"v.name\"\n [value]=\"v.value\"\n [type]=\"v.type\"\n [source]=\"v.source\"\n [permission]=\"v.permission\"\n [stepLabel]=\"'Step ' + v.stepNumber\"\n [expanded]=\"isExpanded('used', 'global', v.id)\"\n (expandedChange)=\"setExpanded('used', 'global', v.id, $event)\">\n </cqa-used-variable-row>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"used.testDataProfiles?.length\">\n <div class=\"cqa-text-[12px] cqa-font-semibold cqa-text-[#9CA3AF] cqa-mb-2\">Test Data Profiles Used</div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[6px] cqa-mb-2\">\n <cqa-used-profile-row\n *ngFor=\"let p of used.testDataProfiles; trackBy: trackByUsedTdp\"\n [name]=\"p.name\"\n [envName]=\"p.envName\"\n [stepRange]=\"p.stepRange\">\n </cqa-used-profile-row>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-template #usedEmptyTpl>\n <cqa-empty-state\n *ngIf=\"searchTerm; else noUsedAtAll\"\n title=\"No usages found\"\n [description]=\"'No usages match “' + searchTerm + '”.'\"\n [imageUrl]=\"searchEmptyImageUrl\">\n </cqa-empty-state>\n <ng-template #noUsedAtAll>\n <cqa-empty-state\n title=\"No variables used yet\"\n description=\"This test case does not reference any environment variables, global data, or test data profiles.\"\n [imageUrl]=\"noDataImageUrl\">\n </cqa-empty-state>\n </ng-template>\n </ng-template>\n </ng-container>\n\n <ng-template #usedLoadingTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-pt-2\">\n <div *ngFor=\"let _ of skeletonRows\" class=\"cqa-h-[40px] cqa-rounded-lg cqa-bg-[#F1F5F9] cqa-animate-pulse\"></div>\n </div>\n </ng-template>\n\n <div *ngIf=\"showManageEnvAndDataLink\" class=\"cqa-pt-2\">\n <a\n href=\"#\"\n (click)=\"onManageEnvAndData($event)\"\n class=\"cqa-inline-flex cqa-items-center cqa-gap-[2px] cqa-text-xs cqa-font-medium cqa-text-[#4F46E5] cqa-no-underline hover:cqa-underline\">\n Manage in Environment & Data Management<span class=\"cqa-text-sm cqa-leading-none\">›</span>\n </a>\n </div>\n </div>\n</div>\n" }]
|
|
79
|
+
}], propDecorators: { searchTerm: [{
|
|
110
80
|
type: Input
|
|
111
81
|
}], searchPlaceholder: [{
|
|
112
82
|
type: Input
|
|
113
83
|
}], environmentName: [{
|
|
114
84
|
type: Input
|
|
115
|
-
}], available: [{
|
|
116
|
-
type: Input
|
|
117
85
|
}], used: [{
|
|
118
86
|
type: Input
|
|
119
|
-
}], isLoadingAvailable: [{
|
|
120
|
-
type: Input
|
|
121
87
|
}], isLoadingUsed: [{
|
|
122
88
|
type: Input
|
|
123
89
|
}], showManageEnvAndDataLink: [{
|
|
124
90
|
type: Input
|
|
125
|
-
}], activeSubTabChange: [{
|
|
126
|
-
type: Output
|
|
127
91
|
}], searchTermChange: [{
|
|
128
92
|
type: Output
|
|
129
93
|
}], searchCleared: [{
|
|
@@ -131,4 +95,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
131
95
|
}], manageEnvAndDataClick: [{
|
|
132
96
|
type: Output
|
|
133
97
|
}] } });
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdmFyaWFibGVzLXBhbmVsL3ZhcmlhYmxlcy1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3ZhcmlhYmxlcy1wYW5lbC92YXJpYWJsZXMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7Ozs7Ozs7QUFvQmhGLE1BQU0sT0FBTywrQkFBK0I7SUFUNUM7UUFVVyxpQkFBWSxHQUFzQixXQUFXLENBQUM7UUFDOUMsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixzQkFBaUIsR0FBRyxXQUFXLENBQUM7UUFFaEMsY0FBUyxHQUF5QixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RixTQUFJLEdBQWlCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzNFLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0Qiw2QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFFL0IsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFDM0QscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM5QyxrQkFBYSxHQUFHLElBQUksWUFBWSxF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QXVCLENBQUMsTUFBTTs4QkFHdEMsWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFFSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2VnbWVudE9wdGlvbiB9IGZyb20gJy4uLy4uL3NlZ21lbnQtY29udHJvbC9zZWdtZW50LWNvbnRyb2wuY29tcG9uZW50JztcbmltcG9ydCB7IEVNUFRZX1NUQVRFX0lNQUdFUyB9IGZyb20gJy4uLy4uL2Fzc2V0cy9pbWFnZXMvaW1hZ2UtYXNzZXRzLmNvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdmFpbGFibGVUZHBWbSxcbiAgQXZhaWxhYmxlVmFyaWFibGVWbSxcbiAgQXZhaWxhYmxlVmFyaWFibGVzVm0sXG4gIFVzZWRJblRlc3RWbSxcbiAgVXNlZFRkcFZtLFxuICBVc2VkVmFyaWFibGVWbSxcbiAgVmFyaWFibGVzUGFuZWxUYWIsXG59IGZyb20gJy4vdmFyaWFibGVzLXBhbmVsLm1vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWNhc2UtdmFyaWFibGVzLXBhbmVsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZhcmlhYmxlcy1wYW5lbC5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2NxYS11aS1yb290JyxcbiAgICBzdHlsZTogJ2Rpc3BsYXk6IGZsZXg7IGZsZXg6IDEgMSBhdXRvOyBtaW4taGVpZ2h0OiAwOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOycsXG4gIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0Q2FzZVZhcmlhYmxlc1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgYWN0aXZlU3ViVGFiOiBWYXJpYWJsZXNQYW5lbFRhYiA9ICdhdmFpbGFibGUnO1xuICBASW5wdXQoKSBzZWFyY2hUZXJtID0gJyc7XG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyID0gJ1NlYXJjaCBieSc7XG4gIEBJbnB1dCgpIGVudmlyb25tZW50TmFtZT86IHN0cmluZztcbiAgQElucHV0KCkgYXZhaWxhYmxlOiBBdmFpbGFibGVWYXJpYWJsZXNWbSA9IHsgZW52aXJvbm1lbnQ6IFtdLCBnbG9iYWw6IFtdLCB0ZXN0RGF0YVByb2ZpbGVzOiBbXSB9O1xuICBASW5wdXQoKSB1c2VkOiBVc2VkSW5UZXN0Vm0gPSB7IGVudmlyb25tZW50OiBbXSwgZ2xvYmFsOiBbXSwgdGVzdERhdGFQcm9maWxlczogW10gfTtcbiAgQElucHV0KCkgaXNMb2FkaW5nQXZhaWxhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTG9hZGluZ1VzZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd01hbmFnZUVudkFuZERhdGFMaW5rID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgYWN0aXZlU3ViVGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxWYXJpYWJsZXNQYW5lbFRhYj4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaFRlcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHNlYXJjaENsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBtYW5hZ2VFbnZBbmREYXRhQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcmVhZG9ubHkgdG9wU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnQXZhaWxhYmxlJywgdmFsdWU6ICdhdmFpbGFibGUnIH0sXG4gICAgeyBsYWJlbDogJ1VzZWQgaW4gVGVzdCcsIHZhbHVlOiAndXNlZCcgfSxcbiAgICB7IGxhYmVsOiAnUGFyYW1ldGVycycsIHZhbHVlOiAncGFyYW1ldGVycycgfSxcbiAgXTtcblxuICByZWFkb25seSBza2VsZXRvblJvd3M6IG51bWJlcltdID0gWzAsIDEsIDIsIDNdO1xuXG4gIC8qKiBFbXB0eS1zdGF0ZSBpbWFnZXJ5IOKAlCBleHBvc2VkIHRvIHRoZSB0ZW1wbGF0ZSBzbyB3ZSBjYW4gYmluZCBbaW1hZ2VVcmxdLiAqL1xuICByZWFkb25seSBzZWFyY2hFbXB0eUltYWdlVXJsID0gRU1QVFlfU1RBVEVfSU1BR0VTLlNFQVJDSF9ERUJVRztcbiAgcmVhZG9ubHkgbm9EYXRhSW1hZ2VVcmwgPSBFTVBUWV9TVEFURV9JTUFHRVMuQ0hFQ0tMSVNUX0FERDtcblxuICAvKiogUGVyLXJvdyBleHBhbmRlZCBzdGF0ZS4gS2V5IGZvcm1hdDogYDx0YWI+Ojxncm91cD46PGlkPmAuICovXG4gIGV4cGFuZGVkS2V5czogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2F2YWlsYWJsZSddIHx8IGNoYW5nZXNbJ3VzZWQnXSkge1xuICAgICAgLy8gRHJvcCBleHBhbnNpb24gc3RhdGUgd2hlbiB0aGUgZGF0YSBzZXQgaXMgcmVwbGFjZWQgd2hvbGVzYWxlLlxuICAgICAgdGhpcy5leHBhbmRlZEtleXMgPSB7fTtcbiAgICB9XG4gIH1cblxuICBvblNlZ21lbnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gJ2F2YWlsYWJsZScgfHwgdmFsdWUgPT09ICd1c2VkJyB8fCB2YWx1ZSA9PT0gJ3BhcmFtZXRlcnMnKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN1YlRhYiA9IHZhbHVlO1xuICAgICAgdGhpcy5hY3RpdmVTdWJUYWJDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2hWYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWUgPz8gJyc7XG4gICAgdGhpcy5zZWFyY2hUZXJtQ2hhbmdlLmVtaXQodGhpcy5zZWFyY2hUZXJtKTtcbiAgfVxuXG4gIG9uU2VhcmNoU3VibWl0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRlcm1DaGFuZ2UuZW1pdCh2YWx1ZSA/PyAnJyk7XG4gIH1cblxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5zZWFyY2hDbGVhcmVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uTWFuYWdlRW52QW5kRGF0YShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubWFuYWdlRW52QW5kRGF0YUNsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIGlzRXhwYW5kZWQodGFiOiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcsIGlkOiBudW1iZXIgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmV4cGFuZGVkS2V5c1tgJHt0YWJ9OiR7Z3JvdXB9OiR7aWR9YF07XG4gIH1cblxuICBzZXRFeHBhbmRlZCh0YWI6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgaWQ6IG51bWJlciB8IHN0cmluZywgZXhwYW5kZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkS2V5c1tgJHt0YWJ9OiR7Z3JvdXB9OiR7aWR9YF0gPSBleHBhbmRlZDtcbiAgfVxuXG4gIHRyYWNrQnlSb3coX2k6IG51bWJlciwgaXRlbTogeyBpZDogbnVtYmVyIHwgc3RyaW5nIH0pOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIHJldHVybiBpdGVtPy5pZCA/PyBfaTtcbiAgfVxuXG4gIHRyYWNrQnlUZHAoX2k6IG51bWJlciwgaXRlbTogQXZhaWxhYmxlVGRwVm0pOiBudW1iZXIge1xuICAgIHJldHVybiBpdGVtPy5pZCA/PyBfaTtcbiAgfVxuXG4gIHRyYWNrQnlVc2VkVGRwKF9pOiBudW1iZXIsIGl0ZW06IFVzZWRUZHBWbSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGl0ZW0/LmF0dGFjaG1lbnRJZCA/PyBfaTtcbiAgfVxuXG4gIGdldCBiYW5uZXJFbnZMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50TmFtZSAmJiB0aGlzLmVudmlyb25tZW50TmFtZS50cmltKCkubGVuZ3RoXG4gICAgICA/IHRoaXMuZW52aXJvbm1lbnROYW1lXG4gICAgICA6ICd0aGlzIHRlc3QgY2FzZSc7XG4gIH1cblxuICBnZXQgaGFzQXZhaWxhYmxlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuYXZhaWxhYmxlPy5lbnZpcm9ubWVudD8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgKHRoaXMuYXZhaWxhYmxlPy5nbG9iYWw/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICh0aGlzLmF2YWlsYWJsZT8udGVzdERhdGFQcm9maWxlcz8ubGVuZ3RoID8/IDApID4gMFxuICAgICk7XG4gIH1cblxuICBnZXQgaGFzVXNlZERhdGEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnVzZWQ/LmVudmlyb25tZW50Py5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAodGhpcy51c2VkPy5nbG9iYWw/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICh0aGlzLnVzZWQ/LnRlc3REYXRhUHJvZmlsZXM/Lmxlbmd0aCA/PyAwKSA+IDBcbiAgICApO1xuICB9XG5cbiAgLy8gQXZvaWQgdW51c2VkLWltcG9ydCB3YXJuaW5nIGluIHRlbXBsYXRlLXN0cmljdCBjaGVja3MgZm9yIFZNcy5cbiAgYXNFbnZWYXIoaXRlbTogQXZhaWxhYmxlVmFyaWFibGVWbSk6IEF2YWlsYWJsZVZhcmlhYmxlVm0geyByZXR1cm4gaXRlbTsgfVxuICBhc1VzZWRWYXIoaXRlbTogVXNlZFZhcmlhYmxlVm0pOiBVc2VkVmFyaWFibGVWbSB7IHJldHVybiBpdGVtOyB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGwgY3FhLWZsZXgtMSBjcWEtbWluLWgtMCBjcWEtYmctd2hpdGVcIj5cbiAgPCEtLSBIZWFkZXI6IHNlYXJjaCArIGVudiBiYW5uZXIgKyBzZWdtZW50LWNvbnRyb2wuIE5vdCBzdGlja3kg4oCUIGxhaWQgb3V0IGFzIGEgbm9ybWFsIGJsb2NrIGFib3ZlIHRoZSBzY3JvbGwgYm9keSBzbyB0aGUgUGFyYW1ldGVycyB0YWIgY2FuIGdyYW50IHRoZSBzbG90dGVkIGZvcm0gZnVsbCBoZWlnaHQuIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMyBjcWEtcHQtMiBjcWEtcGItMyBjcWEtYmctd2hpdGVcIj5cbiAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICBbdmFsdWVdPVwic2VhcmNoVGVybVwiXG4gICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlYXJjaFZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgKHNlYXJjaCk9XCJvblNlYXJjaFN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgIChjbGVhcmVkKT1cIm9uU2VhcmNoQ2xlYXJlZCgpXCI+XG4gICAgPC9jcWEtc2VhcmNoLWJhcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzQ3NTU2OV0gY3FhLWJnLVsjRjhGQUZDXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UyRThGMF0gY3FhLXJvdW5kZWQtbWQgY3FhLXB4LTMgY3FhLXB5LTJcIj5cbiAgICAgIFZhcmlhYmxlcyBhcmUgcmVzb2x2ZWQgdXNpbmc6IDxzcGFuIGNsYXNzPVwiY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMwRjE3MkFdXCI+e3sgYmFubmVyRW52TGFiZWwgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8Y3FhLXNlZ21lbnQtY29udHJvbFxuICAgICAgW3NlZ21lbnRzXT1cInRvcFNlZ21lbnRzXCJcbiAgICAgIFt2YWx1ZV09XCJhY3RpdmVTdWJUYWJcIlxuICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlZ21lbnRDaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTY3JvbGxpbmcgYm9keSBmb3IgQXZhaWxhYmxlICsgVXNlZC4gLS0+XG4gIDxkaXZcbiAgICBbaGlkZGVuXT1cImFjdGl2ZVN1YlRhYiA9PT0gJ3BhcmFtZXRlcnMnXCJcbiAgICBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi1oLTAgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtb3ZlcmZsb3cteC1oaWRkZW5cIj5cblxuICAgIDwhLS0gQVZBSUxBQkxFIC0tPlxuICAgIDxkaXYgW2hpZGRlbl09XCJhY3RpdmVTdWJUYWIgIT09ICdhdmFpbGFibGUnXCIgY2xhc3M9XCJjcWEtcGItNlwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdBdmFpbGFibGU7IGVsc2UgYXZhaWxhYmxlTG9hZGluZ1RwbFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQXZhaWxhYmxlRGF0YTsgZWxzZSBhdmFpbGFibGVFbXB0eVRwbFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdmFpbGFibGUuZW52aXJvbm1lbnQ/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtbWItMlwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzlDQTNBRl1cIj5FbnZpcm9ubWVudCBWYXJpYWJsZXM8L3NwYW4+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93TWFuYWdlRW52QW5kRGF0YUxpbmtcIlxuICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NYW5hZ2VFbnZBbmREYXRhKCRldmVudClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC1bMnB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyM0RjQ2RTVdIGNxYS1uby11bmRlcmxpbmUgaG92ZXI6Y3FhLXVuZGVybGluZVwiPlxuICAgICAgICAgICAgICAgIFZpZXcgZnVsbCBsaWJyYXJ5PHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy1ub25lXCI+JnJzYXF1bzs8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVs2cHhdIGNxYS1tYi00XCI+XG4gICAgICAgICAgICAgIDxjcWEtYXZhaWxhYmxlLXZhcmlhYmxlLXJvd1xuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2IG9mIGF2YWlsYWJsZS5lbnZpcm9ubWVudDsgdHJhY2tCeTogdHJhY2tCeVJvd1wiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwidi5uYW1lXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwidi50eXBlXCJcbiAgICAgICAgICAgICAgICBbc291cmNlXT1cInYuc291cmNlXCJcbiAgICAgICAgICAgICAgICBbcGVybWlzc2lvbl09XCJ2LnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICAgIFtlbnZpcm9ubWVudE5hbWVdPVwiZW52aXJvbm1lbnROYW1lXCJcbiAgICAgICAgICAgICAgICBbZXhwYW5kZWRdPVwiaXNFeHBhbmRlZCgnYXZhaWxhYmxlJywgJ2VudicsIHYuaWQpXCJcbiAgICAgICAgICAgICAgICAoZXhwYW5kZWRDaGFuZ2UpPVwic2V0RXhwYW5kZWQoJ2F2YWlsYWJsZScsICdlbnYnLCB2LmlkLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWF2YWlsYWJsZS12YXJpYWJsZS1yb3c+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdmFpbGFibGUuZ2xvYmFsPy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM5Q0EzQUZdXCI+R2xvYmFsIERhdGE8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bNnB4XSBjcWEtbWItNFwiPlxuICAgICAgICAgICAgICA8Y3FhLWF2YWlsYWJsZS12YXJpYWJsZS1yb3dcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdiBvZiBhdmFpbGFibGUuZ2xvYmFsOyB0cmFja0J5OiB0cmFja0J5Um93XCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJ2Lm5hbWVcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJ2LnR5cGVcIlxuICAgICAgICAgICAgICAgIFtzb3VyY2VdPVwidi5zb3VyY2VcIlxuICAgICAgICAgICAgICAgIFtwZXJtaXNzaW9uXT1cInYucGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgW2V4cGFuZGVkXT1cImlzRXhwYW5kZWQoJ2F2YWlsYWJsZScsICdnbG9iYWwnLCB2LmlkKVwiXG4gICAgICAgICAgICAgICAgKGV4cGFuZGVkQ2hhbmdlKT1cInNldEV4cGFuZGVkKCdhdmFpbGFibGUnLCAnZ2xvYmFsJywgdi5pZCwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1hdmFpbGFibGUtdmFyaWFibGUtcm93PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXZhaWxhYmxlLnRlc3REYXRhUHJvZmlsZXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtbWItMlwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzlDQTNBRl1cIj5UZXN0IERhdGEgUHJvZmlsZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bNnB4XSBjcWEtbWItMlwiPlxuICAgICAgICAgICAgICA8Y3FhLXRlc3QtZGF0YS1wcm9maWxlLWNhcmRcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcCBvZiBhdmFpbGFibGUudGVzdERhdGFQcm9maWxlczsgdHJhY2tCeTogdHJhY2tCeVRkcFwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwicC5uYW1lXCJcbiAgICAgICAgICAgICAgICBbcm93c0NvdW50XT1cInAucm93c0NvdW50XCJcbiAgICAgICAgICAgICAgICBbY29sdW1uc0NvdW50XT1cInAuY29sdW1uc0NvdW50XCJcbiAgICAgICAgICAgICAgICBbcGVybWlzc2lvbl09XCJwLnBlcm1pc3Npb24gPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgW2Vudmlyb25tZW50TmFtZV09XCJwLmVudk5hbWVcIlxuICAgICAgICAgICAgICAgIFthY3RpdmVPblRlc3RDYXNlXT1cIiEhcC5hY3RpdmVPblRlc3RDYXNlXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXRlc3QtZGF0YS1wcm9maWxlLWNhcmQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNhdmFpbGFibGVFbXB0eVRwbD5cbiAgICAgICAgICA8Y3FhLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRlcm07IGVsc2Ugbm9BdmFpbGFibGVBdEFsbFwiXG4gICAgICAgICAgICB0aXRsZT1cIk5vIHZhcmlhYmxlcyBmb3VuZFwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiJ05vIHZhcmlhYmxlcyBtYXRjaCAmbGRxdW87JyArIHNlYXJjaFRlcm0gKyAnJnJkcXVvOy4nXCJcbiAgICAgICAgICAgIFtpbWFnZVVybF09XCJzZWFyY2hFbXB0eUltYWdlVXJsXCI+XG4gICAgICAgICAgPC9jcWEtZW1wdHktc3RhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNub0F2YWlsYWJsZUF0QWxsPlxuICAgICAgICAgICAgPGNxYS1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICB0aXRsZT1cIk5vIHZhcmlhYmxlcyBhdmFpbGFibGVcIlxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIlRoZXJlIGFyZSBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGdsb2JhbCBkYXRhLCBvciB0ZXN0IGRhdGEgcHJvZmlsZXMgYXZhaWxhYmxlIGZvciB0aGlzIHRlc3QgY2FzZSB5ZXQuXCJcbiAgICAgICAgICAgICAgW2ltYWdlVXJsXT1cIm5vRGF0YUltYWdlVXJsXCI+XG4gICAgICAgICAgICA8L2NxYS1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjYXZhaWxhYmxlTG9hZGluZ1RwbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLXB0LTJcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBfIG9mIHNrZWxldG9uUm93c1wiIGNsYXNzPVwiY3FhLWgtWzQwcHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0YxRjVGOV0gY3FhLWFuaW1hdGUtcHVsc2VcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBVU0VEIElOIFRFU1QgLS0+XG4gICAgPGRpdiBbaGlkZGVuXT1cImFjdGl2ZVN1YlRhYiAhPT0gJ3VzZWQnXCIgY2xhc3M9XCJjcWEtcGItNlwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdVc2VkOyBlbHNlIHVzZWRMb2FkaW5nVHBsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNVc2VkRGF0YTsgZWxzZSB1c2VkRW1wdHlUcGxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlZC5lbnZpcm9ubWVudD8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtbWItMlwiPkVudmlyb25tZW50IFZhcmlhYmxlcyBVc2VkPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzZweF0gY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgPGNxYS11c2VkLXZhcmlhYmxlLXJvd1xuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2IG9mIHVzZWQuZW52aXJvbm1lbnQ7IHRyYWNrQnk6IHRyYWNrQnlSb3dcIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cInYubmFtZVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInYudmFsdWVcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cInYudHlwZVwiXG4gICAgICAgICAgICAgICAgW3NvdXJjZV09XCJ2LnNvdXJjZVwiXG4gICAgICAgICAgICAgICAgW3Blcm1pc3Npb25dPVwidi5wZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICBbc3RlcExhYmVsXT1cIidTdGVwICcgKyB2LnN0ZXBOdW1iZXJcIlxuICAgICAgICAgICAgICAgIFtleHBhbmRlZF09XCJpc0V4cGFuZGVkKCd1c2VkJywgJ2VudicsIHYuaWQpXCJcbiAgICAgICAgICAgICAgICAoZXhwYW5kZWRDaGFuZ2UpPVwic2V0RXhwYW5kZWQoJ3VzZWQnLCAnZW52Jywgdi5pZCwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS11c2VkLXZhcmlhYmxlLXJvdz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZWQuZ2xvYmFsPy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS1tYi0yXCI+R2xvYmFsIERhdGEgVXNlZDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVs2cHhdIGNxYS1tYi00XCI+XG4gICAgICAgICAgICAgIDxjcWEtdXNlZC12YXJpYWJsZS1yb3dcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdiBvZiB1c2VkLmdsb2JhbDsgdHJhY2tCeTogdHJhY2tCeVJvd1wiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwidi5uYW1lXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwidi50eXBlXCJcbiAgICAgICAgICAgICAgICBbc291cmNlXT1cInYuc291cmNlXCJcbiAgICAgICAgICAgICAgICBbcGVybWlzc2lvbl09XCJ2LnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICAgIFtzdGVwTGFiZWxdPVwiJ1N0ZXAgJyArIHYuc3RlcE51bWJlclwiXG4gICAgICAgICAgICAgICAgW2V4cGFuZGVkXT1cImlzRXhwYW5kZWQoJ3VzZWQnLCAnZ2xvYmFsJywgdi5pZClcIlxuICAgICAgICAgICAgICAgIChleHBhbmRlZENoYW5nZSk9XCJzZXRFeHBhbmRlZCgndXNlZCcsICdnbG9iYWwnLCB2LmlkLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXVzZWQtdmFyaWFibGUtcm93PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlZC50ZXN0RGF0YVByb2ZpbGVzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyM5Q0EzQUZdIGNxYS1tYi0yXCI+VGVzdCBEYXRhIFByb2ZpbGVzIFVzZWQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bNnB4XSBjcWEtbWItMlwiPlxuICAgICAgICAgICAgICA8Y3FhLXVzZWQtcHJvZmlsZS1yb3dcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcCBvZiB1c2VkLnRlc3REYXRhUHJvZmlsZXM7IHRyYWNrQnk6IHRyYWNrQnlVc2VkVGRwXCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJwLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtlbnZOYW1lXT1cInAuZW52TmFtZVwiXG4gICAgICAgICAgICAgICAgW3N0ZXBSYW5nZV09XCJwLnN0ZXBSYW5nZVwiPlxuICAgICAgICAgICAgICA8L2NxYS11c2VkLXByb2ZpbGUtcm93PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdXNlZEVtcHR5VHBsPlxuICAgICAgICAgIDxjcWEtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGVybTsgZWxzZSBub1VzZWRBdEFsbFwiXG4gICAgICAgICAgICB0aXRsZT1cIk5vIHVzYWdlcyBmb3VuZFwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiJ05vIHVzYWdlcyBtYXRjaCAmbGRxdW87JyArIHNlYXJjaFRlcm0gKyAnJnJkcXVvOy4nXCJcbiAgICAgICAgICAgIFtpbWFnZVVybF09XCJzZWFyY2hFbXB0eUltYWdlVXJsXCI+XG4gICAgICAgICAgPC9jcWEtZW1wdHktc3RhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNub1VzZWRBdEFsbD5cbiAgICAgICAgICAgIDxjcWEtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgdGl0bGU9XCJObyB2YXJpYWJsZXMgdXNlZCB5ZXRcIlxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIlRoaXMgdGVzdCBjYXNlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBnbG9iYWwgZGF0YSwgb3IgdGVzdCBkYXRhIHByb2ZpbGVzLlwiXG4gICAgICAgICAgICAgIFtpbWFnZVVybF09XCJub0RhdGFJbWFnZVVybFwiPlxuICAgICAgICAgICAgPC9jcWEtZW1wdHktc3RhdGU+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI3VzZWRMb2FkaW5nVHBsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtcHQtMlwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IF8gb2Ygc2tlbGV0b25Sb3dzXCIgY2xhc3M9XCJjcWEtaC1bNDBweF0gY3FhLXJvdW5kZWQtbGcgY3FhLWJnLVsjRjFGNUY5XSBjcWEtYW5pbWF0ZS1wdWxzZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93TWFuYWdlRW52QW5kRGF0YUxpbmtcIiBjbGFzcz1cImNxYS1wdC0yXCI+XG4gICAgICAgIDxhXG4gICAgICAgICAgaHJlZj1cIiNcIlxuICAgICAgICAgIChjbGljayk9XCJvbk1hbmFnZUVudkFuZERhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLVsycHhdIGNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzRGNDZFNV0gY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtdW5kZXJsaW5lXCI+XG4gICAgICAgICAgTWFuYWdlIGluIEVudmlyb25tZW50ICZhbXA7IERhdGEgTWFuYWdlbWVudDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctbm9uZVwiPiZyc2FxdW87PC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBQQVJBTUVURVJTIOKAlCBob3N0IHNsb3RzIDxhcHAtc3RlcHMtdmFyaWFibGVzPiBoZXJlLiBVc2VzICpuZ0lmIHJhdGhlciB0aGFuXG4gICAgICAgW2hpZGRlbl0gYmVjYXVzZSB0aGUgYm9keSBuZWVkcyBgY3FhLWZsZXhgIHRvIGdpdmUgdGhlIHNsb3R0ZWQgZm9ybSBhIGJvdW5kZWRcbiAgICAgICBoZWlnaHQsIGFuZCBUYWlsd2luZCdzIGBpbXBvcnRhbnQ6ICcuY3FhLXVpLXJvb3QnYCBjb25maWcgY29tcGlsZXMgYGNxYS1mbGV4YFxuICAgICAgIHRvIGBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnRgLCB3aGljaCB3b3VsZCBvdmVycmlkZSBgW2hpZGRlbl1gJ3MgZGlzcGxheTogbm9uZVxuICAgICAgIGFuZCBsZWFrIHRoZSBwcm9qZWN0ZWQgY29udGVudCBpbnRvIEF2YWlsYWJsZS9Vc2VkLiAtLT5cbiAgPGRpdlxuICAgICpuZ0lmPVwiYWN0aXZlU3ViVGFiID09PSAncGFyYW1ldGVycydcIlxuICAgIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLWgtMCBjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcGFyYW1ldGVyc1Nsb3RdXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdmFyaWFibGVzLXBhbmVsL3ZhcmlhYmxlcy1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3ZhcmlhYmxlcy1wYW5lbC92YXJpYWJsZXMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7Ozs7QUFnQmhGLE1BQU0sT0FBTywrQkFBK0I7SUFUNUM7UUFVVyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLHNCQUFpQixHQUFHLFdBQVcsQ0FBQztRQUVoQyxTQUFJLEdBQWlCLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzNFLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLDZCQUF3QixHQUFHLElBQUksQ0FBQztRQUUvQixxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzlDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN6QywwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRWxELGlCQUFZLEdBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvQywrRUFBK0U7UUFDdEUsd0JBQW1CLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDO1FBQ3RELG1CQUFjLEdBQUcsa0JB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QUFyQixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWV9TVEFURV9JTUFHRVMgfSBmcm9tICcuLi8uLi9hc3NldHMvaW1hZ2VzL2ltYWdlLWFzc2V0cy5jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgVXNlZEluVGVzdFZtLFxuICBVc2VkVGRwVm0sXG4gIFVzZWRWYXJpYWJsZVZtLFxufSBmcm9tICcuL3ZhcmlhYmxlcy1wYW5lbC5tb2RlbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGVzdC1jYXNlLXZhcmlhYmxlcy1wYW5lbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi92YXJpYWJsZXMtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdjcWEtdWktcm9vdCcsXG4gICAgc3R5bGU6ICdkaXNwbGF5OiBmbGV4OyBmbGV4OiAxIDEgYXV0bzsgbWluLWhlaWdodDogMDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsnLFxuICB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdENhc2VWYXJpYWJsZXNQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHNlYXJjaFRlcm0gPSAnJztcbiAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXIgPSAnU2VhcmNoIGJ5JztcbiAgQElucHV0KCkgZW52aXJvbm1lbnROYW1lPzogc3RyaW5nO1xuICBASW5wdXQoKSB1c2VkOiBVc2VkSW5UZXN0Vm0gPSB7IGVudmlyb25tZW50OiBbXSwgZ2xvYmFsOiBbXSwgdGVzdERhdGFQcm9maWxlczogW10gfTtcbiAgQElucHV0KCkgaXNMb2FkaW5nVXNlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93TWFuYWdlRW52QW5kRGF0YUxpbmsgPSB0cnVlO1xuXG4gIEBPdXRwdXQoKSBzZWFyY2hUZXJtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBzZWFyY2hDbGVhcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbWFuYWdlRW52QW5kRGF0YUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHNrZWxldG9uUm93czogbnVtYmVyW10gPSBbMCwgMSwgMiwgM107XG5cbiAgLyoqIEVtcHR5LXN0YXRlIGltYWdlcnkg4oCUIGV4cG9zZWQgdG8gdGhlIHRlbXBsYXRlIHNvIHdlIGNhbiBiaW5kIFtpbWFnZVVybF0uICovXG4gIHJlYWRvbmx5IHNlYXJjaEVtcHR5SW1hZ2VVcmwgPSBFTVBUWV9TVEFURV9JTUFHRVMuU0VBUkNIX0RFQlVHO1xuICByZWFkb25seSBub0RhdGFJbWFnZVVybCA9IEVNUFRZX1NUQVRFX0lNQUdFUy5DSEVDS0xJU1RfQUREO1xuXG4gIC8qKiBQZXItcm93IGV4cGFuZGVkIHN0YXRlLiBLZXkgZm9ybWF0OiBgPGdyb3VwPjo8aWQ+YC4gKi9cbiAgZXhwYW5kZWRLZXlzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndXNlZCddKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkS2V5cyA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoVmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybSA9IHZhbHVlID8/ICcnO1xuICAgIHRoaXMuc2VhcmNoVGVybUNoYW5nZS5lbWl0KHRoaXMuc2VhcmNoVGVybSk7XG4gIH1cblxuICBvblNlYXJjaFN1Ym1pdCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtQ2hhbmdlLmVtaXQodmFsdWUgPz8gJycpO1xuICB9XG5cbiAgb25TZWFyY2hDbGVhcmVkKCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMuc2VhcmNoQ2xlYXJlZC5lbWl0KCk7XG4gIH1cblxuICBvbk1hbmFnZUVudkFuZERhdGEoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm1hbmFnZUVudkFuZERhdGFDbGljay5lbWl0KCk7XG4gIH1cblxuICBpc0V4cGFuZGVkKF90YWI6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgaWQ6IG51bWJlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZXhwYW5kZWRLZXlzW2Ake2dyb3VwfToke2lkfWBdO1xuICB9XG5cbiAgc2V0RXhwYW5kZWQoX3RhYjogc3RyaW5nLCBncm91cDogc3RyaW5nLCBpZDogbnVtYmVyIHwgc3RyaW5nLCBleHBhbmRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRLZXlzW2Ake2dyb3VwfToke2lkfWBdID0gZXhwYW5kZWQ7XG4gIH1cblxuICB0cmFja0J5Um93KF9pOiBudW1iZXIsIGl0ZW06IHsgaWQ6IG51bWJlciB8IHN0cmluZyB9KTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbT8uaWQgPz8gX2k7XG4gIH1cblxuICB0cmFja0J5VXNlZFRkcChfaTogbnVtYmVyLCBpdGVtOiBVc2VkVGRwVm0pOiBudW1iZXIge1xuICAgIHJldHVybiBpdGVtPy5hdHRhY2htZW50SWQgPz8gX2k7XG4gIH1cblxuICBnZXQgYmFubmVyRW52TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudE5hbWUgJiYgdGhpcy5lbnZpcm9ubWVudE5hbWUudHJpbSgpLmxlbmd0aFxuICAgICAgPyB0aGlzLmVudmlyb25tZW50TmFtZVxuICAgICAgOiAndGhpcyB0ZXN0IGNhc2UnO1xuICB9XG5cbiAgZ2V0IGhhc1VzZWREYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAodGhpcy51c2VkPy5lbnZpcm9ubWVudD8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgKHRoaXMudXNlZD8uZ2xvYmFsPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAodGhpcy51c2VkPy50ZXN0RGF0YVByb2ZpbGVzPy5sZW5ndGggPz8gMCkgPiAwXG4gICAgKTtcbiAgfVxuXG4gIC8vIEF2b2lkIHVudXNlZC1pbXBvcnQgd2FybmluZyBpbiB0ZW1wbGF0ZS1zdHJpY3QgY2hlY2tzLlxuICBhc1VzZWRWYXIoaXRlbTogVXNlZFZhcmlhYmxlVm0pOiBVc2VkVmFyaWFibGVWbSB7IHJldHVybiBpdGVtOyB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGwgY3FhLWZsZXgtMSBjcWEtbWluLWgtMCBjcWEtYmctd2hpdGVcIj5cbiAgPCEtLSBIZWFkZXI6IHNlYXJjaCArIGVudiBiYW5uZXIuIFRoZSBzZWdtZW50IHN0cmlwIGFuZCB0aGUgQXZhaWxhYmxlIC8gUGFyYW1ldGVyc1xuICAgICAgIHZpZXdzIHdlcmUgcmVtb3ZlZCDigJQgdGhlIHBhbmVsIG5vdyBzaG93cyBvbmx5IHRoZSBVc2VkIGluIFRlc3QgbGlzdC4gLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1wdC0yIGNxYS1wYi0zIGNxYS1iZy13aGl0ZVwiPlxuICAgIDxjcWEtc2VhcmNoLWJhclxuICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgIFt2YWx1ZV09XCJzZWFyY2hUZXJtXCJcbiAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VhcmNoVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAoc2VhcmNoKT1cIm9uU2VhcmNoU3VibWl0KCRldmVudClcIlxuICAgICAgKGNsZWFyZWQpPVwib25TZWFyY2hDbGVhcmVkKClcIj5cbiAgICA8L2NxYS1zZWFyY2gtYmFyPlxuXG4gICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNDc1NTY5XSBjcWEtYmctWyNGOEZBRkNdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtcm91bmRlZC1tZCBjcWEtcHgtMyBjcWEtcHktMlwiPlxuICAgICAgVmFyaWFibGVzIGFyZSByZXNvbHZlZCB1c2luZzogPHNwYW4gY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzBGMTcyQV1cIj57eyBiYW5uZXJFbnZMYWJlbCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBVU0VEIElOIFRFU1QgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4taC0wIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLW92ZXJmbG93LXgtaGlkZGVuIGNxYS1wYi02XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdVc2VkOyBlbHNlIHVzZWRMb2FkaW5nVHBsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVXNlZERhdGE7IGVsc2UgdXNlZEVtcHR5VHBsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VkLmVudmlyb25tZW50Py5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtbWItMlwiPkVudmlyb25tZW50IFZhcmlhYmxlcyBVc2VkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVs2cHhdIGNxYS1tYi00XCI+XG4gICAgICAgICAgICA8Y3FhLXVzZWQtdmFyaWFibGUtcm93XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2IG9mIHVzZWQuZW52aXJvbm1lbnQ7IHRyYWNrQnk6IHRyYWNrQnlSb3dcIlxuICAgICAgICAgICAgICBbbmFtZV09XCJ2Lm5hbWVcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwidi52YWx1ZVwiXG4gICAgICAgICAgICAgIFt0eXBlXT1cInYudHlwZVwiXG4gICAgICAgICAgICAgIFtzb3VyY2VdPVwidi5zb3VyY2VcIlxuICAgICAgICAgICAgICBbcGVybWlzc2lvbl09XCJ2LnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICBbc3RlcExhYmVsXT1cIidTdGVwICcgKyB2LnN0ZXBOdW1iZXJcIlxuICAgICAgICAgICAgICBbZXhwYW5kZWRdPVwiaXNFeHBhbmRlZCgndXNlZCcsICdlbnYnLCB2LmlkKVwiXG4gICAgICAgICAgICAgIChleHBhbmRlZENoYW5nZSk9XCJzZXRFeHBhbmRlZCgndXNlZCcsICdlbnYnLCB2LmlkLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS11c2VkLXZhcmlhYmxlLXJvdz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZWQuZ2xvYmFsPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtbWItMlwiPkdsb2JhbCBEYXRhIFVzZWQ8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtWzZweF0gY3FhLW1iLTRcIj5cbiAgICAgICAgICAgIDxjcWEtdXNlZC12YXJpYWJsZS1yb3dcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHYgb2YgdXNlZC5nbG9iYWw7IHRyYWNrQnk6IHRyYWNrQnlSb3dcIlxuICAgICAgICAgICAgICBbbmFtZV09XCJ2Lm5hbWVcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwidi52YWx1ZVwiXG4gICAgICAgICAgICAgIFt0eXBlXT1cInYudHlwZVwiXG4gICAgICAgICAgICAgIFtzb3VyY2VdPVwidi5zb3VyY2VcIlxuICAgICAgICAgICAgICBbcGVybWlzc2lvbl09XCJ2LnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICBbc3RlcExhYmVsXT1cIidTdGVwICcgKyB2LnN0ZXBOdW1iZXJcIlxuICAgICAgICAgICAgICBbZXhwYW5kZWRdPVwiaXNFeHBhbmRlZCgndXNlZCcsICdnbG9iYWwnLCB2LmlkKVwiXG4gICAgICAgICAgICAgIChleHBhbmRlZENoYW5nZSk9XCJzZXRFeHBhbmRlZCgndXNlZCcsICdnbG9iYWwnLCB2LmlkLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2NxYS11c2VkLXZhcmlhYmxlLXJvdz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZWQudGVzdERhdGFQcm9maWxlcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzlDQTNBRl0gY3FhLW1iLTJcIj5UZXN0IERhdGEgUHJvZmlsZXMgVXNlZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bNnB4XSBjcWEtbWItMlwiPlxuICAgICAgICAgICAgPGNxYS11c2VkLXByb2ZpbGUtcm93XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwIG9mIHVzZWQudGVzdERhdGFQcm9maWxlczsgdHJhY2tCeTogdHJhY2tCeVVzZWRUZHBcIlxuICAgICAgICAgICAgICBbbmFtZV09XCJwLm5hbWVcIlxuICAgICAgICAgICAgICBbZW52TmFtZV09XCJwLmVudk5hbWVcIlxuICAgICAgICAgICAgICBbc3RlcFJhbmdlXT1cInAuc3RlcFJhbmdlXCI+XG4gICAgICAgICAgICA8L2NxYS11c2VkLXByb2ZpbGUtcm93PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI3VzZWRFbXB0eVRwbD5cbiAgICAgICAgPGNxYS1lbXB0eS1zdGF0ZVxuICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGVybTsgZWxzZSBub1VzZWRBdEFsbFwiXG4gICAgICAgICAgdGl0bGU9XCJObyB1c2FnZXMgZm91bmRcIlxuICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCInTm8gdXNhZ2VzIG1hdGNoICZsZHF1bzsnICsgc2VhcmNoVGVybSArICcmcmRxdW87LidcIlxuICAgICAgICAgIFtpbWFnZVVybF09XCJzZWFyY2hFbXB0eUltYWdlVXJsXCI+XG4gICAgICAgIDwvY3FhLWVtcHR5LXN0YXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI25vVXNlZEF0QWxsPlxuICAgICAgICAgIDxjcWEtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIHRpdGxlPVwiTm8gdmFyaWFibGVzIHVzZWQgeWV0XCJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiVGhpcyB0ZXN0IGNhc2UgZG9lcyBub3QgcmVmZXJlbmNlIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGdsb2JhbCBkYXRhLCBvciB0ZXN0IGRhdGEgcHJvZmlsZXMuXCJcbiAgICAgICAgICAgIFtpbWFnZVVybF09XCJub0RhdGFJbWFnZVVybFwiPlxuICAgICAgICAgIDwvY3FhLWVtcHR5LXN0YXRlPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjdXNlZExvYWRpbmdUcGw+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtcHQtMlwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBfIG9mIHNrZWxldG9uUm93c1wiIGNsYXNzPVwiY3FhLWgtWzQwcHhdIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0YxRjVGOV0gY3FhLWFuaW1hdGUtcHVsc2VcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd01hbmFnZUVudkFuZERhdGFMaW5rXCIgY2xhc3M9XCJjcWEtcHQtMlwiPlxuICAgICAgPGFcbiAgICAgICAgaHJlZj1cIiNcIlxuICAgICAgICAoY2xpY2spPVwib25NYW5hZ2VFbnZBbmREYXRhKCRldmVudClcIlxuICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtWzJweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNEY0NkU1XSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS11bmRlcmxpbmVcIj5cbiAgICAgICAgTWFuYWdlIGluIEVudmlyb25tZW50ICZhbXA7IERhdGEgTWFuYWdlbWVudDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctbm9uZVwiPiZyc2FxdW87PC9zcGFuPlxuICAgICAgPC9hPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|