@cqa-lib/cqa-ui 1.1.368 → 1.1.369
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/execution-screen/jump-to-step-modal/jump-to-step-modal.component.mjs +145 -17
- package/fesm2015/cqa-lib-cqa-ui.mjs +147 -16
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +144 -16
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/execution-screen/jump-to-step-modal/jump-to-step-modal.component.d.ts +44 -3
- package/package.json +1 -1
|
@@ -4,13 +4,18 @@ import * as i1 from "@angular/material/icon";
|
|
|
4
4
|
import * as i2 from "../../search-bar/search-bar.component";
|
|
5
5
|
import * as i3 from "@angular/common";
|
|
6
6
|
export class JumpToStepModalComponent {
|
|
7
|
-
constructor() {
|
|
7
|
+
constructor(cdr) {
|
|
8
|
+
this.cdr = cdr;
|
|
8
9
|
/** Whether the modal is open */
|
|
9
10
|
this.isOpen = false;
|
|
10
11
|
/** Modal title */
|
|
11
12
|
this.title = 'Jump to Step';
|
|
12
|
-
/** List of step items to display */
|
|
13
|
+
/** List of step items to display (legacy; used when combinedTestCases not provided) */
|
|
13
14
|
this.items = [];
|
|
15
|
+
/** Combined test cases for accordion layout. When provided with stepsMeta, used instead of items. */
|
|
16
|
+
this.combinedTestCases = [];
|
|
17
|
+
/** Pre-computed step metadata (stepNumber, status, etc.) for each step. Required when using combinedTestCases. */
|
|
18
|
+
this.stepsMeta = [];
|
|
14
19
|
/** Search placeholder text */
|
|
15
20
|
this.searchPlaceholder = 'Search steps by name or number...';
|
|
16
21
|
/** Search Empty State text */
|
|
@@ -19,8 +24,16 @@ export class JumpToStepModalComponent {
|
|
|
19
24
|
this.searchValue = '';
|
|
20
25
|
/** Whether search is enabled */
|
|
21
26
|
this.enableSearch = true;
|
|
27
|
+
/** Whether to show prerequisite steps section. Default true. */
|
|
28
|
+
this.showPrerequisites = true;
|
|
22
29
|
/** Filtered items based on search */
|
|
23
30
|
this.filteredItems = [];
|
|
31
|
+
/** Prerequisite groups for accordion: each prerequisite test case by name. */
|
|
32
|
+
this.prerequisiteGroups = [];
|
|
33
|
+
/** Filtered non-prerequisite step items. */
|
|
34
|
+
this.filteredStepItems = [];
|
|
35
|
+
/** Expanded prerequisite group names. When empty, all groups are collapsed by default. */
|
|
36
|
+
this.expandedGroupNames = new Set();
|
|
24
37
|
/** Emitted when modal should be closed */
|
|
25
38
|
this.onClose = new EventEmitter();
|
|
26
39
|
/** Emitted when search value changes */
|
|
@@ -29,25 +42,134 @@ export class JumpToStepModalComponent {
|
|
|
29
42
|
this.onSelect = new EventEmitter();
|
|
30
43
|
}
|
|
31
44
|
ngOnChanges(changes) {
|
|
32
|
-
if (changes['items'] || changes['searchValue']) {
|
|
45
|
+
if (changes['items'] || changes['combinedTestCases'] || changes['stepsMeta'] || changes['searchValue']) {
|
|
33
46
|
this.updateFilteredItems();
|
|
34
47
|
}
|
|
35
48
|
}
|
|
36
49
|
updateFilteredItems() {
|
|
37
|
-
if (
|
|
50
|
+
if (this.combinedTestCases?.length && this.stepsMeta?.length) {
|
|
51
|
+
this.buildFromCombinedTestCases();
|
|
52
|
+
}
|
|
53
|
+
else if (this.items?.length) {
|
|
54
|
+
this.buildFromItems();
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
38
57
|
this.filteredItems = [];
|
|
39
|
-
|
|
58
|
+
this.prerequisiteGroups = [];
|
|
59
|
+
this.filteredStepItems = [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
buildFromCombinedTestCases() {
|
|
63
|
+
const metaByStepId = new Map();
|
|
64
|
+
this.stepsMeta.forEach(m => metaByStepId.set(m.stepId, m));
|
|
65
|
+
const searchTerm = (this.searchValue || '').toLowerCase().trim();
|
|
66
|
+
const matchesSearch = (meta) => {
|
|
67
|
+
if (!searchTerm)
|
|
68
|
+
return true;
|
|
69
|
+
return (String(meta.stepNumber).toLowerCase().includes(searchTerm) ||
|
|
70
|
+
(meta.label || '').toLowerCase().includes(searchTerm));
|
|
71
|
+
};
|
|
72
|
+
this.prerequisiteGroups = [];
|
|
73
|
+
this.filteredStepItems = [];
|
|
74
|
+
for (const group of this.combinedTestCases) {
|
|
75
|
+
if (!group?.steps?.length)
|
|
76
|
+
continue;
|
|
77
|
+
const groupName = (group.name || 'Prerequisite').toString();
|
|
78
|
+
const isPrereq = !!group.isPrerequisite;
|
|
79
|
+
const collectSteps = (steps, seen) => {
|
|
80
|
+
const out = [];
|
|
81
|
+
for (const s of steps) {
|
|
82
|
+
if (!s)
|
|
83
|
+
continue;
|
|
84
|
+
const id = s?.id ?? s?.step_id;
|
|
85
|
+
const numId = id != null ? Number(id) : NaN;
|
|
86
|
+
if (!Number.isFinite(numId) || seen.has(numId))
|
|
87
|
+
continue;
|
|
88
|
+
seen.add(numId);
|
|
89
|
+
const meta = metaByStepId.get(numId);
|
|
90
|
+
if (meta && matchesSearch(meta)) {
|
|
91
|
+
out.push({
|
|
92
|
+
id: String(numId),
|
|
93
|
+
stepId: numId,
|
|
94
|
+
stepNumber: meta.stepNumber,
|
|
95
|
+
description: this.stripHtml(meta.label || ('Step ' + meta.stepNumber)),
|
|
96
|
+
status: meta.status,
|
|
97
|
+
isPrerequisite: meta.isPrerequisite,
|
|
98
|
+
groupName: meta.groupName,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
for (const arr of [s.children || [], s.nestedSteps || [], s.steps || []]) {
|
|
102
|
+
if (arr?.length)
|
|
103
|
+
out.push(...collectSteps(arr, seen));
|
|
104
|
+
}
|
|
105
|
+
if (s.branches && Array.isArray(s.branches)) {
|
|
106
|
+
for (const b of s.branches) {
|
|
107
|
+
if (b?.subSteps?.length)
|
|
108
|
+
out.push(...collectSteps(b.subSteps, seen));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
};
|
|
114
|
+
const seen = new Set();
|
|
115
|
+
const items = collectSteps(group.steps, seen);
|
|
116
|
+
if (isPrereq && this.showPrerequisites) {
|
|
117
|
+
if (items.length) {
|
|
118
|
+
this.prerequisiteGroups.push({ name: groupName, items });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (!isPrereq) {
|
|
122
|
+
this.filteredStepItems.push(...items);
|
|
123
|
+
}
|
|
40
124
|
}
|
|
41
|
-
|
|
125
|
+
this.filteredItems = [
|
|
126
|
+
...this.prerequisiteGroups.reduce((acc, g) => acc.concat(g.items), []),
|
|
127
|
+
...this.filteredStepItems,
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
buildFromItems() {
|
|
131
|
+
const searchTerm = (this.searchValue || '').toLowerCase().trim();
|
|
132
|
+
if (!searchTerm) {
|
|
42
133
|
this.filteredItems = [...this.items];
|
|
43
|
-
return;
|
|
44
134
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
135
|
+
else {
|
|
136
|
+
this.filteredItems = this.items.filter(item => {
|
|
137
|
+
const stepNumberMatch = String(item.stepNumber).toLowerCase().includes(searchTerm);
|
|
138
|
+
const descriptionMatch = (item.description || '').toLowerCase().includes(searchTerm);
|
|
139
|
+
return stepNumberMatch || descriptionMatch;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const prereqItems = this.filteredItems.filter(i => i.isPrerequisite === true);
|
|
143
|
+
const groups = new Map();
|
|
144
|
+
prereqItems.forEach(item => {
|
|
145
|
+
const name = (item.groupName || 'Prerequisite').toString();
|
|
146
|
+
const existing = groups.get(name);
|
|
147
|
+
if (existing)
|
|
148
|
+
existing.push(item);
|
|
149
|
+
else
|
|
150
|
+
groups.set(name, [item]);
|
|
50
151
|
});
|
|
152
|
+
this.prerequisiteGroups = Array.from(groups.entries()).map(([name, items]) => ({ name, items }));
|
|
153
|
+
this.filteredStepItems = this.filteredItems.filter(i => i.isPrerequisite !== true);
|
|
154
|
+
}
|
|
155
|
+
stripHtml(html) {
|
|
156
|
+
if (!html)
|
|
157
|
+
return '';
|
|
158
|
+
const div = document.createElement('div');
|
|
159
|
+
div.innerHTML = html;
|
|
160
|
+
return (div.textContent || div.innerText || '').trim();
|
|
161
|
+
}
|
|
162
|
+
isGroupExpanded(name) {
|
|
163
|
+
return this.expandedGroupNames.has(name);
|
|
164
|
+
}
|
|
165
|
+
toggleGroup(name) {
|
|
166
|
+
if (this.expandedGroupNames.has(name)) {
|
|
167
|
+
this.expandedGroupNames.delete(name);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
this.expandedGroupNames.add(name);
|
|
171
|
+
}
|
|
172
|
+
this.cdr.markForCheck();
|
|
51
173
|
}
|
|
52
174
|
onSearchValueChange(value) {
|
|
53
175
|
this.searchValue = value;
|
|
@@ -100,17 +222,21 @@ export class JumpToStepModalComponent {
|
|
|
100
222
|
return item.id;
|
|
101
223
|
}
|
|
102
224
|
}
|
|
103
|
-
JumpToStepModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: JumpToStepModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
104
|
-
JumpToStepModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: JumpToStepModalComponent, selector: "cqa-jump-to-step-modal", inputs: { isOpen: "isOpen", title: "title", items: "items", searchPlaceholder: "searchPlaceholder", searchEmptyStateLabel: "searchEmptyStateLabel", searchValue: "searchValue", enableSearch: "enableSearch" }, outputs: { onClose: "onClose", onSearch: "onSearch", onSelect: "onSelect" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-lg cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-flex cqa-flex-col\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808; max-height: 90vh;\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-6 cqa-pb-4\">\n <h2 class=\"cqa-text-base cqa-font-semibold cqa-text-[#0A0A0A] cqa-leading-[24px] cqa-font-inter\">\n {{ title }}\n </h2>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-6 cqa-h-6 cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-text-gray-500 hover:cqa-text-gray-700 cqa-transition-colors\"\n (click)=\"handleClose()\"\n aria-label=\"Close modal\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n\n\n <!-- Search Bar -->\n <div *ngIf=\"enableSearch\" class=\"cqa-px-6 cqa-pb-4\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\">\n </cqa-search-bar>\n </div>\n\n <!-- Divider below search -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-px-6 cqa-pt-2\" style=\"scrollbar-width: thin;\">\n <!-- Empty State -->\n <div *ngIf=\"!hasItems\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-text-center\">\n <p class=\"cqa-text-sm cqa-text-gray-500 cqa-font-inter\">\n {{searchEmptyStateLabel || 'No Data found.'}}\n </p>\n </div>\n\n <!-- Steps List -->\n <div *ngIf=\"hasItems\" class=\"cqa-flex cqa-flex-col\">\n <
|
|
225
|
+
JumpToStepModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: JumpToStepModalComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
226
|
+
JumpToStepModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: JumpToStepModalComponent, selector: "cqa-jump-to-step-modal", inputs: { isOpen: "isOpen", title: "title", items: "items", combinedTestCases: "combinedTestCases", stepsMeta: "stepsMeta", searchPlaceholder: "searchPlaceholder", searchEmptyStateLabel: "searchEmptyStateLabel", searchValue: "searchValue", enableSearch: "enableSearch", showPrerequisites: "showPrerequisites" }, outputs: { onClose: "onClose", onSearch: "onSearch", onSelect: "onSelect" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-lg cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-flex cqa-flex-col\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808; max-height: 90vh;\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-6 cqa-pb-4\">\n <h2 class=\"cqa-text-base cqa-font-semibold cqa-text-[#0A0A0A] cqa-leading-[24px] cqa-font-inter\">\n {{ title }}\n </h2>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-6 cqa-h-6 cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-text-gray-500 hover:cqa-text-gray-700 cqa-transition-colors\"\n (click)=\"handleClose()\"\n aria-label=\"Close modal\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n\n\n <!-- Search Bar -->\n <div *ngIf=\"enableSearch\" class=\"cqa-px-6 cqa-pb-4\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\">\n </cqa-search-bar>\n </div>\n\n <!-- Divider below search -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-px-6 cqa-pt-2\" style=\"scrollbar-width: thin;\">\n <!-- Empty State -->\n <div *ngIf=\"!hasItems\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-text-center\">\n <p class=\"cqa-text-sm cqa-text-gray-500 cqa-font-inter\">\n {{searchEmptyStateLabel || 'No Data found.'}}\n </p>\n </div>\n\n <!-- Steps List -->\n <div *ngIf=\"hasItems\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n\n <!-- Prerequisite steps: accordion by test case name (styled like cqa-main-step-collapse) -->\n <ng-container *ngIf=\"showPrerequisites && prerequisiteGroups?.length\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-1\">\n <ng-container *ngFor=\"let group of prerequisiteGroups\">\n <div\n class=\"cqa-mt-2 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-cursor-pointer cqa-bg-[#EEF2FF] cqa-rounded-[4px] cqa-border cqa-border-[#C6D2FF] cqa-border-solid cqa-w-full\"\n (click)=\"toggleGroup(group.name)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-w-full\">\n <div>\n <svg [class.cqa-rotate-180]=\"isGroupExpanded(group.name)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#4F39F6\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"cqa-font-semibold cqa-text-[14px] cqa-leading-[17px] cqa-text-[#312C85] cqa-flex-1\">\n {{ group.name }}\n </span>\n </div>\n </div>\n <div *ngIf=\"isGroupExpanded(group.name)\" class=\"cqa-mt-2 cqa-flex cqa-flex-col cqa-gap-2 cqa-px-2.5\">\n <button\n *ngFor=\"let item of group.items; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">{{ item.stepNumber }}</span>\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">{{ item.description }}</span>\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">{{ item.status }}</span>\n </button>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"filteredStepItems?.length\" class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB] cqa-my-1 cqa-mb-2\" role=\"presentation\"></div>\n </ng-container>\n\n <!-- Main test steps section -->\n <ng-container *ngIf=\"filteredStepItems?.length\">\n <div class=\"cqa-mb-1\">\n <span class=\"cqa-text-xs cqa-font-medium cqa-text-[#6B7280] cqa-uppercase cqa-tracking-wide\">\n Test steps\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <button\n *ngFor=\"let item of filteredStepItems; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n\n <!-- Step Number Badge -->\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">\n {{ item.stepNumber }}\n </span>\n\n <!-- Step Description -->\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">\n {{ item.description }}\n </span>\n\n <!-- Status Badge -->\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">\n {{ item.status }}\n </span>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"hasItems\" class=\"cqa-px-6 cqa-pb-5 cqa-pt-3\">\n <p class=\"cqa-text-xs cqa-text-[#6B7280] cqa-font-inter cqa-font-normal\">\n {{ itemsCount }} {{ itemsCount === 1 ? 'step' : 'steps' }} found\n </p>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
105
227
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: JumpToStepModalComponent, decorators: [{
|
|
106
228
|
type: Component,
|
|
107
|
-
args: [{ selector: 'cqa-jump-to-step-modal', host: { class: 'cqa-ui-root' }, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-lg cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-flex cqa-flex-col\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808; max-height: 90vh;\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-6 cqa-pb-4\">\n <h2 class=\"cqa-text-base cqa-font-semibold cqa-text-[#0A0A0A] cqa-leading-[24px] cqa-font-inter\">\n {{ title }}\n </h2>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-6 cqa-h-6 cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-text-gray-500 hover:cqa-text-gray-700 cqa-transition-colors\"\n (click)=\"handleClose()\"\n aria-label=\"Close modal\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n\n\n <!-- Search Bar -->\n <div *ngIf=\"enableSearch\" class=\"cqa-px-6 cqa-pb-4\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\">\n </cqa-search-bar>\n </div>\n\n <!-- Divider below search -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-px-6 cqa-pt-2\" style=\"scrollbar-width: thin;\">\n <!-- Empty State -->\n <div *ngIf=\"!hasItems\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-text-center\">\n <p class=\"cqa-text-sm cqa-text-gray-500 cqa-font-inter\">\n {{searchEmptyStateLabel || 'No Data found.'}}\n </p>\n </div>\n\n <!-- Steps List -->\n <div *ngIf=\"hasItems\" class=\"cqa-flex cqa-flex-col\">\n <
|
|
108
|
-
}], propDecorators: { isOpen: [{
|
|
229
|
+
args: [{ selector: 'cqa-jump-to-step-modal', host: { class: 'cqa-ui-root' }, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-lg cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-flex cqa-flex-col\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808; max-height: 90vh;\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-6 cqa-pt-6 cqa-pb-4\">\n <h2 class=\"cqa-text-base cqa-font-semibold cqa-text-[#0A0A0A] cqa-leading-[24px] cqa-font-inter\">\n {{ title }}\n </h2>\n <button\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-6 cqa-h-6 cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-text-gray-500 hover:cqa-text-gray-700 cqa-transition-colors\"\n (click)=\"handleClose()\"\n aria-label=\"Close modal\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n\n\n <!-- Search Bar -->\n <div *ngIf=\"enableSearch\" class=\"cqa-px-6 cqa-pb-4\">\n <cqa-search-bar\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [fullWidth]=\"true\"\n (valueChange)=\"onSearchValueChange($event)\">\n </cqa-search-bar>\n </div>\n\n <!-- Divider below search -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Steps List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-overflow-x-hidden cqa-px-6 cqa-pt-2\" style=\"scrollbar-width: thin;\">\n <!-- Empty State -->\n <div *ngIf=\"!hasItems\" class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-12 cqa-text-center\">\n <p class=\"cqa-text-sm cqa-text-gray-500 cqa-font-inter\">\n {{searchEmptyStateLabel || 'No Data found.'}}\n </p>\n </div>\n\n <!-- Steps List -->\n <div *ngIf=\"hasItems\" class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n\n <!-- Prerequisite steps: accordion by test case name (styled like cqa-main-step-collapse) -->\n <ng-container *ngIf=\"showPrerequisites && prerequisiteGroups?.length\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-mb-1\">\n <ng-container *ngFor=\"let group of prerequisiteGroups\">\n <div\n class=\"cqa-mt-2 cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2 cqa-cursor-pointer cqa-bg-[#EEF2FF] cqa-rounded-[4px] cqa-border cqa-border-[#C6D2FF] cqa-border-solid cqa-w-full\"\n (click)=\"toggleGroup(group.name)\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-w-full\">\n <div>\n <svg [class.cqa-rotate-180]=\"isGroupExpanded(group.name)\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#4F39F6\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"cqa-font-semibold cqa-text-[14px] cqa-leading-[17px] cqa-text-[#312C85] cqa-flex-1\">\n {{ group.name }}\n </span>\n </div>\n </div>\n <div *ngIf=\"isGroupExpanded(group.name)\" class=\"cqa-mt-2 cqa-flex cqa-flex-col cqa-gap-2 cqa-px-2.5\">\n <button\n *ngFor=\"let item of group.items; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">{{ item.stepNumber }}</span>\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">{{ item.description }}</span>\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">{{ item.status }}</span>\n </button>\n </div>\n </ng-container>\n </div>\n <div *ngIf=\"filteredStepItems?.length\" class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB] cqa-my-1 cqa-mb-2\" role=\"presentation\"></div>\n </ng-container>\n\n <!-- Main test steps section -->\n <ng-container *ngIf=\"filteredStepItems?.length\">\n <div class=\"cqa-mb-1\">\n <span class=\"cqa-text-xs cqa-font-medium cqa-text-[#6B7280] cqa-uppercase cqa-tracking-wide\">\n Test steps\n </span>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <button\n *ngFor=\"let item of filteredStepItems; trackBy: trackByItemId\"\n type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-px-3 cqa-py-3 cqa-w-full cqa-text-left cqa-border-0 cqa-bg-transparent hover:cqa-bg-gray-50 cqa-cursor-pointer cqa-transition-colors cqa-rounded-md cqa-min-w-0\"\n (click)=\"onItemClick(item)\">\n\n <!-- Step Number Badge -->\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-rounded-[6px] cqa-text-xs cqa-font-medium cqa-py-[4px] cqa-px-[10px] cqa-flex-shrink-0 cqa-border cqa-border-solid cqa-border-[#E2E8F0] cqa-text-[#3F43EE] cqa-bg-[#F8F9FF]\"\n style=\"min-width: 32px;\">\n {{ item.stepNumber }}\n </span>\n\n <!-- Step Description -->\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-[#0A0A0A] cqa-font-inter cqa-font-normal cqa-leading-[20px] cqa-min-w-0 cqa-truncate\">\n {{ item.description }}\n </span>\n\n <!-- Status Badge -->\n <span class=\"cqa-flex-shrink-0\" [ngClass]=\"getStatusBadgeClasses(item.status)\">\n {{ item.status }}\n </span>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n\n <!-- Footer -->\n <div *ngIf=\"hasItems\" class=\"cqa-px-6 cqa-pb-5 cqa-pt-3\">\n <p class=\"cqa-text-xs cqa-text-[#6B7280] cqa-font-inter cqa-font-normal\">\n {{ itemsCount }} {{ itemsCount === 1 ? 'step' : 'steps' }} found\n </p>\n </div>\n </div>\n</div>\n", styles: [] }]
|
|
230
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { isOpen: [{
|
|
109
231
|
type: Input
|
|
110
232
|
}], title: [{
|
|
111
233
|
type: Input
|
|
112
234
|
}], items: [{
|
|
113
235
|
type: Input
|
|
236
|
+
}], combinedTestCases: [{
|
|
237
|
+
type: Input
|
|
238
|
+
}], stepsMeta: [{
|
|
239
|
+
type: Input
|
|
114
240
|
}], searchPlaceholder: [{
|
|
115
241
|
type: Input
|
|
116
242
|
}], searchEmptyStateLabel: [{
|
|
@@ -119,6 +245,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
119
245
|
type: Input
|
|
120
246
|
}], enableSearch: [{
|
|
121
247
|
type: Input
|
|
248
|
+
}], showPrerequisites: [{
|
|
249
|
+
type: Input
|
|
122
250
|
}], onClose: [{
|
|
123
251
|
type: Output
|
|
124
252
|
}], onSearch: [{
|
|
@@ -126,4 +254,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
126
254
|
}], onSelect: [{
|
|
127
255
|
type: Output
|
|
128
256
|
}] } });
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9qdW1wLXRvLXN0ZXAtbW9kYWwvanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9qdW1wLXRvLXN0ZXAtbW9kYWwvanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLE1BQU0sZUFBZSxDQUFDOzs7OztBQWtCakcsTUFBTSxPQUFPLHdCQUF3QjtJQU5yQztRQU9FLGdDQUFnQztRQUN2QixXQUFNLEdBQVksS0FBSyxDQUFDO1FBRWpDLGtCQUFrQjtRQUNULFVBQUssR0FBVyxjQUFjLENBQUM7UUFFeEMsb0NBQW9DO1FBQzNCLFVBQUssR0FBcUIsRUFBRSxDQUFDO1FBRXRDLDhCQUE4QjtRQUNyQixzQkFBaUIsR0FBVyxtQ0FBbUMsQ0FBQztRQUV6RSw4QkFBOEI7UUFDckIsMEJBQXFCLEdBQVcsZ0JBQWdCLENBQUM7UUFFMUQsMkJBQTJCO1FBQ2xCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBRWxDLGdDQUFnQztRQUN2QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUV0QyxxQ0FBcUM7UUFDckMsa0JBQWEsR0FBcUIsRUFBRSxDQUFDO1FBRXJDLDBDQUEwQztRQUNoQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUU3Qyx3Q0FBd0M7UUFDOUIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFaEQsMkNBQTJDO1FBQ2pDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztLQXVGekQ7SUFyRkMsV0FBVyxDQUFDLE9B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QyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxnR0FBZ0c7SUFDaEcsT0FBTyxDQUFDLEtBQXNCO1FBQzVCLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWEsRUFBRSxJQUFvQjtRQUMvQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQzs7cUhBdEhVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLHlaQ2xCckMsMm1JQXlGQTsyRkR2RWEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHdCQUF3QixRQUc1QixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7OEJBSXJCLE1BQU07c0JBQWQsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQU1JLE9BQU87c0JBQWhCLE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFHRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBTdGVwSXRlbVN0YXR1cyA9ICdwYXNzZWQnIHwgJ2N1cnJlbnQnIHwgJ3BlbmRpbmcnIHwgJ2ZhaWxlZCcgfCAncnVubmluZycgfCAnc2tpcHBlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnVtcFRvU3RlcEl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBzdGVwTnVtYmVyOiBzdHJpbmcgfCBudW1iZXI7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHN0YXR1czogU3RlcEl0ZW1TdGF0dXM7XG4gIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3cgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1qdW1wLXRvLXN0ZXAtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9XG59KVxuZXhwb3J0IGNsYXNzIEp1bXBUb1N0ZXBNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBXaGV0aGVyIHRoZSBtb2RhbCBpcyBvcGVuICovXG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBNb2RhbCB0aXRsZSAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0p1bXAgdG8gU3RlcCc7XG5cbiAgLyoqIExpc3Qgb2Ygc3RlcCBpdGVtcyB0byBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIGl0ZW1zOiBKdW1wVG9TdGVwSXRlbVtdID0gW107XG5cbiAgLyoqIFNlYXJjaCBwbGFjZWhvbGRlciB0ZXh0ICovXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIHN0ZXBzIGJ5IG5hbWUgb3IgbnVtYmVyLi4uJztcblxuICAvKiogU2VhcmNoIEVtcHR5IFN0YXRlIHRleHQgKi9cbiAgQElucHV0KCkgc2VhcmNoRW1wdHlTdGF0ZUxhYmVsOiBzdHJpbmcgPSAnTm8gc3RlcHMgZm91bmQnO1xuXG4gIC8qKiBDdXJyZW50IHNlYXJjaCB2YWx1ZSAqL1xuICBASW5wdXQoKSBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG5cbiAgLyoqIFdoZXRoZXIgc2VhcmNoIGlzIGVuYWJsZWQgKi9cbiAgQElucHV0KCkgZW5hYmxlU2VhcmNoOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKiogRmlsdGVyZWQgaXRlbXMgYmFzZWQgb24gc2VhcmNoICovXG4gIGZpbHRlcmVkSXRlbXM6IEp1bXBUb1N0ZXBJdGVtW10gPSBbXTtcblxuICAvKiogRW1pdHRlZCB3aGVuIG1vZGFsIHNob3VsZCBiZSBjbG9zZWQgKi9cbiAgQE91dHB1dCgpIG9uQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBzZWFyY2ggdmFsdWUgY2hhbmdlcyAqL1xuICBAT3V0cHV0KCkgb25TZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgc3RlcCBpdGVtIGlzIHNlbGVjdGVkICovXG4gIEBPdXRwdXQoKSBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8SnVtcFRvU3RlcEl0ZW0+KCk7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydpdGVtcyddIHx8IGNoYW5nZXNbJ3NlYXJjaFZhbHVlJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyZWRJdGVtcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXRlbXMgfHwgdGhpcy5pdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWFyY2hWYWx1ZSB8fCB0aGlzLnNlYXJjaFZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFsuLi50aGlzLml0ZW1zXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IHN0ZXBOdW1iZXJNYXRjaCA9IFN0cmluZyhpdGVtLnN0ZXBOdW1iZXIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbk1hdGNoID0gaXRlbS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgICAgcmV0dXJuIHN0ZXBOdW1iZXJNYXRjaCB8fCBkZXNjcmlwdGlvbk1hdGNoO1xuICAgIH0pO1xuICB9XG5cbiAgb25TZWFyY2hWYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMub25TZWFyY2guZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkl0ZW1DbGljayhpdGVtOiBKdW1wVG9TdGVwSXRlbSk6IHZvaWQge1xuICAgIHRoaXMub25TZWxlY3QuZW1pdChpdGVtKTtcbiAgfVxuXG4gIG9uQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBcbiAgICBpZiAodGFyZ2V0ID09PSBjdXJyZW50VGFyZ2V0IHx8IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21vZGFsLWJhY2tkcm9wJykpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzc2VzKHN0YXR1czogU3RlcEl0ZW1TdGF0dXMpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcm91bmRlZC1bNnB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXB5LVs0cHhdIGNxYS1weC0zJztcbiAgICBcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSAncGFzc2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctZ3JlZW4tMTAwIGNxYS10ZXh0LWdyZWVuLTgwMGA7XG4gICAgICBjYXNlICdjdXJyZW50JzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctYmx1ZS0xMDAgY3FhLXRleHQtYmx1ZS04MDBgO1xuICAgICAgY2FzZSAncGVuZGluZyc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMTAwIGNxYS10ZXh0LWdyYXktODAwYDtcbiAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLXJlZC0xMDAgY3FhLXRleHQtcmVkLTgwMGA7XG4gICAgICBjYXNlICdydW5uaW5nJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctYmx1ZS0xMDAgY3FhLXRleHQtYmx1ZS04MDBgO1xuICAgICAgY2FzZSAnc2tpcHBlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMTAwIGNxYS10ZXh0LWdyYXktODAwYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMTAwIGNxYS10ZXh0LWdyYXktODAwYDtcbiAgICB9XG4gIH1cblxuICBnZXQgaGFzSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRJdGVtcyAmJiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGdldCBpdGVtc0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRJdGVtcyA/IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggOiAwO1xuICB9XG5cbiAgLyoqIENvbnZlcnQgc3RlcE51bWJlciB0byBzdHJpbmcgZm9yIHRoZSBiYWRnZSBsYWJlbCAoU3RyaW5nKCkgaXMgbm90IGF2YWlsYWJsZSBpbiB0ZW1wbGF0ZXMpICovXG4gIHRvTGFiZWwodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnICsgdmFsdWU7XG4gIH1cblxuICB0cmFja0J5SXRlbUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IEp1bXBUb1N0ZXBJdGVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxufVxuXG4iLCI8ZGl2ICpuZ0lmPVwiaXNPcGVuXCJcbiAgY2xhc3M9XCJtb2RhbC1iYWNrZHJvcCBjcWEtZml4ZWQgY3FhLWluc2V0LTAgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS16LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIlxuICAoY2xpY2spPVwib25CYWNrZHJvcENsaWNrKCRldmVudClcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY3FhLXJvdW5kZWQtbGcgY3FhLWJnLXdoaXRlIGNxYS1zaGFkb3ctbGcgIGNxYS13LWZ1bGwgY3FhLW1heC13LVs1MDBweF0gY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgIHN0eWxlPVwiYm94LXNoYWRvdzogMHB4IDhweCA4cHggLTRweCAjMTAxODI4MDg7IG1heC1oZWlnaHQ6IDkwdmg7XCJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG5cbiAgICA8IS0tIEhlYWRlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1weC02IGNxYS1wdC02IGNxYS1wYi00XCI+XG4gICAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1iYXNlIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtbGVhZGluZy1bMjRweF0gY3FhLWZvbnQtaW50ZXJcIj5cbiAgICAgICAge3sgdGl0bGUgfX1cbiAgICAgIDwvaDI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTYgY3FhLWgtNiBjcWEtcC0wIGNxYS1ib3JkZXItMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LWdyYXktNTAwIGhvdmVyOmNxYS10ZXh0LWdyYXktNzAwIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVDbG9zZSgpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlIG1vZGFsXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF0gIWNxYS1ibG9jayAhY3FhLWxlYWRpbmctbm9uZVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG5cbiAgICA8IS0tIFNlYXJjaCBCYXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImVuYWJsZVNlYXJjaFwiIGNsYXNzPVwiY3FhLXB4LTYgY3FhLXBiLTRcIj5cbiAgICAgIDxjcWEtc2VhcmNoLWJhclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWFyY2hWYWx1ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L2NxYS1zZWFyY2gtYmFyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEaXZpZGVyIGJlbG93IHNlYXJjaCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLS1teC0yIGNxYS13LVtjYWxjKDEwMCUrMXJlbSldIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGVwcyBMaXN0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1vdmVyZmxvdy15LWF1dG8gY3FhLW92ZXJmbG93LXgtaGlkZGVuIGNxYS1weC02IGNxYS1wdC0yXCIgc3R5bGU9XCJzY3JvbGxiYXItd2lkdGg6IHRoaW47XCI+XG4gICAgICA8IS0tIEVtcHR5IFN0YXRlIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFoYXNJdGVtc1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1weS0xMiBjcWEtdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTUwMCBjcWEtZm9udC1pbnRlclwiPlxuICAgICAgICAge3tzZWFyY2hFbXB0eVN0YXRlTGFiZWwgfHwgJ05vIERhdGEgZm91bmQuJ319XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXBzIExpc3QgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaGFzSXRlbXNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRJdGVtczsgdHJhY2tCeTogdHJhY2tCeUl0ZW1JZFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtMyBjcWEtcHktMyBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBob3ZlcjpjcWEtYmctZ3JheS01MCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1yb3VuZGVkLW1kIGNxYS1taW4tdy0wXCJcbiAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIj5cblxuICAgICAgICAgIDwhLS0gU3RlcCBOdW1iZXIgQmFkZ2UgLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJvdW5kZWQtWzZweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1weS1bNHB4XSBjcWEtcHgtWzEwcHhdIGNxYS1mbGV4LXNocmluay0wIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLWJnLVsjRjhGOUZGXVwiXG4gICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogMzJweDtcIj5cbiAgICAgICAgICAgIHt7IGl0ZW0uc3RlcE51bWJlciB9fVxuICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgIDwhLS0gU3RlcCBEZXNjcmlwdGlvbiAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXRleHQtc20gY3FhLXRleHQtWyMwQTBBMEFdIGNxYS1mb250LWludGVyIGNxYS1mb250LW5vcm1hbCBjcWEtbGVhZGluZy1bMjBweF0gY3FhLW1pbi13LTAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAgICB7eyBpdGVtLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBTdGF0dXMgQmFkZ2UgLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIFtuZ0NsYXNzXT1cImdldFN0YXR1c0JhZGdlQ2xhc3NlcyhpdGVtLnN0YXR1cylcIj5cbiAgICAgICAgICAgIHt7IGl0ZW0uc3RhdHVzIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBSaWdodCBBcnJvdyBJY29uLS0+XG4gICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02IDRMMTAgOEw2IDEyXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvc3Bhbj4gLS0+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvb3RlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzSXRlbXNcIiBjbGFzcz1cImNxYS1weC02IGNxYS1wYi01IGNxYS1wdC0zXCI+XG4gICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtZm9udC1pbnRlciBjcWEtZm9udC1ub3JtYWxcIj5cbiAgICAgICAge3sgaXRlbXNDb3VudCB9fSB7eyBpdGVtc0NvdW50ID09PSAxID8gJ3N0ZXAnIDogJ3N0ZXBzJyB9fSBmb3VuZFxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9qdW1wLXRvLXN0ZXAtbW9kYWwvanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZXhlY3V0aW9uLXNjcmVlbi9qdW1wLXRvLXN0ZXAtbW9kYWwvanVtcC10by1zdGVwLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOzs7OztBQXVDcEgsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxZQUE2QixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUVuRCxnQ0FBZ0M7UUFDdkIsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUVqQyxrQkFBa0I7UUFDVCxVQUFLLEdBQVcsY0FBYyxDQUFDO1FBRXhDLHVGQUF1RjtRQUM5RSxVQUFLLEdBQXFCLEVBQUUsQ0FBQztRQUV0QyxxR0FBcUc7UUFDNUYsc0JBQWlCLEdBQTRCLEVBQUUsQ0FBQztRQUV6RCxrSEFBa0g7UUFDekcsY0FBUyxHQUF5QixFQUFFLENBQUM7UUFFOUMsOEJBQThCO1FBQ3JCLHNCQUFpQixHQUFXLG1DQUFtQyxDQUFDO1FBRXpFLDhCQUE4QjtRQUNyQiwwQkFBcUIsR0FBVyxnQkFBZ0IsQ0FBQztRQUUxRCwyQkFBMkI7UUFDbEIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFbEMsZ0NBQWdDO1FBQ3ZCLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRXRDLGdFQUFnRTtRQUN2RCxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFFM0MscUNBQXFDO1FBQ3JDLGtCQUFhLEdBQXFCLEVBQUUsQ0FBQztRQUVyQyw4RUFB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LE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFHRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgU3RlcEl0ZW1TdGF0dXMgPSAncGFzc2VkJyB8ICdjdXJyZW50JyB8ICdwZW5kaW5nJyB8ICdmYWlsZWQnIHwgJ3J1bm5pbmcnIHwgJ3NraXBwZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp1bXBUb1N0ZXBJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgc3RlcE51bWJlcjogc3RyaW5nIHwgbnVtYmVyO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBzdGF0dXM6IFN0ZXBJdGVtU3RhdHVzO1xuICAvKiogU3RlcCBpZCBmb3Igc2VsZWN0aW9uLiBXaGVuIG1pc3NpbmcsIGRlcml2ZWQgZnJvbSBpZC4gKi9cbiAgc3RlcElkPzogbnVtYmVyO1xuICAvKiogT3B0aW9uYWwgZmxhZyB0byBpbmRpY2F0ZSB0aGlzIGl0ZW0gcmVwcmVzZW50cyBhIHByZXJlcXVpc2l0ZSBzdGVwLiAqL1xuICBpc1ByZXJlcXVpc2l0ZT86IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBncm91cCBuYW1lIChlLmcuIHByZXJlcXVpc2l0ZSB0ZXN0IGNhc2UgbmFtZSkgZm9yIHZpc3VhbCBncm91cGluZy4gKi9cbiAgZ3JvdXBOYW1lPzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiBhbnk7IC8vIEFsbG93IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEp1bXBUb1N0ZXBTdGVwTWV0YSB7XG4gIHN0ZXBJZDogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xuICBzdGVwTnVtYmVyOiBzdHJpbmc7XG4gIHN0YXR1czogU3RlcEl0ZW1TdGF0dXM7XG4gIGlzUHJlcmVxdWlzaXRlPzogYm9vbGVhbjtcbiAgZ3JvdXBOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVkVGVzdENhc2VHcm91cCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlzUHJlcmVxdWlzaXRlPzogYm9vbGVhbjtcbiAgc3RlcHM/OiBhbnlbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWp1bXAtdG8tc3RlcC1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9qdW1wLXRvLXN0ZXAtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBob3N0OiB7IGNsYXNzOiAnY3FhLXVpLXJvb3QnIH1cbn0pXG5leHBvcnQgY2xhc3MgSnVtcFRvU3RlcE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBtb2RhbCBpcyBvcGVuICovXG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBNb2RhbCB0aXRsZSAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0p1bXAgdG8gU3RlcCc7XG5cbiAgLyoqIExpc3Qgb2Ygc3RlcCBpdGVtcyB0byBkaXNwbGF5IChsZWdhY3k7IHVzZWQgd2hlbiBjb21iaW5lZFRlc3RDYXNlcyBub3QgcHJvdmlkZWQpICovXG4gIEBJbnB1dCgpIGl0ZW1zOiBKdW1wVG9TdGVwSXRlbVtdID0gW107XG5cbiAgLyoqIENvbWJpbmVkIHRlc3QgY2FzZXMgZm9yIGFjY29yZGlvbiBsYXlvdXQuIFdoZW4gcHJvdmlkZWQgd2l0aCBzdGVwc01ldGEsIHVzZWQgaW5zdGVhZCBvZiBpdGVtcy4gKi9cbiAgQElucHV0KCkgY29tYmluZWRUZXN0Q2FzZXM6IENvbWJpbmVkVGVzdENhc2VHcm91cFtdID0gW107XG5cbiAgLyoqIFByZS1jb21wdXRlZCBzdGVwIG1ldGFkYXRhIChzdGVwTnVtYmVyLCBzdGF0dXMsIGV0Yy4pIGZvciBlYWNoIHN0ZXAuIFJlcXVpcmVkIHdoZW4gdXNpbmcgY29tYmluZWRUZXN0Q2FzZXMuICovXG4gIEBJbnB1dCgpIHN0ZXBzTWV0YTogSnVtcFRvU3RlcFN0ZXBNZXRhW10gPSBbXTtcblxuICAvKiogU2VhcmNoIHBsYWNlaG9sZGVyIHRleHQgKi9cbiAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2ggc3RlcHMgYnkgbmFtZSBvciBudW1iZXIuLi4nO1xuXG4gIC8qKiBTZWFyY2ggRW1wdHkgU3RhdGUgdGV4dCAqL1xuICBASW5wdXQoKSBzZWFyY2hFbXB0eVN0YXRlTGFiZWw6IHN0cmluZyA9ICdObyBzdGVwcyBmb3VuZCc7XG5cbiAgLyoqIEN1cnJlbnQgc2VhcmNoIHZhbHVlICovXG4gIEBJbnB1dCgpIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcblxuICAvKiogV2hldGhlciBzZWFyY2ggaXMgZW5hYmxlZCAqL1xuICBASW5wdXQoKSBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgcHJlcmVxdWlzaXRlIHN0ZXBzIHNlY3Rpb24uIERlZmF1bHQgdHJ1ZS4gKi9cbiAgQElucHV0KCkgc2hvd1ByZXJlcXVpc2l0ZXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKiBGaWx0ZXJlZCBpdGVtcyBiYXNlZCBvbiBzZWFyY2ggKi9cbiAgZmlsdGVyZWRJdGVtczogSnVtcFRvU3RlcEl0ZW1bXSA9IFtdO1xuXG4gIC8qKiBQcmVyZXF1aXNpdGUgZ3JvdXBzIGZvciBhY2NvcmRpb246IGVhY2ggcHJlcmVxdWlzaXRlIHRlc3QgY2FzZSBieSBuYW1lLiAqL1xuICBwcmVyZXF1aXNpdGVHcm91cHM6IHsgbmFtZTogc3RyaW5nOyBpdGVtczogSnVtcFRvU3RlcEl0ZW1bXSB9W10gPSBbXTtcblxuICAvKiogRmlsdGVyZWQgbm9uLXByZXJlcXVpc2l0ZSBzdGVwIGl0ZW1zLiAqL1xuICBmaWx0ZXJlZFN0ZXBJdGVtczogSnVtcFRvU3RlcEl0ZW1bXSA9IFtdO1xuXG4gIC8qKiBFeHBhbmRlZCBwcmVyZXF1aXNpdGUgZ3JvdXAgbmFtZXMuIFdoZW4gZW1wdHksIGFsbCBncm91cHMgYXJlIGNvbGxhcHNlZCBieSBkZWZhdWx0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGV4cGFuZGVkR3JvdXBOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gbW9kYWwgc2hvdWxkIGJlIGNsb3NlZCAqL1xuICBAT3V0cHV0KCkgb25DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlYXJjaCB2YWx1ZSBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBvblNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBzdGVwIGl0ZW0gaXMgc2VsZWN0ZWQgKi9cbiAgQE91dHB1dCgpIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxKdW1wVG9TdGVwSXRlbT4oKTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10gfHwgY2hhbmdlc1snY29tYmluZWRUZXN0Q2FzZXMnXSB8fCBjaGFuZ2VzWydzdGVwc01ldGEnXSB8fCBjaGFuZ2VzWydzZWFyY2hWYWx1ZSddKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkSXRlbXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcmVkSXRlbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tYmluZWRUZXN0Q2FzZXM/Lmxlbmd0aCAmJiB0aGlzLnN0ZXBzTWV0YT8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmJ1aWxkRnJvbUNvbWJpbmVkVGVzdENhc2VzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYnVpbGRGcm9tSXRlbXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gW107XG4gICAgICB0aGlzLnByZXJlcXVpc2l0ZUdyb3VwcyA9IFtdO1xuICAgICAgdGhpcy5maWx0ZXJlZFN0ZXBJdGVtcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGcm9tQ29tYmluZWRUZXN0Q2FzZXMoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YUJ5U3RlcElkID0gbmV3IE1hcDxudW1iZXIsIEp1bXBUb1N0ZXBTdGVwTWV0YT4oKTtcbiAgICB0aGlzLnN0ZXBzTWV0YS5mb3JFYWNoKG0gPT4gbWV0YUJ5U3RlcElkLnNldChtLnN0ZXBJZCwgbSkpO1xuXG4gICAgY29uc3Qgc2VhcmNoVGVybSA9ICh0aGlzLnNlYXJjaFZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBjb25zdCBtYXRjaGVzU2VhcmNoID0gKG1ldGE6IEp1bXBUb1N0ZXBTdGVwTWV0YSk6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKCFzZWFyY2hUZXJtKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIFN0cmluZyhtZXRhLnN0ZXBOdW1iZXIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHxcbiAgICAgICAgKG1ldGEubGFiZWwgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSlcbiAgICAgICk7XG4gICAgfTtcblxuICAgIHRoaXMucHJlcmVxdWlzaXRlR3JvdXBzID0gW107XG4gICAgdGhpcy5maWx0ZXJlZFN0ZXBJdGVtcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLmNvbWJpbmVkVGVzdENhc2VzKSB7XG4gICAgICBpZiAoIWdyb3VwPy5zdGVwcz8ubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZ3JvdXBOYW1lID0gKGdyb3VwLm5hbWUgfHwgJ1ByZXJlcXVpc2l0ZScpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBpc1ByZXJlcSA9ICEhZ3JvdXAuaXNQcmVyZXF1aXNpdGU7XG5cbiAgICAgIGNvbnN0IGNvbGxlY3RTdGVwcyA9IChzdGVwczogYW55W10sIHNlZW46IFNldDxudW1iZXI+KTogSnVtcFRvU3RlcEl0ZW1bXSA9PiB7XG4gICAgICAgIGNvbnN0IG91dDogSnVtcFRvU3RlcEl0ZW1bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc3RlcHMpIHtcbiAgICAgICAgICBpZiAoIXMpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGlkID0gcz8uaWQgPz8gcz8uc3RlcF9pZDtcbiAgICAgICAgICBjb25zdCBudW1JZCA9IGlkICE9IG51bGwgPyBOdW1iZXIoaWQpIDogTmFOO1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG51bUlkKSB8fCBzZWVuLmhhcyhudW1JZCkpIGNvbnRpbnVlO1xuICAgICAgICAgIHNlZW4uYWRkKG51bUlkKTtcblxuICAgICAgICAgIGNvbnN0IG1ldGEgPSBtZXRhQnlTdGVwSWQuZ2V0KG51bUlkKTtcbiAgICAgICAgICBpZiAobWV0YSAmJiBtYXRjaGVzU2VhcmNoKG1ldGEpKSB7XG4gICAgICAgICAgICBvdXQucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiBTdHJpbmcobnVtSWQpLFxuICAgICAgICAgICAgICBzdGVwSWQ6IG51bUlkLFxuICAgICAgICAgICAgICBzdGVwTnVtYmVyOiBtZXRhLnN0ZXBOdW1iZXIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnN0cmlwSHRtbChtZXRhLmxhYmVsIHx8ICgnU3RlcCAnICsgbWV0YS5zdGVwTnVtYmVyKSksXG4gICAgICAgICAgICAgIHN0YXR1czogbWV0YS5zdGF0dXMsXG4gICAgICAgICAgICAgIGlzUHJlcmVxdWlzaXRlOiBtZXRhLmlzUHJlcmVxdWlzaXRlLFxuICAgICAgICAgICAgICBncm91cE5hbWU6IG1ldGEuZ3JvdXBOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBhcnIgb2YgW3MuY2hpbGRyZW4gfHwgW10sIHMubmVzdGVkU3RlcHMgfHwgW10sIHMuc3RlcHMgfHwgW11dKSB7XG4gICAgICAgICAgICBpZiAoYXJyPy5sZW5ndGgpIG91dC5wdXNoKC4uLmNvbGxlY3RTdGVwcyhhcnIsIHNlZW4pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMuYnJhbmNoZXMgJiYgQXJyYXkuaXNBcnJheShzLmJyYW5jaGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBiIG9mIHMuYnJhbmNoZXMpIHtcbiAgICAgICAgICAgICAgaWYgKGI/LnN1YlN0ZXBzPy5sZW5ndGgpIG91dC5wdXNoKC4uLmNvbGxlY3RTdGVwcyhiLnN1YlN0ZXBzLCBzZWVuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICBjb25zdCBpdGVtcyA9IGNvbGxlY3RTdGVwcyhncm91cC5zdGVwcywgc2Vlbik7XG5cbiAgICAgIGlmIChpc1ByZXJlcSAmJiB0aGlzLnNob3dQcmVyZXF1aXNpdGVzKSB7XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnByZXJlcXVpc2l0ZUdyb3Vwcy5wdXNoKHsgbmFtZTogZ3JvdXBOYW1lLCBpdGVtcyB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaXNQcmVyZXEpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFN0ZXBJdGVtcy5wdXNoKC4uLml0ZW1zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBbXG4gICAgICAuLi50aGlzLnByZXJlcXVpc2l0ZUdyb3Vwcy5yZWR1Y2U8SnVtcFRvU3RlcEl0ZW1bXT4oKGFjYywgZykgPT4gYWNjLmNvbmNhdChnLml0ZW1zKSwgW10pLFxuICAgICAgLi4udGhpcy5maWx0ZXJlZFN0ZXBJdGVtcyxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEZyb21JdGVtcygpOiB2b2lkIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGlmICghc2VhcmNoVGVybSkge1xuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgY29uc3Qgc3RlcE51bWJlck1hdGNoID0gU3RyaW5nKGl0ZW0uc3RlcE51bWJlcikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtKTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb25NYXRjaCA9IChpdGVtLmRlc2NyaXB0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pO1xuICAgICAgICByZXR1cm4gc3RlcE51bWJlck1hdGNoIHx8IGRlc2NyaXB0aW9uTWF0Y2g7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVyZXFJdGVtcyA9IHRoaXMuZmlsdGVyZWRJdGVtcy5maWx0ZXIoaSA9PiBpLmlzUHJlcmVxdWlzaXRlID09PSB0cnVlKTtcbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgSnVtcFRvU3RlcEl0ZW1bXT4oKTtcbiAgICBwcmVyZXFJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IChpdGVtLmdyb3VwTmFtZSB8fCAnUHJlcmVxdWlzaXRlJykudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZ3JvdXBzLmdldChuYW1lKTtcbiAgICAgIGlmIChleGlzdGluZykgZXhpc3RpbmcucHVzaChpdGVtKTtcbiAgICAgIGVsc2UgZ3JvdXBzLnNldChuYW1lLCBbaXRlbV0pO1xuICAgIH0pO1xuICAgIHRoaXMucHJlcmVxdWlzaXRlR3JvdXBzID0gQXJyYXkuZnJvbShncm91cHMuZW50cmllcygpKS5tYXAoKFtuYW1lLCBpdGVtc10pID0+ICh7IG5hbWUsIGl0ZW1zIH0pKTtcbiAgICB0aGlzLmZpbHRlcmVkU3RlcEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmZpbHRlcihpID0+IGkuaXNQcmVyZXF1aXNpdGUgIT09IHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHJpcEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWwpIHJldHVybiAnJztcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICByZXR1cm4gKGRpdi50ZXh0Q29udGVudCB8fCBkaXYuaW5uZXJUZXh0IHx8ICcnKS50cmltKCk7XG4gIH1cblxuICBpc0dyb3VwRXhwYW5kZWQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRHcm91cE5hbWVzLmhhcyhuYW1lKTtcbiAgfVxuXG4gIHRvZ2dsZUdyb3VwKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4cGFuZGVkR3JvdXBOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRHcm91cE5hbWVzLmRlbGV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHBhbmRlZEdyb3VwTmFtZXMuYWRkKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uU2VhcmNoVmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLm9uU2VhcmNoLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25JdGVtQ2xpY2soaXRlbTogSnVtcFRvU3RlcEl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLm9uU2VsZWN0LmVtaXQoaXRlbSk7XG4gIH1cblxuICBvbkJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgXG4gICAgaWYgKHRhcmdldCA9PT0gY3VycmVudFRhcmdldCB8fCB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RhbC1iYWNrZHJvcCcpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlQ2xhc3NlcyhzdGF0dXM6IFN0ZXBJdGVtU3RhdHVzKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9ICdjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJvdW5kZWQtWzZweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1weS1bNHB4XSBjcWEtcHgtMyc7XG4gICAgXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ3Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyZWVuLTEwMCBjcWEtdGV4dC1ncmVlbi04MDBgO1xuICAgICAgY2FzZSAnY3VycmVudCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWJsdWUtMTAwIGNxYS10ZXh0LWJsdWUtODAwYDtcbiAgICAgIGNhc2UgJ3BlbmRpbmcnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTEwMCBjcWEtdGV4dC1ncmF5LTgwMGA7XG4gICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1yZWQtMTAwIGNxYS10ZXh0LXJlZC04MDBgO1xuICAgICAgY2FzZSAncnVubmluZyc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWJsdWUtMTAwIGNxYS10ZXh0LWJsdWUtODAwYDtcbiAgICAgIGNhc2UgJ3NraXBwZWQnOlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTEwMCBjcWEtdGV4dC1ncmF5LTgwMGA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YmFzZUNsYXNzZXN9IGNxYS1iZy1ncmF5LTEwMCBjcWEtdGV4dC1ncmF5LTgwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGhhc0l0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMgJiYgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgaXRlbXNDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMgPyB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0IHN0ZXBOdW1iZXIgdG8gc3RyaW5nIGZvciB0aGUgYmFkZ2UgbGFiZWwgKFN0cmluZygpIGlzIG5vdCBhdmFpbGFibGUgaW4gdGVtcGxhdGVzKSAqL1xuICB0b0xhYmVsKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAnJyArIHZhbHVlO1xuICB9XG5cbiAgdHJhY2tCeUl0ZW1JZChpbmRleDogbnVtYmVyLCBpdGVtOiBKdW1wVG9TdGVwSXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cbn1cblxuIiwiPGRpdiAqbmdJZj1cImlzT3BlblwiXG4gIGNsYXNzPVwibW9kYWwtYmFja2Ryb3AgY3FhLWZpeGVkIGNxYS1pbnNldC0wIGNxYS1iZy1ibGFjayBjcWEtYmctb3BhY2l0eS01MCBjcWEtei01MCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCJcbiAgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygkZXZlbnQpXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImNxYS1yb3VuZGVkLWxnIGNxYS1iZy13aGl0ZSBjcWEtc2hhZG93LWxnICBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNTAwcHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLWZsZXggY3FhLWZsZXgtY29sXCJcbiAgICBzdHlsZT1cImJveC1zaGFkb3c6IDBweCA4cHggOHB4IC00cHggIzEwMTgyODA4OyBtYXgtaGVpZ2h0OiA5MHZoO1wiXG4gICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuXG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtNiBjcWEtcHQtNiBjcWEtcGItNFwiPlxuICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtYmFzZSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLWxlYWRpbmctWzI0cHhdIGNxYS1mb250LWludGVyXCI+XG4gICAgICAgIHt7IHRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy02IGNxYS1oLTYgY3FhLXAtMCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdGV4dC1ncmF5LTUwMCBob3ZlcjpjcWEtdGV4dC1ncmF5LTcwMCBjcWEtdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xvc2UoKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdICFjcWEtYmxvY2sgIWNxYS1sZWFkaW5nLW5vbmVcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuXG4gICAgPCEtLSBTZWFyY2ggQmFyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJlbmFibGVTZWFyY2hcIiBjbGFzcz1cImNxYS1weC02IGNxYS1wYi00XCI+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VhcmNoVmFsdWVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPC9jcWEtc2VhcmNoLWJhcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRGl2aWRlciBiZWxvdyBzZWFyY2ggLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS0tbXgtMiBjcWEtdy1bY2FsYygxMDAlKzFyZW0pXSBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1oLXB4IGNxYS13LWZ1bGwgY3FhLWJnLVsjRTVFN0VCXVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3RlcHMgTGlzdCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1vdmVyZmxvdy14LWhpZGRlbiBjcWEtcHgtNiBjcWEtcHQtMlwiIHN0eWxlPVwic2Nyb2xsYmFyLXdpZHRoOiB0aGluO1wiPlxuICAgICAgPCEtLSBFbXB0eSBTdGF0ZSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaGFzSXRlbXNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktMTIgY3FhLXRleHQtY2VudGVyXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtZ3JheS01MDAgY3FhLWZvbnQtaW50ZXJcIj5cbiAgICAgICAgIHt7c2VhcmNoRW1wdHlTdGF0ZUxhYmVsIHx8ICdObyBEYXRhIGZvdW5kLid9fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwcyBMaXN0IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImhhc0l0ZW1zXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG5cbiAgICAgICAgPCEtLSBQcmVyZXF1aXNpdGUgc3RlcHM6IGFjY29yZGlvbiBieSB0ZXN0IGNhc2UgbmFtZSAoc3R5bGVkIGxpa2UgY3FhLW1haW4tc3RlcC1jb2xsYXBzZSkgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UHJlcmVxdWlzaXRlcyAmJiBwcmVyZXF1aXNpdGVHcm91cHM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBncm91cCBvZiBwcmVyZXF1aXNpdGVHcm91cHNcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW10LTIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMyBjcWEtcHgtMyBjcWEtcHktMiBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLWJnLVsjRUVGMkZGXSBjcWEtcm91bmRlZC1bNHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNDNkQyRkZdIGNxYS1ib3JkZXItc29saWQgY3FhLXctZnVsbFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUdyb3VwKGdyb3VwLm5hbWUpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImlzR3JvdXBFeHBhbmRlZChncm91cC5uYW1lKVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjNEYzOUY2XCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy1bMTdweF0gY3FhLXRleHQtWyMzMTJDODVdIGNxYS1mbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXAubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzR3JvdXBFeHBhbmRlZChncm91cC5uYW1lKVwiIGNsYXNzPVwiY3FhLW10LTIgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMiBjcWEtcHgtMi41XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXAuaXRlbXM7IHRyYWNrQnk6IHRyYWNrQnlJdGVtSWRcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0zIGNxYS1weC0zIGNxYS1weS0zIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtYm9yZGVyLTAgY3FhLWJnLXRyYW5zcGFyZW50IGhvdmVyOmNxYS1iZy1ncmF5LTUwIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLXJvdW5kZWQtbWQgY3FhLW1pbi13LTBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcm91bmRlZC1bNnB4XSBjcWEtdGV4dC14cyBjcWEtZm9udC1tZWRpdW0gY3FhLXB5LVs0cHhdIGNxYS1weC1bMTBweF0gY3FhLWZsZXgtc2hyaW5rLTAgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFMkU4RjBdIGNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtYmctWyNGOEY5RkZdXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDMycHg7XCI+e3sgaXRlbS5zdGVwTnVtYmVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS10ZXh0LXNtIGNxYS10ZXh0LVsjMEEwQTBBXSBjcWEtZm9udC1pbnRlciBjcWEtZm9udC1ub3JtYWwgY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1taW4tdy0wIGNxYS10cnVuY2F0ZVwiPnt7IGl0ZW0uZGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQmFkZ2VDbGFzc2VzKGl0ZW0uc3RhdHVzKVwiPnt7IGl0ZW0uc3RhdHVzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZFN0ZXBJdGVtcz8ubGVuZ3RoXCIgY2xhc3M9XCJjcWEtaC1weCBjcWEtdy1mdWxsIGNxYS1iZy1bI0U1RTdFQl0gY3FhLW15LTEgY3FhLW1iLTJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gTWFpbiB0ZXN0IHN0ZXBzIHNlY3Rpb24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZFN0ZXBJdGVtcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tYi0xXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXVwcGVyY2FzZSBjcWEtdHJhY2tpbmctd2lkZVwiPlxuICAgICAgICAgICAgICBUZXN0IHN0ZXBzXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTFcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRTdGVwSXRlbXM7IHRyYWNrQnk6IHRyYWNrQnlJdGVtSWRcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtcHgtMyBjcWEtcHktMyBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLWJvcmRlci0wIGNxYS1iZy10cmFuc3BhcmVudCBob3ZlcjpjcWEtYmctZ3JheS01MCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1yb3VuZGVkLW1kIGNxYS1taW4tdy0wXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCI+XG5cbiAgICAgICAgICAgICAgPCEtLSBTdGVwIE51bWJlciBCYWRnZSAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXJvdW5kZWQtWzZweF0gY3FhLXRleHQteHMgY3FhLWZvbnQtbWVkaXVtIGNxYS1weS1bNHB4XSBjcWEtcHgtWzEwcHhdIGNxYS1mbGV4LXNocmluay0wIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTJFOEYwXSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLWJnLVsjRjhGOUZGXVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDMycHg7XCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5zdGVwTnVtYmVyIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICA8IS0tIFN0ZXAgRGVzY3JpcHRpb24gLS0+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLWZvbnQtaW50ZXIgY3FhLWZvbnQtbm9ybWFsIGNxYS1sZWFkaW5nLVsyMHB4XSBjcWEtbWluLXctMCBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICA8IS0tIFN0YXR1cyBCYWRnZSAtLT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIFtuZ0NsYXNzXT1cImdldFN0YXR1c0JhZGdlQ2xhc3NlcyhpdGVtLnN0YXR1cylcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLnN0YXR1cyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9vdGVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJoYXNJdGVtc1wiIGNsYXNzPVwiY3FhLXB4LTYgY3FhLXBiLTUgY3FhLXB0LTNcIj5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM2QjcyODBdIGNxYS1mb250LWludGVyIGNxYS1mb250LW5vcm1hbFwiPlxuICAgICAgICB7eyBpdGVtc0NvdW50IH19IHt7IGl0ZW1zQ291bnQgPT09IDEgPyAnc3RlcCcgOiAnc3RlcHMnIH19IGZvdW5kXG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|