@cqa-lib/cqa-ui 1.1.187 → 1.1.189

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +27 -3
  2. package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +31 -6
  3. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-data.mjs +3 -0
  4. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-field.config.mjs +188 -0
  5. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer-ref.mjs +28 -0
  6. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.component.mjs +291 -0
  7. package/esm2020/lib/test-case-details/step-details-drawer/step-details-drawer.service.mjs +67 -0
  8. package/esm2020/lib/ui-kit.module.mjs +8 -3
  9. package/esm2020/lib/utils/tw-overlay-container.mjs +6 -3
  10. package/esm2020/public-api.mjs +6 -1
  11. package/fesm2015/cqa-lib-cqa-ui.mjs +626 -12
  12. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  13. package/fesm2020/cqa-lib-cqa-ui.mjs +616 -12
  14. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  15. package/lib/dynamic-select/dynamic-select-field.component.d.ts +6 -0
  16. package/lib/test-case-details/step-details-drawer/step-details-drawer-data.d.ts +7 -0
  17. package/lib/test-case-details/step-details-drawer/step-details-drawer-field.config.d.ts +51 -0
  18. package/lib/test-case-details/step-details-drawer/step-details-drawer-ref.d.ts +13 -0
  19. package/lib/test-case-details/step-details-drawer/step-details-drawer.component.d.ts +60 -0
  20. package/lib/test-case-details/step-details-drawer/step-details-drawer.service.d.ts +22 -0
  21. package/lib/ui-kit.module.d.ts +21 -20
  22. package/package.json +1 -1
  23. package/public-api.d.ts +5 -0
  24. package/styles.css +1 -1
@@ -0,0 +1,291 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core';
2
+ import { getStepDetailsStepType, STEP_DETAILS_FIELDS_BY_TYPE, STEP_DETAILS_FIELD_META, ADVANCED_TOGGLE_KEYS, ADVANCED_SUBFIELDS_BY_TYPE, } from './step-details-drawer-field.config';
3
+ import { STEP_DETAILS_DRAWER_REF } from './step-details-drawer-ref';
4
+ import { STEP_DETAILS_DRAWER_DATA } from './step-details-drawer-data';
5
+ import { isNormalStepConfig, isApiStepConfig, isAiAgentStepConfig, } from '../test-case-step.models';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/forms";
8
+ import * as i2 from "@angular/material/icon";
9
+ import * as i3 from "../../custom-toggle/custom-toggle.component";
10
+ import * as i4 from "../../dynamic-select/dynamic-select-field.component";
11
+ import * as i5 from "../../custom-input/custom-input.component";
12
+ import * as i6 from "../../custom-textarea/custom-textarea.component";
13
+ import * as i7 from "../../button/button.component";
14
+ import * as i8 from "@angular/common";
15
+ import * as i9 from "./step-details-drawer-ref";
16
+ /**
17
+ * Step Details Drawer (Edit In Depth).
18
+ * Single reusable component; form is dynamic by Step Type via configuration.
19
+ * No Priority section. Uses CQA components only.
20
+ */
21
+ export class StepDetailsDrawerComponent {
22
+ constructor(ref, fb, cdr, data) {
23
+ this.ref = ref;
24
+ this.fb = fb;
25
+ this.cdr = cdr;
26
+ this.saveChanges = new EventEmitter();
27
+ this.cancel = new EventEmitter();
28
+ this.saveAsTemplate = new EventEmitter();
29
+ /** Optional: when provided (e.g. from Storybook Controls), use instead of STEP_DETAILS_DRAWER_DATA. */
30
+ this.stepData = null;
31
+ this.stepNumberInput = null;
32
+ this.stepType = null;
33
+ this.visibleFields = [];
34
+ this.fieldMeta = STEP_DETAILS_FIELD_META;
35
+ this.advancedToggleKeys = ADVANCED_TOGGLE_KEYS;
36
+ this.advancedExpanded = false;
37
+ this.agentTaskExpanded = true;
38
+ /** Cached select configs (stable references per key) to avoid infinite change detection in template. */
39
+ this.selectConfigMap = this.buildSelectConfigMap();
40
+ this.step = data?.step ?? {};
41
+ this.stepNumber = data?.stepNumber ?? 1;
42
+ this.form = this.fb.group({});
43
+ this.syncStepTypeAndForm();
44
+ }
45
+ /** Subfields to show inside Advanced section for current step type. */
46
+ get advancedSubfields() {
47
+ return this.stepType ? ADVANCED_SUBFIELDS_BY_TYPE[this.stepType] : [];
48
+ }
49
+ ngOnInit() {
50
+ if (this.stepData != null) {
51
+ this.step = this.stepData;
52
+ this.stepNumber = this.stepNumberInput ?? this.stepData.stepNumber ?? 1;
53
+ this.syncStepTypeAndForm();
54
+ this.cdr.markForCheck();
55
+ }
56
+ }
57
+ ngOnChanges(changes) {
58
+ if (changes['stepData'] || changes['stepNumberInput']) {
59
+ if (this.stepData != null) {
60
+ this.step = this.stepData;
61
+ this.stepNumber = this.stepNumberInput ?? this.stepData.stepNumber ?? 1;
62
+ }
63
+ this.syncStepTypeAndForm();
64
+ this.cdr.detectChanges();
65
+ }
66
+ }
67
+ syncStepTypeAndForm() {
68
+ this.stepType = getStepDetailsStepType(this.step);
69
+ this.visibleFields = this.stepType ? STEP_DETAILS_FIELDS_BY_TYPE[this.stepType] : [];
70
+ this.buildFormFromStep();
71
+ }
72
+ buildFormFromStep() {
73
+ const group = {};
74
+ for (const key of this.visibleFields) {
75
+ if (key === 'advanced')
76
+ continue;
77
+ group[key] = [this.getStepValue(key)];
78
+ }
79
+ for (const key of ADVANCED_TOGGLE_KEYS) {
80
+ if (!(key in group))
81
+ group[key] = [this.getStepValue(key)];
82
+ }
83
+ this.form = this.fb.group(group);
84
+ }
85
+ getStepValue(key) {
86
+ const step = this.step;
87
+ if (isNormalStepConfig(this.step) && this.step.eventType === 'custom') {
88
+ if (key === 'description') {
89
+ const params = this.step.parameters;
90
+ return params?.[0]?.value ?? this.step.description ?? '';
91
+ }
92
+ if (key === 'metadata') {
93
+ const params = this.step.parameters;
94
+ return params?.[1]?.value ?? '';
95
+ }
96
+ }
97
+ if (isApiStepConfig(this.step)) {
98
+ const api = this.step;
99
+ if (key === 'method')
100
+ return api.method ?? 'GET';
101
+ if (key === 'url')
102
+ return api.baseUrl ? `${api.baseUrl}${api.endpoint || ''}` : api.endpoint ?? '';
103
+ if (key === 'headers')
104
+ return api.headers ? JSON.stringify(api.headers, null, 2) : '';
105
+ if (key === 'body')
106
+ return api.requestBody ?? '';
107
+ if (key === 'saveOutputAsVariable')
108
+ return api.saveTo ?? '';
109
+ }
110
+ if (isAiAgentStepConfig(this.step)) {
111
+ const ai = this.step;
112
+ if (key === 'agentTask')
113
+ return ai.instructions ?? '';
114
+ if (key === 'description')
115
+ return ai.description ?? '';
116
+ if (key === 'metadata')
117
+ return step.metadata ?? '';
118
+ }
119
+ if (key === 'onlyUseAttachedContext' ||
120
+ key === 'takeScreenshotsWhenVerifying' ||
121
+ key === 'continueOnError' ||
122
+ key === 'disabled') {
123
+ return step[key] === true;
124
+ }
125
+ return step[key] ?? '';
126
+ }
127
+ setStepValue(key, value) {
128
+ const step = this.step;
129
+ if (isNormalStepConfig(this.step) && this.step.eventType === 'custom') {
130
+ if (key === 'description') {
131
+ const params = this.step.parameters;
132
+ if (params?.[0])
133
+ params[0].value = String(value);
134
+ else
135
+ this.step.description = String(value);
136
+ return;
137
+ }
138
+ if (key === 'metadata') {
139
+ const params = this.step.parameters;
140
+ if (params?.[1])
141
+ params[1].value = String(value);
142
+ return;
143
+ }
144
+ }
145
+ if (isApiStepConfig(this.step)) {
146
+ const api = this.step;
147
+ if (key === 'method') {
148
+ api.method = value;
149
+ return;
150
+ }
151
+ if (key === 'url') {
152
+ api.endpoint = String(value);
153
+ return;
154
+ }
155
+ if (key === 'headers') {
156
+ try {
157
+ api.headers = JSON.parse(String(value) || '{}');
158
+ }
159
+ catch {
160
+ api.headers = {};
161
+ }
162
+ return;
163
+ }
164
+ if (key === 'body') {
165
+ api.requestBody = String(value);
166
+ return;
167
+ }
168
+ if (key === 'saveOutputAsVariable') {
169
+ api.saveTo = String(value);
170
+ return;
171
+ }
172
+ }
173
+ if (isAiAgentStepConfig(this.step)) {
174
+ const ai = this.step;
175
+ if (key === 'agentTask') {
176
+ ai.instructions = String(value);
177
+ return;
178
+ }
179
+ if (key === 'description') {
180
+ ai.description = String(value);
181
+ return;
182
+ }
183
+ if (key === 'metadata') {
184
+ step.metadata = value;
185
+ return;
186
+ }
187
+ }
188
+ step[key] = value;
189
+ }
190
+ onBack() {
191
+ this.cancel.emit();
192
+ this.ref.close(undefined);
193
+ }
194
+ onClose() {
195
+ this.cancel.emit();
196
+ this.ref.close(undefined);
197
+ }
198
+ onCancel() {
199
+ this.cancel.emit();
200
+ this.ref.close(undefined);
201
+ }
202
+ onSaveAsTemplate() {
203
+ this.applyFormToStep();
204
+ this.saveAsTemplate.emit(this.step);
205
+ this.ref.close({ action: 'saveAsTemplate', step: this.step });
206
+ }
207
+ onSaveChanges() {
208
+ this.applyFormToStep();
209
+ this.saveChanges.emit(this.step);
210
+ this.ref.close({ action: 'saveChanges', step: this.step });
211
+ }
212
+ applyFormToStep() {
213
+ for (const key of this.visibleFields) {
214
+ if (key === 'advanced')
215
+ continue;
216
+ if (this.form.contains(key))
217
+ this.setStepValue(key, this.form.get(key)?.value);
218
+ }
219
+ for (const key of ADVANCED_TOGGLE_KEYS) {
220
+ if (this.form.contains(key))
221
+ this.setStepValue(key, this.form.get(key)?.value);
222
+ }
223
+ }
224
+ /** Build cached map of select configs from field meta (stable refs to prevent CD loops). */
225
+ buildSelectConfigMap() {
226
+ const map = {};
227
+ const keys = Object.keys(STEP_DETAILS_FIELD_META);
228
+ for (const key of keys) {
229
+ const meta = STEP_DETAILS_FIELD_META[key];
230
+ if (!meta || meta.controlType !== 'dropdown' || !meta.options?.length)
231
+ continue;
232
+ const options = meta.options.map((o) => ({ value: o.value, label: o.label }));
233
+ map[key] = {
234
+ key: meta.key,
235
+ placeholder: meta.placeholder ?? meta.label,
236
+ options,
237
+ };
238
+ }
239
+ return map;
240
+ }
241
+ /** Return cached select config for key (for template use; same reference every time). */
242
+ getSelectConfig(key) {
243
+ return this.selectConfigMap[key] ?? null;
244
+ }
245
+ /** Whether this key is the first in its section (for showing section headings). */
246
+ isFirstInSection(key, section) {
247
+ const meta = STEP_DETAILS_FIELD_META[key];
248
+ if (!meta || meta.section !== section)
249
+ return false;
250
+ const idx = this.visibleFields.indexOf(key);
251
+ if (idx <= 0)
252
+ return true;
253
+ const prevMeta = STEP_DETAILS_FIELD_META[this.visibleFields[idx - 1]];
254
+ return !prevMeta || prevMeta.section !== section;
255
+ }
256
+ /** Dynamic drawer title by step type (e.g. "AI Agent Step Details"). */
257
+ get drawerTitle() {
258
+ if (this.stepType === 'custom')
259
+ return 'Custom Step Details';
260
+ if (this.stepType === 'api')
261
+ return 'API Step Details';
262
+ if (this.stepType === 'aiAgent')
263
+ return 'AI Agent Step Details';
264
+ return 'Step Details';
265
+ }
266
+ }
267
+ StepDetailsDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, deps: [{ token: STEP_DETAILS_DRAWER_REF }, { token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: STEP_DETAILS_DRAWER_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
268
+ StepDetailsDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepDetailsDrawerComponent, selector: "cqa-step-details-drawer", inputs: { stepData: "stepData", stepNumberInput: "stepNumberInput" }, outputs: { saveChanges: "saveChanges", cancel: "cancel", saveAsTemplate: "saveAsTemplate" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<!-- Step Details Drawer \u2013 Edit In Depth. No Priority. Fully config-driven. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, dynamic title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ drawerTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: Attributes + dynamic fields from config -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"stepType\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <ng-container *ngFor=\"let key of visibleFields\">\n <!-- Section heading: Constraints (first constraints field only) -->\n <ng-container *ngIf=\"key !== 'advanced' && isFirstInSection(key, 'constraints')\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n </ng-container>\n\n <!-- Advanced: expandable section with config-driven toggles + subfields -->\n <ng-container *ngIf=\"key === 'advanced'\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <!-- Advanced toggles from config -->\n <ng-container *ngFor=\"let toggleKey of advancedToggleKeys\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"fieldMeta[toggleKey]\">\n <cqa-custom-toggle\n [checked]=\"form.get(toggleKey)?.value\"\n (checkedChange)=\"form.get(toggleKey)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ fieldMeta[toggleKey].label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"fieldMeta[toggleKey].subLabel\">{{ fieldMeta[toggleKey].subLabel }}</span>\n </div>\n </div>\n </ng-container>\n <!-- Advanced subfields (e.g. Retry Count, Iframe locator, Other Locators for aiAgent) -->\n <ng-container *ngFor=\"let subKey of advancedSubfields\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\" *ngIf=\"fieldMeta[subKey]?.controlType === 'dropdown' && getSelectConfig(subKey) && form.contains(subKey)\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[subKey].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(subKey)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Skip: advanced key (already rendered) and fields that are rendered inside advanced for this step type -->\n <ng-container *ngIf=\"key !== 'advanced' && !(stepType === 'aiAgent' && advancedSubfields.includes(key))\">\n <!-- text -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'text'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-input\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea (including agentTask with optional required + tip) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <span *ngIf=\"fieldMeta[key].required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <p *ngIf=\"key === 'agentTask'\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">What should the agent achieve?</p>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"fieldMeta[key].rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"fieldMeta[key].tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ fieldMeta[key].tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- dropdown (main + constraints; advanced-only dropdowns rendered inside Advanced section) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'dropdown' && form.contains(key) && getSelectConfig(key) && !advancedSubfields.includes(key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(key)!\">\n </cqa-dynamic-select>\n </div>\n\n <!-- toggle (e.g. onlyUseAttachedContext, takeScreenshotsWhenVerifying) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'toggle'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ fieldMeta[key].label }}</p>\n <span *ngIf=\"fieldMeta[key].subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(key)?.value\"\n (checkedChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!stepType\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">This step type is not supported in the drawer.</p>\n </div>\n<div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.CustomToggleComponent, selector: "cqa-custom-toggle", inputs: ["checked", "disabled", "ariaLabel"], outputs: ["checkedChange", "change"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.CustomTextareaComponent, selector: "cqa-custom-textarea", inputs: ["label", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "rows", "cols", "resize", "textareaInlineStyle", "labelInlineStyle", "customClass"], outputs: ["valueChange", "blurred", "focused"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
269
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerComponent, decorators: [{
270
+ type: Component,
271
+ args: [{ selector: 'cqa-step-details-drawer', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Step Details Drawer \u2013 Edit In Depth. No Priority. Fully config-driven. -->\n<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-w-full cqa-max-w-[480px] cqa-box-border\">\n <!-- Header: back chevron, dynamic title, Step N pill, close -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-px-4 cqa-py-4 cqa-bg-white cqa-rounded-t-[12px] cqa-border cqa-border-[#E5E5E5]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button type=\"button\" (click)=\"onBack()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-8 cqa-h-8 cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n aria-label=\"Back\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">chevron_left</mat-icon>\n </button>\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-1\">\n {{ drawerTitle }}\n </h2>\n <span class=\"cqa-px-2.5 cqa-py-1 cqa-rounded-lg cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[12px] cqa-font-medium\">\n Step {{ stepNumber }}\n </span>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px]\">close</mat-icon>\n </button>\n </div>\n <div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n\n <!-- Content: Attributes + dynamic fields from config -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-bg-white cqa-px-4 cqa-py-4\">\n <ng-container *ngIf=\"stepType\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-3 cqa-mt-0\">Attributes</p>\n\n <div class=\"cqa-flex cqa-flex-col cqa-gap-4\">\n <ng-container *ngFor=\"let key of visibleFields\">\n <!-- Section heading: Constraints (first constraints field only) -->\n <ng-container *ngIf=\"key !== 'advanced' && isFirstInSection(key, 'constraints')\">\n <p class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#6B7280] cqa-mb-2 cqa-mt-0\">Constraints</p>\n </ng-container>\n\n <!-- Advanced: expandable section with config-driven toggles + subfields -->\n <ng-container *ngIf=\"key === 'advanced'\">\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-w-full cqa-text-left cqa-text-[12px] cqa-font-medium cqa-text-[#111827] cqa-py-2 cqa-border-b cqa-border-[#E5E7EB]\"\n (click)=\"advancedExpanded = !advancedExpanded\">\n <span>Advanced</span>\n <mat-icon class=\"cqa-text-[20px] cqa-transition-transform\" [class.cqa-rotate-180]=\"!advancedExpanded\">\n expand_less\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-pt-2\">\n <!-- Advanced toggles from config -->\n <ng-container *ngFor=\"let toggleKey of advancedToggleKeys\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"fieldMeta[toggleKey]\">\n <cqa-custom-toggle\n [checked]=\"form.get(toggleKey)?.value\"\n (checkedChange)=\"form.get(toggleKey)?.setValue($event)\">\n </cqa-custom-toggle>\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#737373]\">{{ fieldMeta[toggleKey].label }}</span>\n <span class=\"cqa-text-[12px] cqa-text-[#0A0A0A]\" *ngIf=\"fieldMeta[toggleKey].subLabel\">{{ fieldMeta[toggleKey].subLabel }}</span>\n </div>\n </div>\n </ng-container>\n <!-- Advanced subfields (e.g. Retry Count, Iframe locator, Other Locators for aiAgent) -->\n <ng-container *ngFor=\"let subKey of advancedSubfields\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\" *ngIf=\"fieldMeta[subKey]?.controlType === 'dropdown' && getSelectConfig(subKey) && form.contains(subKey)\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[subKey].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(subKey)!\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Skip: advanced key (already rendered) and fields that are rendered inside advanced for this step type -->\n <ng-container *ngIf=\"key !== 'advanced' && !(stepType === 'aiAgent' && advancedSubfields.includes(key))\">\n <!-- text -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'text'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-input\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-input>\n </div>\n\n <!-- textarea (including agentTask with optional required + tip) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'textarea'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <span *ngIf=\"fieldMeta[key].required\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded-full cqa-bg-[#FEE2E2] cqa-text-[#DC2626] cqa-text-[10px] cqa-font-medium\">Required</span>\n </div>\n <p *ngIf=\"key === 'agentTask'\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">What should the agent achieve?</p>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"fieldMeta[key].rows || 4\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n <p *ngIf=\"fieldMeta[key].tip\" class=\"cqa-text-[12px] cqa-text-[#6B7280] cqa-m-0\">{{ fieldMeta[key].tip }}</p>\n </div>\n\n <!-- code -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'code'\" class=\"cqa-flex cqa-flex-col cqa-gap-1.5\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-custom-textarea\n [placeholder]=\"fieldMeta[key].placeholder || ''\"\n [value]=\"form.get(key)?.value\"\n [fullWidth]=\"true\"\n [rows]=\"8\"\n resize=\"vertical\"\n customClass=\"cqa-p-2 cqa-text-[14px] cqa-leading-[20px]\"\n (valueChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-textarea>\n </div>\n\n <!-- dropdown (main + constraints; advanced-only dropdowns rendered inside Advanced section) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'dropdown' && form.contains(key) && getSelectConfig(key) && !advancedSubfields.includes(key)\"\n class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-step-details-drawer-select\">\n <label class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].label }}</label>\n <cqa-dynamic-select [form]=\"form\" [config]=\"getSelectConfig(key)!\">\n </cqa-dynamic-select>\n </div>\n\n <!-- toggle (e.g. onlyUseAttachedContext, takeScreenshotsWhenVerifying) -->\n <div *ngIf=\"fieldMeta[key]?.controlType === 'toggle'\" class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2\">\n <div>\n <p class=\"cqa-text-[12px] cqa-text-[#111827] cqa-m-0\">{{ fieldMeta[key].label }}</p>\n <span *ngIf=\"fieldMeta[key].subLabel\" class=\"cqa-text-[12px] cqa-font-medium cqa-text-[#374151]\">{{ fieldMeta[key].subLabel }}</span>\n </div>\n <cqa-custom-toggle\n [checked]=\"form.get(key)?.value\"\n (checkedChange)=\"form.get(key)?.setValue($event)\">\n </cqa-custom-toggle>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <p *ngIf=\"!stepType\" class=\"cqa-text-[14px] cqa-text-[#6B7280]\">This step type is not supported in the drawer.</p>\n </div>\n<div class=\"cqa-border cqa-border-solid cqa-border-[#E5E5E5]\"> </div>\n <!-- Footer -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-start cqa-gap-2 cqa-px-4 cqa-py-4 cqa-border-t cqa-border-[#E5E7EB] cqa-bg-[#F5F5F54D]\">\n <cqa-button variant=\"text\" btnSize=\"lg\" [text]=\"'Cancel'\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-text-[#374151]'\"></cqa-button>\n <div class=\"cqa-flex-1 cqa-min-w-0\"></div>\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Save as Template'\" (clicked)=\"onSaveAsTemplate()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Save Changes'\" (clicked)=\"onSaveChanges()\"\n [customClass]=\"'cqa-text-[14px] cqa-py-[9px] cqa-bg-[#3F43EE] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n</div>\n" }]
272
+ }], ctorParameters: function () { return [{ type: i9.StepDetailsDrawerRef, decorators: [{
273
+ type: Inject,
274
+ args: [STEP_DETAILS_DRAWER_REF]
275
+ }] }, { type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
276
+ type: Optional
277
+ }, {
278
+ type: Inject,
279
+ args: [STEP_DETAILS_DRAWER_DATA]
280
+ }] }]; }, propDecorators: { saveChanges: [{
281
+ type: Output
282
+ }], cancel: [{
283
+ type: Output
284
+ }], saveAsTemplate: [{
285
+ type: Output
286
+ }], stepData: [{
287
+ type: Input
288
+ }], stepNumberInput: [{
289
+ type: Input
290
+ }] } });
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3N0ZXAtZGV0YWlscy1kcmF3ZXIvc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxzQkFBc0IsRUFJdEIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsMEJBQTBCLEdBQzNCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUF3QixNQUFNLDJCQUEyQixDQUFDO0FBQzFGLE9BQU8sRUFBRSx3QkFBd0IsRUFBeUIsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RixPQUFPLEVBS0wsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixtQkFBbUIsR0FDcEIsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7QUFNbEM7Ozs7R0FJRztBQU9ILE1BQU0sT0FBTywwQkFBMEI7SUEyQnJDLFlBQzJDLEdBQXlCLEVBQzFELEVBQWUsRUFDZixHQUFzQixFQUNnQixJQUE0QjtRQUhqQyxRQUFHLEdBQUgsR0FBRyxDQUFzQjtRQUMxRCxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE3QnRCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFDckQsV0FBTSxHQUFH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QixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsbUJBQ2IsdUJBQXVCLENBQUMsTUFBTTs7MEJBOEI1QyxNQUFNOzJCQUFDLHVCQUF1Qjs7MEJBRzlCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsd0JBQXdCOzRDQTlCcEMsV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFHRSxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgZ2V0U3RlcERldGFpbHNTdGVwVHlwZSxcbiAgU3RlcERldGFpbHNGaWVsZEtleSxcbiAgU3RlcERldGFpbHNTdGVwVHlwZSxcbiAgU3RlcERldGFpbHNGaWVsZFNlY3Rpb24sXG4gIFNURVBfREVUQUlMU19GSUVMRFNfQllfVFlQRSxcbiAgU1RFUF9ERVRBSUxTX0ZJRUxEX01FVEEsXG4gIEFEVkFOQ0VEX1RPR0dMRV9LRVlTLFxuICBBRFZBTkNFRF9TVUJGSUVMRFNfQllfVFlQRSxcbn0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWZpZWxkLmNvbmZpZyc7XG5pbXBvcnQgeyBTVEVQX0RFVEFJTFNfRFJBV0VSX1JFRiwgU3RlcERldGFpbHNEcmF3ZXJSZWYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWRhdGEnO1xuaW1wb3J0IHtcbiAgVGVzdENhc2VTdGVwQ29uZmlnLFxuICBOb3JtYWxTdGVwQ29uZmlnLFxuICBBcGlTdGVwQ29uZmlnLFxuICBBaUFnZW50U3RlcENvbmZpZyxcbiAgaXNOb3JtYWxTdGVwQ29uZmlnLFxuICBpc0FwaVN0ZXBDb25maWcsXG4gIGlzQWlBZ2VudFN0ZXBDb25maWcsXG59IGZyb20gJy4uL3Rlc3QtY2FzZS1zdGVwLm1vZGVscyc7XG5pbXBvcnQgdHlwZSB7XG4gIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyxcbiAgU2VsZWN0T3B0aW9uLFxufSBmcm9tICcuLi8uLi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFN0ZXAgRGV0YWlscyBEcmF3ZXIgKEVkaXQgSW4gRGVwdGgpLlxuICogU2luZ2xlIHJldXNhYmxlIGNvbXBvbmVudDsgZm9ybSBpcyBkeW5hbWljIGJ5IFN0ZXAgVHlwZSB2aWEgY29uZmlndXJhdGlvbi5cbiAqIE5vIFByaW9yaXR5IHNlY3Rpb24uIFVzZXMgQ1FBIGNvbXBvbmVudHMgb25seS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtZGV0YWlscy1kcmF3ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1kZXRhaWxzLWRyYXdlci5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBAT3V0cHV0KCkgc2F2ZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPFRlc3RDYXNlU3RlcENvbmZpZz4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNhdmVBc1RlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXN0Q2FzZVN0ZXBDb25maWc+KCk7XG5cbiAgLyoqIE9wdGlvbmFsOiB3aGVuIHByb3ZpZGVkIChlLmcuIGZyb20gU3Rvcnlib29rIENvbnRyb2xzKSwgdXNlIGluc3RlYWQgb2YgU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLiAqL1xuICBASW5wdXQoKSBzdGVwRGF0YTogVGVzdENhc2VTdGVwQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHN0ZXBOdW1iZXJJbnB1dDogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc3RlcDogVGVzdENhc2VTdGVwQ29uZmlnO1xuICBzdGVwTnVtYmVyOiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0ZXBUeXBlOiBTdGVwRGV0YWlsc1N0ZXBUeXBlIHwgbnVsbCA9IG51bGw7XG4gIHZpc2libGVGaWVsZHM6IFN0ZXBEZXRhaWxzRmllbGRLZXlbXSA9IFtdO1xuICBmaWVsZE1ldGEgPSBTVEVQX0RFVEFJTFNfRklFTERfTUVUQTtcbiAgYWR2YW5jZWRUb2dnbGVLZXlzID0gQURWQU5DRURfVE9HR0xFX0tFWVM7XG4gIGFkdmFuY2VkRXhwYW5kZWQgPSBmYWxzZTtcbiAgYWdlbnRUYXNrRXhwYW5kZWQgPSB0cnVlO1xuICBmb3JtOiBGb3JtR3JvdXA7XG5cbiAgLyoqIENhY2hlZCBzZWxlY3QgY29uZmlncyAoc3RhYmxlIHJlZmVyZW5jZXMgcGVyIGtleSkgdG8gYXZvaWQgaW5maW5pdGUgY2hhbmdlIGRldGVjdGlvbiBpbiB0ZW1wbGF0ZS4gKi9cbiAgcmVhZG9ubHkgc2VsZWN0Q29uZmlnTWFwOiBSZWNvcmQ8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gdGhpcy5idWlsZFNlbGVjdENvbmZpZ01hcCgpO1xuXG4gIC8qKiBTdWJmaWVsZHMgdG8gc2hvdyBpbnNpZGUgQWR2YW5jZWQgc2VjdGlvbiBmb3IgY3VycmVudCBzdGVwIHR5cGUuICovXG4gIGdldCBhZHZhbmNlZFN1YmZpZWxkcygpOiBTdGVwRGV0YWlsc0ZpZWxkS2V5W10ge1xuICAgIHJldHVybiB0aGlzLnN0ZXBUeXBlID8gQURWQU5DRURfU1VCRklFTERTX0JZX1RZUEVbdGhpcy5zdGVwVHlwZV0gOiBbXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYpIHByaXZhdGUgcmVmOiBTdGVwRGV0YWlsc0RyYXdlclJlZixcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTVEVQX0RFVEFJTFNfRFJBV0VSX0RBVEEpIGRhdGE/OiBTdGVwRGV0YWlsc0RyYXdlckRhdGFcbiAgKSB7XG4gICAgdGhpcy5zdGVwID0gZGF0YT8uc3RlcCA/PyAoe30gYXMgVGVzdENhc2VTdGVwQ29uZmlnKTtcbiAgICB0aGlzLnN0ZXBOdW1iZXIgPSBkYXRhPy5zdGVwTnVtYmVyID8/IDE7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgdGhpcy5zeW5jU3RlcFR5cGVBbmRGb3JtKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGVwRGF0YSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5zdGVwTnVtYmVySW5wdXQgPz8gKHRoaXMuc3RlcERhdGEgYXMgYW55KS5zdGVwTnVtYmVyID8/IDE7XG4gICAgICB0aGlzLnN5bmNTdGVwVHlwZUFuZEZvcm0oKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc3RlcERhdGEnXSB8fCBjaGFuZ2VzWydzdGVwTnVtYmVySW5wdXQnXSkge1xuICAgICAgaWYgKHRoaXMuc3RlcERhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXBEYXRhO1xuICAgICAgICB0aGlzLnN0ZXBOdW1iZXIgPSB0aGlzLnN0ZXBOdW1iZXJJbnB1dCA/PyAodGhpcy5zdGVwRGF0YSBhcyBhbnkpLnN0ZXBOdW1iZXIgPz8gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY1N0ZXBUeXBlQW5kRm9ybSgpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY1N0ZXBUeXBlQW5kRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXBUeXBlID0gZ2V0U3RlcERldGFpbHNTdGVwVHlwZSh0aGlzLnN0ZXApO1xuICAgIHRoaXMudmlzaWJsZUZpZWxkcyA9IHRoaXMuc3RlcFR5cGUgPyBTVEVQX0RFVEFJTFNfRklFTERTX0JZX1RZUEVbdGhpcy5zdGVwVHlwZV0gOiBbXTtcbiAgICB0aGlzLmJ1aWxkRm9ybUZyb21TdGVwKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybUZyb21TdGVwKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMudmlzaWJsZUZpZWxkcykge1xuICAgICAgaWYgKGtleSA9PT0gJ2FkdmFuY2VkJykgY29udGludWU7XG4gICAgICBncm91cFtrZXldID0gW3RoaXMuZ2V0U3RlcFZhbHVlKGtleSldO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBBRFZBTkNFRF9UT0dHTEVfS0VZUykge1xuICAgICAgaWYgKCEoa2V5IGluIGdyb3VwKSkgZ3JvdXBba2V5XSA9IFt0aGlzLmdldFN0ZXBWYWx1ZShrZXkpXTtcbiAgICB9XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChncm91cCk7XG4gIH1cblxuICBnZXRTdGVwVmFsdWUoa2V5OiBTdGVwRGV0YWlsc0ZpZWxkS2V5KTogdW5rbm93biB7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuc3RlcCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChpc05vcm1hbFN0ZXBDb25maWcodGhpcy5zdGVwKSAmJiAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLmV2ZW50VHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIGlmIChrZXkgPT09ICdkZXNjcmlwdGlvbicpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gKHRoaXMuc3RlcCBhcyBOb3JtYWxTdGVwQ29uZmlnKS5wYXJhbWV0ZXJzO1xuICAgICAgICByZXR1cm4gcGFyYW1zPy5bMF0/LnZhbHVlID8/ICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnbWV0YWRhdGEnKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9ICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykucGFyYW1ldGVycztcbiAgICAgICAgcmV0dXJuIHBhcmFtcz8uWzFdPy52YWx1ZSA/PyAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQXBpU3RlcENvbmZpZyh0aGlzLnN0ZXApKSB7XG4gICAgICBjb25zdCBhcGkgPSB0aGlzLnN0ZXAgYXMgQXBpU3RlcENvbmZpZztcbiAgICAgIGlmIChrZXkgPT09ICdtZXRob2QnKSByZXR1cm4gYXBpLm1ldGhvZCA/PyAnR0VUJztcbiAgICAgIGlmIChrZXkgPT09ICd1cmwnKSByZXR1cm4gYXBpLmJhc2VVcmwgPyBgJHthcGkuYmFzZVVybH0ke2FwaS5lbmRwb2ludCB8fCAnJ31gIDogYXBpLmVuZHBvaW50ID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ2hlYWRlcnMnKSByZXR1cm4gYXBpLmhlYWRlcnMgPyBKU09OLnN0cmluZ2lmeShhcGkuaGVhZGVycywgbnVsbCwgMikgOiAnJztcbiAgICAgIGlmIChrZXkgPT09ICdib2R5JykgcmV0dXJuIGFwaS5yZXF1ZXN0Qm9keSA/PyAnJztcbiAgICAgIGlmIChrZXkgPT09ICdzYXZlT3V0cHV0QXNWYXJpYWJsZScpIHJldHVybiBhcGkuc2F2ZVRvID8/ICcnO1xuICAgIH1cbiAgICBpZiAoaXNBaUFnZW50U3RlcENvbmZpZyh0aGlzLnN0ZXApKSB7XG4gICAgICBjb25zdCBhaSA9IHRoaXMuc3RlcCBhcyBBaUFnZW50U3RlcENvbmZpZztcbiAgICAgIGlmIChrZXkgPT09ICdhZ2VudFRhc2snKSByZXR1cm4gYWkuaW5zdHJ1Y3Rpb25zID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ2Rlc2NyaXB0aW9uJykgcmV0dXJuIChhaSBhcyBhbnkpLmRlc2NyaXB0aW9uID8/ICcnO1xuICAgICAgaWYgKGtleSA9PT0gJ21ldGFkYXRhJykgcmV0dXJuIChzdGVwIGFzIGFueSkubWV0YWRhdGEgPz8gJyc7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGtleSA9PT0gJ29ubHlVc2VBdHRhY2hlZENvbnRleHQnIHx8XG4gICAgICBrZXkgPT09ICd0YWtlU2NyZWVuc2hvdHNXaGVuVmVyaWZ5aW5nJyB8fFxuICAgICAga2V5ID09PSAnY29udGludWVPbkVycm9yJyB8fFxuICAgICAga2V5ID09PSAnZGlzYWJsZWQnXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHN0ZXAgYXMgYW55KVtrZXldID09PSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKHN0ZXAgYXMgYW55KVtrZXldID8/ICcnO1xuICB9XG5cbiAgc2V0U3RlcFZhbHVlKGtleTogU3RlcERldGFpbHNGaWVsZEtleSwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGlzTm9ybWFsU3RlcENvbmZpZyh0aGlzLnN0ZXApICYmICh0aGlzLnN0ZXAgYXMgTm9ybWFsU3RlcENvbmZpZykuZXZlbnRUeXBlID09PSAnY3VzdG9tJykge1xuICAgICAgaWYgKGtleSA9PT0gJ2Rlc2NyaXB0aW9uJykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLnBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChwYXJhbXM/LlswXSkgcGFyYW1zWzBdLnZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgZWxzZSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLmRlc2NyaXB0aW9uID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ21ldGFkYXRhJykge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSAodGhpcy5zdGVwIGFzIE5vcm1hbFN0ZXBDb25maWcpLnBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChwYXJhbXM/LlsxXSkgcGFyYW1zWzFdLnZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNBcGlTdGVwQ29uZmlnKHRoaXMuc3RlcCkpIHtcbiAgICAgIGNvbnN0IGFwaSA9IHRoaXMuc3RlcCBhcyBBcGlTdGVwQ29uZmlnO1xuICAgICAgaWYgKGtleSA9PT0gJ21ldGhvZCcpIHsgYXBpLm1ldGhvZCA9IHZhbHVlIGFzIEFwaVN0ZXBDb25maWdbJ21ldGhvZCddOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICd1cmwnKSB7IGFwaS5lbmRwb2ludCA9IFN0cmluZyh2YWx1ZSk7IHJldHVybjsgfVxuICAgICAgaWYgKGtleSA9PT0gJ2hlYWRlcnMnKSB7XG4gICAgICAgIHRyeSB7IGFwaS5oZWFkZXJzID0gSlNPTi5wYXJzZShTdHJpbmcodmFsdWUpIHx8ICd7fScpOyB9IGNhdGNoIHsgYXBpLmhlYWRlcnMgPSB7fTsgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnYm9keScpIHsgYXBpLnJlcXVlc3RCb2R5ID0gU3RyaW5nKHZhbHVlKTsgcmV0dXJuOyB9XG4gICAgICBpZiAoa2V5ID09PSAnc2F2ZU91dHB1dEFzVmFyaWFibGUnKSB7IGFwaS5zYXZlVG8gPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICB9XG4gICAgaWYgKGlzQWlBZ2VudFN0ZXBDb25maWcodGhpcy5zdGVwKSkge1xuICAgICAgY29uc3QgYWkgPSB0aGlzLnN0ZXAgYXMgQWlBZ2VudFN0ZXBDb25maWc7XG4gICAgICBpZiAoa2V5ID09PSAnYWdlbnRUYXNrJykgeyBhaS5pbnN0cnVjdGlvbnMgPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICdkZXNjcmlwdGlvbicpIHsgKGFpIGFzIGFueSkuZGVzY3JpcHRpb24gPSBTdHJpbmcodmFsdWUpOyByZXR1cm47IH1cbiAgICAgIGlmIChrZXkgPT09ICdtZXRhZGF0YScpIHsgKHN0ZXAgYXMgYW55KS5tZXRhZGF0YSA9IHZhbHVlOyByZXR1cm47IH1cbiAgICB9XG4gICAgKHN0ZXAgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gIH1cblxuICBvbkJhY2soKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBvblNhdmVBc1RlbXBsYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlGb3JtVG9TdGVwKCk7XG4gICAgdGhpcy5zYXZlQXNUZW1wbGF0ZS5lbWl0KHRoaXMuc3RlcCk7XG4gICAgdGhpcy5yZWYuY2xvc2UoeyBhY3Rpb246ICdzYXZlQXNUZW1wbGF0ZScsIHN0ZXA6IHRoaXMuc3RlcCB9KTtcbiAgfVxuXG4gIG9uU2F2ZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseUZvcm1Ub1N0ZXAoKTtcbiAgICB0aGlzLnNhdmVDaGFuZ2VzLmVtaXQodGhpcy5zdGVwKTtcbiAgICB0aGlzLnJlZi5jbG9zZSh7IGFjdGlvbjogJ3NhdmVDaGFuZ2VzJywgc3RlcDogdGhpcy5zdGVwIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUZvcm1Ub1N0ZXAoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy52aXNpYmxlRmllbGRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAnYWR2YW5jZWQnKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udGFpbnMoa2V5KSkgdGhpcy5zZXRTdGVwVmFsdWUoa2V5LCB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQURWQU5DRURfVE9HR0xFX0tFWVMpIHtcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udGFpbnMoa2V5KSkgdGhpcy5zZXRTdGVwVmFsdWUoa2V5LCB0aGlzLmZvcm0uZ2V0KGtleSk/LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgY2FjaGVkIG1hcCBvZiBzZWxlY3QgY29uZmlncyBmcm9tIGZpZWxkIG1ldGEgKHN0YWJsZSByZWZzIHRvIHByZXZlbnQgQ0QgbG9vcHMpLiAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlnTWFwKCk6IFJlY29yZDxzdHJpbmcsIER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZz4ge1xuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgRHluYW1pY1NlbGVjdEZpZWxkQ29uZmlnPiA9IHt9O1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhTVEVQX0RFVEFJTFNfRklFTERfTUVUQSkgYXMgU3RlcERldGFpbHNGaWVsZEtleVtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBTVEVQX0RFVEFJTFNfRklFTERfTUVUQVtrZXldO1xuICAgICAgaWYgKCFtZXRhIHx8IG1ldGEuY29udHJvbFR5cGUgIT09ICdkcm9wZG93bicgfHwgIW1ldGEub3B0aW9ucz8ubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdID0gbWV0YS5vcHRpb25zLm1hcCgobykgPT4gKHsgdmFsdWU6IG8udmFsdWUsIGxhYmVsOiBvLmxhYmVsIH0pKTtcbiAgICAgIG1hcFtrZXldID0ge1xuICAgICAgICBrZXk6IG1ldGEua2V5LFxuICAgICAgICBwbGFjZWhvbGRlcjogbWV0YS5wbGFjZWhvbGRlciA/PyBtZXRhLmxhYmVsLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gY2FjaGVkIHNlbGVjdCBjb25maWcgZm9yIGtleSAoZm9yIHRlbXBsYXRlIHVzZTsgc2FtZSByZWZlcmVuY2UgZXZlcnkgdGltZSkuICovXG4gIGdldFNlbGVjdENvbmZpZyhrZXk6IFN0ZXBEZXRhaWxzRmllbGRLZXkpOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdNYXBba2V5XSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBrZXkgaXMgdGhlIGZpcnN0IGluIGl0cyBzZWN0aW9uIChmb3Igc2hvd2luZyBzZWN0aW9uIGhlYWRpbmdzKS4gKi9cbiAgaXNGaXJzdEluU2VjdGlvbihrZXk6IFN0ZXBEZXRhaWxzRmllbGRLZXksIHNlY3Rpb246IFN0ZXBEZXRhaWxzRmllbGRTZWN0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWV0YSA9IFNURVBfREVUQUlMU19GSUVMRF9NRVRBW2tleV07XG4gICAgaWYgKCFtZXRhIHx8IG1ldGEuc2VjdGlvbiAhPT0gc2VjdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMudmlzaWJsZUZpZWxkcy5pbmRleE9mKGtleSk7XG4gICAgaWYgKGlkeCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwcmV2TWV0YSA9IFNURVBfREVUQUlMU19GSUVMRF9NRVRBW3RoaXMudmlzaWJsZUZpZWxkc1tpZHggLSAxXV07XG4gICAgcmV0dXJuICFwcmV2TWV0YSB8fCBwcmV2TWV0YS5zZWN0aW9uICE9PSBzZWN0aW9uO1xuICB9XG5cbiAgLyoqIER5bmFtaWMgZHJhd2VyIHRpdGxlIGJ5IHN0ZXAgdHlwZSAoZS5nLiBcIkFJIEFnZW50IFN0ZXAgRGV0YWlsc1wiKS4gKi9cbiAgZ2V0IGRyYXdlclRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3RlcFR5cGUgPT09ICdjdXN0b20nKSByZXR1cm4gJ0N1c3RvbSBTdGVwIERldGFpbHMnO1xuICAgIGlmICh0aGlzLnN0ZXBUeXBlID09PSAnYXBpJykgcmV0dXJuICdBUEkgU3RlcCBEZXRhaWxzJztcbiAgICBpZiAodGhpcy5zdGVwVHlwZSA9PT0gJ2FpQWdlbnQnKSByZXR1cm4gJ0FJIEFnZW50IFN0ZXAgRGV0YWlscyc7XG4gICAgcmV0dXJuICdTdGVwIERldGFpbHMnO1xuICB9XG59XG4iLCI8IS0tIFN0ZXAgRGV0YWlscyBEcmF3ZXIg4oCTIEVkaXQgSW4gRGVwdGguIE5vIFByaW9yaXR5LiBGdWxseSBjb25maWctZHJpdmVuLiAtLT5cbjxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNDgwcHhdIGNxYS1ib3gtYm9yZGVyXCI+XG4gIDwhLS0gSGVhZGVyOiBiYWNrIGNoZXZyb24sIGR5bmFtaWMgdGl0bGUsIFN0ZXAgTiBwaWxsLCBjbG9zZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLXB4LTQgY3FhLXB5LTQgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLXQtWzEycHhdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0U1RTVFNV1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkJhY2soKVwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXctOCBjcWEtaC04IGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjNkI3MjgwXSBob3ZlcjpjcWEtYmctWyNGM0Y0RjZdIGNxYS1wLTBcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiQmFja1wiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdXCI+Y2hldnJvbl9sZWZ0PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsyNHB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMCBjcWEtZmxleC0xXCI+XG4gICAgICAgIHt7IGRyYXdlclRpdGxlIH19XG4gICAgICA8L2gyPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtcHgtMi41IGNxYS1weS0xIGNxYS1yb3VuZGVkLWxnIGNxYS1iZy1bI0VERTlGRV0gY3FhLXRleHQtWyM3QzNBRURdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgU3RlcCB7eyBzdGVwTnVtYmVyIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4taC1bMjhweF0gY3FhLW1pbi13LVsyOHB4XSBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgIHRpdGxlPVwiQ2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy01ICFjcWEtaC01ICFjcWEtdGV4dC1bMjBweF1cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU1RTVdXCI+IDwvZGl2PlxuXG4gIDwhLS0gQ29udGVudDogQXR0cmlidXRlcyArIGR5bmFtaWMgZmllbGRzIGZyb20gY29uZmlnIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1iZy13aGl0ZSBjcWEtcHgtNCBjcWEtcHktNFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGVwVHlwZVwiPlxuICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMyBjcWEtbXQtMFwiPkF0dHJpYnV0ZXM8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiB2aXNpYmxlRmllbGRzXCI+XG4gICAgICAgICAgPCEtLSBTZWN0aW9uIGhlYWRpbmc6IENvbnN0cmFpbnRzIChmaXJzdCBjb25zdHJhaW50cyBmaWVsZCBvbmx5KSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwia2V5ICE9PSAnYWR2YW5jZWQnICYmIGlzRmlyc3RJblNlY3Rpb24oa2V5LCAnY29uc3RyYWludHMnKVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWItMiBjcWEtbXQtMFwiPkNvbnN0cmFpbnRzPC9wPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBBZHZhbmNlZDogZXhwYW5kYWJsZSBzZWN0aW9uIHdpdGggY29uZmlnLWRyaXZlbiB0b2dnbGVzICsgc3ViZmllbGRzIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJrZXkgPT09ICdhZHZhbmNlZCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS13LWZ1bGwgY3FhLXRleHQtbGVmdCBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtcHktMiBjcWEtYm9yZGVyLWIgY3FhLWJvcmRlci1bI0U1RTdFQl1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWR2YW5jZWRFeHBhbmRlZCA9ICFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkFkdmFuY2VkPC9zcGFuPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bMjBweF0gY3FhLXRyYW5zaXRpb24tdHJhbnNmb3JtXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cIiFhZHZhbmNlZEV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgICAgZXhwYW5kX2xlc3NcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTMgY3FhLXB0LTJcIj5cbiAgICAgICAgICAgICAgPCEtLSBBZHZhbmNlZCB0b2dnbGVzIGZyb20gY29uZmlnIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0b2dnbGVLZXkgb2YgYWR2YW5jZWRUb2dnbGVLZXlzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCIgKm5nSWY9XCJmaWVsZE1ldGFbdG9nZ2xlS2V5XVwiPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImZvcm0uZ2V0KHRvZ2dsZUtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiZm9ybS5nZXQodG9nZ2xlS2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjNzM3MzczXVwiPnt7IGZpZWxkTWV0YVt0b2dnbGVLZXldLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzBBMEEwQV1cIiAqbmdJZj1cImZpZWxkTWV0YVt0b2dnbGVLZXldLnN1YkxhYmVsXCI+e3sgZmllbGRNZXRhW3RvZ2dsZUtleV0uc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gQWR2YW5jZWQgc3ViZmllbGRzIChlLmcuIFJldHJ5IENvdW50LCBJZnJhbWUgbG9jYXRvciwgT3RoZXIgTG9jYXRvcnMgZm9yIGFpQWdlbnQpIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJLZXkgb2YgYWR2YW5jZWRTdWJmaWVsZHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41IGNxYS1zdGVwLWRldGFpbHMtZHJhd2VyLXNlbGVjdFwiICpuZ0lmPVwiZmllbGRNZXRhW3N1YktleV0/LmNvbnRyb2xUeXBlID09PSAnZHJvcGRvd24nICYmIGdldFNlbGVjdENvbmZpZyhzdWJLZXkpICYmIGZvcm0uY29udGFpbnMoc3ViS2V5KVwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZE1ldGFbc3ViS2V5XS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8Y3FhLWR5bmFtaWMtc2VsZWN0IFtmb3JtXT1cImZvcm1cIiBbY29uZmlnXT1cImdldFNlbGVjdENvbmZpZyhzdWJLZXkpIVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtZHluYW1pYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFNraXA6IGFkdmFuY2VkIGtleSAoYWxyZWFkeSByZW5kZXJlZCkgYW5kIGZpZWxkcyB0aGF0IGFyZSByZW5kZXJlZCBpbnNpZGUgYWR2YW5jZWQgZm9yIHRoaXMgc3RlcCB0eXBlIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJrZXkgIT09ICdhZHZhbmNlZCcgJiYgIShzdGVwVHlwZSA9PT0gJ2FpQWdlbnQnICYmIGFkdmFuY2VkU3ViZmllbGRzLmluY2x1ZGVzKGtleSkpXCI+XG4gICAgICAgICAgICA8IS0tIHRleHQgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmllbGRNZXRhW2tleV0/LmNvbnRyb2xUeXBlID09PSAndGV4dCdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGRNZXRhW2tleV0ucGxhY2Vob2xkZXIgfHwgJydcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtLmdldChrZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZm9ybS5nZXQoa2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSB0ZXh0YXJlYSAoaW5jbHVkaW5nIGFnZW50VGFzayB3aXRoIG9wdGlvbmFsIHJlcXVpcmVkICsgdGlwKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZE1ldGFba2V5XT8uY29udHJvbFR5cGUgPT09ICd0ZXh0YXJlYSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkTWV0YVtrZXldLnJlcXVpcmVkXCIgY2xhc3M9XCJjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLVsjRkVFMkUyXSBjcWEtdGV4dC1bI0RDMjYyNl0gY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bVwiPlJlcXVpcmVkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCJrZXkgPT09ICdhZ2VudFRhc2snXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdIGNxYS1tLTBcIj5XaGF0IHNob3VsZCB0aGUgYWdlbnQgYWNoaWV2ZT88L3A+XG4gICAgICAgICAgICAgIDxjcWEtY3VzdG9tLXRleHRhcmVhXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkTWV0YVtrZXldLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZm9ybS5nZXQoa2V5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3Jvd3NdPVwiZmllbGRNZXRhW2tleV0ucm93cyB8fCA0XCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpZWxkTWV0YVtrZXldLnRpcFwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wXCI+e3sgZmllbGRNZXRhW2tleV0udGlwIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gY29kZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZE1ldGFba2V5XT8uY29udHJvbFR5cGUgPT09ICdjb2RlJ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMS41XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGRNZXRhW2tleV0ubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10ZXh0YXJlYVxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZE1ldGFba2V5XS5wbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm0uZ2V0KGtleSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtyb3dzXT1cIjhcIlxuICAgICAgICAgICAgICAgIHJlc2l6ZT1cInZlcnRpY2FsXCJcbiAgICAgICAgICAgICAgICBjdXN0b21DbGFzcz1cImNxYS1wLTIgY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLVsyMHB4XVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZvcm0uZ2V0KGtleSk/LnNldFZhbHVlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLXRleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gZHJvcGRvd24gKG1haW4gKyBjb25zdHJhaW50czsgYWR2YW5jZWQtb25seSBkcm9wZG93bnMgcmVuZGVyZWQgaW5zaWRlIEFkdmFuY2VkIHNlY3Rpb24pIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkTWV0YVtrZXldPy5jb250cm9sVHlwZSA9PT0gJ2Ryb3Bkb3duJyAmJiBmb3JtLmNvbnRhaW5zKGtleSkgJiYgZ2V0U2VsZWN0Q29uZmlnKGtleSkgJiYgIWFkdmFuY2VkU3ViZmllbGRzLmluY2x1ZGVzKGtleSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj57eyBmaWVsZE1ldGFba2V5XS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxjcWEtZHluYW1pYy1zZWxlY3QgW2Zvcm1dPVwiZm9ybVwiIFtjb25maWddPVwiZ2V0U2VsZWN0Q29uZmlnKGtleSkhXCI+XG4gICAgICAgICAgICAgIDwvY3FhLWR5bmFtaWMtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gdG9nZ2xlIChlLmcuIG9ubHlVc2VBdHRhY2hlZENvbnRleHQsIHRha2VTY3JlZW5zaG90c1doZW5WZXJpZnlpbmcpIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkTWV0YVtrZXldPy5jb250cm9sVHlwZSA9PT0gJ3RvZ2dsZSdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzExMTgyN10gY3FhLW0tMFwiPnt7IGZpZWxkTWV0YVtrZXldLmxhYmVsIH19PC9wPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGRNZXRhW2tleV0uc3ViTGFiZWxcIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgZmllbGRNZXRhW2tleV0uc3ViTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8Y3FhLWN1c3RvbS10b2dnbGVcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJmb3JtLmdldChrZXkpPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwiZm9ybS5nZXQoa2V5KT8uc2V0VmFsdWUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L2NxYS1jdXN0b20tdG9nZ2xlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8cCAqbmdJZj1cIiFzdGVwVHlwZVwiIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlRoaXMgc3RlcCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGRyYXdlci48L3A+XG4gIDwvZGl2PlxuPGRpdiBjbGFzcz1cImNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjRTVFNUU1XVwiPiA8L2Rpdj5cbiAgPCEtLSBGb290ZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LXN0YXJ0IGNxYS1nYXAtMiBjcWEtcHgtNCBjcWEtcHktNCBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLWJnLVsjRjVGNUY1NERdXCI+XG4gICAgPGNxYS1idXR0b24gdmFyaWFudD1cInRleHRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInQ2FuY2VsJ1wiIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS10ZXh0LVsjMzc0MTUxXSdcIj48L2NxYS1idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj48L2Rpdj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIiBidG5TaXplPVwibGdcIiBbdGV4dF09XCInU2F2ZSBhcyBUZW1wbGF0ZSdcIiAoY2xpY2tlZCk9XCJvblNhdmVBc1RlbXBsYXRlKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCIgYnRuU2l6ZT1cImxnXCIgW3RleHRdPVwiJ1NhdmUgQ2hhbmdlcydcIiAoY2xpY2tlZCk9XCJvblNhdmVDaGFuZ2VzKClcIlxuICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTRweF0gY3FhLXB5LVs5cHhdIGNxYS1iZy1bIzNGNDNFRV0gY3FhLWJvcmRlci1bIzNGNDNFRV0nXCI+PC9jcWEtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,67 @@
1
+ import { Injectable, Injector } from '@angular/core';
2
+ import { OverlayConfig } from '@angular/cdk/overlay';
3
+ import { ComponentPortal } from '@angular/cdk/portal';
4
+ import { filter } from 'rxjs/operators';
5
+ import { StepDetailsDrawerComponent } from './step-details-drawer.component';
6
+ import { StepDetailsDrawerRef } from './step-details-drawer-ref';
7
+ import { STEP_DETAILS_DRAWER_REF } from './step-details-drawer-ref';
8
+ import { STEP_DETAILS_DRAWER_DATA } from './step-details-drawer-data';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/cdk/overlay";
11
+ /**
12
+ * Opens the Step Details Drawer (Edit In Depth) from the right.
13
+ */
14
+ export class StepDetailsDrawerService {
15
+ constructor(overlay, injector) {
16
+ this.overlay = overlay;
17
+ this.injector = injector;
18
+ this.currentRef = null;
19
+ }
20
+ open(data) {
21
+ if (this.currentRef)
22
+ return this.currentRef;
23
+ const drawerWidth = 480;
24
+ const positionStrategy = this.overlay
25
+ .position()
26
+ .global()
27
+ .right('0')
28
+ .top('0')
29
+ .bottom('0')
30
+ .width(`${drawerWidth}px`);
31
+ const overlayRef = this.overlay.create(new OverlayConfig({
32
+ hasBackdrop: true,
33
+ backdropClass: 'cdk-overlay-transparent-backdrop',
34
+ scrollStrategy: this.overlay.scrollStrategies.block(),
35
+ positionStrategy,
36
+ panelClass: ['cqa-step-details-drawer-panel', 'cqa-ui-root'],
37
+ width: `${drawerWidth}px`,
38
+ maxWidth: '100vw',
39
+ height: '100%',
40
+ }));
41
+ const drawerRef = new StepDetailsDrawerRef(overlayRef);
42
+ const injector = Injector.create({
43
+ parent: this.injector,
44
+ providers: [
45
+ { provide: STEP_DETAILS_DRAWER_REF, useValue: drawerRef },
46
+ { provide: STEP_DETAILS_DRAWER_DATA, useValue: data },
47
+ ],
48
+ });
49
+ const portal = new ComponentPortal(StepDetailsDrawerComponent, undefined, injector);
50
+ overlayRef.attach(portal);
51
+ this.currentRef = drawerRef;
52
+ drawerRef.afterClosed().subscribe(() => { this.currentRef = null; });
53
+ overlayRef.backdropClick().subscribe(() => drawerRef.close({ action: 'cancel' }));
54
+ overlayRef
55
+ .keydownEvents()
56
+ .pipe(filter((e) => e.key === 'Escape' || e.key === 'Esc'))
57
+ .subscribe(() => drawerRef.close({ action: 'cancel' }));
58
+ return drawerRef;
59
+ }
60
+ }
61
+ StepDetailsDrawerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerService, deps: [{ token: i1.Overlay }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
62
+ StepDetailsDrawerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerService, providedIn: 'root' });
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepDetailsDrawerService, decorators: [{
64
+ type: Injectable,
65
+ args: [{ providedIn: 'root' }]
66
+ }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }]; } });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZXRhaWxzLWRyYXdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy9zdGVwLWRldGFpbHMtZHJhd2VyL3N0ZXAtZGV0YWlscy1kcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQVcsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQXlCLE1BQU0sNEJBQTRCLENBQUM7OztBQU83Rjs7R0FFRztBQUVILE1BQU0sT0FBTyx3QkFBd0I7SUFHbkMsWUFBNkIsT0FBZ0IsRUFBbUIsUUFBa0I7UUFBckQsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUFtQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRjFFLGVBQVUsR0FBeUQsSUFBSSxDQUFDO0lBRUssQ0FBQztJQUV0RixJQUFJLENBQUMsSUFBMkI7UUFDOUIsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUU1QyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTzthQUNsQyxRQUFRLEVBQUU7YUFDVixNQUFNLEVBQUU7YUFDUixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNSLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxLQUFLLENBQUMsR0FBRyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBRTdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNwQyxJQUFJLGFBQWEsQ0FBQztZQUNoQixXQUFXLEVBQUUsSUFBSTtZQUNqQixhQUFhLEVBQUUsa0NBQWtDO1lBQ2pELGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRTtZQUNyRCxnQkFBZ0I7WUFDaEIsVUFBVSxFQUFFLENBQUMsK0JBQStCLEVBQUUsYUFBYSxDQUFDO1lBQzVELEtBQUssRUFBRSxHQUFHLFdBQVcsSUFBSTtZQUN6QixRQUFRLEVBQUUsT0FBTztZQUNqQixNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQkFBb0IsQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFDaEYsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDckIsU0FBUyxFQUFFO2dCQUNULEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7Z0JBQ3pELEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDdEQ7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQywwQkFBMEIsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixVQUFVO2FBQ1AsYUFBYSxFQUFFO2FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7YUFDekUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7O3FIQW5EVSx3QkFBd0I7eUhBQXhCLHdCQUF3QixjQURYLE1BQU07MkZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgVGVzdENhc2VTdGVwQ29uZmlnIH0gZnJvbSAnLi4vdGVzdC1jYXNlLXN0ZXAubW9kZWxzJztcbmltcG9ydCB7IFN0ZXBEZXRhaWxzRHJhd2VyQ29tcG9uZW50IH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdGVwRGV0YWlsc0RyYXdlclJlZiB9IGZyb20gJy4vc3RlcC1kZXRhaWxzLWRyYXdlci1yZWYnO1xuaW1wb3J0IHsgU1RFUF9ERVRBSUxTX0RSQVdFUl9SRUYgfSBmcm9tICcuL3N0ZXAtZGV0YWlscy1kcmF3ZXItcmVmJztcbmltcG9ydCB7IFNURVBfREVUQUlMU19EUkFXRVJfREFUQSwgU3RlcERldGFpbHNEcmF3ZXJEYXRhIH0gZnJvbSAnLi9zdGVwLWRldGFpbHMtZHJhd2VyLWRhdGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0IHtcbiAgYWN0aW9uOiAnc2F2ZUNoYW5nZXMnIHwgJ3NhdmVBc1RlbXBsYXRlJyB8ICdjYW5jZWwnO1xuICBzdGVwPzogVGVzdENhc2VTdGVwQ29uZmlnO1xufVxuXG4vKipcbiAqIE9wZW5zIHRoZSBTdGVwIERldGFpbHMgRHJhd2VyIChFZGl0IEluIERlcHRoKSBmcm9tIHRoZSByaWdodC5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTdGVwRGV0YWlsc0RyYXdlclNlcnZpY2Uge1xuICBwcml2YXRlIGN1cnJlbnRSZWY6IFN0ZXBEZXRhaWxzRHJhd2VyUmVmPFN0ZXBEZXRhaWxzRHJhd2VyUmVzdWx0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheTogT3ZlcmxheSwgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgb3BlbihkYXRhOiBTdGVwRGV0YWlsc0RyYXdlckRhdGEpOiBTdGVwRGV0YWlsc0RyYXdlclJlZjxTdGVwRGV0YWlsc0RyYXdlclJlc3VsdD4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRSZWYpIHJldHVybiB0aGlzLmN1cnJlbnRSZWY7XG5cbiAgICBjb25zdCBkcmF3ZXJXaWR0aCA9IDQ4MDtcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmdsb2JhbCgpXG4gICAgICAucmlnaHQoJzAnKVxuICAgICAgLnRvcCgnMCcpXG4gICAgICAuYm90dG9tKCcwJylcbiAgICAgIC53aWR0aChgJHtkcmF3ZXJXaWR0aH1weGApO1xuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoXG4gICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgICAgcGFuZWxDbGFzczogWydjcWEtc3RlcC1kZXRhaWxzLWRyYXdlci1wYW5lbCcsICdjcWEtdWktcm9vdCddLFxuICAgICAgICB3aWR0aDogYCR7ZHJhd2VyV2lkdGh9cHhgLFxuICAgICAgICBtYXhXaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBkcmF3ZXJSZWYgPSBuZXcgU3RlcERldGFpbHNEcmF3ZXJSZWY8U3RlcERldGFpbHNEcmF3ZXJSZXN1bHQ+KG92ZXJsYXlSZWYpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IFNURVBfREVUQUlMU19EUkFXRVJfUkVGLCB1c2VWYWx1ZTogZHJhd2VyUmVmIH0sXG4gICAgICAgIHsgcHJvdmlkZTogU1RFUF9ERVRBSUxTX0RSQVdFUl9EQVRBLCB1c2VWYWx1ZTogZGF0YSB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoU3RlcERldGFpbHNEcmF3ZXJDb21wb25lbnQsIHVuZGVmaW5lZCwgaW5qZWN0b3IpO1xuICAgIG92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG5cbiAgICB0aGlzLmN1cnJlbnRSZWYgPSBkcmF3ZXJSZWY7XG4gICAgZHJhd2VyUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHsgdGhpcy5jdXJyZW50UmVmID0gbnVsbDsgfSk7XG4gICAgb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IGRyYXdlclJlZi5jbG9zZSh7IGFjdGlvbjogJ2NhbmNlbCcgfSkpO1xuICAgIG92ZXJsYXlSZWZcbiAgICAgIC5rZXlkb3duRXZlbnRzKClcbiAgICAgIC5waXBlKGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnRXNjJykpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGRyYXdlclJlZi5jbG9zZSh7IGFjdGlvbjogJ2NhbmNlbCcgfSkpO1xuXG4gICAgcmV0dXJuIGRyYXdlclJlZjtcbiAgfVxufVxuIl19