@rangertechnologies/ngnxt 2.1.253 → 2.1.255-beta
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/fesm2022/rangertechnologies-ngnxt.mjs +258 -433
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/datatable/datatable.component.d.ts +0 -1
- package/lib/components/pick-location/pick-location.component.d.ts +0 -1
- package/lib/model/bookletWrapper.d.ts +0 -1
- package/lib/pages/booklet/booklet.component.d.ts +0 -2
- package/lib/pages/builder/element/element.component.d.ts +0 -3
- package/lib/pages/builder/properties/properties.component.d.ts +6 -2
- package/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.d.ts +0 -3
- package/lib/pages/questionbook/questionbook.component.d.ts +0 -1
- package/lib/pages/questionnaire/questionnaire.component.d.ts +0 -1
- package/lib/pipe/custom-translate.pipe.d.ts +1 -1
- package/lib/pipe/svg/svg.pipe.d.ts +10 -0
- package/lib/services/form-builder/form-builder.service.d.ts +1 -0
- package/lib/services/translation/translation.service.d.ts +1 -1
- package/package.json +4 -6
- package/rangertechnologies-ngnxt-2.1.255-beta.tgz +0 -0
- package/esm2022/environments/version.mjs +0 -15
- package/esm2022/lib/components/button/nxt-button.component.mjs +0 -154
- package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -360
- package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -263
- package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -53
- package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -156
- package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1757
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -292
- package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -105
- package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
- package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
- package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
- package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
- package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
- package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
- package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
- package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
- package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
- package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
- package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -392
- package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2972
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -105
- package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -220
- package/esm2022/lib/components/search-box/search-box.component.mjs +0 -470
- package/esm2022/lib/country.json +0 -43237
- package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
- package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
- package/esm2022/lib/model/bookletWrapper.mjs +0 -9
- package/esm2022/lib/model/changeWrapper.mjs +0 -10
- package/esm2022/lib/model/errorWrapper.mjs +0 -6
- package/esm2022/lib/nxt-app.component.mjs +0 -22
- package/esm2022/lib/nxt-app.module.mjs +0 -115
- package/esm2022/lib/nxt-app.service.mjs +0 -14
- package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -658
- package/esm2022/lib/pages/builder/element/element.component.mjs +0 -508
- package/esm2022/lib/pages/builder/form/form.component.mjs +0 -48
- package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -97
- package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1089
- package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -35
- package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -681
- package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1118
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -801
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2219
- package/esm2022/lib/pipe/button-styles.pipe.mjs +0 -26
- package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -36
- package/esm2022/lib/pipe/get-value.pipe.mjs +0 -54
- package/esm2022/lib/pipe/question-by-row.pipe.mjs +0 -51
- package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -40
- package/esm2022/lib/sample.mjs +0 -3715
- package/esm2022/lib/services/change/change.service.mjs +0 -46
- package/esm2022/lib/services/country/country.service.mjs +0 -135
- package/esm2022/lib/services/data/data.service.mjs +0 -100
- package/esm2022/lib/services/form-builder/form-builder.service.mjs +0 -500
- package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +0 -398
- package/esm2022/lib/services/salesforce/salesforce.service.mjs +0 -41
- package/esm2022/lib/services/shared/shared.service.mjs +0 -100
- package/esm2022/lib/services/storage/storage.service.mjs +0 -59
- package/esm2022/lib/services/template/template.service.mjs +0 -351
- package/esm2022/lib/services/translation/translation.service.mjs +0 -121
- package/esm2022/lib/wrapper.mjs +0 -175
- package/esm2022/public-api.mjs +0 -22
- package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
- package/rangertechnologies-ngnxt-2.1.253.tgz +0 -0
|
@@ -1,1089 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, signal, computed, ViewChild } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
-
//AP-25JUN25-Importing common constants for element, field, and appearance properties
|
|
6
|
-
import { COMMON_ELEMENT_PROPS, COMMON_OPTIONS_FIELD, COMMON_FIELD_PROPS, COMMON_APPEARANCE_PROPS } from '../properties/common-fields.constants';
|
|
7
|
-
import { NgClass, NgFor, NgIf } from '@angular/common';
|
|
8
|
-
import { Pipe } from '@angular/core';
|
|
9
|
-
import { NxtCustomTranslatePipe } from '../../../pipe/custom-translate.pipe';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "../../../services/form-builder/form-builder.service";
|
|
12
|
-
import * as i2 from "../../../services/template/template.service";
|
|
13
|
-
import * as i3 from "../../../services/translation/translation.service";
|
|
14
|
-
import * as i4 from "@angular/common";
|
|
15
|
-
import * as i5 from "@angular/forms";
|
|
16
|
-
// Custom pipe for path-based value access
|
|
17
|
-
export class GetValueByPathPipe {
|
|
18
|
-
transform(obj, path, defaultValue = '') {
|
|
19
|
-
if (!obj || !path)
|
|
20
|
-
return defaultValue;
|
|
21
|
-
return path.split('.').reduce((o, k) => o?.[k] ?? defaultValue, obj);
|
|
22
|
-
}
|
|
23
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GetValueByPathPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
24
|
-
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: GetValueByPathPipe, isStandalone: true, name: "getValueByPath" });
|
|
25
|
-
}
|
|
26
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GetValueByPathPipe, decorators: [{
|
|
27
|
-
type: Pipe,
|
|
28
|
-
args: [{
|
|
29
|
-
name: 'getValueByPath',
|
|
30
|
-
standalone: true,
|
|
31
|
-
pure: true
|
|
32
|
-
}]
|
|
33
|
-
}] });
|
|
34
|
-
export class PropertiesComponent {
|
|
35
|
-
formBuilderService;
|
|
36
|
-
templateService;
|
|
37
|
-
translationService;
|
|
38
|
-
templateSelected = false;
|
|
39
|
-
set selectedElementType(value) {
|
|
40
|
-
this.selectedElementTypeSig.set(value);
|
|
41
|
-
}
|
|
42
|
-
formButtonHandler = new EventEmitter();
|
|
43
|
-
templateSaveHandler = new EventEmitter();
|
|
44
|
-
dropdown;
|
|
45
|
-
// Signals for reactive state
|
|
46
|
-
selectedElementTypeSig = signal('');
|
|
47
|
-
selectedElement = signal(null);
|
|
48
|
-
selectedElementIndex = signal(-1);
|
|
49
|
-
headerSelect = signal(false);
|
|
50
|
-
book = signal(null);
|
|
51
|
-
bookId = signal(null);
|
|
52
|
-
activeTab = signal('attributes');
|
|
53
|
-
selectColumn = signal(null);
|
|
54
|
-
transform = signal({
|
|
55
|
-
translateUnit: 'px',
|
|
56
|
-
scale: 1,
|
|
57
|
-
rotate: 0,
|
|
58
|
-
flipH: false,
|
|
59
|
-
flipV: false,
|
|
60
|
-
translateH: 0,
|
|
61
|
-
translateV: 0
|
|
62
|
-
});
|
|
63
|
-
canvasRotation = signal(0);
|
|
64
|
-
cropper = signal(undefined);
|
|
65
|
-
loading = signal(false);
|
|
66
|
-
isLinkDropdownOpen = signal(false);
|
|
67
|
-
errorMessage = signal('');
|
|
68
|
-
bookSubtext = signal({
|
|
69
|
-
endpoint: 'https://dev-api.valarhr.com/nxt',
|
|
70
|
-
variable: null,
|
|
71
|
-
field: ['label', 'name'],
|
|
72
|
-
defaultField: 'label'
|
|
73
|
-
});
|
|
74
|
-
isStyleExpanded = signal(false);
|
|
75
|
-
cropperMaxHeight = 0;
|
|
76
|
-
cropperMaxWidth = 0;
|
|
77
|
-
cropperMinHeight = 0;
|
|
78
|
-
cropperMinWidth = 0;
|
|
79
|
-
cropperStaticWidth = 0;
|
|
80
|
-
cropperStaticHeight = 0;
|
|
81
|
-
aspectRatio = 4 / 3;
|
|
82
|
-
roundCropper = false;
|
|
83
|
-
isExpanded = false;
|
|
84
|
-
alignImage = 'center';
|
|
85
|
-
elementType = ['Header', 'Line', 'Space', 'Table', 'TableColumn', 'Checkbox', 'Dropdown', 'Radio', "Text", "Calendar", "Date", "Time", "DateTime", "Email", "Book", "List", "TextArea", "RichTextArea", "Number", "Image", "Label", "Boolean", "File", "Icon", 'Button'];
|
|
86
|
-
// Add these properties to your component class
|
|
87
|
-
_cachedProperties = null;
|
|
88
|
-
_lastSelectedElement = null;
|
|
89
|
-
_lastSelectedColumn = null;
|
|
90
|
-
// Computed signals for memoization
|
|
91
|
-
fieldAsString = computed(() => this.bookSubtext().field.join(', '));
|
|
92
|
-
filteredColumns = computed(() => {
|
|
93
|
-
const fieldsMeta = this.selectedElement()?.fieldsMeta ?? [];
|
|
94
|
-
return Array.isArray(fieldsMeta)
|
|
95
|
-
? fieldsMeta.filter(column => column.uniqueIdentifier !== this.selectColumn())
|
|
96
|
-
: [];
|
|
97
|
-
});
|
|
98
|
-
// Memoized properties
|
|
99
|
-
elementProperties = computed(() => this.createElementProperties());
|
|
100
|
-
constructor(formBuilderService, templateService, translationService) {
|
|
101
|
-
this.formBuilderService = formBuilderService;
|
|
102
|
-
this.templateService = templateService;
|
|
103
|
-
this.translationService = translationService;
|
|
104
|
-
}
|
|
105
|
-
ngOnInit() {
|
|
106
|
-
this.formBuilderService.selectHeaderSubject$.subscribe(header => {
|
|
107
|
-
if (header) {
|
|
108
|
-
this.selectedElement.set({ type: header });
|
|
109
|
-
this.headerSelect.set(true);
|
|
110
|
-
const bookData = this.formBuilderService.getBook();
|
|
111
|
-
this.book.set(bookData);
|
|
112
|
-
this.bookId.set(bookData?.records[0]?.id);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
this.formBuilderService.selectedElement$.subscribe(index => {
|
|
116
|
-
this.selectedElementIndex.set(index);
|
|
117
|
-
this.headerSelect.set(false);
|
|
118
|
-
if (index >= 0) {
|
|
119
|
-
const elements = this.formBuilderService.getElements();
|
|
120
|
-
if (!elements || !Array.isArray(elements) || index >= elements.length) {
|
|
121
|
-
this.selectedElement.set(null); // Reset selectedElement if invalid
|
|
122
|
-
this.selectColumn.set(null);
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
const element = { ...elements[index] }; // Safe to spread since we checked
|
|
126
|
-
let fieldsMeta = element?.fieldsMeta;
|
|
127
|
-
if (element?.type === 'Table') {
|
|
128
|
-
try {
|
|
129
|
-
fieldsMeta = Array.isArray(fieldsMeta)
|
|
130
|
-
? fieldsMeta
|
|
131
|
-
: JSON.parse(fieldsMeta || '[]');
|
|
132
|
-
}
|
|
133
|
-
catch (e) {
|
|
134
|
-
// console.error('Error parsing fieldsMeta:', e);
|
|
135
|
-
fieldsMeta = [];
|
|
136
|
-
}
|
|
137
|
-
this.selectColumn.set(this.formBuilderService.getSelectTableColumn() ?? null);
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
this.selectColumn.set(null);
|
|
141
|
-
}
|
|
142
|
-
this.selectedElement.set({ ...element, fieldsMeta });
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
this.selectedElement.set(null); // Reset if index is invalid
|
|
146
|
-
this.selectColumn.set(null);
|
|
147
|
-
}
|
|
148
|
-
const element = this.selectedElement();
|
|
149
|
-
if (element) {
|
|
150
|
-
let subText = element.subText;
|
|
151
|
-
if (typeof subText === 'string' && subText.trim() !== '') {
|
|
152
|
-
try {
|
|
153
|
-
subText = JSON.parse(subText);
|
|
154
|
-
}
|
|
155
|
-
catch (e) {
|
|
156
|
-
// console.error('Error parsing subText:', e);
|
|
157
|
-
subText = {};
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
else if (typeof subText !== 'object' || subText === null) {
|
|
161
|
-
subText = {};
|
|
162
|
-
}
|
|
163
|
-
const arrayFields = ['field', 'queryParameter', 'sourceQuestionId', 'queryField', 'queryValue'];
|
|
164
|
-
if (subText) {
|
|
165
|
-
arrayFields.forEach(key => {
|
|
166
|
-
if (Array.isArray(subText[key])) {
|
|
167
|
-
subText[key] = subText[key].join(', ');
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
if (element.type === 'Table') {
|
|
172
|
-
element.fieldsMeta.forEach(field => {
|
|
173
|
-
if (field?.question?.subText) {
|
|
174
|
-
arrayFields.forEach(key => {
|
|
175
|
-
if (Array.isArray(field.question.subText[key])) {
|
|
176
|
-
field.question.subText[key] = field.question.subText[key].join(', ');
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
this.selectedElement.update(el => ({ ...el, subText }));
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
// SKS28JUL25 formbuilder current element translation value update
|
|
186
|
-
this.translationService.formBuilderTranslationsLoaded$.subscribe(event => {
|
|
187
|
-
const elements = this.formBuilderService.getElements();
|
|
188
|
-
if (Array.isArray(elements) && this.selectedElement()) {
|
|
189
|
-
const matchedElement = elements.find((ele) => ele.id === this.selectedElement().id);
|
|
190
|
-
if (matchedElement) {
|
|
191
|
-
this.selectedElement.set(matchedElement);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
if (this.selectedElement()?.type === "Header") {
|
|
195
|
-
const bookData = this.formBuilderService.getBook();
|
|
196
|
-
this.book.set(bookData);
|
|
197
|
-
this.selectedElement.set({ ...this.selectedElement() });
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
createElementProperties() {
|
|
202
|
-
return {
|
|
203
|
-
Header: {
|
|
204
|
-
elementProps: [
|
|
205
|
-
{ label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'title', isTranslate: true, labelPath: 'LABEL' }
|
|
206
|
-
],
|
|
207
|
-
},
|
|
208
|
-
Line: {
|
|
209
|
-
elementProps: [
|
|
210
|
-
{ label: 'Line Width', type: 'fieldSize', key: 'size', labelPath: 'LINE_WIDTH' },
|
|
211
|
-
{ label: 'Padding Top', type: 'number', key: 'paddingTop', placeholder: 'Enter padding top', labelPath: 'PADDING_TOP' },
|
|
212
|
-
{ label: 'Padding Bottom', type: 'number', key: 'paddingBottom', placeholder: 'Enter padding bottom', labelPath: 'PADDING_BOTTOM' },
|
|
213
|
-
{
|
|
214
|
-
label: 'Line Style', type: 'select', key: 'lineStyle', labelPath: 'LINE_STYLE',
|
|
215
|
-
options: [
|
|
216
|
-
{ label: 'Solid', value: 'Solid', labelPath: 'SOLID' },
|
|
217
|
-
{ label: 'Dashed', value: 'Dashed', labelPath: 'DASHED' },
|
|
218
|
-
{ label: 'Dotted', value: 'Dotted', labelPath: 'DOTTED' }
|
|
219
|
-
]
|
|
220
|
-
}
|
|
221
|
-
],
|
|
222
|
-
fieldProps: []
|
|
223
|
-
},
|
|
224
|
-
Space: {
|
|
225
|
-
elementProps: [
|
|
226
|
-
{ label: 'Element', type: 'number', key: 'questionNumber', labelPath: 'ELEMENT' },
|
|
227
|
-
{ label: 'Field Size', type: 'fieldSize', key: 'size', labelPath: 'FIELD_SIZE' },
|
|
228
|
-
],
|
|
229
|
-
fieldProps: []
|
|
230
|
-
},
|
|
231
|
-
Table: {
|
|
232
|
-
elementProps: [
|
|
233
|
-
{ label: 'Is Label', placeholder: 'Enter Text', type: 'checkbox', key: 'style.showLabel', labelPath: 'IS_LABEL' },
|
|
234
|
-
{ label: 'primaryKey', placeholder: 'Enter Text', type: 'checkbox', key: 'primaryKey', labelPath: 'PRIMARY_KEY' },
|
|
235
|
-
{ label: 'tableName', placeholder: 'Employee Details', type: 'text', key: 'questionText', isTranslate: true, labelPath: 'TABLE_NAME' },
|
|
236
|
-
{ label: 'inputTextAlignment', placeholder: 'Left', type: 'text', key: 'inputTextAlignment', labelPath: 'INPUT_TEXT_ALIGNMENT' },
|
|
237
|
-
{ label: 'tableScaleSize', placeholder: '06 - Full Scale', type: 'text', key: 'tableScaleSize', labelPath: 'TABLE_SCALE_SIZE' },
|
|
238
|
-
{ label: 'isNosIndicator', placeholder: '06 - Full Scale', type: 'checkbox', key: 'tableConfig.isNosIndicator', labelPath: 'IS_NOS_INDICATOR' },
|
|
239
|
-
{ label: 'isPagination', placeholder: '06 - Full Scale', type: 'checkbox', key: 'tableConfig.isPagination', labelPath: 'IS_PAGINATION' },
|
|
240
|
-
{ label: 'addInlineRecord', placeholder: '06 - Full Scale', type: 'checkbox', key: 'tableConfig.addInlineRecord', labelPath: 'ADD_INLINE_RECORD' },
|
|
241
|
-
{ label: 'actionButton', placeholder: '06 - Full Scale', type: 'checkbox', key: 'tableConfig.actionButton', labelPath: 'ACTION_BUTTON' },
|
|
242
|
-
{ label: 'searchBar', placeholder: '06 - Full Scale', type: 'checkbox', key: 'tableConfig.searchBar', labelPath: 'SEARCH_BAR' },
|
|
243
|
-
{ label: 'isDeleteRow', placeholder: '06 - Full Scale', type: 'checkbox', key: 'tableConfig.isDeleteRow', labelPath: 'IS_DELETE_ROW' },
|
|
244
|
-
{ label: 'isEditRow', placeholder: '06 - Full Scale', type: 'checkbox', key: 'tableConfig.isEditRow', labelPath: 'IS_EDIT_ROW' },
|
|
245
|
-
{ label: 'isButtons', placeholder: '06 - Full Scale', type: 'checkbox', key: 'tableConfig.isButtons', labelPath: 'IS_BUTTONS' },
|
|
246
|
-
{ label: 'rowChoice', placeholder: '', type: 'text', key: 'rowChoice', labelPath: 'ROW_CHOICE' },
|
|
247
|
-
{ label: 'questionNumber', type: 'number', key: 'questionNumber', labelPath: 'QUESTION_NUMBER' },
|
|
248
|
-
{ label: 'Field Size', type: 'fieldSize', key: 'size', labelPath: 'FIELD_SIZE' },
|
|
249
|
-
],
|
|
250
|
-
fieldProps: [
|
|
251
|
-
{ label: 'tableId', placeholder: 'Emp_Table_01', type: 'text', key: 'tableId', isTranslate: true, labelPath: 'TABLE_ID' },
|
|
252
|
-
{ label: 'helpText', placeholder: 'Enter message', type: 'text', key: 'helpText', isTranslate: true, labelPath: 'HELP_TEXT' },
|
|
253
|
-
{ label: 'defaultValue', placeholder: 'Default Value', type: 'text', key: 'defaultValue', labelPath: 'DEFAULT_VALUE' },
|
|
254
|
-
{ label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField', labelPath: 'REFERENCE_FIELD' },
|
|
255
|
-
{
|
|
256
|
-
label: 'Sub Text', placeholder: 'Enter Text', type: 'subQuestion', key: 'isSubText', labelPath: 'SUB_TEXT',
|
|
257
|
-
subQuestion: [
|
|
258
|
-
{ label: 'End Point', placeholder: 'endpoint', type: 'text', key: 'subText.endpoint', labelPath: 'END_POINT' },
|
|
259
|
-
{ label: 'Variable', placeholder: 'variable', type: 'text', key: 'subText.variable', labelPath: 'VARIABLE' },
|
|
260
|
-
{ label: 'Field', placeholder: 'field', type: 'text', key: 'subText.field', labelPath: 'FIELD' },
|
|
261
|
-
{ label: 'Query Parameter', placeholder: 'queryParameter', type: 'text', key: 'subText.queryParameter', labelPath: 'QUERY_PARAMETER' },
|
|
262
|
-
{ label: 'Default Field', placeholder: 'defaultField', type: 'text', key: 'subText.defaultField', labelPath: 'DEFAULT_FIELD' },
|
|
263
|
-
{ label: 'Label Field', placeholder: 'labelField', type: 'text', key: 'subText.labelField', labelPath: 'LABEL_FIELD' },
|
|
264
|
-
{ label: 'Value Field', placeholder: 'valueField', type: 'text', key: 'subText.valueField', labelPath: 'VALUE_FIELD' },
|
|
265
|
-
{ label: 'Source Question Id', placeholder: 'sourceQuestionId', type: 'text', key: 'subText.sourceQuestionId', labelPath: 'SOURCE_QUESTION_ID' },
|
|
266
|
-
{ label: 'Dependent Value', placeholder: 'dependentValue', type: 'text', key: 'subText.dependentValue', labelPath: 'DEPENDENT_VALUE' },
|
|
267
|
-
{ label: 'Dependent Field', placeholder: 'isDependentField', type: 'boolean', key: 'subText.isDependentField', labelPath: 'DEPENDENT_FIELD' },
|
|
268
|
-
{ label: 'Query Field', placeholder: 'queryField', type: 'text', key: 'subText.queryField', labelPath: 'QUERY_FIELD' },
|
|
269
|
-
{ label: 'Query Value', placeholder: 'queryValue', type: 'text', key: 'subText.queryValue', labelPath: 'QUERY_VALUE' },
|
|
270
|
-
{ label: 'Query Value Ref', placeholder: 'queryValueRef', type: 'text', key: 'subText.queryValueReference', labelPath: 'QUERY_VALUE_REF' },
|
|
271
|
-
{ label: 'Unique Key', placeholder: 'uniqueKey', type: 'text', key: 'subText.uniqueKey', labelPath: 'UNIQUE_KEY' },
|
|
272
|
-
]
|
|
273
|
-
},
|
|
274
|
-
],
|
|
275
|
-
appearance: [
|
|
276
|
-
{ label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left', required: true, labelPath: 'SELECT_FONT', options: [
|
|
277
|
-
{ label: 'Helvetica Neue', value: 'Helvetica Neue', labelPath: 'HELVETICA_NEUE' },
|
|
278
|
-
{ label: 'Arial', value: 'Arial', labelPath: 'ARIAL' },
|
|
279
|
-
{ label: 'Times New Roman', value: 'Times New Roman', labelPath: 'TIMES_NEW_ROMAN' },
|
|
280
|
-
{ label: 'Roboto', value: 'Roboto', labelPath: 'ROBOTO' }
|
|
281
|
-
] },
|
|
282
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', defaultValue: '', required: true, labelPath: 'FONT_COLOR' },
|
|
283
|
-
{ label: 'Font Size', type: 'select', key: 'fontSize', defaultValue: '', required: true, labelPath: 'FONT_SIZE', options: [
|
|
284
|
-
{ label: 'Small', value: '12px', labelPath: 'SMALL' },
|
|
285
|
-
{ label: 'Medium', value: '14px', labelPath: 'MEDIUM' },
|
|
286
|
-
{ label: 'Large', value: '16px', labelPath: 'LARGE' }
|
|
287
|
-
] },
|
|
288
|
-
{ label: 'Font Width', type: 'select', key: 'fontWeight', defaultValue: '', required: true, labelPath: 'FONT_WIDTH', options: [
|
|
289
|
-
{ value: '400', label: '400-Normal', labelPath: '400_NORMAL' },
|
|
290
|
-
{ value: '500', label: '500-Medium', labelPath: '500_MEDIUM' },
|
|
291
|
-
{ value: '600', label: '600-Semi Bold', labelPath: '600_SEMI_BOLD' },
|
|
292
|
-
{ value: '700', label: '700-Bold', labelPath: '700_BOLD' }
|
|
293
|
-
] },
|
|
294
|
-
{ label: 'Duplicate Field', type: 'button-toggle', key: 'duplicateField', defaultValue: false, labelPath: 'DUPLICATE_FIELD' }
|
|
295
|
-
]
|
|
296
|
-
},
|
|
297
|
-
TableColumn: {
|
|
298
|
-
elementProps: [
|
|
299
|
-
{ label: 'Type', placeholder: 'Text', type: 'select', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'fldType', required: true, labelPath: 'TYPE', options: this.elementType.map(f => ({ label: f, value: f, labelPath: f.toUpperCase() })) },
|
|
300
|
-
{ label: 'headerLabels', placeholder: 'Employee Details', type: 'text', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'label', isTranslate: true, labelPath: 'HEADER_LABELS' },
|
|
301
|
-
{ label: 'apiName', placeholder: 'Employee Details', type: 'text', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'apiName', labelPath: 'API_NAME' },
|
|
302
|
-
{
|
|
303
|
-
label: 'Summary Column', placeholder: 'Summary Column', type: 'subQuestion', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'summaryColumn', labelPath: 'SUMMARY_COLUMN',
|
|
304
|
-
subQuestion: [
|
|
305
|
-
{ label: 'Type', placeholder: 'Employee Details', type: 'text', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'fldType', labelPath: 'TYPE' },
|
|
306
|
-
{ label: 'Operation', placeholder: 'Employee Details', type: 'text', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'operation', labelPath: 'OPERATION' },
|
|
307
|
-
{ label: 'Operands', placeholder: 'Employee Details', type: 'array', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'operands', labelPath: 'OPERANDS' },
|
|
308
|
-
]
|
|
309
|
-
},
|
|
310
|
-
{
|
|
311
|
-
label: 'Summary Row', placeholder: 'Summary Row', type: 'subQuestion', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'summaryRow', labelPath: 'SUMMARY_ROW',
|
|
312
|
-
subQuestion: [
|
|
313
|
-
{ label: 'Type', placeholder: 'Employee Details', type: 'text', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'fldType', labelPath: 'TYPE' },
|
|
314
|
-
{ label: 'operation', placeholder: 'operation', type: 'text', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'operation', labelPath: 'OPERATION' },
|
|
315
|
-
{ label: 'column', placeholder: 'Employee Details', type: 'radio', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'column', labelPath: 'COLUMN' },
|
|
316
|
-
{ label: 'columns', placeholder: 'Employee Details', type: 'array', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'columns', labelPath: 'COLUMNS' },
|
|
317
|
-
{ label: 'operands', placeholder: 'Employee Details', type: 'array', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'operands', labelPath: 'OPERANDS' },
|
|
318
|
-
]
|
|
319
|
-
},
|
|
320
|
-
{ label: 'textAlignment', placeholder: 'Left', type: 'text', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'textAlignment', labelPath: 'TEXT_ALIGNMENT' },
|
|
321
|
-
{ label: 'columnScaleSize', placeholder: '06 - Full Scale', type: 'text', targetArray: 'fieldsMeta', targetArrayKey: 'uniqueIdentifier', key: 'columnScaleSize', labelPath: 'COLUMN_SCALE_SIZE' },
|
|
322
|
-
],
|
|
323
|
-
fieldProps: [],
|
|
324
|
-
appearance: []
|
|
325
|
-
},
|
|
326
|
-
Checkbox: this.createElementConfig({ customFieldProps: COMMON_OPTIONS_FIELD.map(opt => ({ ...opt, type: 'checkbox' })) }),
|
|
327
|
-
Dropdown: this.createElementConfig({ customFieldProps: COMMON_OPTIONS_FIELD.map(opt => ({ ...opt, type: 'dropdown' })) }),
|
|
328
|
-
Radio: this.createElementConfig({ customFieldProps: COMMON_OPTIONS_FIELD.map(opt => ({ ...opt, type: 'checkbox' })) }),
|
|
329
|
-
Text: this.createElementConfig(),
|
|
330
|
-
Calendar: this.createElementConfig(),
|
|
331
|
-
Date: this.createElementConfig(),
|
|
332
|
-
Time: this.createElementConfig(),
|
|
333
|
-
DateTime: this.createElementConfig(),
|
|
334
|
-
Email: this.createElementConfig(),
|
|
335
|
-
Book: this.createElementConfig(),
|
|
336
|
-
List: this.createElementConfig(),
|
|
337
|
-
TextArea: this.createElementConfig(),
|
|
338
|
-
RichTextArea: this.createElementConfig(),
|
|
339
|
-
Number: this.createElementConfig(),
|
|
340
|
-
Image: this.createElementConfig(),
|
|
341
|
-
Label: this.createElementConfig(),
|
|
342
|
-
Boolean: this.createElementConfig(),
|
|
343
|
-
File: this.createElementConfig(),
|
|
344
|
-
Icon: this.createElementConfig(), //MSM10JUL25 icon selector element
|
|
345
|
-
Button: this.createElementConfig(),
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
createElementConfig(config) {
|
|
349
|
-
return {
|
|
350
|
-
elementProps: [...COMMON_ELEMENT_PROPS, ...(config?.customElementProps || [])],
|
|
351
|
-
fieldProps: [...COMMON_FIELD_PROPS, ...(config?.customFieldProps || [])],
|
|
352
|
-
appearance: [...COMMON_APPEARANCE_PROPS, ...(config?.customAppearanceProps || [])]
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
// AP 23MAY25 - Add a new button with default styling
|
|
356
|
-
addNewButton() {
|
|
357
|
-
const lastPercent = this.book()?.questionbook?.action?.slice(-1)[0]?.positionPercent ?? 0;
|
|
358
|
-
const buttons = {
|
|
359
|
-
name: '',
|
|
360
|
-
eventtoemit: '',
|
|
361
|
-
alt: '',
|
|
362
|
-
endpoint: '',
|
|
363
|
-
method: '',
|
|
364
|
-
id: this.formBuilderService.addElementWithId(),
|
|
365
|
-
positionPercent: lastPercent + 10,
|
|
366
|
-
width: 100,
|
|
367
|
-
borderRadius: 6,
|
|
368
|
-
alignment: 'flex-start'
|
|
369
|
-
};
|
|
370
|
-
this.formBuilderService.updateQuestionBookActionButtons(buttons, 'add');
|
|
371
|
-
this.book.update(book => ({ ...book }));
|
|
372
|
-
}
|
|
373
|
-
//AP 23MAY25 - Remove a button from the action list
|
|
374
|
-
removeButton(btn) {
|
|
375
|
-
this.formBuilderService.updateQuestionBookActionButtons(btn, 'remove');
|
|
376
|
-
this.book.update(book => ({ ...book }));
|
|
377
|
-
}
|
|
378
|
-
//AP 23MAY25 - Update a specific property of a button
|
|
379
|
-
onButtonPropertyChange(index, key, value, isTranslate = false) {
|
|
380
|
-
const buttons = this.book()?.questionbook?.action ?? [];
|
|
381
|
-
if (buttons[index]) {
|
|
382
|
-
buttons[index][key] = value;
|
|
383
|
-
this.book.update(book => ({ ...book, questionbook: { ...book.questionbook, action: buttons } }));
|
|
384
|
-
}
|
|
385
|
-
let button = buttons[index];
|
|
386
|
-
if (isTranslate) {
|
|
387
|
-
//SKS28JUL25 Refresh the book signal from service
|
|
388
|
-
const updatedBook = this.formBuilderService.getBook();
|
|
389
|
-
this.book.set(updatedBook);
|
|
390
|
-
//SKS28JUL25 Work with a mutable copy
|
|
391
|
-
const currentBook = this.book();
|
|
392
|
-
const translationMap = currentBook.translationMap || {};
|
|
393
|
-
const currentLang = this.translationService.getFormBuilderLanguage();
|
|
394
|
-
//SKS28JUL25 Ensure nested structure exists
|
|
395
|
-
if (!translationMap[currentLang])
|
|
396
|
-
translationMap[currentLang] = {};
|
|
397
|
-
if (!translationMap[currentLang][button.id])
|
|
398
|
-
translationMap[currentLang][button.id] = {};
|
|
399
|
-
//SKS28JUL25 Set the translated value
|
|
400
|
-
translationMap[currentLang][button.id][key] = value;
|
|
401
|
-
//SKS28JUL25 Update book and re-set the signal
|
|
402
|
-
currentBook.translationMap = translationMap;
|
|
403
|
-
this.book.set(currentBook); // Trigger reactive update
|
|
404
|
-
//SKS28JUL25 Update in service if needed
|
|
405
|
-
this.formBuilderService.updateBook(currentBook);
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
//AP-10MAR25 Updates the title using the form builder service
|
|
409
|
-
updateTitle(value) {
|
|
410
|
-
this.formBuilderService.updateTitle(value);
|
|
411
|
-
this.book.update(book => ({
|
|
412
|
-
...book,
|
|
413
|
-
records: [{ ...book.records[0], title: value }]
|
|
414
|
-
}));
|
|
415
|
-
}
|
|
416
|
-
validateInput(value, type) {
|
|
417
|
-
if (type === 'label' || type === 'placeholder') {
|
|
418
|
-
const regex = /^[a-zA-Z0-9\s]*$/;
|
|
419
|
-
if (!regex.test(value)) {
|
|
420
|
-
this.errorMessage.set('Only letters and numbers are allowed');
|
|
421
|
-
return false;
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
this.errorMessage.set('');
|
|
425
|
-
return true;
|
|
426
|
-
}
|
|
427
|
-
updateField(value) {
|
|
428
|
-
this.bookSubtext.update(subtext => ({
|
|
429
|
-
...subtext,
|
|
430
|
-
field: value.split(',').map(item => item.trim())
|
|
431
|
-
}));
|
|
432
|
-
}
|
|
433
|
-
onCheckboxChange(targetArrayPath, targetArrayKey, key, apiName, isChecked) {
|
|
434
|
-
const targetArray = this.getDataByPath(targetArrayPath);
|
|
435
|
-
const foundItem = targetArray.find(item => item[targetArrayKey] === this.selectColumn());
|
|
436
|
-
foundItem[key] = foundItem[key] ? foundItem[key] : [];
|
|
437
|
-
if (isChecked) {
|
|
438
|
-
if (!foundItem[key].includes(apiName)) {
|
|
439
|
-
foundItem[key].push(apiName);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
const index = foundItem[key].indexOf(apiName);
|
|
444
|
-
if (index > -1) {
|
|
445
|
-
foundItem[key].splice(index, 1);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
this.updateElement(this.selectedElement());
|
|
449
|
-
}
|
|
450
|
-
updateProperty(key, value) {
|
|
451
|
-
if (this.selectedElementIndex() >= 0) {
|
|
452
|
-
if (key === 'questionText' || key === 'question') {
|
|
453
|
-
if (!this.validateInput(value, key)) {
|
|
454
|
-
return;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
if (key === 'questionNumber') {
|
|
458
|
-
//AP-10MAR25 Convert the value to an integer
|
|
459
|
-
const newOrder = parseInt(value, 10);
|
|
460
|
-
if (isNaN(newOrder))
|
|
461
|
-
return;
|
|
462
|
-
//AP-10MAR25 Update the element's questionNumber in the form builder service
|
|
463
|
-
this.formBuilderService.updateElement(this.selectedElementIndex(), { questionNumber: newOrder });
|
|
464
|
-
//AP-10MAR25 Sort elements based on the updated questionNumber
|
|
465
|
-
this.formBuilderService.sortElementsByOrder();
|
|
466
|
-
}
|
|
467
|
-
if (key === 'font' || key === 'fontWeight') {
|
|
468
|
-
this.selectedElement.update(el => ({ ...el, [key]: value }));
|
|
469
|
-
}
|
|
470
|
-
const update = { [key]: value };
|
|
471
|
-
this.formBuilderService.updateElement(this.selectedElementIndex(), update);
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
onRadioChange(targetArrayPath, targetArrayKey, key, value) {
|
|
475
|
-
if (this.selectedElement()?.type === 'Table') {
|
|
476
|
-
let targetArray = this.getDataByPath(targetArrayPath);
|
|
477
|
-
if (typeof targetArray === 'string') {
|
|
478
|
-
try {
|
|
479
|
-
targetArray = JSON.parse(targetArray || '[]');
|
|
480
|
-
}
|
|
481
|
-
catch (e) {
|
|
482
|
-
// console.error('Error parsing targetArray:', e);
|
|
483
|
-
targetArray = [];
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
if (!Array.isArray(targetArray))
|
|
487
|
-
return;
|
|
488
|
-
let foundItem = targetArray.find(item => item[targetArrayKey] === this.selectColumn());
|
|
489
|
-
if (!foundItem) {
|
|
490
|
-
foundItem = { [targetArrayKey]: this.selectColumn() };
|
|
491
|
-
targetArray.push(foundItem);
|
|
492
|
-
}
|
|
493
|
-
const keys = key.split('.');
|
|
494
|
-
let obj = foundItem;
|
|
495
|
-
for (let i = 0; i < keys.length - 1; i++) {
|
|
496
|
-
const k = keys[i];
|
|
497
|
-
if (!obj[k])
|
|
498
|
-
obj[k] = {};
|
|
499
|
-
obj = obj[k];
|
|
500
|
-
}
|
|
501
|
-
obj[keys[keys.length - 1]] = value;
|
|
502
|
-
this.selectedElement.update(el => ({
|
|
503
|
-
...el,
|
|
504
|
-
fieldsMeta: targetArray
|
|
505
|
-
}));
|
|
506
|
-
this.updateElement(this.selectedElement());
|
|
507
|
-
}
|
|
508
|
-
else {
|
|
509
|
-
this.setValueByPath(key, value);
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
onRequiredChange(value) {
|
|
513
|
-
if (this.selectedElement()) {
|
|
514
|
-
let label = this.selectedElement().label ? this.selectedElement().label.replace(/\s*\*+$/, '') : 'Label';
|
|
515
|
-
if (value) {
|
|
516
|
-
label = `${label} *`;
|
|
517
|
-
}
|
|
518
|
-
this.updateProperty('label', label);
|
|
519
|
-
this.updateProperty('isOptional', value);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
toggleSubQuestion(prop) {
|
|
523
|
-
this.isExpanded = !this.isExpanded;
|
|
524
|
-
}
|
|
525
|
-
toggleStyleSection() {
|
|
526
|
-
this.isStyleExpanded.set(!this.isStyleExpanded());
|
|
527
|
-
}
|
|
528
|
-
getProperties() {
|
|
529
|
-
const element = this.selectedElement();
|
|
530
|
-
const selectedColumn = this.selectColumn();
|
|
531
|
-
// Check if we can use cached result
|
|
532
|
-
if (this._cachedProperties &&
|
|
533
|
-
this._lastSelectedElement === element &&
|
|
534
|
-
this._lastSelectedColumn === selectedColumn) {
|
|
535
|
-
return this._cachedProperties;
|
|
536
|
-
}
|
|
537
|
-
if (!element) {
|
|
538
|
-
this._cachedProperties = null;
|
|
539
|
-
this._lastSelectedElement = null;
|
|
540
|
-
this._lastSelectedColumn = null;
|
|
541
|
-
return null;
|
|
542
|
-
}
|
|
543
|
-
let result = null;
|
|
544
|
-
if (element.type === 'Header') {
|
|
545
|
-
result = this.elementProperties()['Header'];
|
|
546
|
-
}
|
|
547
|
-
else if (element.type === 'Table' && selectedColumn !== null) {
|
|
548
|
-
let fieldsMeta = element.fieldsMeta;
|
|
549
|
-
try {
|
|
550
|
-
fieldsMeta = Array.isArray(fieldsMeta)
|
|
551
|
-
? fieldsMeta
|
|
552
|
-
: JSON.parse(fieldsMeta || '[]');
|
|
553
|
-
}
|
|
554
|
-
catch (e) {
|
|
555
|
-
// console.error('Error parsing fieldsMeta in getProperties:', e);
|
|
556
|
-
fieldsMeta = [];
|
|
557
|
-
}
|
|
558
|
-
const column = fieldsMeta.find((c) => c.uniqueIdentifier === selectedColumn);
|
|
559
|
-
if (column) {
|
|
560
|
-
const markIsTableColumn = (items = []) => items.map(item => {
|
|
561
|
-
const newItem = { ...item, isTableColumn: true };
|
|
562
|
-
if (Array.isArray(newItem.subQuestion)) {
|
|
563
|
-
newItem.subQuestion = newItem.subQuestion.map(sub => ({
|
|
564
|
-
...sub,
|
|
565
|
-
isTableColumn: true
|
|
566
|
-
}));
|
|
567
|
-
}
|
|
568
|
-
return newItem;
|
|
569
|
-
});
|
|
570
|
-
result = {
|
|
571
|
-
elementProps: [
|
|
572
|
-
...(this.elementProperties()['TableColumn'].elementProps || []),
|
|
573
|
-
...markIsTableColumn(this.elementProperties()[this.elementType.includes(column.fldType) ? column.fldType : 'Text']?.elementProps)
|
|
574
|
-
],
|
|
575
|
-
fieldProps: [
|
|
576
|
-
...(this.elementProperties()['TableColumn'].fieldProps || []),
|
|
577
|
-
...markIsTableColumn(this.elementProperties()[this.elementType.includes(column.fldType) ? column.fldType : 'Text']?.fieldProps)
|
|
578
|
-
],
|
|
579
|
-
appearance: [
|
|
580
|
-
...(this.elementProperties()['TableColumn'].appearance || []),
|
|
581
|
-
...markIsTableColumn(this.elementProperties()[this.elementType.includes(column.fldType) ? column.fldType : 'Text']?.appearance)
|
|
582
|
-
]
|
|
583
|
-
};
|
|
584
|
-
}
|
|
585
|
-
else {
|
|
586
|
-
result = this.elementProperties()['TableColumn'];
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
else {
|
|
590
|
-
result = this.elementProperties()[element.type];
|
|
591
|
-
}
|
|
592
|
-
// Cache the result
|
|
593
|
-
this._cachedProperties = result;
|
|
594
|
-
this._lastSelectedElement = element;
|
|
595
|
-
this._lastSelectedColumn = selectedColumn;
|
|
596
|
-
return result;
|
|
597
|
-
}
|
|
598
|
-
// Add method to clear cache when needed
|
|
599
|
-
clearPropertiesCache() {
|
|
600
|
-
this._cachedProperties = null;
|
|
601
|
-
this._lastSelectedElement = null;
|
|
602
|
-
this._lastSelectedColumn = null;
|
|
603
|
-
}
|
|
604
|
-
// AP-28MAR25 Add an option with a unique UUID
|
|
605
|
-
addOption(options) {
|
|
606
|
-
const unique_id = uuidv4();
|
|
607
|
-
options.push({ id: unique_id, value: '' });
|
|
608
|
-
}
|
|
609
|
-
// AP-28MAR25 Function to remove an option based on its unique UUID
|
|
610
|
-
removeOption(options, id) {
|
|
611
|
-
const index = options.findIndex(option => option.id === id);
|
|
612
|
-
if (index !== -1) {
|
|
613
|
-
options.splice(index, 1);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
handleButtonClick() {
|
|
617
|
-
this.formButtonHandler.emit(this.formBuilderService.downloadElement());
|
|
618
|
-
}
|
|
619
|
-
handleTemplateSave() {
|
|
620
|
-
this.templateSaveHandler.emit(this.templateService.download());
|
|
621
|
-
}
|
|
622
|
-
setActiveTab(tab) {
|
|
623
|
-
this.activeTab.set(tab);
|
|
624
|
-
}
|
|
625
|
-
onSave() { }
|
|
626
|
-
onCancel() { }
|
|
627
|
-
onAlignSelect(value) {
|
|
628
|
-
this.selectedElement.update(el => ({ ...el, textAlign: value }));
|
|
629
|
-
}
|
|
630
|
-
onStyleSelect(value) {
|
|
631
|
-
this.selectedElement.update(el => ({
|
|
632
|
-
...el,
|
|
633
|
-
styles: [value]
|
|
634
|
-
}));
|
|
635
|
-
}
|
|
636
|
-
isStyleActive(value) {
|
|
637
|
-
return this.selectedElement()?.styles?.includes(value) || false;
|
|
638
|
-
}
|
|
639
|
-
getValueByPath(path, obj = this.selectedElement(), defaultValue = '') {
|
|
640
|
-
if (!obj || !path)
|
|
641
|
-
return defaultValue;
|
|
642
|
-
return path.split('.').reduce((o, k) => o?.[k] ?? defaultValue, obj);
|
|
643
|
-
}
|
|
644
|
-
isAnotherIdSelected() {
|
|
645
|
-
return this.formBuilderService.getElements()
|
|
646
|
-
.some((el, i) => i !== this.selectedElementIndex() && el.primaryKey);
|
|
647
|
-
}
|
|
648
|
-
// Also update your onToggleChange method to clear cache
|
|
649
|
-
onToggleChange(path, event) {
|
|
650
|
-
// Clear cache when element changes
|
|
651
|
-
this.clearPropertiesCache();
|
|
652
|
-
const checked = event.target ? event.target.checked : event;
|
|
653
|
-
this.setValueByPath(path, checked);
|
|
654
|
-
if (this.selectedElement()?.type === 'Table') {
|
|
655
|
-
let fieldsMeta = this.getDataByPath('fieldsMeta');
|
|
656
|
-
if (typeof fieldsMeta === 'string') {
|
|
657
|
-
try {
|
|
658
|
-
fieldsMeta = JSON.parse(fieldsMeta || '[]');
|
|
659
|
-
}
|
|
660
|
-
catch (e) {
|
|
661
|
-
// console.error('Error parsing fieldsMeta:', e);
|
|
662
|
-
fieldsMeta = [];
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
this.selectedElement.update(el => ({
|
|
666
|
-
...el,
|
|
667
|
-
fieldsMeta: fieldsMeta
|
|
668
|
-
}));
|
|
669
|
-
this.updateElement(this.selectedElement());
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
// Update your setValueByPath method to clear cache
|
|
673
|
-
setValueByPath(path, value, isTranslate = false) {
|
|
674
|
-
// Clear cache when element changes
|
|
675
|
-
this.clearPropertiesCache();
|
|
676
|
-
if (this.selectedElementIndex() >= 0) {
|
|
677
|
-
if (path === 'questionText' || path === 'question') {
|
|
678
|
-
if (!this.validateInput(value, path)) {
|
|
679
|
-
return;
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
if (path === 'questionNumber') {
|
|
683
|
-
const newOrder = parseInt(value, 10);
|
|
684
|
-
if (isNaN(newOrder))
|
|
685
|
-
return;
|
|
686
|
-
this.formBuilderService.updateElement(this.selectedElementIndex(), { questionNumber: newOrder });
|
|
687
|
-
this.formBuilderService.sortElementsByOrder();
|
|
688
|
-
}
|
|
689
|
-
if (path === 'font' || path === 'fontWeight') {
|
|
690
|
-
this.selectedElement.update(el => ({ ...el, [path]: value }));
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
const element = this.selectedElement();
|
|
694
|
-
if (element) {
|
|
695
|
-
let subText = element.subText;
|
|
696
|
-
if (typeof subText === 'string' && subText.trim() !== '') {
|
|
697
|
-
try {
|
|
698
|
-
subText = JSON.parse(subText);
|
|
699
|
-
}
|
|
700
|
-
catch (e) {
|
|
701
|
-
// console.error('Error parsing subText:', e);
|
|
702
|
-
subText = {};
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
else if (typeof subText !== 'object' || subText === null) {
|
|
706
|
-
subText = {};
|
|
707
|
-
}
|
|
708
|
-
const arrayFields = ['field', 'queryParameter', 'sourceQuestionId', 'queryField', 'queryValue'];
|
|
709
|
-
if (subText) {
|
|
710
|
-
arrayFields.forEach(key => {
|
|
711
|
-
if (Array.isArray(subText[key])) {
|
|
712
|
-
subText[key] = subText[key].join(', ');
|
|
713
|
-
}
|
|
714
|
-
});
|
|
715
|
-
}
|
|
716
|
-
if (element.type === 'Table') {
|
|
717
|
-
element.fieldsMeta.forEach(field => {
|
|
718
|
-
if (field?.question?.subText) {
|
|
719
|
-
arrayFields.forEach(key => {
|
|
720
|
-
if (Array.isArray(field.question.subText[key])) {
|
|
721
|
-
field.question.subText[key] = field.question.subText[key].join(', ');
|
|
722
|
-
}
|
|
723
|
-
});
|
|
724
|
-
}
|
|
725
|
-
});
|
|
726
|
-
}
|
|
727
|
-
if (isTranslate) {
|
|
728
|
-
//SKS28JUL25 Refresh the book signal from service
|
|
729
|
-
const updatedBook = this.formBuilderService.getBook();
|
|
730
|
-
this.book.set(updatedBook);
|
|
731
|
-
// Work with a mutable copy
|
|
732
|
-
const currentBook = this.book();
|
|
733
|
-
const translationMap = currentBook.translationMap || {};
|
|
734
|
-
const currentLang = this.translationService.getFormBuilderLanguage();
|
|
735
|
-
//SKS28JUL25 Ensure nested structure exists
|
|
736
|
-
if (!translationMap[currentLang])
|
|
737
|
-
translationMap[currentLang] = {};
|
|
738
|
-
if (!translationMap[currentLang][element.id])
|
|
739
|
-
translationMap[currentLang][element.id] = {};
|
|
740
|
-
// Set the translated value
|
|
741
|
-
translationMap[currentLang][element.id][path] = value;
|
|
742
|
-
// Update book and re-set the signal
|
|
743
|
-
currentBook.translationMap = translationMap;
|
|
744
|
-
this.book.set(currentBook); // Trigger reactive update
|
|
745
|
-
//SKS28JUL25 Update in service if needed
|
|
746
|
-
this.formBuilderService.updateBook(currentBook);
|
|
747
|
-
}
|
|
748
|
-
this.selectedElement.update(el => ({ ...el, subText }));
|
|
749
|
-
}
|
|
750
|
-
const keys = path.split('.');
|
|
751
|
-
this.selectedElement.update(el => {
|
|
752
|
-
let obj = { ...el };
|
|
753
|
-
let current = obj;
|
|
754
|
-
keys.forEach((key, index) => {
|
|
755
|
-
if (index === keys.length - 1) {
|
|
756
|
-
current[key] = value;
|
|
757
|
-
}
|
|
758
|
-
else {
|
|
759
|
-
if (!current[key]) {
|
|
760
|
-
current[key] = isNaN(Number(keys[index + 1])) ? {} : [];
|
|
761
|
-
}
|
|
762
|
-
current = current[key];
|
|
763
|
-
}
|
|
764
|
-
});
|
|
765
|
-
return obj;
|
|
766
|
-
});
|
|
767
|
-
this.formBuilderService.elementUpdate(this.selectedElementIndex(), this.selectedElement());
|
|
768
|
-
}
|
|
769
|
-
optionTranslationUpdate(option, event) {
|
|
770
|
-
//SKS28JUL25 Refresh the book signal from service
|
|
771
|
-
const updatedBook = this.formBuilderService.getBook();
|
|
772
|
-
this.book.set(updatedBook);
|
|
773
|
-
// Work with a mutable copy
|
|
774
|
-
const currentBook = this.book();
|
|
775
|
-
const translationMap = currentBook.translationMap || {};
|
|
776
|
-
const currentLang = this.translationService.getFormBuilderLanguage();
|
|
777
|
-
//SKS28JUL25 Ensure nested structure exists
|
|
778
|
-
if (!translationMap[currentLang])
|
|
779
|
-
translationMap[currentLang] = {};
|
|
780
|
-
if (!translationMap[currentLang][option.id])
|
|
781
|
-
translationMap[currentLang][option.id] = {};
|
|
782
|
-
// Set the translated value
|
|
783
|
-
translationMap[currentLang][option.id]['value'] = event;
|
|
784
|
-
// Update book and re-set the signal
|
|
785
|
-
currentBook.translationMap = translationMap;
|
|
786
|
-
this.book.set(currentBook); // Trigger reactive update
|
|
787
|
-
//SKS28JUL25 Update in service if needed
|
|
788
|
-
this.formBuilderService.updateBook(currentBook);
|
|
789
|
-
}
|
|
790
|
-
getStyleKeys() {
|
|
791
|
-
const style = this.selectedElement()?.style;
|
|
792
|
-
return style && typeof style === 'object' ? Object.keys(style) : [];
|
|
793
|
-
}
|
|
794
|
-
updateElement(element) {
|
|
795
|
-
this.formBuilderService.elementUpdate(this.selectedElementIndex(), element);
|
|
796
|
-
if (element?.type === 'Table' && this.selectColumn()) {
|
|
797
|
-
this.formBuilderService.setSelectedTableElement(this.selectedElementIndex(), { uniqueIdentifier: this.selectColumn() || null });
|
|
798
|
-
this.selectedElement.set({ ...element }); // Ensure reactive update
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
getValueByArrayPath(targetArrayPath, targetArrayKey, selectColumn, keyPath, isTableColumn = false) {
|
|
802
|
-
if (isTableColumn) {
|
|
803
|
-
targetArrayPath = 'fieldsMeta';
|
|
804
|
-
targetArrayKey = 'uniqueIdentifier';
|
|
805
|
-
keyPath = 'question.' + keyPath;
|
|
806
|
-
}
|
|
807
|
-
let targetArray = this.getDataByPath(targetArrayPath);
|
|
808
|
-
if (typeof targetArray === 'string') {
|
|
809
|
-
try {
|
|
810
|
-
targetArray = JSON.parse(targetArray || '[]');
|
|
811
|
-
}
|
|
812
|
-
catch (e) {
|
|
813
|
-
// console.error('Error parsing targetArray:', e);
|
|
814
|
-
return '';
|
|
815
|
-
}
|
|
816
|
-
}
|
|
817
|
-
if (!Array.isArray(targetArray))
|
|
818
|
-
return '';
|
|
819
|
-
const foundItem = targetArray.find(item => item[targetArrayKey] === selectColumn);
|
|
820
|
-
return foundItem ? keyPath.split('.').reduce((obj, key) => obj?.[key], foundItem) : '';
|
|
821
|
-
}
|
|
822
|
-
updateValueByArrayPath(targetArrayPath, targetArrayKey, selectColumn, keyPath, event, isTableColumn = false, isTranslate = false) {
|
|
823
|
-
// Clear cache when element changes
|
|
824
|
-
this.clearPropertiesCache();
|
|
825
|
-
if (isTableColumn) {
|
|
826
|
-
targetArrayPath = 'fieldsMeta';
|
|
827
|
-
targetArrayKey = 'uniqueIdentifier';
|
|
828
|
-
keyPath = 'question.' + keyPath;
|
|
829
|
-
}
|
|
830
|
-
let targetArray = this.getDataByPath(targetArrayPath);
|
|
831
|
-
if (typeof targetArray === 'string') {
|
|
832
|
-
try {
|
|
833
|
-
targetArray = JSON.parse(targetArray || '[]');
|
|
834
|
-
}
|
|
835
|
-
catch (e) {
|
|
836
|
-
// console.error('Error parsing targetArray:', e);
|
|
837
|
-
targetArray = [];
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
if (!Array.isArray(targetArray)) {
|
|
841
|
-
targetArray = [];
|
|
842
|
-
this.selectedElement.update(el => ({
|
|
843
|
-
...el,
|
|
844
|
-
[targetArrayPath]: targetArray
|
|
845
|
-
}));
|
|
846
|
-
}
|
|
847
|
-
let foundItem = targetArray.find(item => item[targetArrayKey] === selectColumn);
|
|
848
|
-
if (!foundItem) {
|
|
849
|
-
foundItem = { [targetArrayKey]: selectColumn };
|
|
850
|
-
targetArray.push(foundItem);
|
|
851
|
-
}
|
|
852
|
-
const keys = keyPath.split('.');
|
|
853
|
-
let obj = foundItem;
|
|
854
|
-
for (let i = 0; i < keys.length - 1; i++) {
|
|
855
|
-
const key = keys[i];
|
|
856
|
-
if (!obj[key])
|
|
857
|
-
obj[key] = {};
|
|
858
|
-
obj = obj[key];
|
|
859
|
-
}
|
|
860
|
-
const lastKey = keys[keys.length - 1];
|
|
861
|
-
const inputElement = event.target ? event.target : event;
|
|
862
|
-
obj[lastKey] = inputElement?.type === 'checkbox' ? inputElement.checked : inputElement.value ? inputElement.value : inputElement;
|
|
863
|
-
if (isTranslate) {
|
|
864
|
-
// Refresh the book
|
|
865
|
-
this.book.set(this.formBuilderService.getBook());
|
|
866
|
-
//SKS28JUL25 Work with a mutable copy of the signal value
|
|
867
|
-
const currentBook = this.book();
|
|
868
|
-
const translationMap = currentBook.translationMap || {};
|
|
869
|
-
const currentLang = this.translationService.getFormBuilderLanguage();
|
|
870
|
-
// Initialize nested structure safely
|
|
871
|
-
if (!translationMap[currentLang])
|
|
872
|
-
translationMap[currentLang] = {};
|
|
873
|
-
if (!translationMap[currentLang][obj.id])
|
|
874
|
-
translationMap[currentLang][obj.id] = {};
|
|
875
|
-
// Set the translated input
|
|
876
|
-
translationMap[currentLang][obj.id][lastKey] = inputElement;
|
|
877
|
-
//SKS28JUL25 Update the book object and re-set the signal
|
|
878
|
-
currentBook.translationMap = translationMap;
|
|
879
|
-
this.book.set(currentBook);
|
|
880
|
-
// Optionally inform the service
|
|
881
|
-
this.formBuilderService.updateBook(currentBook);
|
|
882
|
-
}
|
|
883
|
-
if (keyPath === 'summaryColumn') {
|
|
884
|
-
if (obj['summaryRow'] === true) {
|
|
885
|
-
obj['summaryRow'] = false;
|
|
886
|
-
}
|
|
887
|
-
if (inputElement.checked === true) {
|
|
888
|
-
obj['fldType'] = 'calculation';
|
|
889
|
-
}
|
|
890
|
-
else {
|
|
891
|
-
obj['fldType'] = 'Text';
|
|
892
|
-
}
|
|
893
|
-
}
|
|
894
|
-
if (keyPath === 'summaryRow') {
|
|
895
|
-
if (obj['summaryColumn'] === true) {
|
|
896
|
-
obj['summaryColumn'] = false;
|
|
897
|
-
}
|
|
898
|
-
if (inputElement.checked === true) {
|
|
899
|
-
obj['fldType'] = 'calculation';
|
|
900
|
-
}
|
|
901
|
-
else {
|
|
902
|
-
obj['fldType'] = 'Text';
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
this.selectedElement.update(el => ({
|
|
906
|
-
...el,
|
|
907
|
-
[targetArrayPath]: targetArray
|
|
908
|
-
}));
|
|
909
|
-
this.updateElement(this.selectedElement());
|
|
910
|
-
}
|
|
911
|
-
getDataByPath(path) {
|
|
912
|
-
return path.split('.').reduce((obj, key) => obj?.[key], this.selectedElement());
|
|
913
|
-
}
|
|
914
|
-
flipHorizontal() {
|
|
915
|
-
this.transform.update(t => ({ ...t, flipH: !t.flipH }));
|
|
916
|
-
}
|
|
917
|
-
flipVertical() {
|
|
918
|
-
this.transform.update(t => ({ ...t, flipV: !t.flipV }));
|
|
919
|
-
}
|
|
920
|
-
resetImage() {
|
|
921
|
-
this.canvasRotation.set(0);
|
|
922
|
-
this.cropper.set(undefined);
|
|
923
|
-
this.transform.set({
|
|
924
|
-
translateUnit: 'px',
|
|
925
|
-
scale: 1,
|
|
926
|
-
rotate: 0,
|
|
927
|
-
flipH: false,
|
|
928
|
-
flipV: false,
|
|
929
|
-
translateH: 0,
|
|
930
|
-
translateV: 0
|
|
931
|
-
});
|
|
932
|
-
}
|
|
933
|
-
zoomOut() {
|
|
934
|
-
this.transform.update(t => ({ ...t, scale: t.scale - 0.1 }));
|
|
935
|
-
}
|
|
936
|
-
zoomIn() {
|
|
937
|
-
this.transform.update(t => ({ ...t, scale: t.scale + 0.1 }));
|
|
938
|
-
}
|
|
939
|
-
rotateLeft() {
|
|
940
|
-
this.loading.set(true);
|
|
941
|
-
setTimeout(() => {
|
|
942
|
-
this.canvasRotation.update(c => c - 1);
|
|
943
|
-
this.flipAfterRotate();
|
|
944
|
-
});
|
|
945
|
-
}
|
|
946
|
-
rotateRight() {
|
|
947
|
-
this.loading.set(true);
|
|
948
|
-
setTimeout(() => {
|
|
949
|
-
this.canvasRotation.update(c => c + 1);
|
|
950
|
-
this.flipAfterRotate();
|
|
951
|
-
});
|
|
952
|
-
}
|
|
953
|
-
moveLeft() {
|
|
954
|
-
this.transform.update(t => ({ ...t, translateH: t.translateH - 1 }));
|
|
955
|
-
}
|
|
956
|
-
moveRight() {
|
|
957
|
-
this.transform.update(t => ({ ...t, translateH: t.translateH + 1 }));
|
|
958
|
-
}
|
|
959
|
-
moveDown() {
|
|
960
|
-
this.transform.update(t => ({ ...t, translateV: t.translateV + 1 }));
|
|
961
|
-
}
|
|
962
|
-
moveUp() {
|
|
963
|
-
this.transform.update(t => ({ ...t, translateV: t.translateV - 1 }));
|
|
964
|
-
}
|
|
965
|
-
flipAfterRotate() {
|
|
966
|
-
this.transform.update(t => ({
|
|
967
|
-
...t,
|
|
968
|
-
flipH: t.flipV,
|
|
969
|
-
flipV: t.flipH,
|
|
970
|
-
translateH: 0,
|
|
971
|
-
translateV: 0
|
|
972
|
-
}));
|
|
973
|
-
}
|
|
974
|
-
async imageCropped(event) {
|
|
975
|
-
try {
|
|
976
|
-
const base64 = await this.convertBlobToBase64(event.objectUrl);
|
|
977
|
-
this.selectedElement.update(el => ({ ...el, imageData: base64 }));
|
|
978
|
-
await this.formBuilderService.elementUpdate(this.selectedElementIndex(), this.selectedElement());
|
|
979
|
-
}
|
|
980
|
-
catch (error) {
|
|
981
|
-
// console.error("Error in imageCropped:", error);
|
|
982
|
-
}
|
|
983
|
-
}
|
|
984
|
-
cropperReady(sourceImageDimensions) {
|
|
985
|
-
this.loading.set(false);
|
|
986
|
-
}
|
|
987
|
-
convertBlobToBase64(objectUrl) {
|
|
988
|
-
return fetch(objectUrl)
|
|
989
|
-
.then(response => response.blob())
|
|
990
|
-
.then(blob => {
|
|
991
|
-
return new Promise((resolve, reject) => {
|
|
992
|
-
const reader = new FileReader();
|
|
993
|
-
reader.readAsDataURL(blob);
|
|
994
|
-
reader.onloadend = () => resolve(reader.result);
|
|
995
|
-
reader.onerror = error => reject(error);
|
|
996
|
-
});
|
|
997
|
-
});
|
|
998
|
-
}
|
|
999
|
-
childEventCapture(event) {
|
|
1000
|
-
this.selectedElement.update(el => ({
|
|
1001
|
-
...el,
|
|
1002
|
-
qbReference: event.valueObj?.name,
|
|
1003
|
-
qbReferenceQuestions: event.valueObj?.jsonBody
|
|
1004
|
-
}));
|
|
1005
|
-
this.formBuilderService.elementUpdate(this.selectedElementIndex(), this.selectedElement());
|
|
1006
|
-
}
|
|
1007
|
-
linkToggleDropdown(event) {
|
|
1008
|
-
event.stopPropagation();
|
|
1009
|
-
this.isLinkDropdownOpen.update(open => !open);
|
|
1010
|
-
}
|
|
1011
|
-
onClickOutside(event) {
|
|
1012
|
-
if (this.dropdown && !this.dropdown.nativeElement.contains(event.target)) {
|
|
1013
|
-
this.isLinkDropdownOpen.set(false);
|
|
1014
|
-
}
|
|
1015
|
-
}
|
|
1016
|
-
onDragStart(event, id) {
|
|
1017
|
-
this.draggedId = id;
|
|
1018
|
-
event.dataTransfer.effectAllowed = "move";
|
|
1019
|
-
}
|
|
1020
|
-
// AP-28MAR25 Prevent default behavior to allow drop
|
|
1021
|
-
onDragOver(event) {
|
|
1022
|
-
event.preventDefault();
|
|
1023
|
-
}
|
|
1024
|
-
// AP-28MAR25 Swap the dragged item with the dropped position
|
|
1025
|
-
onDrop(event, key) {
|
|
1026
|
-
event.preventDefault();
|
|
1027
|
-
const targetId = event.target.closest(".option-items")?.getAttribute("data-id");
|
|
1028
|
-
if (this.draggedId && targetId && this.draggedId !== targetId) {
|
|
1029
|
-
this.selectedElement.update(el => {
|
|
1030
|
-
const options = [...el[key]];
|
|
1031
|
-
const draggedIndex = options.findIndex(option => option.id === this.draggedId);
|
|
1032
|
-
const targetIndex = options.findIndex(option => option.id === targetId);
|
|
1033
|
-
if (draggedIndex !== -1 && targetIndex !== -1) {
|
|
1034
|
-
[options[draggedIndex], options[targetIndex]] = [options[targetIndex], options[draggedIndex]];
|
|
1035
|
-
}
|
|
1036
|
-
return { ...el, [key]: options };
|
|
1037
|
-
});
|
|
1038
|
-
}
|
|
1039
|
-
this.draggedId = null;
|
|
1040
|
-
}
|
|
1041
|
-
duplicateField(element) {
|
|
1042
|
-
const elements = this.formBuilderService.getElements();
|
|
1043
|
-
const copy = JSON.parse(JSON.stringify(element));
|
|
1044
|
-
//AP-18APR25 Generate a new ID using the service's method
|
|
1045
|
-
copy.id = this.formBuilderService.addElementWithId();
|
|
1046
|
-
//copy.uuid = copy.id;
|
|
1047
|
-
// AP-18APR25 Set the questionNumber to the next available number
|
|
1048
|
-
copy.questionNumber = elements.length + 1;
|
|
1049
|
-
this.formBuilderService.addElement(copy);
|
|
1050
|
-
}
|
|
1051
|
-
draggedId = null;
|
|
1052
|
-
updateBookSubtext(key, value) {
|
|
1053
|
-
this.bookSubtext.update((s) => ({
|
|
1054
|
-
...s,
|
|
1055
|
-
[key]: value,
|
|
1056
|
-
}));
|
|
1057
|
-
}
|
|
1058
|
-
trackByProp(index, item) {
|
|
1059
|
-
return item?.key ?? index;
|
|
1060
|
-
}
|
|
1061
|
-
getOptimizedSubPropValue(subProp) {
|
|
1062
|
-
const element = this.selectedElement();
|
|
1063
|
-
if (this.selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn)) {
|
|
1064
|
-
return this.getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, this.selectColumn(), subProp.key, subProp.isTableColumn);
|
|
1065
|
-
}
|
|
1066
|
-
return this.getValueByPath(subProp.key, element);
|
|
1067
|
-
}
|
|
1068
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, deps: [{ token: i1.FormBuilderService }, { token: i2.TemplateService }, { token: i3.TranslationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1069
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: PropertiesComponent, isStandalone: true, selector: "app-properties", inputs: { templateSelected: "templateSelected", selectedElementType: "selectedElementType" }, outputs: { formButtonHandler: "formButtonHandler", templateSaveHandler: "templateSaveHandler" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<!-- AP 22JAN25 - Field and Element Properties -->\n\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'attributes'}\" (click)=\"setActiveTab('attributes')\">{{ 'ATTRIBUTES' | nxtCustomTranslate : 'Attributes' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'property'}\" (click)=\"setActiveTab('property')\">{{ 'PROPERTY' | nxtCustomTranslate : 'Property' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'appearance'}\" (click)=\"setActiveTab('appearance')\">{{ 'APPEARANCE' | nxtCustomTranslate : 'Appearance' }}</div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'attributes'\">\n @defer (when getProperties()) {\n <div>\n @defer (when selectedElement()?.type === 'Image') {\n <image-cropper\n *ngIf=\"selectedElement().imageData\"\n [imageBase64]=\"selectedElement().orgImageData\"\n [disabled]=\"false\"\n [alignImage]=\"alignImage\"\n [roundCropper]=\"roundCropper\"\n [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\"\n [allowMoveImage]=\"false\"\n [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation()\"\n [aspectRatio]=\"aspectRatio\"\n [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\"\n [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\"\n [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\"\n [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\"\n [resetCropOnAspectRatioChange]=\"true\"\n [(cropper)]=\"cropper\"\n [(transform)]=\"transform\"\n [onlyScaleDown]=\"true\"\n output=\"blob\"\n format=\"png\"\n (imageCropped)=\"imageCropped($event)\"\n (cropperReady)=\"cropperReady($event)\"\n ></image-cropper>\n <div *ngIf=\"selectedElement().imageData\" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"{{ 'ROTATE_LEFT' | nxtCustomTranslate : 'Rotate Left' }}\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"{{ 'ROTATE_RIGHT' | nxtCustomTranslate : 'Rotate Right' }}\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"{{ 'ZOOM_OUT' | nxtCustomTranslate : 'Zoom Out' }}\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"{{ 'ZOOM_IN' | nxtCustomTranslate : 'Zoom In' }}\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"{{ 'MOVE_LEFT' | nxtCustomTranslate : 'Move Left' }}\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"{{ 'MOVE_RIGHT' | nxtCustomTranslate : 'Move Right' }}\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"{{ 'MOVE_UP' | nxtCustomTranslate : 'Move Up' }}\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"{{ 'MOVE_DOWN' | nxtCustomTranslate : 'Move Down' }}\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [ngClass]=\"{'enabled': transform().flipH}\" title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [ngClass]=\"{'enabled': transform().flipV}\" title=\"{{ 'FLIP_VERTICALLY' | nxtCustomTranslate : 'Flip Vertically' }}\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"{{ 'RESET' | nxtCustomTranslate : 'Reset' }}\">\u00D7</div>\n </div>\n }\n <div *ngIf=\"selectedElement()?.type === 'Book'\">\n <label class=\"text-sm\">{{ 'SEARCH_BOOK' | nxtCustomTranslate : 'Search Book' }}</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box\n [question]=\"selectedElement()\"\n [apiMeta]=\"bookSubtext()\"\n [placeHolderText]=\"'SEARCH' | nxtCustomTranslate : 'Search...'\"\n (searchValueChange)=\"childEventCapture($event.value)\"\n ></nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen()\" #dropdown>\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().endpoint\" (ngModelChange)=\"updateBookSubtext('endpoint', $event)\" />\n <label>{{ 'VARIABLE' | nxtCustomTranslate : 'Variable' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().variable\" (ngModelChange)=\"updateBookSubtext('variable', $event)\" />\n <label>{{ 'FIELD' | nxtCustomTranslate : 'Field' }}:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString()\" (ngModelChange)=\"updateField($event)\" />\n <label>{{ 'DEFAULT_FIELD' | nxtCustomTranslate : 'Default Field' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().defaultField\" (ngModelChange)=\"updateBookSubtext('defaultField', $event)\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.elementProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.key === 'helpText' && selectedElement()?.helpText\">{{ selectedElement()?.helpText }}</div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <input *ngIf=\"prop.type === 'number'\"\n type=\"number\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n <select *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n </div>\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.labelPath | nxtCustomTranslate : prop.label }}</div>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n <div\n *ngIf=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n >\n <div *ngFor=\"let subProp of prop.subQuestion\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName, $event.target.checked)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"radio\"\n [name]=\"subProp.key\"\n [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <input\n *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [ngModel]=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) : (selectedElement() | getValueByPath : subProp.key)) : (selectedElement() | getValueByPath : subProp.key)\"\n (ngModelChange)=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event,false, prop.isTranslate) : setValueByPath(subProp.key, $event)) : setValueByPath(subProp.key, $event, prop.isTranslate)\"\n />\n <input\n *ngIf=\"subProp.type === 'boolean'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n <select\n *ngIf=\"subProp.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? (getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, subProp.isTableColumn)) : (selectedElement() | getValueByPath : subProp.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of subProp.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"subProp.type === 'checkbox'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\" [ngClass]=\"{'active': selectedElement()?.textAlign === option.value}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\" [ngClass]=\"{'active': isStyleActive(option.value)}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'color'\">\n <input\n type=\"color\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n </div>\n <div *ngIf=\"prop.key === 'title'\" style=\"margin-top: 15px; border: 1px solid #ddd; padding: 20px; border-radius: 12px; background-color: #f9f9f9;\">\n <div class=\"form-header\">\n <label class=\"form-label\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <button (click)=\"addNewButton()\" class=\"add-button\">+ {{ 'ADD_BUTTON' | nxtCustomTranslate : 'Add Button' }}</button>\n </div>\n <div *ngFor=\"let btn of book()?.questionbook?.action || []; let i = index\" class=\"button-config-card\">\n <div class=\"form-group\">\n <label>{{ 'BUTTON_NAME' | nxtCustomTranslate : 'Button Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.name\" (ngModelChange)=\"onButtonPropertyChange(i, 'name', $event,true)\" placeholder=\"Enter button name\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'EVENT_NAME' | nxtCustomTranslate : 'Event Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.eventtoemit\" (ngModelChange)=\"onButtonPropertyChange(i, 'eventtoemit', $event)\" placeholder=\"Event to emit\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'ALT' | nxtCustomTranslate : 'Alt' }}</label>\n <input type=\"text\" [ngModel]=\"btn.alt\" (ngModelChange)=\"onButtonPropertyChange(i, 'alt', $event)\" placeholder=\"Button alt text\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}</label>\n <input type=\"text\" [ngModel]=\"btn.endpoint\" (ngModelChange)=\"onButtonPropertyChange(i, 'endpoint', $event)\" placeholder=\"API endpoint\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'METHOD' | nxtCustomTranslate : 'Method' }}</label>\n <select [ngModel]=\"btn.method\" (ngModelChange)=\"onButtonPropertyChange(i, 'method', $event)\">\n <option value=\"GET\">GET</option>\n <option value=\"POST\">POST</option>\n <option value=\"PUT\">PUT</option>\n <option value=\"DELETE\">DELETE</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BACKGROUND_COLOR' | nxtCustomTranslate : 'Background Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.bgColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'bgColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'BORDER_RADIUS' | nxtCustomTranslate : 'Border Radius' }}</label>\n <input type=\"range\" min=\"0\" max=\"50\" [ngModel]=\"btn.borderRadius\" (ngModelChange)=\"onButtonPropertyChange(i, 'borderRadius', $event)\">\n <span>{{ btn.borderRadius }}px</span>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BUTTON_WIDTH_PX' | nxtCustomTranslate : 'Button Width (px)' }}</label>\n <input type=\"number\" [ngModel]=\"btn.width\" (ngModelChange)=\"onButtonPropertyChange(i, 'width', $event)\" min=\"50\" placeholder=\"Enter width in px\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'TEXT_COLOR' | nxtCustomTranslate : 'Text Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.textColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'textColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'POSITION_PERCENT' | nxtCustomTranslate : 'Position (%)' }}</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"btn.positionPercent\" (ngModelChange)=\"onButtonPropertyChange(i, 'positionPercent', $event)\">\n <span>{{ btn.positionPercent }}%</span>\n </div>\n <button (click)=\"removeButton(btn)\" class=\"remove-button\">\u00D7 {{ 'REMOVE' | nxtCustomTranslate : 'Remove' }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'property'\">\n @defer (when getProperties()) {\n <div>\n <label>Label Id</label>\n <div style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect() ? bookId() : selectedElement()?.id }}\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.fieldProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isOptional')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isOptional', $event)\"\n />\n {{ 'REQUIRED' | nxtCustomTranslate : 'Required' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isReadOnly')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isReadOnly', $event)\"\n />\n {{ 'READ_ONLY' | nxtCustomTranslate : 'Read Only' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isHidden')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isHidden', $event)\"\n />\n {{ 'IS_HIDE' | nxtCustomTranslate : 'Is Hide' }}\n </label>\n </div>\n </div>\n <div *ngIf=\" prop.type === 'checkbox' || prop.type === 'radio' || prop.key === 'options'\" class=\"options-container\">\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key] ; let i = index\" class=\"option-items\" [attr.data-id]=\"option.id\" draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n <input type=\"text\" [ngModel]=\"option.value\" (ngModelChange)=\"option.value = $event; optionTranslationUpdate(option,$event)\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement()[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n <button (click)=\"addOption(selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>{{ 'ADD' | nxtCustomTranslate : 'Add' }}</span>\n </div>\n </button>\n </div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isExpanded\" style=\"border: 1px solid #ddd; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion; trackBy: trackByProp\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <input *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [value]=\"getOptimizedSubPropValue(subProp)\"\n (input)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn)) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event.target.value, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\" />\n \n <!-- AP-02APR25 Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n </div>\n </ng-container>\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">{{ 'STYLE' | nxtCustomTranslate : 'Style' }}</div>\n <img [src]=\"isStyleExpanded() ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\" alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isStyleExpanded()\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input\n type=\"text\"\n [value]=\"selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(),'style.' + key, true) : (selectedElement() | getValueByPath : 'style.' + key)\"\n (input)=\"(selectedElement()?.type === 'Table' && selectColumn() ) ? updateValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), 'style.' + key, $event.target.value, true) : setValueByPath('style.' + key, $event.target.value)\"\n placeholder=\"Enter {{ key }}\"\n />\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'appearance'\">\n @defer (when getProperties()) {\n <div>\n <ng-container *ngFor=\"let prop of getProperties()?.appearance; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <select\n *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n\n <div class=\"flex-container\">\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input\n type=\"color\"\n [ngModel]=\"selectedElement()?.fontColor\"\n (ngModelChange)=\"setValueByPath('fontColor', $event, prop.isTranslate)\"\n >\n </div>\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>{{ 'HEX_CODE' | nxtCustomTranslate : 'HEX Code' }}</span>\n <input\n type=\"text\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n </div>\n </div>\n <div *ngIf=\"prop.type === 'button-toggle'\" class=\"button-toggle-wrapper\">\n <button\n type=\"button\"\n class=\"toggle-button\"\n (click)=\"duplicateField(selectedElement())\"\n >\n {{ 'ADD_DUPLICATE' | nxtCustomTranslate : 'Add Duplicate' }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">{{ 'CANCEL' | nxtCustomTranslate : 'Cancel' }}</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">{{ 'SAVE' | nxtCustomTranslate : 'Save' }}</button>\n </div>\n\n <div class=\"button-container\" *ngIf=\"templateSelected\" style=\"margin-top: 20px;\">\n <button class=\"save-btn\" (click)=\"handleTemplateSave()\">{{ 'SAVE_TEMPLATE' | nxtCustomTranslate : 'Save Template' }}</button>\n </div>\n</div>", styles: ["*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.container{width:100%;max-width:500px;margin:0 auto;background:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.toggle-header,.style-toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px;background:#f8f8f8;border:1px solid #ddd;border-radius:6px;margin-bottom:6px}.tabs{display:flex;background:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:80vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:block;font-size:14px;font-weight:500;color:#444;margin-bottom:8px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],input[type=number],select,textarea{width:100%;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:all .3s;background:#f8f8f8}input:focus,select:focus,textarea:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}textarea{min-height:55px;resize:vertical}button,.btn{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:all .3s}button:hover,.btn:hover{background:#0056b3;transform:translateY(-2px)}.add-button{padding:8px 14px;background:#0954c5;border-radius:8px}.remove-button{background:#e74c3c;padding:6px 12px;margin-top:10px}.remove-button:hover{background:#c0392b}.cancel-btn{background:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.save-btn{background:#0052cc}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;gap:10px;padding:8px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.color-picker-row,.color-picker-container{display:flex;align-items:center}.color-picker-container{border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box,.color-selector input[type=color]{width:78px;height:40px;border:none;border-radius:4px;cursor:pointer}.hex-input-container{display:flex;gap:20px;align-items:center;font-size:12px;color:#b0b0b0}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input,.hex-input-container input[type=text]{width:120px;padding:10px 12px;border:1px solid #d1d1d1;color:#28343e}.hex-label{color:#999;margin-right:5px}.select-container,.input-box-field{position:relative;width:100%}.dropdown-arrow,.input-box-field:after{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.input-box-field:after{content:\"\\25bc\";color:#1c1b1f;font-size:10px}.input-box-field select{background:#28343e;color:#fff;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none}.input-box-field select::-ms-expand{display:none}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}.options-container{display:flex;flex-direction:column;gap:12px}.field-size-controls,.flex-container{display:flex;align-items:center;gap:12px}.flex-container{margin-bottom:1rem}.size-input{width:110px;text-align:center}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background:#4caf50}.view-icon{background:#2196f3}.delete-icon{background:#f44336}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background:#d0d9ff;border-radius:4px}.link-icon{background:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:all .3s}.link-icon:hover{background:#d0e5ff}.link-icon:active{background:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.option-items:active{opacity:.5}.drag-handle{margin-left:10px;cursor:grab}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background:#2c6dd5}.button-config-card{background:#fff;padding:15px;border-radius:12px;border:1px solid #ccc;margin-top:20px;box-shadow:0 2px 8px #0000000d}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.button-container{display:flex;padding:15px;background:#f9f9f9;border-top:1px solid #eee}.button-container .cancel-btn,.button-container .save-btn{flex:1;padding:12px;font-weight:700}.divider{border-top:1px dashed #ddd;margin:20px 0}input{width:auto}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{padding:1rem;font-size:.9rem}.form-group,.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{flex-direction:column;grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [i4.NgClass, i4.NgForOf, i4.NgIf, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.NumberValueAccessor, i5.RangeValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.MinValidator, i5.NgModel, import("../../../components/search-box/search-box.component").then(m => m.NxtSearchBox), GetValueByPathPipe, NxtCustomTranslatePipe], () => [i4.NgClass, i4.NgIf, import("../../../components/image-cropper/component/image-cropper.component").then(m => m.ImageCropperComponent), NxtCustomTranslatePipe], () => [i4.NgForOf, i4.NgIf, i5.DefaultValueAccessor, i5.NgControlStatus, i5.NgModel, GetValueByPathPipe, NxtCustomTranslatePipe], () => [i4.NgForOf, i4.NgIf, i5.NgSelectOption, i5.ɵNgSelectMultipleOption, i5.DefaultValueAccessor, i5.SelectControlValueAccessor, i5.NgControlStatus, i5.NgModel, GetValueByPathPipe, NxtCustomTranslatePipe]] });
|
|
1070
|
-
}
|
|
1071
|
-
i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, resolveDeferredDeps: () => [import("../../../components/search-box/search-box.component").then(m => m.NxtSearchBox), import("../../../components/image-cropper/component/image-cropper.component").then(m => m.ImageCropperComponent)], resolveMetadata: (NxtSearchBox, ImageCropperComponent) => ({ decorators: [{
|
|
1072
|
-
type: Component,
|
|
1073
|
-
args: [{ selector: 'app-properties', standalone: true, imports: [CommonModule, FormsModule, ImageCropperComponent, NxtSearchBox, NgClass, NgFor, NgIf, GetValueByPathPipe, NxtCustomTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- AP 22JAN25 - Field and Element Properties -->\n\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'attributes'}\" (click)=\"setActiveTab('attributes')\">{{ 'ATTRIBUTES' | nxtCustomTranslate : 'Attributes' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'property'}\" (click)=\"setActiveTab('property')\">{{ 'PROPERTY' | nxtCustomTranslate : 'Property' }}</div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab() === 'appearance'}\" (click)=\"setActiveTab('appearance')\">{{ 'APPEARANCE' | nxtCustomTranslate : 'Appearance' }}</div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'attributes'\">\n @defer (when getProperties()) {\n <div>\n @defer (when selectedElement()?.type === 'Image') {\n <image-cropper\n *ngIf=\"selectedElement().imageData\"\n [imageBase64]=\"selectedElement().orgImageData\"\n [disabled]=\"false\"\n [alignImage]=\"alignImage\"\n [roundCropper]=\"roundCropper\"\n [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\"\n [allowMoveImage]=\"false\"\n [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation()\"\n [aspectRatio]=\"aspectRatio\"\n [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\"\n [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\"\n [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\"\n [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\"\n [resetCropOnAspectRatioChange]=\"true\"\n [(cropper)]=\"cropper\"\n [(transform)]=\"transform\"\n [onlyScaleDown]=\"true\"\n output=\"blob\"\n format=\"png\"\n (imageCropped)=\"imageCropped($event)\"\n (cropperReady)=\"cropperReady($event)\"\n ></image-cropper>\n <div *ngIf=\"selectedElement().imageData\" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"{{ 'ROTATE_LEFT' | nxtCustomTranslate : 'Rotate Left' }}\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"{{ 'ROTATE_RIGHT' | nxtCustomTranslate : 'Rotate Right' }}\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"{{ 'ZOOM_OUT' | nxtCustomTranslate : 'Zoom Out' }}\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"{{ 'ZOOM_IN' | nxtCustomTranslate : 'Zoom In' }}\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"{{ 'MOVE_LEFT' | nxtCustomTranslate : 'Move Left' }}\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"{{ 'MOVE_RIGHT' | nxtCustomTranslate : 'Move Right' }}\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"{{ 'MOVE_UP' | nxtCustomTranslate : 'Move Up' }}\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"{{ 'MOVE_DOWN' | nxtCustomTranslate : 'Move Down' }}\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [ngClass]=\"{'enabled': transform().flipH}\" title=\"{{ 'FLIP_HORIZONTALLY' | nxtCustomTranslate : 'Flip Horizontally' }}\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [ngClass]=\"{'enabled': transform().flipV}\" title=\"{{ 'FLIP_VERTICALLY' | nxtCustomTranslate : 'Flip Vertically' }}\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"{{ 'RESET' | nxtCustomTranslate : 'Reset' }}\">\u00D7</div>\n </div>\n }\n <div *ngIf=\"selectedElement()?.type === 'Book'\">\n <label class=\"text-sm\">{{ 'SEARCH_BOOK' | nxtCustomTranslate : 'Search Book' }}</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box\n [question]=\"selectedElement()\"\n [apiMeta]=\"bookSubtext()\"\n [placeHolderText]=\"'SEARCH' | nxtCustomTranslate : 'Search...'\"\n (searchValueChange)=\"childEventCapture($event.value)\"\n ></nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen()\" #dropdown>\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().endpoint\" (ngModelChange)=\"updateBookSubtext('endpoint', $event)\" />\n <label>{{ 'VARIABLE' | nxtCustomTranslate : 'Variable' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().variable\" (ngModelChange)=\"updateBookSubtext('variable', $event)\" />\n <label>{{ 'FIELD' | nxtCustomTranslate : 'Field' }}:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString()\" (ngModelChange)=\"updateField($event)\" />\n <label>{{ 'DEFAULT_FIELD' | nxtCustomTranslate : 'Default Field' }}:</label>\n <input type=\"text\" [ngModel]=\"bookSubtext().defaultField\" (ngModelChange)=\"updateBookSubtext('defaultField', $event)\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.elementProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.key === 'helpText' && selectedElement()?.helpText\">{{ selectedElement()?.helpText }}</div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <input *ngIf=\"prop.type === 'number'\"\n type=\"number\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n <select *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n </div>\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.labelPath | nxtCustomTranslate : prop.label }}</div>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n <div\n *ngIf=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n >\n <div *ngFor=\"let subProp of prop.subQuestion\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName, $event.target.checked)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns()\">\n <label>\n <input\n type=\"radio\"\n [name]=\"subProp.key\"\n [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\"\n >\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <input\n *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [ngModel]=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key) : (selectedElement() | getValueByPath : subProp.key)) : (selectedElement() | getValueByPath : subProp.key)\"\n (ngModelChange)=\"selectedElement()?.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event,false, prop.isTranslate) : setValueByPath(subProp.key, $event)) : setValueByPath(subProp.key, $event, prop.isTranslate)\"\n />\n <input\n *ngIf=\"subProp.type === 'boolean'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n <select\n *ngIf=\"subProp.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? (getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, subProp.isTableColumn)) : (selectedElement() | getValueByPath : subProp.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of subProp.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"subProp.type === 'checkbox'\"\n type=\"checkbox\"\n [checked]=\"selectedElement() | getValueByPath : subProp.key\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\"\n />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\" [ngClass]=\"{'active': selectedElement()?.textAlign === option.value}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\" [ngClass]=\"{'active': isStyleActive(option.value)}\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n <div *ngIf=\"prop.type === 'color'\">\n <input\n type=\"color\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n />\n </div>\n <div *ngIf=\"prop.key === 'title'\" style=\"margin-top: 15px; border: 1px solid #ddd; padding: 20px; border-radius: 12px; background-color: #f9f9f9;\">\n <div class=\"form-header\">\n <label class=\"form-label\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <button (click)=\"addNewButton()\" class=\"add-button\">+ {{ 'ADD_BUTTON' | nxtCustomTranslate : 'Add Button' }}</button>\n </div>\n <div *ngFor=\"let btn of book()?.questionbook?.action || []; let i = index\" class=\"button-config-card\">\n <div class=\"form-group\">\n <label>{{ 'BUTTON_NAME' | nxtCustomTranslate : 'Button Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.name\" (ngModelChange)=\"onButtonPropertyChange(i, 'name', $event,true)\" placeholder=\"Enter button name\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'EVENT_NAME' | nxtCustomTranslate : 'Event Name' }}</label>\n <input type=\"text\" [ngModel]=\"btn.eventtoemit\" (ngModelChange)=\"onButtonPropertyChange(i, 'eventtoemit', $event)\" placeholder=\"Event to emit\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'ALT' | nxtCustomTranslate : 'Alt' }}</label>\n <input type=\"text\" [ngModel]=\"btn.alt\" (ngModelChange)=\"onButtonPropertyChange(i, 'alt', $event)\" placeholder=\"Button alt text\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'END_POINT' | nxtCustomTranslate : 'Endpoint' }}</label>\n <input type=\"text\" [ngModel]=\"btn.endpoint\" (ngModelChange)=\"onButtonPropertyChange(i, 'endpoint', $event)\" placeholder=\"API endpoint\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'METHOD' | nxtCustomTranslate : 'Method' }}</label>\n <select [ngModel]=\"btn.method\" (ngModelChange)=\"onButtonPropertyChange(i, 'method', $event)\">\n <option value=\"GET\">GET</option>\n <option value=\"POST\">POST</option>\n <option value=\"PUT\">PUT</option>\n <option value=\"DELETE\">DELETE</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BACKGROUND_COLOR' | nxtCustomTranslate : 'Background Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.bgColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'bgColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'BORDER_RADIUS' | nxtCustomTranslate : 'Border Radius' }}</label>\n <input type=\"range\" min=\"0\" max=\"50\" [ngModel]=\"btn.borderRadius\" (ngModelChange)=\"onButtonPropertyChange(i, 'borderRadius', $event)\">\n <span>{{ btn.borderRadius }}px</span>\n </div>\n <div class=\"form-group\">\n <label>{{ 'BUTTON_WIDTH_PX' | nxtCustomTranslate : 'Button Width (px)' }}</label>\n <input type=\"number\" [ngModel]=\"btn.width\" (ngModelChange)=\"onButtonPropertyChange(i, 'width', $event)\" min=\"50\" placeholder=\"Enter width in px\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'TEXT_COLOR' | nxtCustomTranslate : 'Text Color' }}</label>\n <input type=\"color\" [ngModel]=\"btn.textColor\" (ngModelChange)=\"onButtonPropertyChange(i, 'textColor', $event)\">\n </div>\n <div class=\"form-group\">\n <label>{{ 'POSITION_PERCENT' | nxtCustomTranslate : 'Position (%)' }}</label>\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"btn.positionPercent\" (ngModelChange)=\"onButtonPropertyChange(i, 'positionPercent', $event)\">\n <span>{{ btn.positionPercent }}%</span>\n </div>\n <button (click)=\"removeButton(btn)\" class=\"remove-button\">\u00D7 {{ 'REMOVE' | nxtCustomTranslate : 'Remove' }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'property'\">\n @defer (when getProperties()) {\n <div>\n <label>Label Id</label>\n <div style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect() ? bookId() : selectedElement()?.id }}\n </div>\n <ng-container *ngFor=\"let prop of getProperties()?.fieldProps; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isOptional')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isOptional', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isOptional', $event)\"\n />\n {{ 'REQUIRED' | nxtCustomTranslate : 'Required' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isReadOnly')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isReadOnly', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isReadOnly', $event)\"\n />\n {{ 'READ_ONLY' | nxtCustomTranslate : 'Read Only' }}\n </label>\n </div>\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" \n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', true) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : 'isHidden')\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), 'isHidden', $event, true, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange('isHidden', $event)\"\n />\n {{ 'IS_HIDE' | nxtCustomTranslate : 'Is Hide' }}\n </label>\n </div>\n </div>\n <div *ngIf=\" prop.type === 'checkbox' || prop.type === 'radio' || prop.key === 'options'\" class=\"options-container\">\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key] ; let i = index\" class=\"option-items\" [attr.data-id]=\"option.id\" draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n <input type=\"text\" [ngModel]=\"option.value\" (ngModelChange)=\"option.value = $event; optionTranslationUpdate(option,$event)\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement()[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n <button (click)=\"addOption(selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), prop.key, true) : selectedElement()[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>{{ 'ADD' | nxtCustomTranslate : 'Add' }}</span>\n </div>\n </button>\n </div>\n <input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"headerSelect() ? book().records[0].title : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"headerSelect() ? updateTitle($event) : (selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\"\n />\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isExpanded\" style=\"border: 1px solid #ddd; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion; trackBy: trackByProp\" style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <input *ngIf=\"subProp.type === 'text'\"\n type=\"text\"\n [placeholder]=\"subProp.placeholder\"\n [value]=\"getOptimizedSubPropValue(subProp)\"\n (input)=\"(selectedElement()?.type === 'Table' && (subProp.targetArray || subProp.isTableColumn)) ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn(), subProp.key, $event.target.value, subProp.isTableColumn, prop.isTranslate) : setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\"\n [class.read-only]=\"selectedElement()?.readOnly\"\n [readonly]=\"selectedElement()?.readOnly\" />\n \n <!-- AP-02APR25 Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value, prop.isTranslate)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n <input\n type=\"checkbox\"\n [checked]=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn) : (selectedElement() | getValueByPath : prop.key)) : (selectedElement() | getValueByPath : prop.key)\"\n (change)=\"selectedElement()?.type === 'Table' ? (prop.targetArray || prop.isTableColumn ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : onToggleChange(prop.key, $event)) : onToggleChange(prop.key, $event)\"\n />\n </div>\n </div>\n </ng-container>\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">{{ 'STYLE' | nxtCustomTranslate : 'Style' }}</div>\n <img [src]=\"isStyleExpanded() ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\" alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n <div *ngIf=\"isStyleExpanded()\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input\n type=\"text\"\n [value]=\"selectedElement()?.type === 'Table' && selectColumn() ? getValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(),'style.' + key, true) : (selectedElement() | getValueByPath : 'style.' + key)\"\n (input)=\"(selectedElement()?.type === 'Table' && selectColumn() ) ? updateValueByArrayPath('fieldsMeta', 'uniqueIdentifier', selectColumn(), 'style.' + key, $event.target.value, true) : setValueByPath('style.' + key, $event.target.value)\"\n placeholder=\"Enter {{ key }}\"\n />\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab() === 'appearance'\">\n @defer (when getProperties()) {\n <div>\n <ng-container *ngFor=\"let prop of getProperties()?.appearance; trackBy: trackByProp\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <select\n *ngIf=\"prop.type === 'select'\"\n [ngModel]=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? (getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, prop.isTableColumn)) : (selectedElement() | getValueByPath : prop.key))\"\n (ngModelChange)=\"(selectedElement()?.type === 'Table' && (prop.targetArray || prop.isTableColumn) ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn(), prop.key, $event, prop.isTableColumn, prop.isTranslate) : setValueByPath(prop.key, $event, prop.isTranslate))\"\n >\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">{{ option.labelPath | nxtCustomTranslate : option.label }}</option>\n </select>\n <input\n *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n\n <div class=\"flex-container\">\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input\n type=\"color\"\n [ngModel]=\"selectedElement()?.fontColor\"\n (ngModelChange)=\"setValueByPath('fontColor', $event, prop.isTranslate)\"\n >\n </div>\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>{{ 'HEX_CODE' | nxtCustomTranslate : 'HEX Code' }}</span>\n <input\n type=\"text\"\n [ngModel]=\"selectedElement() | getValueByPath : prop.key\"\n (ngModelChange)=\"setValueByPath(prop.key, $event, prop.isTranslate)\"\n />\n </div>\n </div>\n <div *ngIf=\"prop.type === 'button-toggle'\" class=\"button-toggle-wrapper\">\n <button\n type=\"button\"\n class=\"toggle-button\"\n (click)=\"duplicateField(selectedElement())\"\n >\n {{ 'ADD_DUPLICATE' | nxtCustomTranslate : 'Add Duplicate' }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n }\n </div>\n\n <div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">{{ 'CANCEL' | nxtCustomTranslate : 'Cancel' }}</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">{{ 'SAVE' | nxtCustomTranslate : 'Save' }}</button>\n </div>\n\n <div class=\"button-container\" *ngIf=\"templateSelected\" style=\"margin-top: 20px;\">\n <button class=\"save-btn\" (click)=\"handleTemplateSave()\">{{ 'SAVE_TEMPLATE' | nxtCustomTranslate : 'Save Template' }}</button>\n </div>\n</div>", styles: ["*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.container{width:100%;max-width:500px;margin:0 auto;background:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.toggle-header,.style-toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px;background:#f8f8f8;border:1px solid #ddd;border-radius:6px;margin-bottom:6px}.tabs{display:flex;background:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:80vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:block;font-size:14px;font-weight:500;color:#444;margin-bottom:8px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],input[type=number],select,textarea{width:100%;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:all .3s;background:#f8f8f8}input:focus,select:focus,textarea:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}textarea{min-height:55px;resize:vertical}button,.btn{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:all .3s}button:hover,.btn:hover{background:#0056b3;transform:translateY(-2px)}.add-button{padding:8px 14px;background:#0954c5;border-radius:8px}.remove-button{background:#e74c3c;padding:6px 12px;margin-top:10px}.remove-button:hover{background:#c0392b}.cancel-btn{background:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.save-btn{background:#0052cc}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;gap:10px;padding:8px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.color-picker-row,.color-picker-container{display:flex;align-items:center}.color-picker-container{border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box,.color-selector input[type=color]{width:78px;height:40px;border:none;border-radius:4px;cursor:pointer}.hex-input-container{display:flex;gap:20px;align-items:center;font-size:12px;color:#b0b0b0}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input,.hex-input-container input[type=text]{width:120px;padding:10px 12px;border:1px solid #d1d1d1;color:#28343e}.hex-label{color:#999;margin-right:5px}.select-container,.input-box-field{position:relative;width:100%}.dropdown-arrow,.input-box-field:after{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.input-box-field:after{content:\"\\25bc\";color:#1c1b1f;font-size:10px}.input-box-field select{background:#28343e;color:#fff;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none}.input-box-field select::-ms-expand{display:none}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}.options-container{display:flex;flex-direction:column;gap:12px}.field-size-controls,.flex-container{display:flex;align-items:center;gap:12px}.flex-container{margin-bottom:1rem}.size-input{width:110px;text-align:center}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background:#4caf50}.view-icon{background:#2196f3}.delete-icon{background:#f44336}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background:#d0d9ff;border-radius:4px}.link-icon{background:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:all .3s}.link-icon:hover{background:#d0e5ff}.link-icon:active{background:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.option-items:active{opacity:.5}.drag-handle{margin-left:10px;cursor:grab}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background:#2c6dd5}.button-config-card{background:#fff;padding:15px;border-radius:12px;border:1px solid #ccc;margin-top:20px;box-shadow:0 2px 8px #0000000d}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.button-container{display:flex;padding:15px;background:#f9f9f9;border-top:1px solid #eee}.button-container .cancel-btn,.button-container .save-btn{flex:1;padding:12px;font-weight:700}.divider{border-top:1px dashed #ddd;margin:20px 0}input{width:auto}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{padding:1rem;font-size:.9rem}.form-group,.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{flex-direction:column;grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}\n"] }]
|
|
1074
|
-
}], ctorParameters: () => [{ type: i1.FormBuilderService }, { type: i2.TemplateService }, { type: i3.TranslationService }], propDecorators: { templateSelected: [{
|
|
1075
|
-
type: Input
|
|
1076
|
-
}], selectedElementType: [{
|
|
1077
|
-
type: Input
|
|
1078
|
-
}], formButtonHandler: [{
|
|
1079
|
-
type: Output
|
|
1080
|
-
}], templateSaveHandler: [{
|
|
1081
|
-
type: Output
|
|
1082
|
-
}], dropdown: [{
|
|
1083
|
-
type: ViewChild,
|
|
1084
|
-
args: ['dropdown', { static: false }]
|
|
1085
|
-
}], onClickOutside: [{
|
|
1086
|
-
type: HostListener,
|
|
1087
|
-
args: ['document:click', ['$event']]
|
|
1088
|
-
}] } }) });
|
|
1089
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvcHJvcGVydGllcy9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZLLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHN0MsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMscUZBQXFGO0FBQ3JGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBdUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUVySyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUlwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7OztBQUU3RSwwQ0FBMEM7QUFNMUMsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixTQUFTLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxlQUFvQixFQUFFO1FBQ3RELElBQUksQ0FB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QUFhLENBQ3RCLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQzt3R0E1akNVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLG9iQ3RDaEMsMnlvQ0FxZE0sNDJORHBiTSxZQUFZLGdPQUFFLFdBQVcsMEJBQWlGLHNCQUFzQixzYkFWL0gsa0JBQWtCLEVBVXVGLHNCQUFzQixpSkFBdEIsc0JBQXNCLHdGQVYvSCxrQkFBa0IsRUFVdUYsc0JBQXNCLHNLQVYvSCxrQkFBa0IsRUFVdUYsc0JBQXNCOztpR0FLL0gsbUJBQW1CO3NCQVIvQixTQUFTO21DQUNFLGdCQUFnQixjQUNkLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLG1CQUcxSCx1QkFBdUIsQ0FBQyxNQUFNOzBKQUd0QyxnQkFBZ0I7MEJBQXhCLEtBQUs7b0JBQ08sbUJBQW1COzBCQUEvQixLQUFLO29CQUdJLGlCQUFpQjswQkFBMUIsTUFBTTtvQkFDRyxtQkFBbUI7MEJBQTVCLE1BQU07b0JBRW1DLFFBQVE7MEJBQWpELFNBQVM7MkJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtvQkFnL0J4QyxjQUFjOzBCQURiLFlBQVk7MkJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW1hZ2VDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2NvbXBvbmVudC9pbWFnZS1jcm9wcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRTZWFyY2hCb3ggfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL3NlYXJjaC1ib3gvc2VhcmNoLWJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIERpbWVuc2lvbnMsIEltYWdlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9pbWFnZS1jcm9wcGVyL2ludGVyZmFjZXMnO1xuLy9BUC0yNUpVTjI1LUltcG9ydGluZyBjb21tb24gY29uc3RhbnRzIGZvciBlbGVtZW50LCBmaWVsZCwgYW5kIGFwcGVhcmFuY2UgcHJvcGVydGllc1xuaW1wb3J0IHsgQ09NTU9OX0VMRU1FTlRfUFJPUFMsIENPTU1PTl9PUFRJT05TX0ZJRUxELCBDT01NT05fRklFTERfUFJPUFMsIENPTU1PTl9BUFBFQVJBTkNFX1BST1BTLCBDT01NT05fQ09MVU1OX0ZJRUxEIH0gZnJvbSAnLi4vcHJvcGVydGllcy9jb21tb24tZmllbGRzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0tYnVpbGRlci9mb3JtLWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90ZW1wbGF0ZS90ZW1wbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlJztcblxuLy8gQ3VzdG9tIHBpcGUgZm9yIHBhdGgtYmFzZWQgdmFsdWUgYWNjZXNzXG5AUGlwZSh7XG4gIG5hbWU6ICdnZXRWYWx1ZUJ5UGF0aCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHB1cmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgR2V0VmFsdWVCeVBhdGhQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybShvYmo6IGFueSwgcGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueSA9ICcnKTogYW55IHtcbiAgICBpZiAoIW9iaiB8fCAhcGF0aCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgobywgaykgPT4gbz8uW2tdID8/IGRlZmF1bHRWYWx1ZSwgb2JqKTtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvcGVydGllcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBJbWFnZUNyb3BwZXJDb21wb25lbnQsIE54dFNlYXJjaEJveCwgTmdDbGFzcywgTmdGb3IsIE5nSWYsIEdldFZhbHVlQnlQYXRoUGlwZSwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvcGVydGllcy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnRpZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZVNlbGVjdGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNldCBzZWxlY3RlZEVsZW1lbnRUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudFR5cGVTaWcuc2V0KHZhbHVlKTtcbiAgfVxuICBAT3V0cHV0KCkgZm9ybUJ1dHRvbkhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRlbXBsYXRlU2F2ZUhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSBkcm9wZG93biE6IEVsZW1lbnRSZWY7XG5cbiAgLy8gU2lnbmFscyBmb3IgcmVhY3RpdmUgc3RhdGVcbiAgc2VsZWN0ZWRFbGVtZW50VHlwZVNpZyA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgc2VsZWN0ZWRFbGVtZW50ID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIHNlbGVjdGVkRWxlbWVudEluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuICBoZWFkZXJTZWxlY3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBib29rID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIGJvb2tJZCA9IHNpZ25hbDxhbnk+KG51bGwpO1xuICBhY3RpdmVUYWIgPSBzaWduYWw8c3RyaW5nPignYXR0cmlidXRlcycpO1xuICBzZWxlY3RDb2x1bW4gPSBzaWduYWw8YW55PihudWxsKTtcbiAgdHJhbnNmb3JtID0gc2lnbmFsPEltYWdlVHJhbnNmb3JtPih7XG4gICAgdHJhbnNsYXRlVW5pdDogJ3B4JyxcbiAgICBzY2FsZTogMSxcbiAgICByb3RhdGU6IDAsXG4gICAgZmxpcEg6IGZhbHNlLFxuICAgIGZsaXBWOiBmYWxzZSxcbiAgICB0cmFuc2xhdGVIOiAwLFxuICAgIHRyYW5zbGF0ZVY6IDBcbiAgfSk7XG4gIGNhbnZhc1JvdGF0aW9uID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIGNyb3BwZXIgPSBzaWduYWw8Q3JvcHBlclBvc2l0aW9uIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBsb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgaXNMaW5rRHJvcGRvd25PcGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgZXJyb3JNZXNzYWdlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBib29rU3VidGV4dCA9IHNpZ25hbCh7XG4gICAgZW5kcG9pbnQ6ICdodHRwczovL2Rldi1hcGkudmFsYXJoci5jb20vbnh0JyxcbiAgICB2YXJpYWJsZTogbnVsbCxcbiAgICBmaWVsZDogWydsYWJlbCcsICduYW1lJ10sXG4gICAgZGVmYXVsdEZpZWxkOiAnbGFiZWwnXG4gIH0pO1xuICBpc1N0eWxlRXhwYW5kZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBjcm9wcGVyTWF4SGVpZ2h0ID0gMDtcbiAgY3JvcHBlck1heFdpZHRoID0gMDtcbiAgY3JvcHBlck1pbkhlaWdodCA9IDA7XG4gIGNyb3BwZXJNaW5XaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNXaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNIZWlnaHQgPSAwO1xuICBhc3BlY3RSYXRpbyA9IDQgLyAzO1xuICByb3VuZENyb3BwZXIgPSBmYWxzZTtcbiAgaXNFeHBhbmRlZDogQm9vbGVhbiA9IGZhbHNlXG4gIGFsaWduSW1hZ2UgPSAnY2VudGVyJyBhcyBjb25zdDtcbiAgZWxlbWVudFR5cGUgPSBbJ0hlYWRlcicsJ0xpbmUnLCdTcGFjZScsJ1RhYmxlJywnVGFibGVDb2x1bW4nLCdDaGVja2JveCcsJ0Ryb3Bkb3duJywnUmFkaW8nLFwiVGV4dFwiLCBcIkNhbGVuZGFyXCIsIFwiRGF0ZVwiLCBcIlRpbWVcIiwgXCJEYXRlVGltZVwiLCBcIkVtYWlsXCIsIFwiQm9va1wiLCBcIkxpc3RcIiwgXCJUZXh0QXJlYVwiLCBcIlJpY2hUZXh0QXJlYVwiLCBcIk51bWJlclwiLCBcIkltYWdlXCIsIFwiTGFiZWxcIiwgXCJCb29sZWFuXCIsIFwiRmlsZVwiLCBcIkljb25cIiwgJ0J1dHRvbiddXG5cbiAgLy8gQWRkIHRoZXNlIHByb3BlcnRpZXMgdG8geW91ciBjb21wb25lbnQgY2xhc3NcbiAgcHJpdmF0ZSBfY2FjaGVkUHJvcGVydGllczogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdFNlbGVjdGVkRWxlbWVudDogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBfbGFzdFNlbGVjdGVkQ29sdW1uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvLyBDb21wdXRlZCBzaWduYWxzIGZvciBtZW1vaXphdGlvblxuICBmaWVsZEFzU3RyaW5nID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ib29rU3VidGV4dCgpLmZpZWxkLmpvaW4oJywgJykpO1xuICBmaWx0ZXJlZENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZmllbGRzTWV0YSA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk/LmZpZWxkc01ldGEgPz8gW107XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmllbGRzTWV0YSlcbiAgICAgID8gZmllbGRzTWV0YS5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi51bmlxdWVJZGVudGlmaWVyICE9PSB0aGlzLnNlbGVjdENvbHVtbigpKVxuICAgICAgOiBbXTtcbiAgfSk7XG5cbiAgLy8gTWVtb2l6ZWQgcHJvcGVydGllc1xuICBlbGVtZW50UHJvcGVydGllcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3JlYXRlRWxlbWVudFByb3BlcnRpZXMoKSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlclNlcnZpY2U6IEZvcm1CdWlsZGVyU2VydmljZSxcbiAgICBwcml2YXRlIHRlbXBsYXRlU2VydmljZTogVGVtcGxhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2VcbiAgKSB7fVxuICBcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc2VsZWN0SGVhZGVyU3ViamVjdCQuc3Vic2NyaWJlKGhlYWRlciA9PiB7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnNldCh7IHR5cGU6IGhlYWRlciB9KTtcbiAgICAgICAgdGhpcy5oZWFkZXJTZWxlY3Quc2V0KHRydWUpO1xuICAgICAgICBjb25zdCBib29rRGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgICAgICAgdGhpcy5ib29rLnNldChib29rRGF0YSk7XG4gICAgICAgIHRoaXMuYm9va0lkLnNldChib29rRGF0YT8ucmVjb3Jkc1swXT8uaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICBcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5zZWxlY3RlZEVsZW1lbnQkLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4LnNldChpbmRleCk7XG4gICAgICB0aGlzLmhlYWRlclNlbGVjdC5zZXQoZmFsc2UpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgICBpZiAoIWVsZW1lbnRzIHx8ICFBcnJheS5pc0FycmF5KGVsZW1lbnRzKSB8fCBpbmRleCA+PSBlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQobnVsbCk7IC8vIFJlc2V0IHNlbGVjdGVkRWxlbWVudCBpZiBpbnZhbGlkXG4gICAgICAgICAgdGhpcy5zZWxlY3RDb2x1bW4uc2V0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50ID0geyAuLi5lbGVtZW50c1tpbmRleF0gfTsgLy8gU2FmZSB0byBzcHJlYWQgc2luY2Ugd2UgY2hlY2tlZFxuICAgICAgICBsZXQgZmllbGRzTWV0YSA9IGVsZW1lbnQ/LmZpZWxkc01ldGE7XG4gICAgICAgIGlmIChlbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpZWxkc01ldGEgPSBBcnJheS5pc0FycmF5KGZpZWxkc01ldGEpXG4gICAgICAgICAgICAgID8gZmllbGRzTWV0YVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZmllbGRzTWV0YSB8fCAnW10nKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGE6JywgZSk7XG4gICAgICAgICAgICBmaWVsZHNNZXRhID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldCh0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRTZWxlY3RUYWJsZUNvbHVtbigpID8/IG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQoeyAuLi5lbGVtZW50LCBmaWVsZHNNZXRhIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc2V0KG51bGwpOyAvLyBSZXNldCBpZiBpbmRleCBpcyBpbnZhbGlkXG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uLnNldChudWxsKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHN1YlRleHQgPSBlbGVtZW50LnN1YlRleHQ7XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViVGV4dCA9PT0gJ3N0cmluZycgJiYgc3ViVGV4dC50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN1YlRleHQgPSBKU09OLnBhcnNlKHN1YlRleHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3ViVGV4dDonLCBlKTtcbiAgICAgICAgICAgIHN1YlRleHQgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN1YlRleHQgIT09ICdvYmplY3QnIHx8IHN1YlRleHQgPT09IG51bGwpIHtcbiAgICAgICAgICBzdWJUZXh0ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXlGaWVsZHMgPSBbJ2ZpZWxkJywgJ3F1ZXJ5UGFyYW1ldGVyJywgJ3NvdXJjZVF1ZXN0aW9uSWQnLCAncXVlcnlGaWVsZCcsICdxdWVyeVZhbHVlJ107XG4gICAgICAgIGlmIChzdWJUZXh0KSB7XG4gICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3ViVGV4dFtrZXldKSkge1xuICAgICAgICAgICAgICBzdWJUZXh0W2tleV0gPSBzdWJUZXh0W2tleV0uam9pbignLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSAgICAgICAgXG4gICAgICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyl7XG4gICAgICAgICAgZWxlbWVudC5maWVsZHNNZXRhLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYoZmllbGQ/LnF1ZXN0aW9uPy5zdWJUZXh0KXtcbiAgICAgICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XSA9IGZpZWxkLnF1ZXN0aW9uLnN1YlRleHRba2V5XS5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBzdWJUZXh0IH0pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBTS1MyOEpVTDI1IGZvcm1idWlsZGVyIGN1cnJlbnQgZWxlbWVudCB0cmFuc2xhdGlvbiB2YWx1ZSB1cGRhdGUgXG4gICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZm9ybUJ1aWxkZXJUcmFuc2xhdGlvbnNMb2FkZWQkLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50cykgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkRWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoKGVsZTogYW55KSA9PiBlbGUuaWQgPT09IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkuaWQpO1xuICAgICAgICBpZiAobWF0Y2hlZEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQobWF0Y2hlZEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9ICAgICAgXG4gICAgICBpZih0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSBcIkhlYWRlclwiKXtcbiAgICAgICAgY29uc3QgYm9va0RhdGEgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRCb29rKCk7XG4gICAgICAgIHRoaXMuYm9vay5zZXQoYm9va0RhdGEpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zZXQoey4uLnRoaXMuc2VsZWN0ZWRFbGVtZW50KCl9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVsZW1lbnRQcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBIZWFkZXI6IHtcbiAgICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICd0aXRsZScsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdMQUJFTCcgfVxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIExpbmU6IHtcbiAgICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgICAgeyBsYWJlbDogJ0xpbmUgV2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScsIGxhYmVsUGF0aDogJ0xJTkVfV0lEVEgnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgVG9wJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdUb3AnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgdG9wJywgbGFiZWxQYXRoOiAnUEFERElOR19UT1AnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgQm90dG9tJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdCb3R0b20nLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgYm90dG9tJywgbGFiZWxQYXRoOiAnUEFERElOR19CT1RUT00nIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdMaW5lIFN0eWxlJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2xpbmVTdHlsZScsIGxhYmVsUGF0aDogJ0xJTkVfU1RZTEUnLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnU29saWQnLCB2YWx1ZTogJ1NvbGlkJywgbGFiZWxQYXRoOiAnU09MSUQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdEYXNoZWQnLCB2YWx1ZTogJ0Rhc2hlZCcsIGxhYmVsUGF0aDogJ0RBU0hFRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RvdHRlZCcsIHZhbHVlOiAnRG90dGVkJywgbGFiZWxQYXRoOiAnRE9UVEVEJyB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBmaWVsZFByb3BzOiBbXVxuICAgICAgfSxcbiAgICAgIFNwYWNlOiB7XG4gICAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJywgbGFiZWxQYXRoOiAnRUxFTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJywgbGFiZWxQYXRoOiAnRklFTERfU0laRScgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmllbGRQcm9wczogW11cbiAgICAgIH0sXG4gICAgICBUYWJsZToge1xuICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICB7IGxhYmVsOiAnSXMgTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAnY2hlY2tib3gnLCBrZXk6ICdzdHlsZS5zaG93TGFiZWwnLCBsYWJlbFBhdGg6ICdJU19MQUJFTCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAncHJpbWFyeUtleScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3ByaW1hcnlLZXknLCBsYWJlbFBhdGg6ICdQUklNQVJZX0tFWScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAndGFibGVOYW1lJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvblRleHQnLCBpc1RyYW5zbGF0ZTogdHJ1ZSwgbGFiZWxQYXRoOiAnVEFCTEVfTkFNRScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnaW5wdXRUZXh0QWxpZ25tZW50JywgcGxhY2Vob2xkZXI6ICdMZWZ0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdpbnB1dFRleHRBbGlnbm1lbnQnLCBsYWJlbFBhdGg6ICdJTlBVVF9URVhUX0FMSUdOTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAndGFibGVTY2FsZVNpemUnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAndGFibGVTY2FsZVNpemUnLCBsYWJlbFBhdGg6ICdUQUJMRV9TQ0FMRV9TSVpFJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc05vc0luZGljYXRvcicsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuaXNOb3NJbmRpY2F0b3InLCBsYWJlbFBhdGg6ICdJU19OT1NfSU5ESUNBVE9SJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc1BhZ2luYXRpb24nLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzUGFnaW5hdGlvbicsIGxhYmVsUGF0aDogJ0lTX1BBR0lOQVRJT04nIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2FkZElubGluZVJlY29yZCcsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuYWRkSW5saW5lUmVjb3JkJywgbGFiZWxQYXRoOiAnQUREX0lOTElORV9SRUNPUkQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2FjdGlvbkJ1dHRvbicsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuYWN0aW9uQnV0dG9uJywgbGFiZWxQYXRoOiAnQUNUSU9OX0JVVFRPTicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnc2VhcmNoQmFyJywgcGxhY2Vob2xkZXI6ICcwNiAtIEZ1bGwgU2NhbGUnLCB0eXBlOiAnY2hlY2tib3gnLCBrZXk6ICd0YWJsZUNvbmZpZy5zZWFyY2hCYXInLCBsYWJlbFBhdGg6ICdTRUFSQ0hfQkFSJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0RlbGV0ZVJvdycsIHBsYWNlaG9sZGVyOiAnMDYgLSBGdWxsIFNjYWxlJywgdHlwZTogJ2NoZWNrYm94Jywga2V5OiAndGFibGVDb25maWcuaXNEZWxldGVSb3cnLCBsYWJlbFBhdGg6ICdJU19ERUxFVEVfUk9XJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0VkaXRSb3cnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzRWRpdFJvdycsIGxhYmVsUGF0aDogJ0lTX0VESVRfUk9XJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdpc0J1dHRvbnMnLCBwbGFjZWhvbGRlcjogJzA2IC0gRnVsbCBTY2FsZScsIHR5cGU6ICdjaGVja2JveCcsIGtleTogJ3RhYmxlQ29uZmlnLmlzQnV0dG9ucycsIGxhYmVsUGF0aDogJ0lTX0JVVFRPTlMnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ3Jvd0Nob2ljZScsIHBsYWNlaG9sZGVyOiAnJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyb3dDaG9pY2UnLCBsYWJlbFBhdGg6ICdST1dfQ0hPSUNFJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdxdWVzdGlvbk51bWJlcicsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdxdWVzdGlvbk51bWJlcicsIGxhYmVsUGF0aDogJ1FVRVNUSU9OX05VTUJFUicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJywgbGFiZWxQYXRoOiAnRklFTERfU0laRScgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICAgIHsgbGFiZWw6ICd0YWJsZUlkJywgcGxhY2Vob2xkZXI6ICdFbXBfVGFibGVfMDEnLCB0eXBlOiAndGV4dCcsIGtleTogJ3RhYmxlSWQnLCBpc1RyYW5zbGF0ZTogdHJ1ZSwgbGFiZWxQYXRoOiAnVEFCTEVfSUQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2hlbHBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBtZXNzYWdlJywgdHlwZTogJ3RleHQnLCBrZXk6ICdoZWxwVGV4dCcsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdIRUxQX1RFWFQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ2RlZmF1bHRWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRGVmYXVsdCBWYWx1ZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAnZGVmYXVsdFZhbHVlJywgbGFiZWxQYXRoOiAnREVGQVVMVF9WQUxVRScgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJywgbGFiZWxQYXRoOiAnUkVGRVJFTkNFX0ZJRUxEJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAnc3ViUXVlc3Rpb24nLCBrZXk6ICdpc1N1YlRleHQnLCBsYWJlbFBhdGg6ICdTVUJfVEVYVCcsXG4gICAgICAgICAgICBzdWJRdWVzdGlvbjogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnRW5kIFBvaW50JywgcGxhY2Vob2xkZXI6ICdlbmRwb2ludCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5lbmRwb2ludCcsIGxhYmVsUGF0aDogJ0VORF9QT0lOVCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1ZhcmlhYmxlJywgcGxhY2Vob2xkZXI6ICd2YXJpYWJsZScsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC52YXJpYWJsZScsIGxhYmVsUGF0aDogJ1ZBUklBQkxFJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRmllbGQnLCBwbGFjZWhvbGRlcjogJ2ZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LmZpZWxkJywgbGFiZWxQYXRoOiAnRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdRdWVyeSBQYXJhbWV0ZXInLCBwbGFjZWhvbGRlcjogJ3F1ZXJ5UGFyYW1ldGVyJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5UGFyYW1ldGVyJywgbGFiZWxQYXRoOiAnUVVFUllfUEFSQU1FVEVSJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnZGVmYXVsdEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LmRlZmF1bHRGaWVsZCcsIGxhYmVsUGF0aDogJ0RFRkFVTFRfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdMYWJlbCBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnbGFiZWxGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5sYWJlbEZpZWxkJywgbGFiZWxQYXRoOiAnTEFCRUxfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdWYWx1ZSBGaWVsZCcsIHBsYWNlaG9sZGVyOiAndmFsdWVGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC52YWx1ZUZpZWxkJywgbGFiZWxQYXRoOiAnVkFMVUVfRklFTEQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdTb3VyY2UgUXVlc3Rpb24gSWQnLCBwbGFjZWhvbGRlcjogJ3NvdXJjZVF1ZXN0aW9uSWQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQuc291cmNlUXVlc3Rpb25JZCcsIGxhYmVsUGF0aDogJ1NPVVJDRV9RVUVTVElPTl9JRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0RlcGVuZGVudCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnZGVwZW5kZW50VmFsdWUnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQuZGVwZW5kZW50VmFsdWUnLCBsYWJlbFBhdGg6ICdERVBFTkRFTlRfVkFMVUUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdEZXBlbmRlbnQgRmllbGQnLCBwbGFjZWhvbGRlcjogJ2lzRGVwZW5kZW50RmllbGQnLCB0eXBlOiAnYm9vbGVhbicsIGtleTogJ3N1YlRleHQuaXNEZXBlbmRlbnRGaWVsZCcsIGxhYmVsUGF0aDogJ0RFUEVOREVOVF9GSUVMRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IEZpZWxkJywgcGxhY2Vob2xkZXI6ICdxdWVyeUZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5RmllbGQnLCBsYWJlbFBhdGg6ICdRVUVSWV9GSUVMRCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdxdWVyeVZhbHVlJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnF1ZXJ5VmFsdWUnLCBsYWJlbFBhdGg6ICdRVUVSWV9WQUxVRScgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1F1ZXJ5IFZhbHVlIFJlZicsIHBsYWNlaG9sZGVyOiAncXVlcnlWYWx1ZVJlZicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dC5xdWVyeVZhbHVlUmVmZXJlbmNlJywgbGFiZWxQYXRoOiAnUVVFUllfVkFMVUVfUkVGJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnVW5pcXVlIEtleScsIHBsYWNlaG9sZGVyOiAndW5pcXVlS2V5JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0LnVuaXF1ZUtleScsIGxhYmVsUGF0aDogJ1VOSVFVRV9LRVknIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICAgIHsgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ1NFTEVDVF9GT05UJywgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0hlbHZldGljYSBOZXVlJywgdmFsdWU6ICdIZWx2ZXRpY2EgTmV1ZScsIGxhYmVsUGF0aDogJ0hFTFZFVElDQV9ORVVFJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0FyaWFsJywgdmFsdWU6ICdBcmlhbCcsIGxhYmVsUGF0aDogJ0FSSUFMJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1RpbWVzIE5ldyBSb21hbicsIHZhbHVlOiAnVGltZXMgTmV3IFJvbWFuJywgbGFiZWxQYXRoOiAnVElNRVNfTkVXX1JPTUFOJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1JvYm90bycsIHZhbHVlOiAnUm9ib3RvJywgbGFiZWxQYXRoOiAnUk9CT1RPJyB9XG4gICAgICAgICAgXX0sXG4gICAgICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCBkZWZhdWx0VmFsdWU6ICcnLCByZXF1aXJlZDogdHJ1ZSwgbGFiZWxQYXRoOiAnRk9OVF9DT0xPUicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRm9udCBTaXplJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTaXplJywgZGVmYXVsdFZhbHVlOiAnJywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ0ZPTlRfU0laRScsIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTbWFsbCcsIHZhbHVlOiAnMTJweCcsIGxhYmVsUGF0aDogJ1NNQUxMJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ01lZGl1bScsIHZhbHVlOiAnMTRweCcsIGxhYmVsUGF0aDogJ01FRElVTScgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdMYXJnZScsIHZhbHVlOiAnMTZweCcsIGxhYmVsUGF0aDogJ0xBUkdFJyB9XG4gICAgICAgICAgXX0sXG4gICAgICAgICAgeyBsYWJlbDogJ0ZvbnQgV2lkdGgnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIGRlZmF1bHRWYWx1ZTogJycsIHJlcXVpcmVkOiB0cnVlLCBsYWJlbFBhdGg6ICdGT05UX1dJRFRIJywgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcsIGxhYmVsUGF0aDogJzQwMF9OT1JNQUwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJywgbGFiZWxQYXRoOiAnNTAwX01FRElVTScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnLCBsYWJlbFBhdGg6ICc2MDBfU0VNSV9CT0xEJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnLCBsYWJlbFBhdGg6ICc3MDBfQk9MRCcgfVxuICAgICAgICAgIF19LFxuICAgICAgICAgIHsgbGFiZWw6ICdEdXBsaWNhdGUgRmllbGQnLCB0eXBlOiAnYnV0dG9uLXRvZ2dsZScsIGtleTogJ2R1cGxpY2F0ZUZpZWxkJywgZGVmYXVsdFZhbHVlOiBmYWxzZSwgbGFiZWxQYXRoOiAnRFVQTElDQVRFX0ZJRUxEJyB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBUYWJsZUNvbHVtbjoge1xuICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHBsYWNlaG9sZGVyOiAnVGV4dCcsIHR5cGU6ICdzZWxlY3QnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdmbGRUeXBlJywgcmVxdWlyZWQ6IHRydWUsIGxhYmVsUGF0aDogJ1RZUEUnLCBvcHRpb25zOiB0aGlzLmVsZW1lbnRUeXBlLm1hcChmID0+ICh7IGxhYmVsOiBmLCB2YWx1ZTogZiwgbGFiZWxQYXRoOiBmLnRvVXBwZXJDYXNlKCkgfSkpfSxcbiAgICAgICAgICB7IGxhYmVsOiAnaGVhZGVyTGFiZWxzJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdsYWJlbCcsIGlzVHJhbnNsYXRlOiB0cnVlLCBsYWJlbFBhdGg6ICdIRUFERVJfTEFCRUxTJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdhcGlOYW1lJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdhcGlOYW1lJywgbGFiZWxQYXRoOiAnQVBJX05BTUUnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdTdW1tYXJ5IENvbHVtbicsIHBsYWNlaG9sZGVyOiAnU3VtbWFyeSBDb2x1bW4nLCB0eXBlOiAnc3ViUXVlc3Rpb24nLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdzdW1tYXJ5Q29sdW1uJywgbGFiZWxQYXRoOiAnU1VNTUFSWV9DT0xVTU4nLFxuICAgICAgICAgICAgc3ViUXVlc3Rpb246IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1R5cGUnLCBwbGFjZWhvbGRlcjogJ0VtcGxveWVlIERldGFpbHMnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2ZsZFR5cGUnLCBsYWJlbFBhdGg6ICdUWVBFJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnT3BlcmF0aW9uJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3RleHQnLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdvcGVyYXRpb24nLCBsYWJlbFBhdGg6ICdPUEVSQVRJT04nIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdPcGVyYW5kcycsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICdhcnJheScsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ29wZXJhbmRzJywgbGFiZWxQYXRoOiAnT1BFUkFORFMnIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1N1bW1hcnkgUm93JywgcGxhY2Vob2xkZXI6ICdTdW1tYXJ5IFJvdycsIHR5cGU6ICdzdWJRdWVzdGlvbicsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ3N1bW1hcnlSb3cnLCBsYWJlbFBhdGg6ICdTVU1NQVJZX1JPVycsXG4gICAgICAgICAgICBzdWJRdWVzdGlvbjogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnVHlwZScsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICd0ZXh0JywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnZmxkVHlwZScsIGxhYmVsUGF0aDogJ1RZUEUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdvcGVyYXRpb24nLCBwbGFjZWhvbGRlcjogJ29wZXJhdGlvbicsIHR5cGU6ICd0ZXh0JywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnb3BlcmF0aW9uJywgbGFiZWxQYXRoOiAnT1BFUkFUSU9OJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY29sdW1uJywgcGxhY2Vob2xkZXI6ICdFbXBsb3llZSBEZXRhaWxzJywgdHlwZTogJ3JhZGlvJywgdGFyZ2V0QXJyYXk6ICdmaWVsZHNNZXRhJywgdGFyZ2V0QXJyYXlLZXk6ICd1bmlxdWVJZGVudGlmaWVyJywga2V5OiAnY29sdW1uJywgbGFiZWxQYXRoOiAnQ09MVU1OJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnY29sdW1ucycsIHBsYWNlaG9sZGVyOiAnRW1wbG95ZWUgRGV0YWlscycsIHR5cGU6ICdhcnJheScsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2NvbHVtbnMnLCBsYWJlbFBhdGg6ICdDT0xVTU5TJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnb3BlcmFuZHMnLCBwbGFjZWhvbGRlcjogJ0VtcGxveWVlIERldGFpbHMnLCB0eXBlOiAnYXJyYXknLCB0YXJnZXRBcnJheTogJ2ZpZWxkc01ldGEnLCB0YXJnZXRBcnJheUtleTogJ3VuaXF1ZUlkZW50aWZpZXInLCBrZXk6ICdvcGVyYW5kcycsIGxhYmVsUGF0aDogJ09QRVJBTkRTJyB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ3RleHRBbGlnbm1lbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ3RleHRBbGlnbm1lbnQnLCBsYWJlbFBhdGg6ICdURVhUX0FMSUdOTUVOVCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnY29sdW1uU2NhbGVTaXplJywgcGxhY2Vob2xkZXI6ICcwNiAtIEZ1bGwgU2NhbGUnLCB0eXBlOiAndGV4dCcsIHRhcmdldEFycmF5OiAnZmllbGRzTWV0YScsIHRhcmdldEFycmF5S2V5OiAndW5pcXVlSWRlbnRpZmllcicsIGtleTogJ2NvbHVtblNjYWxlU2l6ZScsIGxhYmVsUGF0aDogJ0NPTFVNTl9TQ0FMRV9TSVpFJyB9LFxuICAgICAgICBdLFxuICAgICAgICBmaWVsZFByb3BzOiBbXSxcbiAgICAgICAgYXBwZWFyYW5jZTogW11cbiAgICAgIH0sXG4gICAgICBDaGVja2JveDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKHsgY3VzdG9tRmllbGRQcm9wczogQ09NTU9OX09QVElPTlNfRklFTEQubWFwKG9wdCA9PiAoeyAuLi5vcHQsIHR5cGU6ICdjaGVja2JveCcgfSkpIH0pLFxuICAgICAgRHJvcGRvd246IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZyh7IGN1c3RvbUZpZWxkUHJvcHM6IENPTU1PTl9PUFRJT05TX0ZJRUxELm1hcChvcHQgPT4gKHsgLi4ub3B0LCB0eXBlOiAnZHJvcGRvd24nIH0pKSB9KSxcbiAgICAgIFJhZGlvOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoeyBjdXN0b21GaWVsZFByb3BzOiBDT01NT05fT1BUSU9OU19GSUVMRC5tYXAob3B0ID0+ICh7IC4uLm9wdCwgdHlwZTogJ2NoZWNrYm94JyB9KSkgfSksXG4gICAgICBUZXh0OiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIENhbGVuZGFyOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIERhdGU6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgVGltZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBEYXRlVGltZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBFbWFpbDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBCb29rOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIExpc3Q6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgVGV4dEFyZWE6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgUmljaFRleHRBcmVhOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIE51bWJlcjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBJbWFnZTogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBMYWJlbDogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgICBCb29sZWFuOiB0aGlzLmNyZWF0ZUVsZW1lbnRDb25maWcoKSxcbiAgICAgIEZpbGU6IHRoaXMuY3JlYXRlRWxlbWVudENvbmZpZygpLFxuICAgICAgSWNvbjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksIC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGVsZW1lbnRcbiAgICAgIEJ1dHRvbjogdGhpcy5jcmVhdGVFbGVtZW50Q29uZmlnKCksXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnRDb25maWcoY29uZmlnPzogeyBjdXN0b21FbGVtZW50UHJvcHM/OiBhbnlbXSwgY3VzdG9tRmllbGRQcm9wcz86IGFueVtdLCBjdXN0b21BcHBlYXJhbmNlUHJvcHM/OiBhbnlbXSB9KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRQcm9wczogWy4uLkNPTU1PTl9FTEVNRU5UX1BST1BTLCAuLi4oY29uZmlnPy5jdXN0b21FbGVtZW50UHJvcHMgfHwgW10pXSxcbiAgICAgIGZpZWxkUHJvcHM6IFsuLi5DT01NT05fRklFTERfUFJPUFMsIC4uLihjb25maWc/LmN1c3RvbUZpZWxkUHJvcHMgfHwgW10pXSxcbiAgICAgIGFwcGVhcmFuY2U6IFsuLi5DT01NT05fQVBQRUFSQU5DRV9QUk9QUywgLi4uKGNvbmZpZz8uY3VzdG9tQXBwZWFyYW5jZVByb3BzIHx8IFtdKV1cbiAgICB9O1xuICB9XG4gIC8vIEFQIDIzTUFZMjUgLSBBZGQgYSBuZXcgYnV0dG9uIHdpdGggZGVmYXVsdCBzdHlsaW5nXG4gIGFkZE5ld0J1dHRvbigpIHtcbiAgICBjb25zdCBsYXN0UGVyY2VudCA9IHRoaXMuYm9vaygpPy5xdWVzdGlvbmJvb2s/LmFjdGlvbj8uc2xpY2UoLTEpWzBdPy5wb3NpdGlvblBlcmNlbnQgPz8gMDtcbiAgICBjb25zdCBidXR0b25zID0ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBldmVudHRvZW1pdDogJycsXG4gICAgICBhbHQ6ICcnLFxuICAgICAgZW5kcG9pbnQ6ICcnLFxuICAgICAgbWV0aG9kOiAnJyxcbiAgICAgIGlkOiB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5hZGRFbGVtZW50V2l0aElkKCksXG4gICAgICBwb3NpdGlvblBlcmNlbnQ6IGxhc3RQZXJjZW50ICsgMTAsXG4gICAgICB3aWR0aDogMTAwLFxuICAgICAgYm9yZGVyUmFkaXVzOiA2LFxuICAgICAgYWxpZ25tZW50OiAnZmxleC1zdGFydCdcbiAgICB9O1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnV0dG9ucywgJ2FkZCcpO1xuICAgIHRoaXMuYm9vay51cGRhdGUoYm9vayA9PiAoeyAuLi5ib29rIH0pKTtcbiAgfVxuICAvL0FQIDIzTUFZMjUgLSBSZW1vdmUgYSBidXR0b24gZnJvbSB0aGUgYWN0aW9uIGxpc3QgXG4gIHJlbW92ZUJ1dHRvbihidG46IGFueSkge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnRuLCAncmVtb3ZlJyk7XG4gICAgdGhpcy5ib29rLnVwZGF0ZShib29rID0+ICh7IC4uLmJvb2sgfSkpO1xuICB9XG4gIC8vQVAgMjNNQVkyNSAtIFVwZGF0ZSBhIHNwZWNpZmljIHByb3BlcnR5IG9mIGEgYnV0dG9uXG4gIG9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaW5kZXg6IG51bWJlciwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksaXNUcmFuc2xhdGU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLmJvb2soKT8ucXVlc3Rpb25ib29rPy5hY3Rpb24gPz8gW107XG4gICAgaWYgKGJ1dHRvbnNbaW5kZXhdKSB7XG4gICAgICBidXR0b25zW2luZGV4XVtrZXldID0gdmFsdWU7XG4gICAgICB0aGlzLmJvb2sudXBkYXRlKGJvb2sgPT4gKHsgLi4uYm9vaywgcXVlc3Rpb25ib29rOiB7IC4uLmJvb2sucXVlc3Rpb25ib29rLCBhY3Rpb246IGJ1dHRvbnMgfSB9KSk7XG4gICAgfVxuICAgIGxldCBidXR0b24gPSBidXR0b25zW2luZGV4XVxuICAgIGlmKGlzVHJhbnNsYXRlKXtcbiAgICAgIC8vU0tTMjhKVUwyNSBSZWZyZXNoIHRoZSBib29rIHNpZ25hbCBmcm9tIHNlcnZpY2VcbiAgICAgIGNvbnN0IHVwZGF0ZWRCb29rID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0Qm9vaygpO1xuICAgICAgdGhpcy5ib29rLnNldCh1cGRhdGVkQm9vayk7XG4gICAgICAvL1NLUzI4SlVMMjUgV29yayB3aXRoIGEgbXV0YWJsZSBjb3B5XG4gICAgICBjb25zdCBjdXJyZW50Qm9vayA9IHRoaXMuYm9vaygpO1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25NYXAgPSBjdXJyZW50Qm9vay50cmFuc2xhdGlvbk1hcCB8fCB7fTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZ2V0Rm9ybUJ1aWxkZXJMYW5ndWFnZSgpO1xuICAgICAgLy9TS1MyOEpVTDI1IEVuc3VyZSBuZXN0ZWQgc3RydWN0dXJlIGV4aXN0c1xuICAgICAgaWYgKCF0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ10pIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXSA9IHt9O1xuICAgICAgaWYgKCF0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bYnV0dG9uLmlkXSkgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2J1dHRvbi5pZF0gPSB7fTtcbiAgICAgIC8vU0tTMjhKVUwyNSBTZXQgdGhlIHRyYW5zbGF0ZWQgdmFsdWVcbiAgICAgIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXVtidXR0b24uaWRdW2tleV0gPSB2YWx1ZTtcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgYm9vayBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgICAgIGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwID0gdHJhbnNsYXRpb25NYXA7XG4gICAgICB0aGlzLmJvb2suc2V0KGN1cnJlbnRCb29rKTsgLy8gVHJpZ2dlciByZWFjdGl2ZSB1cGRhdGVcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgaW4gc2VydmljZSBpZiBuZWVkZWRcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUJvb2soY3VycmVudEJvb2spO1xuICAgIH1cbiAgfVxuICAvL0FQLTEwTUFSMjUgVXBkYXRlcyB0aGUgdGl0bGUgdXNpbmcgdGhlIGZvcm0gYnVpbGRlciBzZXJ2aWNlICBcbiAgdXBkYXRlVGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVRpdGxlKHZhbHVlKTtcbiAgICB0aGlzLmJvb2sudXBkYXRlKGJvb2sgPT4gKHtcbiAgICAgIC4uLmJvb2ssXG4gICAgICByZWNvcmRzOiBbeyAuLi5ib29rLnJlY29yZHNbMF0sIHRpdGxlOiB2YWx1ZSB9XVxuICAgIH0pKTtcbiAgfVxuXG4gIHZhbGlkYXRlSW5wdXQodmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGUgPT09ICdsYWJlbCcgfHwgdHlwZSA9PT0gJ3BsYWNlaG9sZGVyJykge1xuICAgICAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTlcXHNdKiQvO1xuICAgICAgaWYgKCFyZWdleC50ZXN0KHZhbHVlKSkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZS5zZXQoJ09ubHkgbGV0dGVycyBhbmQgbnVtYmVycyBhcmUgYWxsb3dlZCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZXJyb3JNZXNzYWdlLnNldCgnJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB1cGRhdGVGaWVsZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5ib29rU3VidGV4dC51cGRhdGUoc3VidGV4dCA9PiAoe1xuICAgICAgLi4uc3VidGV4dCxcbiAgICAgIGZpZWxkOiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKVxuICAgIH0pKTtcbiAgfVxuXG4gIG9uQ2hlY2tib3hDaGFuZ2UodGFyZ2V0QXJyYXlQYXRoOiBhbnksIHRhcmdldEFycmF5S2V5OiBhbnksIGtleTogYW55LCBhcGlOYW1lOiBzdHJpbmcsIGlzQ2hlY2tlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGhpcy5nZXREYXRhQnlQYXRoKHRhcmdldEFycmF5UGF0aCk7XG4gICAgY29uc3QgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSB0aGlzLnNlbGVjdENvbHVtbigpKTtcbiAgICBmb3VuZEl0ZW1ba2V5XSA9IGZvdW5kSXRlbVtrZXldID8gZm91bmRJdGVtW2tleV0gOiBbXTtcbiAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICBpZiAoIWZvdW5kSXRlbVtrZXldLmluY2x1ZGVzKGFwaU5hbWUpKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnB1c2goYXBpTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZm91bmRJdGVtW2tleV0uaW5kZXhPZihhcGlOYW1lKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgfVxuXG4gIHVwZGF0ZVByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSA+PSAwKSB7XG4gICAgICBpZiAoa2V5ID09PSAncXVlc3Rpb25UZXh0JyB8fCBrZXkgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlSW5wdXQodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChrZXkgPT09ICdxdWVzdGlvbk51bWJlcicpIHtcbiAgICAgICAgLy9BUC0xME1BUjI1IENvbnZlcnQgdGhlIHZhbHVlIHRvIGFuIGludGVnZXIgIFxuICAgICAgICBjb25zdCBuZXdPcmRlciA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihuZXdPcmRlcikpIHJldHVybjtcblxuICAgICAgICAvL0FQLTEwTUFSMjUgVXBkYXRlIHRoZSBlbGVtZW50J3MgcXVlc3Rpb25OdW1iZXIgaW4gdGhlIGZvcm0gYnVpbGRlciBzZXJ2aWNlICBcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIHsgcXVlc3Rpb25OdW1iZXI6IG5ld09yZGVyIH0pO1xuXG4gICAgICAgIC8vQVAtMTBNQVIyNSBTb3J0IGVsZW1lbnRzIGJhc2VkIG9uIHRoZSB1cGRhdGVkIHF1ZXN0aW9uTnVtYmVyICBcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc29ydEVsZW1lbnRzQnlPcmRlcigpO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ2ZvbnQnIHx8IGtleSA9PT0gJ2ZvbnRXZWlnaHQnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnVwZGF0ZShlbCA9PiAoeyAuLi5lbCwgW2tleV06IHZhbHVlIH0pKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgW2tleV06IHZhbHVlIH07XG4gICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSwgdXBkYXRlKTtcbiAgICB9XG4gIH1cblxuICBvblJhZGlvQ2hhbmdlKHRhcmdldEFycmF5UGF0aDogYW55LCB0YXJnZXRBcnJheUtleTogYW55LCBrZXk6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0QXJyYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGFyZ2V0QXJyYXkgPSBKU09OLnBhcnNlKHRhcmdldEFycmF5IHx8ICdbXScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyB0YXJnZXRBcnJheTonLCBlKTtcbiAgICAgICAgICB0YXJnZXRBcnJheSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0QXJyYXkpKSByZXR1cm47XG4gICAgICBsZXQgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSB0aGlzLnNlbGVjdENvbHVtbigpKTtcbiAgICAgIGlmICghZm91bmRJdGVtKSB7XG4gICAgICAgIGZvdW5kSXRlbSA9IHsgW3RhcmdldEFycmF5S2V5XTogdGhpcy5zZWxlY3RDb2x1bW4oKSB9O1xuICAgICAgICB0YXJnZXRBcnJheS5wdXNoKGZvdW5kSXRlbSk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICBsZXQgb2JqID0gZm91bmRJdGVtO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBrID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKCFvYmpba10pIG9ialtrXSA9IHt9O1xuICAgICAgICBvYmogPSBvYmpba107XG4gICAgICB9XG4gICAgICBvYmpba2V5c1trZXlzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAgIC4uLmVsLFxuICAgICAgICBmaWVsZHNNZXRhOiB0YXJnZXRBcnJheVxuICAgICAgfSkpO1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFZhbHVlQnlQYXRoKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVxdWlyZWRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgbGV0IGxhYmVsID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQoKS5sYWJlbCA/IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkubGFiZWwucmVwbGFjZSgvXFxzKlxcKiskLywgJycpIDogJ0xhYmVsJztcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBsYWJlbCA9IGAke2xhYmVsfSAqYDtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHkoJ2xhYmVsJywgbGFiZWwpO1xuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0eSgnaXNPcHRpb25hbCcsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVTdWJRdWVzdGlvbihwcm9wOiBhbnkpIHtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xuICB9XG5cbiAgdG9nZ2xlU3R5bGVTZWN0aW9uKCkge1xuICAgIHRoaXMuaXNTdHlsZUV4cGFuZGVkLnNldCghdGhpcy5pc1N0eWxlRXhwYW5kZWQoKSk7XG4gIH1cblxuICBnZXRQcm9wZXJ0aWVzKCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1uID0gdGhpcy5zZWxlY3RDb2x1bW4oKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdXNlIGNhY2hlZCByZXN1bHRcbiAgICBpZiAodGhpcy5fY2FjaGVkUHJvcGVydGllcyAmJiBcbiAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9PT0gZWxlbWVudCAmJiBcbiAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID09PSBzZWxlY3RlZENvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFByb3BlcnRpZXM7XG4gICAgfSAgICBcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2NhY2hlZFByb3BlcnRpZXMgPSBudWxsO1xuICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9sYXN0U2VsZWN0ZWRDb2x1bW4gPSBudWxsO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICBcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnSGVhZGVyJykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5lbGVtZW50UHJvcGVydGllcygpWydIZWFkZXInXTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyAmJiBzZWxlY3RlZENvbHVtbiAhPT0gbnVsbCkge1xuICAgICAgbGV0IGZpZWxkc01ldGEgPSBlbGVtZW50LmZpZWxkc01ldGE7XG4gICAgICB0cnkge1xuICAgICAgICBmaWVsZHNNZXRhID0gQXJyYXkuaXNBcnJheShmaWVsZHNNZXRhKVxuICAgICAgICAgID8gZmllbGRzTWV0YVxuICAgICAgICAgIDogSlNPTi5wYXJzZShmaWVsZHNNZXRhIHx8ICdbXScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGEgaW4gZ2V0UHJvcGVydGllczonLCBlKTtcbiAgICAgICAgZmllbGRzTWV0YSA9IFtdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBjb2x1bW4gPSBmaWVsZHNNZXRhLmZpbmQoKGM6IGFueSkgPT4gYy51bmlxdWVJZGVudGlmaWVyID09PSBzZWxlY3RlZENvbHVtbik7XG4gICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IG1hcmtJc1RhYmxlQ29sdW1uID0gKGl0ZW1zOiBhbnlbXSA9IFtdKSA9PlxuICAgICAgICAgIGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7IC4uLml0ZW0sIGlzVGFibGVDb2x1bW46IHRydWUgfTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0l0ZW0uc3ViUXVlc3Rpb24pKSB7XG4gICAgICAgICAgICAgIG5ld0l0ZW0uc3ViUXVlc3Rpb24gPSBuZXdJdGVtLnN1YlF1ZXN0aW9uLm1hcChzdWIgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5zdWIsXG4gICAgICAgICAgICAgICAgaXNUYWJsZUNvbHVtbjogdHJ1ZVxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbJ1RhYmxlQ29sdW1uJ10uZWxlbWVudFByb3BzIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLm1hcmtJc1RhYmxlQ29sdW1uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVt0aGlzLmVsZW1lbnRUeXBlLmluY2x1ZGVzKGNvbHVtbi5mbGRUeXBlKSA/IGNvbHVtbi5mbGRUeXBlIDogJ1RleHQnXT8uZWxlbWVudFByb3BzKVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICAgICAgLi4uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVsnVGFibGVDb2x1bW4nXS5maWVsZFByb3BzIHx8IFtdKSxcbiAgICAgICAgICAgIC4uLm1hcmtJc1RhYmxlQ29sdW1uKHRoaXMuZWxlbWVudFByb3BlcnRpZXMoKVt0aGlzLmVsZW1lbnRUeXBlLmluY2x1ZGVzKGNvbHVtbi5mbGRUeXBlKSA/IGNvbHVtbi5mbGRUeXBlIDogJ1RleHQnXT8uZmllbGRQcm9wcylcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFwcGVhcmFuY2U6IFtcbiAgICAgICAgICAgIC4uLih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbJ1RhYmxlQ29sdW1uJ10uYXBwZWFyYW5jZSB8fCBbXSksXG4gICAgICAgICAgICAuLi5tYXJrSXNUYWJsZUNvbHVtbih0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbdGhpcy5lbGVtZW50VHlwZS5pbmNsdWRlcyhjb2x1bW4uZmxkVHlwZSkgPyBjb2x1bW4uZmxkVHlwZSA6ICdUZXh0J10/LmFwcGVhcmFuY2UpXG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5lbGVtZW50UHJvcGVydGllcygpWydUYWJsZUNvbHVtbiddO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKClbZWxlbWVudC50eXBlXTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuX2NhY2hlZFByb3BlcnRpZXMgPSByZXN1bHQ7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID0gc2VsZWN0ZWRDb2x1bW47XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBBZGQgbWV0aG9kIHRvIGNsZWFyIGNhY2hlIHdoZW4gbmVlZGVkXG4gIHByaXZhdGUgY2xlYXJQcm9wZXJ0aWVzQ2FjaGUoKSB7XG4gICAgdGhpcy5fY2FjaGVkUHJvcGVydGllcyA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkQ29sdW1uID0gbnVsbDtcbiAgfVxuICAvLyBBUC0yOE1BUjI1IEFkZCBhbiBvcHRpb24gd2l0aCBhIHVuaXF1ZSBVVUlEXG4gIGFkZE9wdGlvbihvcHRpb25zOiBhbnlbXSkge1xuICAgIGNvbnN0IHVuaXF1ZV9pZCA9IHV1aWR2NCgpO1xuICAgIG9wdGlvbnMucHVzaCh7IGlkOiB1bmlxdWVfaWQsIHZhbHVlOiAnJyB9KTtcbiAgfVxuXG4gIC8vIEFQLTI4TUFSMjUgRnVuY3Rpb24gdG8gcmVtb3ZlIGFuIG9wdGlvbiBiYXNlZCBvbiBpdHMgdW5pcXVlIFVVSURcbiAgcmVtb3ZlT3B0aW9uKG9wdGlvbnM6IGFueVtdLCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLmlkID09PSBpZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgb3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUJ1dHRvbkNsaWNrKCkge1xuICAgIHRoaXMuZm9ybUJ1dHRvbkhhbmRsZXIuZW1pdCh0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSk7XG4gIH1cblxuICBoYW5kbGVUZW1wbGF0ZVNhdmUoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVNhdmVIYW5kbGVyLmVtaXQodGhpcy50ZW1wbGF0ZVNlcnZpY2UuZG93bmxvYWQoKSk7XG4gIH1cblxuICBzZXRBY3RpdmVUYWIodGFiOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQodGFiKTtcbiAgfVxuXG4gIG9uU2F2ZSgpIHt9XG5cbiAgb25DYW5jZWwoKSB7fVxuXG4gIG9uQWxpZ25TZWxlY3QodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnVwZGF0ZShlbCA9PiAoeyAuLi5lbCwgdGV4dEFsaWduOiB2YWx1ZSB9KSk7XG4gIH1cblxuICBvblN0eWxlU2VsZWN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHtcbiAgICAgIC4uLmVsLFxuICAgICAgc3R5bGVzOiBbdmFsdWVdXG4gICAgfSkpO1xuICB9XG5cbiAgaXNTdHlsZUFjdGl2ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk/LnN0eWxlcz8uaW5jbHVkZXModmFsdWUpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0VmFsdWVCeVBhdGgocGF0aDogc3RyaW5nLCBvYmo6IGFueSA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCksIGRlZmF1bHRWYWx1ZTogYW55ID0gJycpOiBhbnkge1xuICAgIGlmICghb2JqIHx8ICFwYXRoKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvLCBrKSA9PiBvPy5ba10gPz8gZGVmYXVsdFZhbHVlLCBvYmopO1xuICB9XG4gIGlzQW5vdGhlcklkU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKClcbiAgICAgIC5zb21lKChlbCwgaSkgPT4gaSAhPT0gdGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpICYmIGVsLnByaW1hcnlLZXkpO1xuICB9XG5cbiAgLy8gQWxzbyB1cGRhdGUgeW91ciBvblRvZ2dsZUNoYW5nZSBtZXRob2QgdG8gY2xlYXIgY2FjaGVcbm9uVG9nZ2xlQ2hhbmdlKHBhdGg6IHN0cmluZywgZXZlbnQ6IGFueSkge1xuICAvLyBDbGVhciBjYWNoZSB3aGVuIGVsZW1lbnQgY2hhbmdlc1xuICB0aGlzLmNsZWFyUHJvcGVydGllc0NhY2hlKCk7XG4gIGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQgPyAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQgOiBldmVudDtcbiAgdGhpcy5zZXRWYWx1ZUJ5UGF0aChwYXRoLCBjaGVja2VkKTtcbiAgXG4gIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnKSB7XG4gICAgbGV0IGZpZWxkc01ldGEgPSB0aGlzLmdldERhdGFCeVBhdGgoJ2ZpZWxkc01ldGEnKTtcbiAgICBpZiAodHlwZW9mIGZpZWxkc01ldGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmaWVsZHNNZXRhID0gSlNPTi5wYXJzZShmaWVsZHNNZXRhIHx8ICdbXScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIGZpZWxkc01ldGE6JywgZSk7XG4gICAgICAgIGZpZWxkc01ldGEgPSBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAuLi5lbCxcbiAgICAgIGZpZWxkc01ldGE6IGZpZWxkc01ldGFcbiAgICB9KSk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICB9XG59XG5cbiAgLy8gVXBkYXRlIHlvdXIgc2V0VmFsdWVCeVBhdGggbWV0aG9kIHRvIGNsZWFyIGNhY2hlXG5zZXRWYWx1ZUJ5UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnksaXNUcmFuc2xhdGU6Ym9vbGVhbiA9IGZhbHNlKSB7XG4gIC8vIENsZWFyIGNhY2hlIHdoZW4gZWxlbWVudCBjaGFuZ2VzXG4gIHRoaXMuY2xlYXJQcm9wZXJ0aWVzQ2FjaGUoKTtcbiAgXG4gIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCkgPj0gMCkge1xuICAgIGlmIChwYXRoID09PSAncXVlc3Rpb25UZXh0JyB8fCBwYXRoID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVJbnB1dCh2YWx1ZSwgcGF0aCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gJ3F1ZXN0aW9uTnVtYmVyJykge1xuICAgICAgY29uc3QgbmV3T3JkZXIgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgaWYgKGlzTmFOKG5ld09yZGVyKSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIHsgcXVlc3Rpb25OdW1iZXI6IG5ld09yZGVyIH0pO1xuICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc29ydEVsZW1lbnRzQnlPcmRlcigpO1xuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gJ2ZvbnQnIHx8IHBhdGggPT09ICdmb250V2VpZ2h0Jykge1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBbcGF0aF06IHZhbHVlIH0pKTtcbiAgICB9XG4gIH1cbiAgXG4gIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpO1xuICBpZiAoZWxlbWVudCkge1xuICAgIGxldCBzdWJUZXh0ID0gZWxlbWVudC5zdWJUZXh0O1xuICAgIGlmICh0eXBlb2Ygc3ViVGV4dCA9PT0gJ3N0cmluZycgJiYgc3ViVGV4dC50cmltKCkgIT09ICcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdWJUZXh0ID0gSlNPTi5wYXJzZShzdWJUZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdWJUZXh0OicsIGUpO1xuICAgICAgICBzdWJUZXh0ID0ge307XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3ViVGV4dCAhPT0gJ29iamVjdCcgfHwgc3ViVGV4dCA9PT0gbnVsbCkge1xuICAgICAgc3ViVGV4dCA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBhcnJheUZpZWxkcyA9IFsnZmllbGQnLCAncXVlcnlQYXJhbWV0ZXInLCAnc291cmNlUXVlc3Rpb25JZCcsICdxdWVyeUZpZWxkJywgJ3F1ZXJ5VmFsdWUnXTtcbiAgICBpZiAoc3ViVGV4dCkge1xuICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJUZXh0W2tleV0pKSB7XG4gICAgICAgICAgc3ViVGV4dFtrZXldID0gc3ViVGV4dFtrZXldLmpvaW4oJywgJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gICAgICAgIFxuICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyl7XG4gICAgICBlbGVtZW50LmZpZWxkc01ldGEuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIGlmKGZpZWxkPy5xdWVzdGlvbj8uc3ViVGV4dCl7XG4gICAgICAgICAgYXJyYXlGaWVsZHMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQucXVlc3Rpb24uc3ViVGV4dFtrZXldKSkge1xuICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvbi5zdWJUZXh0W2tleV0gPSBmaWVsZC5xdWVzdGlvbi5zdWJUZXh0W2tleV0uam9pbignLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc1RyYW5zbGF0ZSkge1xuICAgICAgLy9TS1MyOEpVTDI1IFJlZnJlc2ggdGhlIGJvb2sgc2lnbmFsIGZyb20gc2VydmljZVxuICAgICAgY29uc3QgdXBkYXRlZEJvb2sgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRCb29rKCk7XG4gICAgICB0aGlzLmJvb2suc2V0KHVwZGF0ZWRCb29rKTtcbiAgICAgIC8vIFdvcmsgd2l0aCBhIG11dGFibGUgY29weVxuICAgICAgY29uc3QgY3VycmVudEJvb2sgPSB0aGlzLmJvb2soKTtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uTWFwID0gY3VycmVudEJvb2sudHJhbnNsYXRpb25NYXAgfHwge307XG4gICAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldEZvcm1CdWlsZGVyTGFuZ3VhZ2UoKTtcbiAgICAgIC8vU0tTMjhKVUwyNSBFbnN1cmUgbmVzdGVkIHN0cnVjdHVyZSBleGlzdHNcbiAgICAgIGlmICghdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddKSB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ10gPSB7fTtcbiAgICAgIGlmICghdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2VsZW1lbnQuaWRdKSB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bZWxlbWVudC5pZF0gPSB7fTtcbiAgICAgIC8vIFNldCB0aGUgdHJhbnNsYXRlZCB2YWx1ZVxuICAgICAgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW2VsZW1lbnQuaWRdW3BhdGhdID0gdmFsdWU7XG4gICAgICAvLyBVcGRhdGUgYm9vayBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgICAgIGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwID0gdHJhbnNsYXRpb25NYXA7XG4gICAgICB0aGlzLmJvb2suc2V0KGN1cnJlbnRCb29rKTsgLy8gVHJpZ2dlciByZWFjdGl2ZSB1cGRhdGVcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgaW4gc2VydmljZSBpZiBuZWVkZWRcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUJvb2soY3VycmVudEJvb2spO1xuICAgIH0gICAgXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7IC4uLmVsLCBzdWJUZXh0IH0pKTtcbiAgfVxuICBcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+IHtcbiAgICBsZXQgb2JqID0geyAuLi5lbCB9O1xuICAgIGxldCBjdXJyZW50ID0gb2JqO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY3VycmVudFtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWN1cnJlbnRba2V5XSkge1xuICAgICAgICAgIGN1cnJlbnRba2V5XSA9IGlzTmFOKE51bWJlcihrZXlzW2luZGV4ICsgMV0pKSA/IHt9IDogW107XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xuICB9KTtcbiAgXG4gIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpLCB0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbn1cbm9wdGlvblRyYW5zbGF0aW9uVXBkYXRlKG9wdGlvbjogYW55LCBldmVudDogYW55KXtcbiAgLy9TS1MyOEpVTDI1IFJlZnJlc2ggdGhlIGJvb2sgc2lnbmFsIGZyb20gc2VydmljZVxuICBjb25zdCB1cGRhdGVkQm9vayA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgdGhpcy5ib29rLnNldCh1cGRhdGVkQm9vayk7XG4gIC8vIFdvcmsgd2l0aCBhIG11dGFibGUgY29weVxuICBjb25zdCBjdXJyZW50Qm9vayA9IHRoaXMuYm9vaygpO1xuICBjb25zdCB0cmFuc2xhdGlvbk1hcCA9IGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwIHx8IHt9O1xuICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldEZvcm1CdWlsZGVyTGFuZ3VhZ2UoKTtcbiAgLy9TS1MyOEpVTDI1IEVuc3VyZSBuZXN0ZWQgc3RydWN0dXJlIGV4aXN0c1xuICBpZiAoIXRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXSkgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddID0ge307XG4gIGlmICghdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddW29wdGlvbi5pZF0pIHRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXVtvcHRpb24uaWRdID0ge307XG4gIC8vIFNldCB0aGUgdHJhbnNsYXRlZCB2YWx1ZVxuICB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bb3B0aW9uLmlkXVsndmFsdWUnXSA9IGV2ZW50O1xuICAvLyBVcGRhdGUgYm9vayBhbmQgcmUtc2V0IHRoZSBzaWduYWxcbiAgY3VycmVudEJvb2sudHJhbnNsYXRpb25NYXAgPSB0cmFuc2xhdGlvbk1hcDtcbiAgdGhpcy5ib29rLnNldChjdXJyZW50Qm9vayk7IC8vIFRyaWdnZXIgcmVhY3RpdmUgdXBkYXRlXG4gIC8vU0tTMjhKVUwyNSBVcGRhdGUgaW4gc2VydmljZSBpZiBuZWVkZWRcbiAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlQm9vayhjdXJyZW50Qm9vayk7XG59XG4gIGdldFN0eWxlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLnNlbGVjdGVkRWxlbWVudCgpPy5zdHlsZTtcbiAgICByZXR1cm4gc3R5bGUgJiYgdHlwZW9mIHN0eWxlID09PSAnb2JqZWN0JyA/IE9iamVjdC5rZXlzKHN0eWxlKSA6IFtdO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudChlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5lbGVtZW50VXBkYXRlKHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgoKSwgZWxlbWVudCk7XG4gICAgaWYgKGVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgJiYgdGhpcy5zZWxlY3RDb2x1bW4oKSkge1xuICAgICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2Uuc2V0U2VsZWN0ZWRUYWJsZUVsZW1lbnQodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpLCB7IHVuaXF1ZUlkZW50aWZpZXI6IHRoaXMuc2VsZWN0Q29sdW1uKCkgfHwgbnVsbCB9KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnNldCh7IC4uLmVsZW1lbnQgfSk7IC8vIEVuc3VyZSByZWFjdGl2ZSB1cGRhdGVcbiAgICB9XG4gIH1cblxuICBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHRhcmdldEFycmF5UGF0aDogYW55LCB0YXJnZXRBcnJheUtleTogc3RyaW5nLCBzZWxlY3RDb2x1bW46IHN0cmluZywga2V5UGF0aDogc3RyaW5nLCBpc1RhYmxlQ29sdW1uOiBib29sZWFuID0gZmFsc2UpOiBhbnkge1xuICAgIGlmIChpc1RhYmxlQ29sdW1uKSB7XG4gICAgICB0YXJnZXRBcnJheVBhdGggPSAnZmllbGRzTWV0YSc7XG4gICAgICB0YXJnZXRBcnJheUtleSA9ICd1bmlxdWVJZGVudGlmaWVyJztcbiAgICAgIGtleVBhdGggPSAncXVlc3Rpb24uJyArIGtleVBhdGg7XG4gICAgfVxuICAgIGxldCB0YXJnZXRBcnJheSA9IHRoaXMuZ2V0RGF0YUJ5UGF0aCh0YXJnZXRBcnJheVBhdGgpO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0QXJyYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0YXJnZXRBcnJheSA9IEpTT04ucGFyc2UodGFyZ2V0QXJyYXkgfHwgJ1tdJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgdGFyZ2V0QXJyYXk6JywgZSk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRhcmdldEFycmF5KSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGZvdW5kSXRlbSA9IHRhcmdldEFycmF5LmZpbmQoaXRlbSA9PiBpdGVtW3RhcmdldEFycmF5S2V5XSA9PT0gc2VsZWN0Q29sdW1uKTtcbiAgICByZXR1cm4gZm91bmRJdGVtID8ga2V5UGF0aC5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0sIGZvdW5kSXRlbSkgOiAnJztcbiAgfVxuICBcbiAgdXBkYXRlVmFsdWVCeUFycmF5UGF0aCh0YXJnZXRBcnJheVBhdGg6IGFueSwgdGFyZ2V0QXJyYXlLZXk6IHN0cmluZywgc2VsZWN0Q29sdW1uOiBzdHJpbmcsIGtleVBhdGg6IHN0cmluZywgZXZlbnQ6IGFueSwgaXNUYWJsZUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlLGlzVHJhbnNsYXRlOmJvb2xlYW4gPSBmYWxzZSApIHtcbiAgICAvLyBDbGVhciBjYWNoZSB3aGVuIGVsZW1lbnQgY2hhbmdlc1xuICAgIHRoaXMuY2xlYXJQcm9wZXJ0aWVzQ2FjaGUoKTtcbiAgICAgICAgXG4gICAgaWYgKGlzVGFibGVDb2x1bW4pIHtcbiAgICAgIHRhcmdldEFycmF5UGF0aCA9ICdmaWVsZHNNZXRhJztcbiAgICAgIHRhcmdldEFycmF5S2V5ID0gJ3VuaXF1ZUlkZW50aWZpZXInO1xuICAgICAga2V5UGF0aCA9ICdxdWVzdGlvbi4nICsga2V5UGF0aDtcbiAgICB9XG4gICAgICAgIFxuICAgIGxldCB0YXJnZXRBcnJheSA9IHRoaXMuZ2V0RGF0YUJ5UGF0aCh0YXJnZXRBcnJheVBhdGgpO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0QXJyYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0YXJnZXRBcnJheSA9IEpTT04ucGFyc2UodGFyZ2V0QXJyYXkgfHwgJ1tdJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgdGFyZ2V0QXJyYXk6JywgZSk7XG4gICAgICAgIHRhcmdldEFycmF5ID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRBcnJheSkpIHtcbiAgICAgIHRhcmdldEFycmF5ID0gW107XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHtcbiAgICAgICAgLi4uZWwsXG4gICAgICAgIFt0YXJnZXRBcnJheVBhdGhdOiB0YXJnZXRBcnJheVxuICAgICAgfSkpO1xuICAgIH1cbiAgICBcbiAgICBsZXQgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSBzZWxlY3RDb2x1bW4pO1xuICAgIGlmICghZm91bmRJdGVtKSB7XG4gICAgICBmb3VuZEl0ZW0gPSB7IFt0YXJnZXRBcnJheUtleV06IHNlbGVjdENvbHVtbiB9O1xuICAgICAgdGFyZ2V0QXJyYXkucHVzaChmb3VuZEl0ZW0pO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBrZXlzID0ga2V5UGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCBvYmogPSBmb3VuZEl0ZW07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmICghb2JqW2tleV0pIG9ialtrZXldID0ge307XG4gICAgICBvYmogPSBvYmpba2V5XTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgbGFzdEtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBpbnB1dEVsZW1lbnQ6IGFueSA9IGV2ZW50LnRhcmdldCA/IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IDogZXZlbnQ7XG4gICAgb2JqW2xhc3RLZXldID0gaW5wdXRFbGVtZW50Py50eXBlID09PSAnY2hlY2tib3gnID8gaW5wdXRFbGVtZW50LmNoZWNrZWQgOiBpbnB1dEVsZW1lbnQudmFsdWUgPyBpbnB1dEVsZW1lbnQudmFsdWUgOiBpbnB1dEVsZW1lbnQ7XG4gICAgaWYgKGlzVHJhbnNsYXRlKSB7XG4gICAgICAvLyBSZWZyZXNoIHRoZSBib29rXG4gICAgICB0aGlzLmJvb2suc2V0KHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKSk7XG4gICAgICAvL1NLUzI4SlVMMjUgV29yayB3aXRoIGEgbXV0YWJsZSBjb3B5IG9mIHRoZSBzaWduYWwgdmFsdWVcbiAgICAgIGNvbnN0IGN1cnJlbnRCb29rID0gdGhpcy5ib29rKCk7XG4gICAgICBjb25zdCB0cmFuc2xhdGlvbk1hcCA9IGN1cnJlbnRCb29rLnRyYW5zbGF0aW9uTWFwIHx8IHt9O1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5nZXRGb3JtQnVpbGRlckxhbmd1YWdlKCk7XG4gICAgICAvLyBJbml0aWFsaXplIG5lc3RlZCBzdHJ1Y3R1cmUgc2FmZWx5XG4gICAgICBpZiAoIXRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXSkgdHJhbnNsYXRpb25NYXBbY3VycmVudExhbmddID0ge307XG4gICAgICBpZiAoIXRyYW5zbGF0aW9uTWFwW2N1cnJlbnRMYW5nXVtvYmouaWRdKSB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bb2JqLmlkXSA9IHt9O1xuICAgICAgLy8gU2V0IHRoZSB0cmFuc2xhdGVkIGlucHV0XG4gICAgICB0cmFuc2xhdGlvbk1hcFtjdXJyZW50TGFuZ11bb2JqLmlkXVtsYXN0S2V5XSA9IGlucHV0RWxlbWVudDtcbiAgICAgIC8vU0tTMjhKVUwyNSBVcGRhdGUgdGhlIGJvb2sgb2JqZWN0IGFuZCByZS1zZXQgdGhlIHNpZ25hbFxuICAgICAgY3VycmVudEJvb2sudHJhbnNsYXRpb25NYXAgPSB0cmFuc2xhdGlvbk1hcDtcbiAgICAgIHRoaXMuYm9vay5zZXQoY3VycmVudEJvb2spO1xuICAgICAgLy8gT3B0aW9uYWxseSBpbmZvcm0gdGhlIHNlcnZpY2VcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUJvb2soY3VycmVudEJvb2spO1xuICAgIH0gICAgXG4gICAgaWYgKGtleVBhdGggPT09ICdzdW1tYXJ5Q29sdW1uJykge1xuICAgICAgaWYgKG9ialsnc3VtbWFyeVJvdyddID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnc3VtbWFyeVJvdyddID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXRFbGVtZW50LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnY2FsY3VsYXRpb24nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnVGV4dCc7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChrZXlQYXRoID09PSAnc3VtbWFyeVJvdycpIHtcbiAgICAgIGlmIChvYmpbJ3N1bW1hcnlDb2x1bW4nXSA9PT0gdHJ1ZSkge1xuICAgICAgICBvYmpbJ3N1bW1hcnlDb2x1bW4nXSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0RWxlbWVudC5jaGVja2VkID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnZmxkVHlwZSddID0gJ2NhbGN1bGF0aW9uJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialsnZmxkVHlwZSddID0gJ1RleHQnO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHtcbiAgICAgIC4uLmVsLFxuICAgICAgW3RhcmdldEFycmF5UGF0aF06IHRhcmdldEFycmF5XG4gICAgfSkpO1xuICAgIFxuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgfVxuXG4gIGdldERhdGFCeVBhdGgocGF0aDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0sIHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICB9XG5cbiAgZmxpcEhvcml6b250YWwoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgZmxpcEg6ICF0LmZsaXBIIH0pKTtcbiAgfVxuXG4gIGZsaXBWZXJ0aWNhbCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGUodCA9PiAoeyAuLi50LCBmbGlwVjogIXQuZmxpcFYgfSkpO1xuICB9XG5cbiAgcmVzZXRJbWFnZSgpIHtcbiAgICB0aGlzLmNhbnZhc1JvdGF0aW9uLnNldCgwKTtcbiAgICB0aGlzLmNyb3BwZXIuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy50cmFuc2Zvcm0uc2V0KHtcbiAgICAgIHRyYW5zbGF0ZVVuaXQ6ICdweCcsXG4gICAgICBzY2FsZTogMSxcbiAgICAgIHJvdGF0ZTogMCxcbiAgICAgIGZsaXBIOiBmYWxzZSxcbiAgICAgIGZsaXBWOiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgICB0cmFuc2xhdGVWOiAwXG4gICAgfSk7XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7IC4uLnQsIHNjYWxlOiB0LnNjYWxlISAtIDAuMSB9KSk7XG4gIH1cblxuICB6b29tSW4oKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgc2NhbGU6IHQuc2NhbGUhICsgMC4xIH0pKTtcbiAgfVxuXG4gIHJvdGF0ZUxlZnQoKSB7XG4gICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2FudmFzUm90YXRpb24udXBkYXRlKGMgPT4gYyAtIDEpO1xuICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJvdGF0ZVJpZ2h0KCkge1xuICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc1JvdGF0aW9uLnVwZGF0ZShjID0+IGMgKyAxKTtcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBtb3ZlTGVmdCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybS51cGRhdGUodCA9PiAoeyAuLi50LCB0cmFuc2xhdGVIOiB0LnRyYW5zbGF0ZUghIC0gMSB9KSk7XG4gIH1cblxuICBtb3ZlUmlnaHQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgdHJhbnNsYXRlSDogdC50cmFuc2xhdGVIISArIDEgfSkpO1xuICB9XG5cbiAgbW92ZURvd24oKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0udXBkYXRlKHQgPT4gKHsgLi4udCwgdHJhbnNsYXRlVjogdC50cmFuc2xhdGVWISArIDEgfSkpO1xuICB9XG5cbiAgbW92ZVVwKCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7IC4uLnQsIHRyYW5zbGF0ZVY6IHQudHJhbnNsYXRlViEgLSAxIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxpcEFmdGVyUm90YXRlKCkge1xuICAgIHRoaXMudHJhbnNmb3JtLnVwZGF0ZSh0ID0+ICh7XG4gICAgICAuLi50LFxuICAgICAgZmxpcEg6IHQuZmxpcFYsXG4gICAgICBmbGlwVjogdC5mbGlwSCxcbiAgICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgICB0cmFuc2xhdGVWOiAwXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgaW1hZ2VDcm9wcGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5jb252ZXJ0QmxvYlRvQmFzZTY0KGV2ZW50Lm9iamVjdFVybCk7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC51cGRhdGUoZWwgPT4gKHsgLi4uZWwsIGltYWdlRGF0YTogYmFzZTY0IH0pKTtcbiAgICAgIGF3YWl0IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCgpLCB0aGlzLnNlbGVjdGVkRWxlbWVudCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gY29uc29sZS5lcnJvcihcIkVycm9yIGluIGltYWdlQ3JvcHBlZDpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNyb3BwZXJSZWFkeShzb3VyY2VJbWFnZURpbWVuc2lvbnM6IERpbWVuc2lvbnMpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIGNvbnZlcnRCbG9iVG9CYXNlNjQob2JqZWN0VXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBmZXRjaChvYmplY3RVcmwpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpXG4gICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBjaGlsZEV2ZW50Q2FwdHVyZShldmVudDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+ICh7XG4gICAgICAuLi5lbCxcbiAgICAgIHFiUmVmZXJlbmNlOiBldmVudC52YWx1ZU9iaj8ubmFtZSxcbiAgICAgIHFiUmVmZXJlbmNlUXVlc3Rpb25zOiBldmVudC52YWx1ZU9iaj8uanNvbkJvZHlcbiAgICB9KSk7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4KCksIHRoaXMuc2VsZWN0ZWRFbGVtZW50KCkpO1xuICB9XG5cbiAgbGlua1RvZ2dsZURyb3Bkb3duKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNMaW5rRHJvcGRvd25PcGVuLnVwZGF0ZShvcGVuID0+ICFvcGVuKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZHJvcGRvd24gJiYgIXRoaXMuZHJvcGRvd24ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmlzTGlua0Ryb3Bkb3duT3Blbi5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRyYWdnZWRJZCA9IGlkO1xuICAgIGV2ZW50LmRhdGFUcmFuc2ZlciEuZWZmZWN0QWxsb3dlZCA9IFwibW92ZVwiO1xuICB9XG5cbiAgLy8gQVAtMjhNQVIyNSBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgdG8gYWxsb3cgZHJvcFxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLy8gQVAtMjhNQVIyNSBTd2FwIHRoZSBkcmFnZ2VkIGl0ZW0gd2l0aCB0aGUgZHJvcHBlZCBwb3NpdGlvblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldElkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcIi5vcHRpb24taXRlbXNcIik/LmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIik7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZElkICYmIHRhcmdldElkICYmIHRoaXMuZHJhZ2dlZElkICE9PSB0YXJnZXRJZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudXBkYXRlKGVsID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IFsuLi5lbFtrZXldXTtcbiAgICAgICAgY29uc3QgZHJhZ2dlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gdGhpcy5kcmFnZ2VkSWQpO1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IHRhcmdldElkKTtcbiAgICAgICAgaWYgKGRyYWdnZWRJbmRleCAhPT0gLTEgJiYgdGFyZ2V0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgW29wdGlvbnNbZHJhZ2dlZEluZGV4XSwgb3B0aW9uc1t0YXJnZXRJbmRleF1dID0gW29wdGlvbnNbdGFyZ2V0SW5kZXhdLCBvcHRpb25zW2RyYWdnZWRJbmRleF1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLmVsLCBba2V5XTogb3B0aW9ucyB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ2dlZElkID0gbnVsbDtcbiAgfVxuXG4gIGR1cGxpY2F0ZUZpZWxkKGVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICBjb25zdCBjb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50KSk7XG4gICAgLy9BUC0xOEFQUjI1IEdlbmVyYXRlIGEgbmV3IElEIHVzaW5nIHRoZSBzZXJ2aWNlJ3MgbWV0aG9kXG4gICAgY29weS5pZCA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgICAvL2NvcHkudXVpZCA9IGNvcHkuaWQ7IFxuICAgIC8vIEFQLTE4QVBSMjUgU2V0IHRoZSBxdWVzdGlvbk51bWJlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgbnVtYmVyXG4gICAgY29weS5xdWVzdGlvbk51bWJlciA9IGVsZW1lbnRzLmxlbmd0aCArIDE7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuYWRkRWxlbWVudChjb3B5KTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhZ2dlZElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgdXBkYXRlQm9va1N1YnRleHQoa2V5OiAnZW5kcG9pbnQnIHwgJ3ZhcmlhYmxlJyB8ICdkZWZhdWx0RmllbGQnLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5ib29rU3VidGV4dC51cGRhdGUoKHMpID0+ICh7XG4gICAgICAuLi5zLFxuICAgICAgW2tleV06IHZhbHVlLFxuICAgIH0pKTtcbiAgfSAgXG4gIHRyYWNrQnlQcm9wKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGl0ZW0/LmtleSA/PyBpbmRleDtcbiAgfVxuICBcbiAgZ2V0T3B0aW1pemVkU3ViUHJvcFZhbHVlKHN1YlByb3A6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHN1YlByb3AudGFyZ2V0QXJyYXkgfHwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVCeUFycmF5UGF0aChcbiAgICAgICAgc3ViUHJvcC50YXJnZXRBcnJheSwgXG4gICAgICAgIHN1YlByb3AudGFyZ2V0QXJyYXlLZXksIFxuICAgICAgICB0aGlzLnNlbGVjdENvbHVtbigpLCBcbiAgICAgICAgc3ViUHJvcC5rZXksIFxuICAgICAgICBzdWJQcm9wLmlzVGFibGVDb2x1bW5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCBlbGVtZW50KTtcbiAgfVxufSIsIjwhLS0gQVAgMjJKQU4yNSAtIEZpZWxkIGFuZCBFbGVtZW50IFByb3BlcnRpZXMgLS0+XG5cbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIoKSA9PT0gJ2F0dHJpYnV0ZXMnfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ2F0dHJpYnV0ZXMnKVwiPnt7ICdBVFRSSUJVVEVTJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBdHRyaWJ1dGVzJyB9fTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFjdGl2ZVRhYigpID09PSAncHJvcGVydHknfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ3Byb3BlcnR5JylcIj57eyAnUFJPUEVSVFknIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1Byb3BlcnR5JyB9fTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFjdGl2ZVRhYigpID09PSAnYXBwZWFyYW5jZSd9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYignYXBwZWFyYW5jZScpXCI+e3sgJ0FQUEVBUkFOQ0UnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FwcGVhcmFuY2UnIH19PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiAqbmdJZj1cImFjdGl2ZVRhYigpID09PSAnYXR0cmlidXRlcydcIj5cbiAgICBAZGVmZXIgKHdoZW4gZ2V0UHJvcGVydGllcygpKSB7XG4gICAgICA8ZGl2PlxuICAgICAgICBAZGVmZXIgKHdoZW4gc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdJbWFnZScpIHtcbiAgICAgICAgICA8aW1hZ2UtY3JvcHBlclxuICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKS5pbWFnZURhdGFcIlxuICAgICAgICAgICAgW2ltYWdlQmFzZTY0XT1cInNlbGVjdGVkRWxlbWVudCgpLm9yZ0ltYWdlRGF0YVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2FsaWduSW1hZ2VdPVwiYWxpZ25JbWFnZVwiXG4gICAgICAgICAgICBbcm91bmRDcm9wcGVyXT1cInJvdW5kQ3JvcHBlclwiXG4gICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cIid3aGl0ZSdcIlxuICAgICAgICAgICAgaW1hZ2VBbHRUZXh0PVwiQWx0ZXJuYXRpdmUgaW1hZ2UgdGV4dFwiXG4gICAgICAgICAgICBbYWxsb3dNb3ZlSW1hZ2VdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVSZXNpemVTcXVhcmVzXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtjYW52YXNSb3RhdGlvbl09XCJjYW52YXNSb3RhdGlvbigpXCJcbiAgICAgICAgICAgIFthc3BlY3RSYXRpb109XCJhc3BlY3RSYXRpb1wiXG4gICAgICAgICAgICBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtjcm9wcGVyU3RhdGljV2lkdGhdPVwiY3JvcHBlclN0YXRpY1dpZHRoXCJcbiAgICAgICAgICAgIFtjcm9wcGVyU3RhdGljSGVpZ2h0XT1cImNyb3BwZXJTdGF0aWNIZWlnaHRcIlxuICAgICAgICAgICAgW2Nyb3BwZXJNaW5XaWR0aF09XCJjcm9wcGVyTWluV2lkdGhcIlxuICAgICAgICAgICAgW2Nyb3BwZXJNaW5IZWlnaHRdPVwiY3JvcHBlck1pbkhlaWdodFwiXG4gICAgICAgICAgICBbY3JvcHBlck1heFdpZHRoXT1cImNyb3BwZXJNYXhXaWR0aFwiXG4gICAgICAgICAgICBbY3JvcHBlck1heEhlaWdodF09XCJjcm9wcGVyTWF4SGVpZ2h0XCJcbiAgICAgICAgICAgIFtyZXNldENyb3BPbkFzcGVjdFJhdGlvQ2hhbmdlXT1cInRydWVcIlxuICAgICAgICAgICAgWyhjcm9wcGVyKV09XCJjcm9wcGVyXCJcbiAgICAgICAgICAgIFsodHJhbnNmb3JtKV09XCJ0cmFuc2Zvcm1cIlxuICAgICAgICAgICAgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiXG4gICAgICAgICAgICBvdXRwdXQ9XCJibG9iXCJcbiAgICAgICAgICAgIGZvcm1hdD1cInBuZ1wiXG4gICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjcm9wcGVyUmVhZHkpPVwiY3JvcHBlclJlYWR5KCRldmVudClcIlxuICAgICAgICAgID48L2ltYWdlLWNyb3BwZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRWxlbWVudCgpLmltYWdlRGF0YVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJvdGF0ZUxlZnQoKVwiIHRpdGxlPVwie3sgJ1JPVEFURV9MRUZUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSb3RhdGUgTGVmdCcgfX1cIj7in7I8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicm90YXRlUmlnaHQoKVwiIHRpdGxlPVwie3sgJ1JPVEFURV9SSUdIVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUm90YXRlIFJpZ2h0JyB9fVwiPuKfszwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJ6b29tT3V0KClcIiB0aXRsZT1cInt7ICdaT09NX09VVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnWm9vbSBPdXQnIH19XCI+LTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJ6b29tSW4oKVwiIHRpdGxlPVwie3sgJ1pPT01fSU4nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1pvb20gSW4nIH19XCI+KzwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlTGVmdCgpXCIgdGl0bGU9XCJ7eyAnTU9WRV9MRUZUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIExlZnQnIH19XCI+4oaQPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVSaWdodCgpXCIgdGl0bGU9XCJ7eyAnTU9WRV9SSUdIVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTW92ZSBSaWdodCcgfX1cIj7ihpI8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZVVwKClcIiB0aXRsZT1cInt7ICdNT1ZFX1VQJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIFVwJyB9fVwiPuKGkTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlRG93bigpXCIgdGl0bGU9XCJ7eyAnTU9WRV9ET1dOJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdNb3ZlIERvd24nIH19XCI+4oaTPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBIb3Jpem9udGFsKClcIiBbbmdDbGFzc109XCJ7J2VuYWJsZWQnOiB0cmFuc2Zvcm0oKS5mbGlwSH1cIiB0aXRsZT1cInt7ICdGTElQX0hPUklaT05UQUxMWScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRmxpcCBIb3Jpem9udGFsbHknIH19XCI+4oaUPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBWZXJ0aWNhbCgpXCIgW25nQ2xhc3NdPVwieydlbmFibGVkJzogdHJhbnNmb3JtKCkuZmxpcFZ9XCIgdGl0bGU9XCJ7eyAnRkxJUF9WRVJUSUNBTExZJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdGbGlwIFZlcnRpY2FsbHknIH19XCI+4oaVPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJlc2V0SW1hZ2UoKVwiIHRpdGxlPVwie3sgJ1JFU0VUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSZXNldCcgfX1cIj7DlzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ0Jvb2snXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7ICdTRUFSQ0hfQk9PSycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2VhcmNoIEJvb2snIH19PC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPlxuICAgICAgICAgICAgPG54dC1zZWFyY2gtYm94XG4gICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJzZWxlY3RlZEVsZW1lbnQoKVwiXG4gICAgICAgICAgICAgIFthcGlNZXRhXT1cImJvb2tTdWJ0ZXh0KClcIlxuICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJUZXh0XT1cIidTRUFSQ0gnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NlYXJjaC4uLidcIlxuICAgICAgICAgICAgICAoc2VhcmNoVmFsdWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICA+PC9ueHQtc2VhcmNoLWJveD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWljb25cIj5cbiAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwibGlua1RvZ2dsZURyb3Bkb3duKCRldmVudClcIiBmaWxsPVwiIzAwMDAwMFwiIHZlcnNpb249XCIxLjFcIiBpZD1cIkNhcGFfMVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA0NTAgNDUwXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cbiAgICAgICAgICAgICAgPGc+XG4gICAgICAgICAgICAgICAgPGc+XG4gICAgICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMTguMTUsMjMwLjE5NWw3Ny45MzQtNzcuOTM3YzMxLjg5NC0zMS44OTIsMzEuODk0LTgzLjc4Mi0wLjAwNC0xMTUuNjc0bC0xMi42Ni0xMi42NlxuICAgICAgICAgIGMtMzEuODkzLTMxLjg5Ni04My43OC0zMS44OTYtMTE1LjY3NC0wLjAwNGwtNzcuOTM3LDc3LjkzNGMtMTcuNTg4LDE3LjU4OC0yNS40NTcsNDEuMjY0LTIzLjY0Niw2NC4zMTFcbiAgICAgICAgICBjLTIzLjA0NS0xLjgxMy00Ni43MjIsNi4wNTYtNjQuMzA4LDIzLjY0N0wyMy45MiwyNjcuNzQ4Yy0zMS44OTQsMzEuODg5LTMxLjg5NCw4My43NzksMCwxMTUuNjc0bDEyLjY2NCwxMi42NjJcbiAgICAgICAgICBjMzEuODkzLDMxLjg5Myw4My43ODMsMzEuODkzLDExNS42NzQsMGw3Ny45MzUtNzcuOTM2YzE3LjU5Mi0xNy41OSwyNS40NTktNDEuMjY2LDIzLjY0Ny02NC4zMDlcbiAgICAgICAgICBDMjc2Ljg4NCwyNTUuNjU0LDMwMC41NiwyNDcuNzgzLDMxOC4xNSwyMzAuMTk1eiBNMjAyLjY1MywyOTAuNjA1bC03Ny45MzYsNzcuOTM4Yy0xNi43MDUsMTYuNzAzLTQzLjg4OSwxNi43MDMtNjAuNTksMFxuICAgICAgICAgIGwtMTIuNjY2LTEyLjY2NmMtMTYuNzA1LTE2LjcwMS0xNi43MDMtNDMuODg1LDAtNjAuNTk0bDc3LjkzNi03Ny45MzJjMTQuMTQtMTQuMTQxLDM1Ljc3OS0xNi4zMDYsNTIuMjI2LTYuNTE2bC0zMi4zMDIsMzIuMzA3XG4gICAgICAgICAgYy03LjYwNiw3LjYwNC03LjYwNiwxOS45MzgsMCwyNy41NDFjNy42MDUsNy42MDcsMTkuOTM3LDcuNjA3LDI3LjU0MSwwbDMyLjMwNi0zMi4zMDNcbiAgICAgICAgICBDMjE4Ljk1OSwyNTQuODI4LDIxNi43OTUsMjc2LjQ2OSwyMDIuNjUzLDI5MC42MDV6IE0yMzguMzgyLDIwOS4xNjlsMzIuMjk5LTMyLjMwNmM3LjYwOC03LjYwMiw3LjYwOC0xOS45MzUsMC0yNy41MzhcbiAgICAgICAgICBjLTcuNjA0LTcuNjEtMTkuOTM2LTcuNjEtMjcuNTQxLTAuMDA0bC0zMi4zMDMsMzIuMzAzYy05Ljc5MS0xNi40NDYtNy42MjctMzguMDg3LDYuNTE0LTUyLjIyNmw3Ny45MzUtNzcuOTM1XG4gICAgICAgICAgYzE2LjcwNy0xNi43MDcsNDMuODktMTYuNzA3LDYwLjU5NCwwbDEyLjY2NCwxMi42NjRjMTYuNzA1LDE2LjcwNSwxNi43MDUsNDMuODg2LDAsNjAuNTkxbC03Ny45MzYsNzcuOTM3XG4gICAgICAgICAgQzI3Ni40NjgsMjE2Ljc5NywyNTQuODI4LDIxOC45NTksMjM4LjM4MiwyMDkuMTY5elwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzQzLjQ2NiwyNjEuNDY1Yy00NS4yODcsMC04MiwzNi43MTMtODIsODJzMzYuNzEzLDgyLDgyLDgyYzQ1LjI4NiwwLDgyLTM2LjcxMyw4Mi04MlMzODguNzUzLDI2MS40NjUsMzQzLjQ2NiwyNjEuNDY1elxuICAgICAgICAgICBNMzcyLjUwNSwzMzMuNTY0bC01Ni4wNDYsNTYuMTA0Yy0wLjIzOSwwLjIzOC0wLjUzNiwwLjQxLTAuODYyLDAuNDk2bC0yMi4zMTUsNS44NWMtMC42NDksMC4xNjgtMS4zNDctMC4wMi0xLjgyMi0wLjQ5NFxuICAgICAgICAgIGMtMC40NzctMC40NzktMC42NjYtMS4xNzItMC40OTYtMS44MjRsNS44MjYtMjIuMzE4YzAuMDg0LTAuMzI2LDAuMjU2LTAuNjI3LDAuNDk0LTAuODYzbDU2LjA0Ny01Ni4xMDRcbiAgICAgICAgICBjMC43NDItMC43NDIsMS45NDUtMC43NDQsMi42ODgtMC4wMDJsNC41NDgsNC41NDFjMC43MzksMC43NCwwLjc0MSwxLjk0MywwLDIuNjg4bC0zNy40MzMsMzcuNDcxbDQuNzA5LDQuNzAzbDM3LjQzNS0zNy40NzFcbiAgICAgICAgICBjMC43MzktMC43NDIsMS45NC0wLjc0MiwyLjY4Mi0wLjAwMmw0LjU1LDQuNTQxQzM3My4yNSwzMzEuNjE3LDM3My4yNSwzMzIuODIyLDM3Mi41MDUsMzMzLjU2NHogTTM5NS40NzIsMzEwLjU3NGwtMTcsMTcuMDE4XG4gICAgICAgICAgYy0wLjczOSwwLjc0NC0xLjk0MiwwLjc0NC0yLjY4NSwwLjAwMmwtMTYuNDg5LTE2LjQ3NWMtMC43NDQtMC43NC0wLjc0NC0xLjk0My0wLjAwMi0yLjY4OGwxNy0xNy4wMlxuICAgICAgICAgIGMwLjc0MS0wLjc0LDEuOTQ0LTAuNzQsMi42ODgtMC4wMDJsMTYuNDg3LDE2LjQ3N0MzOTYuMjE2LDMwOC42MjksMzk2LjIxNiwzMDkuODMyLDM5NS40NzIsMzEwLjU3NHpcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzTGlua0Ryb3Bkb3duT3BlbigpXCIgI2Ryb3Bkb3duPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRU5EX1BPSU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbmRwb2ludCcgfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJib29rU3VidGV4dCgpLmVuZHBvaW50XCIgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlQm9va1N1YnRleHQoJ2VuZHBvaW50JywgJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdWQVJJQUJMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnVmFyaWFibGUnIH19OjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYm9va1N1YnRleHQoKS52YXJpYWJsZVwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUJvb2tTdWJ0ZXh0KCd2YXJpYWJsZScsICRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRklFTEQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0ZpZWxkJyB9fTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtuZ01vZGVsXT1cImZpZWxkQXNTdHJpbmcoKVwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpZWxkKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnREVGQVVMVF9GSUVMRCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGVmYXVsdCBGaWVsZCcgfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJib29rU3VidGV4dCgpLmRlZmF1bHRGaWVsZFwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUJvb2tTdWJ0ZXh0KCdkZWZhdWx0RmllbGQnLCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpPy5lbGVtZW50UHJvcHM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cInByb3AudHlwZSAhPT0gJ2NoZWNrYm94JyAmJiBwcm9wLnR5cGUgIT09ICdzdWJRdWVzdGlvbidcIiBjbGFzcz1cInRleHQtc21cIj57eyBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnaGVscFRleHQnICYmIHNlbGVjdGVkRWxlbWVudCgpPy5oZWxwVGV4dFwiPnt7IHNlbGVjdGVkRWxlbWVudCgpPy5oZWxwVGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGVhZGVyU2VsZWN0KCkgPyBib29rKCkucmVjb3Jkc1swXS50aXRsZSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gKGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhlYWRlclNlbGVjdCgpID8gdXBkYXRlVGl0bGUoJGV2ZW50KSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50KCk/LnJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudCgpPy5yZWFkT25seVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IChnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyAoZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksIHByb3AuaXNUYWJsZUNvbHVtbikpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RyYW5zbGF0ZSkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxMHB4O1wiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N1YlF1ZXN0aW9uJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgIDxkaXY+e3sgcHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBwcm9wLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCBwcm9wLmlzVGFibGVDb2x1bW4pIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViUHJvcCBvZiBwcm9wLnN1YlF1ZXN0aW9uXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmMmZmOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBzdWJQcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHN1YlByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYXJyYXknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGZpbHRlcmVkQ29sdW1ucygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic3ViUHJvcC5vcGVyYW5kcyA/IHN1YlByb3Aub3BlcmFuZHMuaW5jbHVkZXMoY29sdW1uLmFwaU5hbWUpIDogZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGVja2JveENoYW5nZShzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzdWJQcm9wLmtleSwgY29sdW1uLmFwaU5hbWUsICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbi5hcGlOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ3JhZGlvJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBmaWx0ZXJlZENvbHVtbnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInN1YlByb3Aua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29sdW1uLmFwaU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5KSA9PT0gY29sdW1uLmFwaU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25SYWRpb0NoYW5nZShzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzdWJQcm9wLmtleSwgY29sdW1uLmFwaU5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2x1bW4uYXBpTmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic3ViUHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAoc3ViUHJvcC50YXJnZXRBcnJheSA/IGdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5KSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXkpKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChzdWJQcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgc3ViUHJvcC5rZXksICRldmVudCxmYWxzZSwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50KSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHN1YlByb3Aua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnc2VsZWN0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChzdWJQcm9wLnRhcmdldEFycmF5IHx8IHN1YlByb3AuaXNUYWJsZUNvbHVtbikgPyAoZ2V0VmFsdWVCeUFycmF5UGF0aChzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgc3ViUHJvcC5rZXksIHN1YlByb3AuaXNUYWJsZUNvbHVtbikpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBzdWJQcm9wLmtleSkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHN1YlByb3AudGFyZ2V0QXJyYXkgfHwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHN1YlByb3Aua2V5LCAkZXZlbnQsIHN1YlByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHN1YlByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2NoZWNrYm94J1wiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogc3ViUHJvcC5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnYWxpZ24nXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiAoY2xpY2spPVwib25BbGlnblNlbGVjdChvcHRpb24udmFsdWUpXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBzZWxlY3RlZEVsZW1lbnQoKT8udGV4dEFsaWduID09PSBvcHRpb24udmFsdWV9XCIgW3RpdGxlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCInLi4vYXNzZXRzL2ljb25zLycgKyBvcHRpb24uaWNvbiArICcuc3ZnJ1wiIFthbHRdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJpY29uLXNpemVcIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N0eWxlJ1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgKGNsaWNrKT1cIm9uU3R5bGVTZWxlY3Qob3B0aW9uLnZhbHVlKVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXNTdHlsZUFjdGl2ZShvcHRpb24udmFsdWUpfVwiIFt0aXRsZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiJy4uL2Fzc2V0cy9pY29ucy8nICsgb3B0aW9uLmljb24gKyAnLnN2ZydcIiBbYWx0XT1cIm9wdGlvbi52YWx1ZVwiIGNsYXNzPVwiaWNvbi1zaXplXCIgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjb2xvcidcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IChnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIihzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ3RpdGxlJ1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTVweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgcGFkZGluZzogMjBweDsgYm9yZGVyLXJhZGl1czogMTJweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkTmV3QnV0dG9uKClcIiBjbGFzcz1cImFkZC1idXR0b25cIj4rIHt7ICdBRERfQlVUVE9OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgQnV0dG9uJyB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYnRuIG9mIGJvb2soKT8ucXVlc3Rpb25ib29rPy5hY3Rpb24gfHwgW107IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJ1dHRvbi1jb25maWctY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0JVVFRPTl9OQU1FJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCdXR0b24gTmFtZScgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYnRuLm5hbWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICduYW1lJywgJGV2ZW50LHRydWUpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBidXR0b24gbmFtZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0VWRU5UX05BTUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0V2ZW50IE5hbWUnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtuZ01vZGVsXT1cImJ0bi5ldmVudHRvZW1pdFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ2V2ZW50dG9lbWl0JywgJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiRXZlbnQgdG8gZW1pdFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0FMVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWx0JyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbbmdNb2RlbF09XCJidG4uYWx0XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnYWx0JywgJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiQnV0dG9uIGFsdCB0ZXh0XCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnRU5EX1BPSU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbmRwb2ludCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiYnRuLmVuZHBvaW50XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnZW5kcG9pbnQnLCAkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJBUEkgZW5kcG9pbnRcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdNRVRIT0QnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ01ldGhvZCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdCBbbmdNb2RlbF09XCJidG4ubWV0aG9kXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25CdXR0b25Qcm9wZXJ0eUNoYW5nZShpLCAnbWV0aG9kJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiR0VUXCI+R0VUPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJQT1NUXCI+UE9TVDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFVUXCI+UFVUPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJERUxFVEVcIj5ERUxFVEU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0JBQ0tHUk9VTkRfQ09MT1InIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0JhY2tncm91bmQgQ29sb3InIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBbbmdNb2RlbF09XCJidG4uYmdDb2xvclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ2JnQ29sb3InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnQk9SREVSX1JBRElVUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQm9yZGVyIFJhZGl1cycgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCI1MFwiIFtuZ01vZGVsXT1cImJ0bi5ib3JkZXJSYWRpdXNcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICdib3JkZXJSYWRpdXMnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBidG4uYm9yZGVyUmFkaXVzIH19cHg8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnQlVUVE9OX1dJRFRIX1BYJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCdXR0b24gV2lkdGggKHB4KScgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbbmdNb2RlbF09XCJidG4ud2lkdGhcIiAobmdNb2RlbENoYW5nZSk9XCJvbkJ1dHRvblByb3BlcnR5Q2hhbmdlKGksICd3aWR0aCcsICRldmVudClcIiBtaW49XCI1MFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgd2lkdGggaW4gcHhcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdURVhUX0NPTE9SJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdUZXh0IENvbG9yJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgW25nTW9kZWxdPVwiYnRuLnRleHRDb2xvclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ3RleHRDb2xvcicsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdQT1NJVElPTl9QRVJDRU5UJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdQb3NpdGlvbiAoJSknIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBtaW49XCIwXCIgbWF4PVwiMTAwXCIgW25nTW9kZWxdPVwiYnRuLnBvc2l0aW9uUGVyY2VudFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQnV0dG9uUHJvcGVydHlDaGFuZ2UoaSwgJ3Bvc2l0aW9uUGVyY2VudCcsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ0bi5wb3NpdGlvblBlcmNlbnQgfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZUJ1dHRvbihidG4pXCIgY2xhc3M9XCJyZW1vdmUtYnV0dG9uXCI+w5cge3sgJ1JFTU9WRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUmVtb3ZlJyB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnR5J1wiPlxuICAgIEBkZWZlciAod2hlbiBnZXRQcm9wZXJ0aWVzKCkpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbD5MYWJlbCBJZDwvbGFiZWw+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDExcHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcIj5cbiAgICAgICAgICB7eyBoZWFkZXJTZWxlY3QoKSA/IGJvb2tJZCgpIDogc2VsZWN0ZWRFbGVtZW50KCk/LmlkIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wIG9mIGdldFByb3BlcnRpZXMoKT8uZmllbGRQcm9wczsgdHJhY2tCeTogdHJhY2tCeVByb3BcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgPGxhYmVsICAqbmdJZj1cInByb3AudHlwZSAhPT0gJ3N1YlF1ZXN0aW9uJ1wiIGNsYXNzPVwidGV4dC1zbVwiPnt7IHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAndG9nZ2xlR3JvdXAnXCIgY2xhc3M9XCJ0b2dnbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc09wdGlvbmFsJywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc09wdGlvbmFsJylcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc09wdGlvbmFsJywgJGV2ZW50LCB0cnVlLCBwcm9wLmlzVHJhbnNsYXRlKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpKSA6IG9uVG9nZ2xlQ2hhbmdlKCdpc09wdGlvbmFsJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ1JFUVVJUkVEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdSZXF1aXJlZCcgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc1JlYWRPbmx5JywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc1JlYWRPbmx5JylcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbiA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksICdpc1JlYWRPbmx5JywgJGV2ZW50LCB0cnVlLCBwcm9wLmlzVHJhbnNsYXRlKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpKSA6IG9uVG9nZ2xlQ2hhbmdlKCdpc1JlYWRPbmx5JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ1JFQURfT05MWScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnUmVhZCBPbmx5JyB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgJ2lzSGlkZGVuJywgdHJ1ZSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSkgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6ICdpc0hpZGRlbicpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCAnaXNIaWRkZW4nLCAkZXZlbnQsIHRydWUsIHByb3AuaXNUcmFuc2xhdGUpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkpIDogb25Ub2dnbGVDaGFuZ2UoJ2lzSGlkZGVuJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3sgJ0lTX0hJREUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0lzIEhpZGUnIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIgcHJvcC50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3AudHlwZSA9PT0gJ3JhZGlvJyB8fCBwcm9wLmtleSA9PT0gJ29wdGlvbnMnXCIgY2xhc3M9XCJvcHRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLWxpc3RcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgcHJvcC5rZXkpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbigpID8gZ2V0VmFsdWVCeUFycmF5UGF0aCgnZmllbGRzTWV0YScsICd1bmlxdWVJZGVudGlmaWVyJywgc2VsZWN0Q29sdW1uKCksICBwcm9wLmtleSwgdHJ1ZSkgOiBzZWxlY3RlZEVsZW1lbnQoKVtwcm9wLmtleV0gOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJvcHRpb24taXRlbXNcIiBbYXR0ci5kYXRhLWlkXT1cIm9wdGlvbi5pZFwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgb3B0aW9uLmlkKVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwib3B0aW9uLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib3B0aW9uLnZhbHVlID0gJGV2ZW50OyBvcHRpb25UcmFuc2xhdGlvblVwZGF0ZShvcHRpb24sJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uXCIgY2xhc3M9XCJvcHRpb25zXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVPcHRpb24oc2VsZWN0ZWRFbGVtZW50KClbcHJvcC5rZXldLCBvcHRpb24uaWQpXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyYWctaGFuZGxlXCI+4piwPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkT3B0aW9uKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbigpID8gZ2V0VmFsdWVCeUFycmF5UGF0aCgnZmllbGRzTWV0YScsICd1bmlxdWVJZGVudGlmaWVyJywgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCB0cnVlKSA6IHNlbGVjdGVkRWxlbWVudCgpW3Byb3Aua2V5XSlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXZhcmllbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZ1wiPis8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQUREJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGVhZGVyU2VsZWN0KCkgPyBib29rKCkucmVjb3Jkc1swXS50aXRsZSA6IChzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4pID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksIHByb3AuaXNUYWJsZUNvbHVtbikgOiAoc2VsZWN0ZWRFbGVtZW50KCkgfCBnZXRWYWx1ZUJ5UGF0aCA6IHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoZWFkZXJTZWxlY3QoKSA/IHVwZGF0ZVRpdGxlKCRldmVudCkgOiAoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uKSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uKCksIHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUYWJsZUNvbHVtbiwgcHJvcC5pc1RyYW5zbGF0ZSkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKSlcIlxuICAgICAgICAgICAgICBbY2xhc3MucmVhZC1vbmx5XT1cInNlbGVjdGVkRWxlbWVudCgpPy5yZWFkT25seVwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJzZWxlY3RlZEVsZW1lbnQoKT8ucmVhZE9ubHlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzdWJRdWVzdGlvbidcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0eWxlLXRvZ2dsZS1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlU3ViUXVlc3Rpb24ocHJvcClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPlN1YiBUZXh0PC9kaXY+XG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImlzRXhwYW5kZWQgPyAnLi4vYXNzZXRzL2ljb25zL2Fycm93LWRvd24uc3ZnJyA6ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJ1wiXG4gICAgICAgICAgICAgICAgICBhbHQ9XCJUb2dnbGUgQXJyb3dcIiBjbGFzcz1cImFycm93LWljb25cIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0V4cGFuZGVkXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViUHJvcCBvZiBwcm9wLnN1YlF1ZXN0aW9uOyB0cmFja0J5OiB0cmFja0J5UHJvcFwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U3ZjJmZjsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgc3ViUHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBzdWJQcm9wLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzdWJQcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE9wdGltaXplZFN1YlByb3BWYWx1ZShzdWJQcm9wKVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCIoc2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgJiYgKHN1YlByb3AudGFyZ2V0QXJyYXkgfHwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uKSkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHN1YlByb3AudGFyZ2V0QXJyYXksIHN1YlByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBzdWJQcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSwgc3ViUHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IHNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlLCBwcm9wLmlzVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50KCk/LnJlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudCgpPy5yZWFkT25seVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgPCEtLSBBUC0wMkFQUjI1IFJlbmRlciBpbnB1dCBmaWVsZCBvbmx5IGlmIHN1YlByb3AudHlwZSBpcyAnYXJyYXknIC0tPlxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYXJyYXknXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwic3ViUHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIiAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUsIHByb3AuaXNUcmFuc2xhdGUpXCIgLz5cblxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIj57eyBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50KCk/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSB8fCBwcm9wLmlzVGFibGVDb2x1bW4gPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgcHJvcC5pc1RhYmxlQ29sdW1uKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogcHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgfHwgcHJvcC5pc1RhYmxlQ29sdW1uID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RhYmxlQ29sdW1uLCBwcm9wLmlzVHJhbnNsYXRlKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0eWxlLXRvZ2dsZS1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlU3R5bGVTZWN0aW9uKClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPnt7ICdTVFlMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU3R5bGUnIH19PC9kaXY+XG4gICAgICAgICAgPGltZyBbc3JjXT1cImlzU3R5bGVFeHBhbmRlZCgpID8gJy4uL2Fzc2V0cy9pY29ucy9hcnJvdy1kb3duLnN2ZycgOiAnLi4vYXNzZXRzL2ljb25zL2Fycm93LXJpZ2h0LnN2ZydcIiBhbHQ9XCJUb2dnbGUgQXJyb3dcIiBjbGFzcz1cImFycm93LWljb25cIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc1N0eWxlRXhwYW5kZWQoKVwiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI2RkZDsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRTdHlsZUtleXMoKVwiPlxuICAgICAgICAgICAgICA8bGFiZWw+e3sga2V5IH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQoKT8udHlwZSA9PT0gJ1RhYmxlJyAmJiBzZWxlY3RDb2x1bW4oKSA/IGdldFZhbHVlQnlBcnJheVBhdGgoJ2ZpZWxkc01ldGEnLCAndW5pcXVlSWRlbnRpZmllcicsIHNlbGVjdENvbHVtbigpLCdzdHlsZS4nICsga2V5LCB0cnVlKSA6IChzZWxlY3RlZEVsZW1lbnQoKSB8IGdldFZhbHVlQnlQYXRoIDogJ3N0eWxlLicgKyBrZXkpXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbigpICkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKCdmaWVsZHNNZXRhJywgJ3VuaXF1ZUlkZW50aWZpZXInLCBzZWxlY3RDb2x1bW4oKSwgJ3N0eWxlLicgKyBrZXksICRldmVudC50YXJnZXQudmFsdWUsIHRydWUpIDogc2V0VmFsdWVCeVBhdGgoJ3N0eWxlLicgKyBrZXksICRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHt7IGtleSB9fVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiICpuZ0lmPVwiYWN0aXZlVGFiKCkgPT09ICdhcHBlYXJhbmNlJ1wiPlxuICAgIEBkZWZlciAod2hlbiBnZXRQcm9wZXJ0aWVzKCkpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpPy5hcHBlYXJhbmNlOyB0cmFja0J5OiB0cmFja0J5UHJvcFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgcHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBwcm9wLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnXCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyAoZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4oKSwgcHJvcC5rZXksIHByb3AuaXNUYWJsZUNvbHVtbikpIDogKHNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleSkpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiKHNlbGVjdGVkRWxlbWVudCgpPy50eXBlID09PSAnVGFibGUnICYmIChwcm9wLnRhcmdldEFycmF5IHx8IHByb3AuaXNUYWJsZUNvbHVtbikgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbigpLCBwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVGFibGVDb2x1bW4sIHByb3AuaXNUcmFuc2xhdGUpIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudCwgcHJvcC5pc1RyYW5zbGF0ZSkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj57eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RleHQnXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQsIHByb3AuaXNUcmFuc2xhdGUpXCJcbiAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnY29sb3InXCIgY2xhc3M9XCJjb2xvci1zZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRWxlbWVudCgpPy5mb250Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2ZvbnRDb2xvcicsICRldmVudCwgcHJvcC5pc1RyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjb2xvcidcIiBjbGFzcz1cImhleC1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnSEVYX0NPREUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0hFWCBDb2RlJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRWxlbWVudCgpIHwgZ2V0VmFsdWVCeVBhdGggOiBwcm9wLmtleVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LCBwcm9wLmlzVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdidXR0b24tdG9nZ2xlJ1wiIGNsYXNzPVwiYnV0dG9uLXRvZ2dsZS13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1idXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkdXBsaWNhdGVGaWVsZChzZWxlY3RlZEVsZW1lbnQoKSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdBRERfRFVQTElDQVRFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBZGQgRHVwbGljYXRlJyB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIiAqbmdJZj1cIiF0ZW1wbGF0ZVNlbGVjdGVkXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idG5cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPnt7ICdDQU5DRUwnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0NhbmNlbCcgfX08L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2F2ZS1idG5cIiAoY2xpY2spPVwiaGFuZGxlQnV0dG9uQ2xpY2soKVwiPnt7ICdTQVZFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTYXZlJyB9fTwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lclwiICpuZ0lmPVwidGVtcGxhdGVTZWxlY3RlZFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwic2F2ZS1idG5cIiAoY2xpY2spPVwiaGFuZGxlVGVtcGxhdGVTYXZlKClcIj57eyAnU0FWRV9URU1QTEFURScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2F2ZSBUZW1wbGF0ZScgfX08L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|